Сезоны вайтишника. Зима и весна
Они не имеют никакого отношения к ватникам. Это вайтишники — те, кто не побоялся полностью изменить свою жизнь и «войти в айти».
Кадр: фильм «Весна, лето, осень, зима... и снова весна»
Лев Кудряшов
об эксперте
Ведущий инженер-разработчик в «Билайне». Стек — Java, Python. Специализация — бэкенд. Есть публикации на «Хабре». Практикует переход сервисов с Java на Kotlin. Ненавидит Microsoft.
Сейчас интересные времена, правда? Мы даже не заметили того странного перехода, когда успешный мужчина в красивом дорогом костюме и с начищенной до блеска обувью, выходящий из шикарного чёрного «мерседеса», стал казаться колхозником и бомжом на фоне парня, который катится с работы на электросамокате в неприглядном худи и в растянутой любимой футболке со смешным принтом. А дома его ждёт pet project.
Новые герои и реквием по девяностым
Девяностые с бумом на юристов и «решал» разных мастей давно прошли, и трудно даже представить, что вокруг них вообще был ажиотаж. Хотя мой старший брат с юридическим образованием из поколения Х является живым подтверждением того, что всё это было наяву.
Пришло время поколения Y и Z. Так забавно наблюдать, что каждому времени достаются не только свои политика, культура и экономика, но и настоящие тренды на профессии.
И вот на смену юристам пришло нечто зловещее, жадное до денег, поглощающее каждого, разъедающее умы подростков и студентов: Information Technologies. Конечно, «решатели вопросиков» всё ещё нужны — юристы не стали бесполезными в одночасье, — однако их песенка уже спета и слава им не грозит. Да, чёртова конкуренция в мире капитализма беспощадна.
А вокруг IT теперь сложился самый настоящий культ, и как на дрожжах растут самые разные профессии: SWE, SET, PM, SRE, Web Designer, SA, DevOps, SecOps, DevSecOps, QA, SEO, SMM, DBA, Drum&Bass, БДСМ и другие зубодробительные сокращения. И профессии эти поглощают всех подряд, решая текущие проблемы, но порождая новые и выдавливая деньги буквально из воздуха: например, когда появился DevOps, стало понятно, что нужны люди, которые бы связывали разработку, эксплуатацию и DevOps, гарантируя надёжность сервисов. Так появилось направление SRE. А ведь изначально мы просто хотели играть в свои игрушки на стареньком пузатом мониторе и мечтали, чтобы нас никто никогда не трогал.
Главный вопрос современности
Несмотря на неспадающий ажиотаж вокруг IT, многие люди так и не смогли найти ответ на главный вопрос: «Как вкатиться, с чего начать?» За это время он успел обрасти миллионами историй успеха, тысячами методик — от простых до самых сложных и изощрённых, тоннами вранья и ложных убеждений, бесконечными холиварами и битвами религиозных фанатиков от технологий. И даже появилась целая индустрия по отработке узких запросов:
- Как начать, если тебе 40 лет?
- Как быть гуманитариям?
- Я медик, мне можно вкатиться?
- У меня нет специального образования, помогите!
- А можно быть в IT и не программировать?
- И прям обязательно быть душным?
Эти проклятые вопросы породили ещё более сумасшедшее явление: образовательные платформы с курсами, IT-блогеров с неиссякающими интервью, крутыми подкастами (привет всем homies из чата «Мы обречены»), «Хабр», ЖЖ, телеграм-каналы, паблики в VK, статьи, подобные этим. А ещё словно грибы после дождя тут и там появляются новые локальные короли, rock stars и лидеры мнений. Инфополе гудит, а деньги зарабатывают даже те, кто просто рассказывает, как жить в современных реалиях.
Но мы с вами ребята непростые и хотим сразу ухватить всю суть: на чём программировать, чтобы познать IT? Когда-то с этого вопроса начинали все нынешние кодеры, и он же волнует умы вайтишников прямо сейчас.
Я подробно расскажу и прокомментирую весь свой путь вкатывания в индустрию. Будет много личного опыта, работа над ошибками и понимание того, как можно было бы ускорить процессы, будь я мудрее и сообразительнее.
Сейчас я умеренный трудоголик, люблю свою профессию и увлечён технологиями, пишу код в продакшен уже лет десять, неплохо зарабатываю, провожу собеседования для кандидатов разных грейдов — от джунов до сеньоров и архитекторов.
Кроме того, я наелся говна в веб-студии, аутсорс-компании (галере), неповоротливых бюрократических организациях, побывал в банке с бирюзовым типом менеджмента и везде смог оставить после себя крутые фичи, архитектурные заготовки, создавал внутренние микрокомьюнити. На протяжении всего своего пути в IT я делал то, что мне приносило удовольствие, а самое главное — непрерывно рос над собой. Итак, поехали.
Зима
Всё получилось не сразу — и даже не с десятого раза. Я достаточно упрямый, а потому упорно пытался въехать в IT не так, как стоило бы.
Хочешь знать, откуда эти шрамы? Просто я начинал кодить на С++. Как говорится, попало и по колену и за щеку. И да, я не буду считать своими первыми языками программирования Delphi и Visual Basic из школьной программы информатики: тогда у меня не было энтузиазма их изучать по методичке с практически с готовым решением всех задач, в которых всего-то надо было чутка поменять местами куски кода.
И это моя первая ошибка: будь я умнее — цеплялся бы за любую возможность научиться даже дельфям на WinForms. Вместо этого я капризничал и плевался. В 15–17 лет мне было интереснее запустить сервак с CS 1.6 и рубиться на нём с пацанами из моего двора, поставить винду рандомным людям в обмен на какие-нибудь плюшки, чуточку помочь брату настроить аппаратуру. Да, мне было интереснее не работать с тенями и каким-то абстрактным заданием из методички, а пилить реальные, осязаемые вещи, которые несут хоть какую-то пользу обществу и мне самому.
Поэтому, когда на аналогичном этапе, без технического вуза за спиной вы вдруг встретите душного сеньора, который посоветует вам сразу же идти в LeetCode и Yandex.Contest, учить структуры данных или пытаться понять алгоритм Дейкстры, передайте ему моё пламенное: «Пошёл ты на хрен, козёл!»
Это так не работает — даже у тех, кто учится в вузе на айтишника. Вам никак не поможет вкатиться в индустрию прагматичное «учи матчасть и то, что спрашивают на собесах, как Библию; зубри все алгоритмы сортировки, а потом с ноги залетай в ООП-паттерны банды четырёх».
Этот совет вообще пригодится далеко не каждому — скорее он справедлив лишь для предрасположенных к этому технарей, которые понимают хотя бы кривые формулки из «Википедии», или для уже познавших рутину джунов.
Если же вы ребята попроще: пришли пощупать код после школы, из другой профессии или из околопрограммистских специальностей типа эникейного системного администрирования, менеджмента, хайринга, дизайна — вам понадобится более элегантный подход. Вам нужны проблема и конфликт, которые надо решить с помощью кода и минимальной теоретической базы.
Так говорила моя университетская преподавательница, которая вела курс по Delphi. Она была не робкого десятка, параллельно с вузом работала в R&D-лабораториях EPAM Systems, а потому взяла и показала нам С++. И подмигнула — мол, лабы по Delphi на плюсах тоже принимаются.
Я умел гуглить и быстро понял, что C++ — язык уважаемый, на нём пишут движки для игр, контроллеры и поисковые системы. То есть понял: плюсы — это актуально и очень круто. Глаза загорелись, но энтузиазм угас уже на попытке запустить плюсы под виндой — это была палка в колёсах моего велосипеда, несущего меня в прекрасное IT.
Я не понимал ни того, как работают циклы, ни того, как правильно использовать условия, — да что там, я даже путал слова и определения на ровном месте: называл ссылки переменными, а переменные — значениями. Постоянно мигающая красными и жёлтыми буквами Visual Studio 2010 с кучей функций просто пугала меня до усрачки и отбивала всякое желание кодить. Вот такой я был — не очень умный и слабый.
В какой-то момент мне стало очень обидно, что Акела промахнулся в выборе профессии. Я со страхом наблюдал, как мой одногруппник, который пришёл в универ после технического лицея, просто берёт и хреначит 3D-игры в Unity и щёлкает задачи по комбинаторике вообще без гугла, а на другом конце аудитории сидела девушка и ставила на свой ноут Debian. А ещё все умели играть на гитаре. А я не умел. И чувствовал себя убогим, тупым, совершенно негодным для профессии.
Благо зависть и стремление биться за любую возможность сделать хоть что-то не позволили мне забрать документы или скатывать домашки у одногруппников. Нет, я сидел и пытался сам во всём разобраться: зачитывал методички к лабам до дыр, пока не начинал понимать каждое слово, пока не прорешивал каждый шаг вручную.
А задачи были такие: «Посчитайте сумму N элементов с шагом 2 и начальным значением 3». Причём с точки зрения математики я всё понимал и мог, а вот с точки зрения алгоритмов и языков программирования — ни черта. Код с решением из гугла я не понимал вообще — он лежал на форумах без комментариев «для тупых», так что я сидел и изучал каждый фрагмент готового решения и стеснялся обратиться за помощью к одногруппникам.
Обычный цикл i=3; while i <= N {sum+=i; i+=2} (я реально запарился и нашёл этот код в сохранённых файлах с отчётами по лабораторным работам) стоил мне двух часов мучений. Потом ко второй лабе случилось маленькое чудо: нам показали, что такое блок-схемы. Я начал ими оперировать, думать с их помощью, прописывать каждый шаг — кряхтя и тужась. И даже достиг в них мастерства. Меня хвалила преподавательница, и тут я понял — буду рисовать все эти штуки, пока не сдохну.
Кстати, я до сих пор представляю условия ромбиками, циклы — вытянутыми шестиугольниками, а операции — прямоугольниками. Я держался за это графическое представление всеми силами, потому что оно оставалось моим единственным интерфейсом для проектирования кода. Со временем я даже нашёл забавные статьи с блок-схемами, возле которых был написан код: я мэтчил каждую стрелочку и форму с кодом, а в соседних окнах открывал справочник по операторам блок-схем и табличку с ключевыми словами и операторами С++.
Я уже смотрел не только плюсы: сравнивал и JS, и Java, и С#, и чистый C — уже тогда мне стало понятно, что у этих языков похожий синтаксис. Я наконец-то смог сдать вторую после подсчёта сумм лабораторку на плюсах с чёртовыми строками. Одногруппник из техлицея к тому моменту уже сдал шестую лабу с транспонированием матриц.
Но мне уже было насрать — я включил режим соревнований: не спал, постоянно пытался мэтчить блоки, языки и математику и просто выдраконивать это всё. Круглосуточно. С каждым сраным кликом побеждая Visual Studio и грёбаный компилятор.
Из-за этого у меня сбился сон, я клевал носом на лекциях, не мог подрабатывать официантом, похерил все тренировки, начал чувствовать моральное истощение и пристрастился к алкоголю. Запомните: стресс — это мощный катализатор, который заставляет удалять себя из этого мира. А алкоголь только потворствует депрессии. Мне было 18, поэтому я прощаю себе тот период и свои нелогичные поступки.
Итоги зимы
Попытайтесь найти самый лёгкий и понятный для вас способ узнать больше и сделать больше. Если вам встретилась сложная задача, пытайтесь искать доступные для понимания литературу и разборы решений. Ничего нет зазорного в чтении туториалов «для чайников». А вот прочитать профессиональный конспект с кучей непонятных слов, ничего из него не понять и пойти копипастить готовые решения со Stack Overflow — точно зазорно и бессмысленно. Лучше уж сразу попытаться вникнуть в решение и не торопиться, ведь эти знания пригодятся в дальнейшем.
Чем сложнее инфраструктура языка программирования и больше разных вариантов запуска, тем труднее будет вкатиться в технологию. И наоборот: чем строже типизация в языке, чем популярнее его синтаксис и чем меньше возможность напороться на рантайм-ошибки (то есть чем меньше у вас шанс ошибиться и чем сильнее вас корректируют сам компилятор и статический анализатор кода), тем проще вам будет изучить технологию и не бросить её по пути. В итоге С++ оказался так себе выбором для вкатывания с нуля: каноничнее смотрелся бы обычный С или С# для программирования маленьких задачек. А плюсы подкидывали немало проблем для новичков. Так что шлите на хрен людей, которые продают вам этот язык в качестве первого языка программирования.
Лучше, когда вокруг вас есть люди с похожим уровнем и проблемами. Так вы не будете стесняться друг друга, меньше пострадаете от синдрома самозванца, а обучение пойдёт гораздо быстрее, потому что вы будете делиться опытом и пониманием. Если же вас окружают люди, которые уже познали вселенную программирования, пришли к успешному успеху, крутят бинарные деревья в плюсах и оси координат кодом в Unity, а в это время вы только-только поняли, как работать с циклами, это может демотивировать, вызвать зависть и агрессию.
Лишь немногие в такой ситуации будут действовать правильно: пойдут и попросят помощи. И вы не стесняйтесь — гордость, упёртость и зависть только стопорили моё вкатывание в индустрию. А ведь я бы мог ускориться простой просьбой: «Лёха, брат, помоги, пожалуйста, с лабой — я не понимаю, чего от меня хотят».
Но нет — я краснел, пыхтел и упёрся в то, что мне не нужна ничья помощь. Хотел догнать того самого Лёху своими силами, тратя бесконечные часы на самостоятельное погружение. Это было критической ошибкой, которую я осознал только спустя время.
Параллельно изучайте алгоритмы и структуры данных, синтаксис языка и предметную область, а также методы переноса математической модели в код. У меня была сложная для новичка задачка — и я просто не знал, как это всё связать без блок-схем «для самых маленьких». Да, тогда ещё не было системы Scratch — я с удивлением узнал о ней, когда уже был крепким мидлом.
В общем, если душные сеньоры и прогрессивные джуны не помогли вам по части кода и алгоритмов на начальных этапах, попробуйте Scratch. Он бы легко решил мою проблему вкатывания — причём ещё более продуктивно, чем блок-схемы.
А о бесплатных курсах CS50 на YouTube я тем более не знал. Они мне открылись только в магистратуре, когда я уже был мидло-сеньором. Но даже тогда я всё равно посмотрел их — и офигел, насколько круто представлены эти курсы. Обязательно к просмотру.
Весна
Прошёл год на плюсах. Я написал крутой для своего уровня курсач, где я вручную реализовал обыкновенную структуру данных — очередь. А мой соратник по вкатыванию реализовал стек. Мы с ним адово выносили друг другу мозг, чтобы познать истину структур и добиться работоспособности своего кода.
Дошло до того, что мы ради фана начали писать маленькие экзешники — просто чтобы работать с файлами и папками на домашнем компе. А я постепенно начинал понимать, что у меня на кончиках пальцев — целый мир, а с помощью программирования можно сделать абсолютно всё, что взбредёт в мою больную голову. Например, как-то раз я заставил программу чистить папку загрузок «Агента Mail.ru», где в основном лежали файлы, которые люди отправляли друг другу в личных сообщениях. Первого апреля несколько человек даже умудрились пострадать от моей диверсии :D Можно считать это моим первым пет-проектом.
Когда я читал Страуструпа, указатели и ссылки мне не показались сложными. Я спокойно писал деструкторы, понимал, как работает память: благо начало нулевых, проведённое за компом с оперативкой в 256 мегабайт, заложили простую и очевидную мысль — память надо беречь: делать крутое, а не крутое не делать. А вот с основными принципами адресации оперативной памяти я был знаком только в общих чертах.
Когда ты сам трогаешь железку и знаешь, для чего она нужна, — легче понимать более высокие уровни абстракции. Хотя и странно это слышать от человека, который за год до этого озарения даже толком не мог объявить переменные.
Однако я всё-таки не был совсем уж нулевым — ещё в школе научился полноценно конфигурировать виндовые системы: расставлять нужные флажки, прописывать реестры, читать и разбирать логи. Так что навык копания в бездарной операционке от Microsoft помог стать сильнее и без страха самостоятельно ковыряться везде, где только можно.
Правда, на такой самостоятельный пердолинг уходило очень много времени — целые месяцы. А ведь параллельно в универе меня душили кучей бесполезных предметов типа политологии и философии. И вот я сидел и тратил время на каждую лабу: надо было вникнуть в задачу, найти решение, оформить все документы так, чтобы пройти нормоконтроль.
При этом образ жизни у меня был вполне себе студенческим: друзья не из IT, спорт, продажа стихов с оплатой на WebMoney, сведение звуковых дорожек на студии за деньги. Ах да, по выходным я крутил гайки в автосервисе отца.
Однако программирование я считал просто своим хобби и не видел в нём перспектив: жил-то я в Казахстане и кодил на плюсах. А там толком не было цифровых сервисов и услуг — разве что EPAM. Так что в то время проще было было сесть на тёпленькое местечко в госсекторе, чем входить в IT.
И вновь меня спасла Ирина Валентиновна. В рамках курса по ООП она показала презентацию со сравнительными характеристиками С++ и Java, рассказала, как этот самый Java используют ребята в EPAM, и требовала пройти производственную практику. И у меня было два пути:
- Просто подписать бумажки о прохождении практики у брата, поставить печать его ТОО, формально заполнить отчётную работу и жить себе припеваючи.
- Быть честным: уговорить преподавателя взять меня в EPAM на стажировку и проходить практику там.
Я выбрал второй вариант — и до сих пор считаю, что не прогадал. В итоге мне предложили пойти в R&D-лабораторию, доступ в которую открывался после тестового проекта и курсов. Кстати, все мои одногруппники тоже решили устроиться в EPAM.
Я написал кривое письмо и сумбурное CV, сгорая от неуверенности в себе. Плюс ко всему одним из отборочных этапов для стажёров было собеседование по основам ООП — на английском! Конечно, я боялся, потому что по-английски я мог без ошибок только подпевать песням Linkin Park. Пришлось срочно повторять все темы по кодингу, изучать основные концепции ООП и пытаться потестить и попробовать всё это в деле — на плюсах, потому что Java я ещё практически не знал.
К счастью, мой первый собес в IT прошёл хорошо. Оказалось, что у меня к себе требований было гораздо больше, чем у них ко мне, а ровно стелить и коммуницировать я всё-таки умею. В конце концов, я вполне себе обычный нормис, а не задроченный замкнутый гений.
На собеседовании я сделал удивительное открытие: чёрт возьми, какими бы сложными ни были технология и теория, по ним тебя гоняют люди, а люди чувствуют, когда ты что-то можешь, что-то помнишь, чего-то хочешь добиться и приходишь к ним с горящими глазами и засученными рукавами. Таких кандидатов любят — забирают с любым опытом и пытаются накачать всем, чего они хотят.
Конечно же, я прекрасно понимал: на одной лишь мотивации и умении ровно стелить в индустрии не поднимешься. А потому основательно засел за Java — он меня подкупил своей универсальностью: с ним можно идти в веб, работу с данными, мобильные и десктопные приложения — в общем, писать что угодно. Java будет работать практически везде.
Как по мне, с плюсов на Java переходить не больно. В то время я ещё не присоединялся к религиям в языках программирования, просто по наитию выбирал из того, что давали на работе или в универе, и кодил на том, что можно было постичь.
Кстати, Java у меня начался в NetBeans (ещё одна сложная инфраструктура!) и, к сожалению, на Windows. Универ в Казахстане мне явно не давал выбора: всё было обмазано сраным майкрософтом вдоль и поперёк. Хотя и в российских вузах не лучше.
В EPAM был выбор между C# и Java — эти стеки мне показались очень похожими (да это и правда так). Но в пользу Java были мультиплатформенность, популярность и веб-сервер от Apache — а он внушал мне больше доверия, чем замкнутый язык для одной платформы с IIS (который бесил ещё со школы, когда я его крутил, чтобы пошэрить сраную аштиэмэльку). Плюс меня вымораживал официальный сайт Microsoft, где можно было прочитать про C#. Было ощущение, что мне просто набрасывают говна в глаза.
К тому же я уже начал засматриваться на Linux — гонял его на виртуальных машинах (хотя и без особых успехов). К тому моменту мне действительно начало казаться, что в MS-приложениях пахнет нафталином и затхлостью. Особенно ярко это было видно на контрасте между IntelliJ IDEA и Visual Studio 2013 года. Конечно, приз зрительских симпатий достался продукту от братишек из Петербурга. Да и с книгой «Java. Промышленное программирование» И. Н. Блинова, основателя EPAM Systems, я не расставался. Так что для меня выбор был очевиден.
Итоги весны
В период зимы я советовал слать подальше душного сеньора с его структурами, алгоритмами, ООП и моделью SOLID. И на тот момент это было справедливо — ведь мы даже циклы не умели адекватно придумать. Теперь же мы поизучали сети, попробовали проектировать БД и потестили SQL, узнали, как работает веб, какими стандартами данных можно обкидать мобильное приложение с сервера и чем это всё парсить, заставили что-то работать и давать нам дружелюбный зелёный цвет собранного билда. А значит, пора прислушаться к душному сеньору и закопаться в сложные абстракции и шаблоны проектирования GoF, посмеяться над своим же старым кодом, попробовать переписать его по уже изученным методикам, посчитать алгоритмическую сложность. На этом же этапе уже стоит открывать LeetCode и решать задачи. В этой точке мы стали настоящими джунами, которые уже могут написать что-то рабочее и полезное.
Стоит ли выбирать Java в качестве первого языка программирования? Думаю, что да. Java проще C++ и универсальнее C#. Java становится зубодробительным, когда пишешь более сложные штуки и всё сильнее погружаешься в язык, — но это со временем, а основы языка вполне можно изучить самостоятельно.
Стоит ли выбирать C# в качестве первого языка программирования? Думаю, что да. Но только если вы любите компанию Microsoft или безразличны к её продуктам. Плюс C# — в коробочных решениях. Однако творчество и гибкость в этой экосистеме сильно ограничены — вы, скорее всего, будете страдать и городить такие нелепые джуновские костыли, которые вам никто не простит.
Я уверен, что оставаться на этом коробочном стеке, если у вас уже что-то получилось слёту и есть возможность решать важные для бизнеса задачи, — отличная идея. Со временем у вас будет хорошо расти зарплата, вы начнёте менять компании и приумножать свой опыт и скиллы, углубляться в тему. Да и Microsoft сейчас встала на путь пушистого зайчика, который хочет в Open Source, покупает всё подряд и катает кроссплатформу. Очухались спустя 7 лет, грёбаные умники.