Заметил, что тема
https://forum.shelek.ru/index.php/topic,15142.0.html всё ещё поддерживается, однако разговор там уже немного на другую тему, поэтому хотел бы вынести обсуждение понимания РУПа в отдельную ветку.
Дело в том, что читая дискуссию, которую вели Dimka и lapulya (надеюсь, вы это тоже читаете, поэтому не сочтите за разговор в третьем лице), я заметил, что мне как-то ближе то, что писал lapulya. Но во-первых, я себя опытным бизнес-аналитиком не чувствую (и поэтому постоянно сомневаюсь), а во-вторых, часто один скажет одно, а второй с ним согласится имея совершено другую точку зрения. На мой взгляд лучше, когда второй в ответ первому выразит своё понимание и первый согласится с данной формулировкой.
Т.е. сейчас я хочу быть вторым, который вроде бы как уловил суть того, что сказал первый (lapulya), и сейчас хотел бы выразить своё понимание данного вопроса.
Обучался я РУПу у Золотухиной Елены (отчества, к сожалению не помню). Курсы длились неделю, первые три дня у меня пухла голова от желания и неспособности уловить суть, а на четвёртый я всё же что-то понял. Признаю, что мог понять неправильно, а также то, что у преподавателя могло быть своё понимание, которое тоже может быть искажено.
Но, честно говоря, мне уже даже не важно, насколько то, что я понял является РУПом. Моя проблема в том, что сейчас на работе мы (наконец-то) формализуем процесс разработки и поэтому важно называть всё своими именами. И есть кое-какие несостыковки, но об этом позже.
Итак, как вести разработку по РУПу (версия моя, искажённая призмой моего мозга):
1. В основе всего лежат бизнес-процессы. Их обозначить в первую очередь и требуется. Причём важно, что собираем мы информацию обо всех бизнес-процессах (тем глубже и тем тщательней, чем, на наш взгляд, это может затронуть автоматизируемый бизнес-процесс). Если говорим, что мы документируем используя UML, то на этом этапе рисуются BusinessCases (которые графически выглядят фактически также как UseCases, только с чёрточкой сбоку).
2. BusinessCase'ы детализируются в ProcessFlow, которые дают понять какие именно этапы понимаются под данным BusinessCase. Это важно, поскольку часто по названию сложно понять, что же за этим понимается, а кроме того пользователь глядя на такой Flow может спросить "а где мы делаем вот это (какое-то действие)?" и тогда мы скажем "ах вы ещё и это делаете?" и подкорректируем своё понимание бизнеса.
3. Каждый шаг в ProcessFlow довольно в общем виде характеризует этап/действие. И поэтому их тоже надо детализировать. Следующий этап я не помню даже близко как называется, поэтому я называю его термином UML - ActivityDiagram, что, каюсь, неправильно. На этом уровне мы детально прописываем шаги и, что важно, у каждого шага указываем входные и выходные объекты. Если шаг не имеет входного или выходного объекты, значит мы что-то не понимаем.
4. Далее мы проходим по всем диаграммкам и помечаем какие из этапов (на ActivityDiagram'ах) мы будем автоматизировать. Фактически немного перефразируя названия этапов, мы получаем список системных требований.
5. Далее, имея на руках объекты, полученные в шаге №3, мы можем осмелиться начать рисовать диаграмму объектов или даже БД. В принципе, по-моему скромному опыту, на этом этапе уже редко ошибаешься.
6. Имея какое-то понимание бизнес-процессов, мы (фактически от балды) выдумываем нефукнциональные требования, применимые в данном случае. Может быть по странному стечению обстоятельств, но на данном этапе тоже вроде пока не ошибался с набором требований, хотя он и выдуманный.
7. Имея диаграмму объектов из пятого шага и требования из четвёртого и шестого, мы начинаем проектировать код (в голове ли или на диаграммах).
8. Когда чувствуем готовность пишем код. Код можем покрыть как юнит-тестами, так и функциональными тестами, исходя из списка требований. Пишем "снизу вверх", сначала реализуем нефункциональные требования. Функциональные требования и их принадлежность с определённым бизнес-процессам, позволяет разбить написание продукта на итерации.
И вот сейчас написал всё это и понял, что не РУП это вовсе. )))
Но удалять не буду - поскольку хотелось бы увидеть чьё-то чужое пошаговое понимание процесса разработки по РУПу.
Меня в моём понимании РУПа смущает ряд фактов. Пара из них:
- слабая итеративность. Т.е. итеративность начинается только тогда, когда более-менее сформировано понимание БП и можно приступить к кодингу. А сбор БП выглядит слишком уж большим шагом.
- если основой РУПа считать сосредоточенность на рисках, то у меня это нигде прослеживается.
Давайте, обменяемся нашими пониманиями на примере какого-нибудь бизнес процесса?
Например, мы собираемся автоматизировать "Жизнь простого смертного человека" (как если бы мы писали игру Sims).
Я бы делал это так:
1. Основные процессы в жизни человека, это "Питаться", "Работать", "Отдыхать", "Удовлетворять физиологические потребности". Нарисовали.
2. Заходим в "Питаться". Почему-то сразу вспоминаем про холодильник, но при этом понимаем, что холодильник в этом не всегда участвует. Возвращаемся на первый этап и дополняем бизнес-процессы.
1(а). Основные процессы в жизни человека, это "Питаться дома", "Питаться вне дома", "Работать", "Отдыхать", "Удовлетворять физиологические потребности". Нарисовали.
2(а). Снова заходим в "Питаться дома". Рисуем Flow: "достать продукты из холодильника", "приготовить поесть", "накрыть на стол", "поесть", "убрать за собой". Есть смутные сомнения, что "убрать за собой" является чем-то не входящим в данный процесс. Записываем мысль в notes, но оставляем так как есть.
3. Заходим в "достать продукты из холодильника" и начинаем рисовать детальный Flow с входными и выходными объектами. Придумали шаги: "открыть холодильник", "найти нужные продукты", "взять их", "закрыть холодильник". Теперь надо приписать им входные и выходные объекты. Что может быть входным объектом для шага "открыть холодильник"? Очевидно, что сам холодильник. А где мы его взяли? Купили! Возвращаемся к первому шагу и дописываем BusinessCase.
1(б). "Питаться дома", "Питаться вне дома", "Работать", "Отдыхать", "Удовлетворять физиологические потребности", "Покупать товары". Возвращаемся в третий шаг.
3(а). Шагу "открыть холодильник" во входной объект поставили "холодильник", в качестве правила тут же приписали "мы должны иметь холодильник" в notes (возможно, это будущий exception). Что поставить шагу "открыть холодильник" в качестве выходного объекта? Видимо "набор имеющихся продуктов перед глазами" - формулировка ни к чёрту, но оставим пока так. Следующий шаг "найти нужные продукты". У него во входных данных будет набор видимых продуктов и....? должно быть что-то ещё, иначе мы захапали бы все продукты сразу. Ага - нужен список требуемых продуктов. А он обычно рождается из какого-нибудь рецепта (пусть даже из головы). Значит возвращаемся к шагу 2.
2(б). Меняем шаги: "решить, что будем готовить", "достать продукты из холодильника", "приготовить поесть", "накрыть на стол", "поесть", "убрать за собой". Возвращаемся в шаг 3.
3(б). Есть список нужных продуктов, есть список имеющихся в холодильнике. Где-то тут будет исключение "не всё найдено" - пишем в правила в notes. Хочется совместить шаги "найти нужные продукты" и "взять их" - ок, делаем так, называем новый шаг "взять нужные продукты" и в выходные данные ставим "нужные продукты на столе". Откуда стол? Добавляем "стол" во входные объекты. Далее шаг "закрыть холодильник" - во входных данных у него холодильник, а в выходных гм... опять холодильник что ли?... Ага! Значит холодильник меняет состояния. Вводим для объекта "холодильник" два состояния "открытый" и "закрытый" и добавляем их к "холодильникам" в шагах "открыть холодильник" и "закрыть холодильник".
4. Проходим по уже нарисованным диаграммкам и решаем, что автоматизировать мы будем полностью шаг "достать продукты из холодильника" (можно и лишь частично его автоматизировать, но он у нас и так короткий). Видим список системных требований "система должна позволять открыть холодильник", "система должна сопоставлять имеющиеся продукты с нужными" и т.п.
5. Знаем, что понадобятся объекты "холодильник", "продукт", "список продуктов", "стол" и т.п.
6. Нефункциональные требования пропустим, ибо я уже жрать хочу ))
7. Представляем себе код - понадобятся вспомогательные классы для сверки списков, нужны абстракции для продуктов, думаем, как будет меняться состояние холодильника и т.п. Если надо рисуем.
8. Пишем, что надумали. По ходу возвращаемся в предыдущие этапы, меняем что-то, рефакторим и т.д.
Был бы признателен за подобную пошаговую инструкцию "а как вы разрабатываете софт"?
p.s. Уфф, всё - пошёл я жрать.