Обучение
5 вещей, которые я узнал после решения более 500 задач на Leetcode
Хотя я согласен с тем, что незнание Leetcode не делает вас плохим разработчиком, и вполне вероятно, что во время работы вам никогда не понадобится инвертировать бинарное дерево, есть много вещей, которым может научить вас работа с Leetcode.
Любой, кто ищет работу в сфере разработки программного обеспечения, вероятно, очень хорошо знает Leetcode. На сайте собраны задачи и решения, которые задают в ходе технических собеседований в некоторых самых крупных компаниях, таких как Google, Facebook и Microsoft.
Подобные задачи, связанные со структурами данных и алгоритмами, становятся все более популярными даже среди небольших компаний, и это вызывает разочарование у многих, которые утверждают, что навыки «литкодинга» не отражают способности выполнять работу.
Хотя я согласен с тем, что незнание Leetcode не делает вас плохим разработчиком, и вполне вероятно, что во время работы вам никогда не понадобится инвертировать бинарное дерево, есть много вещей, которым может научить вас работа с Leetcode и которые окажутся полезными в вашей карьере.
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
— Max Howell (@mxcl) June 10, 2015
1) Важность структур данных и алгоритмов
Leetcode не является учебным курсом, и если у вас нет предварительной подготовки по предмету, вам определенно лучше пройти какой-либо курс, который научит вас основам и позволит эффективно использовать платформу. Однако сайт отлично помогает вам понять, как работают разные алгоритмы и что у них получается лучше всего.
Давайте будем честными, прочная основа в структурах и данных важна для каждого разработчика. Я недавно столкнулся с историей о том, как простое улучшение алгоритма позволило сократить время загрузки для GTA V на 70%, и я по опыту знаю, как эффективная реализация может обеспечить бесперебойную работу приложения даже под нагрузкой.
2) Всегда есть кто-то более знающий, чем вы
Обычно я очень горжусь своим кодом после достижения решения, но эта гордость часто исчезает, когда я читаю раздел комментариев, где иногда можно найти реализации, превосходящие даже официальное решение.
Честно говоря, примерно половина того, что я узнал, работая с Leetcode, я получил благодаря внимательному чтению кода других людей и попыткам самостоятельно реализовать их предложения.
Идея о том, что всегда нужно учиться, еще более актуальна в моей работе, мне повезло, что у меня есть очень опытные Senior-разработчики, которые действительно помогли мне стать лучше, и этот образ мышления — учиться у других — позволил мне усвоить как можно больше их знаний.
3) Пограничные случаи могут испортить вам жизнь
До того, как я начал работать, не было реальной проблемы, если я допускал ошибку в своем коде — она, скорее всего, никогда не проявлялась и ее можно было игнорировать.
Сейчас, когда я работаю в производственной кодовой базе, все совершенно по другому. Тысячи людей взаимодействуют с моей работой, любая ошибка, даже затрагивающая незначительный, пограничный случай, может вылезти наружу и причинить неудобства или даже повредить нашим клиентам.
К счастью, Leetcode — это фантастическая тренировочная площадка, для каждой проблемы есть сотни тестовых примеров, часто включающих любые пограничные случаи, который сломали бы код, если бы их не учли.
Я понял, насколько это фундаментальная проблема, когда недавно мне пришлось работать с базой данных, которая не имела надлежащих ограничений и содержала неожиданные значения во многих строках. К счастью, я смог решить эти проблемы в моем коде, прежде чем они когда-либо стали проблемой в продакшене.
4) Упорная работа побеждает талант…
…Когда талант не работает упорно. Мне нравится эта цитата Тима Нотке, и по моему личному опыту она идеально подходит для Leetcode. Я знаю многих фантастических и очень талантливых разработчиков, которые не могут ответить на самые средние вопросы, потому что они не знают шаблонов и правильных инструментов, не могут использовать надлежащие структуры для решения такого рода вопросов.
Мне было еще хуже, когда я начинал. Я боролся почти с любым простым вопросом, но после прохождения пары курсов по структурам данных и алгоритмам, отработки большого количества простых задач, я смог продвинуться до точки, где я могу решить большинство заданий среднего уровня за разумное время и даже в половине случаев сложные задачи.
У меня было еще одно подтверждение важности практики, когда я недавно переключился с Python на Java для решения вопросов. Хотя я использую Java ежедневно на работе, в этом контексте это совсем не интуитивно, и я не могу решить большинство вопросов без поиска в Google подробностей — прямо как когда я был новичком.
Это не обескуражило меня, теперь я знаю, что при достаточной практике я буду так же хорошо владеть Java, как и Python.
5) Планирование — неотъемлемая часть разработки программного обеспечения
Решая множество задач во время практики и на реальных собеседованиях, я быстро понял, что программирование — это только часть процесса. Написание решения сразу после прочтения задания, вероятно, является худшей ошибкой, которую можно сделать.
Разработка программного обеспечения полна двусмысленностей и неожиданных результатов. В кодинг-интервью часто пытаются воспроизвести это, задавая вопросы, которые являются двусмысленными или неполными. Вам решать, нужно ли спросить у вашего интервьюера и попросить разъяснений и определения возможных ограничений.
Мало того, перед написанием фактического кода вы должны предложить решение, проанализировать его силу и недостатки и начинать программирование только тогда, когда все согласны с тем, что то, ваше предложение приемлемо. Если вы начнете писать что-то, что не удовлетворяет требованиям по времени и пространству, то потом, даже если вы придумаете лучший вариант, будет уже слишком поздно для его реализации.
Это не менее важно в реальной работе: если вы начнете писать код, не анализируя требования и тщательно обдумывая свои возможности, вам, скорее всего, придется переделывать большую часть своей работы.
Заключение
Лично мне повезло, что мне нравится Leetcode, и я не против практиковаться на нем, даже когда не ищу работу, но я знаю многих людей, которым он сильно не нравится и которые утверждают, что он не учит ничему, применимому к реальной работе.
Я надеюсь, что своей статьей я убедил, по крайней мере, некоторых из вас, что это не так и что если вы вынуждены использовать его для подготовки к собеседованиям, по крайней мере, постарайтесь извлечь из этого что-то ценное. А если вы действительно его не используете и он вам не нравится, то есть много вакансий, на которых вам не будут задавать вопросы с Leetcode.
Спасибо, что дочитали до сих пор, не стесняйтесь связываться со мной в Linkedin.