Преодоление сложности при
построении систем является ключевой задачей
и её невозможно решить за счёт исключительно
организационных мероприятий. Можно посадить
за работу сотни и тысячи программистов,
и они напишут миллионы строк кода, но
проблемы, связанные со стыковкой кода,
с управлением изменениями, с согласованием
графиков работы различных групп программистов,
станут столь серьёзными, что получить
работающую систему станет невозможно.
Данная проблема подробно описана в книге
Ф. Брукса.
Если же присмотреться к
окружающей действительности, к тем самым
сложным системам, которые окружают нас
в повседневной жизни, то иерархичность
любой сложной системы становится совершенно
очевидной. Иерархичность систем является
одним из важнейших свойств, на основе
которого преодолевается их сложность.
И наша задача, как разработчиков, состоит
в том, чтобы моделировать системы, приближаясь
к оригиналу и описывая те же иерархические
уровни.
Разделив проект на независимые
уровни иерархии, можно получить совокупную
сложность всех уровней намного меньшую,
чем сложность проекта моносистемы. Количество
уровней не может быть большим даже для
столь сложных систем, как живые существа,
а сложность каждого уровня относительно
невелика, по сравнению со сложностью всей
системы.
Декомпозиция системы по
иерархическим уровням основывается на
агрегации. Агрегация позволяет очень просто
создавать композиции, обладающие различными
свойствами. Именно за счёт композиции
достигается то фантастическое многообразие
окружающего нас мира, которое поражает
воображение, которое лежит в основе образования
новых сущностей с новыми свойствами, и
в конечном итоге, в основе развития мира.
Композиция требует иных
описательных средств, отличных от традиционных
языков программирования. Мало того, каждый
уровень иерархии сложной системы может
потребовать собственной инструментальной
основы, и противление этому ведёт только
к усложнению проекта. Изучением атома,
молекулы, клетки и живого существа занимаются
совершенно разные науки, с уникальной
методологической и инструментальной базой.
И было бы совершенно неправильно заставлять
их всех использовать только одну основу.
Композиция требует развитых
средств конструирования, позволяющих осуществлять
сборку новых сущностей не только быстро
и комфортно, но и с учётом тех законов
и правил, которые существуют на каждом
из уровней иерархии сложной системы. Однако
появление развитых инструментальных средств
неразрывно связано с передачей возможности
развития системы конечным пользователям.
Задачей разработчиков является создание
основы системы, принципов, правил (законов)
и инструментальных средств. Такое распределение
ролей между разработчиками и пользователями
в большей степени способствует повышению
эффективности совместной работы. Пользователи
при этом в минимальной степени зависят
от программистов-разработчиков, а программисты
перестают решать задачи за пользователей,
сосредоточив основное внимание на архитектуре
систем, совершенствованию внутренних механизмов,
элементарных классов, интерфейсов и инструментальных
средств.
Именно на этом пути следует
искать ответ на вопрос о том, как сделать
разработку сложной системы простой и эффективной.
«Истина – не то, что доказуемо, истина
– это простота».
|