Как получить работу инженера?
Давай на чистоту. Ты хороший кандидат на должность инженера? Как ты сам себя оцениваешь? Много ли компаний, в которых ты бывал на собеседованиях? Каково у тебя отношение пройденных интервью к полученным предложениям о работе? Попробуй воспользоваться следующей формулой (это мое сферическое измерение в вакууме, которое не означает ровным счетом ничего):
# x = количество компаний, в которых ты проходил собеседования
# y = количество предложений о работе, которые ты получил
рейтинг = 100 * log(x) * y / x
Если твой рейтинг < 90, обязательно прочти это. Если > 120, возможно, тебе это не нужно, но, все равно прочти.
Кто я такой?
У меня нет университетской корочки об образовании. Программирование стало для меня профессией в 19 лет, когда я переехал из Чикаго в Южную Калифорнию. Все мое имущество с легкостью поместилось в машину. 400 долларов в кармане и предложение о работе джуниором за безумные 40 000 долларов в год — вот все что у меня было. С тех пор прошло 12 лет… Но это уже совсем другая история.
Я работал в Double Helix, Namco Bandai, Google, Obvious и Square.* Получал предложения о работе от таких компаний, как Naughty Dog, Activision, Riot Games, Blizzard, Pinterest, Goldman Sachs и многих других. Если кому интересно — мой рейтинг по формуле, что я привел выше — 132.
За свою жизнь я провел, по меньшей мере, 500 интервью с соискателями на должность инженера. Приблизительно 10% из них получили предложения о работе. Менее 3% я считаю “звездами” и запомнил каждого из них.
Нет ни одного способа, который бы гарантировал тебе успешное получение работы. Слишком много переменных в этом уравнении. Особенно в компаниях вроде Google. Тебя сажают с 5-7 случайно выбранными инженерами и списком вопросов, которые они будут задавать. На таких собеседованиях обычно приходится писать код на доске от руки. Некоторые инженеры — ужасные интервьюеры. Они любят вопросы с подковыркой и предвзято тебя оценивают. Ничего страшного — это случается и с лучшими из нас. Обычно, разрешается завалить одно интервью из серии.
Лучшее, что я могу сделать в этой ситуации — это рассказать тебе, как подготовиться. Перейдем к делу — вот мои советы.
Технические советы
- Постоянно пишите код. Все просто: больше кода — выше твой уровень. Когда ты программируешь, ты подкрепляешь знания практическим опытом. И лучшая практика — это сосредоточенная практика. Постоянно держи свои цели в голове, изучай новые области, бросай вызов самому себе. Через какое-то время у тебя должно появиться портфолио находящихся в работе, а так же, завершенных проектов. GitHub — отличное место для размещения портфолио, кроме того, полезно иметь электронную копию своей работы.
- Стань профессионалом, как минимум, в одном из мультипарадигменных языков программирования. Изучение языка даст тебе хорошее видение перспективы. Чтобы достичь этого, ты должен писать огромное количество кода и еще больше — читать. Изучи подводные камни и лучшие практики. В идеале, выбранный тобой язык должен быть достаточно популярным и обладать динамично развивающимся сообществом, которое производит огромное количество кода. Хорошие кандидаты — это C#, C++, Java, PHP, Python и Ruby.
Самый частый вопрос, который любят задавать на собеседованиях по С++: “По шкале от 1 до 10, где 10 — самая высокая оценка, как бы вы оценили свои знания С++?”. Я ненавижу его. И да поможет бог любому, кто ответит 9-10. Его разорвут за это на части. Бьярн Страуструп оценивает свои знания, как 8 или менее. Этот язык слишком сложен, слишком обширен, с очень продолжительной эволюцией. Я опять отвлекся.
- Узнай свои слабые стороны. Прочти этот список, а затем оцени свое понимание работы всего этого. Реализуй базовые вычислительные алгоритмы, такие как Dijkstra's algorithm, Floyd-Warshall, Traveling Salesman, A*, bloom filter, breadth-first iterative search, binary search, k-way merge, buble/selection/insertion sort. in-place quick sort, bucket/radix sort, closest pair и так далее. И не прекращай программировать. Вот еще одна очень хорошая статья.
- Изобретай колесо. Ты должен вручную реализовать базовые структуры данных на своем языке. Не полагайся на стандартные библиотеки. Реализуй и напиши тесты для следующего: вектор (динамический массив), связанный список, стек, очередь, замкнутая очередь, hash map (хэш-карта), set (набор), очередь с приоритетами, дерево бинарного поиска, и т.д. Ты должен уметь их быстро реализовать, когда понадобится.
- Реши свои языковые проблемы. Забудь вопросы вроде этого. Все сводится к фундаментальным концепциям программирования. Потрать не менее 40 часов на кодирование решений для различных задач. Одним из лучших ресурсов для этого я считаю TopCoder. Прочитай это. Попробуй решить задачи. Выбирай такие, которые проверят твою способность реализовывать рекурсивные, pattern-matching, жадные алгоритмы, динамическое программирование, и задачи с графами…
Просмотри список задач из архива.
Я уверен, основная причина того, что меня наняли в Google — это мои две недели одержимости TopCoder. Я мог написать алгоритм Дейкстры с закрытыми глазами и с одной рукой за спиной. Я мог решить все задачи с графами на свете. Эта была моя репетиция. Как говорит Eric Schmidt: “Репетиция молитвы не портит.”
- Относитесь к программированию проще. По-крайней мере, сделайте его простым с виду. Конечно, не сразу — со временем. Я считаю, что кодинг — это самый честный и простой способ быть инженером. Я часто называю его “простейший этап программирования”, потому что сложнейшая его часть — это до и после написания кода. К примеру, разработка того, что вы собираетесь закодировать и проверка того, что код готов к поставке и выполняет свои задачи. Заставь своего интервьювера понять, что программирование — всего лишь средство для достижения цели.
Так же, обрати внимание, что кодирование может быть наиболее пугающим этапом. Постарайся попрактиковаться в написании кода руками на доске и в парном программировании. Google часто использует оба этих подхода.
А еще — прочти статью моего друга и бывшего коллеги Dan.
Общие советы
Не буду утверждать, что я тут эксперт. На самом деле, есть люди, которые могут сказать, что я не очень хорош в общении. И все же, я должен дать тебе несколько советов нетехнического плана, некоторые из которых, возможно, будут слишком очевидными.
- Знай зачем ты здесь. Если тебе предстоит собеседование в компании, о которой ты ничего не знаешь — лучше не приходит на него вообще. Люди отвечающие за найм работников чуют это за версту. Такое сойдет тебе с рук только в больших компаниях, в маленьких — даже не пытайся.
- Интересуйся. Если тебе все равно, остальным — тоже. Будь увлечен чем-то. Как на счет того, чтобы сделать программирование своим увлечением? Тебе нравится разрабатывать компиляторы в свободное время? Собираешь квадрокоптеры? Не важно — если ты увлечен чем-то, сможешь сделать это интересным для себя.
- Не делай предположений. Задавай вопросы, если неуверен. Если все равно не уверен на 100%, что разобрался после того как задал вопрос — спрашивай снова. Много раз я наблюдал за тем, как соискатель молча движется по неверному пути. В итоге он тратит время на решение не той задачи.
- Улыбайся. Сохраняй активность, будь счастлив и позитивен. Но не переборщи с этим. Люди будут оценивать тебя предвзято. Убедитесь в том, что первое впечатление, которое ты производишь — положительное. Улыбка заразительна. Когда я прихожу на интервью не в духе, поглощенный своими делами, позитивный настрой кандидата способен улучшить и мое настроение.
Как я уже говорил, не существует серебряной пули, которая гарантирует получение работы. Лучшее, что ты можешь сделать, как инженер — не переставать программировать.
*В настоящее время, я работаю на себя, создавая что-то новое.
Спасибо за внимание! Хорошего настроения, удачи в карьере и вообще!
Это был перевод. Оригинал: ABC: Always Be Coding by David Byttow (A pirate building things)