О работе в Google

Nooglers

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

Проект. Я попал в проект облака сообщений для Android Google Cloud Messaging for Android. Эта система, которая, кроме прочего, доставляет на ваш андроидофон уведомления о новой почте, новых сообщениях в соц. сетях и подобном, даже если соответствующая программа не запущена. Если говорить конкретнее, то я занялся вот этим сервисом.

Люди. В проекте человек 15-20, из них только один американец. Я больше всего общаюсь с ребятами, которые начали одновременно со мной: это новозеландец и три китайца. Стоит ли говорить, сколько всего нового можно узнать от иностранцев, особенно от китайцев, которые очень любят рассказывать о своей родине. А когда у нас всех ещё уровень английского подрастёт, будет вообще фантастика. Кстати, чувак из Новой Зеландии говорит на британском английском, и в Америке его не все хорошо понимают. Continue reading “О работе в Google”

Про собеседования по программированию. Часть 2.

Часть 1

Телефонное собеседование

Я намеренно опустил момент знакомства с менеджером по найму: они всегда сами находили меня через LinkedIn и предлагали поговорить. Чтобы обратить на себя внимание, кроме писем рекрутёрам могу предложить решение задач, опубликованных на сайте компании. Например, Facebook Programming Challenge или Spotify’s Tech Puzzles.

Также мы не будем говорить о диалоге с hiring manager по телефону и почте, потому что говорить особо не о чем. Разве что будьте готовы к вопросам о своей личности и по пунктам из резюме. Continue reading “Про собеседования по программированию. Часть 2.”

Про собеседования по программированию. Часть 1.

Я собирался написать большой пост про процесс собеседования в большие иностранные IT конторы, но оказалось, что это довольно хорошо описано в книгах. Например, в первых главах книги «Cracking the Coding Interview: 150 Programming Questions and Solutions, 5th ed», которую мне на днях показали. Поэтому я написал большой пост про то, как это происходило конкретно у меня, и какие полезные выводы я сделал.

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

Я делаю упор на подготовку к решению паззлов и задач, где требуется подобрать/придумать алгоритм решения или подходящую структуру данных. Это не всё, о чём спрашивают на собеседованиях, но эти проблемы определённо вызывают затруднения у многих кандидатов.

Continue reading “Про собеседования по программированию. Часть 1.”

Как избегать deadlock’и

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

Java Concurrency in Practice для решения проблемы дедлоков предлагает, по крайней мере в главе про дедлоки, следующее решение:
If you must acquire multiple locks, lock ordering must be a part of your design: try to minimize the number of potential locking interactions, and follow and document a lock ordering protocol for locks that may be acquired together.

Однако более полный ответ на этот вопрос я увидел, как ни странно, в Чистом коде Боба Мартина, в той главе, которая там вроде как ни к месту. Там приводятся следующие обязательные условия возникновения дедлока:

  • Mutual Exclusion
  • Lock and Wait
  • No Preemption
  • Circular Wait

И предлагаются способы исключить каждое условие:

Mutual Exclusion:

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

От Lock and Wait избавиться можно так: проверяем ресурс перед захватом; если он занят, то освобождаем все захваченные ресурсы. Этот подход может привести к новым проблемам: Livelock и Starvation.

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

Circular Wait: Вводим порядок, в котором ресурсы могут быть захвачены. Это невозможно, если до захвата одного ресурса мы не узнаем, какой ресурс понадобится следующим.

* * *

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

Про собеседования

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

  • Проходить собеседования полезно, чтобы быть готовым к чёрному дню. Сюда относится как углубление знаний в предметной области (на интервью задали сложный вопрос → почитал дома что-нибудь по этому вопросу и вокруг него → получил новые знания → повторил), так и общее понимание того, чего на собеседованиях от тебя хотят и что из этого стоило бы подтянуть.
  • С каждым собеседованием всё сильнее привыкаешь, страх постепенно уступает уверенности. Это особенно важно, если собеседования проходят на английском языке: постепенно перестаёшь задумываться о том, как понятно формулировать свои мысли.
  • Если собеседуешься в иностранную компанию, то есть шанс дойти до очного этапа и съездить в другую страну за их счёт. Например, я таким образом побывал в Лондоне и Тель Авиве, куда сам в ближайшее время точно не поехал бы.
  • Понимание текущего состояния рынка труда и своего положения в нём.
  • Возможность в конечном итоге пройти собеседование и получить хорошую работу.

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

Я помню своё первое собеседование (в Microsoft), как был уверен успехе, как негодовал по поводу отказа и, наконец, каким наивным чувствовал себя после подробного изучения заданных вопросов. Время прошло чрезвычайно плодотворно.

Для тех, кто собирается встать на этот нелёгкий путь, я порекомендовал бы начать со следующуей литературы:

  • книга Programming Interviews Exposed: Secrets to Landing Your Next Job;
  • Hacking a Google Interview: сборник типичных задач и паззлов с собеседований.

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

Успехов.