СОБЕСЕДОВАНИЕ НА FRONTEND РАЗРАБОТЧИКА | REACT TYPESCRIPT
Вставка
- Опубліковано 4 сер 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 ты обучаешь людей, дааешь им знания, тем самым двигая прогресс вперед. Это действительно благое дело
особенно поднимает дух "ну ты типа джуниор плюс" POV я который 6 лет долбит реакт, 2 года пишет коммерческие и не мог бы решить ни одного вопроса без консоли чата гпт гугла и пару часов времени на каждую.
Спасибо, было полезно
Очень благодарен Вам!
Спасибо!
хороший демотиватор спасибо
Формат неплохой, я так понимаю всё было поставлено на решение задачек и дискуссию об устройстве языка. Советую тебе добавить блок об опыте работы, по моему мнению это гораздо важнее чем, например, знания map, filter и reduce. Может эта часть и хромала, но на работе ты быстро загуглишь про эти методы и за 10 минут поймешь, а вот различные нюансы разработки, частые юзкейсы ты за 10 минут не загуглишь.
Также совет другим людям - не пугайтесь задачек и не думайте, что спрашивать будут только это, у всех разные подходы к собеседованиям, у меня например было собеседование в формате диалога с тимлидом, обсуждали решенные задачи, технологии и процесс разработки. А кто-то вас пошлёт на литкод и попросит объяснить внутреннее устройство браузера. Также забудьте о грейдах и фразах "мидлом тут не пахнет", в реальности так не работает, грейды от компании к компании разные, где-то их вообще нет, не советую добавлять эти приставки себе в резюме или на собеседовании.
Единственный способ определить свой уровень - сделать резюме, понять вилку зп и пройти собеседование, а дальше можете себе называть кем угодно :) Хоть мидлом, хоть синьором
У человека без опыта работы, каким подразумевается джун, спрашивать об опыте работы - как бы не логично. У меня складывается впечатление, что айтишники пребывают в истерике от снижения уровня входа в профессию из-за курсов, увеличения конкуренции.
@@foryoutubeandothers трактовка джуна очень условная, а если я полгода-год отработал я уже кем-то другим должен считаться? Везде по-разному) Тем более конкретно в этом видео у человека полгода в компании и полгода на фрилансе
@@foryoutubeandothers такое впечатление складывается только у немотивированных айтишников)
Отличный совет! Спасибо, что поделился мыслями!
Top person
Cool !
thanks!
Я бы еще добавил условие для задачи с 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, []); // очищаем таймер, если компонент демонтируется
15:30 я думал вы напишите что то типа этого:
Array.prototype.mymap = function (callback) {
return this.reduce((resultArr, currentElement, index) => {
resultArr.push(callback(currentElement, index, this));
return resultArr;
}, []);
};
Привет, отличное видео! Подскажи, разве на 1:01:30 есть ререндер компонента Button, на сколько я вижу там только первичный рендер. Или я чего-то не понял?
Да и я чтото не понял
20:50 полагаю, имелось в виду, что коллбэк для res и rej можно передать в одном then двумя аргументами
такое будет работать
«Я думал ты так и сделаешь» ты же проводишь собеседование, покажи ему как можно было сделать и все. А эти комментарии, какую то токсичность вызывают. Задание можно выполнять разными способами - он выбрал этот
Если учитывать что это упор был на то что это мидл, то лол, всё правильно он сказал. Учитывая что он изначально делал замыкание, а потом просто не допёр как его использовать до конца, то блин. В итоге это выглядит как чел, который вообще не разбирается в механизме замыкания.
На моё субъективное мнение это джун с опытом и даже не стронг джун.
про токсичность тоже чувствуется. Если бы это братаны тестировали свои навыки, то гуд, а если это имитация собеса, тогда оценку можно и собеседующему дать. Вообще это слабая фраза - "я думал ты сделаешь так")), просто предлагаемые решения были хуже вылизанных и подготовленных.
@@vladbreez4036какой джун, он на стажёра с натяжкой тянет...
интересная в конце задачка последняя)
Очень уверенно отвечал паренек, по знаниям точно не джун))) Бывает и мидлы на лайвкодинге забуксовать могут )))
Кандидат вообще молодец, местами чуть пробелы подтянуть - и будет вообще топ!
по ответам очень видно молодого джуниора и взрослого ) собеседующий тут прям как родитель и отец,оценивает , давай я помогу , а молодой такой я знаю , я знаю и хочет сказать вперед )))) очень интереесно со стороны психологии наблюдать такие видео, спасибо, что выкладываете
Ахаххаха
Где он учился?
Спасибо за интервью!
В promiseAll есть почти незаметная ошибка. Если в оригинальный Promise.all придет что-то не-thenable (например, просто едиинчка: Promise.all([1])), то он обернет это значение в промис и сразу зарезолвит. В нашем решении же будет ошибка "promise.then is not a function". Это поправится, если на строке 77 вместо promises[i] написать Promise.resolve(promises[i])
привет такой вопрос к тебе . как правильнее писать isVisible && hello
или isVisible ? hello : null или без разницы
Нет разницы.
Приятно смотреть и слушать собесы, еще могу подкинуть идею тебе для видео, сделать собес на позицию джуна без опыта комерческого какого-нибудь. Допустим какой-нибудь человек который сам отучился, либо закончил курсы какие-либо и находится в поисках своей первой работы, очень сложно в таком случае вообще попасть на собес бывает. И вот ты можешь дать такой шанс пройти первый собес человеку, оценить его знания после прохождения курсов, либо самообучения, дать ему советы какие-нибудь, как вообще искать первую работу и т.д. и т.п.
разве эти видосы как раз не про это? такой же и будет собес +-, а про попасть тут другая история уже, придумай опыт, если собес спокойной пройдешь
касательно sort на 9 минуте))) Меня вынесло с того, что говорил автор про a и b (перепутал их) и как работает сам сорт)))
Привет. Не мог бы ты раскрыть мысль? Что тебя так сильно удивило? Как и было сказано на видео, я сам всегда вспоминаю принцы работы sort экспериментальным путем.
Я кста еще не помню точно, собеседующийся в цикле forEach написал break, его же вроде нельзя прерывать?
break-a там и в помине нет, только в счетчиках for
@@kawaikaino5277 31:15 открой
@@multtanker6365 не))) я к тому, что в переборах .map, .filter .foreach нет break. В плане - ты прав)
@@kawaikaino5277 ааа)понял))
break потом убрали, насколько я помню. Но в целом верно.
Просмотрел до 8:54 и что-то интервьюер растекается и плывет. Парень, если не можешь четко и обоснованно изложить мысль, делая замечание, то лучше промолчать, все же. А то переписал тот же sort, сделал все то же самое, что и парнишка, но с такой академической претензией и гонором, что дышать нечем.
На самом деле смешно, как люди могут видеть очень разные вещи в одном ролике).
Я хотел объяснить, как я обычно вспоминаю формат колбэка, передаваемого в sort, на примере. Постараюсь в дальнейшем локаничнее выражаться.
Я понял только одно, что про перерисовки - ничего не знаю! У тебя конечно Крутая экспертиза! Виден скилл с первых слов…. Братан, можешь сделать об этом подробное видео? Как дебажить такие вещи, как работать с плагином(react dev tools)в Гугл хром… Как решать все самые частые проблемы с перерисовками и ререндарами
ну реально контента на эту тему - в ютубе просто нет..
Не надо увлекаться перерендерами ,реакт сам прекрасно справляется с этим. Просто ютуберы уже заколебали с дебпгингом ререндеров.
про реализацию фильтра, ошибочка. Пушим не res, а сам value в acc
Хорошее замечание!
Здравствуйте можете объяснить почему на задачке с мап индекс нельзя сделать опционально
Потому что индекс туда передается всегда. Ты можешь его не использовать - но это уже твое дело.
Индекс в колбэк должен всегда передаваться. Иначе если человек его вдруг решит заюзать - вылетит ошибка.
Понял спасибо
55:41 - тут парню чутка совсем не повезло. Если бы он не добавил условие if(!isStarted), то у него бы работало. Дело в том что во время cleanup, isStarted = true потому что шел таймер. isStarted станет false только на следующем рендере, а как Аюб ранее говорил: "useEffect срабатывает перед обновлением компонента, при смене массива зависимостей". Поэтому если убрать то условие, про которое я выше написал, всё заработает.
Самому 18 лет, 2 года опыта, сейчас работаю на позиции middle frontend разработчик и хотят попробовать меня на позиции senior. В принципе сам давно алгоритмы не решал, но задачи показались не сложными, парень молодец, показал не плохо, но можно было лучше. С map, filter, сам задачи на собеседовании сам даю :)
Есть вопрос к типизации map. Разве мы не должны создать ещё один дженерик помимо T? Ведь cb не обязательно возвращает тот же тип.
Жесть у меня от твоего комментария депрессия. 18 лет - сеньор. Я в 26 не могу джуном работу найти
@@antohnyt2067 не думай о всякой xeрне и просто упорно прокачивай навыки. Если прям слишком долго не можешь найти, возможно у тебя пет-проекты не оч сложные, резюме так себе изложено, мало откликов в день оставляешь (у меня это было 100-200 штук за вечер) или ты просто ещё сыроват и мало знаешь. Новичкам сложнее всего сейчас найти, нужно целый ряд технологий знать.
@@antohnyt2067 Рисуй опыт в резюме и все, знакомый 2 года учил swift, потом начал делать отклики, на джуна нигде не брали, нарисовал опыт, прошел собес на миддла спрашивали вообще базу самую, больше про опыт прошлый, он нормально ответил , спокойно работает за 190к мидлом.
@@antohnyt2067 джуны просто никому не нужны. А в 18 сеньор - это что-то из области фантастики, я бы не верил всяким коментам.
@@inqvisitor3722 Сеньор это уже больше про опыт. Вызубрить ты можешь много всего, но грамотно все применять нужен опыт. Сеньор верстальщик ты можешь за два года стать, а вот сеньором разработчиком крупных проектов с большой бизнес логикой уж оооочень врятли
на 56 минуты Вы сказали, что функция - примитив, верно ли?
Привет) А есть вопросы с ответами в текстовом формате?
Привет. К сожалению, нет.
Разве в filter функции при res === true надо пушить res, а не value?
Да, не пропустили ошибку.
почему в колбэке параметры можно оставлять обязательными ?
Потому что они всегда будут переданы в колбэк. А используешь ты их или нет - уже твое дело.
Тут просто нужно понимать, как работает TS. Когда у тебя есть функция, которая принимает 2 аргумента, а ты передаешь туда 3, то TS будет ругаться, так как это явная ошибка.
Но если ты ожидаешь где-то колбэк, в который будет передаваться 3 параметра, а туда передают функцию с 2-мя, то все норм. Так как 3-й тебе может быть вообще не нужен. Главное, чтобы результат функций был одинаковый.
Например в посмотри типизацию addEventListener, например, должно понятнее стать.
@@ayub_begimkulov ааа, понял, спасибо за подробный ответ!! а где удобнее всего посмотреть про то как типизирован addEventListener?
С 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[])
}
Хорошее замечание!
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 круто, просто наткнулся на видео где были соревнования по грепплингу. Смотрю что то имя знакомое) Круто, вы очень разносторонняя личность 👍
что за трек в начале?
мой видео-редактор ставил, сам не знаю)
Вполне бодрячком парень, соображалка на уровне. Не так давно видел сеньор говорил как раньше собесы были , пришел спросили типы данных и еще пара вопросов и оффер получил, а сейчас он же с 20-ти летним опытом не прошел)). Душнилы в общем .....
Раньше такого хайпа у веба не было, людей брали на добром слове, а сейчас порог вхождения низкий, а на устройство на работу высокий, в итоге 10 кругов собеса нужно пройти, чтобы тебя взяли
объясните в чем прикол писать функции мар или filter если их просто можно использовать уже готовыми?
Нет прикола - просто проверка знаний.
Почему именно map/filter? Потому что уже все знаю как они работают и не надо объяснять алгоритм.
а что в результате? мидл то или нет? какой оклад?
Это моковое собеседование было же. Я в конце говорил, что до мидла чуть не дотягивает (имхо), но можно быстро до него вырасти.
В сортировке ошибка касаемо что такое а и b. На самом деле a - это второе число, а b - это первое
Насколько я помню, там нету четкого правила.
Если 0, то оставляем как есть. Если 1 - то a должен быть после b, ну и -1 то a перед b.
@@ayub_begimkulov Да, все верно, но в функцию сравнения они передаются именно в таком, контринтуитивном порядке)
@@demiurgen13 Прикольно. Не знал про это.
Я как и сказал в видосе, всегда экспериментальным путем понимаю, как что работает.
Спасибо за фидбэк!
Наша контора сейчас активно набирает разработчиков. И к нам приходят сеньоры, которые хуже этого парня) с мидлами так вообще кошмар
АйТи пропаганда дает о себе знать 😂
Да, есть такое.
Второе название для видео - Сеньёр уничтожает ЭГО миддла с полу годовым коммерческим опытом )
С секундомером можно было бы сделать проще:
useEffect(() => {
let interval;
if (isStarted) {
interval = setInterval(() => {
setTime((prev) => prev + 10);
}, 10);
}
return () => clearInterval(interval);
}, [running]);
Делать проверку на !isStarted нет смысла, потому что по нажатию у тебя isStarted в true
ти сам у свому ж прикладі зробив цю перевірку
setInterval не рекомендуют использовать
@@inqvisitor3722 смотря для каких целей использовать. В данном случае для такого таймера - самое то, чтоб не заморачиваться.
Дело в логике работы самого интервала - он не ждёт выполнениея колбэка, и здесь могут возникать сюрпризы)
так у тебя же та же проверка, просто isStarted, вместо !isStarted. И так и так писать можно, по итогу работать будет одинаково)
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 я уже не помню, не хочу погружаться обратно в контекст этого т.к. для меня пока что, это не имеет значение
Привет, ведешь менторство? Хотел бы поучиться у тебя)
Естественно не бесплатно)
уже учишься же)
скоро дети из детсада джуниорами выходить будут. это если программисты все еще будут нужны
К сожалению, таких очень мало, большинство ждет погоды у моря, чтобы начать делать что-то полезное и развиваться.
@@ayub_begimkulovЧестно говоря, немного в шоке как мои коллеги по цеху, айтишники (читать: веб-макаки, «любители сыров по 500), любят плодить себе конкуренцию … Это только в АйТи такое есть (наверное)
Большинство программистов быстро адаптируются под разные условия, даже сейчас всё (вплоть до самих языков программирования) очень быстро меняется и развивается. Так что за программистов бояться не надо) Переживать надо за людей выполняющие обычные рутинные задачи, которых на данный момент те же программисты автоматизируют
Ну с первой задачи про айди я уже всё понял :/
Лично я в IT ровно год и позиционирую себя как миддл. Похоже, не преувеличиваю свои способности.
Я бы не смотрел на опыт, 1 год опыта может быть очень разный.
Попробуй составить резюме и пройти собесы. Так можно будет точно определить свой уровень.
стратегия так себе, тут не HR-ы сидят, перед нами писей махать не надо)) у себя в проекте ты и тех и тим лид и заказчиком можешь быть и что это будет означать? Если любишь выеbivatься, а не саму разработку, то в принципе ведешь себя соотвественно)
Ну я первую работу нашел в 17, сейчас 18, что дальше ? Я буду синьор в 19-20 ?)
не в возрасте дело браточек
@@airpodsclub6443Спасибо, кеп
@@airpodsclub6443 а в чем
Ну тебе от природы дан гениальный мозг просто
А кому то нет. Им нужны деньги на образование чтобы прокачать мозг
Это законы природы. Продолжай в том же, и ускорить эволюцию
@@andreilatosh58 не мозг, а сильная мотивация + произошло случайное во времени событие - роды. Именно это позволило парню в данный момент в 18 лет быть мидлом.
Ayub какая у тебя мотивация чтобы вести youtube канал? Ты же senior-разраб, сидел бы и лутал ЗП. Зачем на ютубе ещё работать?
Посмотрев 2 задачи, и по ответам. Я думаю что он Джун, Джун+...
Сортировка. Сейчас я говорит покажу тебе как я до этого дошёл, и херню какую то понес
Если он джун плюс тогда мой учитель стронг мидл который называет себя джуном плюс😂
У всех же понимание уровней разное)
Парень не знает замыкания, какой мидл? Если не знаешь и не понимаешь замыкания , то про реакт лучше даже вопросы не задавать. Такие разработчики потом удивляются почему переменная не так высчиталась в эффекте или в мемо.
Ну хотя от таких мидлов, я спокоен за себя )
Задачи, оторванные от реальности. На проектах дают какую-нибудь большую задачу, типа сделать огромную форму, которая в разных вкладках находится, и еще в диалоговых окнах - и вот пили это всё 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 больше придрался. Так как его понимать как раз таки очень нужно.
Если чуть поработает над ошибками, подтянет базу и наберет опыта с собесами - то можно спокойно подаваться на мидла.
А ты учти что чел на собесе, переживает и на подумать время ограниченно
Возможно в спокойной обстановке и имея под рукой гугл он бы эту задачу щёлкнул на раз два
Ужасное интервью. Автор как будто сам не понимает, что говорит -_-