Таня Рейли – Карьера разработчика. Стафф – круче, чем senior (страница 5)
На рис. 1.2 показан пример, в котором команда выбирает между двумя программами А и Б. У обеих программ есть необходимые функции, но программу А намного проще установить: запустил – и работает. Программа Б немного сложнее: чтобы она заработала, пару спринтов придется потратить на обсуждение. Никто не хочет так долго ждать.
С точки зрения команды, программа А – абсолютный победитель. Зачем выбирать что-то другое? Но остальные предпочли бы программу Б. Оказалось, что программа А будет постоянно нагружать работой юристов и отдел безопасности, а необходимость аутентификации означает, что ИТ-отделу и команде разработчиков платформы придется работать с этой программой особым образом. Выбрав программу А – локальный максимум, – команда неосознанно выбирает решение, которое потребует намного больших затрат от всей организации. Программа Б всего лишь немного хуже для команды, но намного лучше для компании, а дополнительные два спринта окупятся за квартал. Но сделать правильный выбор может только человек, способный просчитать влияние отдельного решения на все ключевые бизнес-процессы предприятия.
Рис. 1.2. Локальный максимум vs лучшее решение
Чтобы избежать необъективности локального максимума, команде нужен человек, ответственный за принятие решений (или хотя бы способный повлиять на этот процесс), который может взглянуть на ситуацию со стороны, то есть учесть интересы нескольких команд и выбрать путь, удовлетворяющий целям организации или бизнеса в целом. В главе 2 я расскажу, какие приемы позволят получить более объективную картину и принести компании успех.
Необходимо не только проанализировать условия, актуальные в настоящий момент, но и спрогнозировать, какое влияние принятое решение окажет на бизнес в будущем. О чем вы будете жалеть через год? Что принесет вам пользу через три года? Чтобы двигаться в одном направлении, команды должны согласовать технические стратегии: на какие технологии делать ставку, какие платформы стандартизировать и т. д. Все эти серьезные шаги неоднозначны и часто вызывают споры, поэтому для принятия решения нужно выявить все значимые обстоятельства и донести до окружающих их важность. Глава 3 посвящена выбору направления развития всей команды.
Так что если вы хотите принимать основополагающие решения, нацеленные на будущее, то вам нужны люди, которые могут мыслить панорамно. Но разве менеджер этого не может? Или, например, может ли технический директор (CTO, chief technology officer) разобраться в потребностях бизнеса, перевести их на технический язык и рассказать всем, что нужно делать?
Иногда может. В маленьких командах менеджер зачастую является самым опытным инженером, принимает ключевые решения и выбирает направление технологического развития бизнеса. В маленькой компании CTO может быть глубоко вовлечен в разработку мельчайших деталей каждой задачи. Может быть, таким компаниям и не нужны стафф-разработчики. Но положение начальника может затмить технические аргументы: подчиненным часто неудобно спорить с руководством, даже если выбранное им инженерное решение не самое лучшее. К тому же управление людьми само по себе занимает полный рабочий день. Если человек тратит время на то, чтобы стать хорошим управленцем, у него остается мало времени на изучение технических новинок, а если человек старается глубоко погружаться в технические детали, то у него будет меньше возможностей заниматься подчиненными. На коротком промежутке времени это может не вызвать значительных трудностей: некоторые команды успешно функционируют, не требуя особых организаторских усилий. Но если потребности команды вступают в противоречия с техническими задачами, то менеджер должен выбирать, на какой проблеме ему сосредоточиться. И тогда либо участники команды, либо технические вопросы останутся без должного внимания со стороны руководства.
Это одна из причин, по которой организации разделяют управление технической деятельностью компании и руководство людьми. Если у вас несколько разработчиков, то проводить каждое решение через CTO или старшего менеджера неэффективно, не говоря о том, что это демотивирует сотрудников. Если опытные инженеры получат полномочия, позволяющие им принимать решения по техническим вопросам, а также возможность погружаться в задачи и определять их контекст, то результаты и разработки только улучшатся.
Это не означает, что инженеры должны в одиночку определять техническую политику предприятия. Менеджеры, ответственные за назначение людей на технические проекты, тоже должны участвовать в принятии решений. Как поддерживать согласованность действий менеджеров и разработчиков, я расскажу далее в этой главе, а также в главе 3, в которой мы поговорим о стратегии.
В некоторых компаниях должность ИТ-архитектора считается одной из инженерных в должностной структуре. В других компаниях архитекторы – это проектировщики каких-то систем со своим особым карьерным путем, отличным от карьеры программиста, применяющего эти системы. В этой книге я буду рассматривать разработку программного обеспечения и его архитектуры как часть обязанностей стафф+ разработчика, но имейте в виду, что в нашей отрасли это не всегда так.
В идеале команды должны дополнять друг друга, как фрагменты пазла, закрывая все потребности проекта. А еще в идеале имеется новый прекрасный проект, в котором нет ни априорных ограничений, ни унаследованных систем, а каждая команда целиком и полностью посвящает себя работе. Сферы ответственности команд четко определены, и в них никто не сомневается. В начале проекта каждой команде поручают работу только над одним из компонентов продукта. Технические консультанты компании Thoughtworks назвали такое деление на команды обратным законом Конвея (https://oreil.ly/HdKyK). Конечно, на этом идеальном проекте возникают только трудности, связанные с фундаментальными научными исследованиями и поиском новаторских решений, а люди жаждут разгадывать технические головоломки, чтобы покрыть себя неувядаемой профессиональной славой.
Я бы хотела поработать на таком проекте. А вы? К сожалению, в жизни все совсем иначе. Команды, вовлеченные в любую кросс-командную работу, наверняка образовались до того, как этот новый проект был задуман, и работают над чем-то другим, может быть, даже над чем-то, что, по их мнению, является более важным. На середине проекта внезапно появляются новые обстоятельства. Сферы ответственности команд начинают пересекаться и разрываются, и это негативно сказывается на программной архитектуре. Сложные и непонятные вопросы оказываются не увлекательными алгоритмическими и исследовательскими задачками, а необходимостью пробираться через лабиринты унаследованного кода, вести переговоры с перегруженными командами, не желающими ничего менять, а еще нужно угадать намерения разработчиков, уволившихся несколько лет назад.[14] На старте виден не весь объем работы, и даже понимание того, какие именно изменения нужно внести, может стать большой проблемой. Внимательно прочитав проектную документацию, вы, скорее всего, обнаружите, что ключевые решения, требующие максимальной согласованности действий команд, были отложены на потом или от них вовсе отказались.
Вот так выглядит реальный проект. Вы можете сколь угодно тщательно распределять части масштабного проекта между командами, но все равно в итоге какие-то задачи не достанутся никому, а какие-то – попадут сразу в две команды. Могут возникнуть задержки в передаче данных и появиться неточности при переводе на другие языки, и все это приведет к конфликтам интересов. Команды будут принимать решения, которые выгодны только им (принцип локального максимума), и заведут проект в тупик.
Если вы хотите, чтобы работа продвигалась, то вам нужен человек, который будет отвечать за весь проект, а не за отдельные его части. На начальном этапе этот человек определит объем работ и распределит задачи. Как только проект перейдет в стадию реализации, этот человек, скорее всего, станет автором или соавтором высокоуровневых требований и главным контактным лицом по этим вопросам. Он будет поддерживать должное качество технической работы, прогнозируя риски и задавая вопросы, которые другие боятся задать. Он также будет заниматься неформальным обучением и наставничеством руководителей отдельных частей проекта или просто послужит им хорошим примером. Если работа застопорится, он сможет выявить причины пробуксовки и устранить их, поскольку обладает исчерпывающей полнотой знаний о бизнес-процессах в компании (см. подробнее в главе 6). Он посвятит в тонкости проекта людей, не задействованных в нем, и разъяснит им, в чем ценность продукта и как результаты отразятся на каждом сотруднике.
Почему технический программный менеджер (technical program manager, TPM) не может заняться поиском консенсуса между командами и проведением переговоров? Конечно, здесь есть некоторое пересечение сфер ответственности. Но все-таки TPM отвечает за конечный продукт, а не за разработку и качество кода. TPM следит за тем, чтобы проект завершился в срок, а стафф-разработчик контролирует, чтобы проект соответствовал техническим нормам. Также стафф-разработчик отвечает за то, чтобы в итоге система получилась надежной и хорошо вписывалась в технологический ландшафт компании. Он старается избегать технического долга и всего, что может создать трудности людям, которые будут поддерживать работоспособность системы. TPM не разрабатывает технические проекты, стандарты тестирования или код-ревью, а на совещании по интеграции он не будет углубляться в дебри скриптов унаследованной системы. Если стафф-разработчик и TPM успешно сотрудничают на большом проекте, то они могут построить команду мечты.