Друзья, как правильно заметили, пропустил пару ошибок: - Типизация map - колбэк не должен возвращать `T`, а совсем другой дженерик. - filter не должен пушить `res`, а `value`.
Можешь объяснить, почему ты сказал, что в коллбэке map все параметры обязательны? Ведь я могу прокидывать туда коллбэки, которые не то, что индекс не используют, но даже сам elem
P.S Я с такими ответами на сеньора проходил, а тут миддла не дали, я протестую! 😂 Не забывайте, hard скиллы лишь часть из того, что учитывается на собеседовании, можно взять хитростью(вычеркнуто) - софт скиллами, амбициями и просто по-человечески понравится, ведь чем выше позиция - тем меньше кода и тем больше созвонов 😂
@@МурадМавлидов синеры занимаются кодом еще больше чем все остальные просто они пишут код за 10 минут который Джуны за три часа делают и этот код Джунов в два раза длиннее кодов синеров
Формат неплохой, я так понимаю всё было поставлено на решение задачек и дискуссию об устройстве языка. Советую тебе добавить блок об опыте работы, по моему мнению это гораздо важнее чем, например, знания map, filter и reduce. Может эта часть и хромала, но на работе ты быстро загуглишь про эти методы и за 10 минут поймешь, а вот различные нюансы разработки, частые юзкейсы ты за 10 минут не загуглишь. Также совет другим людям - не пугайтесь задачек и не думайте, что спрашивать будут только это, у всех разные подходы к собеседованиям, у меня например было собеседование в формате диалога с тимлидом, обсуждали решенные задачи, технологии и процесс разработки. А кто-то вас пошлёт на литкод и попросит объяснить внутреннее устройство браузера. Также забудьте о грейдах и фразах "мидлом тут не пахнет", в реальности так не работает, грейды от компании к компании разные, где-то их вообще нет, не советую добавлять эти приставки себе в резюме или на собеседовании. Единственный способ определить свой уровень - сделать резюме, понять вилку зп и пройти собеседование, а дальше можете себе называть кем угодно :) Хоть мидлом, хоть синьором
У человека без опыта работы, каким подразумевается джун, спрашивать об опыте работы - как бы не логично. У меня складывается впечатление, что айтишники пребывают в истерике от снижения уровня входа в профессию из-за курсов, увеличения конкуренции.
@@foryoutubeandothers трактовка джуна очень условная, а если я полгода-год отработал я уже кем-то другим должен считаться? Везде по-разному) Тем более конкретно в этом видео у человека полгода в компании и полгода на фрилансе
«Я думал ты так и сделаешь» ты же проводишь собеседование, покажи ему как можно было сделать и все. А эти комментарии, какую то токсичность вызывают. Задание можно выполнять разными способами - он выбрал этот
Если учитывать что это упор был на то что это мидл, то лол, всё правильно он сказал. Учитывая что он изначально делал замыкание, а потом просто не допёр как его использовать до конца, то блин. В итоге это выглядит как чел, который вообще не разбирается в механизме замыкания. На моё субъективное мнение это джун с опытом и даже не стронг джун.
про токсичность тоже чувствуется. Если бы это братаны тестировали свои навыки, то гуд, а если это имитация собеса, тогда оценку можно и собеседующему дать. Вообще это слабая фраза - "я думал ты сделаешь так")), просто предлагаемые решения были хуже вылизанных и подготовленных.
особенно поднимает дух "ну ты типа джуниор плюс" POV я который 6 лет долбит реакт, 2 года пишет коммерческие и не мог бы решить ни одного вопроса без консоли чата гпт гугла и пару часов времени на каждую.
по ответам очень видно молодого джуниора и взрослого ) собеседующий тут прям как родитель и отец,оценивает , давай я помогу , а молодой такой я знаю , я знаю и хочет сказать вперед )))) очень интереесно со стороны психологии наблюдать такие видео, спасибо, что выкладываете
Приятно смотреть и слушать собесы, еще могу подкинуть идею тебе для видео, сделать собес на позицию джуна без опыта комерческого какого-нибудь. Допустим какой-нибудь человек который сам отучился, либо закончил курсы какие-либо и находится в поисках своей первой работы, очень сложно в таком случае вообще попасть на собес бывает. И вот ты можешь дать такой шанс пройти первый собес человеку, оценить его знания после прохождения курсов, либо самообучения, дать ему советы какие-нибудь, как вообще искать первую работу и т.д. и т.п.
Просмотрел до 8:54 и что-то интервьюер растекается и плывет. Парень, если не можешь четко и обоснованно изложить мысль, делая замечание, то лучше промолчать, все же. А то переписал тот же sort, сделал все то же самое, что и парнишка, но с такой академической претензией и гонором, что дышать нечем.
На самом деле смешно, как люди могут видеть очень разные вещи в одном ролике). Я хотел объяснить, как я обычно вспоминаю формат колбэка, передаваемого в sort, на примере. Постараюсь в дальнейшем локаничнее выражаться.
Я понял только одно, что про перерисовки - ничего не знаю! У тебя конечно Крутая экспертиза! Виден скилл с первых слов…. Братан, можешь сделать об этом подробное видео? Как дебажить такие вещи, как работать с плагином(react dev tools)в Гугл хром… Как решать все самые частые проблемы с перерисовками и ререндарами
15:30 я думал вы напишите что то типа этого: Array.prototype.mymap = function (callback) { return this.reduce((resultArr, currentElement, index) => { resultArr.push(callback(currentElement, index, this)); return resultArr; }, []); };
Привет. Не мог бы ты раскрыть мысль? Что тебя так сильно удивило? Как и было сказано на видео, я сам всегда вспоминаю принцы работы sort экспериментальным путем.
Вполне бодрячком парень, соображалка на уровне. Не так давно видел сеньор говорил как раньше собесы были , пришел спросили типы данных и еще пара вопросов и оффер получил, а сейчас он же с 20-ти летним опытом не прошел)). Душнилы в общем .....
Раньше такого хайпа у веба не было, людей брали на добром слове, а сейчас порог вхождения низкий, а на устройство на работу высокий, в итоге 10 кругов собеса нужно пройти, чтобы тебя взяли
Привет, отличное видео! Подскажи, разве на 1:01:30 есть ререндер компонента Button, на сколько я вижу там только первичный рендер. Или я чего-то не понял?
Да, потому что App не ререндерится, там пример чуток не так построен. Зачастую ставят каунтер в Апп , а инкремент функцию вниз прокидивают в таких примерах
Спасибо за интервью! В promiseAll есть почти незаметная ошибка. Если в оригинальный Promise.all придет что-то не-thenable (например, просто едиинчка: Promise.all([1])), то он обернет это значение в промис и сразу зарезолвит. В нашем решении же будет ошибка "promise.then is not a function". Это поправится, если на строке 77 вместо promises[i] написать Promise.resolve(promises[i])
55:41 - тут парню чутка совсем не повезло. Если бы он не добавил условие if(!isStarted), то у него бы работало. Дело в том что во время cleanup, isStarted = true потому что шел таймер. isStarted станет false только на следующем рендере, а как Аюб ранее говорил: "useEffect срабатывает перед обновлением компонента, при смене массива зависимостей". Поэтому если убрать то условие, про которое я выше написал, всё заработает.
Самому 18 лет, 2 года опыта, сейчас работаю на позиции middle frontend разработчик и хотят попробовать меня на позиции senior. В принципе сам давно алгоритмы не решал, но задачи показались не сложными, парень молодец, показал не плохо, но можно было лучше. С map, filter, сам задачи на собеседовании сам даю :) Есть вопрос к типизации map. Разве мы не должны создать ещё один дженерик помимо T? Ведь cb не обязательно возвращает тот же тип.
@@antohnyt2067 не думай о всякой xeрне и просто упорно прокачивай навыки. Если прям слишком долго не можешь найти, возможно у тебя пет-проекты не оч сложные, резюме так себе изложено, мало откликов в день оставляешь (у меня это было 100-200 штук за вечер) или ты просто ещё сыроват и мало знаешь. Новичкам сложнее всего сейчас найти, нужно целый ряд технологий знать.
@@antohnyt2067 Рисуй опыт в резюме и все, знакомый 2 года учил swift, потом начал делать отклики, на джуна нигде не брали, нарисовал опыт, прошел собес на миддла спрашивали вообще базу самую, больше про опыт прошлый, он нормально ответил , спокойно работает за 190к мидлом.
@@inqvisitor3722 Сеньор это уже больше про опыт. Вызубрить ты можешь много всего, но грамотно все применять нужен опыт. Сеньор верстальщик ты можешь за два года стать, а вот сеньором разработчиком крупных проектов с большой бизнес логикой уж оооочень врятли
Я бы еще добавил условие для задачи с 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, []); // очищаем таймер, если компонент демонтируется
Потому что они всегда будут переданы в колбэк. А используешь ты их или нет - уже твое дело. Тут просто нужно понимать, как работает TS. Когда у тебя есть функция, которая принимает 2 аргумента, а ты передаешь туда 3, то TS будет ругаться, так как это явная ошибка. Но если ты ожидаешь где-то колбэк, в который будет передаваться 3 параметра, а туда передают функцию с 2-мя, то все норм. Так как 3-й тебе может быть вообще не нужен. Главное, чтобы результат функций был одинаковый. Например в посмотри типизацию addEventListener, например, должно понятнее стать.
@@ayub_begimkulovЧестно говоря, немного в шоке как мои коллеги по цеху, айтишники (читать: веб-макаки, «любители сыров по 500), любят плодить себе конкуренцию … Это только в АйТи такое есть (наверное)
Большинство программистов быстро адаптируются под разные условия, даже сейчас всё (вплоть до самих языков программирования) очень быстро меняется и развивается. Так что за программистов бояться не надо) Переживать надо за людей выполняющие обычные рутинные задачи, которых на данный момент те же программисты автоматизируют
С секундомером можно было бы сделать проще: useEffect(() => { let interval; if (isStarted) { interval = setInterval(() => { setTime((prev) => prev + 10); }, 10); } return () => clearInterval(interval); }, [running]); Делать проверку на !isStarted нет смысла, потому что по нажатию у тебя isStarted в true
@@inqvisitor3722 смотря для каких целей использовать. В данном случае для такого таймера - самое то, чтоб не заморачиваться. Дело в логике работы самого интервала - он не ждёт выполнениея колбэка, и здесь могут возникать сюрпризы)
Потому что индекс туда передается всегда. Ты можешь его не использовать - но это уже твое дело. Индекс в колбэк должен всегда передаваться. Иначе если человек его вдруг решит заюзать - вылетит ошибка.
@@ayub_begimkulov круто, просто наткнулся на видео где были соревнования по грепплингу. Смотрю что то имя знакомое) Круто, вы очень разносторонняя личность 👍
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у меня такое же мнение сложилось во время просмотра. Но я не перепроверял. А по последней задаче нет вопросов? Я не понял смысла компонента, ведь если придёт новая функция, то новый слушатель не создастся.
Парень не знает замыкания, какой мидл? Если не знаешь и не понимаешь замыкания , то про реакт лучше даже вопросы не задавать. Такие разработчики потом удивляются почему переменная не так высчиталась в эффекте или в мемо. Ну хотя от таких мидлов, я спокоен за себя )
Ну тебе от природы дан гениальный мозг просто А кому то нет. Им нужны деньги на образование чтобы прокачать мозг Это законы природы. Продолжай в том же, и ускорить эволюцию
@@andreilatosh58 не мозг, а сильная мотивация + произошло случайное во времени событие - роды. Именно это позволило парню в данный момент в 18 лет быть мидлом.
Я бы не смотрел на опыт, 1 год опыта может быть очень разный. Попробуй составить резюме и пройти собесы. Так можно будет точно определить свой уровень.
стратегия так себе, тут не HR-ы сидят, перед нами писей махать не надо)) у себя в проекте ты и тех и тим лид и заказчиком можешь быть и что это будет означать? Если любишь выеbivatься, а не саму разработку, то в принципе ведешь себя соотвественно)
Задачи, оторванные от реальности. На проектах дают какую-нибудь большую задачу, типа сделать огромную форму, которая в разных вкладках находится, и еще в диалоговых окнах - и вот пили это всё 2 дня в ограниченные сроки. На первый план там совсем другие проблемы приходят. Никто не будет над каждой мелкой функцией париться и следить, чтобы она не перерендеривалась. Работает - да и ладно. Было бы полезнее рассказывать о том, как писать код, чтобы максимально снизить вероятность ошибок. Собеседование крайне душное, а парня жалко))
На проектах, тебе через 2 месяца дают добавить в эту форму одно поле и 2 часа. А ты мучаешься 2 недели, потому что не парился над каждой мелкой функцией
@@mtb-love-belarus так и есть Даже дело не в функции, а в правильно сформулированном алгоритме, логике короче Если заранее максимально все не придумал, то потом придется все переписывать из-за маленькой мелочи, которую нужно добавить и которая рушит всю работу твоего кода
Пи**ц, во что 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 ну ты явно больше меня понимаешь ) хотя я вот сам что касается рендера в реакте и жизненных циклов не особо, там много подводных камней
Щас бы по паре ответов, определять мидл или джун))) поздравляю у вас мидл-головного мозга. Я честно не понимаю, почему Ру-комьюнити, так любит сложности\пытки и унижения??? - Даешь человеку пулл задач, даешь фиксированное время. Смотришь результат. Сделал\Работает\Чисто? Эти все ваши "Мидл, Хуидл и прочее" это в голове!!! Есть программист который выполняет задачи, а есть который не выполняет
Я бы не был так жесток, у человека нету опыта прохождения собесов. С id, кажется, он не совсем понял условие. sort - я сам тоже затупил там) Тут я бы скорее к базе React больше придрался. Так как его понимать как раз таки очень нужно. Если чуть поработает над ошибками, подтянет базу и наберет опыта с собесами - то можно спокойно подаваться на мидла.
А ты учти что чел на собесе, переживает и на подумать время ограниченно Возможно в спокойной обстановке и имея под рукой гугл он бы эту задачу щёлкнул на раз два