Frontend Dev: хороший, плохой, злой. Часть 1: Хороший путь
Вместо вступления
Похоже каждый доморощенный “гуру” JavaScript должен сделать в своей жизни три вещи:
- Построить DOM-дерево из JavaScript
- Вырастить собственную лучшую библиотеку для решения какой-то задачи
- Написать статью про путь развития в JavaScript
Со вторым пунктом у меня все никак не задалось, поэтому будем выполнять третий.
За 10 лет преподавания я видел много разных разработчиков. Я видел людей, которые схватывали всё на лету и за год становились из плохого trainee хорошим разработчиком. Я видел людей, чей старт в мире программирования был катастрофически долгим, но теперь в некоторых вопросах они для меня пример для подражания. Сегодня, в рамках выполнения своих обещаний для @jsunderhood я попробую изложить свое видение путей становления JS-программиста.
Сразу оговорюсь — я не считаю себя “рок-звездой” от мира программирования. Вряд ли за пределами Украинской тусовки JS мое имя о чем-то говорит, поэтому относитесь ко всему ниже исключительно как к моей точке зрения, которая имеет право на жизнь, но не является однозначно верной.
Хороший путь
Хороший путь предполагает, что у вас всё еще впереди. Что вы не решили “войти в IT” в 30+ лет, а делаете это, ну допустим на 1 курсе университета или ранее. Что Ваша цель — не грести бабло лопатой “здесь и сейчас”, а заложить крепкий фундамент для дальнейшего развития в будущем. Во многом этот путь будет перекликаться с моим личным опытом — знаете как многого бы мог я достичь, не будучи таким ленивым :). Здесь я предполагаю что в начале пути — вы студент технического или околотехнического ВУЗа, владеющий чем-нибудь на уровне школы+ (т.е. сами сидели дома и занимались).
Первый язык программирования
Как ни странно, я абсолютно не уверен что JavaScript — хороший первый язык программирования для неокрепшего ума. Слишком много здесь грязных хаков, “исторически сложившихся” вещей, странного поведения и сложностей там, где им не стоило бы быть.
Я вижу три хороших стартовых языка:
- С. То с чего начинал я. Причем обращу внимание — С++ здесь ничем не хуже, но давайте без всей этой магии шаблонов, unique_ptr и так далее. Я рассматриваю С как отличный дисциплинирующий язык, заставляющий хоть немного понимать как работает фон-Неймановская архитектура и плоская модель памяти (да здравствует арифметика указателей), думать о приведениях типов, и пользоваться отладчиком (в идеале gdb). Добавим к тому, что в любом техническом ВУЗе придется изучать C.
- Python. Как бы ни ругали современный Python по поводу и без — у Гвидо получился превосходный, аккуратный язык, который прямо-таки заставляет “to fall into the pit of success”. Все стандартизировано, понятно как писать, что писать. Очень доброжелательное сообщество и масса материалов в Сети.
- Scheme/LISP. Путь упоротых гуру. Познание функционального программирования неизбежно в мире JavaScript. И чем раньше это произойдет — тем более интересного специалиста мы получим. Готовьтесь на этом пути к непониманию всеми — от однокурсников до преподавателей. Готовьтесь объяснять всем насколько круты эти скобочки и спотыкаться о простейшие задачи
Операционная система
Да простят меня фанаты OS X — я твердо убежден что, ничего лучше Linux для изучения нет и не предвидится. Отсутствие user-friendly интерфейса, проблемы с комплектующими и т.д. — все превращается в плюсы, когда речь идет об обучении. Сложно переоценить те познания об устройстве системы, своих железок и т.д., которые я узнал разбираясь с проблемами с Wi-Fi на своем первом ноутбуке или сколько я узнал об архитектуре модулей ядра пытаясь завести 3G-модем, опять же встроенный в ноутбук.
При этом я советовал бы не брать дружелюбную Ubuntu — как по мне, это худшая версия Windows в мире Linux. Возьмите ArchLinux — одно руководство для новичков на 35+ страниц должно вас серьезнейшим образом впечатлить.
В чем еще один плюс Linux: по прошествии некоторого времени ты привыкаешь думать а не просто гуглить — приблизительно после пары приведений системы в абсолютно нерабочее состояние
Что делать в университете?
Если Вам не повезло и вы не учитесь в MIT или в Stanford — то (простите преподаватели) — худшее что можно сделать — ходить на все занятия в университете. Что никак нельзя пропускать:
- математику во всех её проявлениях — дискретка, теория вероятности, численные методы и т.д. Поверьте — это тот набор знаний, который нужен раз в тысячу лет, но когда нужен — именно он отличает хорошего программиста от посредственного
- общеобразовательные предметы — сходите хотя бы пару раз на все эти историю, культурологию, психологию и т.д. — существует крайне ненулевая вероятность, что предмет будет вести преподаватель способный увлечь, а эти предметы очень хорошо развивают коммуникативные навыки
- программирование на языках которые вы не знаете. Каждый язык (при всех его недостатках) вносит вклад в ваш кругозор
Существует ряд задач, которые вы должны решить в университете.
Первая, конечно же, — максимально прокачать свои навыки в программировании. В моей картине мира нет ничего лучшего чем участие в ACM ICPC. При этом не путайте участие с “олимпиадные задачи я и дома порешать могу”. Во-первых специфика АСМ — один компьютер, три человека — заставляет мыслить “вперед”, учит выполнять свою программу “в уме” не тратя ценнейшее время на работу с отладчиком. Также развивается умение эффективно работать в условиях жесткой нехватки времени, коммуникации в команде и навыки экстремального программирования. Запомните — ваша задача не выиграть что-то, а максимально прокачать свой навык.
Вторая — improve your communication. Общение с компьютером не располагает к коммуникациям. Я для себя эту проблему решал (и решаю) игрой в спортивное Что? Где? Когда?, — заодно расширяя кругозор и развивая навыки мозгового штурма. Тут это далеко не единственный вариант, просто помните что закрываться в своей раковине и осваивать технологии — проигрышная стратегия. Вас обойдут те, кто умеют работать в команде.
Третья — сделать что-то, чем вы будете гордиться и что станет хорошей стартовой позицией на первом в вашей жизни собеседовании. Это может быть победа в олимпиаде, блог или хороший pet-project. Просто не тратьте время зря. Делайте то, чем вы будете гордиться.
И да — если у вас проблемы с английским, все свободное время инвестируйте туда. Самый простой способ повысить свою привлекательность на рынке труда.
Первая работа
Цель Вашей первой работы — не максимизировать прибыль в единицу времени. Вам нужно найти такое место, где с Вами будут возиться, вы будете получать кодревью вашего кода и новые знания. Фактически — вы должны искать себе ментора, так, чтобы вам еще за ваш труд немного платили. Если говорить о том, что вы должны уметь к моменту поиска первой работы, давайте составим краткий список:
- английский. Чем лучше тем лучше.
- git. Помним: работаем в команде.
- базовые паттерны, типа MVC и MVVM
- современную верстку (HTML5, CSS3, flexbox). Незнание “хаков” для старых браузеров вам простят, а вот ваша незаинтересованность современными подходами вызовет вопросы
- хотя бы 2–3 примера кода на вашем-любимом-фреймворке (сюда отлично ложаться курсовые работы — вот и повод делать их не на “отвали”, а так чтобы было не стыдно показать ни в университете ни при собеседовании
И еще — самое, наверное, сложное. Постарайтесь попасть в команду, которая начинает работу над новым проектом. Новичков любят отправлять на поддержку старых/существующих систем, которые представляют собой тонну старого, малопонятного и опасного кода. Бегите оттуда — иначе навсегда застрянете
Что дальше?
Как владелец небольшой компании сообщу вам малоприятную истину. В большинстве своем, работа не должна развивать Вас. Бизнес ожидает, что платит деньги за то, что вы уже знаете и умеете, а не за профессиональный рост. Поэтому единственный путь развития на начальном этапе: самостоятельный рост после работы.
Сейчас меня совсем совсем начнут ругать, но я считаю крайне полезным после работы тратить свое личное время, для приведения рабочего кода в удобоваримый вид. С одной стороны — да, вы делаете что-то, за что по-хорошему компании следовало бы заплатить.
Но, давайте посмотрим на это с другой стороны:
- Вы сам себе хозяин. Вы можете улучшать те куски кода, на рефакторинг которых Вам бы никогда не дали времени;
- Вы улучшаете сами себе жизнь — куда приятней работать с кодовой базой, которую вы знаете и сами же проработали, чем с “говнокодом”;
- Вы решаете одну из основных проблем самообучения и саморазвития — синтентичность применяемых знаний. Т.е. “ну потыкал я что-то — вроде норм”, а до коммерческого применения дело не дошло
Замечу, что Вам понадобится доля везения. Существует вероятность, что Ваша команда будет категорически против всех нововведений (эдакие ретрограды). Тогда остается уходить в партизаны.
Начиная с первой работы ищите конференции по вашей специализации. К 3–5 посещению готовьтесь выступить. Выступление на конференции — это путь к большим job offer’ам, знакомству с людьми в самом сердце community и новым мыслям. Помните — никто не ездит на конференции только ради докладов. Самое важное — это нетворкинг.
Не подвергайтесь хайпу. Постарайтесь стать профессионалом в той технолгии, с которой Вы сейчас работаете. В то же время помните что то что вы выбрали — не является самым лучшим только потому, что это выбрали именно вы.
Продолжайте изучать другие технологии. Вот примерно список интересов:
- Rust — как лучшую версию C++
- D — как еще одну лучшую версию С++
- Elm / ClosureScript — как способ офункционаливания своих мыслей
- Java — как язык, который за что-то выбрал Enterprise. Ведь миллионы леммингов не могут ошибаться.
Что мы имеем на выходе
На выходе мы должны получить специалиста, который хорошо знает “свое родное окружение”, умеет настроить сервер (минимальные познания в том, что модно называть сейчас словом DevOps), способен подебажить бинарный модуль для ноды, и если придется написать простенький плагин для React Native под андроид — это не станет для него проблемой.
У Лукьяненко (давайте не путать нынешнего Лукьяненко с ранним Лукьяненко) есть восхитительная дилогия “Звезды — холодные игрушки”, через которую красной нитью проведена идея что узкая специализация — есть зло и путь в никуда. Специалист, развивающийся по хорошему пути не боится прихода Dart’а (Вейдера), победы WebAssembly над JavaScript (не будет) или смены Angular на Angular2.
В следующей заметке мы поговорим о “плохом” пути развития — направленном на взлом “системы” грейдов в аутсорсе, максимизацию собственной прибыли, и как потом латать дыры в своем обучении