Эта статья опубликована в 3-м номере журнала RSDN Magazine за 2009 год.
Введение
Шаблоны проектирования уже длительное время занимают почетное место в арсенале многих разработчиков. Одни их используют в повседневной практике, другие пишут о них статьи или книги, третьи собирают вместе коллективный опыт и создают новые шаблоны. Шаблоны проникли в самые разные области разработки программного обеспечения, о них написаны тысячи статей и выпущены десятки книг. Но, несмотря на свою популярность и распространенность, далеко не все знают историю появления этого феномена, причины возникновения и тех героев, благодаря которым наша индустрия пополнилась столь полезным инструментом. В этой статье я хочу восполнить этот пробел и рассказать о той роли, которую сыграли труды архитектора и философа Кристофера Александера, как его идеи переняли представители компьютерного сообщества и описать путь, который проделали шаблоны, прежде чем они получили признание и стали достоянием широкой общественности.
История зарождения
Труды архитектора и философа Кристофера Александера (Christopher Alexander), такие как “The Pattern Language” (1977), “The Timeless Way of Building” (1979), “Notes On The Synthesis Of Form” (1964) упоминаются в компьютерной литературе не реже, чем труды Дейкстры, Хоара или Кнута. Практически в каждой книге о шаблонах проектирования говорится о серьезном влиянии трудов Александера на область разработки программного обеспечения и в частности на идею создания шаблонов проектирования. Однако шаблоны проектирования – это не единственная область, на которую оказали влияние труды этого замечательного человека. Еще в 1979 году в своей книге “Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design” Эд Йордон (Ed Yourdon) и Ларри Константайн (Larry L. Constantine),одни из первых определили фундаментальные понятия модульности ПО, такие как сцепление (cohesion) и связность (coupling), основываясь на понятиях, приведенных в книге Алексендера “Notes On The Synthesis Of Form”.
По мнению Александера основной задачей при декомпозиции системы является осуществление следующих двух условий:
- максимизация связей внутри компонентов (высокое сцепление, high cohesion) и
- минимизация связей между компонентами (низкая связанность, low coupling).
Сегодня эти проблемы широко известны в программной индустрии и описаны в любой книге по проектированию и построению программных систем, но, если верить Александеру, они присущи проектированию любых сложных систем.
Следующим упоминанием трудов Александера, на этот раз книг “The Timeless Way of Building” и “The Pattern Language” стали Том ДеМарко (Tom DeMarco) и Тим Листер (Tim Lister) в своей знаменитой книге “Peopleware: Productive Projects and Teams”, вышедшей в свет в 1987 году. Авторы считают, что окружение является существенным фактором, влияющим на продуктивность человека, занятого интеллектуальным трудом, и в попытке определить идеальное рабочее место ДеМарко и Листер обратили свои взоры на труды знаменитого архитектора. Анализируя удачные рабочие места различных организаций, авторы создали четыре шаблона, которые, по их мнению, существенно повышают комфорт сотрудника и позволяют выполнять свою работу максимально продуктивно.
Идея шаблонов проектирования в области разработки ПО появилась в умах сторонников объектно-ориентированного программирования во второй половине 80-х годов прошлого века. Как и многие другие хорошие идеи, идея повторного использования не только кода, но и архитектурных и проектных решений, пришла в голову одновременно разным экспертам в области разработки программного обеспечения.
Одним из таких экспертов был Кент Бек. Вот что он пишет:
«Впервые я услышал о шаблонах будучи студентом Университета Орегона. Многие студенты, с которыми я жил в общежитии на первом курсе, были из Школы Архитектуры. И поскольку я рисовал планы домов с шести или семи лет, они указали мне на труды Кристофера Александера. Я прочитал его книгу “The Timeless Way of Building” от корки до корки в течение семи месяцев.
Я работал на Tektronix в течение полутора лет, когда я снова столкнулся с трудами Александера. Я нашел потертую старую книгу “Notes on the Synthesis of Form”. Объяснение методологии Александера во вступлении ко второму изданию нашло отражение с моей точкой зрения, что снова меня привело к книге “The Timeless Way of Building”. Мне показалось, что все, что он не любит в архитекторах, я не люблю в разработчиках ПО. Я убедил Варда Каннингема, что мы нашли что-то важное».
В 1987 году Вард Каннингем (Ward Cunningham) и Кент Бек (Kent Beck) поделились своим первым опытом применения языка шаблонов на практике на конференции OOPSLA-87. В то время они оба работали над одним проектом и столкнулись со сложностью проектирования пользовательского интерфейса. Тогда они решили воспользоваться идеей языка шаблонов Кристофера Александера. Александер считал, что наиболее оптимальным является проектирования жилища теми, кто будет в них проживать, т.к. именно они наиболее точно осознают собственные потребности. Кент Бек и Вард Каннингем посчитали эту идею весьма заманчивой и разработали язык шаблонов для проектирования пользовательских интерфейсов пользователями.
«Мы предлагаем радикальное изменение проектирования и реализации, используя концепцию адаптированную из работы Кристофера Александера, архитектора и основателя Центра по изучению структуры окружающей среды (Center for Environmental Structure). Александер предлагает, чтобы дома и офисы проектировались и строились их жителями. Он считает, что эти люди лучше всего знают свои потребности в определенной структуре. Мы согласны с этим мнением и считаем, что тоже самое относится и к компьютерным программам. Пользователь сам должен писать свои программы. Идея выглядит глупой, если взглянуть на размер и сложность зданий и программ, а также множество лет обучения профессии проектировщика. Однако Александер предлагает убедительный сценарий, который основывается на концепции «языка шаблонов».
Язык шаблонов предоставляет проектировщику работающие решения всех известных проблем в области проектирования. Это последовательность кусочков знаний, которые изложены и организованы в таком виде, что позволяют проектировщику задавать правильные вопросы и получать ответы в нужные моменты времени. Александер организовывал эти кусочки знаний в письменные шаблоны, в определенной однотипной структуре. Каждый шаблон имел выражение, описывающее проблему, условия, которые привели к этой проблеме и, самое главное, решение, которое работает в этих условиях. Язык шаблонов содержит шаблоны целого строения, например, жилого здания, или интерактивной компьютерной программы. В языке шаблонов, шаблоны связаны с другими шаблонами и решения применяются на основании этой взаимосвязи. Письменные шаблоны включают эти взаимосвязи в качестве пролога и эпилога».
Несмотря на успех применения языка шаблонов на практике, Кент Бек и Вард Каннингем были первыми и последними, кто попытался разработать и применить полноценный язык шаблонах, в таком виде, в котором он представлен в труде Кристофера Александера.
В это же время, начиная с 1988 года Эриx Гамма (Erich Gamma), Андре Веинанд (Andre Weinand) и Рудольф Марти (Rudolf Marty) начали работу над объектно-ориентированной библиотекой на С++ под названием “ET++”. В этом же году на конференции OOPSLA’88 они выступают с докладом об этой библиотеке. Эрих также задумался о важности повторного использования проектных решений (или шаблонов) своей библиотеки. В 1991 году Эриху приходит идея написании диссертации на тему шаблонов проектирования и он начинает сотрудничать с другими членами «Банды четырех» для дополнительного изучения этой темы. Именно в 1991 году перед конференцией European Conference of Object-Oriented Programming (ECOOP) Ерих Гамма и Ричард Хелм собрались вместе для создания первого каталога шаблонов проектирования, которые, в конечном счете, стали основой знаменитой книгой “Design Patterns”. Они определили множество шаблонов, включая следующие:
- Composite
- Decider
- Observer
- Constrainer
Многие из этих шаблонов попали в книгу “Design Patterns”, в то время, как многие другие так и остались неизвестными.
В конце 1988 года Джеймс Коплиен (James Coplien) начал каталогизировать специфичные для С++ низкоуровневые шаблоны, которые он называл идиомами. Ранние черновики этой работы использовались для обучения объектно-ориентированному программированию и С++ в AT&T с начала 1989 года. В 1991 года вышла книга Джеймса Комплиена “Advanced C++ Programming Styles and Idioms”, которую можно считать первой книгой по С++ для продолжающих программистов и первой книгой по шаблонам проектирования.
Питер Код (Peter Coad) также параллельно исследовал вопрос шаблонов проектирования, в результате чего на свет появилась статья в Communications of the ACM в 1992 году.
К этому времени (начало 1990-х годов) интерес к шаблонам проектирования вырос достаточно, чтобы ключевые специалисты в этом вопросе взялись за объединение опыта каждого из них. В 1993 году проводится множество конференций и семинаров, на которых основное внимание уделяется шаблонам проектирования. Поворотным событием в истории шаблонов проектирования становится знаменитая книга Банды четырех, которая впервые была представлена на конференции OOPSLA’94, где было продано 750 копий этой книги, что более чем в семь раз превосходит количество любых технических книг, когда-либо проданных на этой конференции.
История успеха
Книга Design Patterns является одной из самых популярных технических книг за всю историю, о ней вот уже пятнадцать лет пишут статьи, ссылаются в других книгах, обсуждают, критикуют, хвалят. По некоторым сведениям эта книга является самой продаваемой компьютерной книгой за всю историю (на начало 2009 года продано более 350 000 экземпляров и ежемесячно продается более 1000).
После выхода книги банды четырех тема шаблонов проектирования стала доступна не только в академических кругах, но и стала активно обсуждаться и применяться простыми разработчиками. Тема шаблонов проектирования активно затрагивается на различных коференциях и семинарах, включая OOPSLA (Object-Oriented Programming, Systems, Languages & Applications) и PLoP (Pattern Languages of Programs). О шаблонах проектирования вышло множество книг. Часть из них продолжают исследование классических шаблонов проектирования, поднятых бандой четырех в своей книге, но помимо этого, шаблоны стали заполнять все большее и большее количество смежных областей. Сегодня шаблоны практически повсюду: существуют шаблоны кодирования, шаблоны рефакторинга, шаблоны реализации корпоративных приложений, шаблоны работы с базами данных, шаблоны распределенных приложений, шаблоны работы с многопоточностью и множество других.
Шаблоны проектирования получили весьма широкое распространение, но несмотря на это они в течение длительного времени оставались прерогативой архитектора и разработчика, а не менеджера. Но за последние несколько лет эта картина начала меняться. Вслед за книгой Джеймса Коплиена и Нила Харрисона “Organizational Patterns of Agile Software Development” вышла книга Тома ДеМарко, Тима Листера и др. “Adrenaline Junkies and Template Zombies: Understanding Patterns of Project Behavior”, посвященная шаблонам поведения программных проектов.
Рассматривая историю возникновения шаблонов проектирования и их непосредственную близость к языку шаблонов Кристофера Александера нельзя не отметить существенные различия. Несмотря на распространения идеи шаблонов, язык шаблонов в понимании Александера так и не был создан. Существуют шаблоны, предназначенные для решения различных задач, шаблоны для различных уровней абстракции и различных уровней иерархии системы. Эти шаблоны каким-то образом связаны с другими шаблонами более высокого и более низкого уровней, но при этом эта связь не является жесткой и формальной, в результате даже опытный разработчик не может описать всю систему с помощью какого-либо языка шаблонов. О шаблонах проектирования знают многие разработчики, проектировщики, архитекторы, но об этом явлении совершенно ничего не известно пользователям, хотя именно эта идея лежит в основе языка шаблонов Александера. Александер считал, что пользователь лучше всего знает свои нужды и если им дать формальный инструмент, то с его помощью они сами смогут построить лучшие прототипы, которые впоследствии будут реализованы командой разработчиков. Эту идею пытались развить Кент Бек и Вард Каннингем в самом начале своей работы с шаблонами, и даже получили положительные результаты, но идея шаблонов пошла по другому пути, который привел к повторному использованию идей командой разработчиков, но без участия в этом процессе конечного пользователя. На сегодняшний день основная роль шаблонов – это повторное использование опыта в различных областях разработки ПО, устранение коммуникационного барьера внутри команды разработчиков и между ними, повышение качества создаваемого продукта, за счет использования проверенных годами решений. Шаблоны не стали «серебряной пулей», но они сделали достаточно для компьютерного сообщества, чтобы к этому явлению относились с уважением и знали не только, что из себя представляют шаблоны проектирования, но и знали историю этого феномена.
Литература
- Christopher Alexander, Notes On The Synthesis Of Form, 1964
- Christopher Alexander, The Pattern Language, 1977
- Christopher Alexander, The Timeless Way of Building, 1979
- Edward Yourdon, Larry L. Constantine, Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design, 1979
- Tom DeMarco, Timothy Lister, Peopleware: Productive Projects and Teams, 1999
- Kent Beck, Ward Cunningham, Using Pattern Languages for Object-Oriented Programs, OOPSLA-87
- James Coplien, Software Patterns, 1996
- Jonathan Erickson, Dr. Dobb's Journal, March 1998
- James Coplien, Advanced C++ Programming Styles and Idioms, 1991
- Erich Gamma et al. Design Patterns: Elements of Reusable Object-Oriented Software, 1994
Незаслуженно забыт и не упомянут Мартин Фаулер. У него есть очень много примеров шаблонов проектирования на его сайте, с объемным обоснованием использования: http://martinfowler.com/
ОтветитьУдалитьТакже можно было бы привести несколько книг, написанных Фаулером, на предмет использования шаблонов проектирования в enterprise
@voffka:
ОтветитьУдалитьФаулер автор множества замечательных книг, но он был одним из тех, кто уже во "второй" волне "продолжил" популяризацию шаблонов проектирования, перенес эту идею на процесс кодирования, в результате чего появилось понятие "рефакторинга", но он практически не участвовал в зарождении этого феномена, а основная цель статьи показать именно самый сложный и интересный период в истории шаблонов - процесс становления.
P.S. Я нисколько не умаляю заслуг Мартина Фаулера в области разработки ПО, это невероятно умный и талантливый инженер и писатель.
P.S.S. Если попытаться выделить известные книги, выпущенные после 1995 года, то только этот перечень был бы на несколько страниц. Причем многие из этих книг по-праву считаются классическими в своих областях.
Отличный выбор и цены лояльные. Буду советовать Вас всем своим ррузьям и знакомым profimebel.com.ua
ОтветитьУдалить