Права на издание получены по соглашению с O'Reilly. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. Издательство не несет ответственности за доступность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими. В книге возможны упоминания организаций, деятельность которых запрещена на территории Российской Федерации, таких как Meta Platforms Inc., Facebook, Instagram и др.
Authorized Russian translation of the English edition of The Staff Engineer's Path
© 2022 Tanya Reilly.
This translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
© Перевод на русский язык ТОО «Спринт Бук», 2025
© Издание на русском языке, оформление ТОО «Спринт Бук», 2025
Отзывы о книге «Карьера разработчика. Стафф – круче, чем senior»
Жаль, что у меня не было этой книги, когда я перешла на должность принципал-разработчика. Таня подробно описала путь разработчика уровня стафф+ и дала множество содержательных практических советов. Если вам интересно, кто такой стафф+ разработчик и как добиться успеха в этой роли в вашей организации, то эта книга для вас. Она даст инструменты, которые помогут вам преуспеть на инженерном пути развития, оказывая влияние на людей и процессы и принося пользу.
Сара Уэлс, независимый консультант и автор книг, бывший принципал-разработчик Financial Times
Мне не хватало этой книги на протяжении всей карьеры. Таня изложила на бумаге многогранность роли стафф-разработчика и дала замечательные конкретные указания по управлению временем, поиску консенсуса и т. д., и это чрезвычайно ценно.
Я буду часто цитировать эту книгу.
Титус Винтерс, принципал-разработчик Google и соавтор книги «Software Engineering at Google»[1]
Таня – идеальный автор для этого исключительного мануала, который поможет сориентироваться в непонятной роли стафф+ разработчика. В каждой главе она делится своим огромным практическим опытом, я многому у нее научился.
Уилл Ларсон, технический директор, Calm, автор книги «Staff Engineer»
Должность старшего руководителя в карьере индивидуального контрибьютора долго была неоднозначной и не поддавалась определению. Эта книга представляет собой незаменимое руководство, которое поможет добиться успеха в роли, являющейся пока что достаточно новой для нашей отрасли. Таня проделала отличную работу: она рассказала об опыте крупных компаний и дала оценку вызовам, с которыми они сталкиваются, предлагая всесторонний взгляд на то, как стать успешным стафф-разработчиком.
Сильвия Ботрос, принципал-разработчик и соавтор 4-го издания книги «High Performance MySQL»[2]
Когда вы почти достигли вершины карьеры индивидуального контрибьютора, вы, образно говоря, получаете компас и некоторый пункт назначения. Как туда добраться – ваша проблема. Как привести туда всех остальных – общая. Таня предлагает надежные инструкции с картами, которые помогут вам провести людей из пункта А в пункт Б. Эта книга станет прочной опорой для тех индивидуальных контрибьюторов, кто только начинает свой путь на старших уровнях, и откроет много нового для тех, кто уже имеет большой опыт. Стафф-разработчики, познайте себя.
Изар Тарандач, принципал-архитектор по безопасности и соавтор книги «Threat Modeling»
Таня Рейли с пугающей точностью передает то ошеломляющее чувство, которое я испытал, когда впервые стал тем, «кто должен что-то сделать». Эта книга – подробное исследование того, что на самом деле означает эта фраза для людей, работающих на уровне стафф-разработчика.
Ниалл Ричард Мерфи, учредитель, генеральный директор, соавтор книг «Reliable Machine Learning» и «Site Reliability Engineering»[3]
В книге «Карьера разработчика. Стафф – круче, чем senior» Таня Рейли привнесла крайне необходимую ясность в непростой и часто неверно понимаемый вопрос о том, как быть старшим техническим лидером, не имея прямых подчиненных. Каждая страница наполнена ценными идеями и практическими советами, которые помогут вам сориентироваться в новой роли и в организации, а также проложить свой карьерный путь, причем все тонкие наблюдения преподносятся в фирменном стиле Тани, остроумном и непринужденном. Эта книга – шедевр.
Кэти Сайлор-Миллер, старший стафф-архитектор по фронтенду, Etsy
Если вы как старший инженер раздумываете о том, какую карьеру дальше выбрать – стафф-разработчика или руководителя стафф-разработчиков, – эта книга для вас. Она раскрывает множество особенностей этой роли, о которых вам никто не расскажет и на самостоятельное изучение которых уйдут многие годы, даже если вас будут сопровождать самые прекрасные менторы. Книга предлагает наблюдения, ментальные модели и знания о роли стафф-разработчика из первых рук в более сжатом виде, чем любая другая книга до этого.
Гергели Орош, автор книги «The Pragmatic Engineer»
О научном редакторе русского издания
Евгений Войнов – стафф-разработчик в компании КРОК, 6 лет руководил группой Java-разработчиков, 3 года был техническим менеджером. Имеет более 15 лет опыта разработки систем для государственного и коммерческого сектора, регулярно участвует в трансформации процессов департамента. Ментор разработчиков и будущих руководителей, преподаватель в учебных программах BrainZ by CROC для студентов и школьников.
От издательства
Мы выражаем огромную благодарность компании КРОК за помощь в работе над русскоязычным изданием книги и их вклад в повышение качества переводной литературы.
Ваши замечания, предложения, вопросы отправляйте по адресу
(издательство «SprintBook», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Предисловие
Когда в 2016 году я писала книгу «The Manager’s Path»[4], передо мной стояло много задач. Я хотела поделиться уроками, которые получила, развиваясь как менеджер. Я хотела показать тем, кто стремится стать менеджером, на что похожа эта работа. Я хотела, чтобы отрасль признала, что мы должны предъявлять больше требований к менеджерам и что менеджеры, которых мы сейчас продвигаем, часто не могут качественно выполнять свою работу, потому что они не умеют правильно распределить свое внимание между потребностями подчиненных, контролем за техническими процессами, продуктом и развитием собственных инженерных навыков. Если кратко, то я хотела изменить традиции, сложившиеся в технической отрасли: во-первых, менеджмент должен восприниматься серьезно, так как играет критически важную роль, во-вторых, менеджмент не должен считаться возможностью по умолчанию для амбициозных разработчиков, которые хотят сделать карьеру.
Хочу сказать, что частично я добилась успеха. Каждый раз, когда кто-то говорит мне, что он прочитал мою книгу и решил не становиться менеджером, я праздную свою маленькую победу. Ведь хотя бы некоторые люди, ознакомившись с моей книгой, осознали, что эта работа им не подходит. К несчастью, для альтернативного варианта карьерного роста индивидуального контрибьютора, пути стафф-разработчика, нет аналогичного пособия. Это привело к тому, что многие все равно идут в управленцы, даже если не хотят нести ответственность за все бо́льшие и большие группы людей: они просто не видят другой возможности развиваться. Это огромное разочарование как для разработчиков, так и для менеджеров: большинству менеджеров нужны сильные разработчики уровня стафф+, но они не знают, как повысить их статус в компании, а многие разработчики хотят продолжать заниматься программированием, но не видят реальных возможностей продвижения по служебной лестнице, кроме перехода в менеджмент.
На пути к уровню стафф+ возникает одна большая трудность: от разработчиков ожидают, что они самостоятельно и без специальных указаний разберутся, как до него добраться. Если вы стремитесь стать стафф+ разработчиком, то, по общепринятому мнению, вы должны сами выяснить, как это сделать. Стоит ли говорить, что это обескураживающий подход, который не способствует профессиональному росту. По мере того как все больше компаний осознает потребность в разработчиках уровня стафф+, мы как отрасль не можем позволить себе полагаться на верования и предубеждения о карьере таких специалистов и игнорировать основные навыки, которые ведут технических лидеров к успеху.
Учитывая все вышесказанное, представьте, как я обрадовалась, когда Таня Рейли (Tanya Reilly) захотела написать о пути стафф-разработчика, то есть раскрыть тему, которую моя книга оставила без внимания. Я знаю Таню по ее статьям и выступлениям об инженерном лидерстве, и для меня было очевидно, что она хочет избавиться от сложившихся стереотипов в технической отрасли относительно стафф+ разработки, так же как я хотела изменить устоявшиеся традиции в менеджменте. В частности, Таня предпринимает попытку разобраться, насколько важны для профессионального успеха технического специалиста способности к программированию и решению технических задач, а также выяснить, какие умения позволят сильным разработчикам успешно повышать эффективность компании, не управляя при этом людьми.
В этой книге Таня описывает три основополагающих навыка, которые критически важны для успеха стафф+ разработчика. Она объясняет, как применять панорамное мышление, успешно реализовывать проекты и повышать квалификацию других сотрудников, тем самым распространяя свое влияние за пределы индивидуального практического вклада.
Раскрывая многогранную структуру карьеры стафф+ разработчика, Таня не пытается дать конкретный набор умений, необходимых на каждом уровне выше сеньора. Она поступает мудрее и сосредоточивает внимание на том, как использовать эти три основных навыка в тех или иных условиях. Эта книга проведет вас через все этапы стафф-разработки от создания технической стратегии до успешного руководства большими проектами, от ментора до идейного вдохновителя на уровне организации и покажет, что можно способствовать успеху компании, выходя за рамки написания кода.
Ваш карьерный рост в руках только одного человека, и этот человек – вы. Определение своего профессионального пути является не только великолепным шансом, но и серьезным испытанием, и чем раньше вы поймете, что все зависит от вас (и небольшой толики удачи), тем быстрее вы научитесь разбираться в возможностях продвижения по карьерной лестнице. Данное руководство разъясняет, какие навыки нужны, чтобы пройти путем стафф+ разработчика, и является необходимым дополнением к библиотеке каждого программиста.
Камиль Фурнье, автор книги «The Manager’s Path», редактор книги «97 Things Every Engineering Manager Should Know», управляющий директор, член правления JP Morgan Chase ACM Queue, Нью-Йорк, сентябрь 2022 г.
Введение
Кем вы видите себя через пять лет? Этот стандартный вопрос на собеседовании – то же самое, что вопрос «Кем ты хочешь стать, когда вырастешь?», только для взрослых. У него достаточно далекий горизонт планирования и несколько социально приемлемых ответов, которые не предполагают принятия на себя каких-либо обязательств.[5] Но если вы сеньор-разработчик программного обеспечения и хотите продолжать продвигаться по карьерной лестнице, то этот вопрос становится очень серьезным.[6] Как вы думаете, куда вы идете?
Два пути
Представьте, что вы стоите на развилке дороги (рис. В.1) и перед вами простираются два пути. Если вы пойдете по первому, то возьмете себе подчиненных и станете менеджером. Если по второму – станете техническим лидером без подчиненных, таких специалистов часто называют стафф-разработчиками (staff engineer). Если бы вы правда могли увидеть себя через пять лет, то обнаружили бы, что у этих двух вариантов много общего: они ведут почти в одну и ту же сторону, и чем дальше вы идете, тем больше одинаковых навыков они требуют. Но в начале эти пути кажутся очень разными.
Рис. В.1. Развилка дороги
Путь менеджера понятен и хорошо известен. Переход в менеджмент – это самый распространенный и, наверное, даже стандартный карьерный шаг для тех, кто умеет хорошо коммуницировать, оставаться спокойным в критической ситуации и помогать коллегам улучшать их навыки. Скорее всего, вы знаете людей, которые выбрали этот вариант. Вероятно, у вас тоже был начальник, и у вас сложилось мнение о том, что он делал правильно и в чем ошибался. Менеджмент – это хорошо изученная дисциплина. Слова «повышение» и «лидерство» часто ассоциируются с фразой «стать чьим-то начальником», а киоски в аэропортах заполнены книгами с рекомендациями о том, как стать хорошим управленцем. Менеджмент – не самая простая дорога, но вы хотя бы сможете разобраться, как выглядит это путешествие.
Путь стафф-разработчика покрыт туманом. Сейчас многие компании позволяют специалистам расти как сеньор-разработчикам, без подчиненных, но этот «инженерный путь» до сих пор не проторен и на нем почти нет никаких дорожных знаков. Программисты, которые его выбрали, могли никогда не работать рядом со стафф-разработчиками, или эта должность встречалась им так редко, что стала похожа на миф. (Хотя это не так. Стафф-разработке тоже можно научиться.) У каждой компании свои ожидания от этой роли, а критерии для принятия на работу или повышения стафф-разработчиков расплывчаты и не всегда выполнимы.
Зачастую обязанности не становятся понятнее, даже если вас уже приняли на эту должность. Я разговаривала со стафф-разработчиками из разных компаний, которые не до конца понимали, чего от них хотят, а также с техническими менеджерами, которые не знали, как взаимодействовать со стафф-разработчиками.[7] Вся эта неопределенность может стать источником стресса. Если круг ваших обязанностей четко не очерчен, то как узнать, хорошо или плохо вы работаете? И работаете ли вообще?
Даже если требования к вам понятны, то может быть неясно, как им соответствовать. Представьте, что вы только что устроились стафф-разработчиком и слышите, что от вас ожидают инженерного лидерства, принятия решений, выгодных бизнесу, влияния без авторитарности, – но как это сделать? С чего начать?
Основополагающие навыки для стафф-разработки
Мне знакомо это чувство. Я шла к уровню стафф целых 20 лет, которые проработала в отрасли, а теперь я старший принципал-разработчик (senior principal engineer) и одновременно старший директор (senior director) согласно штатному расписанию моей компании. Несмотря на то что я много раз думала перейти на менеджерскую должность, я все время приходила к выводу, что именно «инженерный путь» вдохновляет меня и ради него я каждое утро прихожу на работу. Я хочу, чтобы у меня было время изучать новые технологии и глубже вникать в архитектуру ПО. Вы становитесь лучше в том, на что тратите время, а я хотела стабильно развиваться как технический специалист.[8]
Однако на ранних этапах карьеры мне было трудно разобраться в специфике этой должности. Когда я была «мидлом», я не понимала, зачем нужны уровни выше «сеньора»: что эти люди делают целый день? У меня было недостаточно профессионального опыта, чтобы постичь значимость этой роли. Позже, когда я сама стала стафф-разработчиком, я обнаружила, что нигде не говорится ни о требованиях к нам, ни о навыках, которыми мы должны обладать. Я не могла все это сформулировать, не говоря уже о том, что я не знала, как действовать. Много лет я училась и получала опыт на разных проектах, как успешных, так и неудачных; как у своих замечательных коллег, так и у подчиненных из других компаний. Теперь роль стафф-разработчика обрела смысл, но я бы хотела узнать то, что знаю сейчас, намного раньше.
Если вы раздумываете о карьере стафф-разработчика или уже выбрали ее, добро пожаловать! Эта книга для вас. Если вы работаете со стафф-разработчиками или руководите ими и хотите побольше узнать о специфике их деятельности, для вас здесь тоже найдется много полезного. В следующих девяти главах я хочу поделиться своими знаниями о том, как стать хорошим стафф-разработчиком. Сразу предупреждаю, что я не дам инструкций по каждой теме: круг обязанностей на этой должности обширный и разнообразный, и на многие вопросы можно ответить: «Все зависит от обстоятельств». Но я покажу вам, как ориентироваться в этом разнообразии, выделять главное и не терять связь с другими коллегами-руководителями.
Роль стафф-разработчика включает три основополагающих навыка: панорамного мышления, реализации проектов и повышения квалификации сотрудников, с которыми он работает.
Панорамное мышление
Панорамное мышление – это способность отступить на шаг назад и посмотреть на картину в целом. Это означает учитывать не только текущие события, но и обстоятельства, в которых вы работаете. Это способность мыслить на более долгую перспективу: начинать проекты длиной в несколько лет, создавать ПО, которое будет легко вывести из эксплуатации, или прогнозировать, что понадобится вашей компании через три года.[9]
Реализация проектов
Проекты, с которыми вы столкнетесь на уровне стафф-разработчика, не будут иметь четкого плана и однозначно интерпретируемого результата. Чтобы успешно их реализовать, вам потребуется больше людей, влияния и личного авторитета, а также придется побороться с устоявшимися стереотипами.
Повышение квалификации сотрудников
Чем выше ваша должность, тем больше ответственность за стандарты и квалификацию разработчиков из вашей организации: это может быть ваша команда, коллеги или программисты всей компании или отрасли. В ваши обязанности входит как явное повышение квалификации сотрудников через обучение и наставничество, так и неявное, поскольку младшие специалисты обычно берут пример с более опытных профессионалов.
Ваше содействие успеху организации основано на этих трех навыках, как показано на рис. В.2.
Рис. В.2. Три навыка для роли стафф-разработчика
Обратите внимание, что эти навыки опираются на прочный фундамент технических знаний и опыта. Этот фундамент имеет решающее значение. Чтобы воссоздать панорамную картину, нужно уметь просчитать все возможные варианты и обладать здравым суждением. Во время реализации проектов вы должны принимать решения, которые действительно устраняют проблему. Если вы выступаете в качестве примера для подражания, то ваши комментарии на ревью должны улучшать код и архитектуру, а ваше мнение должно быть хорошо продуманным – вы должны быть правы! Техническое мастерство лежит в основе роли стафф-разработчика, и вы должны продолжать его совершенствовать.
Но одних инженерных способностей недостаточно. Для успеха и роста на уровне стафф+ вам понадобится нечто большее. Чтобы научиться мыслить панорамно, реализовывать крупные проекты и обучать коллег, вам понадобятся следующие «человеческие» навыки:
• коммуникабельность и лидерство;
• преодоление трудностей;
• умение видеть перспективы и результаты своей работы;
• менторство, спонсорство и делегирование;
• умение сформулировать задачу так, чтобы ее могли выполнить специалисты уровнем ниже;
• умение действовать как лидер, независимо от того, чувствуете вы себя таковым или нет.[10]
Эти навыки похожи на дополнительные опоры, которые можно увидеть в готических соборах (как на рис. В.3): они не заменяют стены – вашу инженерную квалификацию, – но помогают построить более высокое, величественное и впечатляющее здание.
Рис. В.3. Лидерские качества похожи на дополнительные опоры, которые помогают стабилизировать массивные постройки
У каждого из трех основополагающих навыков есть набор обязательных умений, и ваши способности в каждом из них могут быть очень разными. Кто-то находится в своей стихии, когда возглавляет и доводит до конца крупные проекты, но ему страшно выбрать одну стратегию из двух. Другие могут тонко чувствовать, куда движется компания и отрасль в целом, но быстро теряют контроль над ситуацией, разбираясь с инцидентом. Третьи умеют повышать квалификацию всех, с кем они работают, но им трудно достичь консенсуса по техническому вопросу. Хорошая новость в том, что все эти умения можно развить, и вы можете стать мастером всех трех основных навыков.
Эта книга разделена на три части.
Часть I. Панорамное мышление
В первой части мы разберем, как получить широкий панорамный вид на свою работу. Глава 1 начнется с глобальных вопросов о вашей роли. Чего от вас ожидают? Зачем нужны стафф-разработчики? В главе 2 мы еще уменьшим масштаб и получим некоторую перспективу. Мы посмотрим на контекст вашей работы, сориентируемся в организации и выясним, каковы ваши цели. Наконец, в главе 3 мы рассмотрим, как дополнить панорамную картину с помощью технической концепции и стратегии.
Часть II. Реализация проектов
Вторая часть – тактическая, она переходит к практическим советам по управлению проектами и устранению проблем. В главе 4 мы рассмотрим, как выбрать задачи, над которыми стоит работать: я поделюсь техниками, которые помогут определить, на что потратить время, как управлять своей жизненной энергией и «инвестировать» оказываемое вам доверие и накопленный вами социальный капитал так, чтобы не растерять их. В главе 5 я расскажу, как управлять проектами, затрагивающими несколько команд или организаций: как создать условия для успеха, принимать решения и поддерживать эффективную передачу информации. В главе 6 мы рассмотрим, как справиться с трудностями на вашем пути, отпраздновать успешное завершение проекта или провести ретроспективу (и при этом праздновать!), если проект отменился и необходимо завершить его без негативных последствий.
Часть III. Повышение квалификации
В третьей части мы рассмотрим, как поднять уровень квалификации в вашей организации. Из главы 7 вы узнаете, как развивать навыки каждого сотрудника, подавая личный пример хорошей разработки, как учиться, не скрывая этого, и как создать психологически благоприятную корпоративную культуру. Мы также рассмотрим, как сохранять выдержку и не терять контроль над ситуацией во время инцидентов и технических разногласий. В главе 8 я расскажу о более осознанных формах развития навыков ваших коллег, таких как обучение, коучинг, ревью архитектуры и кода, внесение изменений в культуру разработки. Наконец, в главе 9 мы рассмотрим, как повысить свой собственный уровень: как обеспечить себе профессиональный рост и позаботиться о своей карьере. Куда вы пойдете после этой должности? Я покажу вам несколько вариантов.
Прежде чем мы отправимся дальше, я хочу предупредить: эта книга о том, как остаться на инженерном пути. Но это не учебник для инженеров. Как я уже сказала, чтобы стать стафф-разработчиком, вам нужен крепкий технический фундамент. Эта книга не поможет его создать. Техническое мастерство зависит от предметной области, и если вы здесь, то я предполагаю, что у вас уже есть – или вы собираетесь приобрести – все специальные навыки, которые необходимы, чтобы стать одним из самых старших разработчиков в сфере ваших профессиональных интересов. Что бы вы ни понимали под словом «технический»: программирование, разработку архитектуры, UX-дизайн, моделирование данных, анализ уязвимостей или что-то другое, – почти в каждой предметной области есть множество книг, веб-сайтов и курсов, которые вас поддержат.
Если вы думаете, что для стафф-разработчика важны только инженерные навыки, то скорее всего, в этой книге вы не найдете ничего полезного. Но как ни странно, вы также можете стать тем, кто возьмет из нее максимум. Невважно, насколько глубоки и сокровенны ваши технические знания, работа станет меньше вас раздражать, если вы научитесь убеждать других людей в своей правоте, повысите уровень окружающих вас разработчиков и разберетесь с организационными трудностями, которые тормозят все процессы. Эти навыки не просто освоить, но я гарантирую, что это возможно, и в этой книге я постараюсь показать, как это сделать.
Вы точно хотите стать стафф-разработчиком? Вам могут не нравиться старшие технические роли, и это нормально. Также нормально перейти на путь менеджера (или периодически переходить туда и обратно!) или оставаться на уровне сеньор-разработчика, решая задачи, которые вам интересны. Но если вы хотите помогать организации достигать ее целей и наращивать технологические мускулы, повышая навыки ее разработчиков, тогда продолжайте читать.
Благодарности
Спасибо всем, всем, всем, кто помогал мне с этой книгой.
Спасибо Саре Грей (Sarah Grey), лучшему ведущему редактору, и всей великолепной команде издательства O’Reilly, включая шеф-редактора Мелиссу Даффилд (Melissa Duffield); выпускающего редактора Лиз Фаерм (Liz Faerm); редактора Джоша Оледжарца (Josh Olejarz); Сьюзан Томпсон (Susan Thompson), создавшую эту необыкновенную обложку, и иллюстратора Кейт Даллеа (Kate Dullea), которая превратила мои карандашные наброски в прекрасные рисунки. Я пишу книгу в первый раз, и вы помогли мне преодолеть мой страх.
Благодарю Уилла Ларсона (Will Larson) за его одобрение и поддержку, а также за то, что он помогает стафф-разработчикам объединиться в сообщество. Благодарю Лару Хоган (Lara Hogan) за ее энтузиазм и подсказки, после того как я задала ей вопрос «Получится ли у меня написать книгу?» в личном сообщении. Спасибо вам обоим за то, что показали, как должна выглядеть настоящая поддержка.
Мне крупно повезло встретить на своем пути двух самых мудрых и проницательных разработчиков, которых я когда-либо знала. Циан Синнотт (Cian Synnott) и Катрина Состек (Katrina Sostek), эта книга стала значительно лучше благодаря вашим ревью и обратной связи за последний год. Особенно я признательна вам за вдумчивые предложения по тем частям, которые никак не получались. Критиковать конструктивно всегда сложнее, и я благодарна за ваше время и силы.
Некоторые люди потратили много личного времени на то, чтобы поговорить о моих идеях, предложить обратную связь или чему-то меня научить. Хочу особенно поблагодарить Франклина Ангуло, Джеки Беновиц, Кристину Беннетт, Сильвию Ботрос, Мохита Чеппудира, Джона Колтона, Триш Крэйн, Джунипер Кросс, Степана Давидовича, Тиарнана де Бурка, Росса Дональдсона, Тесс Доннелли, Тома Драпо, Дейл Эмбри, Лиз Фонг-Джонс, Камиль Фурнье, Стейси Гэммон, Карла Гайссера, Полину Гиральт, Тали Гутмана, Лиз Хетерстон, Моджтаба Хоссейни, Кейт Хьюстон, Джоди Ноуэр, Роберта Кенигсберга, Рэндала Коутника, Лерх Лоу, Кевина Линча, Дженнифер Мейс, Глен Мейлер, Киви Макминн, Дэниэла Микола, Зака Миллмана, Сару Милштейн, Исаака Перес Мончо, Дэна На, Катрину Оуэн, Еву Пэриш, Иветту Паскуа, Стива Примерано, Шона Риза, Джона Риза, Макса Шуберта, Кристину Шульман, Патрика Шилдса, Джоану Смит, Беату Страк, Карла Сазерленда, Кэти Сайлор-Миллер, Изара Тарандач, Фабианну Тассини, Элизабет Вотау, Аманду Уокер и Сару Уэллс. Также благодарю многих (очень многих!) людей, с которыми я переписывалась в личных сообщениях и по электронной почте, с которыми мы разговаривали в холле или вели вдохновляющие беседы в Slack. Вы сделали эту книгу лучше, я очень вас ценю.
Спасибо всем, кто пил со мной чай после обеда: каждый день вы демонстрировали единство нашего сообщества. Спасибо всем участникам канала #staff-principal-engineering в Rands Leadership Slack за вашу неустанную поддержку и за то, что вы по-дружески делились своим опытом. Огромная благодарность моим коллегам в Squarespace и сообществе Google SRE. Я многое от вас узнала. Также хочу поблагодарить Рут Ярнит (Ruth Yarnit), Роба Смита (Rob Smith), Мариану Валетт (Mariana Valette) и весь персонал конференции Lead Dev за невероятные материалы по инженерному лидерству, которыми они поделились с миром. Спасибо за то, что вы делаете.
Спасибо семье Хилфокс, включая их замечательную собаку. Мне повезло быть вашим другом, я очень этому рада. Спасибо, что позволили мне работать над книгой в вашем фургоне (и провести там карантин, пока я болела COVID!). Надеюсь на долгую дружбу и мечтаю увидеть, как вырастут маленькие дубки, которые вы посадили.
Наконец, спасибо всей моей семье – родителям Дэнни и Кэтлин и всему многочисленному клану – за ваше терпение, которое вы проявили в последний год, пока я писала книгу и выпала из жизни.
И конечно, спасибо Джоэлу и Мисс 9! Я с нетерпением жду новых встреч с вами по субботам. Спасибо Джоэлу (которому пришла идея о том, что человеческие навыки похожи на «дополнительные опоры»), за прекрасные разговоры об инженерных компаниях и о создании хорошего программного обеспечения. И спасибо за ваши сэндвичи. Спасибо Мисс 9 (когда я написала первый черновик этой книги, она была Мисс 6!) за отличные идеи, рисунки и объятия. Я ценю вас, неваляшки.
Часть I. Панорамное мышление
Глава 1. Как вы думаете, что вы здесь делаете?
Идея карьеры стафф-разработчика (или «инженерный путь») является новой для множества компаний. Организации расходятся во мнениях о том, какими качествами должны обладать самые старшие программисты и какую работу те должны выполнять. Сильвия Ботрос (Silvia Botros) пишет (https://oreil.ly/xwgRn), что тем не менее большинство единодушны в следующем: вершина инженерной карьеры – это не просто «еще более сеньорный сеньор», хотя ясного понимания, что это такое, нет. Поэтому первая глава моей книги начинается с экзистенциального вопроса: зачем компаниям нужны «самые старшие» разработчики? Потом, вооружившись ответом, мы раскроем суть роли стафф-разработчика: разберем требования к техническим навыкам и лидерские качества, которые необходимы на этой должности, а также выясним, что означает «работать самостоятельно».
Обязанности стафф-разработчика могут быть самыми разными, и существует множество способов выполнять их качественно. Однако каждая из них нацелена на решение конкретной задачи, и не любой компании нужен специалист со всем спектром возможных функций. В этой книге я расскажу, что подразумевает роль стафф-разработчика: сфера ответственности, степень влияния на рабочие процессы, место в служебной иерархии, основная цель и другие составляющие. Вы сможете использовать мой опыт, чтобы понять, как вам работать, в каком направлении профессионально развиваться или кого нанять. Наконец, поскольку разные компании по-разному понимают функционал стафф-разработчика, мы постараемся согласовать эти представления с мнением ключевых фигур компании.
Давайте начнем с того, в чем заключается работа стафф-разработчика.
Кто вообще такой стафф-разработчик
Если бы существовало только одно направление карьерного роста (как показано на рис. 1.1 слева), то многие программисты столкнулись бы с трудным и даже жестоким выбором: остаться на должности разработчика и продолжать совершенствовать свое мастерство в написании кода или перейти в менеджмент и развиваться как управленец.
Поэтому многие компании теперь предлагают «инженерную» карьеру, или путь индивидуального контрибьютора (individual contributor), позволяя программистам расти параллельно тому, как растут выбравшие «менеджерскую» карьеру. Пример такого карьерного пути показан на рис. 1.1 справа.
Рис. 1.1. Две карьерные возможности: с одним путем развития и с двумя
Карьерные возможности в разных компаниях сильно отличаются друг от друга, и для их сравнения даже создали специальный веб-сайт levels.fyi.[11] Количество этапов карьерного пути и их названия также могут быть различными. Вам даже могут встретиться одни и те же названия в разном порядке.[12] Но слово сеньор используется очень часто. Марко Роджерс (Marco Rogers), директор инженерного направления, который разработал должностные иерархии для двух компаний, назвал уровень сеньора «переходным» (https://oreil.ly/MpwsJ). Роджерс говорит: «На позициях ниже сеньора люди развивают способность работать самостоятельно, на должностях выше сеньора возрастает влияние на процессы в компании и ответственность за результат».
Иногда уровень сеньора рассматривается как «вершина»: вам больше не нужно расти в должности.[13] Но если вы все же продолжаете свой служебный рост, то становитесь «техническим лидером». Следующая ступень после сеньора обычно называется «стафф-разработчик», это название я и буду использовать далее.
На рис. 1.1 показаны два варианта карьерного роста, и программист уровня сеньор может выбирать, развиваться ли как менеджер или как стафф-разработчик. После перехода на следующую ступень изменение должности со стафф-разработчика на менеджера или наоборот нужно рассматривать как горизонтальное перемещение, а не карьерный рост. Сеньор-стафф-разработчик находится на том же уровне, что и старший менеджер, принципал-разработчик находится на уровне директора и т. д.; в служебной иерархии отдельных компаний могут быть и более высокие уровни. (Я обозначу должности, расположенные выше сеньора, словом «стафф+», которое придумал и описал Уилл Ларсон (Will Larson) в своей книге «Staff Engineer».)
Немного о должностяхИногда я слышу, как люди настаивают на том, что должности не имеют (или не должны иметь) значения. Они приводят разумные доводы в пользу того, что их компания является эгалитарной меритократией, которая сторонится опасностей иерархии, и говорят: «Мы живем в демократическом обществе и с уважением принимаем все идеи». Конечно, их позиция достойна восхищения: мнение любого человека важно, даже если он находится в самом начале своего карьерного пути.
Но все же должности имеют значение. Команда разработчиков среднего звена написала статью, в которой обозначила три причины необходимости должностей: «Они помогают осознать, что вы растете как профессионал, помогают преодолеть укоренившиеся в отрасли предрассудки и информируют окружающих об уровне вашей компетентности» (https://oreil.ly/oUkHe).
Первая причина является субъективной и, наверное, мотивирует не всех, но две другие описывают эффект, который должности оказывают на людей вокруг вас. Неважно, является компания эгалитарной или нет, в ней всегда будут те, кто по-разному относится к людям, находящимся на разных должностных уровнях, и большинство из нас хотя бы немного волнует собственный статус. Доктор Кипп Круковски (Dr. Kipp Krukowski), профессор практики по предпринимательской деятельности Государственного университета Колорадо, в своей работе 2017 года «The Effects of Employee Job Titles on Respect Granted by Customers» пишет: «Должности работают как символы, с их помощью компании информируют людей внутри и вне фирмы о компетентности своих сотрудников» (https://oreil.ly/zD3kp).
Мы постоянно оцениваем людей и неосознанно строим предположения. Если мы не приложим усилия, чтобы разобраться со своими подсознательными оценками, то скорее всего, попадем под влияние стереотипов. Например, исследование 2015 года (https://oreil.ly/snmmY) показало, что примерно половину из 557 темнокожих и латиноамериканских женщин – специалистов в области науки, технологий, инжиниринга и математики, участвовавших в исследовании, ошибочно принимали за обслуживающий или административный персонал.
Аналогичные предрассудки существуют и в отношении программистов. Бытует мнение, что белые и азиатские мужчины-разработчики более опытны и технически подкованны, а также лучше разбираются в коде, независимо от того, работают ли они уже несколько десятилетий или только вчера выпустились из университета. Женщины, особенно небелые, иногда воспринимаются как менее опытные и менее квалифицированные. Всем им приходится прилагать дополнительные усилия, чтобы доказать свою компетентность.
В вышеупомянутой статье разработчиков среднего звена сказано, что должности помогают разрушить стереотипы и дают представление об уровне компетентности программиста. Формирование правильных ожиданий сберегает специалистам время и силы, которые в противном случае пришлось бы потратить, снова и снова подтверждая свой статус. Это экономит им несколько часов в неделю.
Должность также может повлиять на работу, которую вы получите в будущем. Как и многие представители технологической отрасли, я каждый день получаю электронные письма с предложениями работы от LinkedIn. Лишь три раза я получила от рекрутеров, не читавших мою анкету, приглашение на более высокую должность, чем была у меня на тот момент. В остальных случаях мне предлагали либо позицию, которая в точности соответствовала моей, либо более низкую.
Вот что представляет собой должность стафф-разработчика в иерархии компаний. Но давайте посмотрим, зачем нужны уровни технических лидеров. Во вступлении я назвала три основополагающих навыка инженерной карьеры: панорамного мышления, реализации проектов и повышения квалификации. Почему именно инженеры должны обладать такими умениями? Зачем вообще нужны стафф-разработчики?
Работа в любой инженерной компании требует постоянного принятия решений: какие технологии внедрить, что разрабатывать, продолжать инвестировать в систему или отказаться от нее. Часто круг лиц, обязанных сделать важный выбор, четко определен и последствия предсказуемы. Но некоторые решения имеют фундаментальный характер и затрагивают всю программную архитектуру, и никто не может знать, как это повлияет на другие компоненты системы.
Для принятия правильных решений нужен контекст. Опытные разработчики знают, что ответ на большинство технологических вопросов зависит от обстоятельств. Недостаточно понимать плюсы и минусы выбранной технологии: вы должны разбираться в деталях конкретной ситуации. Что вы пытаетесь сделать? Сколько у вас времени, денег, упорства? Каков приемлемый уровень риска? Что нужно бизнесу? Ответы на эти вопросы и есть контекст принятия решения.
Определение контекста требует времени и сил. Каждая команда склонна принимать решения исходя из своих интересов, а каждый программист, скорее всего, будет сфокусирован на достижении целей своей команды. Но часто решения, принятые одной командой, имеют последствия для всей компании. Локальный максимум – это лучшее решение для отдельной команды, которое может оказаться неудачным для организации в целом.
На рис. 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 успешно сотрудничают на большом проекте, то они могут построить команду мечты.
Программное обеспечение влияет на жизнь каждого из нас. Системы, которые мы разрабатываем, напрямую затрагивают благосостояние и доходы людей: почитайте список багов, приведенный в Википедии (https://oreil.ly/eNIXO), впечатляет? Крушения самолетов (https://oreil.ly/iJgF2), сбои в системах скорой помощи (https://oreil.ly/s9GQf), неисправности в медицинском оборудовании (https://oreil.ly/fr7Dj) – ошибки и сбои в программах могут привести к фатальным последствиям, и наивно думать, что в будущем таких трагедий станет меньше.[15] Поэтому к разработке ПО нужно подходить со всей серьезностью.
Даже если риски для жизни и здоровья людей минимальны, на разработчиках все равно лежит большая ответственность за достижение поставленных целей. За редким исключением, связанным с исследованиями и новыми разработками, инженерные компании работают совсем не для того, чтобы на планете стало на одну технологию больше. Они заняты решением актуальных бизнес-задач или создают что-то для пользы людей. Они хотят достичь своих целей: создать продукт приемлемого качества и эффективно использовать ресурсы, сведя к минимуму возможные издержки в будущем.
Качество, эффективность и правильность выполнения проектов могут оказаться далеки от обещанных, особенно если поджимают сроки. Иногда сделать что-то «правильно» означает потратить больше времени, но команды, которые спешат сдать работу, могут попытаться схалтурить: пропустить тестирование или оставить код-ревью без должного рассмотрения. Написать хорошую программу непросто, одной интуиции тут недостаточно. В команде должны быть старшие, которые уже отточили свои навыки, увидели победы и поражения и теперь могут взять на себя ответственность за создание программ, которые будут работать стабильно.
На каждом проекте мы узнаем что-то новое, но опыт одного человека все равно ограничен. Это значит, что мы должны учиться на ошибках и успехах других людей. Менее опытные участники команды, может быть, никогда и не видели, как пишутся качественные программы, и думают, что главная цель разработки – написать как можно больше кода. Более опытные инженеры могут сильно повлиять на них, внедряя ревью кода, а также лучшие архитектурные практики и инструменты, которые помогут всем создавать более надежное ПО и делать это быстрее.
Стафф-разработчик – это пример для подражания. Менеджеры формируют культуру общения в команде, призывая к взаимоуважению и обеспечивая соблюдение социальных норм. А вот технические стандарты задаются самыми авторитетными инженерами. Неважно, что говорят инструкции: если самый опытный разработчик не пишет тесты, все остальные тоже не будут. Это социокультурный феномен, и никакими нравоучениями его не изменить. Когда вышестоящие сотрудники во всеуслышание хвалят чужую работу, относятся друг к другу с уважением, задают уточняющие вопросы, остальные с легкостью делают то же самое. Когда молодые программисты видят в ком-то «разработчика, которым они хотели бы стать», они стремятся работать так же, как этот специалист. (В главе 7 мы рассмотрим, как с помощью личного примера вывести организацию на новый уровень результативности.)
Теперь вы убедились, что инженерам нужно мыслить панорамно, уметь руководить крупными проектами и оказывать положительное влияние на молодых коллег, но есть одна проблема: сделать это при полной нагрузке сеньор-разработчика невозможно. Если вы продумываете стратегию, делаете код-ревью или устанавливаете стандарты, то вы не пишете код и не разрабатываете архитектуру новых систем, то есть вы не делаете работу, которую можно назвать работой программиста. Если самые опытные разработчики компании пишут код целый день, то кодовая база, конечно, улучшится, но задачи, которые могут решить только эти специалисты, выполнены не будут. В обязанности стафф-разработчика входит поиск решений для задач, оказавшихся непосильными для других инженеров. Вот это и есть его работа.
Хватит рассуждать. Что делать-то?
Обязанности стафф-разработчика могут варьироваться в разных компаниях, тем не менее у этой роли есть отличительные признаки, о которых я расскажу здесь и далее буду принимать за аксиомы.
Стафф-разработчик прежде всего – лидер. По уровню старшинства он часто приравнивается к линейному менеджеру, а принципал-разработчик – к директору. Стафф+ разработчик находится на одной ступени с менеджером того же уровня, а значит, он должен быть таким же компетентным. Может быть, вы даже окажетесь авторитетнее и опытнее некоторых менеджеров в вашей организации. Всякий раз, когда возникает ощущение, что «кто-то должен действовать», то скорее всего, этот «кто-то» – вы.
Обязаны ли вы быть лидером? Мидл-разработчики часто спрашивают меня, можно ли продвинуться по карьерной лестнице, не развивая все эти «мягкие навыки» («софт скилы»). Разве технических недостаточно? Если вы не любите общаться с людьми и стали программистом, чтобы делать инженерную работу, может показаться несправедливым, что ваш карьерный рост останавливается из-за отсутствия умения коммуницировать. Но с одними технологиями вы не сможете далеко продвинуться по карьерной лестнице. Если вы хотите выполнять масштабные задачи, то вам придется работать с большими группами людей, а для этого вам потребуется более широкий набор навыков.
Чем выше ваша зарплата, тем дороже ваше время, а это значит, что вы должны выполнять более важную работу и приносить больше пользы компании. Ваши технические решения должны соответствовать реалиям бизнеса, и вы должны понимать, стоит ли вообще браться за ту или иную задачу. По мере повышения квалификации вас будут привлекать во все более крупные проекты, которые закончатся неудачей, если в команде не будет духа сотрудничества, хорошей коммуникации и согласованности действий; ваши блестящие идеи превратятся в пыль, если вы не сможете убедить других в своей правоте. Хотите вы того или нет, с вас будут брать пример: младшие сотрудники наблюдают за разработчиками с высокими должностями, чтобы понять, как действовать в той или иной ситуации. Так что да: вам придется стать лидером.
Однако лидерство стафф-разработчика отличается от лидерства менеджера. Обычно у стафф-разработчика нет непосредственных подчиненных. Он вносит свой вклад в развитие инженерных навыков других разработчиков, но не отвечает за их производительность, а также не подписывает график отпусков и ведомости на оплату. Он не может уволить или продвинуть по службе (хотя менеджеры учитывают его мнение, оценивая навыки и результаты участников команды). Влияние стафф-разработчика на бизнес-процессы компании проявляется по-другому.
Лидерство может быть разным, и иногда его видно не сразу. Разработать «счастливый путь», который защитит программистов от общих ошибок; сделать ревью кода и проектных решений других участников команды, чтобы они стали увереннее в себе и развили свои навыки; показать, что проектное предложение не соответствует истинным потребностям бизнеса, – все это виды лидерства. Обучение – это лидерство. Планомерное повышение уровня каждого разработчика – тоже лидерство. Выбор технологического направления – лидерство. И наконец, репутация выдающегося технического специалиста, который может вдохновить других людей на реализацию своих планов просто потому, что они ему доверяют, – это тоже особый вид лидерства. Если вы нашли у себя эти черты, то вы – лидер.
Интровертом быть можно, малоприятным типом – нельзяМногих людей пугает идея лидерства. Но не волнуйтесь: не все стафф– и принципал-разработчики работают по схеме «человек – человек». Среди стафф-разработчиков найдется место для интровертов: даже самые скромные люди могут задать технологическое направление компании благодаря своим знаниям и авторитету. Чтобы стать лидером, не обязательно находиться в центре внимания. Достаточно подавать положительный личный пример и хорошо относиться к людям.
Многие из нас слышали истории про «одного программиста», которого все сторонились, потому что с ним было слишком трудно общаться. Этот типаж, описанный Саймоном Травальей (Simon Travaglia) (https://en.wikipedia.org/wiki/Bastard_Operator_From_Hell), был широко известен в 80-х и 90-х годах. В Usenet[16] и других подобных ресурсах есть множество подтверждений того, что таких людей вполне можно встретить в реальной жизни. Коллеги этого программиста не только терпели его поведение, но и принимали его странные технические решения, только чтобы с ним не связываться. Однако сегодня такой разработчик станет обузой для всех. Какова бы ни была его производительность, сложно представить, что инженер, который не хочет работать в команде, может стоить проваленных проектов, а также результатов и карьеры других программистов. Если такой человек станет еще и примером для подражания в организации, то ее ждут большие проблемы.
Если вы думаете, что этот абзац про вас, зайдите на сайт Kind Engineering (https://kind.engineering/), где Эван Смит (Evan Smith), SRE-менеджер в Squarespace, дает конкретные рекомендации, как стать по-настоящему доброжелательным коллегой. Вы удивительно быстро сможете избавиться от репутации человека, с которым трудно работать.
Стафф-разработчик не только начальник, но и хороший специалист. Он должен обладать техническими знаниями и навыками, а также интуицией, основанной на опыте работы в инженерной отрасли. Чтобы завоевать авторитет, вы должны знать, что такое первоклассное программирование, и следовать этому образцу в своих разработках. Делая ревью, вы должны улучшать исходный код или архитектуру, а также учить своих коллег чему-то новому. Если вы принимаете технические решения, то вы должны видеть все их преимущества и недостатки и помогать другим в них разобраться. Вы должны вникать в детали, когда это необходимо, задавать правильные вопросы и понимать ответы. Если вы обсуждаете конкретный план действий или изменения в технической политике компании, то вы должны понимать, о чем идет речь. Поэтому вам необходим прочный фундамент технических знаний.
Это не означает, что вы будете писать много кода. На уровне стафф+ ваша цель – эффективно решать проблемы, и скорее всего, вам не придется программировать. Возможно, вам стоит заняться архитектурным проектированием или взять на себя обязанности руководителя, то есть делать то, с чем справитесь только вы, а программирование оставить другим. Стафф-разработчики часто решают трудные, неоднозначные и запутанные задачи, проделывая ровно столько работы, сколько необходимо, чтобы эти задачи стали понятны другим и их мог довести до конца кто-то еще. Как только проблема становится разрешимой, она превращается в возможность для развития менее опытных разработчиков (иногда с поддержкой стафф-разработчика).
Для некоторых стафф-разработчиков самым эффективным инструментом решения проблем является глубокое погружение в код. Другие получают хорошие результаты, если пишут документацию, или становятся мастерами в области анализа данных, или проводят невероятно много индивидуальных встреч. Неважно, как вы решаете проблемы, главное, что вы их решаете.[17]
Когда вы только начали работать программистом, скорее всего, вами руководил менеджер: он выдавал вам задачи и способы их решения. Когда вы стали сеньором, возможно, менеджер подсказывал вам, какие проблемы важно решить в первую очередь, а поиск решения оставлял за вами. На уровнях стафф+ менеджер только делится с вами информацией, но именно вы говорите ему, что важно, а что нет. Сабрина Леандро (Sabrina Leandro), принципал-разработчик в компании Intercom, задается вопросом (https://oreil.ly/FOI1L): «Теперь вы знаете, что должны работать над важными и актуальными проблемами. Но где вы возьмете этот волшебный список отложенных трудоемких задач, которые вы должны выполнить?» И сама отвечает: «Вы же его и напишете!»
Когда вы станете руководителем, вам придется разрываться между различными направлениями деятельности компании. Но вы сами отвечаете за распределение своего времени. Количество часов в неделе ограниченно (см. главу 4). Вы сами выбираете, на что их потратить. Если вас просят выполнить какую-то работу, проявите свою компетентность: оцените, насколько высок приоритет у этой задачи, сколько времени потребуется на выполнение и какую пользу можно извлечь из достигнутого результата (включая возможность наладить дружеские отношения с людьми, попросившими вас о помощи), и решите сами, делать или нет. Если вас о чем-то просит генеральный директор (CEO, Chief Executive Officer) или другой начальник, то вы придаете его просьбе соответствующий вес. Но где самостоятельность, там и ответственность. Если выполнение поручения приведет к росту издержек для бизнеса, вы обязаны предупредить об этом. Не стоит молча наблюдать, как проблема разрастается до все больших масштабов. (Конечно, чтобы вас услышали, нужно заслужить доверие и научиться делать верные прогнозы.)
Стафф-разработчик – это технический лидер, и именно он должен убедиться, что компания выбрала верное технологическое направление развития. Основной продукт или сервис, который предлагает предприятие, – это набор технических решений: архитектура, системы хранения данных, фреймворки и инструменты, которые используются, и т. д. Неважно, на каком уровне приняты решения: команды, нескольких команд или всей организации. Ваша обязанность проконтролировать, что все сделано качественно и задокументировано. Смысл не в том, чтобы самостоятельно продумывать все (или даже некоторые необходимые!) аспекты, а в том, чтобы убедиться, что действенное решение найдено и согласовано со всеми заинтересованными сторонами.
Чем выше ваша должность, тем прочнее должны быть ваши коммуникативные навыки. Что бы вы ни делали, вам придется получать и передавать информацию. Чем лучше вы излагаете свои мысли, тем легче вам будет работать.
Разбираемся в специфике роли стафф-разработчика
Все вышеперечисленные наблюдения дают основное представление о роли стафф-разработчика, но начав работать в должности, вы быстро поймете, что есть еще множество насущных деталей! В жизни все может быть несколько иначе. Обязанности, которые вам придется выполнять, будут зависеть от размера и потребностей вашей компании, а также от ваших личных предпочтений и стиля работы.
Такая вариативность означает, что сравнивать работу разных стафф-разработчиков проблематично. И в данном разделе мы посмотрим, насколько отличается понимание функционала этой должности в разных компаниях.
Давайте начнем с позиции стафф-разработчика в должностной структуре компаний.
Пока что в нашей отрасли у стафф+ разработчиков нет общепринятого места в иерархии должностей. В некоторых компаниях самые старшие разработчики подчиняются главному архитектору или команде технического директора; в других компаниях стафф+ разработчики подчиняются директорам разных структурных подразделений, или менеджерам разных уровней, или вообще и тем и другим одновременно. Здесь нет одного правильного варианта, но есть много неправильных, и все зависит от поставленных целей.
Ваша позиция в иерархии компании (см. пример на рис. 1.3) влияет на многое: какую поддержку вы получите, к какой информации вам предоставят доступ и зачастую то, как вас будут воспринимать коллеги вне вашей группы.
Рис. 1.3. Стафф+ разработчики на разных уровнях иерархии. Разработчику А намного проще получить исчерпывающую информацию о бизнес-процессах организации и говорить на уровне директоров, чем разработчику D, даже если разработчики А и D имеют одинаковый уровень профессионализма
Ваш руководитель находится высоко в служебной иерархии
Если ваш непосредственный руководитель занимает высокую должность, например, это директор или вице-президент, то вы получите более полную картину бизнес-процессов компании. Вам откроется доступ к важной и значимой информации, но в то же время вам придется решать более серьезные задачи. Работая под руководством компетентного и опытного человека, вы сможете наблюдать, как он принимает решения, ведет совещания или выходит из сложной ситуации, и получить уникальный и ценный опыт.
С другой стороны, такой руководитель будет уделять намного меньше времени вашей работе, чем менеджер вашего подразделения. Вы будете меньше общаться, а значит, у него будет меньше возможностей поддерживать вас и помогать развиваться профессионально. Разработчик, который тесно сотрудничает с отдельно взятой командой, но подчиняется директору, может чувствовать себя оторванным от остальных коллег или отвлекать директора на разногласия, которые можно урегулировать на более низком уровне.
Если вашему руководителю часто не хватает времени, чтобы разбираться в работе, которую вы делаете, или его втягивают в обсуждение низкоуровневых технических решений, растрачивая его время впустую, то вам, скорее всего, будет комфортнее работать с менеджером, задачи которого в большей степени совпадают с вашими.
Ваш руководитель находится низко в служебной иерархии
В том, что ваш непосредственный руководитель занимает более низкую должность в структуре компании, есть свои преимущества и недостатки. Возможно, он будет уделять вашей работе больше времени и сможет оказывать вам поддержку в сложных ситуациях. Если вы предпочитаете фокусироваться на какой-то одной технической области, то вам будет удобнее работать с начальником, который хорошо в ней разбирается.
Однако стафф-разработчику, закрепленному за отдельной командой, будет трудно оказывать влияние на принятие решений, касающихся деятельности всей организации. Нравится вам это или нет, но люди обращают внимание на статус, позицию в структуре должностей компании и порядок подчинения. У вас будет меньше возможностей влиять на рабочие процессы, если вы будете в подчинении у линейного менеджера. Вы не сможете получать исчерпывающую информацию о деятельности компании в целом, и вам придется довольствоваться только теми данными, которые необходимы для решения задач вашей отдельной команды. Если у вашего руководителя нет доступа к какой-либо информации, то и у вас, скорее всего, его тоже не будет.
Если ваш начальник линейный менеджер, он может оказаться менее опытным, чем вы. Это не проблема, но это ограничивает ваши возможности учиться у своего руководителя, и это точно не будет способствовать вашему карьерному росту: ваш начальник просто не сможет вам помочь. Но все это не важно, если ваши потребности в опытном наставнике закрываются другими способами.[18] Например, если должность вашего руководителя недостаточно высокая, постарайтесь найти возможность принимать участие во встречах «через уровень» (skip-level meetings), то есть в совещаниях с начальником вашего начальника.[19] Найдите способ оставаться в курсе всех ключевых событий в вашей организации.
Если у вас и вашего руководителя разные представления о том, каким образом вы можете принести наибольшую пользу компании, то между вами могут возникнуть разногласия. В итоге вы можете столкнуться с проблемой локального максимума, которую я упоминала ранее, когда ваш начальник хочет, чтобы вы работали над задачами, важными для команды, хотя существуют цели, которые важны для всей организации и которых можете достичь только вы. Если начальник может повлиять на оценку вашей работы в компании и размер причитающегося вознаграждения, то вам будет трудно обсуждать с ним технические вопросы и приоритетные задачи на равных. Если с вами происходит что-то подобное, то, возможно, вам следует поднять вопрос о переводе на более высокий уровень подчинения.
Позиция в структуре должностей компании, скорее всего, повлияет на то, какой будет ваша сфера ответственности: какие задачи вам предстоит решать и с какими командами работать, отвечая за их результаты, даже если вы формально не будете являться их руководителем.
Вы должны будете определять краткосрочные и долгосрочные цели команды, быть в курсе важных нововведений, иметь свое мнение насчет планируемых изменений и поддерживать коллег, которые не имеют достаточных полномочий, чтобы воспрепятствовать принятию технических решений, негативно влияющих на их работу. Вы должны продвигать и развивать следующее поколение сеньор– и стафф-разработчиков, находить и предлагать проекты и возможности, которые помогут им вырасти по службе.
Может быть, ваш начальник будет ожидать от вас, что бо́льшую часть своего времени и мастерства вы посвятите решению проблем, которые находятся в его компетенции. Или вас просто «припишут» к какой-то команде, а на самом деле вы будете заниматься увольнениями и повышениями во всей организации. Если вы окажетесь в подчинении у директора, то другие сотрудники, возможно, будут неявно подразумевать, что вы работаете на высоком уровне и связываете воедино все, что происходит в компании, или же вас могут явно распределить в какую-то подгруппу команды директора или назначить ответственным за определенный круг технических вопросов. Выясните, что именно вас ждет.
В критические моменты жизни компании будьте готовы выйти за пределы своей сферы ответственности: например, во время программных сбоев понятия «не моя работа» не существует. Также научитесь выходить за рамки своей ежедневной рутины: руководить, когда потребуется, учиться тому, чему вы должны научиться, чинить то, что сломалось. Стафф-разработчик приносит пользу компании, только если не сидит на своем месте, как «сверчок на шестке» из пословицы.
Так или иначе, я рекомендую вам тщательно разобраться, за что вы отвечаете в компании, даже если ваши обязанности со временем изменятся.
Сфера ответственности слишком велика
Если ваша сфера ответственности слишком велика (или не определена), то у вас могут появиться следующие проблемы.
Отсутствие ощутимых результатов
Если на вас можно свалить что угодно, то скорее всего, на вас свалят вообще все, особенно если в организации слишком мало старших сотрудников. С другой стороны, может случиться так, что вы будете выполнять только побочные квесты, не имея какой-либо основной цели.[20] Постарайтесь не распыляться на мелочи. Иначе у вас (или у того, кто вас нанял) появится ощущение, что вы ничего не достигли.
Снижение скорости принятия решений
Если в организации есть старший сотрудник, который «делает все», то остальные сотрудники могут подумать, что он должен участвовать в принятии любого решения. В итоге вместо того, чтобы ускорить работу организации, такой сотрудник, наоборот, ее замедлит, потому что без него никто ничего не сможет решить.
Усталость от принятия решений
Если вы не научились не распыляться на мелочи, значит, вы постоянно тратите силы на то, чтобы решить, что именно вам нужно сделать. В главе 4 мы поговорим о том, как выбирать себе задачи.
Сложности в налаживании дружеских связей
Если вы работаете с большим количеством команд, то вам будет сложнее установить регулярные контакты и построить дружеские отношения, которые облегчают выполнение задач (и делают работу приятной!). Остальные разработчики тоже в проигрыше: они не получают наставничества и поддержки, которую может дать «свой» стафф-разработчик, вовлеченный в их задачи.
Если в компании вы можете заниматься буквально любыми вопросами, то вам будет трудно работать. Лучше выберите одну проблему, поработайте над ней и добейтесь ощутимого результата. Полностью посвящайте свое время решению строго определенных задач. Затем, если будете готовы, переходите к другой проблеме.
Сфера ответственности слишком мала
Узкой сферы ответственности также стоит остерегаться. Вот типичный пример: стафф-разработчик является членом команды и подчиняется линейному менеджеру. Менеджерам это даже нравится: они получают очень опытного программиста, который может решать множество задач по проектированию программной архитектуры и техническому планированию и также может быть техлидом или тимлидом на проекте. Некоторых разработчиков это тоже устраивает: они по-настоящему могут углубиться в технологии и задачи команды, понять все тонкости работы. Но помните, что у слишком узкой сферы деятельности есть свои риски.
Отсутствие ощутимых результатов
Возможно, вы потратите свои силы на то, что не требует внимания и мастерства стафф-разработчика. Если вы решили все свое время посвятить одной команде, то у этой команды должны быть критически важные задачи; если вы задумали по-настоящему углубиться в технологию, то это должна быть технология центрального компонента системы; в любом случае это должно быть что-то очень значимое для компании.
Упущенные возможности
На стафф-разработчиков обычно высокий спрос. Если вы прикреплены к одной команде, вам будет трудно участвовать в решении других проблем организации, например, ваш начальник просто не захочет вас отпускать.
Другие разработчики уходят на второй план
Узкая сфера ответственности может означать, что для вас недостаточно работы. Вы можете затмевать собой менее опытных специалистов и не давать им профессионально расти. Если у вас достаточно времени, чтобы ответить на все вопросы и взять на себя абсолютно все запутанные задачи, то у других нет возможности развиваться.
Чрезмерное усложнение
Не сильно загруженный разработчик часто делает ненужную работу, чтобы чем-то занять себя. Если вам встретилось чрезмерно сложное решение простой задачки, то скорее всего, это дело рук стафф-разработчика, которому в следующий раз надо дать кейс потруднее.
Некоторые технические области и проекты настолько сложны, что программист может посвятить им всю свою жизнь и так и не исчерпать всех возможностей. Просто выясните, работаете вы в такой области или нет.
Если все в компании согласны, что ваша работа важна и приносит ощутимые результаты, у вас появляется достаточно свободы выбора в том, как именно ее выполнять. В том числе определить для себя, в чем именно она заключается. Задайте себе следующие вопросы:
Вы выбираете подход «в глубину» или «в ширину»?
Вы предпочитаете четко фокусироваться на конкретной проблеме либо технологической области? Или же вы склонны работать с несколькими командами либо технологиями и фокусируетесь на одной проблеме только тогда, когда ее нельзя решить без вас? Ответы на эти вопросы во многом зависят от индивидуальных черт вашей личности и вашего стиля работы.
Однозначно правильного варианта нет, но если ваши предпочтения совпадут с вашими служебными задачами, то вам будет легче и приятнее выполнять свои обязанности. Например, если вы хотите заняться разработкой технической политики предприятия, то вам нужно будет ознакомиться со всем спектром мнений по этому вопросу. Вам придется участвовать в принятии решений и браться за проблемы, затрагивающие множество команд. Если же вы сосредоточитесь на одной, пусть даже важной, архитектурной задаче, то у вас не будет достаточно полной информации обо всех аспектах и нюансах процесса и стратегической цели по изменению технической политики вы не достигнете. С другой стороны, если вы хотите стать экспертом в определенной технической области, то вам нужно сосредоточиться на ней и посвящать ей бо́льшую часть своего времени.