Сайт про гаджеты, ПК, ОС. Понятные инструкции для всех

Как проходит собеседование в Google. Ничего себе

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

Моя доска, исписанная алгоритмом Дейкстры для нахождения кратчайшего пути.

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

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

Как я к этому пришел

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

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

Перед тем, как покинуть армию, я попытался все-таки вернуться к программированию и был поражен тем, как это оказалось сложно. Я учил BASIC в средней школе и продолжил программировать на нём в колледже, но тут я начал обучение на С++ и понял, какой же большой пробел в моих знаниях.

Мне нравилось делать веб-сайты, но я использовал сервисы для их создания, а не верстал с нуля.

После армии я решил остаться в Корее ещё на год и преподавать там английский. Свои вечера и выходные я проводил, изучая веб-программирование с использованием Perl, HTML, CSS (который, кстати, к тому времени только появился), JavaScript и SQL. После года интенсивного изучения я устроился на работу в районе Сиэтла.

Работаю на балконе с видом на прекрасный Белвью.

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

В поисках перемен

Помните, как я не получил степень в сфере компьютерных наук? Это сыграло огромную роль.
Пару лет назад я думал, что меня с удовольствием примет на работу любая компания. Еще бы, мне казалось, что я был горячей штучкой: опытный full-stack разработчик, да ещё и с таким-то стажем! Но на протяжении моих поисков работы в 2013, я понял, что моих навыков было недостаточно. Я так увлекся погоней за деньгами, запуская стартапы в свободное время, что позволил моим навыкам попросту атрофироваться. Я не следил за новыми тенденциями и технологиями.

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

В начале 2016 я решил, что пришло время переквалифицироваться из веб-разработчика в разработчика ПО. Мне нужно было усердно учиться и много практиковать свои навыки, чтоб выучить всё, чему учат в университете, за пару месяцев. Но я понимал, что как только это сделаю, смогу начать новую карьеру.

Как всё началось

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

Я познакомился с человеком, работающим в Google и спросил об его впечатлениях о компании. Я читал «How Google Works » и был уже неплохо знаком с организацией работы в этой компании.

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

Почему Google?

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

Чем больше я узнавал о Google, тем больше я хотел там работать.

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

На собеседовании уже давно не задают головоломки. Сегодня кандидатов отбирают по их умению писать код, по техническим знаниям и «гугловости». Это слово означает много чего, поверьте.

На пути к своей мечте в 2015 я посетил Googleplex в Маунтин-Вью, Калифорния. Эта поездка посеяла мысли в моей голове.

Люди в Google, занимающиеся наймом сотрудников, выучили то, что будет работать вне времени, они используют данные и отзывы работников, чтоб улучшить систему отбора, процесс найма, поощрение, вознаграждение и так далее. Прочтите Work Rules! , чтобы узнать больше.

Помните о тренировочных заметках, которые мне дал мой знакомый, где указано, что мне стоит учить? Список казался вполне выполнимым даже несмотря на то, что я ничего из того, что было в этом списке, не знал. Все темы из заметок я выписал в учебный план и начал дополнять его перечнем YouTube видео и лекциями из MIT и UC Berkeley. Список начал расти.

Я опубликовал мой список на GitHub, так как мне нужно было сделать портфолио. Изначально, этот проект я назвал «Проект 9894». Google запустили 4 сентября 1998 года. Отсюда, собственно, и название. Чуть позже, я переименовал его в “Подготовка к интервью в Google ”.
Через какое-то время я добавил еще пару тем, которые мне были интересны и оказались полезными на моём пути.

Мой список летнего чтения и не только.

Меня ошеломило, что я достиг немалого в своей карьере, даже не зная, как процессор обрабатывает программу, как работает память и так далее. Я просто «знал достаточно, чтоб делать своё дело».

Мой маленький GitHub проект попал в ежедневный список трендов GitHub. Он был №1 в этом списке несколько дней.

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

Сейчас там более 21 000 оценок.
Я до сих пор не могу в это поверить.

А что, если я не получу работу?

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

Не учитесь так много, как я

Да, у меня это заняло всего 8 месяцев. Но я мог ещё сократить процесс. Как и со всем, что мы начинаем делать, имея большие планы и цели, я делал ошибки и тратил время впустую. Есть много вещей, которые бы я сделал иначе, будь у меня возможность!

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

Я потратил три недели, читая книгу по С++. Я не помню ни одной из 1000 страниц, но зато теперь знаю немного об этом языке. Так вышло, что во время интервью я использовал Python, а не С++. Мне казалось, что мне нужно знать С++, С или Java, но я ошибался. Нужно спрашивать, а не предполагать.

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

Набор алгоритмов, распечатанных для просмотра.

Я просмотрел сотни часов видео на YouTube, хотя мог гораздо меньше, и разобрал гораздо больше тем, чем стоило бы.

Распределенное повторение - ключ к запоминанию.

Когда вы что-то выучили, повторите это чуть позже, а потом снова, ещё чуть позже. С каждым повторением вы укрепляете свои знания. Трата десятков часов за раз на освоение чего-то одного не сделает вас экспертом. Им вы станете только после повторения через какое-то время. Если вы попробуете, то сами увидите, как придете к тому, что со временем перестанете забывать даже детали.

Чтоб легче было запоминать, я сделал 1 792 электронные карточки, на которых были разнообразные вопросы на многие темы. Я пересматривал их на моем телефоне или планшете каждый раз, когда у меня была свободная минутка. Повторение по карточкам и распределенное повторение идут нога в ногу. Если я правильно ответил на вопрос с карточки, то я всё равно не помечаю её как «выученную». Я оставляю её как есть и только когда отвечу на нее правильно много раз, тогда уже и помечу соответственно.

Моё чувство страха («А что, если они спросят меня о красно-чёрных деревьях?») заставило меня выучить гораздо больше тем, чем мне нужно было.
Но я не просто хотел подготовиться к интервью, я хотел подготовиться к карьере в Google, решая поистине большие проблемы. А это значит, что я должен знать алгоритмы, которые будут экономно расходовать вычислительные ресурсы.

Мне может никогда и не понадобиться алгоритм Форда - Фалкерсона (решает задачу нахождения максимального потока в транспортной сети - прим. переводчика), но приятно осознавать, что у меня есть эти знания на случай, если они понадобятся.

Заключение

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

У меня впереди потрясающее будущее.
Спасибо, что уделили время, на прочтение моей истории!

Перевод: Роман Мирзоян

Собеседование в Гугл – это процесс, который оброс легендами о невероятных вопросах и их нескончаемом количестве.

Google – это та компания, которая ищет не только умных, но также креативных сотрудников, поэтому будущему участнику команды нужно обладать такими :

  1. Вы должны действительно хорошо обладать программирования.
  2. Кандидат должен легко обучаться. И тут речь не об интеллектуальном развитии, а о способности обрабатывать новую информацию практически моментально и с таким же успехом применять её.
  3. Лидерские качества – это то, на что особенно обращают внимание в Гугл. Но компания видит лидерство в другом, непривычном нам банальном ракурсе: лидерство – это решительность вмешаться со своим решением в момент, когда команда столкнётся с проблемой и, возможно, даже не осознает её.
  4. Интеллектуальная скромность – вы должны быть готовы учиться на своих ошибках и не зацикливаться на том, что уже знаете. То есть, вам не должно казаться, что вы уже достигли максимума.

Как проходит собеседование в Google

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

Все собеседование делится на две части:

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

На собеседовании в Гугл используется много стандартных вопросов, которые переделываются снова и снова. Такие вопросы можно найти в сети целыми списками.

Неожиданные вопросы от Гугл

  • Разработайте план эвакуации в Сан-Франциско.

Будьте готовы к подобным вопросам, так как они предназначены выяснить, как вы подходите к проблемам. Ответить вы можете легко и иронично, например: «Какую конкретно мы с вами планируем катастрофу?».

  • Сколько мячей для гольфа можно запихнуть в школьный автобус?

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

  • Объясните своему 7-летнему племяннику, что такое база данных.

Вероятно, такой вопрос поможет понять, как хорошо соискатель может объяснять сложные идеи простыми и словами.

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

Нынешние IT-гиганты славятся своим нестандартным подходом к организации рабочего процесса. Корпорации создают для своих сотрудников идеальные условия, мотивируя их всеми способами. Но как подобрать отзывчивый коллектив, состоящий исключительно из «заряженных » профессионалов? Это главная задача HR-отделов, и вот как они с ней справляются.

Некоторое время назад были очень популярны вопросы формата «brainteaser» - логические головоломки, часто бессмысленные на первый взгляд. Они могли почти не относится к будущей должности и редко требовали специализированных навыков. Более того, на многие вопросы попросту не существует однозначного ответа.

Тогда зачем их задавать?

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

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

Приём взяли на вооружение все крупные корпорации, но, пожалуй, чаще всего brainteaser’ы попадались соискателям на вакантные места в Google Inc.

Самые дикие вопросы на собеседованиях в Google

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

1. Придумайте как можно больше способов найти иголку в стоге сена


Должность: 08.05.2014

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

2. Сколько стрижек делают в Америке в течение года?


Должность: сотрудник коммерческого отдела - 08.05.2014

Как ответить: начните с подсчёта потребительского спроса. Количество населения США? Сколько из них ходят к парикмахеру? Как часто люди стригутся? Затем сводите примерную статистику за год.

3. Монету подкидывали 1000 раз, и 560 раз она показывала орла. Как думаете, «честна» ли монета? А если из 10 бросков было шесть орлов?


Должность: специалист по количественному анализу - 12.09.2015

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

4. У вас есть круглосуточный сервис доставки продуктов. Сколько грузовиков вам потребуется для бесперебойной работы?


Должность: менеджер по продукту - 05.11.2015

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

5. Сколько теннисных мячиков поместятся в самолёт?


Должность: стажёр - 08.12.2015

Как ответить: тут или упираться в объём какого-нибудь Boening и высчитывать сколько стандартных шаров туда «насыпать», или подумать как будут грузится шары. В какой упаковке? Поддоны или контейнеры?

6. Как решить крупнейшую проблему человечества с помощью миллиарда долларов и космического корабля?


Должность: администратор баз данных - 14.12.2015

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

7. Если бы вы могли запомнить только одно предложение, каким бы оно было?


Должность: 08.12.2015

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

8. Опишите сервис, который помогает путешествовать в будущее.


Должность: проектировщик интерактивных интерфейсов - 23.12.2015

Как ответить: включить писателей-фантастов. Представьте, что это вот-вот случится. Как будет реализовано такое «подглядывание» в будущее? Новостное приложение в смартфоне? 3D-очки? Или физическое путешествие с помощью какой-то капсулы? Развить можно любую мысль.

9. Когда тротуар полностью промокнет под дождём, если ширина тротуара 1 метр, а диаметр капли 1 см?


Должность: инженер-программист - 06.01.2016

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

10. Если из YouTube удалить рекламу, то как его монетизировать?


Должность: консультант коммерческого отдела - 15.01.2016

Как ответить: придумайте несколько способов, например, платная подписка на сервис или формирование ТОП каналов за деньги. Ребята из коммерческого отдела - те, кто напрямую работает со всеми рекламными продуктами Google, поэтому готовьтесь дать свой развёрнутый ответ, с подсчётом выгоды.

11. Сколько людей водят машины в вашем городе? Рассчитайте.


Должность: разработчик - 03.09.2016

Как ответить: придумайте себе исходные данные. Прикиньте население города, и какое количество человек в семье в среднем. Затем подумайте, сколько семей могут позволить себе 1 машину? А две? Три и больше?

12. Как много машин на 101 шоссе, между Сан-Фарнциско и Маунтин Вью?


Должность: менеджер по продукту - 04.01.2018

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

13. Сколько в США специалистов по ремонту пианино?


Должность: менеджер по продукту - 04.01.2018

Как ответить: также как и на вопрос с парикмахером. Высчитываете примерный спрос на эту услугу и получаете не менее примерное количество специалистов.

14. Сколько шариков для гольфа поместятся в школьный автобус?


Должность: менеджер по продукту - 04.01.2018

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

15. Сколько людей работает в Google по всему миру?


Должность: менеджер по продукту - 04.01.2018

Как ответить: возьмите за основу годовой доход Google и представьте, в каком размере окупаются затраты на сотрудников. В дестикратном? В тридцатикратном? Посчитайте.

16. Сколько компьютеров принадлежит Google?


Должность: менеджер по продукту - 04.01.2018

Как ответить: уточните о каких компьютерах речь. Если о персональных - то нужно сначала посчитать количество сотрудников Google (вопрос выше). Если речь о серверах - отталкивайтесь от примерного объема данных, который там хранится.

17. Google хочет, чтобы вы разработали газонокосилку-робот. Как будете действовать?


Должность: менеджер по продукту - 08.01.2018

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

18. Спроектируйте вендинговый автомат (торговое оборудование) для слепых.


Должность: менеджер по продукту - 11.01.2018

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

19. Какой объём памяти нужен, чтобы сохранить все изображения с Google Maps?


Должность: менеджер по продукту - 11.01.2018

Как ответить: придется очень много считать, причём цифры буквально с потолка. Сколько весит одна фотография в Google Maps? А панорамное изображение? Плюс сопутствующая графика. Теперь посчитайте примерную площадь земного шара. А сколько уже снято спутниками Google? Как много там объектов с привязанным фото? А достопримечательностей? Считайте всё, что сможете вспомнить.

20. Как понять, сколько сантехников работают в Сан-Франциско?


Должность: 18.01.2018

Как ответить: это ещё одна вариация вопроса про стрижки или про специалиста по ремонту пианино. Решаются они как под копирку, только разные исходные данные. Брать их, опять же, из головы.

21. Если бы вам было поручено нанять людей, какая площадка подошла бы лучше всего?


Должность: аналитик отдела безопасности - 18.01.2018

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

22. Как улучшить пользовательский интерфейс YouTube? (с точки зрения рекламы)


Должность: аналитик отдела безопасности - 18.01.2018

Как ответить: представьте, что YouTube обзавёлся ненавязчивой, не заметной пользователю рекламой. Где бы находились спонсорские блоки? В каком моменте и как долго они бы отображались?

И как к этому подготовиться?

По большому счёту, уже нет нужды . Пару лет назад, Laszlo Bock, старший вице-президент по управлению персоналом в Google заявил , что эти вопросы - не самый весомый фактор в собеседовании. Да и если проанализировать последние

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

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

Позиция 1: инженер-программист в Google

Задача

У вас 8 шаров: 7 весят одинаково, а 1 чуть тяжелее остальных. Как определить с помощью весов, какой шар тяжелее, если у вас только 2 попытки?

Решение

Шаг 1. Берем 6 любых шаров из 8

Шаг 2. Кладем по 3 шара на две чаши весов (тем самым используем 1-ю попытку):

A) если чаши сравнялись, то более тяжелый шар нужно искать среди двух оставшихся

B) если одна чаша перевесила, то нужный шар находится среди этой тройки

Шаг 3. Используем 2-ю и последнюю попытку.

При варианте

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

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

Позиция 2: менеджер в Amazon

Задача

В спортивном турнире заявлено 5.623 участника. Сколько нужно состязаний, чтобы выявить победителя?

Самые популярные ответы

A) одно состязание – именно оно определит чемпиона в финале

B) 5.622 состязания: если из всех участников должен быть только один победитель, то из 5.623 нужно просто вычесть 1.

Альтернативное решение

Здесь важен не «правильный ответ» (если вы заметили, условие задачи туманно, так что решений может быть несколько), а логический подход. Поэтому сначала хорошо бы уточнить, что это за участники – команды или отдельные спортсмены? Потом, в зависимости от ответа, задать следующий логический вопрос и так далее. Так вы проявите свою способность мыслить, рассуждать, принимать решения.

Позиция 3: разработчик программного обеспечения в Webtrends

Задача

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

Варианты ответов

A) 3 носка – либо 2 из них окажутся одного вида, 1 – другого, либо все 3 будут одного вида. В любом случае у вас будет пара.

B) ни одного, так как в условии сказано: «20 разных носков двух видов», то есть среди них нет двух одинаковых.

Позиция 4: инженер-программист / веб-разработчик в Microsoft

Задача

Перед вами 3 коробки: в одной яблоки, в другой бананы, в третьей – смесь тех и других. Все коробки помечены неправильно. Вы можете доставать по одному фрукту из одной коробки, не заглядывая внутрь. Сколько раз как минимум нужно достать фрукт, чтобы определить содержимое всех корзин?

Ответ

Решение

Ключ в том, что коробки помечены неправильно, а значит, в каждой лежит не то, что написано. То есть, в коробке с пометкой С (смесь) могут быть либо только яблоки (Я), либо только бананы (Б). Достаем оттуда фрукт – попалось яблоко? Значит, это коробка с яблоками.

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

Позиция 5: инженер-программист в Raytheon

Задача

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

Решение

Включить любой из трех выключателей и подождать 5-10 минут, чтобы лампочка (если она зажглась) успела нагреться. Затем выключить первый и включить второй выключатель, а самому спуститься вниз на проверку. Если лампочка не горит, но теплая, значит за нее отвечает первый выключатель. Если горит сейчас, то второй. А если не горит и холодная, то третий.

После окончания курсов я осознал, что многие знания это многие печали. Если раньше я просто знал, что ничего не знаю, то теперь начал осознавать, что именно я не знаю.

Так как был еще только май месяц, а собеседование я запланировал на осень, я решил продолжить свое образование. После просмотра требований к вакансии, было принято решение пойти параллельно по двум направлениям: продолжить изучение алгоритмов и пройти базовый курс по машинному обучению. Для первой цели я решил переключиться с курсов на книгу и выбрал монументальный труд Стивена Скиены (Steven Skiena) «Алгоритмы. Руководство по разработке» (The Algorithm Design Manual). Не такой монументальный, как у Кнута, но все же. Для второй цели я опять пошел на Coursera и записался на курс Эндрю Ына (Andrew Ng) Machine Learning .

Прошло еще 3 месяца, и я закончил курс и книгу.

Начнем с книги. Чтение оказалось достаточно интересное, хотя и непростое. В принципе, я бы книгу рекомендовал, но не вот так сразу. В общем и целом, книга дает более глубокий разбор того, что я узнал на курсах. Плюс к этому я открыл для себя (с формальной точки зрения) такие вещи как эвристики и динамическое программирование. Естественно, раньше мне доводилось их использовать, но как они называются я не знал. Так же в книге присутствует некоторое количество баек из жизни автора (War Story), которые несколько разбавляют академичность изложения. Вторую половину книги можно кстати опустить, там идет скорее описание существующих проблем и методов их решения. Полезно, если регулярно применяется на практике, иначе забудется сразу же.

Курс меня более чем порадовал. Автор явно знает свое дело и рассказывает интересно. Плюс изрядную часть, а именно линейную алгебру и основы нейронных сетей я помнил еще с университета, поэтому особых трудностей не испытал. Структура курса достаточно стандартная. Курс разбит на недели. Каждую неделю сначала идут лекции вперемешку с короткими тестами. После лекций выдается задание, которое нужно сделать, отправить и оно автоматически проверится. Вкратце, список преподаваемого в курсе следующий:
- cost function
- linear regression
- gradient descent
- feature scaling
- normal equation
- logistic regression
- multiclass classification (one vs all)
- neural networks
- backpropagation
- regularization
- bias/variance
- learning curves
- error metrics (precision, recall, F1)
- Support Vector Machines (large margin classification)
- K-means
- Principal Components Analysis
- anomaly detection
- collaborative filtering (recommeder system)
- stochastic, mini-batch, batch gradient descents
- online learning
- map reduce
- ceiling analysis
После прохождения курса, понимание всех этих тем присутствовало. Через 2 года уже почти все естественно забылось. Рекомендую тем, кто не знаком с машинным обучением и хочет получить хорошее понимание базовых вещей для движения дальше.

Первый заход

На дворе был уже сентябрь и пришло время задуматься о собеседовании. Так как подаваться через сайт дело достаточно гиблое, занялся поиском знакомых, работающих в Google. Выбор пал на , так как он был единственным, кого я знал напрямую (пусть и не лично). Он согласился передать мое резюме, и вскоре я получил от рекрутера письмо, предлагающее забронировать слот у него в календаре для первого разговора.Через пару дней состоялся созвон. Пробовали общаться через Hangouts, но качество было ужасное, поэтому переключились на телефон. Сначала быстро обсудили стандартные как, зачем и почему, а потом перешли к техническому скринингу. Он состоял из десятка вопросов в духе «какая сложность вставки в hash map», «какие сбалансированные деревья вы знаете». Не сложно, если есть базовое знание этих вещей. Скрининг прошел хорошо и по результатам решили организовать первое интервью через недельку.

Интервью тоже было через Hangouts. Сначала минут 5 поговорили обо мне, потом перешли к задачке. Задача была на графы. Я быстро понял, что надо сделать, но выбрал не тот алгоритм. Когда начал писать код осознал это и переключился на другой вариант, который и дописал. Интервьюер задал несколько вопросов на тему сложности алгоритма, спросил, можно ли быстрее. Я как-то затупил и не смог. На этом время вышло и мы распрощались. Потом, минут через 10 до меня дошло, что вместо алгоритма Дейкстры, который я использовал, конкретно в этой задаче можно было бы использовать поиск в ширину, и это было бы быстрее. Через некоторое время позвонил рекрутер и сказал, что интервью в целом прошло хорошо и надо бы организовать еще одно. Договорились на еще через недельку.

В этот раз дела пошли хуже. Если в первый раз интервьюер был дружелюбный и общительный, то в этот раз какой-то мрачноватый. Задачку я сразу раскусить не смог, хотя те идеи что я выдавал в принципе могли привести к ее решению. В итоге после нескольких подсказок интервьюера до меня дошло решение. В этот раз это снова оказался поиск в ширину, только из нескольких точек. Решения я написал, во время уложился, но забыл про граничные случаи. Через какое-то время позвонил рекрутер и сообщил, что в этот раз интервьюер остался недоволен, так как по его мнению мне потребовалось слишком много подсказок (3 или 4 штуки) и я постоянно менял код во время написания. По результатам двух собеседований было принято решение дальше не идти, а отложить следующее интервью на год, если у меня будет такое желание. За сим и распрощались.

И этой истории я сделал несколько выводов:

  • Теория это хорошо, но в ней надо быстро ориентироваться
  • Теория без практики не поможет. Надо решать задачки и доводить написание кода до автоматизма.
  • Многое зависит от интервьюера. И с этим ничего не сделать.

Подготовка ко второму заходу

Обдумав ситуацию, я принял решение попробовать через год еще раз. И слегка подредактировал цель. Если раньше основной целью была учеба, а интервью в Google как далекая морковка, то теперь прохождение интервью было целью, а учеба средством.
Итак, был разработан новый план, в который входили следующие пункты:
  • Продолжать изучать теорию путем чтения книжек и статей.
  • Прорешать алгоритмические задачи в количестве 500-1000 штук.
  • Продолжать изучать теорию путем просмотра видео.
  • Продолжать изучать теорию путем курсов.
  • Изучить опыт других людей по прохождению собеседований в Google.
План был выполнен мною за год. Дальше я опишу, что именно я делал по каждому из пунктов.

Книги и статьи

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

Книг я прочитал 5: Algorithms, 4th edition (Sedgewick, Wayne), Introduction to Algorithms 3rd Edition (Cormen, Leiserson, Rivest, Stein), Cracking the Coding Interview 4th edition (Gayle Laakmann), Programming Interviews Exposed 2nd edition (Mongan, Suojanen, Giguere), Elements of Programming Interviews (Aziz, Lee, Prakash). Их можно разделить на 2 категории. В первую попадают книги Седжвика и Кормена. Это теория. Остальные это подготовка к интервью. Седжвик в книге рассказывает примерно то же самое, что и в своих курсах. Просто в письменном виде. Нет особого смысла читать внимательно, если вы проходили курс, но проглядеть стоит в любом случае. Если курс не смотрели, то имеет смысл почитать. Кормен мне показался чересчур занудным. Осилил честно говоря с трудом. Вынес оттуда только master theorem , да несколько редко используемых структур данных (Fibonacci heap, van Emde Boas tree, radix heap).

Книгу для подготовки к интервью стоит прочитать хотя бы одну. Они все построены примерно по одному принципу. Описывают процесс интервью в крупных технологических компаниях, дают базовые вещи из Computer Science, задачки на эти базовые вещи, решения задачек и разбор решений. Из приведенных трех я бы наверное рекомендовал Cracking the Coding Interview как основную, а остальные по желанию.

Алгоритмические задачи

Это наверное был самый интересный пункт подготовки. Можно, конечно, сесть и тупо решать задачи. Для этого есть много разных сайтов. Я в основном использовал три: Hackerrank , CodeChef и LeetCode . На CodeChef задачи разбиты по сложности, но не по темам. На Hackerrank и по сложности, и по темам.

Но как я сразу для себя выяснил, есть более интересный способ. И это соревнования (programming challenges или programming contests). Все три сайта их предоставляют. Правда с LeetCode есть проблема - неудобная временная зона. Поэтому я не участвовал на этом сайте. Hackerrank и CodeChef предоставляют достаточно большое количество различных соревнований, длительностью от 1 часа до 10 дней. У разных форматов разные правила, ну да это про это можно долго рассказывать. Основная суть, почему соревнования это хорошо, это внесение соревновательного (и снова тавтология) элемента в процесс обучения.

Всего я поучаствовал в 37 соревнованиях на Hackerrank. Из них 32 были рейтинговые, а 5 или спонсируемые (я даже получил 25$ в одном из них) или по фану. В рейтинговых я 10 раз входил в топ 4%, 11 раз в топ 12% и 5 раз в топ 25%. Лучшими результатами были 27/1459 в 3-х часовом и 22/9721 в недельном.

На CodeChef я перешел, когда на Hackerrank соревнования стали устраивать реже. Всего я успел поучаствовать в 5 соревнованиях. Лучшим результатом было 426/5019 в десятидневном соревновании.

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

Просмотр видео

Прочитав книжку Скиены, я в принципе заинтересовался тем, чем он занимается. Как и Седжвик, он является профессором в университете. В связи с этим, в сети можно найти видеозаписи его курсов. Я решил просмотреть курс COMP300E - Programming Challenges - 2009 HKUST . Не скажу, что мне сильно понравилось. Во-первых качество видео не очень. Во-вторых я не пробовал сам решать задачи, разбираемые в рамках курса. Так что вовлеченность была не очень высокая.
Также в процессе решения задачек, пытаясь найти правильный алгоритм, я натыкался на видео Tushar Roy. Он работал в Amazon, а сейчас работает в Apple. Как позже я для себя выяснил, у него есть канал на YouTube , где он выкладывает разбор различных алгоритмов. На момент написания статьи канал содержит 103 видео. И надо сказать, что разбор в его исполнении сделан очень прилично. Я пробовал смотреть других авторов, но как-то не зашло. Так что этот канал однозначно могу рекомендовать к просмотру.

Прохождение курсов

Тут я особо ничем не занимался. Просмотрел видео из Android Developer Nanodegree от Google и прошел курс от ИТМО How to Win Coding Competitions: Secrets of Champions . Nanodegree вполне себе, хотя ничего нового оттуда я естественно не узнал. Курс от ИТМО в плане теории немного скомканный, но задачки были интересные. Я бы не рекомендовал с него начинать, но в принципе время на него было потрачено не зря.

Изучить опыт других людей

Само собой множество людей пытались попасть в Google. Кто-то попал, кто-то нет. Некоторые писали об этом статьи. Из интересных вещей наверное отмечу вот эту и вот эту . В первом случае, человек подготовил для себя список того, что ему нужно выучить, чтобы стать Software Engineer и попасть в Google. Попал он в итоге в Amazon, но это уже не так важно. Второй мануал написан инженером Google, Ларисой Агарковой (). Помимо этого документа, можно также почитать ее блог .

Второй заход

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

После общения за жизнь решили, что через недельку будет Hangouts интервью, все как в прошлом году. Неделя прошла, пришло время интервью, но интервьюер не появился. Прошло 10 минут, я уже начал нервничать, как вдруг кто-то ворвался в чат. Как выяснилось чуть позже, мой интервьюер по какой-то причине не смог появиться и ему срочно нашли замену. Человек был несколько не готов как в плане настройки компа, так и в плане проведения интервью. Но затем все пошло хорошо. Задачку я решил быстро, описал где возможны подвохи, как их можно обойти. Обсудили несколько разных вариантов задачи, сложность алгоритма. Потом еще 5 минут пообщались, инженер рассказал свои впечатления от работы в Мюнхене (в Цюрихе видать срочной замены не нашли), на том и расстались.

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

Пока готовил документы, попутно обсуждал с рекрутером предстоящее интервью. Стандарное интервью в Google состоит из 4 алгоритмических и одного System Design. Но, так как я устраивался как Android разработчик, мне было сказано, что часть интервью будет с Android спецификой. Какие именно и в чем будет специфика я из рекрутера так и не смог вытрясти. Насколько я понял, это ввели относительно недавно и он сам был не очень в курсе. Также меня записали на две тренировочные сессии: как проходить алгоритмическое интервью и как проходить System Design интервью. Сессии были средней степени полезности. Там мне тоже никто не смог рассказать, что же спрашивают у Android разработчиков. Поэтому моя подготовка в этот месяц свелась к следующему:

  • Покупке маркерной доски и написании 2-3 десятков самых популярных алгоритмов на ней по памяти. По 3-5 штук каждый день. Итого каждый был написан несколько раз.
  • Освежении в памяти разной информации по Android, которую не использую каждый день
  • Просмотре нескольких видео про Big Scale и все такое
Как я уже говорил, параллельно я делал документы для поездки. Для начала у меня запросили данные, чтобы сделать пригласительное письмо. Потом я долго пытался выяснить, кто же на Кипре делает визы в Швейцарию, так как швейцарское посольство этим не занимается. Как выяснилось, этим занимается консульство Австрии. Позвонил и записал на прием. Там затребовали пачку документов, но ничего особо интересного. Фото, паспорт, вид на жительство, кучу разных справок и естественно пригласительное письмо. Письмо тем временем все не приходило. В итоге поехал с обычной распечаткой и это вполне прокатило. Само же письмо пришло еще дня через 3, причем кипрский FedEx не сумел найти мой адрес и пришлось ехать за ним самому. Заодно получил все в том же FedEx"e посылку, которую они тоже не смогли мне доставить, так как не нашли адрес, и которая там лежала с июня (5 месяцев, Карл). Так как я о ней не знал, что естественно и не предполагал, что она у них есть. Визу я получил вовремя, после чего мне забронировали отель и предложили варианты перелета. Варианты я подкорректировал, чтобы было удобнее. Прямых рейсов уже не было, в итоге летел туда через Афины, а обратно через Вену.

После того как все формальности с поездкой были улажены, прошло еще несколько дней и я собственно вылетел в Цюрих. Добрался без приключений. От аэропорта до города доехал на поезде - быстро и удобно. Немного поплутав по городу нашел отель и заселился. Так как отель был забронирован без еды, отужинал по соседству и завалился спать, ибо рейс был утренний и спать уже хотелось. На следующий день позавтракал в отеле (за отдельные деньги) и отправился в офис Google. Всего в Цюрихе у Google несколько офисов. Мое собеседование было не в центральном. И в общем-то офис выглядел достаточно обычно, так что не довелось мне посмотреть на все плюшки «нормального» офиса Google. Зарегистрировался у администратора и сел ждать. Через какое-то время вышел рекрутер и рассказал мне план на день, после чего отвел в комнату, где и должны были проходить интервью. Собственно в плане значились 3 интервью, обед и еще 2 интервью.

Интервью номер раз

Первое интервью было как раз по Android. Причем вообще никак не было связано с алгоритмами. Сюрприз, однако. Ну да ладно, так даже привычнее. Попросили сделать определенный UI компонент. Сначала обсудили, что и как. Предложил сделать решение на RxJava, описал, что именно и почему бы сделал. Сказали, что это конечно хорошо, но давайте сделаем средствами Android фреймворка. А заодно напишем код на доске. Причем не просто компонента, а всей Activity, использующей этот компонент. Вот к такому я был не готов. Одно дело писать на доске алгоритм на 30-50 строчек, а другое дело лапшу Android кода, пусть даже с сокращениями и комментариями в духе «ну, это я писать не буду, так как и так очевидно». Получился какой-то винегрет на 3 доски. Т.е. задачу-то я решил, но выглядело это стремно.

Интервью номер два

На этот раз интервью было по алгоритмам. И интервьюеров было двое. Один собственно интервьюер, а второй юный падаван (shadow interviewer). Нужно было придумать структуру данных с определенными свойствами. Сначала как обычно обсуждали проблему. Я задавал разные вопросы, интервьюер отвечал. Через какое-то время попросили написать несколько методов придуманной структуры на доске. В этот раз более-менее удалось, правда с несколькими мелкими ошибками, которые я исправил с подсказки интервьюера.

Интервью номер три

На это раз System Design, который вдруг тоже оказался Android. Нужно было разработать приложение с определенным функционалом. Обсудили требования к приложению, к серверу, к протоколу коммуникации. Далее я стал описывать, какие компоненты или библиотеки я бы использовал при построении приложения. А затем при упоминании Job Scheduler случился некоторый затык. Суть в том, что я никогда не использовал его на практике, так как в момент его выхода как раз переключился на поддержку приложений, где задач для его применения не было и в помине. При разработке последующих было тоже самое. То есть в теории я знаю что это за штука, когда и как применяется, но опыта в применении нет. И интервьюеру это похоже не сильно понравилось. Потом попросили написать код. Да, при разработке приложения сразу нужно писать код. Опять же Android код на доске. Получилось снова страшненько.

Обед

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

Интервью номер четыре

Наконец-то алгоритмы в чистом виде. Первую задачку я решил достаточно быстро и сразу эффективно, правда промахнулся с одним граничным случаем, но по подсказке интервьюера (он дал этот самый граничный случай) нашел проблему и исправил. Само собой нужно было писать код на доске. Затем была дана похожая задача, но сложнее. Для нее я нашел пару неоптимальных решений и почти нашел оптимальное, не хватило 5-10 минут чтобы дожать мысль. Ну и код для нее я написать уже не успел.

Интервью номер пять

И снова Android интервью. Интересно, зачем я учил алгоритмы весь год?
Сначала было несколько простых вопросов. Потом интервьюер написал на доске код и попросил найти в нем проблемы. Нашел, объяснил, исправил. Обсудили. А дальше начались несколько неожиданные вопросы в духе «а что в классе Х делает метод У», «а что внутри у метода У», «а что делает класс Z». Что-то я конечно ответил, но потом сказал, что в работе в последнее время с этим не сталкивался и естественно не помню, кто, что и как в деталях делает. После этого интервьюер расспрашивал, что я делаю сейчас. И вопросы пошли на эту тему. Тут я уже отвечал гораздо лучше.

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

На то, чтобы обработать результаты интервью ушло полторы недели. После чего мне сообщили, что я был «a bit below the bar». То бишь немного не дотянул. Если конкретнее, то 2 интервью прошли хорошо, 2 немного не очень, а System Design очень не очень. Вот если бы хотя бы 3 прошли хорошо, то можно было бы побороться, а так без шансов. Предложили заходить еще через год.

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

Заключение

И тут мы подходим к заключительной части статьи. Да, я дважды не прошел интервью в Google. Это печально. Наверное, было бы интересно там поработать. Но, можно взглянуть на дело и с другой стороны.
  • За полтора года я узнал огромное количество вещей, связанных с разработкой программного обеспечения.
  • Я получил немалое удовольствие, участвуя в соревнованиях по программированию.
  • Я съездил на пару дней в Цюрих. Когда еще туда выберусь?
  • Я получил интересный опыт интервью в одной из крупнейших IT компаний мира.
Таким образом, все произошедшее за эти полтора года можно просто считать обучением, или тренировкой. И результаты этой тренировки дали о себе знать. Моя мысль покинуть Кипр дозрела (по некоторым обстоятельствам семейного характера), я успешно прошел несколько собеседований в другую известную компанию и через 8 месяцев переехал. Но это уже совсем другая история. Тем не менее, думаю, что мне все равно стоит поблагодарить Google как за эти полтора года, которые я работал над собой, так и за 2 интересных дня в Цюрихе.

Что я могу сказать напоследок. Если вы работаете в IT, подготовьте себя к интервью в Google (Amazon, Microsoft, Apple и т.д.). Возможно, когда-нибудь вы туда заходите попасть. Даже если не захотите, то поверьте, от такой подготовки вам хуже не станет. В том момент, когда вы поймете, что можете (пусть даже только при удачном стечении обстоятельств) пройти интервью в одну из этих компаний, перед вами будет открыто гораздо больше дорог, чем перед началом вашей подготовки. А все, что вам потребуется в пути это цель, настойчивость и время. Желаю успехов:)

Лучшие статьи по теме