В рубрике «Что читать» эксперты ПостНауки рекомендуют самые актуальные и интересные книги из области их научных исследований. Преподаватель Университета Иннополис Сергей Зыков рассказывает о книге Software Architecture in Practice.

Книга Software Architecture in Practice выдержала уже три издания и в каждом совершенствуется. Каждый из трех авторов — Len Bass, Paul Clements, Rick Kazman — является экспертом в архитектуре и разработке программного обеспечения и был связан (или работает по сей день) с Институтом программной инженерии (Питтсбург, Пенсильвания). Это головное предприятие, курирующие разработку программного обеспечения больших систем, в том числе для государственных организаций, в частности для Пентагона. Речь идет о разработке надежных, высокопроизводительных, отказоустойчивых, безопасных промышленных приложений.

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

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

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

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

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

Отслеживая ключевые события в этой сфере и участвуя в чтении похожих курсов, в том числе в Университете Иннополис и Высшей школе экономики, я тем не менее не готов назвать аналогичную книгу российского автора или коллектива российских авторов. Дело в том, что коллектив авторов предлагаемой книги представляет Институт программной инженерии, который, по сути дела, является колыбелью программной инженерии. Он был создан сразу после исторической конференции НАТО 1968 года, когда было принято решение, что эта дисциплина необходима. Институт разрабатывает стандарты программной инженерии не только для США, но и для всего мира. Поэтому эта книга является глобальным решением, глобальным ответом на самые важные вопросы о том, как с систематической точки зрения следует разрабатывать программные комплексы.