Вопрос с собеседования тим-лида: что делать, если деньги на проект получены и истрачены, а проект не готов

Вопрос с реального собеседования (6 лет назад)
Позиция: руководитель группы разработки, team-leader, технический лидер в компании, занимающейся разработкой программного обеспечения для веб и для мобильных приложений
Ситуация: команда получает проект, довольно длинный по времени. С заказчиком составили техническое задание, график выполнения и договорились о постепенной оплате работы. Скажем план на год, а заказчик будет делать оплату 4 раза, каждый квартал.

Прошел год. Оплата получена вся, 100%. А тех задание выполнено на 80%. Нужно ещё 20% сделать. Самое главное, архитектор проекта утверждает, что эти 20% в модель не вписываются, надо переписывать заново. Я, как кандидат на руководителя, должен проанализировать ситуацию, принять решение, согласовать с заказчиком.

6 лет назад я был в замешательстве. И сейчас тоже не имею 100% ответа. Мой ответ не устроил тогда. Не знаю, устроит ли сейчас.

Финал первый. Если проект, готовый на 80%, не может быть закончен из-за плохой архитектуры — архитектора уволить или отстранить от этого проекта. Но лучше уволить. Хотя жалко. Но он зациклился на красоте кода. Но получилось не гибко. У него было время, он пытался, но вот такая ситуация. Уволить, назначить другого. Сообщить заказчику, что проект затянулся, нужно дополнительное время и деньги. Мы перепишем заново за ещё один год. Заказчик откажется. Вернуть деньги не сможем. Репутация компании испорчена. Плохие отзывы. Либо вернём деньги, но мы разорены. Все в жопе. Отматываем кассету с этим фильмом назад, на момент начала финального разговора с заказчиком.

Финал второй. Проект готов на 80%, осталось 20%, больше денег от заказчика нет. Сказать команде, что надо сделать оставшиеся 20% забесплатно. Часть команды уволится, возможно в тот же день. Либо напрягутся и сделают, несмотря на уверения архитектора. Закостылят по-чёрному, напишут ужасные страшные решения, самый вонючий говнокод. Заказчик получит своё решение с опозданием на 1…3 месяца. Репутация сохранена. Компания сохранена. Потеряна часть команды и командный дух. Можно продолжать, но отматываем финал второй назад.

Финал третий. Выяснить причину почему 20% не могут быть решены. Заказчику сообщаем, что 20% не могут быть реализованы. Говорим правду, посыпаем себе голову пеплом. «Пытались до самого последнего, но ничего не выходит. Задача не решается программным способом. Целый год искали, найти не смогли. Нужны другие решения. Давайте эти 20% зафейлим, переформулируем, попробуем сделать иначе.» У заказчика почти готовое решение, возможно даже уже в эксплуатации. Он не захочет бросить то, что уже оплатил и чем уже пользуется. Он соглашается зафейлить требования, «зафлексить», переформулировать, продолжить. Репутация сохранена. Команда сохранена. Архитектор поглажен против шерсти, но сохранён. Вроде вышли из ситуации, но… отматываем кассету, теперь на год назад.

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

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

Ремейк. Теперь про фейл архитектора. Да. Это его личный фейл. Пусть выпьет водки и погрустит, через год, ЕСЛИ проект зафейлится, ЕСЛИ он будет уволен, ЕСЛИ команда развалится, ЕСЛИ компания обанкротится. НО мы даже не дойдём до такой ситуации! Потому что мы команда.

Примите факт, что я сейчас даю правильные решения. С того собеседования прошло шесть лет. Сейчас я делюсь опытом и не ошибаюсь.

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

Я могу ошибиться. Ты можешь ошибиться. Заказчик мог ошибиться ещё при постановке технического задания. Архитектор мог ошибиться в выборе архитектуры и технологий. Придумать то, что не нужно. Не придумать то, что нужно. И команда разработки может ошибиться — сделать всё как попало, наперекосяк и с багами. Могли ошибиться с оценкой сроков. Могли ошибиться с выбором алгоритмов. Ошибаются все. Правило «век живи — век учись» — актуально. Принцип OpenMind — актуален. Люди ошибаются, учатся. Лучшие программисты ошибались десятки раз. За идеальной архитектурой прячутся десяток кривых решений.

Но нет отдельно взятого человека, который умнее всех. Нет более умного даже среди команды. Есть чуть более опытный. Он обжёгся и НЕ ДАСТ обжечься другим, ЕСЛИ его спросят. Он выиграл и МОЖЕТ дать совет выигрышной стратегии, ЕСЛИ его спросят. Для этого его надо спросить. Не факт, что ОПЫТНЫЙ является архитектором, ну то есть принимает решения. Он может быть начинающим тестировщиком, который скажет, что ЭТА часть решения чрезвычайно сбойная, потому что в прошлом ему никак не удавалось написать тест на неё. Это может быть спец  по поисковой оптимизации, который скажет, что из-за ТАКОГО архитектурного подхода в прошлом у проекта органического трафика не было вообще, поисковая система даже не видела всю красоту, потому что она исключительно RIA, и SPA, и browser-side only. Это может быть админ, который скажет, что ЭТОТ пакет вообще не собирается на Debian 5 + Python 2.27, которые стоят у заказчика на серверах, а значит нам придётся писать все алгоритмы самостоятельно, а не пользоваться готовым пакетом.

В той части фильма, которая находится между началом и концом кассеты, которую я быстро промотал — там ДОЛЖНО находиться что-то, что может позволить команде принимать решения совместно, заранее предусматривать ситуации этих нерешаемых 20%. Там архитектор учится. Там каждый учится. Там команда помогает друг другу. Там команда становится опытнее. Её навыки растут.

Но я не знаю точно, как это делается. Я знаю, как я сам наращиваю свои навыки. Знаю, как помочь тем, кто просит. Но 100% верного решения нет. Особенно в том, как именно выбрать то, что надо вырастить.

К примеру, я за год изучил AngularJS 1, VUE,js 2, Twitter Bootstrap 3, Semantic UI 2, M.E.A.N., Phalcon 3, Yii 2, Laravel 5, Webpack, GULP, SCSS, LESS. Прокачался так, что голова кружится от ощущения собственной крутоты. Но в решениях компании, где я работаю, эти технологии не используются. Меня разрывает от гордости, но команде ни холодно, ни жарко от моих навыков. Они могли бы спросить меня, какой язык или фреймворк выбрать для нового проекта, но выбирать не приходится — мы работаем на одном стеке уже три года, переписывать заново не собираемся. Монопродукт. Были направления, в которых команда нуждалась в новых навыках, но я про них не думал.

Зачем я вообще изучал эти технологии? Хотел и изучал. Чем опытнее становишься, тем проще изучать. У меня это уже непрерывный процесс изучения чего-либо. Мог бы изучить что-либо другое, я вообще открыт к знаниям, мне нравится пробовать и экспериментировать. Вопрос — с чем экспериментировать? Сейчас я вижу, что если бы год назад мне сказали, что в мае будет то, а в сентябре это — я бы подстроился и изучил нужное. А поскольку я выбирал сам, то в какой-то мере ошибся, потому что не спросил команду. В мае был неготов тут, в сентябре был неготов там. Были сложные ситуации, а я ничего не мог сделать. Решения принимали наобум, как попало, закрывая баги вслепую. Еле пережили возможную ситуацию выпадения из органического поиска. Кое-как пережили самостоятельно выращенный DDoS против себя же.

Ещё один момент — рост личных навыков есть, а рост пользы для компании нет. В конце года поднял бы вопрос: пожалуйста, сделайте мне зарплату больше — я вон какой умный стал, умею то и то, вот! Но если бы команда оценивала мой вклад, то про меня решили бы, что я вообще лишнее звено. Что-то постоянно учу, но если что — «это надо изучить дополнительно». Что-то знаю, но в конкретной ситуации ничего сказать не могу. Мои ошибки с выбором технологий — это мой груз.

Долгая неделя размышлений и самокопания. Общение в команде. Поиск аналогичных ситуаций и решений. Черновой набросок. Вот что получилось: uptlo.com — все идеи проекта на главной странице. Пиарить не буду — не работает почти ничего 🙂 Но думаю, проект пригодился бы командам для совместного повышения навыков в нужном направлении. И если кому-то хочется учиться, чтобы ещё и с пользой — у него будет выбор из актуальных тем. И если команде нужен человек с нужными навыками — они могут это показать, выставить requirements. Это вообще не про технические навыки вроде «опыт разработки на Phalcon/Flask/Express» — командам часто нужны мягкие навыки (soft-skills), которые составляют до 80% от навыков крутого специалиста. Ну там с заказчиками пообщаться, в команде принять решения, написать отчёт или составить тех задание. Так что это актуально для любой предметной области, для любой профессии. А в конце года оценить — насколько команда стала опытнее, насколько каждый в отдельности стал опытнее. В частности, достоин ли он повышения зарплаты.

Вернусь к теме топика: «Что делать, если деньги на проект получены и истрачены, а проект не готов»

С учётом всего вышесказанного, ответ такой:

Финал ремейка. Сейчас мы готовы показать и сдать в эксплуатацию то, что есть (и оно, скорее всего, уже даже эксплуатируется). Команда поддержки уже собирает отзывы, рекомендации, предложения, баг-репорты от конечных пользователей. Команда разработчиков доделывает проект. В проекте нет архитектурно-несовместимых 20%.  Тестировщики тестируют. Дизайнеры улучшают интерфейс. В общем, мы работаем над этим проектом для устранения замечаний и будем выпускать в виде дополнения за наш счёт, пока не закроем требования исходного тех задания. У вас не будет никаких простоев. Мы отдельно собираем список новых требований, не согласующихся с тех заданием, новые фичи. Давайте перейдём к вопросам сопровождения и разработки этих и других новых фич, если вы выбираете нашу команду для продолжения работ по проекту…

Изображение Digital killed the Analog Star для обложки позаимствовано у Miguel-Santos

Павел Волынцев

Уже более 15 лет занимаюсь разработкой веб-проектов. Fullstack Senior Developer. IT евангелист — доношу свет знаний об информационных технологиях. Профессиональные цели: Дать людям возможность дать людям больше.

Читайте также: