Глава 1. Введение
еще был относительно прост для понимания. Клиент (-ы) делал (-и) запросы, а сервер (-ы) их обслуживал (-и). Рост Интернета и появление в начале 2000-х крупных центров обработки данных (ЦОД), состоящих из тысяч относительно недорогих массово производимых компьютеров, которые объ-единялись в сеть, привели к широкому распространению рас-пределенных систем . В отличие от клиент-серверных архитек-тур распределенные приложения состоят либо из нескольких разных приложений, либо из нескольких копий одного при-ложения, работающих на разных машинах. Взаимодействуя, они реализуют некоторый сервис, например веб-поисковик или систему розничных продаж.
В силу своего распределенного характера такие системы при грамотной их структуризации более надежны по определению. А при грамотно спроектированной архитектуре системы мас-штабируемой становится и ее команда разработчиков. К сожале-нию, за эти преимущества приходится платить. Распределенные системы существенно сложнее в проектировании, построении и отладке. При построении надежной распределенной системы к инженерно-техническим навыкам специалистов предъявляют-ся существенно более высокие требования, чем при построении локальных приложений. Так или иначе, потребность в надеж-ных распределенных системах продолжает расти. Следователь-но, возникает необходимость в соответствующих инструментах, паттернах и практиках их построения.
К счастью, современные технологии упрощают разработку рас-пределенных систем. В последние годы контейнеры, их образы и оркестраторы стали популярными в силу того, что являются неотъемлемыми составными частями надежных распределен-
ных систем. Взяв за основу контейнеры и оркестраторы кон-тейнеров, мы можем создать набор повторно используемых Глава 1. Введение 21
компонентов и паттернов проектирования. Такие паттерны и компоненты составляют инструментарий, необходимый для разработки более эффективных надежных систем. Краткая история паттернов проектирования в разработке ПО Чтобы лучше понять, как паттерны, практики и повторно ис-пользуемые компоненты изменили разработку систем, имеет смысл взглянуть на то, как подобные трансформации проис-ходили в прошлом.
Формализация алгоритмического программирования
Люди писали программы задолго до опубликования Дональдом Кнутом сборника «Искусство программирования»> 1 . Тем не ме-нее это событие стало важной вехой в развитии информатики. В частности, описанные в книгах Кнута алгоритмы не ориенти-рованы на какой-либо компьютер, а предназначены для обуче-ния читателя алгоритмическому мышлению. Эти алгоритмы могут быть адаптированы к конкретной компьютерной архи-тектуре или к конкретной задаче, решаемой читателем. Такая формализация была важна не только потому, что предоставляла разработчикам общий инструментарий для написания про-грамм, но и потому, что демонстрировала существование уни-версальных идей, которые можно применять в разнообразных контекстах. Понимание алгоритмов имеет ценность само по себе, безотносительно к какой-либо решаемой с их помощью задаче.