Узнайте, чем машинное кодирование отличается от LeetCode, и как готовиться к реальным задачам на собеседованиях. Начните практиковаться уже сегодня.
Когда я собеседовался в Amazon, у меня было решено более 800 задач на LeetCode. Два указателя, скользящее окно, динамическое программирование, графы — я отточил всё. Я мог определить «это задача на кучу» уже со второй строки условия. Но на собеседовании мне дали не пустой редактор, а репозиторий — частично готовый код, в котором нужно было реализовать новые функции и исправить существующие баги. Реальный код, который я не писал, набор тестов, которые нужно было сделать зелёными, и часы, тикающие на стене. Я замер. Не потому что задача была сложной алгоритмически — нет. Я замер, потому что ни одна из моих тренировок не подготовила меня к тому, чтобы открыть чужой код, понять его, дополнить не сломав и исправить уже сломанную логику.
Этот разрыв — между тем, что тренирует LeetCode, и тем, что проверяют на раундах машинного кодирования — то, о чём никто не предупреждает. Особенно в России и странах СНГ, где раунд машинного кодирования (или LLD) тихо стал решающим для получения оффера на позиции SDE-1 и SDE-2 в большинстве продуктовых компаний.
LeetCode отлично измеряет один конкретный навык: можете ли вы взять чистую, самодостаточную формулировку задачи и написать эффективный алгоритм в пустом редакторе. Это реальный навык. Он отфильтровывает людей, которые умеют думать о сложности, выбирать правильную структуру данных и рассуждать о корректности на бумаге. Это также неплохой прокси для «серьёзно ли вы изучали структуры данных и алгоритмы», поэтому компании продолжают использовать его для первого скрининга. Так что 800 задач не были потрачены впустую. Они просто измерили то, что перестаёт быть узким местом, как только вы прошли телефонное интервью.
Раунд машинного кодирования даёт вам нечто гораздо более близкое к реальной работе. Вы получаете рабочую кодовую базу — сервис для бронирования, платежей или инвентаризации — и ваша задача расширить её, исправить или сделать зелёным набор падающих тестов. Вы используете свой язык и свою структуру. Интервьюер смотрит, как вы строите, а не помните ли вы алгоритм Кадане.
Вариант, который застал меня врасплох — Amazon — теперь я вижу чаще всего: раунд на основе репозитория. Вместо «спроектируйте и реализуйте X с нуля» — «вот репозиторий, который в основном работает: добавьте эти функции, исправьте сломанные, сделайте тесты зелёными». Эта версия наиболее близка к реальной работе, и она жестока, если вы тренировались только генерировать код с нуля, потому что генерация никогда не была сложной частью.
Они оценивают навыки, которые вы используете каждый день как инженер, но почти никогда не тренируете намеренно:
Ничего из этого не проявляется в задачах на динамическое программирование. Всё это проявляется в первый день работы. В этом и смысл раунда.
Вот ловушка. Когда люди слышат «машинное кодирование», они идут читать теорию LLD. Они заучивают принципы SOLID, смотрят видео о паттерне «фабрика», читают о проектировании парковки. А затем приходят и всё равно тормозят, потому что изучали описания построения программ, а не строили их. Это разница между чтением о плавании и нахождением в воде. Вы можете идеально рассказать о гребках, но всё равно утонете, когда вас впервые бросят в воду. Машинное кодирование — это навык делания. Единственная подготовка, которая переносится, — это повторения реального действия: открыть незнакомый репозиторий, понять его, сделать корректным относительно реального набора тестов, на таймере. Вам нужна мышечная память «тесты красные, с чего начать», чтобы когда это случится на интервью, ваши руки уже знали движение.
После того как первый раунд прошёл плохо, я изменил подготовку. Вот практическая версия, которая сработала для меня:
Если хотите готовый набор, я выложил несколько формулировок задач сюда: github.com/sasrivas25/machine-coding-problems — можно бесплатно читать и использовать как угодно. А инструмент, который я построил, Gronex, позволяет решать их внутри реального репозитория с падающими тестами в браузере — максимально приближено к реальному раунду. Используйте его или нет, но метод выше — то, что реально сдвинуло дело с мёртвой точки.
LeetCode помогает получить интервью. Но он больше не помогает получить оффер, по крайней мере в компаниях, которые проводят раунды машинного кодирования — а это большинство сейчас. Раунд после алгоритмического скрининга проверяет, умеете ли вы инженерить, и единственный способ стать в этом хорошим — делать это на время, с реальными тестами, снова и снова. Если вы сейчас усиленно решаете задачи по структурам данных и алгоритмам и не сделали ни одного повторения машинного кодирования — это самое высокодоходное изменение, которое вы можете сделать на этой неделе.
Каким был ваш раунд машинного кодирования? Интересно, замирали ли другие так же, как я.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →