Первый раз встретил книгу, в которой автор так конкретно и настоятельно рассказывает про методы декомпозиции требований для разработки архитектуры компонентов/сервисов программной системы, сопровождая описание отличной аргументаций и практическими примерами Я таких хороших описаний ранее не встречал (если кто встречал, поделитесь). Да и вообще, тема декомпозиции требований абсолютно не раскрыта в области Computer Science, всех учат больше кодированию, тестированию и системному дизайну с точки зрения отказоустойчивость. А вот в области декомпозиции требований и solution architect основном доминирует метод “функциональной декомпозиции”, который вроде как вообще растет из ООП и примеров в книгах на тему ООП. Собственно его все и используют, хотя по мнению автора (и не могу не согласиться) он сугубо пагубен и не приводит к возникновению элегантных и хороших архитектур программных систем, наоборот, плодя неэффективности и потери времени и денег при разработке и развитии программных систем.

Тут надо сказать, что такое “хорошая архитектура”. Как и то, что “хороший код” это код, который легко менять под изменения требований, “хорошая архитектура” - поддерживает легкое и безболезненное внесение изменений в компоненты системы. То есть задача архитектора так определить структурные компоненты системы, что бы изменение каждого из них минимально влияли на все другие. Вообще то, что изменение требований считается болью ИТ разработчиков не правильно, большинство авторов наоборот пишут о том, что изменения требований - это жизнь, это происходит и это должно быть. А наша задача вести разработку так, что бы эти изменения поддерживать.

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

Автор предлагает использовать другой метод - “декомпозицию на основе нестабильности” (Volatility-based decomposition). Правда тут русский перевод неточен, я бы перевел название как “декомпозиция на основе изменчивости”. Идея тут в том, что бы выделить области в требованиях, вероятность изменений которых велико и инкапсулировать эти изменения в соответсвующие компоненты/сервисы системы. Изменения при этом могут исходить из 2-х “областей”:

  • Изменения требований одного пользователя системы с течением времени

  • Изменения, которые формируются требованиями разных пользователей системы

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

Такой подход минимизирует количество изменений, которые надо будет вносить в компоненты системы, при изменении одного из них. Все изменения одной области “инкапсулируются” и макимально изолируются.

Мне такой подход показался очень правильным и элегантным. Это, конечно, краткое изложение идеи, подробнее читайте в первой главе книги "Совершенный софт" Лёве Джувел.

Комментарии (8)


  1. evgenyk
    13.11.2021 13:37
    +4

    Что-то мне это напоминает старое доброе разбиение на слои абстракций.


    1. KayserSW Автор
      13.11.2021 16:02

      Как говориться, все новое - хорошо забытое старое :)


  1. zloddey
    13.11.2021 21:27
    +2

    Боюсь, похожие мысли были сформулированы ещё в классической работе David Parnas: "On the Criteria To Be Used in Decomposing Systems into Modules".

    Выделю:

    We propose instead that one begins with a list of difficult design decisions or design decisions which are likely to change. Each module is then designed to hide such a decision from the others.

    50 лет назад написано, на минуточку!

    Подход действительно правильный, и он действительно работает. Вот только другая беда: практически все его игнорируют. Что в 70-х, что в 90-х, что в 20-х. Может быть, гораздо более интригующий и интересный вопрос - почему так происходит?


    1. andreyverbin
      13.11.2021 22:50
      +1

      Потому что такой анализ требует широкого кругозора от проектировщика. Увидеть функции не сложно, придумать какую-то объектную модель - запросто. Представить как будут меняться требования - вам скажут, что это бесполезно и есть agile. По факту вполне можно, но нужно очень хорошо понимать в бизнесе. А этого понимания как раз и нет у проектировщика.


      1. zloddey
        14.11.2021 08:01

        Ну да, вполне возможно. А в динамике, когда уже видны тенденции, что более и что менее изменчиво, другая напасть. Можно было бы порефакторить, но на рефакторинг то времени нет, то вообще непонятно, с какого конца развязывать все зависимости, то ещё что.


      1. KayserSW Автор
        14.11.2021 11:50

        соглашусь


      1. Myclass
        14.11.2021 18:57

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


    1. OlegZH
      14.11.2021 12:10

      А Вы можете дать свой собственный перевод всего абзаца? Чтобы рассуждать в одних и тех же терминах и, заодно, проверить свой сильно запущенны английский.