Найти тему
КиберНиндзя

Веб-разработчик: путь до тимлида

Оглавление

Всем привет!

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

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

1. Интерес к программированию

Именно так, как бы банально это ни звучало. И это первостепенно.

За последнее десятилетие в нашей команде побывало более 20 человек, большинство из которых не продерживались более полугода. Основная причина в этом на мой взгляд - именно отсутствие заинтересованности.

Я впервые начал заниматься программированием еще в начальной школе, в 90-е, задолго до того, как у нас появился первый x86-компьютер. У нас тогда была древняя модель компьютера в виде клавиатуры, подключаемой к телевизору (за давностью лет не помню модель), программы на котором (простенькие игрушки) запускались 5-минутным проигрыванием на подключаемом магнитофоне кассеты со скрипучими звуками. Без кассет в нем можно было вбивать и исполнять код на Basic. Также у нас была к нему книжица, вводящая в азы бейсика.

Тогда я еще вообще ничего не понимал в программировании, все написанное в книге для меня было филькиной грамотой, и я просто перепечатывал примеры кода из книги и смотрел что будет. Меня по-детски завораживало, как несколько строк кода превращались в простенькие картинки или разнотональное пищание.

Дальше я пробовал эксперементировать, находить закономерности (до осмысленного пошагового изучения я тогда еще не дошел), менять код в примерах. Рисовал палочных человечков, пищал простенькие мелодии.

Именно оттуда, из детства, у меня пошел интерес к программированию. Когда у нас появился полноценный компьютер, я пробовал уже более осмысленно программировать на бейсике. Ближе к старшей школе родители подарили мне КПК на Palm OS, о котором я давно мечтал, и я естественно первым делом и туда установил бейсик. И даже написал свою первое настоящее приложение на нем - простенькое пианино с возможностью записывать и загружать проигранные мелодии.

Не мудрено, что я участвовал во всех олимпиадах по программированию, даже занимал первое место по городу, за счет чего поступил в университет на информатику без экзаменов.

К тому времени я преимущественно осваивал компилируемые языки - C++, Delphi. Веб-языками особо не увлекался, пока на одном из курсов не познакомился с Perl. Он мне понравился особенно сильно, и на предмете по сайтостроению свой проект я делал не на PHP как все, а на перле. Но к концу учебы все же сблизился с PHP и выбрал его своим основным языком.

Пройдет еще несколько лет до того, как я попаду полностью в веб-разработку (начинал эникеем, сисадмином, оператором БД на MSSQL), но уже тогда я занимался сайтописанием для души и подшабашивал этим иногда. Программирование являлось для меня не только работой, но и хобби.

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

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

-2

2. Алгоритмическое и архитектурное мышление

Я не просто так поместил их вместе. На мой взгляд, архитектурное мышление - это апогей развития алгоритмического. Без первого невозможно дорасти до senior'а, без второго - до тимлида.

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

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

Когда я смотрю на код (без разницы свой или чужой) - я читаю его как книгу. У меня в голове начинает работать "внутренний интерпретатор", и я как бы мысленно могу отладить программу и узнать состояние переменных в разный момент выполнения без необходимости ее запуска. Если код огромный и запутанный, на много тысяч строк, или отвартительно и безграмотно написанный, на его "загрузку" в голову может уйти больше времени, но в конечном счете в голове выстраивается точная схема работы всей системы в целом.

Когда я использую чужой код (например со stackoverflow, гитхаба или просто мануалов), я никогда не копирую его бездумно. Я всегда осознаю, как работает каждая функция и за что отвечает каждая переменная, поэтому никогда не скопирую лишнего и не состряпаю пестрое лоскутное одеяло или набор костылей.

К сожалению, очень малая часть программистов мыслит также (по крайней мере из тех, которые побывали в моей команде). Большинство даже не пытаются задуматься о том, что они делают, или просчитать хотя бы на один шаг вперед. Им совершенно непонятна область, которой они занимаются, и чего от них хотят. Они бы идеально подошли для армии чтобы не задумываться над приказами и просто "копать отсюда и до обеда". Они не пытаются понять код, могут скопировать выдранный из контекста кусок и искренне гадать, почему эта непонятная функция (спойлер: не нативная, определенная только в контексте) у них не работает, а заглянуть в документацию или осмотреть код вокруг - это не для них. Поэтому код получается грязный, грузный, закостыленный. А развивать его потом... Быстрее переписать с нуля.

-3

3. Накопление своего и чужого опыта и ошибок

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

Но я развивался. Не забывал совершенные ошибки и впредь не повторял их, оттачивая качество своего кода.

При этом не меньшее значение для меня имело обучение на чужих ошибках. Через нашу фирму на поддержке и доработке побывали уже сотни сайтов, состряпанных на коленке горе-программистами. Не редко клиенты, пытаясь сэкономить, заказывали сайты по дешевке (судя по всему либо у вчерашних школьников, либо даже сегодняшних). Результат немного предсказуем. Но некоторые из недосайтов даже выходили из под пера довольно известных веб-студий (не буду тыкать пальцем), бюджеты которых в разы превышали наши. Я искренее не понимаю, как им самим не стыдно. Заламывать семизначный ценник, но под капотом выдавать недоразумение уровня 9 класса средней школы. Создавать для клиента видимость корректной работы за счет понавешанных заглушек, но по факту выпуская абсолютно сырой и полурабочий код.

Так или иначе, я видел миллион примеров, как не стоит делать, и это помогало мне избегать множество ошибок со своей стороны и повышать качество своего кода.

-4

4. Всестороннее внерабочее развитие

Разработка для меня не только работа, но и хобби (если что - не единственное, я интересуюсь многими областями). Периодически я занимаюсь своими пет-проектам, для общего развития осваиваю новые интересные мне технологии, которые почти не затрагиваются на работе.

Причем это касается не только программирования, но и много другого.

Например, еще со студенческих лет я увлекся unix-системами (freebsd, linux). Заставшие тот период, когда интернет был по модему или по кабелю, но с огромнными ценами за Мб (безлимитов тогда еще не было), наверняка помнят, каково тогда было устанавливать linux себе на десктоп. Это сейчас можно набрать в консоле пару команд - и система сама подключится к репозиториям, установит и обновит все нужные пакеты и зависимости. Но в то время из интернета выкачивать что-то из репозиториев было фактически невозможно из-за стоимости траффика, и каждая установка нового линукса превращалась в танцы с бубном в попытке оживить систему, из коробки идущую с вагоном багов, и не имеющую на поставляемых дисках полной поддержки имеющегося железа. А попытка запустить нужную windows-программулину на древних версиях wine превращалась в игру в рулетку, чаще всего с провальным результатом.

Поэтому поначалу у меня на винте параллельно стояли и Windows, и Linux/Freebsd. Но через некоторое время я отлично освоился с перебарыванием трудностей и полностью перешел на Linux на домашнем ПК.

Благодаря этому, когда я подался в веб-разработку, с серверами на линуксе был "на ты". Работа в консоле для меня также естественна, как и в GUI-интерфейсе. Для сравнения, разработчики, никогда не выходившие за пределы Windows, сколько бы задач по настройке сервера или переносу сайта им не приходило - каждый раз с ужасом и непониманием смотрят на консоль линукса, а решить какую-нибудь серверную проблему становится для них непосильной задачей.

-5

5. Отсутствие поддержки коллег

Как бы странно это ни звучало. Но не потому, что я замкнутый злыдень, а потому, что коллег не было. :-)

Когда я попал в мою текущую фирму много-много лет назад начинающим веб-разработчиком, в штате помимо меня был всего один программист. Причем с уровнем знаний даже уступающим моим.

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

Но я считаю, что на тот момент для меня это было большим плюсом, т.к. развило абсолютную самостоятельность и независимость. Нет ни одной проблемы, которую я не мог бы разобрать самостоятельно. Благодаря такому жесткому началу за пару лет (конечно, с учетом моей предыстории), в нашей фирме я был уже матерым Senior-ом, и все наши клиенты очень хотели, чтобы за их задачи брался именно я.

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

Так что очень важно развивать в себе самостоятельность - без этого продвижение выше middle-уровня просто невозможно.

-6

6. Категорическое отрицание мыслей "не могу" и "не знаю", или кредо "запрограммировать можно все что угодно"

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

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

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

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

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

Пишу я это потому, что очень часто слышал от коллег "не получается" или "не смогу". И это при том, что я стараюсь адекватно оценивать возможности каждого и не даю, допустим, джуну, откровенно сложную задачу. Но почему же я могу всё? Не счесть количество раз, когда коллеги впадали в ступор и проваливали задачу, и мне приходилось разбирать сотворенную кашу и спасать положение.

Помогал мне в этом комплекс из всех предыдущих пунктов. Умение вникнуть в проблему и предметную область, нагуглить подходящий материал и инструменты, углубиться в исходники и прочитать их.

Так или иначе, чтобы выйти на уровень senior'а, очень важно укрепить в голове эту парадигму - "нерешаемых задач нет". Без этого дальше middle'а дорога закрыта.

-7

7. Гибкость мышления

Напоследок упомяну об еще одном важном качестве, которое необходимо каждому программисту.

Это - гибкость, и я сейчас не об AGILE. Гибкость нужна во всем: в общении с клиентами, в выборе инструментария, в адаптации к условиям проекта.

Например, в контексте сайтовых движков, я без проблем работаю со множеством систем: Bitrix, Netcat, Wordpress, Drupal, Modx, Joomla и многими другими, причем в равной степени комфортно ощущаю себя и во всевозможных фреймворках, как то Yii или не так давно почивший Zend.

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

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

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

Разработка - это динамическая сфера. Одни языки, методологии, движки умирают, на их смену приходят другие. Если привязываться к чему-то одному - превратишься в динозавра, и тебя постигнет та же участь. Нужно уметь гармонично работать в той среде, в которой оказываешься. А для этого в первую очередь необходимо гибкое и открытое мышление.

На этом все. Если вы хотите обсудить что-то подробнее - с удовольствием отвечу на все комментарии.

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