Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как реализовать поиск фраз в тексте по вордлисту?

Лучший ответ:
Регулярки тут и не нужны:
wordlist = [
    'Маша', 'Игорь', 'Светлана', 'Евгений'
]

text = '''Задача организации, в особенности же разбавленное изрядной долей эмпатии,
рациональное мышление обеспечивает широкому кругу (специалистов) Светлана Евгений Маша Игорь
участие в формировании инновационных методов управления процессами.
В своём стремлении улучшить пользовательский опыт мы упускаем, что некоторые особенности внутренней
политики могут быть своевременно верифицированы.'''

result = []
for word in text.split():
    if word in wordlist:
        result.append(word)
print(result)
# ['Светлана', 'Евгений', 'Маша', 'Игорь']

Худший ответ:
Натыкал что первое в голову пришло:
Натыканноеdata = '''Задача организации, в особенности же разбавленное Светлана изрядной долей эмпатии, рациональное мышление обеспечивает широкому кругу (специалистов) Светлана Евгений Маша Игорь
участие в формировании инновационных методов управления процессами. В своём стремлении улучшить пользовательский опыт мы упускаем, что некоторые особенности внутренней политики могут Светлана Светлана Светлана быть своевременно верифицированы.Задача организации, в особенности же разбавленное Светлана изрядной долей эмпатии, рациональное мышление обеспечивает широкому кругу (специалистов) коля Светлана Евгений Маша Игорь Миша
участие в формировании инновационных методов управления процессами. В своём стремлении улучшить пользовательский опыт мы упускаем, что некоторые особенности внутренней политики могут Светлана Светлана Светлана быть своевременно верифицированы.Задача организации, в особенности же разбавленное Светлана изрядной долей эмпатии, рациональное мышление обеспечивает широкому кругу (специалистов)  Светлана, Евгений. Маша? Игорь
Светлана участие в формировании инновационных методов управления процессами. В своём стремлении улучшить пользовательский опыт мы упускаем, что некоторые особенности внутренней политики могут Светлана Светлана Светлана быть своевременно разбавленное Светлана изрядной долей эмпатии, рациональное мышление обеспечивает широкому кругу (специалистов) Светлана Евгений Маша Игорь Светлана Евгений Маша Игорь
участие в формировании инновационных методов управления процессами. В своём стремлении улучшить пользовательский опыт мы упускаем, что некоторые особенности внутренней политики могут Светлана Светланаверифицированы.'''
words = ['Маша',
'Игорь',
'Светлана',
'Евгений']
newdata = [(word.strip(), number) for number, word in enumerate(data.split()) if word in words]

data = [(word[0], newdata[i+1][1]-word[1]) for i, word in enumerate(newdata[:-1])]

newdata = []
for word in data:
    if word[1] == 1:
        newdata.append((word[0], 1))
    else:
        newdata.append((word[0], 0))

result = []
results = []
counter = 0
another = False
for i, word in enumerate(newdata):
    if word[1]:
        counter += 1
        result.append(word[0])
        another = True
    elif another or i == len(newdata):
        result.append(word[0])
        another = False
        results.append((counter+1, result))
        result = []
        counter = 0
        
print(results)
Вопрос: Как понять, что пора повышать зарплату?

Лучший ответ:
Я Junior Full-stack разработчик
Опыт работы у меня примерно полгода
уже год преподаю Java на одних курсах для людей, что хотят профессию сменить.
Это не слезы, просто дождь течет по лицу :) Все абзацы смехотворны, если честно. Сам пишу с 2011 года на JS + бэк на PHP\Python, могу ли я себя назвать фуллстэком - наверное нет. Но ок - > 

Или может быть тут есть знающие люди и могут подсказать реальную зп, на которую можно претендовать.
Как понять что можно просить больше(и заслужил) = опыт коммерческой разработки(всем пофиг сколько пет проектов вы написали до этого) от года + решение бизнес задач без помощи сеньора\мидла + регион.

Если вы пишите серьезную бизнес логику не обращаясь к мидлу и отработали больше года, то однозначно стоит. Если каждый чих сопровождается комментарием к pull request - нет.

Для джуна даже московского запрлата в 800-900 долларов = это хорошая зарплата, при условии того что вы обращаетесь за частой помощью к своим товарищам, и пока не можете выполнять серьезные таски сами.

Худший ответ:
Зайди на хедхантер
Вопрос: Как оптимально перебрать все возможные комбинации 4х массивов?

Лучший ответ:
Хм...а чем не устраивает простой цикл с 4 уровнями, если нужны "абсолютно все возможные варианты IP адресов"? Заодно и адреса по порядку идти будут...
for(int i0=0; i<=255; i++) {
    for(int i1=0; i<=255; i++) {
        for(int i2=0; i<=255; i++) {
            for(int i3=0; i<=255; i++) {
                writeToFile(printf("%d.%d.%d.%d\n", i0, i1, i2, i3));
            }
        }
    }
}

Худший ответ:
Добрый день.
Не знаю, будет ли это полезно вам, но библиотека действительно есть (Apache Commons Math):
CombinatoricsUtils.combinationsIterator()
https://commons.apache.org/proper/commons-math/jav...
Вопрос: Стоит ли вообще ставить Linux на игровой ноутбук?

Лучший ответ:
Лично я необходимости в линухе не особо увидел. Ну можно вторйо системой поставить, но практика показывает, что вторая система остается невостребованной. 
"Драйвер на процессор" - это что? Что за устройства он устанавливает? (Процессору драйвер не нужен :) )
Проблемы с оборудованием на ноутах - это не просто обычное явление, это абсолютно ожидаемое явление - очень часто производители не морочатся поддержкой линухов.
Остальное - вкусовщина. Вам придется искать людей, у которых такие же требования или же пробовать решить вопрос самому (что как правило и бывает)

Худший ответ:
Если устройство используется для работы, то надо использовать ту ОС, где это устройство хорошо работает

Зачем управлять куллерами? они как то неправильно работают?

Попробуйте Linux Mint...
Вопрос: Как в python добавить 0, перед числом?

Лучший ответ:
Изи:
a = 10
print(f'0,{a}')
# 0,10

Худший ответ:
Во-первых можно просто поделить число на 10(не переменная) в степени длины переменной.

n = 10
n = n/10**len(str(10))
Вывод будет: 0.1

Либо можно преобразовать в строку и сделать это так:
n = 10
n = "0." + str(n)
В итоге мы получим СТРОКУ(можно преобразовать в число):
0.10
Вопрос: Насколько актуален MVC в Golang для написания сайтов средней сложности?

Лучший ответ:
Буду продвигать в массы

https://github.com/alfssobsd/notes/blob/master/gol...
https://github.com/alfssobsd/clean-arch-golang-bes...

В текущей компании делаем так , аналогично в Java , Kotlin, нам нравится .

Худший ответ:
Если вам нравится, то почему бы не использовать?! Выбрал бы я сам Биго или Ирис - нет, рекомендовал бы я кому-нибудь их для своего нового проекта - нет. Но если вам нравится, то нет причин отказываться.

MVC это про ООП, GO это не про ООП
Вопрос: Почему к итератору не прибавляется единица?

Лучший ответ:
Итератор std::list - не итератор произвольного доступа, у него нет возможности перескочить несколько элементов, реализован только переход к предыдущему и следующему. Поэтому инкремент для него существует, а сложение - нет, и библиотека начинает искать по сусекам, к чему бы, реализующему сложение, его привести. 
К счастью, не находит ничего подходящего ;)

Худший ответ:
Птому что для данного итератора не определен оператор +. Используйте std::next или оператор ++
Вопрос: Где безопасно покупать домены?

Лучший ответ:
Я так понимаю наши хостинги юзают рег ру, которому я не доверял, а сейчас тем более. плохенько понимаешь. вернее: совсем не понимаешь.
да, многие их реселлят. но многие или сами, или реселлят других.

если речь о доменах в РУ–зоне – выбор не так и велик. все примерно одинаковы, разница в ценах и сервисе.
если речь о международных зонах – надо быть последним дебилом регать их через местных (российских) регистраторов. но сейчас возникает вопрос оплаты.

Худший ответ:
Западные регистраторы тоже не вариант, могут и заблокировать, если Вы из России.
Мне кажется оптимальнее всего выбирать из российских регистраторов, аккредитованных ICANN
https://www.icann.org/en/accredited-registrars?sor...
Например тот же Beget
Вопрос: Какая само мало требовательная ос кроме Chrome OS?

Лучший ответ:
Чистый DOS :)
А если с GUI - kolibriOS
Если linux - busybox
Если что-то адекватное - любой дистр линукса на основе xfce / lxde итд. Вроде как даже KDE сейчас считается достаточно нетребовательным.

Худший ответ:
Любой дистрибутив Linux с не требовательными графическими средами типа xfce, lxde, lxqt
Можете посмотреть: Puppy Linux, AntiX, MX Linux, 
Manjaro, lubuntu, xubuntu
Вопрос: Какой есть аналог Sony Vegas для Ubuntu Desktop?

Лучший ответ:
https://www.blackmagicdesign.com/products/davincir...

Из опен сорса есть в Blender режим редактирования видео, не знаю насколько он вам зайдет, штука специфичная, но позволяет даже совмещать видео и 3d

Худший ответ:
OpenShot - очень даже не плохой аналог!!!

На мой вкус, даже лучше!
ИМХО.
Вопрос: Что должен знать Middle+ разработчик Go?

Лучший ответ:
так ты ж мидл мы у тебя должны спрашивать

Худший ответ:
3-5 коммитов в популярные либы достаточно
Вопрос: Как реализовать честную игру в Угадай число?

Лучший ответ:
Где-то сто лет назад я такое видел. Без всяких заморочек с хешем, что для пользователя проблемно. Там был просто запороленный архив с результатом. Это намного проще.

Худший ответ:
Ваше решение волне валидно. Разве что некоторым игрокам придётся объяснять что такое md5 и рассказывать про сложность нахождения коллизий.
Опять же, ушлый игрок сможет предположить, что кто-нибудь ввалил огромные мощности на поиск коллизий, а потом ему подсовывает нужную соль под ответ. Тем более не обяательно чтобы конкретное исло было в result, а достстоноч, чтобы там было не одно из выбранных 5.
Короче, для надёжности я бы вам посоветовал добавить помимо своей соли, еще и соль, выбранную игроком. Ведь какая разница от чего считать md5, если вы играете по-честному. А вот найти коллизии при наличии гарантированно рандомной (или просто не подготовленной соли), да еще и так быстро (в рамках игры) - это куда сложнее.
Вопрос: По какому принципу этот аргумент передается в функцию?

Лучший ответ:
https://learn.javascript.ru/function-basics
https://learn.javascript.ru/arrow-functions-basics
https://learn.javascript.ru/callbacks

a => a.name == "Adam"
/*
* стрелочная функция, принимающая на вход один аргумент, 
* который может быт назван как угодно, 
* и возвращающая при вызове результат сверки свойства name у переданного аргумента
* со строкой 'Adam'
*/

В свою очередь Вы передаёте в функцию filter два аргумента. Первый - arr, второй - стрелочная функция, рассмотренная выше.
Внутри функции filter второй аргумент назван как test - это и будет эта стрелочная функция.
Когда идёт вызов test(element) на деле происходит вызов этой стрелочной функции, в которую передаётся аргументом element.
В итоге сравнивается element.name == "Adam"

P.s.
Это
let arr = {
    object1 = {
        name: "Adam",
        year: 1997
    }, object2 = {
        name: "John",
        year: 2000
    }, object3 = {
        name: "Conor",
        year: 2001
    }, object4 = {
        name: "Adam",
        year: 2000
    }
}

Не валидная запись.
Толи это массив, толи объект.
Если массив, то 
так
let arr = [
    {
        name: "Adam",
        year: 1997
    }, {
        name: "John",
        year: 2000
    }, {
        name: "Conor",
        year: 2001
    }, {
        name: "Adam",
        year: 2000
    }
]

А объект так
let arr = {
    object1: {
        name: "Adam",
        year: 1997
    }, object2: {
        name: "John",
        year: 2000
    }, object3: {
        name: "Conor",
        year: 2001
    }, object4: {
        name: "Adam",
        year: 2000
    }
}


Худший ответ:
filter(
   arr,  // первый аргумент - array (объект(не массив) с фильтруемыми вложенными объектами)
   a => a.name == "Adam" // второй аргумент -  test (функция)
)

в результате внутри 
function filter(array, test) { ... }

аргументом test станет переданная стрелочная функция, как если бы мы написали:
const test = (a) => {
   return a.name == "Adam" 
}

для понимания приведу почти аналог этой функции в обычной нотации
function test(a){
   return a.name == "Adam"  // стравнивает a.name со строкой "Adam", возвращаетекгу true равны и false если не равны
}

далее:
if (test(element)) {            // проверяем равен ли name элемента строке "Adam"
      result.push(element); // если равен, то добавляем в результирующий массив
}
Вопрос: Как сделать лимит выполнения цикла for?

Лучший ответ:
Прописать в модели Message метод limited_attachments и использовать его во всех подобных случаях.

Худший ответ:
for($i = 0;      // выполнять от нуля, до тех пор
    $i < $count, // пока $i меньше общего кол-ва
    $i < 5;      // или меньше пяти
    $i++) {
Вопрос: Как найти максимально похожий цвет?

Лучший ответ:
Самое простое — считать сумму квадратов расстояний по каждому из компонентов: R, G и B.

Для пары 0000DD, 0000C8 «расстояние» будет такое:
(0x00 - 0x00)^2 + (0x00 - 0x00)^2 + (0xDD - 0xC8)^2 = 441Так посчитать до каждого из определённых цветов, найти минимум.

Можно сравнивать в других цветовых моделях. Например, в HSV (оттенок, насыщенность, яркость) — если посчитаете, что насыщенный красный и тусклый красный точно того же оттенка «ближе», чем той же яркости оранжевый. Речь о возможно разных «весах» каналов в деле определения близости двух цветов.

Худший ответ:
Переведите каналы из строк в числа, вычисляйте абсолютную разницу  по всем каналам отдельно. Разницу всех плюсуйте в общую разницу, Цвет с наимейшей разницей и будет искомым.
abs(00 - 00) +  abs(00 - 00) + abs(DD -. C8) = разница
Вопрос: Как работает этот скрипт?

Лучший ответ:
это юзерскрипт. заточенный под конкретный сайт/страницы. 

он и сам по себе исполнятся не будет, и вне сайта бесполезен.

Худший ответ:
(function() {
 'use strict';
 var parentElementarr = document.getElementsByClassName('lk-form-submit js-clear'); //получаем DOM элементы
 parentElementarr[0].textContent = 'Решить Задание'; // Добавление/изменение текста в элементе
 parentElementarr[0].classList.add('js-show-answer'); //Добавить класс в DOM элементе
 parentElementarr[0].classList.remove('js-clear'); // Удалить класс в DOM элементе
})();
скорее всего, скрипт меняет окна, что то вроде этого
Вопрос: Как подключить вторую видеокарту если не хватает места?

Лучший ответ:
Есть гибкие переходники.

PCI-E x16 (Male) to PCI-E x16 (Female), EPCIEM-PCIEFX16

Худший ответ:
Если уж сильно печет втыкнуть две то нужен более вменяемый корпус
Вопрос: Как получить поле для максимального значения другой группированной строки GROUP BY в MySQL?

Лучший ответ:
Наачиная с MySQL 8.0.14 Вы можете использвать LATERAL:
select * 
from a,
lateral (select * from b where b.a_id = a.id order by d desc limit 1) m;
https://sqlize.online/sql/mysql80/e146f8c70b74a858...

Худший ответ:
А до 8.0 можете сделать выборку из подзапроса, где будут только max значения
Вопрос: Как можна найти сумму дипазона?

Лучший ответ:
Если я правильно понимаю ваш вопрос. Найти сумму корней членов диапазона от 2 до 51 с шагом 2?
sum(map(sqrt, range(2, 51, 2)))
# 121.10445346229315

Худший ответ:
А что вы подразумеваете под "суммой елементов в диапазоне B," если B -  у вас последовательно принимает ОДНО значение  из ряда четных чисел от 2 до 50:
Вопрос: Из-за чего вылезает ошибка при изменении значения в json?

Лучший ответ:
Я сейчас покажу абсолютно секретный кусок кода, вы такой нигде больше не найдёте. Это чудо решает 99% проблем! spoiler$data  = file_get_contents('values.json');
$data = json_decode($data , true); 
var_dump($data);

Худший ответ:
У вас запятая лишняя в файле JSON похоже. В самом конце.
Вопрос: Не работает интернет от свитча?

Лучший ответ:
Обратитесь к системному администратору вашей компании

Худший ответ:
Вам никто не поможет с этим вопросом. потому что никто не знает что и как у Вас было настроено, с учетом что свитч управляемый.

Заходите на свитч и ищите там что не так... какой то видимо VLAN не активен, судя по всему обратно провода Вы вставили как попало... а это так не заработает.
Тут надо понять четко что приходило в свитч(линки отвечающие за инет) и понять по каким портам и VLAN они дальше уходили... видимо сеть на сегменты разбита

А где предыдущий админ, который настраивал? он доступен?

Или(с баша) его уволили за ненадобностью, потому что итак всё работало а он кино на проекторе в кабинете у себя гонял да кофе пил?)
Вопрос: Как функции декораторы работают изнутри?

Лучший ответ:
Что делает декоратор — получает одну и создаёт новую функцию.

Пример из жизни. Декоратор == мастерская жуликов. Был обычный банкомат (функция). Засунули его в мастерскую злодеев и получили новый банкомат. Новый банкомат выглядит как прежний, но внутри теперь ещё и отправляет данные карты и введённые пин-коды злодеям. При этом свои внешние обычные действия он продолжает выполнять: принимает карту, показывает баланс.

 1. Каким образом аргумент функции double() передаётся в аргумент функции, которую возвращает декоратор? 
Наоборот: теперь работают с новой функцией, которую вернул декоратор. А уже она, внутри, вызывает double() в которую и передаёт аргумент, с которым её вызвали.

 2. Почему не работает прямой вызов функции-декоратора?  decorator(double(5)) в таком варианте аргументом в decorator() попадает что? — не сама функция double, а результат её выполнения с аргументом 5.

Наверное, вам пока непривычно, что аргументом функций может быть не только, скажем, число,
а и целая функция. Почувствуйте разницу:(fn2( fn1 ))(arg)
// fn2 получает аргументом функцию fn1
// возвращает новую функцию, и уже та выполняется
// с аргументом arg

fn2( fn1( arg ))
// fn1 выполняется с аргументом arg
// результат попадает аргументом в fn2
// возвращается результат вызова fn2

Худший ответ:
function double(num) {
    return num * 2;
}
function decorator(innerFn) {
    return function (num) {
        if(isNaN(num)) {
            throw new TypeError('Ошибка! Не число.');
        }
        return innerFn(num);
    };
}

const decoratedDouble = decorator(double);
alert(decoratedDouble(5));

decorator просто оборачивает переданную функцию в другую(`function (x)`) и возвращает её.
decorator(double(5))
не работает потому что ты напрямую вызываешь double, в результате в decorator передается 10(5*2), а не double.

В js есть класс Proxy позволяющий упростить подобные действия.
Вопрос: Как автоматически перегружать роутер TP-LINK при отсутствии интернета?

Лучший ответ:
Есть два варианта
1) интернета нет. потому что роутер завис. Это наиболее вероятный вариант. Как следует из диагноза, зависший роутер - завис. Поэтому перезагрузить его можно только внешним устройством  - пользователем или ребутатором-железкой (на базе esp8266 к примеру, делается за один вечер на ардуине. У меня есть готовый проект.)

2) интернета нет, потому что его нет. и нужен насильный обрыв сессии. В таком случае, роутер может сделать это сам, если его настроить. Если штатная прошивка этого не умеет, можно поставить аналог - ddwrt или openwrt

Худший ответ:
Посмотрите в расширенных настройках возможно там есть опция watchdog просто настройте ее на пинг например гугла.
Вопрос: Как в document.querySelector вставить html?

Лучший ответ:
document.querySelector('.post-list').innerHTML += `
        <div class="card" style="...">
            <div class="card-body">
                <h5 class="card-title">${post.title}</h5>
                <p class="card-text">${post.body}</p>
                <a href="#" class="card-link">Подробнее</a>
            </div>
        </div>`

posts.array.forEach
Ошибка, потому что в posts нет элемента array

Худший ответ:
Напишите, что получаете в posts
console.log(posts)
Вопрос: Как понять достоин ли ты более лучшей зар.платы или ещё не дорос и не надо высовываться даже?

Лучший ответ:
Чувак о каком достоин может быть речь если тебе не хватает грубо говоря на Доширак чтобы не умереть с голоду?
Тебе повышения зп процентов на 50 чтобы не умереть вот и все, о каком достоинстве может идти речь?
Или может ты их какого то знатного рода, тогда зачем ты работаешь за еду.
Я понимаю когда там программист получает 200к и задаётся вопросом может я достоин получать 600к

В таком случае речь идёт о выживании, либо поднять зп на текущем месте либо устроиться на новую работу и тут думать даже не о чем

Худший ответ:
Стоп, стоп, я вот когда фрилансеров нахожу в интернете (Битрикс, веб-разработка), то у них такса как правило 1000-1500 рублей в час. Мне кажется, маловато ты получаешь. Для фрилансера, чтобы твою зарплату получить, надо часов 20-30 работы (расслабленная такая рабочая неделя).
Вопрос: Как реализовать механику тени под ногами для лучшего позиционирования игрока в 2d платформере?

Лучший ответ:
Мне кажется, стоит банально создать объект под персонажем. На него навесить изображение тени и скрипт для указания логики работы тени.
В скрипте будет отслеживаться расположение персонажа и в зависимости от значения по оси Y менять localScale тени.
Также в скрипт добавить логику скрытия тени при близости персонажа к препятствиям.

Успехов в разработке!

Худший ответ:
Задаём тени гравитацию(она сама падает на нужный объект). Менять тень в зависимости от расстояния до юнита.(если юнит в состоянии полёта)
Во время прыжка делаем RayCast вниз, если объект сменился, перемещаем тень к игроку, она снова падает. 
Надо подобрать значение гравитации, что-бы не видеть падения.
Вопрос: Чем обусловлены различия в работе со строками и другими массивами?

Лучший ответ:
Это наследство С.
Используйте STL - и const std::vector< int > mas = { 4, 5, 7, 9 };
скомпилируется без проблем.
Вообще, больше используйте STL и меньше - массивы и строки в С-стиле. Во всяком случае, пока не освоитесь в языке настолько, чтобы лезть глубже.
Например, вопрос о константности указателя говорит о непонимании того, что на самом деле происходит в памяти.

Худший ответ:
Различия обусловнены тем, что строки - особый вид массивов. Весьма частый и использующийся повсеместно. Плюс, в отличии от обычных массивов, в строках есть нулевой завершающий байт. Поэтому некоторые вещи стандартом Си были добавлены в язык отдельно для строк. Как, например, инициализацию const char* строковым литералом, или инициализацию массива с рассчетом его размера (учитывая нулевой символ в конце). Оно же потом перекочевало в Си++.
Вопрос: Какой тип данных прописать для событий onFocus и onBlur?

Лучший ответ:
Он же явно говорит, какой должен быть тип

Худший ответ:
Нужно сделать так:

const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {
    event.currentTarget.classList.add("ticket--focus")
  }

  const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {
    event.currentTarget.classList.remove("ticket--focus")
  }
Вопрос: Как в bootsrap5 растянуть ( !не прижать! ) блок до низа страницы?

Лучший ответ:
Можно сделать на флексах
main -  делаем минимум во весь экран и флех колонкой
последний элемент растягиваем во флексе и его делаем тоже флексом. Ну и его содержание растягиваем во флексе
snippet

Худший ответ:
CSS никто не запрещал.
Вопрос: Как компилировать все файлы typescript в один файл, при написании приложения под Node?

Лучший ответ:
В один файл бандлить умеют.. бандлеры! )   Gulp, Grunt, Babel, WebPack, новый-быстрый Vite и другие. Они уже при сборке умеют и ts транспилировать, если прикрутить соотв. примочку. Например, про WebPack в документации TypeScript, или про TypeScript в конфигурации Vite (умеет из коробки).

Худший ответ:
Вам нужно разделить клиента и сервера на две подпапки и в каждой у вас будет свой вебпак-конфиг и package.json.
Вопрос: Переработка в маленьких IT-компаниях?

Лучший ответ:
Все зависит от конкретной компании.

Худший ответ:
По моим наблюдениям четкое разделение на фронт и бэк и дба есть только в продуктовых командах. В аутсорсе приходится делать и то и другое. Впрочем у меня своеобразные продукты sharepoint dynamics 365. Там фронт и Бэк тесно переплетены. Поэтому разделять их непродуктивно. Хотя ui рисуют все же дизайнеры, а верстку делают верстальщики я просто натягиваю на специфику