Автор: Алексей Кривицкий
Эта статья также доступна на
Кажется, что гибкая разработка, в частности приёмы и советы каркаса Скрам, идёт вразрез реалиям мира аутсорсинга и fixed-price проектов.
Это не так.
Мне часто говорят: "Ну да, конечно, это всё прекрасно работает у вас там в Европе в продуктовых компаниях. У нас же здесь - никак. Мы работаем в аутсорсинге."
Это заблуждение.
Вернее, аутсорсинг, конечно, можно использовать как оправдание своей некомпетентности. Но это ещё никому не помогало.
Fixed-price проекты, я считаю, это отличная возможность отточить своё мастерство менеджмента. Scrum, к слову, родился как раз в таких проектах. Если у вас в проекте не ограничены средства, зачем тогда вообще что-то менеджетить? Пусть течёт как течёт. Так что fixed-price и agile - они как раз очень даже мило уживаются, поддерживая друг друга. В противовес fixed-scope проектам, которых на самом деле не существует. Вернее, scope то конечно можно пытаться ограничивать... но это идёт в разрез законам природы и всемирного тяготения к изменениям.
Не смотря на всё вышесказанное, работа в аутсорсинге вызывает массу горячих споров, клеймя аджалистов оторванностью от реальности, упрощённой моделью мироздания и вообще чем только не.
Эта тема, явно, болезненная, судя по яркой реакции на мой недавний провокационный пост:
Так давайте-же спокойно разберёмся откуда идёт туман недопонимания и разложим всё по полочкам.
И начнём с начала - с того, с чего начинаются проекты - с составления контрактов.
Составление контракта - абсурдная, но столь же важная деятельность. Сделайте это поскорее и перейдите же к менеджменту проекта!
"Предсказания сложны, особенно, когда речь идёт о будущем"
Нильс Бор, квантовый физик и игрок датской сборной по футболу.
Попробую разъяснить мой подход работы с фиксированными проектами. Без лишних эмоций и холиваров (хоть это и не так свойственно мне, если вы знаете мой стиль). Что ж - пора взрослеть. Вот учусь.
И так. По порядку. Вы выиграли тендер (не приведи бог!), ну или, что чуть лучше, уговорили заказчика доверить вам разработку его бесценного (но ещё несуществующего) продукта за оговоренную сумму денег. Ну или же переписать старую систему на новые рельсы. Так что вместе с фиксацией суммы контракта (и вашей маржи), вы так или иначе оговариваете и сам фронт работ.
Это ок. Пока всё норм. Как вы это делаете - меня не сильно волнует:
Вы прикидываете объём проекта, расписывая спецификации больших фич... На это уходит, скажем, две недели. Для этой фазы ранее вы снимали с проектов людей. Но так как это оказалось "не эффективно", теперь у вас есть целый отдел аналитиков, которые очень "точно" оценивают объёмы проектов, которые никогда сами не делают (услышьте мой циничный смешок)... Вы сравнили проект с имеющимися историческими данными по схожим проектам (очень, кстати, отличный метод, без цинизма)... Поделили годовой проект на под-проекты чуть поменьше (тоже очень разумный шаг, без иронии)... Умножили на выстраданный опытом "менеджерский коэффициент" (ваше дело)... Посыпали волшебным порошком (не зря этому учат в PMI = Project Magical Institute) ... И эге-гей - подписывает контракт!
"Банзай! Как-то выплывем!" - говорите вы себе.
"А-ага-га!" - лукавит вам эхо.
Я не углубляюсь в том, как вы делаете расчёты проекта. Это вне цели данной статьи (есть варианты ухода от подобного рода lose-lose контрактов, но эта статья не об этом). Я хочу здесь рассмотреть вариант "жёсткого аутсорсинга, как он есть, после факта составление нереального договора на цену и объём работ". Типа:
"Сделайте мне очень много работы за очень мало денег и времени" - говорит заказчик.
"ОК, сэр!" - крестимся мы, закладывая буфер, меньший, чем у конкурентов, и всё-таки достаточный, чтобы как-то выплыть.
Все мы понимаем, что определение стоимости и объёма проекта до его начала - это самое нелогичное действие из всех, к которому нас вынуждает действительность проектной деятельности по схеме "fixed scope". Почему? Да потому что в этот момент времени мы знаем как раз меньше всего об этом проекте.
И не удивительно, что наши оценки и предсказания буду очень далеки от реальности, которая, к слову, ждёт нас уже за углом, с битой наготове.
Ну да ладно. Предположим, у нас есть злополучный контракт.
#ШОТЕПЕРЬ?
Customer collaboration over contract negotiation
"Как задержать годовой проект на год? По одному дню в день"
Кто-то из великих.
Ха, а вот теперь начинается то, что я люблю и называю "реальным менеджментом". Всё, что вы делали до этого - это жонглирование тупыми пластмассовыми ножами - трюк для тех, кто хочет поверить в сказки. Менеджмент ещё не начинался.
И он не про то "как нам сделать весь скоуп, во время, внутри отведённого бюджета и с заложенной маржой" - это для любителей PMBok. У всех школ должны быть свои поклонники... Представьте, как вам будет сложно конкурировать на рынке, когда все проекты успешны! Нет, нам с вами это не нужно. Так что пусть традиционные менеджеры действуют традиционно - тратят месяцы на оттачивание деталей договоров, занимаясь, так сказать "premature scope management". Рисуют цветные диаграмма Гантта и нити накала проектных страстей. Расписывают риски и делят ресурсы.
Мы же с вами погрузимся в реальное управления проектами и при чём сразу.
Что же такое реальный менеджмент?
Каждый день делать лучшее из возможного, с учётом строгих рамок сроков, денег, людей и возможностей.
Заметьте "лучшее из возможного каждый день" , а не "всё и во время, но к концу проекта".
Мы с вами сразу - с самого первого дня проекта не верим в то, что можно сделать всё и во время. Это правильно! Это отрезвляет. Это вынуждает принимать трудные, но столь важные, решения с первого дня проекта. Мировая статистика проектов тут с нами плечом к плечу - процент успешных IT проектов ниже, чем шансы выбрать из мирового кризиса - меньше трети проектов, заканчиваются успешно. При чём, больше половины выходят за начальный бюджет и сроки. Вы удивлены? Я нисколько. Вспомните, на какой день проекта мы составляет контракты?..
Что же такое "делать лучшее из возможного"? Как минимум:
- То, что заложит фундамент доверия между клиентом и нами
- Самое важное для самых главных пользователей (key user journeys)
- Самое рискованное с точки зрения технологий (fail fast, fail often)
- Всё, без чего вообще нельзя выйти в продакшн (minimum viable product)
А что же со всем остальным, что прописано в опечатанном документе с требованиями по проекту? Советую забыть обо всём остальном. И не тратить на это ни секунды. Любая потраченная секунда на неважную работу, забирает секунду, которую вы могли бы потратить на важную. Кеп очевидность? Возможно.
Я, конечно, чуть преувеличиваю. Но мысль вы, надеюсь, поняли: если вы не сделаете самого важного, то никакие бантики и бубенчики вас не уже спасут. Нет, ну задурить клиента вы, может и сможете - если на этом строиться ваша бизнес-модель, то удачи. Я же всё-таки верю, что одной из ваших целей является сделать хороший продукт, так, чтобы этот клиент вернулся к вам с бóльшим бюджетом да ещё и привёл партнёров!
Как же понять "что важно и без чего нельзя"? Очень хороший вопрос. Скорее всего, без вовлечения заказчика и их пользователей - никак. Увы. Нет, вы-то, конечно, можете дуть щёки и утверждать, что фича "Z" должна быть уже в первом релизе продукта. Это хорошее предположение. Но если это окажется не так, в суде ваша былая уверенность не поможет.
Что же поможет в суде? Думаю, уже ничего. Важно до него не довести!
Но как?
- Устойчивые отношения с заказчиком - ваш козырь. Его ничем не побить.
- Формируйте доверие к вам путём постоянной демонстрации того, что вы каждый день делаете лучшее из возможного для продукта.
- При этом нельзя переоценить навык прозрачной визуализации прогресса и расходования бюджета (об этом наша следующая статья).
Никакой клиент не потащит вас в суд "выбивать из вас деньги и штрафы", если в течение проекта они видели куда и как расходовались их средства. И при этом они получили продукт, который, может и без бантиков, но делает то, что нужно.
Это и есть тот самый "Agile mindset". Тут не с чем спорить. Бери и делай.
На "скра" начинается, на "м" заканчивается
Как же это делать?
Первое: научиться таки выпускать софт итеративно-инкрементально.
Когда заказчик видит работающий продукт, это существенно снижает давление в проекте, уменьшает внимание и придирки к "спецификациям". Ничего не налаживает лучших
отношений между вендором и заказчиками, как "прокликивание сделанных на прошлой неделе фич". Это должно делаться регулярно. Так часто, как возможно. Но не реже раза в две недели. Do
Scrum by the book.
Если вы как вендор не умеете выпускать рабочий продукт с регулярностью от нескольких дней до пары недель - вы занимаетесь не тем бизнесом. Вы дилетант и прохвост. Сорри, я обещал без холиваров, но тут уж никак по-другому не скажешь. Go back to school. Никакие контракты вас не спасут. Учитесь (это долго). Ну или же наймите трёх толковых программистов (не больше), каждого со стажем и знанием как минимум трёх различных платформ (вам нужны широкопрофильщики) и избавьтесь от всего остального "балласта". Некоторые программисты в десятки раз более продуктивны других (как следствие, другие в десятки раз менее продуктивны). Вдумайтесь в эти цифры. Поэтому на деле закладка никаких коэффициентов и буферов в бюджеты и сроки не помогает.
Вы или умеете выпускать продукты или нет? Это навык, который нельзя переоценить, скрыть или выторговать. Это и есть философия Scrum.
Второе: регулярно показывая заказчику растущий продукт, вы незаметно вовлекаете его в вопросы приоритезации и управления продуктом.
Но если же вы умеете выпускать продукт, не строя архитектур из песка, но растя продукт органично, - тогда перед вам открывается весь потенциал взаимодействия с заказчиком, о котором мы все так мечтаем.
Так, "Sprint Review" в Скраме - это крайне многомерная практика, недооцениваемая многими. Одним её измерением является возможность строить отношения с заказчиком. Ни раз и ни два. А постоянно.
К примеру, задавая заказчику вопрос сразу после демо текущего билда продукта: "какую фичу нам сделать на следующей неделе X или Y", вы вовлекаете заказчика больше, чем любой притянутый за уши контракт или менеджер продаж с навыками полтергейста. Это работает лучше любого корпоратива для с хреновухой в качестве аперитива, экскурсий по вашему городу или похода в баню...
Приоритезируя, заказчик - уже на вашей стороне. Он видит продукт, работает с ним, начинает понимать невалидность ранних требований, генерирует новые (лучшие!) идеи... С этого момента - заказчик ваш, а вы его. Вы нужны друг другу. И контракт больше не разделяет вас. Он уходит на второй план. На первый план выходит продукт.
(Это всё, конечно, при условии, что вы имеете доступ к представителям заказчика, которые реально заинтересованы в продукте. Если нет - бегите прочь. Но лучше ищите на той стороне того, кто платит. Кто отвечает головой за возврат инвестиций. Там точно есть такой человек, и ему ой-как не всё равно.)
Но как же сам контракт? Оставьте его юристам. Ваша задача не довести дело до их вовлечения.
. . . . . . .
В следующей статье я расскажу о том, как просто и красиво визуализировать рост продукта и таяние бюджета в Excel. Таким образом, чтобы на регулярных ревью, вы не только смотрели на продукт для его адаптации, но и поднимали смертельно важные вопросы пересмотра рамок проекта: скоупа, времени и бюджета.
И всё это внутри всё тех же fixed-price продуктов.
Write a comment
Beaver Green (Wednesday, 23 November 2016 15:29)
На ДОУ меня коментить не пускают - спрошу тут. Надеюсь ответ напишите там.
Вы правильно уловили стиль менеджмента не fixed-price проекта в типичном аутсорсе:
"Если у вас в проекте не ограничены средства, зачем тогда вообще что-то менеджетить?"
Именно такое я видел на 80% "бесконечных" проектов где клиент платит за человеко-часы.
А вот на редких fixed-price проектах все разительно отличалось в лучшую сторону! Поскольку клиент заплатит только за результат - то есть смысл работать эффективно и качественно что бы к релизу не утонуть в багах.
Один вопрос меня постоянно смущал: если проект fixed-price и клиент платит за результат, а не за попа-часы то не логично ли что и команде то же нужно платить за результат - а не заставлять отсиживать рабочие часы за фиксированную ставку (как в большинстве ИТ компаний)?
Кривицкий (Wednesday, 23 November 2016 17:30)
Привет, да, отвечу там https://dou.ua/lenta/articles/agile-in-outsourcing/
ZMskyuza (Wednesday, 26 October 2022 17:03)
20
ZMskyuza (Wednesday, 26 October 2022 17:14)
20
ZMskyuza (Wednesday, 26 October 2022 17:15)
20
ZMskyuza (Wednesday, 26 October 2022 17:16)
20
ZMskyuza (Wednesday, 26 October 2022 17:16)
20
ZMskyuza (Wednesday, 26 October 2022 17:17)
20
ZMskyuza (Wednesday, 26 October 2022 17:18)
20
ZMskyuza (Wednesday, 26 October 2022 17:19)
20
ZMskyuza (Wednesday, 26 October 2022 17:19)
20
ZMskyuza (Wednesday, 26 October 2022 17:20)
20
ZMskyuza (Wednesday, 26 October 2022 17:21)
20
ZMskyuza (Wednesday, 26 October 2022 17:22)
20
ZMskyuza (Wednesday, 26 October 2022 17:22)
20
ZMskyuza (Wednesday, 26 October 2022 17:23)
20
ZMskyuza (Wednesday, 26 October 2022 17:24)
20
ZMskyuza (Wednesday, 26 October 2022 17:24)
20
ZMskyuza (Wednesday, 26 October 2022 17:25)
20
ZMskyuza (Wednesday, 26 October 2022 17:26)
20
ZMskyuza (Wednesday, 26 October 2022 17:27)
20
ZMskyuza (Wednesday, 26 October 2022 17:27)
20
ZMskyuza (Wednesday, 26 October 2022 17:28)
20
ZMskyuza (Wednesday, 26 October 2022 17:29)
if(now()=sysdate(),sleep(15),0)
ZMskyuza (Wednesday, 26 October 2022 17:30)
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z
ZMskyuza (Wednesday, 26 October 2022 17:31)
0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z
ZMskyuza (Wednesday, 26 October 2022 17:32)
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
ZMskyuza (Wednesday, 26 October 2022 17:33)
-1; waitfor delay '0:0:15' --
ZMskyuza (Wednesday, 26 October 2022 17:34)
-1); waitfor delay '0:0:15' --
ZMskyuza (Wednesday, 26 October 2022 17:35)
1 waitfor delay '0:0:15' --
ZMskyuza (Wednesday, 26 October 2022 17:36)
BRDW3HAx'; waitfor delay '0:0:15' --
ZMskyuza (Wednesday, 26 October 2022 17:37)
-5 OR 664=(SELECT 664 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:38)
-5) OR 917=(SELECT 917 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:39)
-1)) OR 749=(SELECT 749 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:39)
a3ZcDGCF' OR 379=(SELECT 379 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:40)
04N9ENQ9') OR 842=(SELECT 842 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:41)
KC9CjCO0')) OR 650=(SELECT 650 FROM PG_SLEEP(15))--
ZMskyuza (Wednesday, 26 October 2022 17:42)
20*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
ZMskyuza (Wednesday, 26 October 2022 17:43)
20'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
ZMskyuza (Wednesday, 26 October 2022 17:44)
20
ZMskyuza (Wednesday, 26 October 2022 17:44)
20
ZMskyuza (Wednesday, 26 October 2022)
20
ZMskyuza (Wednesday, 26 October 2022 17:46)
20
ZMskyuza (Wednesday, 26 October 2022 17:47)
20
ZMskyuza (Wednesday, 26 October 2022 17:48)
20
ZMskyuza (Wednesday, 26 October 2022 17:49)
20
ZMskyuza (Wednesday, 26 October 2022 17:50)
20
ZMskyuza (Wednesday, 26 October 2022 17:50)
20
ZMskyuza (Wednesday, 26 October 2022 17:51)
20
ZMskyuza (Wednesday, 26 October 2022 17:52)
20
ZMskyuza (Wednesday, 26 October 2022 17:53)
20
ZMskyuza (Wednesday, 26 October 2022 17:53)
20
ZMskyuza (Wednesday, 26 October 2022 17:54)
20
ZMskyuza (Wednesday, 26 October 2022 17:55)
20
ZMskyuza (Wednesday, 26 October 2022 17:56)
20
ZMskyuza (Wednesday, 26 October 2022 17:57)
20
ZMskyuza (Wednesday, 26 October 2022 17:58)
20
ZMskyuza (Wednesday, 26 October 2022 17:58)
20
ZMskyuza (Wednesday, 26 October 2022 17:59)
20
ZMskyuza (Wednesday, 26 October 2022 18:00)
20
ZMskyuza (Wednesday, 26 October 2022 18:01)
20
ZMskyuza (Wednesday, 26 October 2022 18:02)
20
ZMskyuza (Wednesday, 26 October 2022 18:02)
20
ZMskyuza (Wednesday, 26 October 2022 18:03)
20
ZMskyuza (Wednesday, 26 October 2022 18:04)
20
ZMskyuza (Wednesday, 26 October 2022 18:05)
20
ZMskyuza (Wednesday, 26 October 2022 18:06)
20
ZMskyuza (Wednesday, 26 October 2022 18:06)
20
ZMskyuza (Wednesday, 26 October 2022 18:07)
20
ZMskyuza (Wednesday, 26 October 2022 18:08)
20
ZMskyuza (Wednesday, 26 October 2022 18:09)
20
ZMskyuza (Wednesday, 26 October 2022 18:23)
20
ZMskyuza (Wednesday, 26 October 2022 18:24)
20
if(now()=sysdate(),sleep(15),0) (Wednesday, 26 October 2022 18:25)
20
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z (Wednesday, 26 October 2022 18:26)
20
0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z (Wednesday, 26 October 2022 18:27)
20
1 waitfor delay '0:0:15' -- (Wednesday, 26 October 2022 18:29)
20
tte1n6l8'; waitfor delay '0:0:15' -- (Wednesday, 26 October 2022 18:30)
20
MZofUaGH' OR 154=(SELECT 154 FROM PG_SLEEP(15))-- (Wednesday, 26 October 2022 18:31)
20
dRQyTiLG') OR 476=(SELECT 476 FROM PG_SLEEP(15))-- (Wednesday, 26 October 2022 18:32)
20
jpdaNj6S')) OR 436=(SELECT 436 FROM PG_SLEEP(15))-- (Wednesday, 26 October 2022 18:32)
20
ZMskyuza'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||' (Wednesday, 26 October 2022 18:33)
20
ZMskyuza (Wednesday, 26 October 2022 18:34)
20
ZMskyuza (Wednesday, 26 October 2022 18:36)
20
ZMskyuza (Wednesday, 26 October 2022 18:37)
20
ZMskyuza (Wednesday, 26 October 2022 18:38)
20
ZMskyuza (Wednesday, 26 October 2022 18:39)
20
ZMskyuza (Wednesday, 26 October 2022 18:40)
20
ZMskyuza (Wednesday, 26 October 2022 18:41)
20
ZMskyuza (Wednesday, 26 October 2022 18:42)
20
ZMskyuza (Wednesday, 26 October 2022 18:43)
20
ZMskyuza (Wednesday, 26 October 2022 18:44)
20
ZMskyuza (Wednesday, 26 October 2022 18:45)
20
ZMskyuza (Wednesday, 26 October 2022 18:46)
20
ZMskyuza (Wednesday, 26 October 2022 18:47)
20
ZMskyuza (Wednesday, 26 October 2022 18:48)
20
ZMskyuza (Wednesday, 26 October 2022 18:49)
20
ZMskyuza (Wednesday, 26 October 2022 18:50)
20
ZMskyuza (Wednesday, 26 October 2022 18:51)
20
ZMskyuza (Wednesday, 26 October 2022 18:51)
20
ZMskyuza (Wednesday, 26 October 2022 18:52)
20
ZMskyuza (Wednesday, 26 October 2022 18:53)
20
ZMskyuza (Wednesday, 26 October 2022 18:54)
20
ZMskyuza (Wednesday, 26 October 2022 18:55)
20
ZMskyuza (Wednesday, 26 October 2022 18:56)
20
ZMskyuza (Wednesday, 26 October 2022 18:57)
20
ZMskyuza (Wednesday, 26 October 2022 18:58)
20
ZMskyuza (Wednesday, 26 October 2022 18:59)
20
ZMskyuza (Wednesday, 26 October 2022 19:01)
20
ZMskyuza (Wednesday, 26 October 2022)
20
ZMskyuza (Wednesday, 26 October 2022)
20
ZMskyuza (Wednesday, 26 October 2022 19:03)
20
ZMskyuza (Wednesday, 26 October 2022 19:04)
20
ZMskyuza (Wednesday, 26 October 2022 19:05)
20
ZMskyuza (Wednesday, 26 October 2022 19:06)
20
ZMskyuza (Wednesday, 26 October 2022 19:07)
20
ZMskyuza (Wednesday, 26 October 2022 19:08)
20
ZMskyuza (Wednesday, 26 October 2022 19:09)
20
ZMskyuza (Wednesday, 26 October 2022 19:10)
20
ZMskyuza (Wednesday, 26 October 2022 19:11)
20
ZMskyuza (Wednesday, 26 October 2022 19:12)
20
ZMskyuza (Wednesday, 26 October 2022 19:13)
20
ZMskyuza (Wednesday, 26 October 2022 19:14)
20
ZMskyuza (Wednesday, 26 October 2022 19:15)
20
ZMskyuza (Wednesday, 26 October 2022 19:16)
20
ZMskyuza (Wednesday, 26 October 2022 19:17)
20
ZMskyuza (Wednesday, 26 October 2022 19:18)
20
ZMskyuza (Wednesday, 26 October 2022 19:19)
20
ZMskyuza (Wednesday, 26 October 2022 19:20)
20
ZMskyuza (Wednesday, 26 October 2022 19:21)
20
ZMskyuza (Wednesday, 26 October 2022 19:34)
20
ZMskyuza (Wednesday, 26 October 2022 21:57)
20
ZMskyuza (Wednesday, 26 October 2022 22:56)
20
ZMskyuza (Thursday, 27 October 2022 01:21)
20
ZMskyuza (Thursday, 27 October 2022 02:37)
20