Игорь Савчук - Отъявленный программист: лайфхакинг из первых рук
Это достаточно простой вопрос, хотя бы потому, что у него есть правильный ответ и в нашей стране урок физики еще пока обязателен. Но есть класс вопросов, однозначного ответа у которых изначально нет, вот примеры из этой серии:
• Вот вам бумага и ручка, разработайте подробный план эвакуации Сан-Франциско.
• Сколько примерно воды в океанах?
• Предложите принципиальную конструкцию часов для слепых.
• Сколько мячиков для гольфа может поместиться в стандартном детском автобусе?
• Оцените примерное количество настройщиков пианино во всем мире.
А теперь самые ходовые вопросы, построенные на смеси темы-специализации и некоего дополнительного неожиданного условия (вот распространенные примеры на тему программирования и не только):
• Очень сложно удержать в голове что-то, о чем вы читали много лет назад. Как вы боретесь с этим?
• Какая у вас система систематизации знаний?
• Какое самое красивое решение из всех, что вы видели? (Вариант: самый красивый фрагмент кода и т. д.). Давайте обсудим то, что вас поразило в нем больше всего.
• Представьте себе страну, где очень почетно иметь мальчика в семье. Поэтому родители рожают детей ровно до тех пор, пока не родится первый мальчик. Каково гендерное соотношение детей в такой стране?
• Объясните вашу методику тестирования для элеватора (распространенные варианты: для карандаша, полосы прокрутки (scroll bar) и т. д.).
• Используя пару из трехминутных и семиминутных песочных часов, нужно отмерить интервал точно в 9 минут, расскажите как это сделать. (В моем случае был похожий вопрос, который мне запомнился: есть готовая функция, генерирующая случайные числа в диапазоне от 1 до 5, требуется написать, используя лишь ее, новый генератор для диапазона 1–7).
На самом деле, зная ответы на эти вопросы, нельзя не признать их простоту, нужно просто иметь немного фантазии, чтобы посмотреть на эту задачу с нестандартной точки зрения. От себя добавлю, что в моем случае количество подобных загадок в реальном собеседовании в Google не превышало 10 % от общего количества заданных вопросов, основная масса которых в последнее время носит более технический характер, непосредственно связанный с рассматриваемой вакансией. В чем вывод этого важного пункта? Просто я призываю не огорчаться из-за того, что ваши нереально глубокие познания в какой-то одной-двух предметных областях не всегда будут иметь решающее значение для Google, а просто заранее знать и использовать эту стратегию отбора — учитесь учиться вообще, а также гибко и быстро приспосабливаться к любой новой проблематике, которую может подкинуть жизнь. Воспринимайте такие интервью как хорошую возможность для тренинга вашего адаптивного потенциала.
Я хочу продолжить обсуждение темы поведенческой психологии, которую вы тщательно прорабатываете со своими программистами курсантами. Для примера возьмем урок «О пользе последовательной аргументации». Очень многие заметили специфику интервью в Google: почти на каждое сильное утверждение с вашей стороны ведущий наверняка потребует объяснений (можно также назвать это словом «обоснование»). Это особенно касается сферы собственных вкусов при выборе инструментов и технологий. Если, скажем, вы заявляете, что программируете только на PHP (или только на любом другом языке) и вообще любите этот язык до глубины души, сразу приготовьтесь к тому, что с вас потребуют аргументации.Как говорит главный рекрутер Google Брайан Пауэр: «Мотивация должна быть раскрыта в полной мере, это одна из главных задач собеседующего». Конечно, рефлексивные и уклончивые ответы на подобные вопросы, столь типичные для форумов и повседневного общения («он мне просто нравится и все», «большинство пишет на нем» или «да просто так исторически сложилось»), не станут бриллиантом вашей аргументации. При подобном легкомысленном объяснении выбора своего главного инструмента разработки вы рискуете получить «red flag» — отрицательную оценку интервьюера. Для наглядности приведу более конкретный пример подобного диалога из опыта собственного собеседования. Когда я рассказывал в Google про свои навыки и упомянул принципы SOLID, которые хорошо знаю и активно применяю, тут же получил встречный вопрос: «Почему именно SOLID, а не почти аналогичный GRASP? Каковы аргументы выбора в пользу SOLID?» Это, конечно, интересный вопрос, потому что все, что касается наших спонтанных предпочтений, не всегда поддается ясному и четкому объяснению и вербализации, тем более опасно, когда подобные провокационные вопросы подкидывают вам неожиданно и в исключительно ответственный момент. Второй личный момент, за который меня основательно зацепили: «В вашем резюме написано, что вы большой любитель FreeBSD, давайте обсудим этот вопрос, почему именно FreeBSD, а, скажем, не Ubuntu?» Подобно тому, как в боксе часто используется клинч в качестве уловки, чтобы выиграть время, если участник состязания не держит удар, в подобных «аварийных ситуациях» также возникает соблазн отмахнуться голословным, поверхностным, односложным или просто банальным ответом с улыбкой, жаждущей снисхождения (применительно к предыдущему вопросу — репликой на уровне «FreeBSD мне нравится просто потому, что в ней есть система портов»). Иначе говоря, заранее внимательно проинвентаризируйте все свои предпочтения, все косвенные утверждения, из них следующие, а также ваши навыки, перечисленные в резюме, — везде должны быть выявлены слабые и сильные стороны, хорошо аргументированы и вербализированы причины (хотя бы для себя самого) их выбора и использования. И если говорить более прямо, заранее приготовьтесь к неизбежным жестким встречным вопросам для любой «самой лучшей» технологии программирования. Давайте для наглядности приведем более конкретный пример. Предположим, я знаю, что вы как приверженец PHP указали этот язык в своем резюме в качестве основного. Что конкретно спрашивали вас по этому языку на собеседовании? Сначала были достаточно глобальные и обзорные вопросы с легким оттенком провокационности, например:
• Почему вы выбрали язык, реализация которого не поддерживает многопоточность?
• Почему в мире PHP нет событийно-ориентированных фреймворков?
• До какой степени PHP 5 действительно поддерживает ООП?
После чего постепенно следует переход в более узкоспецифичную плоскость, и я бы даже сказал, что порой вопросы носят провокационный или откровенно шутливый характер, вот примеры:
• Что значит «Variable variables» в мире PHP?
• Знаете ли вы иврит?
• Что значат периодические сообщения PHP об ошибке T_PAAMAYIM_NEKUDOTAYIM?
• Расскажите нам побольше про PHP, например про переменные и функции, которые здесь могут существовать в двух отдельных пространствах имен.
• Если я правильно понимаю, вы можете использовать как функцию fix(), так и переменную $fix. Пожалуйста, поясните, в чем преимущества такого подхода PHP?
• Является ли PHP действительно безопасным в отношении типов? (После утвердительного ответа возникло ощущение попадания в заготовленную ловушку и последовала ритмичная серия добивающих вопросов.) Проверяли ли вы это лично на практике? Расскажите нам про это поподробней, пожалуйста.
Следующие вопросы по PHP задавались в 2013 году, некоторые из них неактуальны по состоянию языка на текущий год.
• Поддерживает ли PHP стандартный тип integers, больший, чем 32 бита?
• Есть ли в PHP тип unsigned integers?
• Как в PHP можно получить «тело» http-запроса, отличного от типа POST? Например, сделайте это нативными для PHP средствами для запросов, выполненных методом PUT.
• Поддерживает ли PHP методику duck typing? (Кстати говоря, наверное, в связи с популярностью Python в Google я заметил повышенное внимание к вопросам, связанным с латентной типизацией, я получил несколько вопросов от разных людей именно на эту тему.)
• Пожалуйста, как специалист по PHP попробуйте переписать следующий типичный фрагмент PHP-кода, взятый нами для примера из популярного блогерского движка WordPress, чтобы PHP, SQL и HTML не были перемешаны все вместе.
<?php
$result = mysql_query("select * from test_table");
echo "
<ol>";
while ( $row=mysql_fetch_assoc($test_result) )
echo "<li>{$row[test_row]}</li>";
echo "</ol>
";?>
Таких вопросов может быть много — от менее болезненных до более провокационных, в зависимости от компетенции и темперамента конкретного ведущего интервью. В чем главная суть подобных эскалаций в интервью? Никто на вас не давит и не язвит над вашими персональными вкусами, отношение всегда уважительное и терпеливое (я не заметил, чтобы хоть раз кто-то перебил или остановил мои объяснения, даже когда я явно отклонялся от темы). Здесь важно просто уметь отстаивать свою точку зрения и самому не делать взаимоисключающих утверждений. Иначе говоря, никто не против того, чтобы программировать именно на PHP, важно просто суметь объяснить, что это ваша сознательная позиция, что так делать действительно лучше и эффективнее. Ваш сознательный выбор и аргументированные предпочтения даже в мелочах, таким образом, подчеркивают ваш профессионализм и выдают опыт. Обратите внимание: ответы на приведенные провокационные вопросы потенциально могут тянуть за собой бороду интересных работодателю следствий насчет вас как специалиста и человека вообще, ваших личных взглядов на жизнь, индивидуальных человеческих особенностей и предпочтений, выходящих далеко за пределы лишь одной профессиональной сферы. Получается, что, находясь на таком собеседовании, вы словно подопытная мышь, которую буквально под микроскопом внимательно изучают Люди в Белых Халатах. Инициатива не принадлежит вам, вы лишь безвольный игрок в чужой программе? Я бы не был столь категоричным, отчасти это ваш собственный личностный выбор, который выходит далеко за рамки лишь интервью и трудоустройства в Google. Если вы посмотрите вокруг себя, то в равной степени увидите в жизни как обреченных и покорных людей на коротком поводке контракта, так и успешных и независимых создателей собственного дела и новых рисковых стартапов, и все это в рамках одной и той же среды. Что касается моих курсов, я часто отрабатываю со своими студентами домашние заготовки в стиле «удиви меня» для органичного переключения контекста разговора и перехвата роли ведущего. Этот прием позволяет проявить вам свои самые сильные стороны, ведь, как хорошо известно, самая лучшая импровизация — заранее заготовленная импровизация. И эта одна из моих любимых игр на площадке собеседований Google. Снова приведу типичный набор ситуаций из личного собеседования, чтобы проиллюстрировать, что я имею в виду. Двигаясь по темам в резюме, которыми я занимался, мы довольно монотонно и поверхностно прошли по ООП и различным паттернам программирования, пока не дошли до моего любимого аспектноориентированного программирования (АОП). Здесь сразу стало очевидно, что настрой ведущего и его коллег поменялся, он попросил рассказывать все максимально подробно, потому что «это интересная тема». Отвечая на многочисленные встречные вопросы насчет причин моего интереса к функциональному программированию, АОП и событийно-ориентированному программированию (СОП), нас постепенно вынесло на другую логичную тему — недостатки методологии объектно-ориентированного программирования как таковой, которая в наше время стала своего рода безальтернативным мейнстримом в индустрии программной разработки. Я прошелся по калейдоскопу из мнений ряда крупных фигур в мире программирования, в частности перечислил аргументы хорошо известных ярых противников ООП: Дейкстры, Ричарда Столлмана и Никлауса Вирта, по памяти процитировал причины разочарования в объектах Степанова (создателя STL) и общей проблематике рефакторинга как неизбежного диалектического следствия любой разработки, центрированной на ООП-стиле. Также рассказал про интересную критику ООП от Джоэля Спольского, о его похождениях в Microsoft и тамошних «архитектурных астронавтах», замучивших навязыванием этой методологии другим. Просто в качестве любопытного наблюдения: тема «порочных практик» Microsoft вызвала дополнительное оживление у гуглеров, и мы остановились на этом отдельно. В ходе обсуждения я поделился мнением своего хорошего знакомого о том, как своеобразно соблюдаются «coding guidelines» в Microsoft, где некоторые методы могут содержать тело из кода в сотню экранов, а сам файл с их исходником — весить больше мегабайта. Я так подробно остановился на этом моменте лишь для того, чтобы показать простую, но важную стратегию: гораздо выгоднее, когда вы рассказываете что-то интересное сами, и то, что заведомо хорошо знаете, чем, затаившись, ждете очередного вопроса с подковыркой из длинной очереди заданий, которые выдает команда из нескольких интервьюеров по очереди. Суметь удачно переключить контекст собеседования на этот благоприятный для себя проактивный режим — ключевой момент, как мне видится, для наиболее комфортного из всех способов прохождения подобных интервью. Фактически в моем случае это было больше похоже не на стандартное стресс-тестирование собеседника, где я выступал в качестве ведомого и испытуемого, а на приятную дискуссию знакомых, у которых вспыхнула интересная для обоих полемика. Считаю, что из всей серии собеседований это был один из моих самых удачных дней, и чтобы передать общий позитивный фон, на котором мы расстались в тот день, приведу последние слова ведущего: Господи, услышь нас, — комично вскинул он руки вверх с немой мольбой, застывшей во взгляде, устремленном в небо, — о, если бы наш менеджер проекта думал так же, как думаете вы, и чтобы у нас всегда был выбор в плане удобной нам методологии. Под общий смех мы завершили это эмоционально-насыщенное интервью. Как я уже отмечал и как признался один известный актер: «Самая лучшая импровизация — это заранее подготовленная импровизация». Отнеситесь к этому банальному утверждению серьезно, и вы сможете удивить в хорошем смысле не только своего потенциального работодателя, но и самого себя, относительно легко создав нужную и контролируемую атмосферу на важном для вас собеседовании. Используйте для этого свое резюме в качестве своего рода программы из тщательно проработанных заготовок и глубоко закинутых якорей, так вы оставляете себе большие шансы перехватывать инициативу в интервью каждый раз, когда предсказуемый вопрос интервьюера заставляет сработать очередной триггер заготовленной вами ранее интересной темы. Позвольте же рекрутерам найти «эти пасхальные яйца» в вашем резюме, умоляю, просто дайте им шанс — это доставит удовольствием не только им, но и вам самим, когда собеседование будет принудительно перезагружено по вашему сценарию. Я знаю, вы ведете статистику всех ваших подопечных, кто проходит собеседования в Google после обучения у вас. Можете поделиться хотя бы несколькими интересными фактами, полученными на ее основе? Как правило, в качестве интервьюеров от Google выступают молодые люди. Если 3 года назад это были сотрудники в возрасте около 30–37 лет, то сейчас планка опустилась ниже — сейчас интервью часто ведут парни в возрасте 26–30 лет. Google, безусловно, стремительно молодеет. Огромное количество деталей и низкоуровневой информации. Многие курсанты сетуют, что если раньше классическое образование учило не зубрить бездумно, а прежде всего хорошо понимать алгоритмы или внутреннюю суть технологий, то теперь наблюдается обратный тренд — повышенное внимание к деталям, то есть очень сильный крен в сторону приобретения справочно-энциклопедических познаний. В последнее время значительно повысился процент приглашаемых на собеседование людей по инициативе самих рекрутеров. По нашей оценке, попасть на рядовые должности — вполне реалистичная задача для подготовленного специалиста среднего уровня квалификации, но на все управляющие позиции отбор гораздо более тщательный и долгий. Говоря иначе, если у вас более пяти лет стажа работы в отрасли и вы действительно учились программировать все это время, то у вас есть хорошие шансы пройти собеседование в Google. Почти всегда встречаются минимальные 1–3 вопроса на смекалку и креативность — иногда не имеющие отношения к профессиональной специализации, но чаще всего завуалированные под них. Легенды о большом количестве подобных вопросов, мягко говоря, преувеличены. Google стремится уходить от стандартной модели опросов, где есть очевидный и стандартный ответ, тяготея к модели, где требуется самостоятельно найти решение нестандартной задачи в режиме реального времени. Часто при этом просят проговаривать вслух динамику поиска вами решения (общий ход мысли), и поскольку большинство программистов — все-таки выраженные интроверты, это может серьезно помешать сосредоточиться на действительном решении самой задачи. Я бы хотел отдельно остановиться на очень важном обобщении, которое видел в ваших методических материалах. Надеюсь, это не только психологическая мотивация и позитивная настройка — вы утверждаете, что в Google действительно может попасть практически любой средний по своему уровню подготовки программист. Откуда такая уверенность? Мы дважды тестируем каждого своего студента — по приходе, а также после завершения нашей двухмесячной подготовки. При этом мы уверены, что точно представляем возможности программистов, которые проходят через нас. Если начальные тесты выявляют все слабые места в образовании, наши стандартные курсы с элементами индивидуальной адаптации обучения стремятся их полностью ликвидировать. Если человек не проходит собеседования в Google с первого раза, у нас есть ощутимая скидка для повторной индивидуально-усиленной подготовки. Так вот, исходя из моих давних наблюдений на базе более 500 прошедших через нас людей, я категорично заявляю, что в подавляющем большинстве случаев Google выбирает специалистов из категории крепких середнячков. Иначе говоря, идет отрицательный отбор как самых слабых, так и самых сильных специалистов. Это очень сильное утверждение, можно ли его пояснить дополнительно? Вот для примера: у нас были три сильных программиста, которые набрали максимальное количество баллов по нашей системе тестирования, и я даже пошутил: «Что вам от нас надо, парни?» Двое из них обратились за моей помощью именно потому, что не прошли собеседования в Google во время своего первого захода и хотели сделать повторную попытку, уже используя мои наработки. И даже после дополнительной подготовки, несмотря на все старания с их стороны, поисковая компания отказала им в трудоустройстве. Не могу гарантировать, что у них какой-то внутренний стандарт на сей счет, но для меня очевидно, что они выбраковывают уж слишком выделяющихся личностей. Большинство из тех, кто устроился через нас, — просто хорошие, крепкие специалисты без какой-либо претензии на гениальность. Можно предположить, что таким проще подстроиться под довольно жесткий корпоративный стандарт и общий ритм. Все-таки туда приходят работать не на себя, а на компанию, поэтому безусловная исполнительность и определенная антипассионарность немаловажны для работодателя. Видимо, по этой причине там не очень-то любят бывших стартаперов и просто очень-умныхпарней, у которых своя точка зрения на все на свете и которым всегда есть что сказать менеджеру их проекта, если им что-то не нравится (при этом громко хлопнув дверью напоследок). Кроме широко раскрученных бесплатных кафе, массажей и спортивных залов у таких известных компаний есть и обратная сторона, которая часто остается в тени масс-медиа, — не всегда просто управлять столь интернациональным и разнородным коллективом, где собирается подобная зашкаливающая на квадратный метр офиса плотность из «выдающихся специалистов» и «ярких личностей». Все эти популярные сейчас в Интернете прощальные письма уходящих из Google отдельных VIP-сотрудников — просто отражение той простой мысли, что это идеальная компания для тяжелой командной работы, а вовсе не долгожданная возможность для вашего звездного соло. Кроме того, большая часть работы гуглеров скучна и банальна, и это одна из причин, по которой я лично покинул компанию в свое время. Слушая вашу версию, я вспоминаю, что другой известный специалист по программированию Стив Егги (Steve Yegge), ныне работающий в Google (а до этого успевший поработать в Amazon, Microsoft и Facebook), также рассказывал в своем блоге, что по его опыту у Google самый большой коэффициент отсева из категории наиболее высококвалифицированных специалистов (false negative rate). Кроме того, он вспоминал, что в случае с Google у него было самое сложное трудоустройство из всех, которые он проходил в своей жизни (у него была длинная и чрезвычайно нервная серия из 12 интервью, ожидание результатов которой растянулось на 6 месяцев). Это нормальная ситуация. Если у них есть сомнения или колебания, они будут продолжать зондировать вас до тех пор, пока не будут уверены в своем решении, либо скорее откажут вам сразу. Это известное правило для Google — при малейших сомнениях лучше ошибиться и не взять настоящего профессионала, чем ошибиться и нанять «неправильного человека». Обратная найму процедура увольнения — сложный и долгий процесс, поэтому здесь реализован избыточный подход отбора с некоторым элементом перестраховки. В отношении приведенного вами примера со Стивом Егги — если речь идет о некоей ключевой позиции и дорогом VIP-кандидате под нее, о котором складывается противоречивое мнение, процедура найма может быть действительно очень жесткой и долговременной. Ранее мы уже касались работы с собственным резюме, создания специальных якорей-историй для естественного перехвата инициативы в разговоре, также хотелось бы коснуться вопросов, связанных с поведенческими паттернами, на отработку которых вы тратите приличный кусок времени своих клиентов. Да, я отдельно обращаю на это внимание, потому что технические специалисты склонны зацикливаться лишь непосредственно на своей профессиональной сфере, часто оставляя подобные мотивы без достаточного внимания и проработки, тогда как именно эти моменты будут рассмотрены с высокой степенью вероятности, формируя драгоценное первое впечатление. К примеру, по резюме видно, что вы в течение короткого периода времени сменили несколько работ или, как в моем случае, проработали год в одной крупной известной компании и уволились, — тогда гарантированы расспросы в связи с этим фактом. Нужно быть заранее готовым к подобным предсказуемым ситуациям — вас невольно колупают под углом «что с вами не так». Давайте перечислим типичные вопросы, которые обычно задаются по каждому крупному проекту, в котором вы участвовали (отметили в своем резюме):