На этом этапе своей карьеры я брал интервью у сотен кандидатов и видел большое разнообразие в том, как люди делают вещи. Одно из самых больших препятствий, с которым сталкиваются люди, заключается в том, что во время интервью вы пытаетесь как можно быстрее выработать качественное, читаемое решение проблемы кодирования. Вы не пытаетесь создать надежное решение, которое будет противостоять многим факторам с течением времени, или поддерживать внедрение зависимостей, или многие другие проблемы, с которыми приходится иметь дело производственному коду.
Многие люди, которых я интервьюирую, пытаются использовать C++ или Java для вопросов интервью, часто потому, что они действительно не знают никакого другого языка. Проблема в том, что языки страдают от того, что очень важно во время интервью: многословия. Многословие не всегда плохо в программировании, оно часто может сделать код более ясным и легким для понимания, а также облегчает инструментам статического анализа проверку правильности кода и отсутствие в нем каких-либо странных причуд. Однако когда вы пишете на доске и ваш основной доступный ресурс-это время (и пространство доски), вы захотите использовать язык, который гораздо более оптимален для этого случая использования.
Python идеально подходит для этого, и я продемонстрирую это на простом примере. Многие вопросы интервью включают в себя построение какой – то структуры данных, поэтому многие люди пишут какой-то класс/структуру-в этом примере мы будем использовать узел в двоичном дереве поиска. Я видел, как многие люди тратят кучу времени, делая что-то подобное:
public class Node{ T data; String key; public Node(T data, String key) { this.data = data; this.key = key; } // Sometimes they even write out getters and setters. }
Это груз кода, который не делает очень много. Им требуется несколько минут, чтобы записать все это, то есть несколько минут, когда они не решают реальную проблему, которую я попросил их решить. Сравните его с Python:
Node = namedtuple("Node", "data key")
Это намного короче! Теперь это немного надуманный пример, так как в интервью вы можете просто сказать: “Представьте, что есть класс под названием Node, который имеет эти два поля”, на самом деле не записывая класс, но время от времени вы можете получить сторонника, который хочет видеть все.
Я приведу еще один пример на случай, если вы найдете кого-то вроде меня, кому не очень важно, что вы знаете, как написать базовый класс. Часто в каком-то алгоритме у вас есть контейнер вещей, и вам нужно отфильтровать этот контейнер и выполнить некоторое преобразование данных. На Яве:
ContainernewThings = new Container<>(); for (Type thing : things) { if (someCriteria(thing)) { newThings.add(someTransformation(thing)); } }
против Python:
newThings = [someTransformation(thing) for thing in things if someCriteria(thing)]
Это намного короче, и течет намного лучше, когда вы пишете и говорите одновременно. Он также работает, когда вы хотите использовать понимание диктанта или 2D-массив.
Есть много других небольших настроек выразительности, подобных этим, которые в общей сложности дают довольно большую экономию времени, когда вы пишете свой алгоритм на доске.
А как насчет других динамических языков? Я видел, как многие люди используют Javascript, особенно те, которые выходят из буткемпов кодирования. Это не слишком плохой язык для использования, но когда вы решаете алгоритмические задачи, я нахожу, что встроенные в Python (особенно наборы) просто немного лучше и с ними легче работать, чем в JS.
Еще один язык, который является фантастическим для интервью,-это Ruby, однако я заметил, что Ruby находится в упадке в течение последних нескольких лет, когда Python активно используется в таких интересных областях, как машинное обучение и наука о данных. Как бы я ни любил Ruby, если вы собираетесь потратить время на изучение языка, то я бы сказал, что Python откроет для вас больше дверей. Конечно, есть несколько исключений, Ruby все еще довольно силен в devops с такими вещами, как Chef, или в infosec с такими вещами, как Metasploit, однако я не уверен, что они также выдержат испытание временем. Devops уже сокращается из-за перехода на контейнерные системы, такие как Docker и Kubernetes, которые в основном находятся в файлах Go и config.
Наконец, существует множество очень выразительных языков, таких как Lisp или Haskell, которые языковые гики любят поднимать в подобных дискуссиях. Я еще не видел, чтобы кто-то использовал что-то эзотерическое, как это, в интервью, но ваш риск заключается в том, что ваш интервьюер не знает этого языка и поэтому не уверен на 100%, действительно ли ваш код верен. Поскольку Python очень удобочитаем и является ООП/императивом, почти все интервьюеры смогут следить за тем, что вы делаете, даже если они не очень хорошо разбираются в Python.
Кроме того, недостатком Python является то, что с его помощью очень легко писать алгоритмы квадратичного времени для линейных задач. Как оказалось, многие другие языки также страдают от этой проблемы (включая даже Java). Я опубликую более подробную информацию об этом в более позднем посте и о том, как вы могли бы обойти это, изучив другой способ алгоритмического мышления.