СОБЕСЕДОВАНИЕ НА FRONTEND РАЗРАБОТЧИКА | REACT TYPESCRIPT
HTML-код
- Опубликовано: 19 июн 2024
- В данном видео мы проведем собеседование на frontend разработчика. Зададим вопросы разной сложности и на разные темы (javascript, typescript, react), и определим уровень кандидата.
Если вы хотите записаться на подобное собеседование - переходите в мой Телеграмм канал:
telegram.me/ayub_begimkulov_c...
Таймкоды:
00:00-01:07 - Интро
01:07-04:19 - Задача на id функцию
04:19-09:23 - Сортировка массивов
09:23-18:47 - Пишем функции map/filter через reduce
18:47-23:54 - Говорим про промисы
23:54-28:49 - Promise.all/Promise.allSettled
28:49-46:17 - Пишем Promise.all с нуля
46:17-57:48 - Таймер на React
57:48-01:01:41 - Говорим про React.memo и ререндеры
01:01:41-01:07:03 - Задача на бесполезный useCallback
01:07:03-01:18:51 - Задача на ref + useEffect
01:18:51-01:23:24 - Подводим итоги
Друзья, как правильно заметили, пропустил пару ошибок:
- Типизация map - колбэк не должен возвращать `T`, а совсем другой дженерик.
- filter не должен пушить `res`, а `value`.
Можешь объяснить, почему ты сказал, что в коллбэке map все параметры обязательны? Ведь я могу прокидывать туда коллбэки, которые не то, что индекс не используют, но даже сам elem
@@user-pw8qb2ci1u плюсую
Сколько стоит час вашего менторства?
Мне. Я бомж без мозгов могу решить данную задачу за один символ. Слишком простая задача
А если серьезно спасибо друг я давно так не смеялся)
Хороший собес 👍 19 лет, пол года стаж - отлично и бодро отвечает
P.S Я с такими ответами на сеньора проходил, а тут миддла не дали, я протестую! 😂 Не забывайте, hard скиллы лишь часть из того, что учитывается на собеседовании, можно взять хитростью(вычеркнуто) - софт скиллами, амбициями и просто по-человечески понравится, ведь чем выше позиция - тем меньше кода и тем больше созвонов 😂
@@user-vq8zi4ne7s Ахахаха, ну тут все от позиции зависит.
@@user-vq8zi4ne7s синеры занимаются кодом еще больше чем все остальные просто они пишут код за 10 минут который Джуны за три часа делают и этот код Джунов в два раза длиннее кодов синеров
@@user-vq8zi4ne7sвидимо какая-то очень слабая команда или компания.
Ответы здесь джуновские...
слабый, я с 18 сразу залетел)
Ты как всегда делаешь великое дело, спасибо за контент)
Спасибо за такие видео, очень полезно , как раз что совсем скоро меня ждут собесы :)
Рад помочь!
Мне собес понравился. Задачки были интересные.
Расширяют практику восприятия ))
Спасибо
Спасибо за фидбэк!
Спасибо за контент! Ты делаешь великое дело
Да просто видосы же по программированию делаю, ничего великого вроде) Но спасибо!
@@ayub_begimkulov ты обучаешь людей, дааешь им знания, тем самым двигая прогресс вперед. Это действительно благое дело
Формат неплохой, я так понимаю всё было поставлено на решение задачек и дискуссию об устройстве языка. Советую тебе добавить блок об опыте работы, по моему мнению это гораздо важнее чем, например, знания map, filter и reduce. Может эта часть и хромала, но на работе ты быстро загуглишь про эти методы и за 10 минут поймешь, а вот различные нюансы разработки, частые юзкейсы ты за 10 минут не загуглишь.
Также совет другим людям - не пугайтесь задачек и не думайте, что спрашивать будут только это, у всех разные подходы к собеседованиям, у меня например было собеседование в формате диалога с тимлидом, обсуждали решенные задачи, технологии и процесс разработки. А кто-то вас пошлёт на литкод и попросит объяснить внутреннее устройство браузера. Также забудьте о грейдах и фразах "мидлом тут не пахнет", в реальности так не работает, грейды от компании к компании разные, где-то их вообще нет, не советую добавлять эти приставки себе в резюме или на собеседовании.
Единственный способ определить свой уровень - сделать резюме, понять вилку зп и пройти собеседование, а дальше можете себе называть кем угодно :) Хоть мидлом, хоть синьором
У человека без опыта работы, каким подразумевается джун, спрашивать об опыте работы - как бы не логично. У меня складывается впечатление, что айтишники пребывают в истерике от снижения уровня входа в профессию из-за курсов, увеличения конкуренции.
@@foryoutubeandothers трактовка джуна очень условная, а если я полгода-год отработал я уже кем-то другим должен считаться? Везде по-разному) Тем более конкретно в этом видео у человека полгода в компании и полгода на фрилансе
@@foryoutubeandothers такое впечатление складывается только у немотивированных айтишников)
Отличный совет! Спасибо, что поделился мыслями!
Очень благодарен Вам!
Спасибо!
особенно поднимает дух "ну ты типа джуниор плюс" POV я который 6 лет долбит реакт, 2 года пишет коммерческие и не мог бы решить ни одного вопроса без консоли чата гпт гугла и пару часов времени на каждую.
Спасибо, было полезно
хороший демотиватор спасибо
«Я думал ты так и сделаешь» ты же проводишь собеседование, покажи ему как можно было сделать и все. А эти комментарии, какую то токсичность вызывают. Задание можно выполнять разными способами - он выбрал этот
Если учитывать что это упор был на то что это мидл, то лол, всё правильно он сказал. Учитывая что он изначально делал замыкание, а потом просто не допёр как его использовать до конца, то блин. В итоге это выглядит как чел, который вообще не разбирается в механизме замыкания.
На моё субъективное мнение это джун с опытом и даже не стронг джун.
про токсичность тоже чувствуется. Если бы это братаны тестировали свои навыки, то гуд, а если это имитация собеса, тогда оценку можно и собеседующему дать. Вообще это слабая фраза - "я думал ты сделаешь так")), просто предлагаемые решения были хуже вылизанных и подготовленных.
@@vladbreez4036какой джун, он на стажёра с натяжкой тянет...
Очень уверенно отвечал паренек, по знаниям точно не джун))) Бывает и мидлы на лайвкодинге забуксовать могут )))
Кандидат вообще молодец, местами чуть пробелы подтянуть - и будет вообще топ!
Я бы еще добавил условие для задачи с promiseAll: сделать типизацию, что если передаешь массив промисов [number, string], то в then летит так же [number, string]
Как вариант:
type AwaitedPromises = {
[K in keyof T]: Awaited
};
function promiseAll(promises: T) {
return new Promise(...)
}
Также, может, лучше писать таймер через рефу, а не эффект? Иначе придется лишний раз рендерить компонент, когда запускаешь таймер, так как меняется состояние isStarted
const [second, setSecond] = useState(0);
const timerId = useRef();
const startTimer = () => {
if (timerId.current === undefined) {
timerId.current = setInterval(() => {
setSecond((sec) => ++sec);
}, 1000);
}
};
const stopTimer = () => {
if (timerId.current !== undefined) {
clearInterval(timerId.current);
timerId.current = undefined;
}
};
useEffect(() => stopTimer, []); // очищаем таймер, если компонент демонтируется
Cool !
thanks!
Привет, отличное видео! Подскажи, разве на 1:01:30 есть ререндер компонента Button, на сколько я вижу там только первичный рендер. Или я чего-то не понял?
Да и я чтото не понял
интересная в конце задачка последняя)
Top person
15:30 я думал вы напишите что то типа этого:
Array.prototype.mymap = function (callback) {
return this.reduce((resultArr, currentElement, index) => {
resultArr.push(callback(currentElement, index, this));
return resultArr;
}, []);
};
Приятно смотреть и слушать собесы, еще могу подкинуть идею тебе для видео, сделать собес на позицию джуна без опыта комерческого какого-нибудь. Допустим какой-нибудь человек который сам отучился, либо закончил курсы какие-либо и находится в поисках своей первой работы, очень сложно в таком случае вообще попасть на собес бывает. И вот ты можешь дать такой шанс пройти первый собес человеку, оценить его знания после прохождения курсов, либо самообучения, дать ему советы какие-нибудь, как вообще искать первую работу и т.д. и т.п.
разве эти видосы как раз не про это? такой же и будет собес +-, а про попасть тут другая история уже, придумай опыт, если собес спокойной пройдешь
20:50 полагаю, имелось в виду, что коллбэк для res и rej можно передать в одном then двумя аргументами
такое будет работать
привет такой вопрос к тебе . как правильнее писать isVisible && hello
или isVisible ? hello : null или без разницы
Нет разницы.
Я кста еще не помню точно, собеседующийся в цикле forEach написал break, его же вроде нельзя прерывать?
break-a там и в помине нет, только в счетчиках for
@@kawaikaino5277 31:15 открой
@@multtanker6365 не))) я к тому, что в переборах .map, .filter .foreach нет break. В плане - ты прав)
@@kawaikaino5277 ааа)понял))
break потом убрали, насколько я помню. Но в целом верно.
Самому 18 лет, 2 года опыта, сейчас работаю на позиции middle frontend разработчик и хотят попробовать меня на позиции senior. В принципе сам давно алгоритмы не решал, но задачи показались не сложными, парень молодец, показал не плохо, но можно было лучше. С map, filter, сам задачи на собеседовании сам даю :)
Есть вопрос к типизации map. Разве мы не должны создать ещё один дженерик помимо T? Ведь cb не обязательно возвращает тот же тип.
Жесть у меня от твоего комментария депрессия. 18 лет - сеньор. Я в 26 не могу джуном работу найти
@@antohnyt2067 не думай о всякой xeрне и просто упорно прокачивай навыки. Если прям слишком долго не можешь найти, возможно у тебя пет-проекты не оч сложные, резюме так себе изложено, мало откликов в день оставляешь (у меня это было 100-200 штук за вечер) или ты просто ещё сыроват и мало знаешь. Новичкам сложнее всего сейчас найти, нужно целый ряд технологий знать.
@@antohnyt2067 Рисуй опыт в резюме и все, знакомый 2 года учил swift, потом начал делать отклики, на джуна нигде не брали, нарисовал опыт, прошел собес на миддла спрашивали вообще базу самую, больше про опыт прошлый, он нормально ответил , спокойно работает за 190к мидлом.
@@antohnyt2067 джуны просто никому не нужны. А в 18 сеньор - это что-то из области фантастики, я бы не верил всяким коментам.
@@inqvisitor3722 Сеньор это уже больше про опыт. Вызубрить ты можешь много всего, но грамотно все применять нужен опыт. Сеньор верстальщик ты можешь за два года стать, а вот сеньором разработчиком крупных проектов с большой бизнес логикой уж оооочень врятли
Я понял только одно, что про перерисовки - ничего не знаю! У тебя конечно Крутая экспертиза! Виден скилл с первых слов…. Братан, можешь сделать об этом подробное видео? Как дебажить такие вещи, как работать с плагином(react dev tools)в Гугл хром… Как решать все самые частые проблемы с перерисовками и ререндарами
ну реально контента на эту тему - в ютубе просто нет..
Не надо увлекаться перерендерами ,реакт сам прекрасно справляется с этим. Просто ютуберы уже заколебали с дебпгингом ререндеров.
касательно sort на 9 минуте))) Меня вынесло с того, что говорил автор про a и b (перепутал их) и как работает сам сорт)))
Привет. Не мог бы ты раскрыть мысль? Что тебя так сильно удивило? Как и было сказано на видео, я сам всегда вспоминаю принцы работы sort экспериментальным путем.
по ответам очень видно молодого джуниора и взрослого ) собеседующий тут прям как родитель и отец,оценивает , давай я помогу , а молодой такой я знаю , я знаю и хочет сказать вперед )))) очень интереесно со стороны психологии наблюдать такие видео, спасибо, что выкладываете
Ахаххаха
Просмотрел до 8:54 и что-то интервьюер растекается и плывет. Парень, если не можешь четко и обоснованно изложить мысль, делая замечание, то лучше промолчать, все же. А то переписал тот же sort, сделал все то же самое, что и парнишка, но с такой академической претензией и гонором, что дышать нечем.
На самом деле смешно, как люди могут видеть очень разные вещи в одном ролике).
Я хотел объяснить, как я обычно вспоминаю формат колбэка, передаваемого в sort, на примере. Постараюсь в дальнейшем локаничнее выражаться.
Спасибо за интервью!
В promiseAll есть почти незаметная ошибка. Если в оригинальный Promise.all придет что-то не-thenable (например, просто едиинчка: Promise.all([1])), то он обернет это значение в промис и сразу зарезолвит. В нашем решении же будет ошибка "promise.then is not a function". Это поправится, если на строке 77 вместо promises[i] написать Promise.resolve(promises[i])
С map забыли вывести возвращаемый тип. В вашем случае всегда будет возвращать T[], что неправда
function map(arr: T[], callback: (item: T, idx: number, arr: T[]) => R) {
return arr.reduce((result, item, idx, arr) => {
result.push(callback(item, idx, arr));
return result;
}, [] as R[])
}
Хорошее замечание!
про реализацию фильтра, ошибочка. Пушим не res, а сам value в acc
Хорошее замечание!
55:41 - тут парню чутка совсем не повезло. Если бы он не добавил условие if(!isStarted), то у него бы работало. Дело в том что во время cleanup, isStarted = true потому что шел таймер. isStarted станет false только на следующем рендере, а как Аюб ранее говорил: "useEffect срабатывает перед обновлением компонента, при смене массива зависимостей". Поэтому если убрать то условие, про которое я выше написал, всё заработает.
Вполне бодрячком парень, соображалка на уровне. Не так давно видел сеньор говорил как раньше собесы были , пришел спросили типы данных и еще пара вопросов и оффер получил, а сейчас он же с 20-ти летним опытом не прошел)). Душнилы в общем .....
Раньше такого хайпа у веба не было, людей брали на добром слове, а сейчас порог вхождения низкий, а на устройство на работу высокий, в итоге 10 кругов собеса нужно пройти, чтобы тебя взяли
Привет) А есть вопросы с ответами в текстовом формате?
Привет. К сожалению, нет.
Второе название для видео - Сеньёр уничтожает ЭГО миддла с полу годовым коммерческим опытом )
почему в колбэке параметры можно оставлять обязательными ?
Потому что они всегда будут переданы в колбэк. А используешь ты их или нет - уже твое дело.
Тут просто нужно понимать, как работает TS. Когда у тебя есть функция, которая принимает 2 аргумента, а ты передаешь туда 3, то TS будет ругаться, так как это явная ошибка.
Но если ты ожидаешь где-то колбэк, в который будет передаваться 3 параметра, а туда передают функцию с 2-мя, то все норм. Так как 3-й тебе может быть вообще не нужен. Главное, чтобы результат функций был одинаковый.
Например в посмотри типизацию addEventListener, например, должно понятнее стать.
@@ayub_begimkulov ааа, понял, спасибо за подробный ответ!! а где удобнее всего посмотреть про то как типизирован addEventListener?
Где он учился?
Здравствуйте можете объяснить почему на задачке с мап индекс нельзя сделать опционально
Потому что индекс туда передается всегда. Ты можешь его не использовать - но это уже твое дело.
Индекс в колбэк должен всегда передаваться. Иначе если человек его вдруг решит заюзать - вылетит ошибка.
Понял спасибо
Разве в filter функции при res === true надо пушить res, а не value?
Да, не пропустили ошибку.
на 56 минуты Вы сказали, что функция - примитив, верно ли?
15:45 колбек в map не должен возвращать тип T, там, скорее unknown
Надо вывести отдельный тип через дженерик
function map(arr: T[], callback: (item: T, idx: number, arr: T[]) => R) {
return arr.reduce((result, item, idx, arr) => {
result.push(callback(item, idx, arr));
return result;
}, [] as R[])
}
Тут правильно подметили, нужен отдельный тип. Проглядел этот момент.
скоро дети из детсада джуниорами выходить будут. это если программисты все еще будут нужны
К сожалению, таких очень мало, большинство ждет погоды у моря, чтобы начать делать что-то полезное и развиваться.
@@ayub_begimkulovЧестно говоря, немного в шоке как мои коллеги по цеху, айтишники (читать: веб-макаки, «любители сыров по 500), любят плодить себе конкуренцию … Это только в АйТи такое есть (наверное)
Большинство программистов быстро адаптируются под разные условия, даже сейчас всё (вплоть до самих языков программирования) очень быстро меняется и развивается. Так что за программистов бояться не надо) Переживать надо за людей выполняющие обычные рутинные задачи, которых на данный момент те же программисты автоматизируют
Аюб вы грепплингом увлекаетесь?)
Ага, увлекаюсь.
@@ayub_begimkulov круто, просто наткнулся на видео где были соревнования по грепплингу. Смотрю что то имя знакомое) Круто, вы очень разносторонняя личность 👍
Наша контора сейчас активно набирает разработчиков. И к нам приходят сеньоры, которые хуже этого парня) с мидлами так вообще кошмар
АйТи пропаганда дает о себе знать 😂
Да, есть такое.
С секундомером можно было бы сделать проще:
useEffect(() => {
let interval;
if (isStarted) {
interval = setInterval(() => {
setTime((prev) => prev + 10);
}, 10);
}
return () => clearInterval(interval);
}, [running]);
Делать проверку на !isStarted нет смысла, потому что по нажатию у тебя isStarted в true
ти сам у свому ж прикладі зробив цю перевірку
setInterval не рекомендуют использовать
@@inqvisitor3722 смотря для каких целей использовать. В данном случае для такого таймера - самое то, чтоб не заморачиваться.
Дело в логике работы самого интервала - он не ждёт выполнениея колбэка, и здесь могут возникать сюрпризы)
так у тебя же та же проверка, просто isStarted, вместо !isStarted. И так и так писать можно, по итогу работать будет одинаково)
В сортировке ошибка касаемо что такое а и b. На самом деле a - это второе число, а b - это первое
Насколько я помню, там нету четкого правила.
Если 0, то оставляем как есть. Если 1 - то a должен быть после b, ну и -1 то a перед b.
@@ayub_begimkulov Да, все верно, но в функцию сравнения они передаются именно в таком, контринтуитивном порядке)
@@demiurgen13 Прикольно. Не знал про это.
Я как и сказал в видосе, всегда экспериментальным путем понимаю, как что работает.
Спасибо за фидбэк!
объясните в чем прикол писать функции мар или filter если их просто можно использовать уже готовыми?
Нет прикола - просто проверка знаний.
Почему именно map/filter? Потому что уже все знаю как они работают и не надо объяснять алгоритм.
Привет, ведешь менторство? Хотел бы поучиться у тебя)
Естественно не бесплатно)
уже учишься же)
а что в результате? мидл то или нет? какой оклад?
Это моковое собеседование было же. Я в конце говорил, что до мидла чуть не дотягивает (имхо), но можно быстро до него вырасти.
Посмотрев 2 задачи, и по ответам. Я думаю что он Джун, Джун+...
1:01:50 - у меня не сошлось тут. Что с useCallback, что без него button рендерится 2 раза как Аюба и при нажатии на кнопку clickMe, повторного рендера button не происходит. Хотя и у Аюба его тоже не происходит, но он говорит что происходит. То есть рендер Button происходит только 1 раз в случае mount, в случае Аюба 2, потому что у него strict mode включен - но суть одна. Button рендерится 1 раз при mount'e и при нажатии на клик не рендерится, что с useCallback, что без.
Я это видео 5 раз пересматривал и 2 раза запомнил такое поведение и только сейчас дошли руки написать комент. Я же не один с таким поведением? И ещё, Аюб говорит: "Перерендера не будет". Но он не проверяет этого и идет дальше. Понимаю senior туда сюда, но интересно разобраться.
Привет, а можешь подробнее рассказать, что у тебя не сошлось, не совсем понял из твоего сообщения?
Я добавил useCallback на onClick и спросил у Андрея (кандидат) «в таком случае не ререндерится?», он ответил «да», с чем я согласился.
Мы ведь тоже самое и сказали? Рендерится только при Маунте)
Или я тебя как-то не так понял?
@@ayub_begimkulov ты на 1:01:20 - спрашиваешь Андрея: "onClick каждый раз будет новым. И в итоге будет ререндерить или нет?". Андрей говорит будет. Дальше ты соглашаешься и говоришь: "Button ререндерится". Хотя не не ререндерится по вызову функции. Не хочу душить, просто я внимательно слушаю и смотрю. И меня это запутало. Хотя в прошлом комментарии ты сказал, что ты спросил «в таком случае не ререндерится?». Но ты спросил будет ли onClick ререндить Button и он сказал да.
Извини что задушнил :D
@@Abdul-hy4cyу меня такое же мнение сложилось во время просмотра. Но я не перепроверял.
А по последней задаче нет вопросов? Я не понял смысла компонента, ведь если придёт новая функция, то новый слушатель не создастся.
@@TarasovFrontDev я уже не помню, не хочу погружаться обратно в контекст этого т.к. для меня пока что, это не имеет значение
что за трек в начале?
мой видео-редактор ставил, сам не знаю)
Ну с первой задачи про айди я уже всё понял :/
Лично я в IT ровно год и позиционирую себя как миддл. Похоже, не преувеличиваю свои способности.
Я бы не смотрел на опыт, 1 год опыта может быть очень разный.
Попробуй составить резюме и пройти собесы. Так можно будет точно определить свой уровень.
стратегия так себе, тут не HR-ы сидят, перед нами писей махать не надо)) у себя в проекте ты и тех и тим лид и заказчиком можешь быть и что это будет означать? Если любишь выеbivatься, а не саму разработку, то в принципе ведешь себя соотвественно)
Если он джун плюс тогда мой учитель стронг мидл который называет себя джуном плюс😂
У всех же понимание уровней разное)
Ну я первую работу нашел в 17, сейчас 18, что дальше ? Я буду синьор в 19-20 ?)
не в возрасте дело браточек
@@airpodsclub6443Спасибо, кеп
@@airpodsclub6443 а в чем
Ну тебе от природы дан гениальный мозг просто
А кому то нет. Им нужны деньги на образование чтобы прокачать мозг
Это законы природы. Продолжай в том же, и ускорить эволюцию
@@andreilatosh58 не мозг, а сильная мотивация + произошло случайное во времени событие - роды. Именно это позволило парню в данный момент в 18 лет быть мидлом.
Ayub какая у тебя мотивация чтобы вести youtube канал? Ты же senior-разраб, сидел бы и лутал ЗП. Зачем на ютубе ещё работать?
Сортировка. Сейчас я говорит покажу тебе как я до этого дошёл, и херню какую то понес
Парень не знает замыкания, какой мидл? Если не знаешь и не понимаешь замыкания , то про реакт лучше даже вопросы не задавать. Такие разработчики потом удивляются почему переменная не так высчиталась в эффекте или в мемо.
Ну хотя от таких мидлов, я спокоен за себя )
Задачи, оторванные от реальности. На проектах дают какую-нибудь большую задачу, типа сделать огромную форму, которая в разных вкладках находится, и еще в диалоговых окнах - и вот пили это всё 2 дня в ограниченные сроки. На первый план там совсем другие проблемы приходят. Никто не будет над каждой мелкой функцией париться и следить, чтобы она не перерендеривалась. Работает - да и ладно. Было бы полезнее рассказывать о том, как писать код, чтобы максимально снизить вероятность ошибок. Собеседование крайне душное, а парня жалко))
На проектах, тебе через 2 месяца дают добавить в эту форму одно поле и 2 часа. А ты мучаешься 2 недели, потому что не парился над каждой мелкой функцией
@@mtb-love-belarus так и есть
Даже дело не в функции, а в правильно сформулированном алгоритме, логике короче
Если заранее максимально все не придумал, то потом придется все переписывать из-за маленькой мелочи, которую нужно добавить и которая рушит всю работу твоего кода
Я в 19 шпилил в игры и смотрел аниме и ходил в универ и до 25 не программировал . В итоге у меня начальник младше меня лол
Как будто, это что-то плохое
@@user-vu6hn4ul2i нет но если бы я пошел сразу на работу вместо универа я думаю было бы лучше
@@MaximYalagin не факт, может быть уже бы выгорел 🤷🏿♂️
Главное дальше не упускать время)
Пи**ц, во что React превращается. Ну был же раньше нормальный жизненный цикл. Сейчас привязка хуков к файберу и мышление снэпшотами дико затрудняет понимание рендера.
Ты про классовый подход ?
Хз, тема рендеринга очень сложная на самом деле в реакте, жизненные циклы тут причем ?
@@threehundredbucks3212 Да, классовый подход был нагляднее. Сейчас наглядность ушла =(. Тема сложная, согласен. Но все равно это надо предоставлять в каком-то удобоваримом виде: что-то инкапсулировать, какие-то методы API сделать более простыми. А так, без поллитра не разберешься.
@@InSimpleWords_WebDev ну я согласен что рендер очень сложная штука, на классах Я почти не писал, так как начал с реактом работать в начале года и собсна к этому времени классы остались только в Легаси или каких-то специфичных проектах не относящихся к обучению. Но по-моему что там что там жизненный цикл одинаковый, какие кардинальные отличия в этих подходах по циклу ? В том, что вместо них используют хуки типа use layout effect и use effect ? Более глубокие вещи по рендерингу кажется что там что там сложны
@@threehundredbucks3212 Может вы и правы. Просто к классам я быстро привык: четкие методы, четкое API... Тут же я до сих пор не могу научиться контролировать реакт.
`use layout effect и use effect ` не покрывают все случаи - рождаются костыли вроде flushSync, useEffectEvent ... Дока реакта призывает вообще думать не жизненым циклом, а snapshot-ами и синхронизацией. Причем самое забавное: жизненный цикл остался, просто его спрятали поглубже (render phase, commit pahse: commitLayoutEffects, и тд).
Однако нам вместо прямого инструмента, дали derived \ косвенное управление этой шайтан-машиной через современные хуки. И получилась двойная абстракция над их третьей: переизобретенным EventLoop-ом через файберы. В результате, шаг влево, шаг вправло - и хуков верхнего API не хватает...
И начинается костыляние. Причем даже не кода, а мысли человеческой.
Да, я не постиг хуки еще. Мне не стоит судить об этом. Возможно, когда я разберусь с этим, я пойму и причины и как с этим код писать. Но пока... пока сложно.
@@InSimpleWords_WebDev ну ты явно больше меня понимаешь ) хотя я вот сам что касается рендера в реакте и жизненных циклов не особо, там много подводных камней
Мидлом тут не пахнет, не знать как работает sort и как получить функцию из функции id - моветон. Максимум джун с половиной
хз, если он может строить приложение с поддерживаемой, читаемой структурой, которая не ререндерится на каждый чих, то вполне мидл
Щас бы по паре ответов, определять мидл или джун))) поздравляю у вас мидл-головного мозга.
Я честно не понимаю, почему Ру-комьюнити, так любит сложности\пытки и унижения???
- Даешь человеку пулл задач, даешь фиксированное время. Смотришь результат. Сделал\Работает\Чисто? Эти все ваши "Мидл, Хуидл и прочее" это в голове!!! Есть программист который выполняет задачи, а есть который не выполняет
Я бы не был так жесток, у человека нету опыта прохождения собесов. С id, кажется, он не совсем понял условие. sort - я сам тоже затупил там)
Тут я бы скорее к базе React больше придрался. Так как его понимать как раз таки очень нужно.
Если чуть поработает над ошибками, подтянет базу и наберет опыта с собесами - то можно спокойно подаваться на мидла.
А ты учти что чел на собесе, переживает и на подумать время ограниченно
Возможно в спокойной обстановке и имея под рукой гугл он бы эту задачу щёлкнул на раз два
Ужасное интервью. Автор как будто сам не понимает, что говорит -_-
Это далеко не мидл
Кринж