Эта статья, посвященная развитию интуиции у будущих программистов, основана на моей содержательной беседе с Маделен Флорес — выпускницей курса Codepath.

Я благодарен Маделен за дельные вопросы о процессе технического собеседования. Они помогут нам разобраться в том, как интуиция помогает совершать переход от одного этапа собеседования к другому.

1. Как понять, что учтено достаточно пограничных/тестовых случаев, чтобы перейти к написанию кода?

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

Как правило, такого мозгового штурма никто не проводит.

Например, если попадется задача со связным списком (Linked List, LL), стоит продумать случаи, когда head (первый элемент в списке) — NULL, или когда size (количество узлов) либо 1, либо 2, либо 3 и больше.

В задачах с вводом целочисленного массива рассмотрите все случаи использования: отсортированный, неотсортированный, содержащий +ve, -ve и все типы нулевых значений.

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

В общем, достаточно рассмотреть 3-4 примера, чтобы охватить все уникальные комбинации. Но этот навык приходит с практикой, так что тщательно выбирайте примеры, чтобы активизировать свое креативное мышление.

Итак, 1-й шаг в развитии интуиции — поиск примеров, необходимых для решения проблемы.

2. Как понять, что код уже «достаточно эффективен», чтобы двигаться дальше? Ведь на собеседовании невозможно проверить код на тестовых примерах

Это отличный вопрос, поскольку готовящиеся к собеседованиям обычно тренируются на таких платформах, как interviewbit и leetcode.

Здесь можно запустить тестовые примеры с написанным кодом.

При обнаружении проблем с компиляцией, неудачных тестовых примеров и т. д. принимаются соответствующие меры по исправлению ситуации.

Достижение правильного решения, принятого платформой, вызывает мгновенный всплеск дофамина! А значит, можно переходить к следующим задачам, верно?

Но как быть на собеседованиях?

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

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

Поэтому, прежде всего убедитесь, что вы обсудили с интервьюером все возможные компромиссы между временем и пространством (time/space tradeoffs). Например:

Достаточно ли надежно выглядит текущий подход/стратегия для того, чтобы приступить к реализации? Нужно ли еще подумать о какой-либо оптимизации времени или пространства?

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

Теперь вернемся к первоначальному вопросу: когда можно считать написание кода завершенным?

Обычно при решении задачи на платформе по созданию кода интуиция подсказывает нажать кнопку «Отправить» (Submit button)

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

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

3-й шаг в развитии интуиции — во время практики вы осознанно определяете момент, когда пора перейти от создания кода к его тестированию.

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

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

Можете прокрутить в голове несколько легких и банальных примеров и упомянуть их.

Скажите интервьюеру, прежде чем приступать к пробному прогону:

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

4-й шаг в развитии интуиции — после завершения работы над кодом возьмите за привычку прогонять его на наиболее подходящем примере (как это делается на собеседовании).

4. Как справиться с последующими заданиями, особенно с вопросами, на которые не знаешь ответа?

Последующие задания могут быть такими: 

  • решить предложенную задачу, но в измененном варианте;
  • дополнительно оптимизировать время или пространство;
  • преобразовать рекурсивный код в итеративный (именно это предложили Маделен).

Эта часть собеседования довольно сложная — рассмотрим два ее сценария:

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

Чтобы справиться с обоими сценариями, во время практики необходимо выделить время на размышления после решения задачи.

  1. Есть ли другие способы решения этой задачи, которые было бы проще реализовать и которые привели бы к более читабельному или понятному коду?
  1. Что, если изменить постановку задачи, например раньше массив содержал только +ve числа, а теперь содержит и +ve, и -ve числа?

5-й шаг в развитии интуиции — после решения задачи поразмышляйте и посмотрите на нее с новой точки зрения!

5. Как справиться с волнением во время технического собеседования?

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

Чтобы техническое собеседование не стало для вас стрессом, могу посоветовать только одно — сосредоточьтесь на процессе, а не на правильном решении.

Вот примерный перечень аспектов, на которые интервьюеры обращают особое внимание на собеседовании:

  1. Как вы продумываете поставленные задачи, умеете ли задавать правильные уточняющие вопросы для решения неоднозначных задач? (Это то, что вы делаете на реальной работе).
  1. Стараетесь ли убедиться в верности выбранного подхода в процессе его обсуждения, прежде чем переходить к написанию кода? Это больше относится к общению, сотрудничеству и лидерству/продаже своих идей (это называется работой в команде и согласованием с другими людьми подхода к решению).
  1. Насколько хорошо реализуете свое решение? (Речь идет о фактических навыках написания кода).
  1. Насколько тщательно тестируете свой реализованный код? (Речь идет о навыках отладки и тестирования).

Таким образом, они оценивают вас по нескольким факторам. Не беспокойтесь о том, чтобы решение было на 100% правильным, просто следуйте процессу!

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

Удачи на собеседованиях!

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Sahil Bansal: Cracking the Coding Interview: Intuition Bulding

Предыдущая статьяСоздание клона Google Maps с открытым исходным кодом. Часть 1
Следующая статьяЧистая реализация структуры проекта на Go