Академический Документы
Профессиональный Документы
Культура Документы
каждый архитектор ПО
Содержание
2
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
3
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
4
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Инженеры иногда отдают предпочтения тем или иным технологиям, методологиям или
вариантам решения задач лишь потому, что им бы хотелось видеть это у себя в резюме, а не
потому, что это – лучший вариант для решения поставленных задач. И такой подход очень
редко приводит к успеху.
Лучшее, что может быть в вашей карьере – это длинный список ваших клиентов, горящих
желанием порекомендовать вас еще кому-нибудь, потому что вы всегда делали правильные
вещи для них и для их проектов. Эта расположенность к вам будет приносить вам важные
проекты гораздо эффективнее, чем самый новый язык программирования или самая
инновационная парадигма. И хотя на самом деле важно оставаться в курсе последних
инноваций, это никогда не должно осуществляться за счет ваших клиентов. Главное –
помните о возложенных на вас обязанностях. Организация оказывает вам доверие, назначая
на должность проектировщика систем, и ожидает, что вы будете стараться избегать
конфликтов интересов и сохранять лояльность компании. Если же проект недостаточно
интересен для вас с точки зрения вашего развития, то лучше поищите другой.
Правильное же решение приведет к тому, что на проекте будет работать более довольная
команда, а более довольный клиент получит именно то, что ему нужно, и в целом на
проекте будет значительно меньше стресса. Часто это позволит вам потратить больше
времени на доскональное изучение применяемых технологий, или же изучить новые веяния
в свое свободное время. Или же наконец-то пойти на курсы по рисованию, на которые вы
собираетесь пойти уже который год. И конечно же, это оценит и ваша семья – то, что вы
будете приходить домой совсем другим.
Не смотря ни на что, всегда ставьте долгосрочные цели ваших клиентов на первое место, и
вы не ошибетесь.
5
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Усложнение же, в отличие от сложности, часто является результатом того, что мы пытаемся
построить систему, решающую сложную задачу. Архаичная система управления
воздушным трафиком, до сих пор использующаяся, является таким примером усложнения.
Эта система разрабатывалась для решения реально сложной задачи управления воздушным
потоком из тысяч самолетов, однако и сама система дополнительно привнесла еще и своей
собственной сложности. Фактически, используемая сегодня система столь сложна, что ее
модернизация уже практически невозможна. В результате во всем мире управление
воздушным трафиком основано на технологиях, которым уже более тридцати лет!
Решение реально сложных задач без излишнего усложнения и является основной задачей
проектировщика.
6
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Прямо сейчас чей-то проект стремительно катится к полному провалу. Возможно даже, что
и не один.
А почему? Может быть, потому что кто-то выбрал Ruby вместо Java? Или может быть
Python вместо SmallTalk? Или же потому, что было принято решение использовать Postgres
вместо Oracle? Или же вместо Windows надо было выбирать Linux? Все мы так или иначе
сталкивались с технологиями, якобы приведшими проект к провалу. Но каковы на самом
деле шансы того, что задача реально будет столь сложной, что ее невозможно будет решить,
используя Java?
Практически все проекты делаются людьми. И именно эти люди – главная составляющая
успеха или провала. И поэтому стоит подумать над тем, что можно предпринять, чтобы
сделать этих людей успешными.
С высокой долей вероятности на вашем проекте найдется кто-то, кто, как вам кажется,
«делает все не так» и тем самым расшатывает весь проект. И если это так, то технология,
необходимая вам для решения, на самом деле стара как мир. Возможно, эта технология –
самая главная инновация во всей истории человечества. Эта технология называется
"ведение переговоров".
Конечно же, эта тема сильно объемнее, чем эта статья, однако несколько простых советов
уже сейччас значительно повысят вашу эффективность ведения переговоров.
Вместо того, чтобы сказать разработчикам, что они должны помолчать на митингах,
потому что они никогда не дают другим высказаться, лучше спросить, не могут ли
они помочь другим людям поучаствовать в обсуждении. Объясните, что некоторые
7
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
люди более интровертны и им требуется чуть большая пауза для того, чтобы
включиться в обсуждение, и попросите их помочь, делая эту паузу
8
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Под ясностью подразумевается то, каким образом вы подаете информацию. Никто в вашей
команде не будет читать стостраничное описание архитектуры системы. Простота и
краткость в объяснении ваших идей жизненно важны для успеха любого проекта.
Старайтесь все делать как можно проще, особенно в самом начале проекта. В том числе это
означает и не писать огромные вордовские документы. Используйте средства вроде Visio
для создания простых диаграмм, наглядно объясняющих ваши мысли. Не усложняйте их,
поскольку в начале они будут меняться часто.
Еще одна вещь, которую архитекторы программного обеспечения часто не осознают – это
то, что проектировать архитектуру также означает быть лидером. Вы должны добиться
уважения ваших коллег, чтобы эффективно работать в здоровом коллективе. Скрывать от
разработчиков полную картину или не объяснять принятые решения – верный путь к
провалу. Если же разработчики на вашей стороне, то тем самым ваши архитектурные
решения получают поддержку и с их стороны тоже. В свою очередь, вы идете навстречу
разработчикам, посвящая их в тонкости разработки архитектуры. Работайте вместе с
разработчиками, а не против них. Помните, что вся команда (тестеры, аналитики,
менеджеры проекта и разработчики) требуют ясности и лидерства. Совершенствование этих
навыков поможет построить здоровое рабочее окружение.
9
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Анализ выгод участников, как в самом процессе разработки ПО, так и в организации,
разрабатывающей ПО, позволяет выявить основные приоритеты, управлять которыми и
должен проектировщик, как в краткосрочной, так и в долгосрочной перспективе.
10
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Часто заказчики в качестве требований к проекту выдвигают то, что, как им кажется,
является жизнеспособным решением их проблемы. В качестве примера, ставшего
классическим, можно привести историю, которую рассказал Harry Hillaker, ведущий
разработчик самолета F-16 Falcon. Их команде было поручено разработать самолет,
летающий со скоростью, в 2-2.5 раз выше скорости звука. Тогда, а возможно, и сейчас, это
весьма нетривиальная задача, особенно если при этом требуется построить дешевый и
легкий самолет. Вы же, наверное, помните, что аэродинамическое сопротивление
увеличивается в четыре раза при увеличении скорости в два, и понимаете, как этот факт
влияет на вес самолета.
11
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
7. Встаньте!
(В оригинале – Stand Up!)
На тему коммуникации уже написано немало книг, но я хочу рассказать об одном простом,
практичном, легко реализуемом приеме, который радикально повысит эффективность
вашей коммуникации, и как следствие – ваш успех как архитектора. Если вам приходится
говорить с более чем одним человеком сразу, встаньте. Будь это формальное ревью дизайна
или неформальное обсуждение диаграмм, не имеет никакого значения. Встаньте, особенно
если все остальные сидят.
Самый легкий способ как минимум удвоить эффективность в процессе «продажи» ваших
идей – это просто стоять во время выступления.
12
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
8. Небоскребы не масштабируются!
(В оригинале – Skyscrapers aren't scalable)
Второй плюс заключается в том, что при таком подходе мы вынуждены создавать гораздо
более продуманный интерфейс между компонентами. Выпуск лишь одного компонента
новой системы практически всегда означает необходимость его интеграции в старую
систему. При этом к концу разработки каждый компонент будет протестирован в двух
различных системах – старой и новой. Повторное использование начинается лишь при
первом повторном использовании :) и разработка по частям автоматически повышает
пригодность к повторному использованию. На практике это к тому же часто приводит к
лучшей когерентности и менее сильной связности.
При этом некоторые ключевые для строительства домов методологии, будучи перенесены
на программирование, будут сбивать нас с пути. Например, незыблемость материального
мира естественным образом подталкивает к применению водопадной модели разработки.
Ведь никто не начинает строить небоскреб без знания о том, где он будет построен и
сколько у него будет этажей. Добавить еще пару этажей к уже построенному зданию будет
слишком дорого и рискованно, поэтому этого избегают всеми возможными способами.
Будучи однажды спроектированным и построенным, небоскреб не предполагает
последующего изменения своего местоположения или высоты. Небоскребы не
масштабируются.
Мы не можем легко добавить полос к построенной дороге, однако все мы знаем, насколько
легко можно добавить функциональность в написанную программу. И это не дефект
13
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
14
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Все мы рано или поздно сталкиваемся с ограничениями бюджета. Когда решение о том,
какую технологию использовать, принимается под давлением о необходимости снижения
расходов. Диалог при этом часто выглядит как-то так.
Под «Х» может пониматься любая жизненно необходимая для проекта вещь: лицензии на
ПО, резервные сервера, удаленное архивирование или источники бесперебойного питания.
Вопрос этот обычно задается в снисходительном тоне, как будто бы взрослый уличил
ребенка в том, что он растратил все свои карманные деньги на комиксы и жвачки.
Правильный ответ на подобный вопрос: «Да, действительно нужна». Ответ, который дается
крайне редко.
Все это может быть правдой, но к сожалению дать такой ответ будет в корне неправильно.
Инвестор перестанет вас слушать сразу после слова «Ну...».
Проблема в том, что вы по-прежнему видите себя в роли инженера, в то время как инвестор
на 100% уверен, что он обсуждает условия. Вы ищете решение, которое бы всех устроило, а
он ищет выигрышный вариант для себя (и скорее всего, проигрышный для вас), или же,
говоря простым языком, торгуется. А в обсуждении условий ни в коем случае нельзя
соглашаться на первый предложенный вариант. На самом деле, правильный ответ на «А нам
действительно это надо?» должен быть примерно вот таким.
«Без резервного сервера вся система будет падать минимум трижды в день, практически
всегда в моменты максимальной нагрузки, или же когда вы будете что-то демонстрировать
совету директоров. На самом деле нам даже нужно четыре сервера, тогда мы сможем
сделать две резервных пары и гарантировать работоспособность системы в полном объеме,
даже если выйдут из строя сразу два сервера».
15
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Конечно, вы понимаете, что на самом деле вам не нужны четыре сервера. Это такой прием в
переговорах, чтобы дать возможность инвестору сменить тему. Вы повышаете стоимость,
показывая, что вы и так уже находитесь на самой границе, на самом минимуме все еще
приемлемой конфигурации. И если вы вдруг в результате таки получите четыре сервера
вместо двух, то вы всегда сможете на одном из лишних серверов развернуть копию системы
для тестирования, а второй использовать для нужд разработки.
16
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Несколько простых вопросов могут это прояснить. Сколько? За какой период? Как часто? К
какому сроку? С какой частотой? Если на эти вопросы не будет ответов, то значит, что
потребность клиента не сформулирована. Ответы должны быть на языке бизнеса,
использующего систему, в противном случае надо очень хорошо подумать. Если вы
проектируете систему и ваш заказчик не хочет или не может назвать вам эти цифры, задайте
себе вопрос «Почему?». А потом все же получите эти ответы. И если в следующий раз вам
скажут, что система должна быть «масштабируемой», спросите, откуда появятся новые
пользователи, сколько их будет, и как часто это будет происходить. И не принимайте
ответы «Много» и «Часто».
Если критерий нечеткий, то практически всегда его можно описать диапазоном: ожидаемое
значение, минимум, максимум. Если такой диапазон задать не получается, то значит,
требуемое поведение недостаточно продумано. После того, как диапазон задан, в процессе
детализации архитектуры можно повторно проверять, находимся ли мы все еще в заданных
рамках или уже нет. Нахождение таких диапазонов и их проверка являются достаточно
затратными операциями. И если никто не захочет тратить ресурсы на это, значит, скорее
всего, данный критерий вообще не важен. И вы спокойно можете переключиться на то, что
действительно важно.
«Система должна давать ответ пользователю не позднее чем через 1500 миллисекунд после
ввода. Во время нормальной загрузки (определяемой как...) среднее время ответа должно
быть в диапазоне от 750 до 1250 миллисекунд. Для времен менее 500 миллисекунд
пользователь уже не заметит особой разницы, поэтому тратить ресурс на снижение времени
ниже этой границы мы не будем» - вот теперь это требование!
17
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Цените тех людей, которые будут реализовывать ваше видение. Прислушивайтесь к ним.
Если у них серьезные проблемы с вашим дизайном, то очень может быть, что правы как раз
они, а ваш дизайн ошибочен (или, как минимум, недостаточно ясен). И это ваша задача –
изменить дизайн в соответствии с тем, что работает в реальном мире, а что нет.
Практически ни один дизайн не идеален вначале, но он может стать таковым по мере
реализации.
18
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Проектировщику необходимо постоянно развивать и тренировать то, что можно назвать как
«контекстно-зависимый здравый смысл», потому что единого решения, подходящего для
всех случаев, просто не существует.
Большой проблемой в индустрии разработки ПО является то, что люди часто отвечают за
решение проблем, требующих значительно больше контекстного здравого смысла, чем у
них его успело накопиться. Возможно, это из-за того, что отрасль разработки еще
достаточно молодая и бурно растущая. И возможно, когда эта проблема исчезнет, это будет
признаком зрелости отрасли.
Самые важные знания о шаблонах проектирования – это знания о том, когда их нужно
применять, а когда нет. И то же самое верно и для других основополагающих гипотезах и
связанных с ними действиях во время анализа задачи. И в проектировании, и в анализе
является аксиомой то, что не существует универсального решения, подходящего на все
случаи жизни. Архитектор должен тренировать свое чувство контекстного здравого смысла,
решая поставленные перед ним задачи.
19
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Когда клиенты формулируют свои требования, в основном они затрагивают лишь те,
которые относятся к непосредственной функциональности системы. Нефункциональные же
аспекты, такие как производительность, гибкость, время старта, необходимость
техподдержки и прочее, остаются на усмотрение архитектора. Однако, очень часто первое
тестирование нефункциональных требований отодвигается до самого последнего момента
цикла разработки. Это ошибка, встречающаяся слишком часто.
Причины этого могут быть различными. Возможно, иногда нет смысла делать что-то
быстрым и гибким, если оно при этом не будет выполнять основные требуемые функции.
Тестирование может быть очень сложным. Возможно, первые версии системы не будут
работать под максимальной загрузкой.
Почему это так важно? Самая важная причина этого – то, что вы будете знать, какие именно
изменения повлекли падение производительности. И вместо детального анализа всей
системы целиком в случае обнаружения проблемы производительности на поздней стадии
вы сможете сконцентрироваться на ключевых моментах. Тестирование производительности,
начатое рано и делающееся регулярно, предоставляет вам возможность сильно ограничить
диапазон изменений, повлекших снижение производительности. В ранних тестах вы можете
даже не искать проблемы производительности, а получить исходную точку, с которой
будете сравнивать ситуацию в дальнейшем. Ведение такой истории вам даст жизненно
важную информацию для обнаружения проблем производительности и их решения.
20
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
21
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
И здесь вам, как архитектору, нужно вступать в игру. Если вы постараетесь создать гибкую
архитектуру, обучите людей agile-практикам, к примеру, разработке через тестирование,
настроите интеграционный сервер, то тем самым вы воспитаете культуру, в которой не
будет правильным тратить чье-либо время впустую. Чтобы это стало реальным, вы должны
быть уверены, что система, кроме всего прочего, имеет подходящую для
автоматизированного тестирования архитектуру. Это изменит поведение разработчиков.
Если тесты будут выполняться быстро, то их будут запускать чаще, что хорошо уже само по
себе, однако главное – это то, что разработчики не будут оставаться наедине с испорченным
кодом. Если тесты зависят от внешних систем, если требуется база данных, то измените их
так, чтобы их можно было запускать локально с использованием симуляторов или заглушек,
или хотя бы с использованием локальной копии базы данных, и пусть тесты выполняются
автоматически. Люди не должны ждать, потому что в противном случае они будут
придумывать обходные пути, что часто приводит к описанным выше проблемам.
Инвестируйте время в создание систем, которые будут работать быстро. Это ускоряет весь
поток, делая разработку более быстрой. Используйте симуляторы, уменьшайте зависимости,
разбивайте систему на маленькие модули – делайте то, что считаете нужным. Главное –
обеспечьте, чтобы у людей не было причин даже думать о том, чтобы сделать коммит без
проверки.
22
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Кажется, что архитекторов никогда не перестанет удивлять тот факт, что не существует
единственной модели, единственного формата данных, единственного протокола передачи
– фактически, любого крупного архитектурного компонента, политики или положения,
способных полностью подойти для любой ситуации в бизнесе. Конечно же, для достаточно
крупного энтерпрайза, которому нужно беспокоиться о том, сколько различных таблиц
“Account” понадобится в следующей декаде, одной таблицы “Account” для всего будет
недостаточно.
В технических областях мы все можем привести к одинаковости. Для нас – очень удобно.
Однако бизнес имеет дело с неупорядоченным, множественным, запутанным и
неопределенным миром. Более того, бизнес имеет дело даже не с «миром», а с мнениями
людей о том или ином аспекте этого мира. Одно из решений – считать, что мы имеем дело с
технической областью, и принудительно применить универсальное решение. Однако
реальность – такая штука, которая продолжает существовать, даже если вы не верите в нее.
И сложность все равно появляется по мере эволюции бизнеса. В результате появляются
энтерпрайз команды, тратящие свое очень недешевое время на попытки побороть страхи
разговорами о DTD. А заказчики, оплачивающие это, склоняются в результате к тому, что
получаемый результат далек от совершенства.
23
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Бизнес-заказчики обычно планируют определенный возврат вложений (ROI) перед тем как
инициировать процесс разработки. Архитектор должен иметь это в виду, ограничивая те
инициативы со стороны разработки, чтобы избежать принятия решений, которые могут
привести к перерасходу бюджета. Возврат вложений должен рассматриваться как один из
главных интересов заказчика во время переговоров о ценности той или иной
функциональности по сравнению со стоимостью ее реализации. Например, архитектор
должен учитывать интересы заказчика, не соглашаясь на желание разработки использовать
технологию, имеющую неприемлемо высокую стоимость лицензии или техподдержки
готового продукта.
24
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Также часто случается, что разработанное решение «для всего сразу» в реальности
оказывается не пригодным «ни для чего конкретного». Компоненты ПО должны в первую
очередь разрабатываться для конкретных целей и удовлетворять именно эти цели.
Эффективная универсализация следует лишь из глубокого понимания, которое в свою
очередь, приводит к упрощению. Такая универсализация может позволить упростить задачу
до более базовой, основываясь на анализе известных примеров и выделении общих для них
концепций. Универсальность, которая четко выражена, лаконична и обоснована. Однако
часто универсализация становится вещью в себе, уводя проект в противоположном
направлении и добавляя сложность вместо ее уменьшения. Погоня за таким обобщением
часто приводит к решениям, никак не привязанным к реальности разработки. Такое
обобщение оказывается основанным на предположении, которое позже оказывается
неверным, предлагает варианты, которые никогда не понадобятся, накапливает «багаж»,
который невозможно выбросить, и таким образом добавляет излишнюю усложненность, с
которой приходится иметь дело будущим разработчикам и архитекторам.
И хотя многие архитекторы ценят универсальность, она не должна быть безусловной. Люди
не хотят платить за универсальность, они хотят получить решение для их уникальной
ситуации. Мы можем найти некоторую универсальность и гибкость в процессе разработки
конкретного решения, но если мы слишком увлечемся и забудем о реальных требованиях,
то мы очень быстро окажемся среди не слишком ясных возможностей, переусложненных
опций конфигурации, чересчур перегруженными списками параметров, неоправданно
сложными интерфейсами и неактуальными абстракциями. В погоне за ненужной гибкостью
вы можете потерять ценные аспекты альтернативного, более простого решения.
25
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Хороший архитектор должен быть практиком. Он должен быть способным занять любую
позицию в команде, начиная от прокладки сети и конфигурации процесса сборки до
написания юнит-тестов и измерения производительности. Без глубокого понимания всего
диапазона технологий архитектор ничем не отличается от обычного менеджера проекта.
Конечно же, люди в команде могут иметь более глубокие знания тех или иных технологий в
своих областях, но при этом очень сложно представить, как они смогут доверять
архитектору, если он вообще не разбирается в технологии. Как уже было сказано,
архитектор – это интерфейс между бизнесом и разработкой, и поэтому он должен понимать
все аспекты разработки, чтобы адекватно представить все возможности для заказчика, не
прибегая к постоянным консультациям остальных. Аналогично, архитектор должен
понимать язык заказчика, чтобы вести команду к целям, поставленным заказчиком.
Люди лучше всего обучаются, смотря на других. Именно так мы учились в детстве.
Хороший архитектор должен быть способным обнаружить проблему, собрать команду
вместе и без поиска виноватых объяснить, в чем проблема может быть, и предложить
элегантное решение. Абсолютно нормально при этом обратиться за помощью к команде.
Команда должна ощущать себя частью решения, но при этом архитектор должен управлять
дискуссией и выбирать правильные решения.
Архитектор должен быть добавлен в команду в самом начале проекта. Он не должен сидеть
на академических высотах, диктуя направления, а вместо этого должен приземленно
работать вместе с командой. Вопросы вроде «В каком направлении двигаться» или «Какую
технологию выбрать» не должны выливаться в новые исследования или проекты, вместо
этого ответы должны выбираться исходя из практического опыта или при помощи совета от
других архитекторов-коллег (ведь у хорошего архитектора всегда будут связи с другими
хорошими архитекторами!).
26
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
27
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
28
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Идея, что сроки можно ужать, для того чтобы снизить расходы или ускорить выпуск, часто
приходит в головы. Однако ничего хорошего из этого не получается. Обычно для того,
чтобы уложиться в новые сроки, прибегают к переработкам или же жертвуют
«маловажными вещами», такими как юнит-тестирование, например. Избегайте этого
сценария любой ценой. Напомните тем, кто захочет пойти по этому пути, что:
29
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
В 1620-м году шла война между Швецией и Польшей. Желая побыстрее завершить эту
разорительную войну, шведский король начал строительство корабля, названного Васа. Это
должен был быть не простой корабль. Требования к нему были уникальными для того
времени. Он должен был быть более 60 метров в длину, нести 64 пушки на двух оружейных
палубах, и иметь возможность перевозить 300 солдат на борту. Сроки были критичны, денег
было мало (звучит знакомо, не так ли? :) Дизайнер корабля никогда до этого не
проектировал корабли такого класса. Он был экспертом в постройке кораблей меньшего
класса, однопалубных. Тем не менее, он экстраполировал свой предыдущий опыт и
спроектировал Васа. Корабль был успешно построен по его спецификациям, и в день
запуска корабль гордо вышел в гавань, отсалютовал из своих пушек и практически сразу же
затонул.
Проблема корабля оказалась тривиальной – палуба боевых кораблей тех лет была обычно
тесным и опасным местом, особенно в бою. Постройка же корабля, одновременно
являющегося и боевым, и транспортным, оказалась дорогой ошибкой. Архитектор, желая
удовлетворить желания короля, построил слишком неустойчивый корабль.
30
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
База данных – это то место, где находятся все данные, как внесенные вашими
сотрудниками, так и полученные от ваших заказчиков. Пользовательский интерфейс,
бизнес-логика, логика приложения и даже ваши сотрудники могут меняться, но данные
будут всегда. И поэтому нельзя переоценить важность построения целостной модели
данных с самого начала.
Целостная модель данных – это то, что обеспечивает вам сохранность данных сегодня и
расширяемость завтра. Обеспечение сохранности подразумевает устойчивость к ошибкам,
которые, несмотря на все ваши усилия, будут возникать в часто меняющемся уровне
приложения. Это означает обеспечение ссылочной целостности. А также построение
доменозависимых правил и ограничений везде, где это возможно. Это означает выбор
ключей, помогающих вам убедиться в ссылочной целостности и соответствии
установленным правилам. Быть готовым к расширению завтра означает правильным
образом нормализовать данные, чтобы потом легко надстраивать уровни над моделью
данных. Это означает не искать коротких путей.
База данных должна быть последним привратником, охраняющим ваши ценные данные.
Приложение, могущее меняться ежедневно, не может быть сторожем даже для самого себя.
Чтобы база данных могла играть эту роль, модель данных должна быть спроектирована так,
чтобы не принимать изначально неправильные данные и предотвращать не имеющие
смысла отношения. Ключи, внешние отношения, правила и ограничения, описывающие
схему – это лаконичные, понятные и легко проверяемые вещи, к тому же отлично
самодокументируемые. Правила, задающие модель данных, к тому же достаточно
стабильные, и изменения уровня приложений часто оставляет их без изменений.
31
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
32
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Оказавшись перед выбором из двух альтернатив, большинство думает, что главное – это
сделать правильный выбор между ними. В проектировании (ПО и не только) это не так.
Наличие двух возможностей – индикатор того, что вам нужно подумать о внесении
неопределенности в дизайн. Используйте неопределенность как повод определить, где вы
можете отложить принятие решения, или где вы можете снизить значимость этого выбора.
Если вы привяжете себя к первому пришедшему в голову варианту, скорее всего, поменять
его потом будет сложно, в результате случайный выбор станет значимым и гибкость
продукта снизится.
Одно из самых простых и конструктивных определений архитектуры дал Гради Буч: «Вся
архитектура – это дизайн, но весь дизайн – это не архитектура. Архитектура представляет
значимые решения дизайна, формирующие систему, где значимость измеряется стоимостью
изменения». Что из этого следует – это то, что эффективная архитектура должна снижать
значимость решений. Неэффективная же архитектура значимость усиливает.
Когда решение в дизайне может развиваться двумя путями, архитектор должен сделать шаг
назад. Вместо выбора альтернативы между А и В нужно задать себе другой вопрос: «Как
сделать дизайн таким, чтобы выбор между А и В был менее значимым?». Самое интересное
– не выбор между А и В, а само наличие такого выбора (и кстати, сам выбор далеко не
всегда будет окончательным).
Архитектор должен пройти огонь и воду, чтобы научиться легко видеть дихотомию.
Стояние у доски и энергичное обсуждение вариантов с коллегами? Пыхтение над кодом и
размышление, попробовать ту или эту реализацию? Когда новое требование или уточнение
старого перечеркивает текущую реализацию, это проявление неопределенности. Ответ на
это – найти такую инкапсуляцию, которая могла бы изолировать решение от кода, сильно
зависящего от этого решения. Без этого умения видеть ответ часто заключается во внесении
хаотичных изменений в код и попытках компенсировать неопределенность
множественными универсальными опциями. Или же, если решение принимается случайно,
результатом может оказаться поворот в неправильном направлении.
Часто требуется принимать решения ради решений. В таких случаях может помочь
подумать о возможностях. Там, где есть неопределенность, каким путем идти разработке,
примите решение не принимать решения. Откладывайте решение до тех пор, пока оно не
сможет быть принято более ответственно, на основании актуальных знаний, но при этом это
не должно быть уже слишком поздно, чтобы суметь использовать преимущества этих
знаний.
33
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Границы проекта определяют его размер. Сколько времени, усилий и ресурсов потребуется?
Какая функциональность и какого уровня качества? Насколько сложно это будет внедрить?
Какой риск? Какие ограничения? Ответы на эти вопросы и определяют границы проекта.
Проектировщикам нравятся большие, сложные проекты. Потенциальная награда за
сложный проект может подталкивать людей искусственно раздвигать границы проекта для
повышения видимой важности. Раздвигание границ – враг проекта, потому что при этом
вероятность провала растет быстрее ожидаемого. Увеличение проекта вдвое может
повысить вероятность провала на порядок.
Интуиция нам подсказывает удвоить время или ресурсы при удвоении объема
работы. История же говорит ("The Mythical Man-Month" by Fred Brooks), что
зависимость здесь нелинейная. К примеру, команда из четырех человек потратит
более чем в два раза времени на коммуникацию, чем команда из двух человек.
Оценки оказываются далеки от реальности. Кто ни разу не сталкивался с вещами,
реализовать которые оказывалось значительно сложнее, чем ожидалось?
Конечно, некоторые проекты невозможно сделать без присущей для них определенной
сложности и размера. Сделать текстовый редактор без возможности ввода текста может
быть и легко, только результат не будет текстовым редактором. Какие же стратегии могут
помочь лучше контролировать границы реальных проектов?
34
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
35
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Внутри вашей организации разработчики или дизайнеры должны знать о том, что дизайн,
фреймворк, библиотека или фрагменты кода существуют, и где можно найти всю
необходимую информацию о них (документацию, версии, совместимость) чтобы это
повторно использовать. Очевидно, что люди не станут искать вещи, о существовании
которых они даже не подозревают. Гораздо больше шансов, что повторно используемые
вещи реально будут повторно использованы, если информация о них будет активно
продвигаться.
36
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
3. Уверены, что это лучше, чем если бы они это написали сами.
И если ваша команда не знает, где лежат вещи, доступные для повторного использования,
или не знает, как конкретно их использовать, они будут поступать согласно естественной
своей человеческой природе. Они будут делать эти вещи с нуля. А вы будете за это платить.
37
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
В слове «архитектура» нет буквы «Я». И нет ее там потому, что так требуют правила
правописания.
Как это связано с архитектурой ПО? Очень просто. Наш главный враг – наше эго. Покажите
мне опытного архитектора ПО, который не делал таких вещей:
Мне кажется, что каждый опытный архитектор попадал в такие ситуации когда-нибудь. Я
лично делал все три вещи, из чего вынес болезненные уроки на будущее.
38
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Проверяйте вашу работу. Модель – это еще не архитектура. Это лишь ваше
понимание того, как архитектура должна работать. Работайте вместе с командой,
чтобы определить тесты на соответствие архитектуры требованиям.
Наблюдайте за собой. Большинство из нас склонны защищать результаты своей
работы, акцентироваться на личных интересах и считать себя самым умным в
комнате. Анализируйте свое поведение хотя бы несколько минут в день. Оказали ли
вы чьим-то идеям заслуженное уважение? Реагировали ли негативно без всякого
повода? Понимаете ли вы на самом деле, почему кто-то не согласен с вами?
Удаление буквы «Я» из слова «Архитектура» еще не гарантирует успеха, а лишь удаляет
самую частую причину провалов.
39
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Вид с высоты 300 метров предоставит информацию как раз нужного уровня. Он объединяет
большие объемы данных и множество метрик, таких как количество функций, разветвление
структуры классов или цикломатическая сложность. Конкретный вид сильно зависит от
конкретных аспектов качества. Это может быть визуальное представление графа
зависимостей, диаграмма метрик на уровне классов или сложная множественная метрика,
зависящая от множества входных данных.
Как только подходящий вид становится доступным, качество ПО становится чуть менее
субъективным. Становится возможно сравнивать его с аналогичным. Сравнение различных
версий позволит понять общую тенденцию, а сравнение различных подсистем – резкие
отличия или отклонения. Даже имея единственную диаграмму, мы уже можем понадеяться
на наше чувство прекрасного. Хорошо сбалансированное дерево, скорее всего, представляет
отличную иерархию классов, гармонический набор квадратиков может означать, что код
адекватно разбит по классам подходящего размера. В большинстве случаев можно доверять
правилу: «Если что-то хорошо выглядит, то, скорее всего, оно действительно хорошее».
40
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
В своей работе, посвященной Lean разработке, Mary и Tom Poppendieck описывают технику
принятия решений. Они оспаривают подход, согласно которому нужно откладывать
принятие решений как можно дольше, до самого последнего момента, когда дальше
откладывать уже нельзя, когда в случае бездействия последствия будут необратимы. Это в
общем благоразумно с той точки зрения, что чем позже принимается решение, тем больше
доступно информации, на основе которой это решение и принимается. Однако часто больше
информации еще не означает достаточно информации, к тому же известно, что лучшие
решения основаны на прошлом опыте. Что же это значит для архитектора?
Этот подход работает как для небольших задач, так и для больших. Он может помочь
команде выбрать, использовать или нет Hibernate шаблоны из Spring фреймворка, и точно
также может помочь найти ответ на вопрос, какой Javascript фреймворк лучше
использовать. Время, в течении которого пробуются различные подходы, сильно зависит от
сложности принимаемого решения.
Попробовать два или более варианта решения одной и той же проблемы требует больше
усилий, чем просто принять решение «авансом» и потом его реализовать. Однако шансы,
что таким образом принятое решение потом окажется не самым оптимальным, достаточно
велики. И в результате архитектор может оказаться перед дилеммой: откатить назад уже
проделанную работу по неправильно принятому решению, или же продолжать уже начатое,
пусть и с меньшей эффективностью, и при этом оба выбора в результате приведут к
серьезной потере времени. Или, что еще хуже, никто в команде вообще не увидит
альтернативного варианта, в этом случае потери времени не будут даже обнаружены. На
фоне всего этого, потратить некоторое количество времени на анализ альтернатив может
оказаться самой выгодной стратегией.
41
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Самые успешные архитекторы, которых я знаю, это те, у кого есть как широкие технические
знания, так и глубокие знания определенных предметных областей. Такие архитекторы
могут вести переговоры с директорами компаний-заказчиков, говоря с ними на их языке.
Это обеспечивает уверенность в понимании того, что делается в результате. Знания
предметной области позволяют проектировщику лучше понимать проблемы, задачи, цели и
процессы, что является ключевым фактором для разработки эффективной архитектуры.
42
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Итак, на что же должна ориентироваться индустрия ПО для улучшения своих практик? Что,
если посмотреть на практики производств сложных и технологичных продуктов массового
рынка, таких как машины, лекарства или полупроводники?
Какой же урок можно вынести из этого примера? Главное – это то, что производство
автомобиля состоит из двух процессов. Первый процесс – это собственно проектирование
автомобиля и наладка сборочной линии. Второй процесс – это сборка автомобилей по
индивидуальным заказам. В том или ином виде оба эти процесса присутствуют и в
индустрии ПО. Проблема лишь в том, что вкладывается в эти определения.
В статье «Что такое проектирование ПО» Jack Reeves предположил, что единственная вещь
в разработке ПО, подходящая под определение документа дизайна (так, как этот документ
понимается и используется в классической инженерии) – это исходный код. А сборка ПО
автоматизирована и выполняется компилятором, скриптом сборки и тестирования.
Приняв то, что исходный код – это проектирование, а не сборка, мы можем адаптировать
гарантированно работающие практики управления сложными и непредсказуемыми
работами, такими как разработка нового автомобиля, лекарства или компьютерной игры.
Мы говорим о практиках agile управления, как например, SCRUM. Эти практики
фокусируются на максимизации возврата вложений в терминах ценности заказчика.
43
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Одна из вещей, меня занимающих – это наблюдать, какие вещи поменялись со временем, а
какие – нет. Множество паттернов, фреймворков, парадигм изменились, а алгоритмы, когда-
то увлеченно обсуждаемые умными людьми, думающими о долгосрочных перспективах,
сейчас могут вызвать лишь зевоту. Почему? Что нам хочет сообщить история?
Простые правила.
Мы говорим сами себе «Делай как можно проще». Мы говорим это, но не делаем. А не
делаем это, потому что нам это не надо. Мы умны и можем справиться с некоторым
количеством сложности, и легко это оправдываем, потому что это добавляет живости в
дизайн, потому что это более элегантно для наших эстетических чувств, потому что мы
верим, что можем предсказать будущее. Потом проходит время, вы удаляетесь от проекта
на год и более. А когда возвращаетесь на него посмотреть, вы практически всегда
удивляетесь, почему вы сделали так, как сделали. Если бы вам пришлось делать все заново,
скорее всего, вы бы сделали это по-другому. Время делает нас глупо выглядящими. И
лучше понять это раньше и преодолеть себя, на самом деле попытавшись понять, что
означает «просто» через призму времени.
44
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Будучи разработчиком, вы вряд ли выделяли время на то, чтобы сесть и посмотреть, как
стыкуются друг с другом все части системы. Теперь вы архитектор, и это ваша основная
задача. Пока разработчики активно пишут классы, методы, тесты, интерфейсы пользователя
и базы данных, вы должны следить за тем, чтобы эти куски подходили друг к другу.
Прислушивайтесь к проблемным точкам и пытайтесь их улучшить. У людей возникают
проблемы при написании тестов? Улучшите интерфейс и упростите зависимости. Вы точно
не понимаете, где вам требуется абстракция, а где нет? Поработайте над пониманием
предметной области. Не уверены, в каком порядке разрабатывать компоненты? Постройте
план проекта. Разработчики делают одни и те же ошибки, используя API, вами
разработанное? Сделайте его более стандартным. Люди не до конца понимают дизайн?
Соберите людей и объясните им. Не уверены, где вам нужна расширяемость? Пообщайтесь
с заказчиком и изучите его бизнес-модель.
45
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
46
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Я участвовал более чем в сотне различных программных проектов. В каждом из них были
моменты, приносящие гораздо больше проблем, чем ожидалось. Часто небольшая часть
команды определяла эти возможные проблемы на ранних стадиях, однако остальное
большинство не соглашалось или игнорировало это, потому что не понимало всей важности
до тех пор, пока не становилось слишком поздно.
То, что казалось тривиальным вначале, потом становилось критическим, часто после
того, как было уже слишком поздно для исправления. Эксперимент с лягушкой в
медленно нагревающейся воде хорошо иллюстрирует эту ситуацию.
Люди часто встречают сопротивление, когда остальная часть команды не разделяет
их опыта или знаний. Преодоление этого сопротивления требует достаточно
смелости, уверенности в себе и убедительности. И часто случается, что даже
высокооплачиваемые опытные консультанты, специально нанятые для
предотвращения подобных ситуаций, не могут это сопротивление преодолеть.
Большинство программистов – оптимисты. Болезненный опыт может умерить
оптимизм, но до его приобретения присутствует склонность к оптимизму.
Пессимисты в команде часто не пользуются популярностью, даже если они
оказываются правы. Мало кто будет рисковать репутацией и идти против
большинства без очень серьезной для этого причины. При том, что проблемы часто
дают о себе знать как «Мне это не нравится, но я пока не могу объяснить почему», и
с такой аргументацией редко удается выиграть спор.
Каждый разработчик смотрит на проект под разным углом, фокусируясь на зонах
своей ответственности, а не на целях проекта в общем.
У всех нас есть «слепые пятна», ситуации, которые нам сложно распознать или
принять.
47
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
48
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Просто научитесь жить с тем, что эта профессия не входит в список официальных.
49
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Другой пример. Вы разрабатываете новую функцию для очередной версии вашего ПО, и у
вас есть два варианта. Более простой – добавить дополнительное поле в таблицу и форму
ввода и сделать все за день-два, и более сложный – не добавлять его и потратить неделю-
две. Какой вариант вы выберете?
Добавление нового поля в таблицу выглядит вполне невинно. Однако это – требование для
ваших пользователей. Они будут должны вносить больше информации, возможно они будут
забывать это делать в силу привычки, что приведет к потере времени, задержкам и
раздражению.
Неэтично ухудшить жизнь множеству других людей, даже совсем чуть-чуть, лишь для того,
чтобы облегчить жизнь себе. Ваша программа может воздействовать на миллионы людей.
Каждое ваше решение будет оказывать на них влияние. Всегда имейте это в виду. Более
правильным будет взвалить на себя тяжелую ношу, чтобы облегчить ее вашим
пользователям.
50
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Стоить вспомнить, что авария атомной станции на острове Трех Миль была вызвана
неисправностью предохранительного клапана – механизма безопасности, предназначенного
для предотвращения последствий превышения давления в контуре выше допустимого.
Примите как данность то, что в вашей системе будут происходить сбои и отказы. Если вы
это не признаете, вы потеряете возможность обнаружения и контроля таких ситуаций –
нельзя контролировать то, чего не может случиться. Как только вы признаете, что сбои
возможны, вы получите возможность спроектировать и реакции системы на конкретные
сбои с целью минимизировать последствия и защитить остальные части системы.
Если вы не заложите в систему режимы работы в случае сбоев, то сбои все равно случатся,
но система при этом будет вести себя полностью непредсказуемо.
51
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Есть нечто ироничное в том, чтобы пытаться написать статью про идеи в архитектуре ПО,
когда основная мысль, которую хочется донести – это то, что идей в архитектуре в
принципе нет. Ведь если это так, то и писать нечего, а если таки написать, то получится
парадокс, последствиями которого может стать что-нибудь очень серьезное, например,
схлопывание всей вселенной.
Самый ценный урок, который я усвоил, будучи архитектором ПО, это то, что контекст – это
король, а простота – его скромный слуга. На практике это означает, что именно контекст –
единственная движущая сила при принятии архитектурных решений.
Когда потребовалось выбрать базу данных для танка, команда протестировала несколько
вариантов. Оказалось, что требуемое быстродействие для обработки потока информации
для работы системы слежения за целями обеспечивают практически все рассмотренные
СУБД. Однако для них было большим сюрпризом обнаружить, что выстрел из пушки танка
создает столь мощный электромагнитный импульс, что все системы на борту
перегружаются. Без работающих систем современный танк в буквальном смысле слепнет. И
самым главным фактором при выборе базы данных становится время восстановления после
сбоя. И по этому критерию лучше всего подходит решение вообще без базы данных, чем
Interbase, имеющий минимальное время восстановления среди рассмотренных. И именно
поэтому оно и было выбрано для танка M1 Abrams.
Таким образом, пока на форумах кипят обсуждения, какая технология лучше – Х или У, это
все лишь пустое времяпровождение. Причина таких горячих дебатов обычно не в серьезном
превосходстве одной из технологий, а наоборот, практически полном отсутствии
значительных отличий. Какие-то свойства больше нравятся одним, какие-то другим, и пока
нет решающего контекста, выбор сделать сложно.
52
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Ваша команда не должна иметь идей вообще, ставя в фокус контекст и находя наиболее
простое решение в этом контексте.
53
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Скорость работы неинтерактивных компонент тоже важна. Как пример – «ночной» скрипт,
запускаемый каждую ночь, не сможет работать, если для его работы будет требоваться
более 24-х часов. Производительность может быть очень важна, например, в системе
восстановления после катастрофы. Насколько быстро будет возможно полное
восстановление системы после полного выхода из строя одной из ее частей?
54
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
При этом одна маленькая стрелочка может означать что-то вроде «Синхронный запрос-
ответ с использованием SOAP-XML поверх HTTP». И это слишком много информации для
одной маленькой стрелочки. Часто даже не хватает места полностью это написать над этой
стрелочкой, и мы сокращаем надпись до чего-нибудь вроде «XML over HTTP» для
внутреннего использования или «SKU Lookup» для показа заказчику.
Эта стрелочка выглядит как непосредственный контакт между приложениями, однако это
не так. Пространство между квадратиками, пустое на диаграмме, в реальности заполнено
аппаратными и программными компонентами. Такими как:
Сетевые карты
Коммутаторы
Файрволы
Маршрутизаторы
XML преобразователи
FTP серверы
Метро-сети
MPLS шлюзы
Океаны
Рыболовные траулеры, случайно повреждающие сетями кабели
Скорее всего, на пути между программами А и В будет четыре или пять компьютеров. И вы,
как архитектор, проектирующий взаимодействие между этими программами, должны это
учитывать.
Однажды я видел стрелочку с надписью «Выполнение». Один сервер был внутри компании
клиента, другой был в другой компании. Эта стрелочка, критичная для удовлетворенности
заказчика, будучи распакованной в цепочку событий, стала напоминать головоломку, а не
простой интерфейс. Сообщение отправлялось обработчику, который записывал его в файл,
который загружался периодически запускаемым FTP процессом, и так далее. Всего шагов в
этой последовательности оказалось более двенадцати!
Важно понимать все, что стоит за каждой стрелочкой. Вместо «SOAP-XML over HTTP»
следовало написать «Потребуется один запрос для каждого HTTP запроса, плюс
подтверждение для каждого HTTP ответа. Планируется около 100 запросов в секунду и
доставка ответов за время не более чем 250 миллисекунд в течение 99.999% времени».
55
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
И даже это еще не все, что нужно знать об этой стрелочке. Без следующей информации нам
тоже не обойтись:
56
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
57
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
58
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Главное изменение — то, что стандарты вместе с ростом пропускной способности каналов и
вычислительной мощности ресурсов сделали жизнеспособными текстовые протоколы. Дни,
когда бинарные протоколы были единственной альтернативой для эффективных
распределенных систем, прошли. Текстовые протоколы взаимодействия начинались с
XML/SOAP web-сервисов и эволюционировали дальше в архитектурные стили RESTful и
другие протоколы, такие как Atom и XMPP.
Эти новые веяния предоставили гораздо более широкие возможности для гетерогенной
разработки, чем когда либо раньше, хотя бы потому, что в основе — обычный
форматированный текст, универсальный для обработки. Гетерогенное программирование
дает возможность выбрать подходящий инструмент для выполнения работы, и текстовые
протоколы взаимодействия распахнули этой возможности двери.
Шаг вперед уже произошел и заявил о себе взрывным ростом различных архитектурных
топологий современных программных решений. И это не просто отражение их
многообразия, а свидетельство новых возможностей.
И хотя временами выбор — не самая хорошая вещь, это точно наименее плохая
альтернатива в контексте современной архитектуры ПО. Индустрия стоит перед лицом
серьезных проблем (грядущая эра многоядерности и многопроцессорности обещает стать
самой большой проблемой ИТ сообщества), и нам понадобятся все возможные механизмы
взаимодействия, какие мы сможем задействовать, особенно еще и потому, что
59
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
существующие платформы плохо приспособлены для их решения (The Free Lunch is Over by
Herb Sutter, http://www.gotw.ca/publications/concurrency-ddj.htm).
60
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Однако есть еще и четвертый тип персонажей, на который Waterhouse ссылается, но явно не
упоминает. Это короли – провидцы, знающие, как управлять всеми остальными расами.
Хороший король успешно проведет всех персонажей через квест и при этом поможет им
работать вместе для достижения успеха. Без квеста команда очень быстро распадется. Без
наличия всех персонажей команда сможет решать только задачи определенного типа,
сдаваясь в ситуациях, выходящих за эти рамки.
Архитектор строит квест, учитывая все роли. Архитектура становится руководством для
поиска задач для каждого типа персонажей, одновременно позволяя им больше узнавать о
способностях друг друга. И когда проект столкнется с проблемой, команда уже будет знать,
что нужно делать, чтобы найти решение, потому что архитектура предоставила
возможность команде стать командой.
61
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
«Хороший архитектор — не тот, кто следует по пути разума, а тот, кто следует зову
сердца» - Франк Ллойд Райт.
«Архитекторы не только верят, что сидят рядом с Богом, но и думают, что если Бог
когда-нибудь встанет, они возьмут стул себе» - Карен Мойер.
62
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
63
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Как архитектор, вы задаете тон. В ваших руках вся власть над системой, и возможно,
именно вы спроектировали задающий направление срез системы, служащий примером для
команды – примером, который будет скопирован многократно. Когда разработчик копирует
что-нибудь, будь то несколько строк кода, XML-файл или класс, это явный индикатор того,
что что-то можно сделать проще или даже вынести отдельно. Чаще всего копируется не
логика предметной области, а код, обслуживающий инфраструктуру. В связи с этим очень
важно предвидеть эффект от ваших примеров. Как код, так и конфигурация из примера
будут основой для десятков, сотен или даже тысяч других частей этой системы или других
систем. Поэтому ваш код должен быть максимально прозрачным, ясным и не содержать
ничего повторяющегося и лишнего, кроме решаемой проблемы. Как архитектор ПО, вы
должны обладать высочайшей чувствительностью к любым повторяющимся шаблонам,
поскольку все, что вы напишете, будет повторяться :)
Но в вашей системе ничего этого нет, не так ли? Тогда посмотрите внимательней на
конфигурационный файл. Что изменится, а что останется, если его применить к другой
части системы? Посмотрите на прослойку бизнес-логики. Есть ли там шаблон,
повторяющийся от метода к методу, вроде обработки транзакций, логирования,
аутентификации или аудита? А если посмотреть в уровень доступа к данным? Не найдется
ли там кода, отличающегося лишь именами полей? Посмотрите шире. Не найдется ли
нескольких строк кода, часто стоящих рядом друг с другом и оставляющих ощущение
повторяемости, даже если они используются в различных местах и с разными объектами?
Все это примеры повторений. Разработчики привыкают «фильтровать» повторы при
просмотре кода, как только определят, в чем отличия, но даже в этом случае они все равно
снижают свою эффективность. Код, написанный так, написан для выполнения
компьютером, а не для чтения разработчиком.
Вы несете ответственность за удаление этих повторов. Чтобы сделать это, вам придется
поработать. Продумать более эффективные абстракции, установить аспектно-
ориентированный фреймворк, написать небольшие генераторы кода. Повторы никуда
самостоятельно не денутся, пока кто-то этим целенаправленно не займется.
64
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Инженеры любят точность, особенно это характерно для программистов, живущих в мире
нулей и единиц. Им приходится работать с бинарными выборами: ноль или один, true или
false, да или нет. Все ясно и согласованно, гарантируемо атомарными транзакциями,
ограничениями и контрольными суммами.
К сожалению, реальный мир не столь бинарный. Клиенты делают заказы лишь для того,
чтобы их отменить в следующий момент. Чеки не принимаются к оплате, письма теряются,
платежи задерживаются, а обещания не выполняются. Ошибки ввода данных случаются
слишком часто. Пользователи предпочитают простые интерфейсы, предоставляющие
доступ сразу ко многим функциям, без выстраивания последовательных процессов с
фиксированной очередностью выполнения операций, что кажется более логичным для
большинства разработчиков, а также более простым для реализации.
Что же с этим всем делать? Первый шаг к решению – это осведомленность о проблеме.
Попрощайтесь со старой предсказуемой моделью стека вызовов, при которой вы
определяете порядок выполнения. Вместо этого готовьтесь обрабатывать любые события в
любой момент времени. Обрабатывайте асинхронные запросы параллельно вместо
последовательного вызова обработчиков. Избегайте полного хаоса, используя событийно-
управляемую архитектуру или машины состояний. Обрабатывайте ошибки при помощи
компенсационных механизмов, повторов или предварительных операций.
65
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
66
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Потеря контроля – ужасная вещь, даже если речь идет об архитектуре ПО. Но если это
дополнить наблюдением, извлечением модели и проверкой на корректность, то в результате
получится способ проектирования 21-го века.
67
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
В древнем Риме Янус был богом начала и конца и изображался с двумя головами,
смотрящими в разные стороны. Наверняка вы где-нибудь видели этот символ. Янус
символизирует течение жизни от прошлого к будущему, от молодости к зрелости, являясь
привратником между прошлым и будущим.
Для каждого архитектора возможность Януса смотреть как в прошлое, так и в будущее –
очень желаемый навык. Архитектор старается соединить видение и реальность, прошлые
успехи и направления развития, ожидания заказчиков и руководства с ограничениями
разработки. Создание таких мостов – основная часть работы архитектора. Часто архитектор
может чувствовать себя пытающимся объять необъятное в процессе ведения проекта из-за
большого количества различных сил, действующих в рамках проекта. Например, конфликт
требований безопасности и простоты доступа, или удовлетворение сегодняшних бизнес-
процессов и видения будущего. Хороший архитектор должен, как и Янус, иметь две головы,
способных одновременно думать две мысли, чтобы быть способным создать проект,
максимально удовлетворяющий столь разным требованиям.
Обратите внимание, что у Януса две полноценные головы, а не два лица. Это дает ему еще
одну пару ушей и глаз, улучшая его информированность. Хороший ИТ-архитектор должен
быть замечательным слушателем и аналитиком. Понимание целей инвестиций критически
важно для определения видения руководства относительно будущего вашей организации.
Способность соотнести технические знания вашей команды с дизайном и используемыми
на проекте технологиями поможет в создании эффективного процесса обучения и
разработки и для успешного завершения проекта. Информация о доступных open source
решениях вместе с программными инструментами может сильно повлиять на сроки сдачи и
стоимость проекта. Хороший архитектор обязательно воспользуется возможностями этих
готовых «составных частей» в нужных местах жизненного цикла проекта.
68
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Именно такой тип мышления ожидается от архитектора. При кажущейся простоте это не так
просто. Как и Янус, архитектор должен быть привратником дверей между прошлым и
будущим, связывая прошлое и будущее, старое и новое, удовлетворяя требования
сегодняшнего дня и одновременно готовясь к ожиданиям дня завтрашнего.
69
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
C тех пор как Нельсон разбил флот Испании и Франции в Трафальгарском сражении,
«Разделяй и властвуй» стало девизом при решении сложных проблем. Более простая
формулировка, означающая почти то же самое – разделение интересов. Разделение
интересов дает нам инкапсуляцию, а инкапсуляция приводит к появлению границ и
интерфейсов.
После того как контексты выделены и нарисованы, время определить отношения между
ними. Эти отношения могут отображать организационные, функциональные или
технические зависимости. Результатом будет отображение контекстов – набор самих
контекстов и интерфейсов между ними.
70
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Эта практика хороша тем, что когда эти факторы перечислены, то это может помочь
выделить те предположения, которые были у архитектора, ответственного за разработку
ПО. И часто эти предположения основаны лишь на «исторических причинах», традициях
разработки, FUD-е или же даже на «Я где-то что-то об этом слышал»:
Важно сделать эти предположения видимыми ради потомков и для будущего анализа.
Однако еще более важно убедиться, что все предположения, не имеющие адекватного
эмпирического подтверждения, проверяются перед тем, как решение окончательно принято.
Что, если заказчик не будет возражать против пятисекундной загрузки страницы, если
добавить на нее прогресс-бар? Какой именно open-source проект ненадежен и как именно
ненадежен? Тестировали вы bitmap-индекс на ваших данных?
Факты и предположения – основа, на которой строится ваше ПО. Какими бы они ни были,
будьте уверены в том, что они согласованные.
71
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
72
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Вам приходится явно указывать причины для того, чтобы убедиться, что ваши
обоснования целостны (смотри статью «Проверяйте предположения»)
Результат может использоваться как стартовая точка для пересмотра решения, когда
условия, повлиявшие на предыдущее решение, поменяются.
73
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Говорить гораздо проще, чем делать, и архитекторы ПО печально известны как раз первым.
Чтобы ваши слова были не пустым сотрясением воздуха (что, однако, часто используется
для создания продуктов-фантомов), вам нужна довольная команда разработчиков. Роль
архитектора обычно заключается в установке ограничений, но архитектор может быть и
тем, кто разрешает. Для этого вам нужно давать все возможные полномочия вашим
разработчикам.
Убедитесь, что у разработчиков есть все необходимые инструменты. При этом инструменты
не должны навязываться, а должны тщательно выбираться так, чтобы обеспечивать все
необходимое для работы. Повторяющаяся бездумная работа должна автоматизироваться
везде, где только это возможно. Кроме этого, одно из лучших вложений – обеспечить
разработчиками высококлассными компьютерами, быстрой сетью и доступом к ПО, данным
и информации, требующейся для наилучшего выполнения работы.
Убедитесь также в том, что у разработчиков есть все необходимые знания. Если
потребуются тренинги, обеспечьте их. Вкладывайте в книги и поощряйте активные
дискуссии о технологиях. Рабочая жизнь программистов должна быть практичной, но при
этом и активно-академической тоже. Если у вас есть средства, отправляйте команду на
технические конференции и презентации. Если средств нет, используйте хотя бы
тематические рассылки и бесплатные мероприятия в вашем городе. Участвуйте в отборе
программистов. Ищите тех, кто хочет обучаться, кто старается основательно разбираться в
технологиях (при этом убедитесь, что они способны работать и в команде). Сложно ожидать
выдающихся результатов от посредственных исполнителей.
74
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Например, если вы захотите понять, как работает UNIX, то исследование исходного кода
строчка за строчкой вам вряд ли поможет. Однако если прочитать книгу, описывающую
основные внутренние структуры, использующиеся для манипулирования процессами и
файловой системой, то появится реальный шанс понять, как именно UNIX устроен изнутри.
Важных данных изначально гораздо меньше, чем кода, и данные гораздо менее запутаны.
Такой взгляд на систему – как на структуру лежащих в ее основе данных – может упростить
для понимания даже самую сложную систему. Упростить до минимума, необходимого для
понимания того, как систему построить и запустить.
75
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
С точки зрения дизайна, наиболее критическая задача для большинства систем – собрать
правильные данные в правильное время. После этого различные преобразования делаются
уже для того, чтобы сделать данные доступными, выполнить какую-либо функциональность
и сохранить результат. Большинство систем необязательно должны быть чрезвычайно
сложными, они лишь должны работать с все большими и большими объемами данных.
Функциональность – то, что мы видим вначале, но данные являются ядром практически
любой системы.
76
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Да, возможно, преувеличенно, хотя не так уж и сильно. Многие проекты проходят через
что-то подобное для успешной миграции базы данных. По какой-то причине миграция базы
данных должным образом не рассматривается во время планирования миграции всей
системы. И в результате миграция данных превращается в ненадежный ручной процесс.
Такая сложная работа создает множество возможностей для того, чтобы развалить процесс.
Еще хуже то, что ошибки миграции данных не всегда могут быть обнаружены юнит-
тестами и проявляют себя уже после выпуска релиза. Проблемы в базе данных приходится
исправлять вручную, а их решения – сложно проверяемые. Ценность полностью
автоматического процесса, способного вернуть базу данных в известное состояние
становится особенно очевидной, когда вам нужно восстановить систему после неудавшейся
миграции. Если вы не можете «убить» базу данных и восстановить ее в состояние,
совместимое с конкретной версией приложения, то у вас те же самые проблемы, как если
бы вы не могли вернуться назад после изменения в исходном коде.
Изменения базы данных не должно нарушать ваш процесс сборки. Вы должны быть в
состоянии собрать все приложение целиком, включая базу данных. Сделайте базу данных
неотъемлемой частью автоматизированной сборки и тестирования на начальном этапе
разработки, и добавьте кнопку «Вернуться назад». Это принесет вам серьезные дивиденты.
В лучшем случае это сохранит вам много часов болезненного решения проблем после сбоя
в ночной сборке. В худшем случае это позволит вашей команде уверенно двигаться вперед,
спокойно меняя при необходимости структуру базы данных.
77
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
В начале это срабатывает, люди начинают ощущать, что вещи движутся в правильном
направлении. Метафоры появляются, и с течением времени начинают жить собственной
жизнью. А всем кажется, что мы движемся вперед.
На самом деле в этот момент метафоры становятся опасными. Вот как это может
повернуться против архитектора.
Команда разработки начинает думать, что метафора более важна, чем реальная
бизнес-задача. Вы начинаете отстаивать странные решения из-за привязанности к
метафоре.
Пример: Мы говорим, что это будет как книжный шкаф, поэтому мы должны
показывать пользователю содержимое в алфавитном порядке. Я знаю, что этот
книжный шкаф будет шестимерным с бесконечной шириной и встроенными часами,
но остальные представят себе то, что было названо – книжный шкаф.
Пример: Почему объект Billing Factory создает канал для системы гребных шлюпок?
Действительно ли он должен возвращать отображение граната для автовокзала?
Говорите, вы тут недавно работаете?
78
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
79
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Чтобы быть уверенным в том, что ваше приложение ожидает успех после того, как оно
выйдет из разработки, вам следует:
Проектируйте так, чтобы кривая обучения для работников техподдержки была минимально
возможной. Возможность отслеживания событий, аудит и наличие логов – обязательны!
Когда техподдержка счастлива, то и все остальные тоже счастливы (особенно ваше
руководство).
80
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Известный пример такого ограничения – гипотеза Брюера (Brewer), также известная как
Целостность, Доступность и Устойчивость (Consistency, Availability, and Partitioning, или
CAP). Эта гипотеза утверждает, что для распределенной системы невозможно достичь
выполнения всех трех требований. Попытка это сделать лишь приведет к значительному
расходу ресурсов и резкому росту сложности, при этом все три цели, конечно же,
достигнуты так и не будут. Если ваши данные должны быть распределенными и
доступными, то обеспечить их целостность окажется слишком дорого. Если же система
должна быть распределенной и целостной, то в результате появятся проблемы
производительности и задержки, переходящие в недоступность данных в те моменты, когда
система будет занята обеспечением целостности.
Очень часто некоторые свойства декларируются как такие, нарушить которые нельзя
никогда:
81
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
реализовать архитектуру;
адаптировать архитектуру для соответствующей предметной области;
реализовать архитектуру заново с использованием появившихся новых технологий;
выйти за рамки детализированного описания.
82
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Как только скелет зашагает, нужно будет начать его тренировать. Наращивайте его
мышечную массу. Это значит — реализуйте инкрементально, добавляя завершенные
функциональности. Цель — все время поддерживать систему работающей.
Внести изменение в архитектуру тем сложнее и дороже, чем дольше система существует и
чем больше она сама. Поэтому мы и хотим найти ошибки как можно ранее. И данный
подход обеспечивает нам короткий цикл обратной связи, при помощи которого мы можем
быстро адаптироваться с целью удовлетворения бизнес-требований, порой проясняющихся
лишь в ходе работы. Предположения по поводу архитектуры проверяются на ранней
стадии. Архитектура получается легко изменяемой, поскольку проблемы выявляются на
ранних стадиях, до того, как были сделаны серьезные вложения в реализацию.
И чем больше система, тем более важна эта стратегия. В маленьком приложении один
разработчик может сделать все сам от начала и до конца, что становится невозможным для
больших систем. Обычная практика — это несколько разработчиков в команде или даже
несколько распределенных команд вовлекаются в разработку. Как следствие — требуется
гораздо больше координации. К тому же, разные программисты работают с разной
скоростью. Кто-то может сделать много и быстро, а кто-то другой потратит больше
времени, а сделает меньше. Наиболее критические и затратные по времени части должны
быть сделаны на ранних стадиях проекта.
83
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
На индивидуальном уровне мы пытаемся расти, чтобы понимать, как создавать все большие
и большие системы. На нашем пути будут возникать все более сложные задачи, решать
которые нам будет помогать наш прошлый опыт. Но чтобы получить максимум от нашего
прошлого опыта, нам часто необходимо его систематизировать. И лучший и самый простой
способ – постараться объяснить кому-нибудь еще.
Кроме этого, есть еще момент, что умозаключения, сделанные на основе нашего
специфического опыта, могут не быть всегда корректными. Мы можем не быть столь
успешными, как мы думаем, или же столь умными, какими хотели бы быть. Конечно же,
проверять свои знания в реальном мире страшно, особенно когда вы обнаруживаете, что
ваш ценный опыт – на самом деле ошибка. Ошибаться трудно.
В конце концов, мы люди, которые ошибаются. Не все наши мысли верны. Только когда мы
принимаем наши недостатки, мы открываем себя для возможности для совершенствования.
Старое изречение про «учиться на ошибках» все еще верно. Если наши идеи и убеждения не
проходят тест на истинность, то лучше узнать об этом сейчас, чем продолжать
руководствоваться ими дальше.
84
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Это не означает, что мы не должны реализовывать элегантные решения. Это означает лишь
то, что если мы проектируем виджет для продажи одной товарной позиции, то закладывать
в него поддержку иерархической группы динамически меняющихся товаров будет плохой
идеей. Перерасход ресурсов вам может показаться незначительным, но шансы весьма
высоки, что он окажется значительно выше ожидаемого. Усложнение на архитектурном
уровне может вызвать большинство проблем, появляющихся от усложнения на уровне
реализации, с той лишь разницей, что эффект оказывается в разы больше. Неоптимальные
решения на архитектурном уровне сложнее реализовывать и сопровождать. Перед тем, как
двигаться дальше с архитектурными решениями, превосходящими требования, задайте себе
вопрос, насколько сложно будет удалить все лишнее после того, как разработка будет
закончена. Затраты не заканчиваются с завершением разработки, решение нужно будет
поддерживать и далее. Потратив больше ресурсов, чем нужно, на решение простой задачи,
вы можете столкнуться с их нехваткой, когда нужно будет решать по-настоящему сложные
задачи. И внезапно оказывается, что своим решением вы добавили в проект ненужный риск.
Вы могли бы потратить время гораздо эффективнее, если бы этого не было.
85
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Так что же делать, если нужно начать использовать новый паттерн, фреймворк или
платформу? Не забывайте, что «прежде всего, архитектор – это программист».
86
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
87
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Ясность – должно быть просто понять, что делает определенный компонент или
класс.
Тестируемость – легко ли протестировать вашу систему?
Корректность – работает ли все именно так, как было спроектировано? Избегайте
быстрых и «грязных» исправлений в системе.
Возможность отладки – сможет ли специалист из техподдержки, который никогда
не видел вашего кода, в производственных условиях найти проблему и решить ее?
Или же ему понадобится для этого два месяца?
Старайтесь думать о том, что другой команде придется взять ваш код и разобраться с тем,
как он работает. Эта мысль – одна из главных на пути к качественной архитектуре. Это не
значит, что архитектура должна быть примитивной или задокументированной «по самое не
хочу», хорошая архитектура будет самодокументируемой, причем сразу несколькими
способами. Поведение системы в производстве также может пролить свет на то, как она
была спроектирована. Например, беспорядочная архитектура с отвратительными
взаимосвязями практически всегда будет себя вести точно так же. Подумайте о тех
программистах, кому придется искать и исправлять ошибки.
88
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Вероятно, вы уже слышали это раньше. Если вы опытный архитектор, то вы уже знаете, что
это действительно так: если вы знаете только одно решение задачи, то у вас проблемы.
Проектирование ПО – это всегда выбор лучшего решения задачи с учетом имеющихся
ограничений. И очень сложно удовлетворить сразу и все требования, и все ограничения с
первым же пришедшим в голову решением. В общем случае необходимо найти компромисс
между выбором решения, наилучшим образом удовлетворяющее наиболее критичным
требованиям. И если у вас есть только одно решение, то это значит, что у вас не будет
пространства для маневра. Очень может быть, что ваше единственное решение не подойдет
заказчикам. Также если в процессе из-за изменения бизнес-окружения поменяются
приоритеты, у вас не будет возможности к ним приспособиться.
Очень редко такая ситуация возникает из-за реального отсутствия альтернатив. Скорее
всего, причина – в недостаточном опыте архитектора в данной предметной области. Если
это ваш случай, то найдите в себе силы обратиться к кому-нибудь более опытному за
советом. Хуже, если архитектура разрабатывается по привычке. Архитектор может быть
специалистом в проектировании определенного типа (например, трехуровневая клиент-
серверная архитектура), но не иметь достаточно опыта, чтобы определить, когда этот тип
применять нельзя. Если вы обнаружили, что вы сразу знаете решение, без какого-либо
анализа других возможностей, то остановитесь, вернитесь на шаг назад и поищите другие
возможные варианты. Если не сможете, то возможно, вам нужна помощь.
89
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
90
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
91
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Нечеткие требования тоже вносят свою долю, поскольку они могут меняться или же быть
неправильно истолкованы. По мере эволюции архитектуры требования к хардверу также
могут меняться. К тому же клиенты часто не осознают или не могут предсказать количество
пользователей или динамику использования системы. И наконец, «железо» тоже постоянно
меняется. То, что мы знали о нем ранее, сейчас уже не применимо.
Проектирование аппаратной части не менее важно, чем дизайн ПО, и ему должно уделяться
адекватное время независимо от того, есть у вас в команде проектировщик инфраструктуры
или нет. Точно так же, как архитектор отвечает за соответствие бизнес-требований и
программного решения, он должен представлять соответствие между «железом» и ПО.
92
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
93
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Мой совет: не поддавайтесь желанию сделать ваш дизайн или реализацию превосходной.
Поставьте цель «достаточно хорошо» и остановитесь, как только ее достигнете.
Много аксиом в этой серии статей обращают внимание проектировщиков на то, что нужно
избегать ненужных абстракций или усложнений. Почему для нас так сложно делать вещи
простыми? Потому что мы хотим найти идеальное решение! Зачем еще архитектору
добавлять сложности в рабочее решение, кроме как из-за понимания неидеальности
простого дизайна? Помните, что разработка ПО — это не конкурс красоты, поэтому
перестаньте выискивать незначительные неидеальности и гнаться за идеалом.
94
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Хорошие идеи убивают проекты. Иногда быстро, но чаще медленно и мучительно, при
помощи задержек по срокам и нарастающего количества ошибок.
Вы понимаете, про какие идеи я говорю: про заманчивые, легкие, безобидные на вид.
Обычно они приходят кому-нибудь в голову в середине проекта, когда все идет как по
маслу. Задачи формулируются легко и быстро, начальное тестирование проходит
замечательно и вроде бы никакой угрозы для даты выпуска не предвидится. Жизнь
прекрасна.
Коварство «замечательных идей» в том, что они «замечательные». Кто угодно легко скажет
«нет» в случае плохой идеи, хорошие же могут проскользнуть, приведя к усложнению и
бесполезной трате ресурсов на добавление чего-то, что не требуется для решения
поставленных задач.
95
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Контент — это главное. Во все более взаимосвязанном мире именно качество контента
становится тем, что отделяет успех от провала. Facebook и Orkut, Google и Cuil, NetFlix и
BlockbusterOnline (увы, не подобрал аналогий из рунета), и этот список побед в поединке
контентов можно продолжать и продолжать. Кто-то может возразить, что контент не имеет
никакого отношения к задачам архитектора, но я думаю, что следующее десятилетие
покажет, что это не так.
Часть процесса проектирования новой системы должна быть посвящена оценке имеющегося
контента. Одного проектирования эффективных моделей (предметной области, данных или
объектов) недостаточно.
Не допускайте здесь ошибок, успех системы зависит от контента. Потратьте часть времени
при проектировании на оценку вашего контента. Если ваша оценка будет далека от
удовлетворительной, то это важный сигнал, и об этом должны быть оповещены
заинтересованные стороны. Я видел много систем, удовлетворяющих всем требованиям, но
при этом все равно провальных, потому что аспект контента в них был проигнорирован.
Качественный контент создает успешные системы.
96
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Рано или поздно в нашей карьере архитектора наступает момент, когда мы понимаем, что
большинство проблем, с которыми мы сталкиваемся, повторяются. Несмотря на то, что
индустрия меняется, многие проблемы остаются такими же. В этот момент мы можем
положиться на свой опыт, быстро находя решение большинства проблем, оставляя больше
времени для работы над реально сложными задачами. Мы уверены в своих решениях и
выполняем работу качественно и в срок. Мы достигли равновесия. И в этом состоянии мы
легко можем совершить колоссальную ошибку, например, решить, что уже знаем столько,
что можем позволить себе больше говорить, чем слушать. Такое решение обычно приходит
вместе с цинизмом, нетерпением и недовольством к тем, кто осмеливается противоречить
нашему совершенному пониманию всех вещей.
В худшей своей форме такая самоуверенность может проникнуть в область бизнеса. Этот
путь может быстро привести к окончанию вашей карьеры. Бизнес обеспечивает наше
существование. Возможно, вам не очень приятно это осознавать, но это так. Мы
обслуживаем бизнес, а не наоборот. Слушать и понимать бизнес, нанявший нас для решения
своих проблем — наиболее критическая для нас способность. Вы когда-нибудь ловили себя
на том, что ожидаете, пока бизнес-аналитик закончит говорить, чтобы рассказать о своей
точке зрения? Значит, скорее всего, вы не прислушались к его предложениям. Уважайте
экспертов предметной области бизнеса, для вас не будет ничего хорошего, если они сочтут
вас неподходящим. Если вы им не понравитесь, то вы станете причиной проблем в
коммуникации и, как следствие, проблем в проекте. Помните: когда говорите вы, вы не
услышите ничего нового. Даже не начинайте думать о том, что вы настолько умны, что
никто другой не сможет вам рассказать что-то новое и полезное для вас.
Когда мы слушаем, мы часто не соглашаемся с тем, что слышим про то, как работает
бизнес. Это нормально. Мы можем предлагать варианты улучшений и даже должны это
делать. Однако если в конце дня вы все еще не согласны с тем, как работает бизнес, и не
собираетесь менять свою позицию, то это уже плохо. Не позволяйте себе стать
рассерженным гением, тратящим все свое время в попытках впечатлить других, выдвигая
остроумные и снисходительные предположения о том, насколько неэффективно работает
компания. Это их не впечатлит. Они уже такое видели. Ключевое свойство хорошего
архитектора — увлеченность работой, но увлеченность не должна становиться агрессией.
Научитесь принимать расхождения во мнениях и двигаться дальше. Если же расхождения
слишком велики для вас, найдите другую компанию, с которой вам будет проще
договориться, и работайте на них. Неважно как, но найдите способ установить хорошие
отношения с бизнесом и не позволяйте вашему эго их разрушить. Это сделает вас более
счастливым и продуктивным.
97
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
А теперь возьмите это решение и поизменяйте параметры, чтобы посмотреть, что в нем
сломается.
Такое исследование выявит лимиты дизайна, которые могут проявиться, например, если
система станет очень популярной, или же обрабатываемые продукты потребуют увеличения
количества транзакций в день, или же нужно будет сохранять данные за шесть месяцев
вместо недели изначально. Параметры меняются сначала индивидуально, потом в
комбинациях, чтобы обнаружить скрытые ограничения, не замеченные в изначальном
дизайне.
98
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
99
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
К сожалению, поскольку они сами не знали точно, какие именно прикольные штучки
должен делать этот фреймворк, они не знали, как его назвать. И они устроили небольшое
соревнование, чтобы придумать имя. И вот это и есть та точка, показывающая наличие
проблемы: если вы не знаете, как это назвать, то вы на самом деле не знаете, что это. А если
вы не знаете, что это, то вы не сможете это закодировать.
В данном конкретном случае история в системе контроля версий показывает всю глубину
проблемы. Конечно же, там было множество пустых «реализаций» интерфейсов. И
особенно смешным было то, что они меняли имена три раза без реального кода. В самом
начале они назвали это ClientAPI («client» означало бизнес-заказчика, а не клиента из связки
«клиент-сервер»), финальным именем стало ClientBusinessObjects. Отличное имя:
неопределенное, общее и вводящее в заблуждение.
В конце концов, имя — это лишь указатель. Как только каждый вовлеченный поймет, что
имя — это просто имя, а не метафора проектирования, вы можете двигаться дальше.
Однако, если вы не можете договориться об имени, достаточно специфическом, чтобы было
понятно, что именно оно значит, то похоже, у вас проблемы еще на старте. Проектирование
— это попытка выполнить цели (например, быстро, дешево, гибко) и договориться об
именах.
Если вы не можете это назвать, вы не сможете это и написать. Если вы меняете имя три
раза, то вам нужно остановиться до тех пор, пока вы не поймете, что же вы пытаетесь
построить.
100
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
внутренне цельными, т.е. все внутренние задачи, данные и функции связаны друг с
другом;
хорошо отделенными от других кусков: пересечения между ними должны
отсутствовать полностью или практически полностью.
Человек, преуспевший делать именно так, часто даже не осознает, что он выполняет эту
работу по разбиению по таким критериям, примерно как человек, обладающий хорошей
ориентацией в пространстве, просто знает, где он сейчас находится. Для них просто
естественно разбить задачи, данные и функции так, чтобы образовать удобные границы или
интерфейсы (я имею в виду не интерфейсы в ООП, а границы системы).
Например, у реляционных баз данных такая граница видна очень хорошо. Они могут
работать с любыми типами данных, которые могут быть преобразованы в
последовательность байт, и могут хранить, искать и извлекать такие данные. Все просто.
Что еще интересно, если задача стабильна, то ее решение также будет стабильным. Лет
через пять (или пятьдесят) вы можете захотеть добавить к решению веб-интерфейс (или
телепатический интерфейс), но ядро системы при этом не изменится. Система долговечна,
поскольку задача долговечна.
Естественно, для этого код должен быть изящным. Но если сама задача изящна, то написать
для ее решения изящный код – не проблема. Изящный код – это хорошо, потому что его
легко тестировать, легко просматривать, что в итоге обеспечивает высокое качество
реализации. А когда у вас не будет спагетти-кода, вы можете сконцентрироваться на вещах,
выходящих за рамки того, что видит пользователь, как например, надежная система
сообщений, распределенные транзакции или же повышение производительности при
помощи многопоточности, а может даже и низкоурвневые вставки на ассемблере.
Поскольку задача не меняется, вы можете сконцентрироваться на обеспечении требуемого
качества.
101
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
102
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Атул Гаванд (Atul Gawande) в своей замечательной книге «Лучшее: заметки хирурга об
эффективности» (Better: A Surgeon's Notes on Performance) говорит об усердии в медицине:
«Настоящий успех в медицине — нелегкое дело. Он требует силы воли, внимания к деталям
и креативности. Однако в Индии я понял, что он возможен где угодно для кого угодно. Я
знаю очень мало мест, где условия еще тяжелее, однако поразительный успех встречается и
там. Лучшее — возможно. Для этого не надо быть гением. Для этого нужно усердие,
высокая мораль, находчивость. И главное — готовность попробовать».
103
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
104
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Вместо того, чтобы сразу браться решать задачу в том виде, как вы ее получили,
посмотрите, не сможете ли вы ее изменить. Спросите себя, как будет выглядеть
архитектура, если бы этой задачи не было вообще? Это может привести к гораздо более
элегантному решению. Проблемы бизнес-уровня также не следует решать моментально.
Нам нужно разрушить нашу зависимость от задач. Нам нравится получать задачи. В
следующий раз, столкнувшись с задачей, перед тем, как браться ее решать, подумайте о
том, что будет, если бы вам не пришлось ее решать вообще.
105
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Это не означает, что, однажды попав в список ваших фаворитов, технология останется там
навсегда, и тем более не означает, что вы должны игнорировать новые достижения в
разработке ПО. Любая технология рано или поздно требует замены. Прогресс движется
быстро, и появляются новые отличные решения. Как архитекторы, мы не должны отставать
от тенденций в индустрии, нам всего лишь не надо идти в первых рядах испытателей.
Обычно от того, что вы сталкиваетесь с технологией одним из первых, вы получаете не так
много бонусов, получая одновременно достаточно проблем.
Еще одна важная вещь — расходы на внедрение новой технологии. Эти расходы могут быть
высокими и сложно поддающимися оценке. Когда вы работаете с обкатанной технологией,
вы уже знаете все ее «подводные камни». Наивным было бы думать, что таких сюрпризов
не будет в новой технологии. Необходимость решать неизвестные для вас проблемы
однозначно нарушит ваши оценки. Работая с хорошо изученной технологией, вы можете
гораздо точнее прогнозировать расходы.
106
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
107
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Когда вы в следующий раз будете обсуждать требования к проекту, представьте, что ваш
заказчик – это не ваш клиент. Это не так сложно сделать, поскольку это действительно так и
есть.
Ваш заказчик – это не ваш клиент. Клиенты вашего заказчика – ваши клиенты. Если будут
довольны клиенты вашего заказчика, то и он будет доволен. А значит, и вы тоже.
Например, если вы пишите электронный магазин, помните о том, что будет нужно тем
людям, которые будут делать покупки в этом магазине. Им понадобится безопасное
соединение. Им понадобится шифрование хранимых данных. Ваш заказчик может не
указать этого в требованиях. Если вы видите, что ваш заказчик не замечает вещей, которые
будут необходимы его клиентам, обратите его внимание на них и объясните почему.
Если же ваш заказчик, будучи осведомленным, все равно осознанно игнорирует важные для
его клиентов вещи (а такое время от времени случается), то вам стоит задуматься о поиске
для себя другого проекта. Если ваш заказчик не хочет платить за SSL и хочет хранить
номера кредитных карт в незашифрованном виде, потому что это проще и дешевле
реализовать, вам не стоит на это соглашаться. Согласившись, вы тем самым «убьете»
клиентов вашего заказчика.
Конечно же, такая линия поведения – далеко не самая простая. Помните, что вы заботитесь
о клиентах вашего заказчика! Помните, что хотя и ваш заказчик платит вам, вы должны
следовать наилучшим практикам и стараться сделать то, что заказчику действительно
нужно, а не то, что он вам говорит, что ему нужно. Конечно же, для этого потребуется
много обсуждений и полное понимание того, что именно вы делаете и почему.
108
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Так не будет никогда. Очень легко поддаться соблазну потратить больше времени на
проектирование, чтобы быть уверенным, что реализация будет соответствовать дизайну.
Подробный дизайн может вселить в вас уверенность, что вы предусмотрели все. И чем
больше деталей, чем глубже они рассмотрены, тем больше вы будете уверены в этом. Но
это лишь иллюзия. Так не будет никогда.
И вот эти незначительные изменения в дизайне начнут накапливаться, и очень скоро много
мелких изменений потребуют одного большого. И вот уже от вашей оригинальной
концепции остались одни осколки, и все надо начинать заново. Вы можете подумать, что
нужно продумать все еще более тщательно, и ваше следующее архитектурное видение
будет еще более ясным, отточенным и безупречным. Но потом все повторится опять, новые
изменения накопятся и станут разрушать ваш дизайн снова, и разработчикам придется
прикладывать все больше и больше усилий, чтобы как-то постараться сложить
распадающиеся куски воедино, но это будет получаться все хуже и хуже, и в конце вы
воскликнете «Конечно, оно не работает, ведь проектировалось совсем другое!»
109
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Лучше всего будет, если каждый фреймворк или библиотека будут относиться к
единственной логической области и не будут затрагивать область других фреймворков,
которые вы будете использовать вместе.
110
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
111
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
86. Паттернопатология
(В оригинале - Pattern Pathology)
Множество проектов страдают от этого. Есть проекты, в которых можно себе представить,
как архитектор открывает оглавление книги о паттернах, потирает руки и говорит «Так, и с
какого паттерна начнем?» Это чем-то похоже на то, как разработчик начинает писать класс,
думая «Так, какой же класс я сейчас буду расширять?» Паттерны проектирования —
замечательный инструмент для уменьшения необходимой сложности, но, как и любой
другой инструмент, их можно использовать неправильно. Они превращаются в проблему,
когда на них смотрят как на молоток, которым можно забить любой гвоздь. Будьте
осторожны, чтобы ваше положительное впечатление от паттернов не стало одержимостью,
в результате которой ваше решение станет гораздо более сложным, чем должно было бы
быть.
112
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Чтобы стать успешным архитектором ПО, вам придется научиться понимать тех, кто не
говорит на вашем языке. Я не имею под этим в виду изучение Эсперанто или клингонского
языка. Вместо этого вам необходимо освоить хотя бы на базовом уровне язык бизнеса и
тестирования. А если вы еще и не владеете языком программистов, то его нужно выучить в
первую очередь.
Если вам не кажется это важным, представьте следующий сценарий. Бизнес-заказчик хочет
внести изменение в существующую систему, для чего собирает митинг с архитектором и
программистами, чтобы это обсудить. К сожалению, никто из технарей не владеет языком
бизнеса, а представитель заказчика не понимает языка программистов. И митинг, скорее
всего, пройдет как-то так.
113
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Я не утверждаю, что понимание других языков поможет решить все ваши проблемы, но оно
способно помочь предотвратить недопонимание и недоверие, приводящие к проблемам в
будущем.
114
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Ум, казалось бы, должен быть в этом же ряду. Однако, у того, что мы понимаем под словом
«ум» (или «смекалка»), есть и еще одна сторона. Имеется в виду способность быстро
находить решения, работающие, но при этом опирающиеся на ухищрение, обман или
неожиданную подмену. Все мы помним умных спорщиков в институте, которые
практически всегда выигрывали спор благодаря игре слов или незаметному логическому
обману.
Именно наша смекалка позволяет нам применять «трики» и «хаки», чтобы заставить ПО
работать. Не делайте этого! Вы не Руб Голдберг1. И не агент Макгайвер2, всегда готовый
сделать сложное устройство, имея в руках лишь скрепку, петарду и жвачку. Постарайтесь
выбросить из головы подобные способности. Конечно же, иногда вам понадобится именно
это. Но — гораздо реже, чем вы можете подумать.
1
http://ru.wikipedia.org/wiki/Голдберг,_Руб
2
http://ru.wikipedia.org/wiki/Секретный_агент_Макгайвер
115
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Мартин Хайдеггер, немецкий философ 20-го столетия, исследовал то, как люди обращаются
с инструментами в своей повседневной жизни. Люди используют инструменты для
достижения своих целей, и инструмент – часто единственная возможность эту цель
достигнуть. Он ввел термин zuhanden (готовый к использованию, незаметный),
относящийся к инструментам, которые успешно используется. В этом случае назначение
инструмента понятно само по себе, без длительного изучения теории. Мы просто берем
инструмент и делаем то, что нам нужно. Инструмент становится продолжением нашего
тела, становится незаметным. Представьте себе забивание гвоздя молотком или писание
шариковой ручкой. Обратите внимание на то, как легко инструмент становится
продолжением вашей руки. В противоположность этому он также ввел термин vorhanden
(присутствующий в руках), для инструментов, использование которых вызывает сложности.
Инструмент ничем не показывает своего предназначения. Его необходимо изучить, прежде
чем вам удастся использовать этот инструмент для своих целей.
116
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Большинство людей наверняка согласятся, что, для того, чтобы найти топ-разработчиков,
необходимо всестороннее техническое собеседование. Но что же означает «всестороннее»?
Задавания кандидатам сложных вопросов о нетривиальных технических подробностях явно
недостаточно, хотя оно и должно быть частью процесса. Превращение собеседования в
сертификационный тест не будет гарантировать успеха. Вы ведь ищете разработчиков,
любящих и умеющих решать задачи. Используемые вами инструменты наверняка изменятся
со временем, поэтому вам нужны люди, способные решать задачи независимо от
используемых технологий. Способность запомнить все методы API ничего вам не скажут о
способности и желании кандидата решать проблемы.
117
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Осознание того, что продукты, которые мы создаем, являются гибкими, и что требования
часто меняются, ставит нас в радикально другое положение по сравнению с теми, кто
строит неизменяющиеся объекты. В физическом мире принцип «сначала запланируй, потом
сделай запланированное» работает довольно неплохо. В индустрии ПО этот принцип
трансформируется во что-то вроде «сначала запланируй, потом меняй план».
Это различие не всегда приносит проблемы, иногда оно может быть выигрышным.
Например, вам необязательно реализовывать компоненты ПО в каком-то заданном порядке,
поэтому вы можете в первую очередь взяться за наиболее проблемные части. Это – полная
противоположность строительству в физическом мире, где множество ограничений жестко
задают порядок работ.
118
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Практически всегда бизнес-заказчики будут хотеть, чтобы изменение было сделано как
можно быстрее, тогда как разработчики и тестеры более заинтересованы потратить больше
времени для адекватного проектирования, реализации и тестирования изменения перед тем,
как запускать его «в поле».
В качестве архитектора вы должны решить, что из этого более оправдано, и убедить тех, кто
принимает решение, согласиться с вами. И как часто это бывает с архитектурными
решениями, возможно, потребуется компромисс. Если вы уверены, что система достаточно
стабильна, то возможно, будет оправдано сделать быстро и некрасиво. Это нормально.
Только вы должны осознавать, что если вы так сделали, то вы «повесили» на проект
«технический долг», который нужно будет вернуть позднее. Вернуть – означает переделать
изменение так, как вы считаете правильным, если бы не нужно было спешить.
Почему же «быстрое» решение сейчас – это компромисс? Потому что у такого решения есть
скрытые дополнительные расходы. В случае долга финансового такие расходы – это
проценты, которые приходится выплачивать (и они могут быть достаточно высоки,
спросите кого-нибудь, взявшего ипотечный кредит). В случае технического долга проценты
получают форму снижения стабильности системы и повышения расходов на техподдержку.
И, как и с долгом финансовым, проценты приходится платить до тех пор, пока весь долг не
будет «погашен».
119
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Если вы примете этот факт, что любой ваш выбор сегодня обязательно станет проблемой в
будущем, то это облегчит вам попытку построить устойчивую к будущему архитектуру.
Ведь если любой ваш выбор окажется неверным в будущем, то просто перестаньте об этом
думать и выбирайте то, что наилучшим образом подходит для вас сегодня.
120
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Люди не всегда рады получить новую систему или серьезное обновление. И это может
угрожать успешному завершению проекта.
Ваша цель как архитектора – знать про это, выявить возможные проблемы принятия
системы и работать над их снижением. Чтобы это сделать, вам нужно знать о причинах.
Наиболее частые причины этого:
121
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
122
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
123
97 Things Every Architect Should Know. Материалы по эффективной разработке: http://avl2.info
Самый главный критерий того, что проект потерпит неудачу – его размер. Решение начать с
проектирования большой системы практически не имеет плюсов. Хотя рано или поздно у
нас возникнет соблазн сделать именно так. Точно также, как и склонность к добавлению
случайной сложности, изначальное проектирование больших систем приводит к
разрастанию проектов, которые в результате с большей вероятностью потерпят неудачу или
же окажутся неподдающимися тестированию, нестабильными, наполненными ненужными и
неиспользуемыми функциями, и при этом неоправданно дорогими.
Как этого достичь? Лучший способ – сделать так, чтоб система могла расти и
адаптироваться, и сделать это как можно раньше. Это значит, что нужно начать с
небольшой работающей системы, с работающего подмножества планируемой архитектуры
– с простейшей системы, которая при этом уже может функционировать. Такая
зарождающаяся система будет обладать множеством полезных свойств и сможет научить
нас гораздо большему, чем сразу сделанная большая система или ее проект. Скорее всего,
вы будете вовлечены в ее реализацию. Из-за небольшого размера ее будет легче
протестировать и отследить связи. Для реализации будет достаточно меньшей команды, что
отразится на стоимости. Ее свойства будет легче отслеживать. Ее будет проще запустить.
Она покажет вам, что работает, а что нет, причем сделает это очень быстро. Она покажет
места, сложные для изменения, а также нестабильные места. И все это будет сразу же видно
заказчикам, что даст им возможность адекватно отреагировать на обнаруженные проблемы
в самом начале проекта.
Проектируйте систему настолько маленькой, насколько это возможно. После чего позвольте
ей развиваться согласно глобальному видению. Хотя это может выглядеть как потеря
контроля или даже ограничение вашей ответственности, ваши заказчики будут благодарны
вам за это. Не бойтесь применить эволюционный подход, отбрасывая требования или уже
реализованную функциональность.
124