Как именно следует есть слона по кусочкам?

Как известно, есть слона нелегко: его и в рот не засунешь, и не пожуешь. Народная мудрость говорит — надо есть слона по кусочкам. Это крайне ценный метод, но вопросы, тем не менее, все равно остаются. На какие кусочки делить? С каких начинать? Что оставить на потом? Какова на вкус слонятина?

Понятное дело, слон — это наш проект, большой и «неподъемный», а съесть слона означает выполнить этот проект. В прошлый раз я говорил о том, как упорядочивать кусочки работ, если исходить из вероятных изменений в проекте, и сравнивал с тем, как это происходит в «классическом» подходе. Это только половина идеи, также очень важен и принцип деления на маленькие задачи.

Вернемся на секундочку назад, к «классике». Итак, мы собираем данные, проводим анализ и пишем спецификацию. Кроме того, мы составляем диаграмму Гантта и связываем некоторые задачи end-to-begin связями, чтобы сохранить причинно-следственные связи здравого смысла.

Обратимся к википедии:

Спецификация — (позднелат. specificatio, от лат. species — род, вид, разновидность и facio — делаю) инженерный термин, обозначающий набор требований и параметров, которым удовлетворяет некоторая сущность. К примеру, мост через реку удовлетворяет таким параметрам, как максимальный общий вес нагрузки, максимальная нагрузка на ось, максимальная скорость ветра и т. д.

Согласно определению, приведенному в Единой системе конструкторской документации (ЕСКД), спецификация — основной конструкторский документ, определяющий состав сборочной единицы, комплекса, комплекта. В спецификации содержится подробное перечисление узлов и деталей какого-либо изделия, конструкции, установки и т. п., входящих в состав сборочного или монтажного чертежа.

Согласно определению, приведённому в Политехническом словаре, спецификация — выполненный в форме таблицы документ, определяющий состав какого-либо изделия. Содержит обозначения составных частей, их наименования и количество.

По-моему, это прекрасный кандидат в принципы разделения слона на кусочки.

Как это выглядит для программного обеспечения? Собрали требования, тщательно обдумали. Обнаружили характерные закономерности, сущности, проступают слои, выстраивается какая-то модель данных... Строится архитектура решения, в первом приближении, состоящая из макро-частей, они описываются. Потом каждый кусок надо рассмотреть отдельно, вероятно, тоже построив для него аналогичную декомпозицию, описать его в деталях, по сути это рекурсивный процесс, анализ продолжается до достижения нужной степени детализации.

Для нужд анализа есть, например, семейство методологий IDEFX, в которой ажно 14 типов диаграмм для отображения разных аспектов устройства системы, или, например, UML, где их на данный момент 12, это не считая всякой мелочевки вроде DFD или ERD диаграмм. Анализ, вообще, интересная тема, но об этом как-нибудь в другой раз. В этот раз про эти диаграммы и методы анализа нам нужно только знать, что составлять их очень долго и дорого.

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

(я понятия не имею, что это за проект на самом деле — я нагуглил эту картинку, она показалась мне подходящей)

Откуда появляются эти элементы? Ведь ни одни бизнес-требования не будут описывать архитектуру решения, да и зависеть она будет от конкретного языка, технологии. Дело в том, что требования «вертикальны», а решение «горизонтально». Сейчас я объясню.

Представим себя на секундочку генератором бизнес-требований. То есть, человеком, далеким, вероятно, от конкретных технологий, но близким к бизнесу. И вот он, вооруженный своими знаниями, описывает, как он собирается заработать деньги. Точнее, это он в уме все держит, а описывает то, как должен работать продукт. Например, так: вот у нас есть пользователь, и он в нашей системе может поискать отель, выбрать подходящий и забронировать его на определенный период.

Теперь мысленно перенесемся в тело аналитика. Вот он это слышит, и, конечно, в этом сценарии появляется масса вопросов. Например — как именно выбирать отель? Как именно пользователь будет бронировать, как оплачивать? Надо ли регистрировать? Как убедится, что емейл настоящий? Как убедиться, что места есть, и что двое пользователей не займут один номер? Ну и так далее. Из одного предложения получается несколько страниц описания. Но зато вроде бы теперь все понятно.

И вот, наконец, программист, а точнее архитектор, читает все это, и, наметанным взглядом, замечает, что явно у нас есть сущности Пользователя и Отеля, возможно — Каталога Отелей, есть Резервация, есть Оплата... Во всей идее ООП — это будут отдельные классы системы. Будет вот такой класс — Пользователь, а методы у него будут, например, Зарегистрироваться, Выбрать Отель, Зарезервировать, Оплатить.

Мне очень хочется обратить внимание на эту магию — из набора историй, тщательно причесанных и уложенных одна к одной, мы вырезали части, относящиеся к Пользователю, и записали их вместе (не забыв, конечно, о взаимоотношении с другими сущностями). Вот в этом месте из набора «вертикальных» историй у нас получаются «горизонтальные» слои абстракций — View, Controller, Model, например. Или вот то, например, что на картинке нарисовано — вот эти прямоугольнички абстракций. Каждая из исходных историй работает, затрагивая многие из них, едва ли не все.

И вот эти прямоугольнички на диаграмме и выглядят как кусочки, которыми надо есть слона. Вот они, продуманные, нарезанные, удобные. Где подвох?
что-то тут не так...

Подвох, как обычно, в готовности к изменениям.

Дело в том, что вот эта конверсия «вертикальных» историй в «горизонтальную» архитектуру является сложной, практически творческой операцией. Как мы знаем, собрать вообще все требования в начале разработки — это непозволительная роскошь в наше быстрое, если не сказать суетное, время. Но еще важнее то, что входной набор историй будет меняться, и надо быть готовыми к изменениям. Беда в том, что нет прямой связи между историями и архитектурой, то есть изменения в историях не приводят к изменениям в архитектуре. Анализ, декомпозицию и все эти вещи, вообще говоря, придется делать заново при каждом изменении.

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

Что нам предлагает agile на этот счет?

Во-первых, спецификация — мы больше не делаем ее, я имею в виду большой всеобъемлющий документ. Взамен мы имеем набор user stories разной степени детализации, и они, как вы помните, тщательно приоритизированы. Те, что в самом верху, и, соответственно, пойдут в разработку уже вот-вот, детализированы подробно. Те, что не так приоритетны — в общих чертах. Те, что совсем далеко — и вовсе обозначены условно. Выгода тут такова: не делать анализ для тех историй, которые делать еще не скоро, а, учитывая нашу тягу к изменениям, вероятно, никогда.

Во-вторых, user stories — это «вертикальные» истории, они не портятся от изменений. Может быть, частично теряют актуальность, может быть — местами меняются, но не «тухнут» все разом от изменений в требованиях.

В-третьих — это то, что мы и делаем их «историями». То есть, для того, чтобы реализовать user story нам приходится спроектировать изменениях во всех прямоугольничках нашей архитектуры. Добавить кое-что в базу данных, изменить модель, дописать пару контроллеров, несколько новых вьюшек.

В-четвертых, user stories устроены так, что их выполнение приносит конкретный бизнес-смысл, то самое business-value. Это означает, что его уже можно отправлять пользователям. Это работающие истории. Если бы мы разработали сперва весь уровень базы данных, по спецификации, то у нас была бы шикарная база данных, но, к сожалению, она не нужна нашим пользователям. У нее нулевой business value.

В-пятых, с каждой итерацией мы знаем все больше о проекте, и делаем анализ и архитектурные решения значительно точнее (и быстрее, кстати). Качество вертикально-горизонтального (то есть, анализа и архитектурных решений) преобразования все выше и выше с каждой итерацией, и уж конечно выше, чем в самом начале проекта, когда мы про него, фактически, почти ничего не знаем.

Как это сделать? Мы просто делаем анализ и проектирование каждый раз, в каждой итерации разработки. Для тех историй, которые в нее войдут. То есть — не для всех, значит, это не будет так долго и дорого. Но как быть с тем, что новые истории будут рушить старые, уже сделанные? Что ж, возможно их придется также изменять или даже переписывать. Зная это с самого начала — мы не строим архитектуру «на века» и потенциально готовы менять ее. Это в любом случае дешевле, чем переписывать вообще все.

Подводя итог, и возвращаясь к слоновой теме: так в чем же разница в подходе?
В одном случае мы воспринимаем аналогию буквально, и делим слона на части — сначала переднюю правую ногу, потом хобот, потом хвост, потом левую заднюю... Во втором случае мы делаем то, что с физическим объектом слоном вообще-то невозможно сделать. Мы делим его на сотню маленьких слонов, у каждого из которых есть и ноги, и хвост, и хобот, и все остальное, в частности — бизнес-ценность: один умеет трубить, второй — шевелить хоботом, третий — есть.

Подумайте, с чем вы хотите остаться в случае внезапных изменений.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



20 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Ваша статья напомнила об управленческой басне в прозе «Муха и слон», которую я писал с известной многим софтверной фирмы :-)))

armor.kiev.ua/....BE.D0.B7.D0.B5

Как бы ты начал готовить слона foursquare? — когда надо определить, что будет важнее — мобильный апи, или сервер сайд? — тоесть, какой из этих элементов больше влияет на систему в целом?

И мобильный API и сервер-сайд не имею ценности по отдельности. Нужно откустиь одну историю и реализовать то, что в ней нужно в сервер сайте, и в мобильном API.

Мне, как пользователю, чужды такие понятия. Мне не чужды возможности. Слоник должен быть такой вот, вроде бы, а давайте вот когда пользователь окажется на месте, где он уже чекинился 4 раза до того — мы покажем ему медальку, ему будет приятно.

Алексей, ты процитировал нам принципы agile касательно business value, user stories и инкрементального архитектурирования.
Но последняя аллегория со слонами как раз и есть то самое предварительное проектирование и архитектурирование, от которого зовут отказаться с agile-трибун :)
Если продолжать твои аналогии — сам процесс разделения проекта на самостоятельных слонов с фиксированием размера слона, то что он умеет делать, то, чего он не умеет делать, правила взаимодействия слонов между собой — в аккурат предварительное архитектурирование и есть. «Классика» тоже, кстати не предполагает исчерпывающей детализации — определяется архитектура и общий дизайн (прежде всего интерфейсы взаимодействия), а в каждой итерации делается проектирование дизайна субъекта итерации с учетом уже существующих возможностей и ограничений.

Так что ты описал не agile подход, а старый добрый Pert :) Кстати, перт-оценка с 72% вероятностью достижения результата весьма b dtcmvf заточена под итеративность и напоминает интервально-вероятностные оценки agile подходов, не так ли?

С каких пор «классика» предполагает итеративную разработку?

приеееехали :) т.е. те люди, которые подписали манифест, из манифеста уже пост-фактум вынесли принципы инкрементальной разработки? а джефф де люка за 5 лет до манифеста, когда АБС в азиатском банке (*Тайвань, Сингапур — не помню) переделывал и сгенерил идеи ФДД — базировался на чем?
Леш, ну тебе ли не знать, что «плохая классика» вс «хороший аджайл» суть маркетинг :)
Или ты под «классикой» подразумевал плохие примеры ватерфольных проектов? Дык про аджайл и хп проекты тоже можно привести примеров массу. Если ты это имел ввиду — не вопрос, аджайл делает правильные приоритеты между фокусом на процессе и фокусом на результате. Но ты знаешь, массу продуктов разработали до манифеста с итеративным подходом и фокусом на результате — это тоже классика?

Под «классикой» я имею в виду идеологию PMI и их знаменитый PMBOK. Впрочем, и они эвлоюционируют, и в четвертой редакции (2009) они таки согласились, что итеративная разработка со всеми вытекающими — это круто.

тогда лучше все-таки писать не «классика», а PMBOK :) потому что кроме PMBOK масса всего интересного в методологиях разработки софта. И ессно, не в 2001-м поняли, что бороться с рисками изменений требований или окружения можно итеративно.

кто-то недавно тут писал про plan-do-check-act style ;) это ли не итеративно-инкрементальный подход ? ;)

PMBOK, на секундочку — американский национальный стандарт, так что я бы поспорил насчет того, что считать «классикой». Но да, ты прав, интересных идей много. И в этом смысле «корни» agile, пожалуй, азиатские. Так что мы можем вывернуть это в противостояние восточного и западного мира )

А PDCA — он как бы вообще, о здравом смысле, для любых решений, он в другой плоскости находится, вне методологий, по моему скромному мнению. А то, что его многие к себе «вобрали» так это нормально для хорошей идеи )

PDCA лежит в основне системного научного подхода. совсем вне методологий он лежать не может — он лежит в фундаменте :)
если говорить о азиатских корнях agile, не надо забывать, что в основном манифест подписывали не азиаты. так что без преемственности научной и методологической школ не обошлось :) к тому же, quick fail — это вроде принцип из американской школы инвестиций, я не прав? и самую правильную имхо agile методологию делали не азиаты — Де Люка 10+ лет в IBM проработал. он на ровном месте с Коадом придумал FDD?
резюмируем — итеративно-инкрементальная разработка как выражение принципа PDCA — это хорошо :) а вышла ли она из IBM или из Agile сообщества — неважно. мир, труд, май :)

имхо — классику лучше не ругать, а внимательно в неё смотреть. и если ты глянешь, где в штатах в софтостроении юзают PMBOK — там не все так очевидно :)

Не, ты что, ругать — ни боже мой. Сравнивать.

ААААААААААААААААААААААА! СКРАМ-ЗОМБИ!!!
:)

а если серьёзно, то надо ж определиться, что такое «классика»? RUP достаточно классичен? тогда вот: RUP promotes iterative development (www-01.ibm.com/...e/awdtools/rup)

можно ещё спорить про инкрементальность, но итеративность в любом случае присуща любым процессам, особенно, если есть разделение труда.

ну вот... я тут распинаюсь про отсеивание зерен от плевел, про то, что «классику» надо рассматривать не только с точки зрения современного agile маркетинга, а тут приходит СОТОНА и все портит :)

Я бы не сказал, что итеративность присуща любым процессам, тем более это, на мой взгляд, неочевидно, в случае разделения труда.

приведи контрпример из жизни, когда разделение труда не дает итеративности

Да вотерфолл же. Аналитики, Архитекторы, Программисты, Тестеры, Внедренцы.

Без комментариев :) Учите, батенька, матчасть :)

омг. просто омг.

ну или не омг, а просто мы что-то своё под итерациями понимаем...

Наверное.

en.wikipedia.org/...tal_development

A common mistake is to consider “iterative” and “incremental” as synonyms, which they are not. In software/systems development, however, they typically go hand in hand. The basic idea is to develop a system through repeated cycles (iterative) and in smaller portions at a time (incremental), allowing software developers to take advantage of what was learned during development of earlier parts or versions of the system. Learning comes from both the development and use of the system, where possible key steps in the process start with a simple implementation of a subset of the software requirements and iteratively enhance the evolving versions until the full system is implemented. At each iteration, design modifications are made and new functional capabilities are added.

я нигде не путал эти понятия и давал повода считать, что я мог бы их спутать.

твой пример про аналитиков, архитекторов... как раз и показывает итерации без инкремента (с точки зрения бизнеса)

Підписатись на коментарі