Эта статья - история моей карьеры. Я не уверен, есть ли тут хоть какая-либо ценность для сообщества, но возможно кто-то узнает в какой-либо части истории себя, и, опять же, возможно какие-то моменты помогут ему проанализировать свою карьеру и не повторить моих ошибок. В общем - это история тридцатилетнего разработчика-недоучки с раздутым самомнением, который наконец осознал, что вся та исключительность, про которую ему намекали и в которую он свято верил - это точно не про него.

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, так как это мой родной язык, и по моему наблюдению - концентрация формошлепов вроде меня в этом языке - повышенная.

Ну, и, спасибо что дочитали.