Учимся решать задачи на технических собеседованиях

0
1985
views

Перевод статьи «How to Practice for Technical Interview Questions».

«У вас есть монеты разных достоинств. Также вы знаете общую сумму денег. Напишите функцию для вычисления наименьшего количества монет, необходимого, чтобы составить эту сумму».

Какой код нужно написать для решения этой задачи? С чего бы вы вообще начали? Google, Amazon и все крупные компании, занимающиеся разработкой программного обеспечения, используют подобные задачи на программирование при найме новых сотрудников.

Если вы не знаете ответ, ничего страшного. Я до сих пор его не знаю, как и 63% всех программистов, которые брались за эту задачу (по данным Leetcode). Чтобы занять позицию разработчика, вам нужно знать, как в принципе решаются такие задачи, а также иметь навыки, чтобы решить ту задачу, которую вам предложат на техническом собеседовании.

Шесть месяцев назад я устроился на свою первую работу в качестве full-stack веб-разработчика в компании из списка Fortune-5. В процессе подготовки к собеседованиям я познакомился со множеством задач и потратил бесчисленные часы на их решение. В этой статье я изложил пять советов, которые сформулировал на основе собственного опыта. Эти подходы помогут вам более успешно решать задачи на программирование на техническом собеседовании.

1. Используйте таймер или секундомер

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

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

Когда я начинал решать задачи на программирование, я тратил от 45 минут до часа на каждую и «проваливал» почти все. Теперь на каждую задачу я трачу не больше 20 минут и решаю 50–75% в зависимости от сложности. Но забудьте обо мне: подумайте о собственном таймере и установите его так, как вам удобно. Со временем вы обнаружите, что начали решать задачи на несколько минут быстрее запланированного.

2. Ежедневно ставьте для себя какие-то цели

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

«Сложные проценты — восьмое чудо света. Тот, кто в них разбирается, получает их, а кто не разбирается — платит», — Альберт Эйнштейн.

Здесь Эйнштейн имел в виду известное свойство денег притягиваться к деньгам. Но если вы со временем примените ту же идею к своему росту знаний, вас будет просто не остановить.

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

Еще один полезный совет: ставьте перед собой небольшое количество легко достижимых целей. Мотивация — ключ к успеху, а у вас гораздо больше шансов решить три задачи Leetcode, если вы планировали решить две, чем если нацеливались на 30.

3. Придерживайтесь определенной системы

Когда я решал ежедневные задачи на программирование, я по каждой писал заметки. При следующем поиске работы моей целью будет заполнить еще одну записную книжку. Я делюсь этим с вами по двум причинам. Во-первых, потому что на своих курсах научился очень простой системе ведения заметок, которая называется «UPER»:

  • Understand (понять)
  • Plan (спланировать)
  • Execute (выполнить)
  • Review (проверить)

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

Например, данные какого типа будет получать ваша функция? Что будет на выходе — строка или, может быть, число с плавающей запятой? Вся ли важная информация у вас есть?

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

Вторая причина, по которой я делюсь с вами всем этим, заключается в моей искренней убежденности, что задачи на программирование — один из лучших способов улучшить ваши навыки. Да, они отнимают много времени, и нет, вы не должны быть такими одержимыми, как я, но ежедневные упражнения позволят вам подняться на новый уровень. Вы многое узнаете о своем языке программирования и нарастите «аналитические мускулы». А когда придет время ежедневно писать код на работе, эти мускулы вам очень пригодятся.

4. Делайте перерывы

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

5. Учитесь у других

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

Как же отфильтровать лишнее в таких объемах новой информации?

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

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

Чтение чужих решений укладывается в пункт «проверка» системы UPER. Обращайте внимание, как пишут код другие люди, и вы удивитесь, как много нового узнаете о своей работе.

Итоги

У меня все эти приемы отлично работают, и я надеюсь, что вам они тоже пригодятся! При составлении этой статьи огромным источником вдохновения для меня послужили видео Кевина Нотона-младшего и Ника Уайта.

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