Development
В мире программирования один лишь факт того, что вы долго работаете разработчиком, не делает из вас отличного специалиста. По моему опыту, разработчики и инженеры делятся на новичков, средних и старших по тому, как они могут пользоваться своими навыками и решать поставленные задачи. Хотя эти критерии зависят от типа организации: старший разработчик в небольшом стартапе использует навыки отличные от тех, что пригодятся старшему разработчику в крупной компании. Однако есть несколько явных качеств, которыми обладают все “опытные” разработчики. Сама идея разделения разработчиков и инженеров на молодых, средних и опытных подразумевает, что существуют способ как-то измерить их умения. В данном случае ошибочно считать, что есть какая-то определённая шкала для измерения таланта. Различные организации и сферы деятельности предполагают применение разных навыков. Но есть 4 ключевых умения, которые помогут определить опытность разработчика:
  • Выделяться навыками программирования
  • Быть наставником для других программистов
  • Избегать проблем в отношениях с коллегами и руководством внутри организации
  • Подбирать технические решения для потребностей компании
В идеале, старший разработчик должен быть хорош во всех указанных аспектах, но гораздо важнее, чтобы его сильные стороны подходили его команде и компании, а также отвечали их потребностям. Поэтому относительная важность этих четырёх умений может сильно меняться. Например, в маленькой компании или стартапе навыки программиста и умение развивать других программистов, чаще всего, значит гораздо больше, чем навыки разрешения проблем с коллегами и руководством. Дело не в том, что у стартапов не возникает таких проблем, просто эти компании гораздо меньше крупных корпораций с огромными командами специалистов, у каждой из которых есть несколько менеджеров, различные цели и ключевые показатели эффективности. В крупной компании навыки старшего разработчика в решении проблем с коллегами и руководством значат гораздо больше, потому что ему гораздо чаще приходится объяснять выбор того или иного технического решения менеджменту, далёкому от технических вопросов.

Больше, чем просто знания

Программирование — высокотехнологичная сфера, поэтому старший разработчик, естественно, не может не разбираться в том, как всё работает. Но любой разработчик высокого уровня должен быть, как я говорю, “специализированным универсалом”. Он уже должен иметь достаточно большой опыт в разработке и решении различных технических задач. Также, вероятно, он имеет более глубокие познания в какой-то определенной сфере, что очень важно, так как понимание деталей в разных сферах может помочь разработчику при переходе в другую область деятельности.
Чтобы по-настоящему считаться опытным, вы должны принимать трудные решения, и принимать их правильно.
Эти глубокие знания также позволяют вам стать достаточно мудрым, чтобы увидеть, чем обернулись для вас решения, принятые в прошлом. Старший разработчик должен знать, где собака зарыта. Время потраченное на то, чтобы полностью разобраться в теме, окупится позже, когда вы уже интуитивно будете понимать, где может вылезти ошибка через 10 строчек кода. И эту мудрость можно перенести и на другие ситуации. Опытные разработчики, как минимум, понимают, когда им нужно действовать осторожнее, потому что они не могут увидеть все потенциальные угрозы. Эта интуиция помогает компании гораздо больше, чем просто умение быстро писать код. Грамотные решения по-настоящему опытного разработчика просто не приводят к появлению проблем.

Принимать сложные решения и жить с этим

Вот вам настоящий секрет: не существует волшебного решения всех проблем программистов. Практически никогда не бывает так, что команда принимает решение, все собирают вещи, идут домой и больше никогда к этой проблеме не возвращаются. Каждая структура, каждый выбор и каждая возможность имеет возможные недостатки, особенно если продукт растет и развивается. Если сегодня вы решите быстрее выпустить продукт на рынок, чтобы опередить конкурентов, то, возможно, крупный рефакторинг кода понадобится вам уже через 6 месяцев, а не через 6 лет. Но если при этом вы улучшите свои позиции на рынке и получите прибыль —  это стоит того. Чтобы по-настоящему считаться опытным, вы должны принимать трудные решения, и принимать их правильно. Когда вы выбираете решение, вы также выбираете проблемы и задачи, с которыми команда столкнется в будущем. Старший разработчик будет иметь опыт работы во многих парадигмах проектирования, многих языках и многих командах. И хотя практически невозможно полностью знать все возможные шаблоны дизайна и архитектуры, особенно потому, что они продолжают развиваться, зато возможно иметь о них представление и понимать достоинства и превосходства тех или иных подходов.

Умение слушать других и выбирать лучшие идеи

Некоторые могут думать, что принятие решений означает, что у вас должно быть сильное, непререкаемое мнение. Но я считаю, что очень плохо, если старший разработчик уважает только своё мнение о технологиях, например, если он считает популярные языки программирования “чушью” или слишком заводится по подобному поводу. Команде могут поставить задачу поработать с крупным продуктом, написанном на языке, который не нравится старшему разработчику, но, возможно, в этом языке есть прекрасные библиотеки великолепная поддержка, которые помогут идеально решить задачу.
Чем больше человек открыт новым знаниям и мнениям своих коллег, тем быстрее он станет “старшим” во всех смыслах.
Хороший старший разработчик не обязан любить все языки и среды разработки. Лучше всего даже быть, в какой-то степени, равнодушным к ним. Всё это инструменты, и опытный разработчик знает, что всегда есть причина решать задачу определённым способом. Вместо того, чтобы думать о том, какой инструмент лучше или хуже, настоящий старший разработчик выберет наиболее подходящий именно под эту задачу. Прекрасный пример — PHP. Многие разработчики хейтят PHP, но многие его недостатки и позволили ему покорить Интернет. Не нужно смеяться; нужно понять, как извлечь из PHP всё хорошее и не дать развиться плохому.

Качества “старшего” проявятся

Учитывая описанные выше аспекты и факторы, молодых, средних и старших разработчиков можно определить примерно вот так:
  • Junior разработчики знают только один способ решения задачи, обычно взятый из руководства или изученный в школе. Почти наверняка они используют один из модных фреймворков.
  • Mid-level разработчики понимают, что каждая проблема является частью большей системы, и задумываются о лёгкости сопровождения, качестве кода и прочем, но всё ещё не понимают полную картину. Обычно больше внимания они уделяют процессу разработки.
  • Senior разработчики понимают, что не существует решений без возможных недостатков и рисков. Они обычно выбирают не то, что круто или “правильно” согласно какой-то книге, а то, что, в целом, будет менее рискованно для команды. Они предпочитают то, что будет легко сопровождать и исправлять, и то, чему можно легко научить.
Программист, которой понимает, что он не знает — не может знать — всего, будет наилучшим кандидатом на работу. Чем больше человек открыт новым знаниям и мнениям своих коллег, тем быстрее он станет “старшим” во всех смыслах. Если я сомневаюсь о том, кого нанять на должность старшего программиста или разработчик, я спрашиваю кандидатов, готовы ли они признаться в том, что чего-то не знают. Также я пытаюсь понять, насколько они могут видеть возможные последствия их решений. Тут и проявляются качества “старшего” разработчика, которые помогут определить действительно ли кандидат заслуживает этого титула.   Перевод статьи BrennWhat Truly Makes “Senior” Developer