В конце 2017 года я твёрдо решил, что хочу перейти на руководящую работу.
Программирование само по себе привлекало меня гораздо меньше, чем то, что происходило на уровень выше, а именно обдумывание бизнес-процессов, планирование архитектуры приложений и организация работы.
Я чувствовал себя не столько садовником, который день за днём возделывает маленький клочок земли, наблюдая за проклёвывающимися сквозь землю ростками, сколько фермером, которому надо собрать, а затем продать урожай с гигантского поля размером с европейскую страну.
Масштабность и эффективность меня вдохновляли.
Я хотел заниматься тем, что мне нравилось, но это было невозможно, пока я не стану руководителем.
Тем временем моя карьера на текущем месте работы совершенно очевидно достигла потолка. За два года я поднял несколько проектов, стал старшим разработчиком… Дальше тут можно было прогрессировать только в игре в настольный футбол.
Поэтому когда мне предложили работу в Сбербанке, я был рад уйти. Конкретно — в ДомКлик.
ДомКлик
Переступив порог нового офиса, я оказался в уникальном положении: выяснилось, что я буду единственным Ruby-разработчиком в компании.
В коллективе из трёх сотен сотрудников просто физически не было соответствующего отдела. Меня даже посадить было некуда. Когда встал этот вопрос, IT-директор компании подумал ровно две секунды и указал на стол рядом, который пустовал по вполне очевидной причине. Это же так вдохновляет, когда руководство может видеть экран твоего ноутбука, чуть повернув голову (нет).
Я был нужен для выполнения конкретной задачи. Менеджмент решал, покупать ли один американский стартап в сфере банковского дела, чтобы дополнить линейку продуктов ДомКлик. Траты планировались большие, поэтому нужно было адаптировать и запустить проект для демонстрации людям, которые эти деньги достанут из кармана.
Стартап был на Ruby, поэтому понадобился я. Это был шанс. Если бы его всё же купили, понадобились бы ещё рубисты. и с большой долей вероятности я стал бы их начальником. Маленькая личинка Чужого, попавшая в гигантский организм ДомКлик. Мне нравилось думать об этом именно так, представляя, что именно с этого момента начинается мой захват этой Вселенной.
Но через два месяца на новом месте оказалось, что скрипач больше не нужен. Топы посмотрели проект, над которым я работал, и решили обождать.
Рубистам тут не место
Я оказался без работы, один единственный Ruby-программист в окружении десятков слаженных команд джавистов, питонистов и фронтендеров. Никаких других рубистов больше набирать не планировалось.
К счастью, моему руководству в целом понравилось, как я выполнил работу, поэтому вопрос об увольнении не стоял. Что делать со мной дальше, тоже не знали. «Походи пока, подумай, чем ты можешь быть полезен компании. Может, попробуешь кодить на Go?» — сказал мне начальник. Я был настолько не нужен, что в какой-то момент это перестало казаться плохой идеей. Чтобы представить отчаянность моего положения, нужно понимать, что происходило в компании тогда и что вообще такое ДомКлик.
Если в последние 5 лет вы покупали/продавали недвижимость, то с большой долей вероятности должны знать про этот сайт. В частности, из-за него НТВ больше не снимает сериалы про кровавых риэлторов и мы не слышим эти леденящие истории про то, как кого-то похитили/пытали/убили, когда он решил разменять бабкину двушку в центре. ДомКлик предложил рынку удобный и безопасный способ купить/продать жилплощадь.
Проект был ещё молод, но уже в тот момент все понимали, что присутствуют накануне грандиозного шухера. Рождается гигантский сайт с десятками сервисов, которыми станут пользоваться по всей стране и за её пределами. Понадобятся миллионы строк кода, а значит очень много программистов смогут годами кормить свои семьи, покупая тёщам путёвки в санатории, а жёнам котиковые манто.
Но сперва надо было решить, на чём будут написаны эти сервисы. На мою беду, к моему появлению дискуссия была закрыта — кубок поделили между собой разработчики на Java и Python. Джависты занимались, в основном, внутренними и нагруженными сервисами, интеграциями с банком, а питонистам достались более клиентоориентированные задачи и новые запуски. Каждый из них готовился в ближайшие 5 лет купить квартиру и пакет акций Tesla, съездить на Ба̒ли и найти девушку-инстамодель.
Вклиниться между ними с какой-нибудь другой технологией было нереально.
Обычно рождение нового проекта происходило таким образом: у бизнеса появлялась идея, они шли к IT-директору, а тот уже подбирал под проект освободившуюся команду программистов, либо набирал новую.
Что мог сделать в такой ситуации один рубист? Мог ли я поднять руку и сказать: «А вот на Ruby для всего этого уже есть готовые гемы»? Это было бы совершенно пропащее дело по трём причинам:
- Все считали, что Ruby банально не нужен. Python и Java хватает за глаза.
- Помимо того, что Ruby не нужен, это ещё и просто плохой язык программирования. Совершенно не тру.
- Третья причина, пожалуй самая серьёзная: я единственный Ruby-программист в компании, а значит банально не потяну работу ни над чем более менее серьёзным.
В общем, так или иначе, а в компании существовал консенсус: рубистам тут не место. Моё появление было случайностью, подтверждающей правило — мне настоятельно советовали начать кодить на чём-нибудь другом.
Но человека, познавшего силу рельсов, так просто не остановить.
Ruby
Несмотря на статус-кво «Ruby плохой», все знали о его сильной стороне — скорости разработки. Я решил этим воспользоваться и предложил начальству делать прототипы сервисов, которые планировались к запуску. Вроде как «а давайте я быстренько напишу пробник вашего стартапа и тогда точно станет ясно, стоит ли переписать его на «нормальном» языке или лучше сразу в утиль».
Идею оценили и благословили. Это был мой второй шанс. Синяя птица удачи практически трепыхалась в моих руках, когда я почувствовал, что проигрываю гонку. После небольшого MVP бизнес накидал мне функциональности, которую хотел видеть в пробной версии CRM, и это был совершенно неподъёмный объём работы, несмотря на скорость первичного запуска. Силами одного меня, даже заряженного нежеланием перекрещиваться в питонисты, сделать требуемый пробник в обозримое время было невозможно.
Я сидел перед ноутбуком и мрачно наблюдал за тем, как опаздываю всё сильнее и сильнее. Вместе с последней надеждой остаться рубистом уходили и карьерные амбиции: одному Макаронному Монстру известно, сколько времени понадобится, чтобы достичь в новом языке компетентности, необходимой для того, чтобы снова выкрикнуть своё имя на выборах нового Кракена.
Это не считая того, что меняя язык, к примеру, на Python, я автоматически получаю 150 более заслуженных соперников на повышение.
Это был тупик.
С меня сняли задачу и вернули к тревожным мыслям о своём будущем. Я смотрел батлы Версуса, слушал депрессивную музыку и пил Доктор Пеппер. Видимо, из-за обилия сахара решение появилось довольно быстро.
Я вынес урок из последнего фиаско: нельзя откусывать кусок, который не сможешь прожевать. Люди видят, как ты остался в дураках, и запоминают. Ещё одна-две такие попытки, и на мне здесь поставят крест, решив, что я неудачник.
Теперь нужна задача, про которую я буду точно знать, что осечки не случится. Достаточно большая, чтобы её достижение впечатляло, но достаточно маленькая, чтобы быть мне по силам. Но где такую взять и как добиться того, чтобы мне её поручили?
Проще всего такую задачу было найти в рамках уже разрабатываемого проекта. План состоял в том, чтобы притвориться Java-разработчиком.
Нарушитель спокойствия
У джавистов было неплохо. Поначалу мне казалось, что я попал в команду настоящих тру-кодеров, работающих чётко по паттернам, с интерфейсами. Никогда до этого я не чувствовал себя настолько программистом, как в ту пару недель.
Из-за своего поверхностного знания практически всех популярных веб-языков я довольно быстро адаптировался и стал приносить пользу. Работа двигалась. Проект даже запустили в нескольких регионах, чтобы начать отлов багов. Проблема была в том, что движение было уж очень неспешным, несмотря на то, что нас было пятеро. Я делал скидку на то, что так и должно быть, ведь это энтерпрайз, понимать надо, но быстро вскрылось, что всё гораздо серьёзнее.
Команда находилась в резком конфликте с владельцем продукта. Они ругались, практически не выбирая выражений.
Первая строчка кода была написана полтора года назад, но проект до сих пор толком не работал. Хорошая бизнес-идея столкнулась с необъяснимыми проблемами на этапе реализации. Основная претензия PO, выступавшего посредником между бизнесом и программистами, состояла в невозможности внесения быстрых изменений. На просьбу любой правки он слышал: «Месяц, месяц, месяц». А правок требовалось очень много. Система была такой неудобной, что один оператор мог обработать за день максимум одну-две заявки. Функциональность вроде работала, но багов было столько, что запустив её на всю страну можно было просто утонуть в жалобах. Некоторые операции совершались только по звонку программисту, и тот вручную менял данные в базе данных или озвучивал нужную информацию. Пользовательский интерфейс работал криво. Ни о какой автоматизации не было и речи.
И на фоне всех этих проблем программисты умудрялись заниматься изобретением велосипедов вроде самописного аналога таблиц или сервиса почтовой рассылки. Малейшие доработки приводили к тому, что что-то где-то обязательно отваливалось. Все мыслимые дэдлайны были давно просажены.
И знаете, как программисты объясняли себе происходящее? «PO тупой и все его предложения ни о чём».
Мне же казалось, что дело не в PO, а в коде. Когда прилетела очередная срочная задача, я понял, что пора срывать маски. Нужно было сделать систему опросников, по результатам прохождения которых будет формироваться готовый документ. Программисты из моей новой команды, посовещавшись, озвучили PO, что сделают требуемое за три месяца усилиями двух разработчиков.
Три месяца и два программиста!
Диван под PO дымился. Он зеленел, но, наученный горьким опытом, молчал, зная, что просить, умолять или жаловаться бесполезно. Впереди маячила перспектива увольнения. Но мебель дымилась не только под ним. Я точно знал, что только что озвученная функциональность поднимается в Ruby по щелчку пальцев.
— Я напишу это за неделю, — сделал я ход. — И у меня ещё останется время пересмотреть все батлы с Оксимироном.
Задача была как раз такая, как я ждал, чтобы ворваться в эту игру престолов.
PO не поверил. Команда тоже. В их Вселенной минимальной единицей времени был месяц, но сроки действительно горели, поэтому после недолгого улаживания формальностей неделя была мне дана.
Как вы, возможно, знаете, Ruby богоподобен для скоростной разработки. Я бы покривил душой, если бы сказал, что прям старался или сколько-нибудь беспокоился из-за своего третьего шанса. Гем, который решал мою проблему, был доведён в Ruby до совершенства и работал как часы.
Через неделю я показал результат.
— Почему тогда мы не делаем всё на Ruby? — спросил владелец продукта. Если честно, я до сих пор не знаю ответа.
В тот день у нас состоялся откровенный разговор. Остапа понесло, и он раскрыл мне истинное положение дел. Проект превратился в адский долгострой. Непосредственное начальство PO уже прямо намекало ему на увольнение. Он перестал спать. Я посочувствовал ему и попросил описать всю логику, которую должно было выполнять приложение. К тому моменту, когда он закончил, мне стало ясно, что с двумя товарищами я перепишу весь проект месяца за три.
Программисты проекта не были плохими людьми или саботажниками. Они правда старались. Просто их инструмент не был приспособлен к этой задаче. Они копали котлован ложками. А вот у меня был бульдозер.
Четвёртый шанс
Когда мы с PO пришли к IT-директору, тот, кажется, уже начал понимать, что перекрестить меня в очередной раз не вышло, и с любопытством ожидал, что же я придумал на этот раз.
Я предложил переписать проект. За три месяца с двумя помощниками я полностью повторю функциональность, которую сделалии 5 программистов за полтора года, и ещё накидаю фишек сверху. В свою очередь РО подтвердил, что это необходимо: код проекта начал жить собственной жизнью, практически не реагирует на попытки сделать правки и, похоже, скоро начнёт требовать человеческие жертвы в виде девственниц.
Было решено, что окончательное решение по этому вопросу будет принято на ближайшем архитектурном комитете — специальной встрече, на которой собираются директора с архитекторами и утверждают какой-то процесс.
Как вы догадываетесь, тот факт, что вы читаете эти строки, говорит о том, что переписать проект мне разрешили. С минимальным перевесом голосов архкомитет дал добро на эту авантюру. В том числе мне разрешили набрать двух рубистов в помощники.
Я наконец-то стал руководителем.
Как я понял, не последнюю роль в одобрении моей инициативы сыграло то, что руководство начало сознавать расслабленность и чрезмерную уверенность в завтрашнем дне у части программерских команд компании.
Нужен был какой-то кнут, угроза, чтобы мотивировать их работать лучше. Добрым словом и пистолетом можно добиться гораздо больше, чем просто добрым словом, как любил говаривать Аль Капоне.
И я вкладывал в их руку этот пистолет.
Давая добро на переписывание проекта, начальство как бы говорило программистам компании: «Будете лажать — мы позовём вот этого парня и вас перепишут».
Но для начала нужно было не провалить задание, ставшее моим четвёртым шансом. Когда я вернулся с совещания, это была уже совсем другая компания. Теперь меня ненавидели. Мой конфликт с программерской экосистемой ДомКлик, начавшийся с самого появления, достиг апогея. Со мной не говорили, не садились за один стол в столовой. Стоило мне войти в помещение, как все присутствующие начинали меня рассматривать. За моей спиной шушукались. Я оказался в полной изоляции.
Сказать честно, такая реакция придавала мне сил. Жизнь наполняется смыслом, когда чувствуешь себя разящей десницей господа. Я решил, что буду очень хорошим пистолетом.
Буквально в тот же вечер я позвонил старому товарищу, кодившему на Ruby, в профессионализме которого был уверен. Он без лишних разговоров согласился присоединиться. Через пару недель пришел второй разработчик и оказался реально крутым парнем, здорово укрепившим наш маленький заградотряд.
Программерский организм компании нас отвергал. С нами не общались. Все ждали нашего провала. И парадоксальным образом это нас сплачивало и заставляло расти.
Особенностью Ruby является высокая скорость разработки. Почему-то считается, что это идёт в ущерб качеству. Мол, идеально выполненный проект на Ruby будет хуже идеального проекта на любом другом языке.
Но где вы видели идеальные проекты?
У разрабов почти всегда не хватает времени, чтобы писать код качественно, строго придерживаться паттернов, делая всё как в учебниках. В результате этот самый идеальный код, которым все так грозятся, так никогда и не появляется.
А вот Ruby из-за своей скорости позволяет получить тот самый излишек времени, который можно пустить на обдумывание архитектуры и поиск лучших абстракций. Получившийся код парадоксально оказывается ещё и максимально качественным.
Когда спустя три месяца мы выкатили новую версию проекта, то, не считая мелких багов, он работал идеально. Конечные пользователи проекта — юристы Домклик — поначалу были недовольны, ведь изменились пользовательские интерфейсы, но уже через пару недель их голоса утихли. Проект работал как часы. Его практически сразу развернули на всю Россию.
РО был счастлив. Старую команду проекта расформировали.
Мне разрешили набрать ещё двух программистов.
Мой маленький заград-взвод разворачивался в полноценную роту. Нас ненавидели, но сделать уже ничего не могли.
Мои ребята чувствовали особенность своего положения. Они рашили, и у них всё получалось. Возникло чувство потока — состояние максимальной собранности и готовности к действию. Мы могли качественно и быстро переписать тут всех.
Это подстегнуло всю компанию.
Помимо страха быть переписанными появилось и вполне себе здоровое чувство соревнования. Если эти новенькие могут работать так быстро и качественно, то чем мы хуже? Отстоим родную компанию! Сбросим этих выскочек обратно в преисподнюю, из которой они явились!
Часть коллектива подняла перчатку, брошенную рубистами, и это пошло на пользу всей компании. Фактически коллектив поделился на братишек и лахеров.
Братишки прогают по паттернам, всегда готовы прийти на помощь, думают о выгоде компании и успехе своего проекта. Лахеры тянут время, не признают ошибок, не хотят переучиваться и договариваться. Делаешь чётенько — братишка. Тупишь, ставишь палки в колёса, вредишь, хочешь зарабатывать много, а делать мало — лахер.
Мы успели отлично сработаться и установить знамёна Ruby над завоеванным ДомКликом, когда на меня вышел финальный босс этой истории.
На одном из совещаний в высоких кабинетах, после длинного рассказа о новом проекте, один очень интеллигентный человек негромким голосом попросил: «Покажите мне это в понедельник».
А показывать было нечего. Был вечер пятницы. Когда меня позвали в переговорку, вокруг сидели напряженные лица и держались руками за головы, думали, как быть. Минимальный срок, за который готовы были сделать проект остальные — «не меньше двух недель», а было три дня. Я согласился.
Вся компания ждала, чем это закончится. Рядовые сотрудники с любопытством, начальство — с ощущением надвигающейся беды. И когда в понедельник взошло солнце, никому не пришлось писать заявления об уходе, стреляться или бежать через государственную границу.
Всё работало на проде. Кнопочки нажимались, страницы обновлялись, и все были счастливы. А где-то в Москве мертвецким сном спали трое небритых программистов.
Когда вечером я поднял трубку, мне сказали главные три слова в моей жизни: «Набирай ещё программистов».
На сегодня отдел рубистов составляет около 20 человек, 6+ проектов разной сложности, и мы продолжаем расширяться.
А теперь мораль этой истории.
Как-то на одном из квартальных собраний прозвучал вопрос к нашему бессменному лидеру: «Как мне стать руководителем?», на что была дана цитата: «власть не дают — власть берут». Будьте эффективны, стремитесь к успеху, и если вы правда готовы становиться лучше каждый день, всё получится.
В общем, жизнь слишком коротка, чтобы писать длинный код. Пользуйтесь гемами, друзья!
P.S. Также вот видео с нашими выступлениями, из которых можно понять, что позволяет нам быть быстрыми и эффективными:
Автор: Алексей Антонов