Эта статья - история моей карьеры. Я не уверен, есть ли тут хоть какая-либо ценность для сообщества, но возможно кто-то узнает в какой-либо части истории себя, и, опять же, возможно какие-то моменты помогут ему проанализировать свою карьеру и не повторить моих ошибок. В общем - это история тридцатилетнего разработчика-недоучки с раздутым самомнением, который наконец осознал, что вся та исключительность, про которую ему намекали и в которую он свято верил - это точно не про него.
P.S. Извиняюсь за кликбейтный заголовок, но, мне кажется, он лучше всего описывает содержание этой статьи.
P.P.S. Очень много текста внутри.
Я в школе обожал математику. Старался не пропускать ни одной олимпиады, любил решать задачки со звездочкой. Я не был ни самым лучшим в классе, ни ботаном, я был сильно ленив, но вот математика… про меня говорили - «с математическим складом ума», и я гордился этим.
Моя история программирования началась с паскаля на уроке информатики, а затем и создания сайтов для мобилок прямо со старой нокии, сидя на задней парте на неинтересных уроках. Я еще не считал себя программистом, и не представлял, что я буду зарабатывать этим на жизнь, мне просто нравилось творить. Но уже тогда в моей голове начало формироваться эго «исключительного». Я даже затребовал поменять один выпускной экзамен с гуманитарного на информатику. Так как это был если не беспрецедентный, то крайне редкий случай, школьное руководство покумекало, и выдало мне на экзамене первый, самый легкий билет, скорее всего чтобы не облажаться перед начальством, если я вдруг завалю экзамен. Тогда я этого не осознавал, а лишь еще раз убедился в том что я супермозг, получив самую высокую оценку на этом экзамене.
Затем был универ, дикая вещь, когда ты супер ленив, а унылый лектор умудрился заставить меня возненавидеть даже любимую в школе математику. Попутно я пытался фрилансить на PHP, особо денег не приносило, но появился опыт. Учился программировать «на ходу», просто копипастя готовые куски кода из популярной мобильной CMS, и методом научного тыка подгоняя код под свои задачи. Зато сайты, сделанные на коленке, начали приносить огромный доход на арбитраже трафика. А когда у тебя по карманам и полкам рассованы пачки денег, а тебе всего 19 лет - самомнение летит вверх с головокружительной скоростью.
Зимой, на втором курсе я получил свою первую работу. Там оказалось, что я очень многого не знаю про PHP, практически ничего про базы данных. Мне и тройке моих коллег читали лекции и давали практические задания первые пару месяцев, хотя по началу даже никто не говорил, что это стажировка. В общем меня научили всем азам «формошлепа», крудодела, и, немного, БД оптимизатора (всё таки джойны быстрее, чем много запросов в цикле. Я только пару дней назад узнал, что по-человечески это называется проблемой N+1). Ну, и, куда ж без этого - после пары месяцев организовали отделение зерен от плевел. Я попал в «зерна», и остался работать, еще один плюсик к самомнению. Работа давалась легко, я просто шлепал формы, писал завернутые запросы в бд на получение статистики, выполнял и перевыполнял планы и получал солидные премии. Попутно нас кормили за счет работодателя, и мы умудрялись ежедневно пропадать на пару-тройку часов, разъезжая по всеразличным ресторанам города на казенные деньги.
Так прошли 2,5 года. Вспоминая себя - я понимаю, что я мог бы до сих пор там работать, и считать себя хорошим разработчиком. Ну а как понять что ты плохой? Работу выполняю быстро, вроде бы качественно, в срок, точнее обычно - раньше срока. Кругом хвалят, премии дают. В свободное время я делал множество пет-проектов, от сайтов и андроид-приложений до скрипта на питоне, отслеживающего сообщения в скайпе, и звонящего на мобилку, если кто-то зовет всех курить.
Да, я видел, что разработка на Java, Java-Android и C++ мне дается с болью (обычно на этапе дебага, когда что-то ломается, но ты абсолютно не понимаешь что, и как это исправить, ох уж эти Null Pointer Exception). Но я списывал все на то, что «яж PHP программист», а на Java пишут серьезные, умные дядьки. И уже поздно полностью разбираться с нуля в новом языке. Фатальная ошибка. Правда, я и сейчас плохо представляю, как можно стать профи в языке, имея только небольшие пет-проекты, без постоянных рабочих задач на этом же языке.
К тому времени универ был благополучно заброшен, из-за вовремя не сданных лаб я получил недопуск к сессии и был благополучно отчислен.
Затем грянул кризис 2014 года, и мои «внушительные» $1400 превратились в смешные $800. Это был хороший пинок для смены работы, и мне снова «повезло». Или повезло (без кавычек), тут я до сих пор не уверен. Меня взяли в компанию, занимающуюся разработкой модулей под популярную CMS. Забыл упомянуть, что на предыдущем месте работы практически весь код был написан в процедурном (или функциональном, до сих пор не могу запомнить разницу, да-да), стиле. Сейчас смешно, как я слушал рассказы более опытного разработчика про ООП, и искренне не понимал, зачем мне объединять мои функции в какие-то классы. Правда на момент перехода я всё-таки немного разобрался в ООП, и даже имел за плечами пару пет-проектов на Yii.
Так вот. В новой CMS все было ООПшно, миллионы строк кода, сотни тысяч классов и огромный функционал. Мне провели небольшую лекцию на предмет «где что лежит и как оно с большего работает» и дали задачу написать простенький модуль. Это был ад. Первые три месяца я пытался грызть гранит новой CMS, нырять глубже, дебажить, но все равно работа продвигалась дико медленно. На фоне этого я словил нехилый депрессняк, и начал прятаться в туалете, играя в игрушки на телефоне, за что получил сильный нагоняй от начальства. Моя вера в свои способности сильно пошатнулась, и сейчас я понимаю, что на самом деле это был хороший пинок для меня. Но шли месяцы, я разбирался в коде все больше и больше, стал экспертом и мое эго снова вернулось на место. Как же, я могу сделать любую задачу, опять работаю быстро, начальство сыпет похвалами и премиями. Мне всего 23, куплена новенькая машина с салона, жизнь играет красками. Решил походить по собеседованиям, там тоже никто меня не огорчал а выдали оффер на +500$ от моей текущей зп. На радостях побежал увольняться, но вдруг оказалось, что я суперценный специалист, стою еще больше, и в довесок курсы английского тет-а-тет с преподавателем. Ну как тут не поверить в свою топовость?
И снова череда формошлепства с небольшими усложнениями, какими-то интеграциями, и другими простыми задачами. Конечно, пет-проекты. Я все еще считаю пет-проекты благом, позволяющим расти, но моя проблема была в том, что я взращивал свое эго от мысли «я могу в разные фреймворки». Да что там, я даже немного могу в разные языки. Покопипастить с примеров и поизменять, чтоб оно работало как мне нужно, ага, великий программист.
Потом меня перетянул в стартапчик коллега, который меня там неплохо разрекламировал (до сих пор не понимаю, почему он, человек, который смог сменить стек, с огромным опытом, знаниями и пониманием сложных для меня вещей считал меня отличным, умным программистом). Новая лычка Senior Developer, новый фреймворк Phalcon, в который я даже контрибьютил, хотя ядро написано на другом языке. Вот, я могу, я крут. Еще один эпизод с собесами, оффером, и перебитием оффера от текущего работодателя. ЗП растет не по дням а по часам! Да я просто, мать его, гений!
Стартап развалился через год, пошел в аутсорс на год, опять эпизод с собесом, оффером, перебитием. Ушел в еще один стартап, опять развал. Вдруг прилетает предложение с моей второй работы. Техлид и куча денег. Попутно сходил еще на пару собесов. Примечателен один, по результатам которого злой красный интервьюер выдал «я не вижу тут синьора, максимум могу предложить работу джуна на $1500». Но они ведь просто мудаки, правда? Хотя, отчасти, я до сих пор так считаю, т.к. незнание всего-лишь основных настроек nginx, которые по сути легко гуглятся, не делает из человека джуна. Ну хотяб мидла-то я заслужил? Но на этом моменте, наверное, стоило остановиться и задуматься, что я делаю в этой жизни не так. Но новая лычка, куча денег и раздутое эго затуманили мой разум настолько, что я быстренько побежал устраиваться обратно. К тому времени я считал себя уже SOLIDным ООП гуру, мог строить суперархитектуры из фабрик, прокси, декораторов и сервисов, презирал switch-case и вообще считал себя достигшим потолка в PHP разработке.
Где-то в этом промежутке была пара примечательных собеседований. В Playtika мне отлично показали, что я сильно плаваю в солид, а в Viber - что высоконагруженные проекты и DDD для меня темный лес. Но я ведь просто с этим не работал в реальной жизни, чего париться? Не взяли и не взяли.
Первым большим потрясением было собеседование в Badoo. Они раньше ежегодно проводили hiring event, в котором ты решаешь алгоритмические задачки на время. У меня получалось хорошо, задачки казались довольно сложными (как оказалось в последствии - задачки-то были - easy уровня leetcode). Меня позвали в Москву, с оплатой проезда, на очное интервью. Для меня это звучало как будто я избранный. И вот, в окружении трех серьезных бородатых дядек я сижу и пыхчу над задачей «есть огромный файл с доменами, нужно получить их айпишники». И я понимаю, что я полный профан. Нет, прочитать файл и сделать запрос на dns, а затем записать - тривиальная задача. Но как посчитать, сколько процессов скрипта оптимально запустить на восьмиядерном сервере? Как ответить менеджеру, сколько времени уйдет на работу скрипта? Как быстро идут запросы? Казалось бы, причем тут скорость света, да? Когда попросили построить график «количество процессов от скорости выполнения», тут я окончательно поплыл (привет, математика). Вот тут, был еще один момент, когда стоило сесть и хорошенько задуматься над тем, куда я все-таки двигаюсь, но я просто полетел обратно, по-техлидски снисходительно объяснять мидлам, почему не стоит в одном классе мешать данные и логику. А Badoo - ну я же не сталкиваюсь с такими задачами в жизни, ну и ладно.
Затем был переезд в Штаты, и тут со всех сторон на меня полились ушаты холодной воды, отрезвляя и заставляя включать думалку. Собесы в FAANG, и фангоподобные компании. Зайдя на leetcode - я осознал, что моей думалки хватает только на самостоятельное решение easy, ну в некоторых случаях, со скрипом в часа два, medium задач. Что существуют, казалось бы, простые алгоритмы, вроде sliding window, до которых я вообще не факт что додумался бы сам, даже спустя недели/месяцы обдумывания. Что есть графы. Тот, кто говорит, что меню сайта - это хороший пример графа - мудак. Не потому, что это неправда, а потому что для формошлепа типа меня это означает «меню построил - графы знаешь». А это не так. В итоге я получил пинок практически ото всех крупных компаний и стартапов. И осознал - я, разработчик с практически 12 летним опытом за плечами - простой формошлеп. Да, еще есть время наверстать упущенное, но тогда, в 20, в самом начале, это сделать было проще и эффективнее.
Глядя на мой опыт ретроспективно, я понял, что наделал ошибок. И сейчас я постараюсь сформулировать их в надежде, что кому-то это поможет не повторить их.
Универ. Я все еще считаю, что это не панацея, и во всем можно разобраться самому, но ведь гораздо проще внимать знания от кого-то, дергать преподавателя на предмет объяснения непонятного, брать дополнительные задания чтоб разобраться в тех же алгоритмах. Давайте не будем говорить, что в универе преподает старый гриб под 70 лет, а ИТ это суперсовременная штука, где нужны молодые. Знаете, что меня поразило? Большинство, если не все, алгоритмов, которые сейчас используются для решения сложных задач - были сформулированы и выведены в шестидесятые, семидесятые года прошлого века!! Вы знали? Я не знал. Потому что забросил универ.
Деньги vs Опыт. Когда тебе 20 - все же гораздо проще работать «за еду» в проекте, где ты можешь научиться гораздо большему, чем формошлепить задорого только потому, что никто кроме тебя не знает этой CMS. В 30, когда у тебя семья, дети, гораздо сложнее выбирать между этими двумя параметрами.
Частая смена работы. Тут я не уверен окончательно. Потому что с одной стороны это позволяет изучать что-то новое. Но с другой стороны это мешает стать экспертом в чём-то старом. Сложно угадать, в каком случае ширина знаний в какой-то области будет лучше глубины. Но наверное всё-таки ширина важнее.
Алгоритмы. Если вы еще не знаете, чем отличается BFS от DFS, что такое sliding window, O(n) - то стоит начать с leetcode. Я наверное не буду говорить, что стоит поискать новую работу, хотя я бы поискал.
Challenges. Вот тут я уверен точно. Если на текущем месте работы вы давно не встречали задачи, над которой вы долго-долго думали «это вообще выполнимо?», от которой хочется уйти в запой ввиду ее сложности - стоит поискать новое место. Ну или хотяб посерфить по джире на предмет того, чем занимаются более сильные коллеги.
Пет-проекты. Если хочется сделать свой стартап - то конечно нужно брать самый знакомый стек, чтоб сделать это быстрее. В противном случае - всегда нужно брать что-то в чем вы плохо разбираетесь, ведь пет-проекты - это не только что-то для удобства/самолюбия/etc, но еще и новый опыт, новые вызовы.
Стэк. Я не хочу и не буду говорить что вот этот стэк плохой, а вон тот - квинтэссенция сложности. Но по личному наблюдению - в каких-то языках формошлепов все-таки гораздо больше, и если вы еще на этапе выбора - наверное всё-таки не стоит идти по легкой дорожке.
Эго. Если вам со всех сторон твердят, что вы суперкруты, как разработчик - это всего лишь значит что стоит отправляться на поиски новых challenges. Хотя-бы - попасть на собеседование в компанию «уровня выше» (я про уровень разработчиков, которые там работают). Просто послушать, что там спрашивают, о чем они думают и какие задачи решают.
P.S. Я не знаю, насколько мои стенания актуальны, ведь я видел и вижу людей, которые сидят в одном болоте долгие годы, занимаясь простыми задачами и получая за это неплохие деньги. И они счастливы, им не нужны знания сложных алгоритмов, завернутые задачи и суперсложность. Наверное мы просто принадлежим к разным типам людей, которым никогда не понять друг друга.
P.P.S. Добавил хаб PHP, так как это мой родной язык, и по моему наблюдению - концентрация формошлепов вроде меня в этом языке - повышенная.
Ну, и, спасибо что дочитали.