Как освоить концепции интервью по программированию


Введение

Существует разница между обучением и освоением концепции. Обучение – это первоначальное усвоение информации. Вы понимаете, что это за тема и основы того, как она работает. Мастерство – это всестороннее знание концепции. Вы знаете о ней все, можете уверенно говорить, обучать других и применять концепции в новых ситуациях. Чтобы пройти собеседование по программированию в крупной технологической компании, нужно быть мастером основ информатики.

Когда я готовился к собеседованиям по программированию, я сначала следовал типичным советам (leetcode & CTCI), которые можно найти в Интернете. После того как я провалил свое первое техническое собеседование в Google, я выбрал другой подход к обучению, который привел меня к освоению основ информатики, необходимых для собеседования. После этого я абсолютно успешно прошел оба собеседования в Google и Facebook и в итоге получил предложения от обеих компаний.

Сейчас я руковожу Hackpack – сообществом инженеров, готовящихся к собеседованиям по программированию. Мне стало трудно распределять всех по категориям в зависимости от того, на каком этапе подготовки они находятся, поэтому я выделил время, чтобы разделить каждый этап. Это должно использоваться в качестве руководства при подготовке к собеседованию по программированию и инструмента для отслеживания вашего прогресса. Поймите, когда нужно двигаться дальше и где нужно уделить больше времени каждому этапу. Следование пяти этапам – нулевой, исследование, повторение, уточнение, мастерство (ZRRRM) – позволит вам эффективно отслеживать свой прогресс. Развитие мастерства – это трудный и долгий путь, но с поддержкой, уверенностью и большим количеством практики вы сможете его достичь.

Ноль:

Нулевой уровень – это когда вы абсолютно ничего не знаете о том, что собираетесь изучать. Вы только начали учиться и знаете, что вам нужно учиться, но не знаете, с чего начать. Вы не можете говорить о понятиях и смущаетесь, когда слышите, как окружающие говорят об этом. На данный момент вы не можете решить ни одной задачи по леткоду.

Исследование:

Начало изучения

Это этап сбора информации. Здесь вы пытаетесь понять, какие понятия будут рассмотрены на собеседовании по программированию. Вы читаете, смотрите видео и изучаете учебники. Вы получаете первое представление о различных структурах данных и алгоритмах, которые вам нужно будет знать. Ресурсы, которые люди используют на этом этапе, могут быть разными (algo expert, grokking the coding interview, algo monster, CTCI и т.д.), и неважно, какой из них вы используете, лишь бы он помог вам разобраться в концепциях на высоком уровне.

Я слишком упрощаю для этой статьи, но на самом деле это один из самых трудных этапов освоения концепции. Это пугает и устрашает, когда вы просматриваете всю информацию, необходимую для достижения успеха, потому что в интервью по программированию нужно усвоить довольно много. Люди часто сдаются на этом этапе из-за чувства переполненности.

Также существует большой разброс в том, как вы начинаете свое исследование. Некоторые люди сразу погружаются в руководство по проектированию алгоритмов (в зависимости от вашего стиля обучения, возможно, для этого еще слишком рано) и отключаются. Плюс этого этапа в том, что после того, как вы узнаете обо всем, что вам нужно изучить, он не становится шире. Есть определенное количество тем, которые вам нужно пройти, и все. Это начальный этап, и дальше он становится только глубже. Цель этого этапа – понять, насколько обширны темы, которые можно изучать.

Когда вы готовы перейти к повторению

К концу этого этапа вы проделали первый проход исследования и имеете представление обо всем, что вам нужно знать. Вы познакомились с Leetcode и попробовали решить несколько легких задач (& неудачно). Вы знаете, что вам нужно изучить, и у этой информации было время, чтобы пропечься.

Повторение:

Два ключевых вопроса

Пора начать погружаться глубже в эти понятия. Это медленное состояние, которое требует времени, чтобы пройти через него. Вы создаете более прочный фундамент своих знаний. В это время вы начинаете более серьезно работать над проблемами лееткода. Здесь важно подходить к решению этих задач с намерением, а не просто наобум. Начните с легких задач. Вы все равно будете ошибаться в большинстве из них (это нормально), но когда у вас появится время, задумайтесь над вопросом “Почему”.

Попробуйте задать себе эти вопросы, прежде чем смотреть на решение –

  1. Что я упустил?

    Почему я неправильно понял вопрос? Что я упустил? Сравните правильный ответ с вашей проблемой и попробуйте вслух объяснить себе, что пошло не так. Не двигайтесь дальше, пока не поймете, что именно вы сделали не так. Это самый важный вопрос, который вы можете задать себе.

  2. Каким темам посвящена эта задача?

    Убедитесь, что вы действительно понимаете, какой теме посвящена проблема. Ссылается ли эта задача на дерево? Использовал ли я связный список для решения этой задачи? Определение правильной концепции и того, почему она работает в данной ситуации, поможет вам учиться на каждой проблеме, над которой вы работаете. Это также позволит вам определять эту концепцию в будущем.

Такая практика займет больше времени, но она позволит вам учиться гораздо быстрее, чем простое решение задач на leetcode наобум. На этом этапе вы еще только учитесь. К решению задач Leetcode следует подходить с мыслью “качество превыше количества”. Вам не нужно решать 100 задач по Leetcode, если вы подходите к каждой из них с этими двумя ключевыми вопросами в голове, потому что вы целенаправленно наращиваете свои базовые знания каждый раз, когда решаете задачу. Не поймите меня неправильно, вы будете решать много задач в таком состоянии. Но когда вы будете подходить к ним с умом, они станут легче гораздо быстрее.

Инсценируйте собеседования

Начните практиковаться на имитационных собеседованиях (бесплатные ресурсы прилагаются). Вы провалите первые несколько, но они помогут вам освоиться в обстановке собеседования и начать отрабатывать некоторые мягкие навыки, необходимые для собеседования.

Более глубокие ресурсы

В это время также важно найти более глубокий ресурс, например, “Руководство по проектированию алгоритмов”. Это более глубокий ресурс, который научит вас всей математике, лежащей в основе структур данных и алгоритмов, которые понадобятся вам на собеседовании. Вы поймете, как строятся все эти структуры данных, каково время их выполнения и почему они ведут себя так, как ведут.

Чтобы овладеть концепциями информатики, вам нужно приложить усилия, используя ресурс, который не упрощает ситуацию. Это понимание “что” (что такое связный список?), “почему” (зачем нам использовать связный список?) и “как” (как мы можем творчески применять эти концепции в различных ситуациях). Вы не должны просто запомнить, что двоичный поиск равен log N, вам нужно знать, почему. Почему время выполнения O(N²) превосходит время выполнения O(N)? Если вы просто скажете “потому что оно больше”, вы не ответите на вопрос.

Когда вы готовы перейти к усовершенствованию

На этом этапе вы уже знаете все основы. Вы закончили первую половину руководства по проектированию алгоритмов. Вы хорошо справляетесь с легкими задачами leetcode, но начинаете делать серьезные успехи в средних задачах. Вы провели несколько имитационных собеседований и начинаете чувствовать себя комфортно в этом пространстве. Спросите себя “Насколько я уверен в себе на данном этапе?”. Если ваш уровень выше 6 или 7 баллов, вы готовы перейти к доработке.

Доработка:

Практика, практика, практика

Даже в начале подготовки вы всегда должны решать практические задачи. Но на этом этапе вы действительно хотите увеличить количество упражнений. Цель состоит в том, чтобы увидеть больше ситуаций, в которых применяются основы (продолжайте задавать себе два ключевых вопроса, которые мы обсуждали – “Что я упускаю? Какую тему раскрывает эта задача?”). Вы должны подталкивать себя к решению разнообразных задач, и вы должны начать выбирать задачи наугад.

Макетные интервью становятся все более важными

Продолжайте практиковаться на пробных собеседованиях. Они должны становиться все легче по мере того, как вы узнаете больше, и вы должны чувствовать себя более комфортно в обстановке собеседования. Техническое собеседование – это не просто проверка ваших навыков кодирования. Есть и мягкие навыки, которые вам необходимо развить, если вы хотите пройти собеседование. Разговор, который вы ведете с интервьюером, имеет большее значение, чем вам может показаться на первый взгляд. Вы должны быть уверены, что сможете четко объяснить свои мысли, а интервьюер сможет увидеть в вас настоящего коллегу.

Время сменить тему

На этом этапе ваша уверенность в себе будет расти все больше и больше. Вы почувствуете: “Если бы вы спросили меня о концепции, я бы уверенно рассказал о ней”. Средние задачи по Leetcode покажутся вам легкими, и вы начнете работать над решением сложных задач. Пришло время перестроить свою учебу и включить в нее больше дискуссионного обучения, чтобы проверить свою интуицию.

Не обманывайте себя

Обучение, основанное на дискуссиях, – это преподавание, имитация собеседований и беседы с другими людьми, которые помогают углубить ваши знания. Дискуссии 1-1 – это отличный способ держать себя в руках. Вы должны постоянно задавать себе вопросы “Что я упускаю?” и “Уверен ли я в каждой концепции?”. Если вы не уверены, спросите себя, почему вы не уверены.

На этом этапе очень важно обучение в форме дискуссий, потому что в конце концов вы изучаете только то, что вам известно. Есть вещи, которые вы даже не знаете, чтобы спросить себя. Как же добиться того, чтобы вы были уверены в каждом понятии? Преподавание.

Когда вы учите кого-то динамическому программированию, вы должны знать динамическое программирование как свои пять пальцев. Люди спотыкаются на множестве разных вещей, и вам нужно помочь им справиться с этим, используя фундамент и понимание, которые вы получили. Если вы не можете этого сделать, то вы не на 10/10 в этой концепции. Но самое замечательное в преподавании то, что если вам задают вопрос, на который вы не можете ответить, это помогает вам быстро найти пробелы в знаниях. Студент, которого вы учите, не был с головой погружен в динамическое программирование, как вы. Они приходят со свежим взглядом и возможностью проделать дыры в ваших знаниях.

Изучение и понимание тем – это хорошо, но найти то, чего вам не хватает на этом этапе, сложно. Преподавание поможет пролить свет на то, чего вы, возможно, не знаете.

Разговор с самим собой

Еще один способ сохранить честность на этом этапе – проговаривать все вслух. Это поможет вам осознать те вещи, которые вы прокручиваете в голове. Включая мелкие детали, которые вы принимаете как должное, но не до конца понимаете. Вы не в состоянии полностью объяснить эти детали, и поскольку вы знаете достаточно, чтобы с этим справиться, это никогда не было тем, что вы чувствовали, что вам нужно продвигать дальше. Высказывание вслух заставляет вас задуматься об этом. Вы активно выясняете, чего вы не знаете, и можете пойти учиться и практиковаться в этом. Попробуйте записать, как вы решаете вслух сложный лееткод, а затем просмотрите запись. Вы заметите, где вы замираете и где вам не хватает уверенности. Это очень неудобно делать, но помните, что именно это увидит ваш интервьюер!

Повторите цикл

Этот цикл следует повторять до тех пор, пока в конце концов вы не выработаете настолько глубокую интуицию, что не будет иметь значения, что вам подбрасывают, вы будете знать все логические ответвления каждой концепции. Или же вы знаете так много ответвлений, что если вы по какой-то причине застрянете, то легкая подсказка – это все, что вам нужно, чтобы продвинуться в правильном направлении. Вот к чему вы должны прийти на этих собеседованиях.

Когда вы будете готовы перейти к мастерству

К концу этого этапа вы должны быть способны легко и уверенно обсуждать концепции. Вы применяете концепции к проблемам, с которыми раньше не сталкивались, и можете спокойно обучать других. Вы уверенно решаете средние задачи Leetcode. Вы добиваетесь значительного прогресса в решении трудных задач.

Мастерство

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

На этом этапе, когда вы застреваете на собеседовании, вы уже не застываете, а начинаете подходить к делу творчески.

Существует метод обучения, который часто используется в медицинской сфере, названный “увидеть одного, сделать одного, научить одного”. Эта фраза произошла от метода, при котором студент-хирург наблюдает за процедурой, изучает ее, практикуется и выполняет процедуру самостоятельно, а затем учит другого студента, как проводить процедуру. Именно это вы должны делать, готовясь к собеседованиям по программированию. Изучение концепции, отработка концепции, а затем обучение концепции.

Когда я достиг этой точки в процессе подготовки к собеседованиям по программированию, я шел на собеседования в Google & Facebook с мыслью: “Я не представляю, о чем они могут спросить меня прямо сейчас, чего я еще не знаю”. В итоге я получил предложения от обеих компаний.

Заключение

Если вы хотите получить работу в Big Tech, вам необходимо овладеть основными понятиями. Простое изучение не приведет вас к финишу.

Достичь мастерства – задача не из легких. Вы можете потратить месяцы на каждый из этих этапов подготовки. Помните, что вы, по сути, пытаетесь уместить четырехлетнее образование в несколько месяцев. Это трудно, но выполнимо. Будьте добры к себе и будьте последовательны. Если я смог это сделать, то и вы сможете.

В целом, освоить концепцию гораздо легче сказать, чем сделать, и в это время мне не хватало кого-то, кто проходил через то же самое. Мне не с кем было поговорить или обсудить идеи. В итоге я обсуждала эти концепции со своей мамой (благословите ее) по мере того, как приближалась к мастерству. После ухода из Facebook я основал Hackpack – сообщество инженеров, готовящихся к собеседованиям по программированию. Мы оказываем поддержку, отчитываем друг друга и проводим имитационные собеседования, чтобы никому не пришлось осваивать эти концепции в одиночку. Вы можете подать заявку здесь & убедитесь, что вы подписаны на блог, так как я буду углубляться в каждый из этих этапов в будущих статьях.

Youtube | Twitter | LinkedIn | События

Оцените статью
Procodings.ru
Добавить комментарий