Антипаттерн: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Добавление ссылок на электронные версии книг (20210523)) #IABot (v2.0.8) (GreenC bot |
Lesless (обсуждение | вклад) отмена правки 140804891 участника 178.120.51.207 (обс.) |
||
(не показано 26 промежуточных версий 17 участников) | |||
Строка 2: | Строка 2: | ||
| автор = Budgen, D. |
| автор = Budgen, D. |
||
| заглавие = Software design |
| заглавие = Software design |
||
| ссылка = https://archive.org/details/softwaredesign0000budg_r3e1 |
|||
| издательство = Addison-Wesley |
| издательство = Addison-Wesley |
||
| год = 2003 |
| год = 2003 |
||
Строка 8: | Строка 9: | ||
}}</ref>. В отличие от [[шаблон проектирования|шаблона проектирования]], рассмотрение антипаттерна включает в себя как неправильное решение проблемы с его признаками и последствиями, так и выход из ситуации{{sfn|Brown|1998|loc=Chapter 2}}. |
}}</ref>. В отличие от [[шаблон проектирования|шаблона проектирования]], рассмотрение антипаттерна включает в себя как неправильное решение проблемы с его признаками и последствиями, так и выход из ситуации{{sfn|Brown|1998|loc=Chapter 2}}. |
||
Термин происходит из [[информатика|информатики]], из книги «Банды четырёх» «''[[Design Patterns|Шаблоны проектирования]]''», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «паттернами», и противоположными им являются «антипаттерны». Частью хорошей [[практика программирования|практики программирования]] является избегание антипаттернов. До появления термина все проблемы назывались '''ловушки''' ({{lang-en2|pitfalls}}){{нет АИ|28|10|2020}}. Таким образом, антипаттерны — это самые распространённые ловушки, но не все ловушки будут антипаттернами. |
Термин происходит из [[информатика|информатики]], из книги «Банды четырёх» «''[[Design Patterns|Шаблоны проектирования]]''», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «паттернами», и противоположными им являются «антипаттерны». <!-- Частью хорошей [[практика программирования|практики программирования]] является избегание антипаттернов. До появления термина все проблемы назывались '''ловушки''' ({{lang-en2|pitfalls}}){{нет АИ|28|10|2020}}. Таким образом, антипаттерны — это самые распространённые ловушки, но не все ловушки будут антипаттернами.--> |
||
Антипаттерны концептуально похожи на паттерны в том, что они документируют повторяющиеся решения общих проблем. Они известны как антипаттерны, потому что их использование (или злоупотребления) даёт негативные последствия{{sfn|Smith C. U.|2000|name = Smith}}{{Переход|#Антипаттерн и паттерн ошибки|green}}. |
Антипаттерны концептуально похожи на паттерны в том, что они документируют повторяющиеся решения общих проблем. Они известны как антипаттерны, потому что их использование (или злоупотребления) даёт негативные последствия{{sfn|Smith C. U.|2000|name = Smith}}{{Переход|#Антипаттерн и паттерн ошибки|green}}. |
||
Концепция также прекрасно подходит к [[машиностроение|машиностроению]]. Несмотря на то, что термин нечасто используется вне программной инженерии, концепция является универсальной. |
|||
== Антипаттерн и паттерн ошибки == |
|||
Паттерн ошибки — повторяющаяся взаимосвязь между ошибками, о которых сигнализирует программа, и ошибкой в [[Компьютерная программа|программе]], являющейся причиной сообщений об ошибках{{sfn|Аллен Э.|2003|страницы = 65—66|name = Аллен}}. |
|||
В отличие от паттернов ошибок, антипаттерны относятся к уровню [[Проектирование|проектирования]], а не [[Кодирование (программирование)|кодирования]]. |
|||
Антипаттерны являются паттернами проектирования, паттерны ошибок представляют собой паттерны некорректного поведения программ, [[Корреляция|коррелирующего]] с ошибками программирования<ref name="Аллен" />. |
|||
== История == |
== История == |
||
С развитием ИТ-индустрии масштабы программных проектов и затраты ресурсов на них стремительно росли, что порождало большое количество проблем, что вставали перед программистами. Большинство этих проблем были типичными и встречались практически в каждом крупном проекте. В начале 90-х годов приобрели значительную популярность каталоги [[Шаблон проектирования|шаблонов проектирования]] |
С развитием ИТ-индустрии масштабы программных проектов и затраты ресурсов на них стремительно росли, что порождало большое количество проблем, что вставали перед программистами. Большинство этих проблем были типичными и встречались практически в каждом крупном проекте. В начале 90-х годов приобрели значительную популярность каталоги [[Шаблон проектирования|шаблонов проектирования]], «паттернов» ({{lang-en|design patterns}}) — элегантных и проверенных на практике способов решения типичных задач. Паттерны и на сегодняшний день являются мощными и чрезвычайно популярны, однако многие разработчики, используя популярные паттерны в ситуациях, для которых они не предназначены, порождали этим больше проблем, чем решали. Кроме того, у ИТ-инженеров, как и у работников любой другой сферы деятельности, можно выделить типичные совершаемые ошибки, обусловленные недостаточной базой знаний или отсутствием опыта, спешкой и оказываемым давлением из-за сроков сдачи проекта, финансовыми ограничениями и прочим. |
||
Впервые термин « |
Впервые термин «антипаттерн» в смысле обобщенного описания типичного неудачного решения был применен в 1996 году Майклом Эйкройдом ({{lang-en|Michael Akroyd}}) на конференции «Object World West Conference», посвященной аспектам [[Объектно-ориентированное программирование|объектно-ориентированного программирования]].<ref>{{Cite web|url = http://c2.com/cgi/wiki?AntiPattern|title = http://c2.com/cgi/wiki?AntiPattern|author = |work = Cunningham & Cunningham, Inc.|date = |publisher = |access-date = 2006-02-15|archive-date = 2005-04-03|archive-url = https://web.archive.org/web/20050403164608/http://c2.com/cgi/wiki?AntiPattern|deadlink = no}}</ref> В своей презентации «Антипаттерны: предотвращение неправильного использования объектов» Эйкройд обращал внимание на вредные, но частые программные конструкции, в частности, те, что противоречат принципам ООП. К тому же, для каждой такой конструкции он предлагал эффективную замену. |
||
Термин |
Термин в смысле «плохая идея» встречался и до Эйкройда, но не публиковался и особой популярностью не пользовался. И все же приписывать авторство одному человеку не стоит. Как считает Уильям Браун, автор книги «Антипаттерны: рефакторинг приложений, архитектур и проектов», антипаттерн — это этап эволюции понятия паттерна проектирования, расширения их модели. |
||
== Классификация == |
== Классификация == |
||
Строка 50: | Строка 42: | ||
=== Антипаттерны в объектно-ориентированном программировании === |
=== Антипаттерны в объектно-ориентированном программировании === |
||
* [[Базовый класс-утилита]] (BaseBean<ref name=":1">{{Книга|автор = Rajiv Ramnath, Cheyney Loffing|год = 2014-04-14|isbn = 9781118799277|страниц = 470|издательство = John Wiley & Sons|заглавие = Beginning IOS Programming For Dummies|ссылка = https://books.google.com/books?id=8tIsAwAAQBAJ|страницы = 105}}</ref>): Наследование функциональности из класса-утилиты вместо делегирования к нему. |
* [[Базовый класс-утилита]] (BaseBean<ref name=":1">{{Книга|автор = Rajiv Ramnath, Cheyney Loffing|год = 2014-04-14|isbn = 9781118799277|страниц = 470|издательство = John Wiley & Sons|заглавие = Beginning IOS Programming For Dummies|ссылка = https://books.google.com/books?id=8tIsAwAAQBAJ|страницы = 105|archivedate = 2016-07-23|archiveurl = https://web.archive.org/web/20160723015539/https://books.google.com/books?id=8tIsAwAAQBAJ}}</ref>): Наследование функциональности из класса-утилиты вместо делегирования к нему. |
||
* {{нп5|Anemic Domain Model||en|Anemic Domain Model}}<ref name=":1" /> — боязнь размещать логику в объектах предметной области. |
* {{нп5|Anemic Domain Model||en|Anemic Domain Model}}<ref name=":1" /> — боязнь размещать логику в объектах предметной области. |
||
* {{нп5|Вызов предка||en|Call super}} (Call super): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка. |
* {{нп5|Вызов предка||en|Call super}} (Call super): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка. |
||
Строка 60: | Строка 52: | ||
* [[Одиночество (антипаттерн)|Одиночество]] (Singletonitis): Неуместное использование паттерна [[Одиночка (шаблон проектирования)|одиночка]]. |
* [[Одиночество (антипаттерн)|Одиночество]] (Singletonitis): Неуместное использование паттерна [[Одиночка (шаблон проектирования)|одиночка]]. |
||
* [[Френд-зона (антипаттерн)|Френд-зона]] (Friend zone): Неуместное использование дружественных классов и дружественных функций в языке C++. |
* [[Френд-зона (антипаттерн)|Френд-зона]] (Friend zone): Неуместное использование дружественных классов и дружественных функций в языке C++. |
||
* [[Каша из интерфейсов]] (Interface soup<ref>{{Книга|автор = Gary McLean Hall|заглавие = Adaptive Code via C#: Agile coding with design patterns and SOLID principles|ответственный = |издание = |место = |издательство = Microsoft Press|год = 2014|страницы = |
* [[Каша из интерфейсов]] (Interface soup<ref>{{Книга|автор = Gary McLean Hall|заглавие = Adaptive Code via C#: Agile coding with design patterns and SOLID principles|ссылка = https://archive.org/details/adaptivecodeviac0000hall/page/n294|ответственный = |издание = |место = |издательство = Microsoft Press|год = 2014|страницы = 267—268|страниц = |isbn = 978-0735683204}}</ref>): Объединение нескольких [[Интерфейс (объектно-ориентированное программирование)|интерфейсов]], разделенных согласно принципу изоляции интерфейсов (Interface segregation), в один. |
||
* [[Висящие концы]]: Интерфейс, большинство методов которого бессмысленны и реализуются «пустышками». |
* [[Висящие концы]]: Интерфейс, большинство методов которого бессмысленны и реализуются «пустышками». |
||
* Заглушка (Stub): Попытка «натянуть» на объект уже имеющийся малоподходящий по смыслу интерфейс, вместо создания нового. |
* Заглушка (Stub): Попытка «натянуть» на объект уже имеющийся малоподходящий по смыслу интерфейс, вместо создания нового. |
||
=== Антипаттерны |
=== Антипаттерны при написании кода === |
||
* {{нп5|Ненужная сложность||en|Accidental complexity}} (Accidental complexity): Внесение ненужной сложности в решение. |
* {{нп5|Ненужная сложность||en|Accidental complexity}} (Accidental complexity): Внесение ненужной сложности в решение. |
||
* {{нп5|Действие на расстоянии||en|Action at a distance (computer programming)}} (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы. |
* {{нп5|Действие на расстоянии||en|Action at a distance (computer programming)}} (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы. |
||
Строка 85: | Строка 77: | ||
* {{нп5|Лазанья-код||en|Spaghetti_code#Lasagna_code}} (Lasagnia code, или «лук» (onion)): Чрезмерное связывание между собой уровней абстракции, приводящее к невозможности изменения одного уровня без изменения остальных. |
* {{нп5|Лазанья-код||en|Spaghetti_code#Lasagna_code}} (Lasagnia code, или «лук» (onion)): Чрезмерное связывание между собой уровней абстракции, приводящее к невозможности изменения одного уровня без изменения остальных. |
||
* [[Равиоли-код]] (Ravioli code, или «пельмени»): Объекты настолько «склеены» между собой, что практически не допускают рефакторинга. |
* [[Равиоли-код]] (Ravioli code, или «пельмени»): Объекты настолько «склеены» между собой, что практически не допускают рефакторинга. |
||
* [[Мыльный пузырь (паттерн)|Мыльный пузырь]] (Soap bubble): Объект, |
* [[Мыльный пузырь (паттерн)|Мыльный пузырь]] (Soap bubble): Объект, инициализированный мусором, максимально долго притворяется, что содержит какие-то данные. |
||
* [[Мьютексный ад]] (Mutex hell): Внедрение слишком большого количества объектов синхронизации между потоками. |
* [[Мьютексный ад]] (Mutex hell): Внедрение слишком большого количества объектов синхронизации между потоками. |
||
* (Мета-)шаблонный рак (Template cancer): Повсеместное использование шаблонов (в основном C++), в том числе там, где их использование не оправдано. Это уменьшает понимание и сопровождение кода и замедляет компиляцию. |
* (Мета-)шаблонный рак (Template cancer): Повсеместное использование шаблонов (в основном C++), в том числе там, где их использование не оправдано. Это уменьшает понимание и сопровождение кода и замедляет компиляцию. |
||
=== Методологические антипаттерны === |
=== Методологические антипаттерны === |
||
* [[шаблон проектирования|Паттерн проектирования]]: само по себе использование паттернов считается анти-паттерном — знаком того, что система не воплощает достаточный уровень [[Абстракция данных|абстракции]]<ref>{{cite web|url=http://www.paulgraham.com/icad.html|title=Revenge of the Nerds|quote=In the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.}}</ref>. |
|||
* [[Программирование методом копирования-вставки]] (Copy and paste programming)<ref name=":0" />: Копирование (и лёгкая модификация) существующего кода вместо создания общих решений. |
* [[Программирование методом копирования-вставки]] (Copy and paste programming)<ref name=":0" />: Копирование (и лёгкая модификация) существующего кода вместо создания общих решений. |
||
* [[Дефакторинг]] (De-Factoring): Процесс уничтожения функциональности и замены её документацией. |
* [[Дефакторинг]] (De-Factoring): Процесс уничтожения функциональности и замены её документацией. |
||
Строка 96: | Строка 87: | ||
* {{нп5|Фактор невероятности||en|Improbability factor}} (Improbability factor): Предположение о невозможности того, что сработает известная ошибка. |
* {{нп5|Фактор невероятности||en|Improbability factor}} (Improbability factor): Предположение о невозможности того, что сработает известная ошибка. |
||
* [[Оптимизация (информатика)|Преждевременная оптимизация]] (Premature optimization): Оптимизация на этапе проектирования сегмента кода, приводящая к его усложнению или искажению. |
* [[Оптимизация (информатика)|Преждевременная оптимизация]] (Premature optimization): Оптимизация на этапе проектирования сегмента кода, приводящая к его усложнению или искажению. |
||
* [[Программирование методом подбора]] (Programming by permutation): Подход к разработке программного обеспечения небольшими изменениями. |
* [[Программирование методом подбора]] (Programming by permutation): Подход к разработке программного обеспечения небольшими изменениями без понимания их смысла. |
||
* [[Изобретение колеса]]/велосипеда (Reinventing the wheel<ref name=":0" />): Создание с нуля |
* [[Изобретение колеса]]/велосипеда (Reinventing the wheel<ref name=":0" />): Создание с нуля вместо использования хорошего готового решения. |
||
* [[Изобретение квадратного колеса]] (Reinventing the square wheel): Создание плохого решения, |
* [[Изобретение квадратного колеса]] (Reinventing the square wheel): Создание плохого решения, при условии, что уже существует известное решение лучше. |
||
* [[Самоуничтожение]] (Self-destruction): Фатальная ошибка либо нестандартное поведение программы, приводящая к отказу в обслуживании, возникшая вследствие другой менее серьёзной ошибки. Например, при возникновении ошибки, приложение начинает очень быстро и много писать в лог, вследствие чего заканчивается место на жёстком диске быстрее, чем это обнаружит мониторинг. |
* [[Самоуничтожение]] (Self-destruction): Фатальная ошибка либо нестандартное поведение программы, приводящая к отказу в обслуживании, возникшая вследствие другой менее серьёзной ошибки. Например, при возникновении ошибки, приложение начинает очень быстро и много писать в лог, вследствие чего заканчивается место на жёстком диске быстрее, чем это обнаружит мониторинг. |
||
* [[Два тоннеля]]: Вынесение новой функциональности в отдельное приложение вместо расширения уже имеющегося. Чаще всего применяется, когда по каким-либо причинам (в основном, при нехватке времени либо нежелании менеджмента) внесение изменений в уже имеющийся код требует больших затрат, чем создание нового. При этом у клиента в конечном итоге работают два приложения, запускаясь одновременно либо попеременно друг из друга. |
* [[Два тоннеля]]: Вынесение новой функциональности в отдельное приложение вместо расширения уже имеющегося. Чаще всего применяется, когда по каким-либо причинам (в основном, при нехватке времени либо нежелании менеджмента) внесение изменений в уже имеющийся код требует больших затрат, чем создание нового. При этом у клиента в конечном итоге работают два приложения, запускаясь одновременно либо попеременно друг из друга. |
||
Строка 107: | Строка 98: | ||
=== Разные === |
=== Разные === |
||
* [[Дым и зеркала (анти-паттерн)|Дым и зеркала]] (Smoke and mirrors<ref name=":0">{{Книга|автор = William J. Brown|год = 1998-04-03|isbn = 0−471−19713−0|страниц = 156|издательство = Wiley|заглавие = AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis|ссылка = http://ce.sharif.edu/courses/93-94/1/ce222-1/resources/root/AntipatternsBooks/Antipatterns%20-%20Refactoring%20Software,%20Architectures,%20and%20Proj.pdf}}</ref>): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми [[фокусник]]и скрывают свои секреты). |
* [[Дым и зеркала (анти-паттерн)|Дым и зеркала]] (Smoke and mirrors<ref name=":0">{{Книга|автор = William J. Brown|год = 1998-04-03|isbn = 0−471−19713−0|страниц = 156|издательство = Wiley|заглавие = AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis|ссылка = http://ce.sharif.edu/courses/93-94/1/ce222-1/resources/root/AntipatternsBooks/Antipatterns%20-%20Refactoring%20Software,%20Architectures,%20and%20Proj.pdf|archivedate = 2015-12-22|archiveurl = https://web.archive.org/web/20151222172958/http://ce.sharif.edu/courses/93-94/1/ce222-1/resources/root/AntipatternsBooks/Antipatterns%20-%20Refactoring%20Software,%20Architectures,%20and%20Proj.pdf}}</ref>): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми [[фокусник]]и скрывают свои секреты). |
||
* [[Раздувание ПО]] (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов. |
* [[Раздувание ПО]] (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов. |
||
* [[Функция для галочки|Функции для галочки]]: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в [[реклама|рекламе]], что функция есть). |
* [[Функция для галочки|Функции для галочки]]: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в [[реклама|рекламе]], что функция есть). |
||
Строка 124: | Строка 115: | ||
* [[Дымоход (компьютер)|Дымоход]] (Stovepipe System<ref name=":0" />): Редко поддерживаемая сборка плохо связанных компонентов. |
* [[Дымоход (компьютер)|Дымоход]] (Stovepipe System<ref name=":0" />): Редко поддерживаемая сборка плохо связанных компонентов. |
||
* [[Гонки (компьютер)|Состояние гонки]] (Race hazard, Race condition): непредвидение возможности наступления событий в порядке, отличном от ожидаемого. |
* [[Гонки (компьютер)|Состояние гонки]] (Race hazard, Race condition): непредвидение возможности наступления событий в порядке, отличном от ожидаемого. |
||
* [[Мышиная возня]]{{Нет АИ|25|4|2013}}: Неоправданное создание множества мелких и абстрактных классов для решения одной конкретной задачи более высокого уровня. |
<!-- * [[Мышиная возня]]{{Нет АИ|25|4|2013}}: Неоправданное создание множества мелких и абстрактных классов для решения одной конкретной задачи более высокого уровня.--> |
||
* [[Членовредительство (антипаттерн)|Членовредительство]] (Mutilation): Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами. |
* [[Членовредительство (антипаттерн)|Членовредительство]] (Mutilation): Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами. |
||
* [[Сохранение или смерть]] (Save or die): Сохранение изменений в конфигурации на жесткий диск лишь при завершении приложения; приводит к тому, что в случае отказа в программе эти данные будут утеряны |
* [[Сохранение или смерть]] (Save or die): Сохранение изменений в конфигурации на жесткий диск лишь при завершении приложения; приводит к тому, что в случае отказа в программе эти данные будут утеряны |
||
Строка 144: | Строка 135: | ||
* {{нп5|Расползание рамок||en|Scope creep}} (Scope creep): потеря контроля над разрастанием проекта. |
* {{нп5|Расползание рамок||en|Scope creep}} (Scope creep): потеря контроля над разрастанием проекта. |
||
* [[Привязка к поставщику]] (Vendor lock-in)<ref name=":0" />: жёсткая привязка к поставщику. |
* [[Привязка к поставщику]] (Vendor lock-in)<ref name=":0" />: жёсткая привязка к поставщику. |
||
* [[Тёплое тело]] (Warm Bodies)<ref name=":0" />: человек, чей вклад в проект под сомнением. |
|||
* [[Единственный знающий человек]] (Single head of knowledge, SHOK): когда жизненно важными для проекта сведениями или навыками обладает только один человек в команде, а с его уходом работа останавливается. |
* [[Единственный знающий человек]] (Single head of knowledge, SHOK): когда жизненно важными для проекта сведениями или навыками обладает только один человек в команде, а с его уходом работа останавливается. |
||
* [[Рыцарь на белом коне]] (Knight in shining armor, KISA): когда на сцене появляется человек, который пытается починить всё, не сообщая никому, что он сделал и почему. |
* [[Рыцарь на белом коне]] (Knight in shining armor, KISA): когда на сцене появляется человек, который пытается починить всё, не сообщая никому, что он сделал и почему. |
||
Нейл и Лапланте приводят следующие антипаттерны{{sfn|Neill, Laplante|2005}}: |
Нейл и Лапланте приводят следующие антипаттерны{{sfn|Neill, Laplante|2005}}: |
||
* [[Заочный менеджер]] (Absentee Manager): менеджер ведет себя уклончиво или невидим в течение длительного времени |
* [[Заочный менеджер]] (Absentee Manager): менеджер ведет себя уклончиво или невидим в течение длительного времени — он прячется где-то в офисе или вдали от офиса. |
||
* [[Иметь только молоток]] (All You Have Is A Hammer): однонаправленное управление, где одни и те же приемы используются на всех подчиненных и во всех ситуациях. Иногда также называется «One-Trick Pony». |
* [[Иметь только молоток]] (All You Have Is A Hammer): однонаправленное управление, где одни и те же приемы используются на всех подчиненных и во всех ситуациях. Иногда также называется «One-Trick Pony». |
||
* [[Дикий менеджер]] (Cage Match Negotiator): любой менеджер, который упрям не по разуму и использует подход к управлению «Победа любой ценой» или «Я прав, а вы нет». У них часто есть кофейная кружка с «Правилами управления»: «Правило |
* [[Дикий менеджер]] (Cage Match Negotiator): любой менеджер, который упрям не по разуму и использует подход к управлению «Победа любой ценой» или «Я прав, а вы нет». У них часто есть кофейная кружка с «Правилами управления»: «Правило № 1: Босс всегда прав. Правило № 2: Если босс не прав, см. Правило № 1». |
||
* [[Доппельгангер]] (Doppelganger): менеджер или коллега, с которым то легко работать, то трудно. |
* [[Доппельгангер]] (Doppelganger): менеджер или коллега, с которым то легко работать, то трудно. |
||
* [[Бесплодные прыжки]] (Fruitless Hoops): вы готовите для менеджеров всё новые и новые данные, нужные им для принятия решения, но менеджеры так и не принимают никакого решения, продолжая запрашивать у вас данные. Вы не знаете, зачем им нужны эти данные. |
* [[Бесплодные прыжки]] (Fruitless Hoops): вы готовите для менеджеров всё новые и новые данные, нужные им для принятия решения, но менеджеры так и не принимают никакого решения, продолжая запрашивать у вас данные. Вы не знаете, зачем им нужны эти данные. |
||
* [[Золотой ребёнок]] (Golden Child): «Золотой ребенок» появляется в ситуациях, когда менеджер предоставляет особую ответственность, возможность, признание или вознаграждение члену своей команды на основе личных взаимоотношений с ним и вопреки его действительным действиям. Всех раздражает «Золотое дитя», но настоящая проблема заключается в менеджере. |
* [[Золотой ребёнок (антипаттерн)|Золотой ребёнок]] (Golden Child): «Золотой ребенок» появляется в ситуациях, когда менеджер предоставляет особую ответственность, возможность, признание или вознаграждение члену своей команды на основе личных взаимоотношений с ним и вопреки его действительным действиям. Всех раздражает «Золотое дитя», но настоящая проблема заключается в менеджере. |
||
* [[Безглавая курица]] (Headless Chicken): менеджер без фокуса и плана, который никогда ничего не заканчивает. |
* [[Безглавая курица]] (Headless Chicken): менеджер без фокуса и плана, который никогда ничего не заканчивает. |
||
* [[Лидер не менеджер]] (Leader Not Manager): подчеркивает важность эффективного руководства. |
* [[Лидер не менеджер]] (Leader Not Manager): подчеркивает важность эффективного руководства. |
||
Строка 165: | Строка 155: | ||
* [[Герой пролетариата]] (Proletariat Hero): менеджер ведёт себя с подчинёнными, как с идеальными работниками, но это лишь его опора, используемая для маскировки плохого управления. Это форма «мотивации» персонала, которая дает повод руководству повысить ожидаемые результаты или получить больше с меньшими затратами. |
* [[Герой пролетариата]] (Proletariat Hero): менеджер ведёт себя с подчинёнными, как с идеальными работниками, но это лишь его опора, используемая для маскировки плохого управления. Это форма «мотивации» персонала, которая дает повод руководству повысить ожидаемые результаты или получить больше с меньшими затратами. |
||
* [[Звёздный выскочка]] (Rising Upstart): суперзвезды, которые не могут терять время на обучение и поиск своего места. Иногда это может быть из-за невежества (они не знают, чего не знают), а иногда из-за нетерпения (они знают то, чего не знают другие). Такой выскочка представляет настоящий вызов для всех, кроме самых опытных менеджеров. |
* [[Звёздный выскочка]] (Rising Upstart): суперзвезды, которые не могут терять время на обучение и поиск своего места. Иногда это может быть из-за невежества (они не знают, чего не знают), а иногда из-за нетерпения (они знают то, чего не знают другие). Такой выскочка представляет настоящий вызов для всех, кроме самых опытных менеджеров. |
||
* [[Дорога в никуда]] (Road to Nowhere): Отсутствие плана вызывает замешательство и кризис руководства. |
* [[Дорога в никуда (антипаттерн)|Дорога в никуда]] (Road to Nowhere): Отсутствие плана вызывает замешательство и кризис руководства. |
||
* [[Бесхребетный руководитель]] (Spineless Executive): любой менеджер, который не имеет смелости вступить в необходимую конфронтацию или справиться со сложной ситуацией. Вместо этого он полностью избегает конфронтации или ситуации или просит вас сообщить ему плохие новости. |
* [[Бесхребетный руководитель]] (Spineless Executive): любой менеджер, который не имеет смелости вступить в необходимую конфронтацию или справиться со сложной ситуацией. Вместо этого он полностью избегает конфронтации или ситуации или просит вас сообщить ему плохие новости. |
||
* [[Трёхглавый рыцарь]] (Three-Headed Knight): нерешительный менеджер. |
* [[Трёхглавый рыцарь]] (Three-Headed Knight): нерешительный менеджер. |
||
* [[Абсолютный инструмент]] (Ultimate Weapon): менеджер объявляет, что все могут положиться на выдающихся сотрудников настолько, что эти сотрудники станут проводником всего. |
* [[Абсолютный инструмент]] (Ultimate Weapon): менеджер объявляет, что все могут положиться на выдающихся сотрудников настолько, что эти сотрудники станут проводником всего. |
||
* [[Тёплое тело]] (Warm Bodies): управленческая ситуация, в которой работник, который едва соответствует минимальным требованиям, перемещается от проекта к проекту или от команды к команде. Слабый работник называется «теплым телом», хотя настоящая проблема заключается в менеджере. Этот антипаттерн является противоположностью «Звёздного выскочки» в отношении навыков и потенциала. |
* [[Тёплое тело]] (Warm Bodies<ref name=":0" />): управленческая ситуация, в которой работник, который едва соответствует минимальным требованиям, перемещается от проекта к проекту или от команды к команде. Слабый работник называется «теплым телом», хотя настоящая проблема заключается в менеджере. Этот антипаттерн является противоположностью «Звёздного выскочки» в отношении навыков и потенциала. |
||
== Антипаттерны обстановки == |
== Антипаттерны обстановки == |
||
Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики<ref>В оригинале: socio-political forces</ref>{{sfn|Settas|2011}}{{sfn|Neill, Laplante|2005}}<ref>''Phillip Laplante'' [http://queue.acm.org/detail.cfm?id=1035617 The Burning Bag of Dung—and Other Environmental Antipatterns] ACM Queue November 30, 2004 Volume 2, issue 7 |
Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики<ref>В оригинале: socio-political forces</ref>{{sfn|Settas|2011}}{{sfn|Neill, Laplante|2005}}<ref>''Phillip Laplante'' [http://queue.acm.org/detail.cfm?id=1035617 The Burning Bag of Dung—and Other Environmental Antipatterns] {{Wayback|url=http://queue.acm.org/detail.cfm?id=1035617 |date=20150919103326 }} ACM Queue November 30, 2004 Volume 2, issue 7</ref>: |
||
* [[Муравейник (антипаттерн)|Муравейник]] ({{lang-en2|Ant Colony}}) — под внешней красотой скрывается насаждение целей{{прояснить}}. |
* [[Муравейник (антипаттерн)|Муравейник]] ({{lang-en2|Ant Colony}}) — под внешней красотой скрывается насаждение целей{{прояснить}}. |
||
Строка 184: | Строка 174: | ||
* [[Дисфункция, возведённая в догму (антипаттерн)|Дисфункция, возведённая в догму]] ({{lang-en2|Dogmatic About Dysfunction}}) |
* [[Дисфункция, возведённая в догму (антипаттерн)|Дисфункция, возведённая в догму]] ({{lang-en2|Dogmatic About Dysfunction}}) |
||
* [[Непоколебимое мужество (антипаттерн)|Непоколебимое мужество]] ({{lang-en2|Dunkirk Spirit}}){{прояснить}} |
* [[Непоколебимое мужество (антипаттерн)|Непоколебимое мужество]] ({{lang-en2|Dunkirk Spirit}}){{прояснить}} |
||
* [[Новое платье короля (антипаттерн)|Новое платье короля]] ({{lang-en2|Emperor’s New Clothes}}) |
* [[Новое платье короля (антипаттерн)|Новое платье короля]] ({{lang-en2|Emperor’s New Clothes}}) — по одноимённой [[Новое платье короля|сказке]] |
||
* [[Доктрина справедливости (антипаттерн)|Доктрина справедливости]] ({{lang-en2|Fairness Doctrine}}){{прояснить}} |
* [[Доктрина справедливости (антипаттерн)|Доктрина справедливости]] ({{lang-en2|Fairness Doctrine}}){{прояснить}} |
||
* [[Поспешишь |
* [[Поспешишь — людей насмешишь (антипаттерн)|Поспешишь — людей насмешишь]] ({{lang-en2|Fools Rush In}}){{прояснить}} |
||
* [[Болезнь основателя (антипаттерн)|Болезнь основателя]] ({{lang-en2|Founderitis}}){{прояснить}} |
* [[Болезнь основателя (антипаттерн)|Болезнь основателя]] ({{lang-en2|Founderitis}}){{прояснить}}<!-- |
||
* [[Синдром французского официанта (антипаттерн)|Синдром французского официанта]] ({{lang-en2|French Waiter Syndrome}}) — нездоровая атмосфера в компании (стереотипное мнение американцев о мелких французских ресторанчиках){{нет АИ|5|12|2019}}. |
* [[Синдром французского официанта (антипаттерн)|Синдром французского официанта]] ({{lang-en2|French Waiter Syndrome}}) — нездоровая атмосфера в компании (стереотипное мнение американцев о мелких французских ресторанчиках){{нет АИ|5|12|2019}}.--> |
||
* [[Дедовщина (антипаттерн)|Дедовщина]] ({{lang-en2|Geek Hazing}}) — начинающих загружают большим количеством тривиальных задач, которые не помогают им учиться. |
* [[Дедовщина (антипаттерн)|Дедовщина]] ({{lang-en2|Geek Hazing}}) — начинающих загружают большим количеством тривиальных задач, которые не помогают им учиться. |
||
* [[Институциональное недоверие (антипаттерн)|Институциональное недоверие]] ({{lang-en2|Institutional Mistrust}}){{прояснить}} |
* [[Институциональное недоверие (антипаттерн)|Институциональное недоверие]] ({{lang-en2|Institutional Mistrust}}){{прояснить}} |
||
Строка 299: | Строка 289: | ||
{{rq|refless|check}} |
{{rq|refless|check}} |
||
[[Категория:Антипаттерны]] |
[[Категория:Антипаттерны| ]] |
||
[[Категория:Архитектура программного обеспечения]] |
[[Категория:Архитектура программного обеспечения]] |
Текущая версия от 16:47, 27 октября 2024
Антипаттерн (англ. anti-pattern) — это распространённый подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным[1]. В отличие от шаблона проектирования, рассмотрение антипаттерна включает в себя как неправильное решение проблемы с его признаками и последствиями, так и выход из ситуации[2].
Термин происходит из информатики, из книги «Банды четырёх» «Шаблоны проектирования», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «паттернами», и противоположными им являются «антипаттерны».
Антипаттерны концептуально похожи на паттерны в том, что они документируют повторяющиеся решения общих проблем. Они известны как антипаттерны, потому что их использование (или злоупотребления) даёт негативные последствия[3] .
История
[править | править код]С развитием ИТ-индустрии масштабы программных проектов и затраты ресурсов на них стремительно росли, что порождало большое количество проблем, что вставали перед программистами. Большинство этих проблем были типичными и встречались практически в каждом крупном проекте. В начале 90-х годов приобрели значительную популярность каталоги шаблонов проектирования, «паттернов» (англ. design patterns) — элегантных и проверенных на практике способов решения типичных задач. Паттерны и на сегодняшний день являются мощными и чрезвычайно популярны, однако многие разработчики, используя популярные паттерны в ситуациях, для которых они не предназначены, порождали этим больше проблем, чем решали. Кроме того, у ИТ-инженеров, как и у работников любой другой сферы деятельности, можно выделить типичные совершаемые ошибки, обусловленные недостаточной базой знаний или отсутствием опыта, спешкой и оказываемым давлением из-за сроков сдачи проекта, финансовыми ограничениями и прочим.
Впервые термин «антипаттерн» в смысле обобщенного описания типичного неудачного решения был применен в 1996 году Майклом Эйкройдом (англ. Michael Akroyd) на конференции «Object World West Conference», посвященной аспектам объектно-ориентированного программирования.[4] В своей презентации «Антипаттерны: предотвращение неправильного использования объектов» Эйкройд обращал внимание на вредные, но частые программные конструкции, в частности, те, что противоречат принципам ООП. К тому же, для каждой такой конструкции он предлагал эффективную замену.
Термин в смысле «плохая идея» встречался и до Эйкройда, но не публиковался и особой популярностью не пользовался. И все же приписывать авторство одному человеку не стоит. Как считает Уильям Браун, автор книги «Антипаттерны: рефакторинг приложений, архитектур и проектов», антипаттерн — это этап эволюции понятия паттерна проектирования, расширения их модели.
Классификация
[править | править код]Уильям Браун выделяет антипаттерны с трёх точек зрения: разработчика, архитектора и менеджера:
- Антипаттерны разработки (development antipatterns)
- Архитектурные антипаттерны (architectural antipatterns)
- Организационные антипаттерны (managerial antipatterns)
Нейл и Лаплантэ приводят четвёртый тип[5][6]:
- Антипаттерны среды (environmental antipatterns)
Кроме того, антипаттерны были описаны для отдельных информационных технологий, таких как[6]:
- информационная безопасность[7]
- повторное использование кода[8]
- человеко-компьютерное взаимодействие[9]
- сервис-ориентированная архитектура[10]
- интеллектуальная информационная система[11]
Антипаттерны разработки
[править | править код]Технические проблемы и решения, с которыми имеют дело программисты[6]:
Антипаттерны в объектно-ориентированном программировании
[править | править код]- Базовый класс-утилита (BaseBean[12]): Наследование функциональности из класса-утилиты вместо делегирования к нему.
- Anemic Domain Model[англ.][12] — боязнь размещать логику в объектах предметной области.
- Вызов предка[англ.] (Call super): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка.
- Ошибка пустого подкласса (Empty subclass failure): Создание класса (в Perl), который не проходит «проверку пустоты подкласса» («Empty Subclass Test») из-за различного поведения по сравнению с классом, который наследуется от него без изменений.
- Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе).
- Объектная клоака (Object cesspool): Переиспользование объектов, находящихся в непригодном для переиспользования состоянии.
- Полтергейст[англ.] (Poltergeist[13]): Объекты, чьё единственное предназначение — передавать информацию другим объектам.
- Проблема йо-йо[англ.] (Yo-yo problem): Чрезмерная размытость сильно связанного кода (например, выполняемого по порядку) по иерархии классов.
- Одиночество (Singletonitis): Неуместное использование паттерна одиночка.
- Френд-зона (Friend zone): Неуместное использование дружественных классов и дружественных функций в языке C++.
- Каша из интерфейсов (Interface soup[14]): Объединение нескольких интерфейсов, разделенных согласно принципу изоляции интерфейсов (Interface segregation), в один.
- Висящие концы: Интерфейс, большинство методов которого бессмысленны и реализуются «пустышками».
- Заглушка (Stub): Попытка «натянуть» на объект уже имеющийся малоподходящий по смыслу интерфейс, вместо создания нового.
Антипаттерны при написании кода
[править | править код]- Ненужная сложность[англ.] (Accidental complexity): Внесение ненужной сложности в решение.
- Действие на расстоянии[англ.] (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы.
- Накопить и запустить (Accumulate and fire): Установка параметров подпрограмм в наборе глобальных переменных.
- Слепая вера[англ.] (Blind faith): Недостаточная проверка корректности исправления ошибки или результата работы подпрограммы.
- Лодочный якорь[англ.] (Boat anchor)[13]: Сохранение более не используемой части системы.
- Активное ожидание[англ.] (Busy spin, busy waiting): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать асинхронное программирование (к примеру, систему сообщений или событий).
- Кэширование ошибки[англ.] (Caching failure): Забывать сбросить флаг ошибки после её обработки.
- Воняющий подгузник (The Diaper Pattern Stinks): Сброс флага ошибки без её обработки или передачи вышестоящему обработчику.
- Проверка типа вместо интерфейса (Checking type instead of membership, Checking type instead of interface): Проверка того, что объект имеет специфический тип в то время, когда требуется только определённый интерфейс.
- Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы.
- Кодирование путём исключения[англ.] (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая.
- Таинственный код (Cryptic code): Использование аббревиатур вместо мнемоничных имён.
- Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации.
- Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование.
- Поток лавы[англ.] (Lava flow)[13]: Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия.
- Волшебные числа (Magic numbers): Использование числовых констант без объяснения их смысла.
- Процедурный код (Procedural code): Когда другая парадигма является более подходящей.
- Спагетти-код (Spaghetti code, иногда «макароны»)[13]: Код с чрезмерно запутанным порядком выполнения.
- Лазанья-код[англ.] (Lasagnia code, или «лук» (onion)): Чрезмерное связывание между собой уровней абстракции, приводящее к невозможности изменения одного уровня без изменения остальных.
- Равиоли-код (Ravioli code, или «пельмени»): Объекты настолько «склеены» между собой, что практически не допускают рефакторинга.
- Мыльный пузырь (Soap bubble): Объект, инициализированный мусором, максимально долго притворяется, что содержит какие-то данные.
- Мьютексный ад (Mutex hell): Внедрение слишком большого количества объектов синхронизации между потоками.
- (Мета-)шаблонный рак (Template cancer): Повсеместное использование шаблонов (в основном C++), в том числе там, где их использование не оправдано. Это уменьшает понимание и сопровождение кода и замедляет компиляцию.
Методологические антипаттерны
[править | править код]- Программирование методом копирования-вставки (Copy and paste programming)[13]: Копирование (и лёгкая модификация) существующего кода вместо создания общих решений.
- Дефакторинг (De-Factoring): Процесс уничтожения функциональности и замены её документацией.
- Золотой молоток (Golden hammer[13]): Сильная уверенность в том, что любимое решение универсально применимо. Название происходит от поговорки «когда в руках молоток, все проблемы кажутся гвоздями».
- Фактор невероятности[англ.] (Improbability factor): Предположение о невозможности того, что сработает известная ошибка.
- Преждевременная оптимизация (Premature optimization): Оптимизация на этапе проектирования сегмента кода, приводящая к его усложнению или искажению.
- Программирование методом подбора (Programming by permutation): Подход к разработке программного обеспечения небольшими изменениями без понимания их смысла.
- Изобретение колеса/велосипеда (Reinventing the wheel[13]): Создание с нуля вместо использования хорошего готового решения.
- Изобретение квадратного колеса (Reinventing the square wheel): Создание плохого решения, при условии, что уже существует известное решение лучше.
- Самоуничтожение (Self-destruction): Фатальная ошибка либо нестандартное поведение программы, приводящая к отказу в обслуживании, возникшая вследствие другой менее серьёзной ошибки. Например, при возникновении ошибки, приложение начинает очень быстро и много писать в лог, вследствие чего заканчивается место на жёстком диске быстрее, чем это обнаружит мониторинг.
- Два тоннеля: Вынесение новой функциональности в отдельное приложение вместо расширения уже имеющегося. Чаще всего применяется, когда по каким-либо причинам (в основном, при нехватке времени либо нежелании менеджмента) внесение изменений в уже имеющийся код требует больших затрат, чем создание нового. При этом у клиента в конечном итоге работают два приложения, запускаясь одновременно либо попеременно друг из друга.
- Коммит-убийца (Commit assasin): Внесение отдельных изменений в систему контроля версий без проверки влияния их на другие части программы. Как правило, после подобных коммитов работа коллектива парализуется на время исправления проблем в местах, которые ранее работали безошибочно.
Антипаттерны управления конфигурацией
[править | править код]- Ад зависимостей (Dependency hell, на платформе Microsoft Windows также называется «DLL hell», «DLL-ад»): Разрастание графа взаимных зависимостей программных продуктов и библиотек, приводящее к сложности установки новых и удаления старых продуктов. В сложных случаях различные установленные программные продукты требуют наличия разных версий одной и той же библиотеки. В наиболее сложных случаях один продукт может косвенно потребовать сразу две версии одной и той же библиотеки.
Разные
[править | править код]- Дым и зеркала (Smoke and mirrors[13]): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми фокусники скрывают свои секреты).
- Раздувание ПО (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов.
- Функции для галочки: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в рекламе, что функция есть).
Архитектурные антипаттерны
[править | править код]Типичные проблемы, связанные со структурой системы[6]:
- Инверсия абстракции (Abstraction inversion): Сокрытие части функциональности от внешнего использования, в надежде на то, что никто не будет её использовать.
- Неопределённая точка зрения (Ambiguous viewpoint[13]): Представление модели без спецификации её точки рассмотрения.
- Большой комок грязи (Big ball of mud): Система с нераспознаваемой структурой.
- Блоб (Blob[13]): см. Божественный объект (God object).
- Бензиновая фабрика (Gas factory): Необязательная сложность дизайна.
- Затычка на ввод данных (Input kludge[13]): Забывчивость в спецификации и выполнении поддержки возможного неверного ввода.
- Раздувание интерфейса (Interface bloat): Разработка интерфейса очень мощным и очень сложным для реализации.
- Волшебная кнопка (Magic pushbutton): Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, в системах типа Delphi это написание прикладной логики в обработчиках нажатий на кнопку.
- Перестыковка (Re-Coupling): Процесс внедрения ненужной зависимости.
- Дымоход (Stovepipe System[13]): Редко поддерживаемая сборка плохо связанных компонентов.
- Состояние гонки (Race hazard, Race condition): непредвидение возможности наступления событий в порядке, отличном от ожидаемого.
- Членовредительство (Mutilation): Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами.
- Сохранение или смерть (Save or die): Сохранение изменений в конфигурации на жесткий диск лишь при завершении приложения; приводит к тому, что в случае отказа в программе эти данные будут утеряны
Организационные антипаттерны
[править | править код]Проблемы, с которыми встречаются менеджеры (или группы менеджеров)[6]:
- Аналитический паралич (Analysis paralysis)[13]: неоправданно большие затраты на анализ и проектирование. Часто приводит к закрытию проекта до начала его реализации.
- Дойная корова[англ.] (Cash cow): при наличии продукта, приносящего выгоду без существенных вложений, не вкладываются средства в развитие и разработку новых продуктов.
- Продолжительное устаревание[англ.] (Continuous obsolescence)[13]: выделение непропорционально больших усилий на портирование системы в новые окружения.
- Сваливание расходов (Cost migration): перенос расходов на проект к слабому отделу или бизнес-партнёру.
- Раздутый улучшизм (Creeping featurism): добавление новых улучшений в ущерб суммарному качеству системы.
- Раздутый элегантизм[англ.] (Creeping elegance): непропорциональное улучшение красивости кода в ущерб функциональности и суммарному качеству системы.
- Разработка комитетом (Design by committee)[13]: разработка проекта без централизованного управления или без компетентного руководства.
- Неуёмная преданность[англ.] (Escalation of commitment): продолжение реализации решения после того, как доказана его ошибочность.
- Я тебе это говорил (I told you so): игнорирование мнения эксперта.
- Управление, основанное на числах (Management by numbers): излишнее внимание к численным показателям, имеющим очень косвенное отношение к управляемой системе, сложным для получения, либо подверженным эффекту Гудхарта.
- Драконовские меры (Management by perkele): неоправданно жесткий стиль управления.
- Управление грибами[англ.] (Mushroom management)[13]: недостаточное информирование работников о выполняемой работе.
- Расползание рамок[англ.] (Scope creep): потеря контроля над разрастанием проекта.
- Привязка к поставщику (Vendor lock-in)[13]: жёсткая привязка к поставщику.
- Единственный знающий человек (Single head of knowledge, SHOK): когда жизненно важными для проекта сведениями или навыками обладает только один человек в команде, а с его уходом работа останавливается.
- Рыцарь на белом коне (Knight in shining armor, KISA): когда на сцене появляется человек, который пытается починить всё, не сообщая никому, что он сделал и почему.
Нейл и Лапланте приводят следующие антипаттерны[5]:
- Заочный менеджер (Absentee Manager): менеджер ведет себя уклончиво или невидим в течение длительного времени — он прячется где-то в офисе или вдали от офиса.
- Иметь только молоток (All You Have Is A Hammer): однонаправленное управление, где одни и те же приемы используются на всех подчиненных и во всех ситуациях. Иногда также называется «One-Trick Pony».
- Дикий менеджер (Cage Match Negotiator): любой менеджер, который упрям не по разуму и использует подход к управлению «Победа любой ценой» или «Я прав, а вы нет». У них часто есть кофейная кружка с «Правилами управления»: «Правило № 1: Босс всегда прав. Правило № 2: Если босс не прав, см. Правило № 1».
- Доппельгангер (Doppelganger): менеджер или коллега, с которым то легко работать, то трудно.
- Бесплодные прыжки (Fruitless Hoops): вы готовите для менеджеров всё новые и новые данные, нужные им для принятия решения, но менеджеры так и не принимают никакого решения, продолжая запрашивать у вас данные. Вы не знаете, зачем им нужны эти данные.
- Золотой ребёнок (Golden Child): «Золотой ребенок» появляется в ситуациях, когда менеджер предоставляет особую ответственность, возможность, признание или вознаграждение члену своей команды на основе личных взаимоотношений с ним и вопреки его действительным действиям. Всех раздражает «Золотое дитя», но настоящая проблема заключается в менеджере.
- Безглавая курица (Headless Chicken): менеджер без фокуса и плана, который никогда ничего не заканчивает.
- Лидер не менеджер (Leader Not Manager): подчеркивает важность эффективного руководства.
- Менеджер попугай (Managerial Cloning): менеджеры среднего звена, начинающие со временем вести себя, как их начальники.
- Менеджер не лидер (Manager Not Leader): такой менеджер хорошо справляется с административными и управленческими обязанностями, но не обладает лидерскими способностями.
- Злоупотребление метриками (Metric Abuse): неправильное использование метрик из-за некомпетентности или умышленного манипулирования данными.
- Классный чувак (Mr. Nice Guy): менеджер, который сосредотачивается на том, чтобы быть другом каждого, в конечном итоге разочаровывает всех и не справляется со своими обязанностями.
- Управление грибами (Mushroom Management): ситуация, в которой руководство не может эффективно общаться с персоналом. По сути, информация намеренно скрывается, чтобы все были «толстыми, глупыми и счастливыми». Название связано с аналогией: шампиньоны выращивают в темноте и в навозе.
- Полирование тарелок (Plate Spinning): менеджер скрывает свою неэффективность, заставляя работников заниматься трудоёмкой и бесполезной работой.
- Герой пролетариата (Proletariat Hero): менеджер ведёт себя с подчинёнными, как с идеальными работниками, но это лишь его опора, используемая для маскировки плохого управления. Это форма «мотивации» персонала, которая дает повод руководству повысить ожидаемые результаты или получить больше с меньшими затратами.
- Звёздный выскочка (Rising Upstart): суперзвезды, которые не могут терять время на обучение и поиск своего места. Иногда это может быть из-за невежества (они не знают, чего не знают), а иногда из-за нетерпения (они знают то, чего не знают другие). Такой выскочка представляет настоящий вызов для всех, кроме самых опытных менеджеров.
- Дорога в никуда (Road to Nowhere): Отсутствие плана вызывает замешательство и кризис руководства.
- Бесхребетный руководитель (Spineless Executive): любой менеджер, который не имеет смелости вступить в необходимую конфронтацию или справиться со сложной ситуацией. Вместо этого он полностью избегает конфронтации или ситуации или просит вас сообщить ему плохие новости.
- Трёхглавый рыцарь (Three-Headed Knight): нерешительный менеджер.
- Абсолютный инструмент (Ultimate Weapon): менеджер объявляет, что все могут положиться на выдающихся сотрудников настолько, что эти сотрудники станут проводником всего.
- Тёплое тело (Warm Bodies[13]): управленческая ситуация, в которой работник, который едва соответствует минимальным требованиям, перемещается от проекта к проекту или от команды к команде. Слабый работник называется «теплым телом», хотя настоящая проблема заключается в менеджере. Этот антипаттерн является противоположностью «Звёздного выскочки» в отношении навыков и потенциала.
Антипаттерны обстановки
[править | править код]Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики[15][6][5][16]:
- Муравейник (Ant Colony) — под внешней красотой скрывается насаждение целей[прояснить].
- Атлант расправляет плечи (Atlas Shrug) — после временного успеха начинается спад[прояснить].
- Автономный коллектив (Autonomous Collective) — самоуправление приводит к пассивности[прояснить].
- Синдром варёной лягушки (Boiling Frog Syndrome) — постепенные отрицательные изменения замечают, когда уже поздно.
- Горящий мешок навоза (Burning Bag of Dung) — менеджер оставляет соседей (смежников, подопечных, преемника) в щекотливой ситуации.
- Увлечение модными словами (Buzzword Mania) — руководство жонглирует словами, которые мало кто из подопечных понимает.
- Сдутый шарик (Deflated Balloon) — лучшие годы компании позади, но она не может этого осознать и снизить расходы.
- Различные цели (Divergent Goals)[прояснить]
- Дисфункция, возведённая в догму (Dogmatic About Dysfunction)
- Непоколебимое мужество (Dunkirk Spirit)[прояснить]
- Новое платье короля (Emperor’s New Clothes) — по одноимённой сказке
- Доктрина справедливости (Fairness Doctrine)[прояснить]
- Поспешишь — людей насмешишь (Fools Rush In)[прояснить]
- Болезнь основателя (Founderitis)[прояснить]
- Дедовщина (Geek Hazing) — начинающих загружают большим количеством тривиальных задач, которые не помогают им учиться.
- Институциональное недоверие (Institutional Mistrust)[прояснить]
- Город ларьков (Kiosk City) — каждый отдел вырабатывает свой собственный механизм обмена информацией.
- Власть серости (Mediocracy)
- Одноглазый король (One-Eyed King)[прояснить]
- Экономика лотка с апельсинами (Orange Stand Economics) — плохая оценка расходов.
- Остров Питкэрн (Pitcairn Island)[прояснить]
- Потёмкинские деревни
- Противоречивые процессы (Process Clash)[прояснить]
- Кубик рубика (Rubik’s Cube)[прояснить]
- Сапожник без сапог (Shoeless Children)[прояснить]
- Золотой телец (Worshipping the Golden Calf)[прояснить]
См. также
[править | править код]Примечания
[править | править код]- ↑ Budgen, D. Software design. — Addison-Wesley, 2003. — ISBN 0-201-72219-4.
- ↑ Brown, 1998, Chapter 2.
- ↑ Smith C. U., 2000.
- ↑ http://c2.com/cgi/wiki?AntiPattern . Cunningham & Cunningham, Inc.. Дата обращения: 15 февраля 2006. Архивировано 3 апреля 2005 года.
- ↑ 1 2 3 Neill, Laplante, 2005.
- ↑ 1 2 3 4 5 6 Settas, 2011.
- ↑ Miroslav Kis. Information security antipatterns in software requirements engineering. In Proceedings of the 9th Conference on Pattern Language of Programs (Plop), 2002.
- ↑ John Long. Software reuse antipatterns. In ACM SIGSOFT Software Engineering Notes, volume26, page 4, July 2001.
- ↑ Paula Kotze, Karen Renaud, and Judy van Biljona. Don’t do this — pitfalls in using anti-patterns in teaching human-computer interaction principles. Computers and Education, 50(3):979-1008, April 2008
- ↑ J. Krai and M. Zemlicka. The most important service-oriented antipatterns. In proceedings of the International Conference on Software Engineering Advances (ICSEA), 2007.
- ↑ P.A. Laplante, R.R. Hoffman, and G. Klein. Antipatterns in the creation of intelligent systems. IEEE Intelligent Systems, 22:91-95, 2007.
- ↑ 1 2 Rajiv Ramnath, Cheyney Loffing. Beginning IOS Programming For Dummies. — John Wiley & Sons, 2014-04-14. — С. 105. — 470 с. — ISBN 9781118799277. Архивировано 23 июля 2016 года.
- ↑ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 William J. Brown. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis. — Wiley, 1998-04-03. — 156 с. — ISBN 0−471−19713−0. Архивировано 22 декабря 2015 года.
- ↑ Gary McLean Hall. Adaptive Code via C#: Agile coding with design patterns and SOLID principles. — Microsoft Press, 2014. — С. 267—268. — ISBN 978-0735683204.
- ↑ В оригинале: socio-political forces
- ↑ Phillip Laplante The Burning Bag of Dung—and Other Environmental Antipatterns Архивная копия от 19 сентября 2015 на Wayback Machine ACM Queue November 30, 2004 Volume 2, issue 7
Литература
[править | править код]- Perl Design Patterns Book|Perl Design Patterns — A free online book and wiki
- William J. Brown, Raphael C. Malveau, Hays W. McCormick III, and Thomas J. Mowbray. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis. — John Wiley & Sons, 1998. — ISBN 0471197130.
- William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. AntiPatterns and Patterns in Software Configuration Management. — Wiley, 1999. — ISBN 978-0-471-32929-9.
- William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. AntiPatterns in Project Management. — Wiley, 2000. — ISBN 978-0-471-36366-8.
- Neal Ford, Matthew McCullough, Nathaniel Schutta. Presentation Patterns: Techniques for Crafting Better Presentations. — Addison-Wesley, 2012-08-15. — 395 с. — ISBN 9780132963374.
- Chad Pytel, Tammer Saleh. Rails AntiPatterns: Best Practice Ruby on Rails Refactoring. — Addison-Wesley Professional, 2010-11-09. — 347 с. — ISBN 9780132660068.
- Neill, Colin J. 9.1.2 Antipatterns in Systems Engineering: An Opening Trio (англ.) // INCOSE International Symposium. — 2012. — Vol. 22, no. 1. — P. 1233—1245. — ISSN 2334-5837.
- Colin J. Neill, Philip A. Laplante. Antipatterns: Identification, Refactoring, and Management. — CRC Press, 2005. — ISBN 978-1-4200-3124-9.
- Dimitrios Settas. Software project antipattern knowledge management (doctoral thesis). — Thessaloniki, Greece: Aristotle University, 2011.
- Аллен Э. Типичные ошибки проектирования. — Издательский дом «Питер», 2003. — 224 с. — ISBN 5-887827-304-6.
- Smith C. U., Williams L. G. Software Performance AntiPatterns (англ.) // 2nd International Workshop on Software and Performance. — 2000.
Ссылки
[править | править код]- Tutorial on anti-patterns
- Anti-patterns catalog
- Worse Than Failure
- SourceMarking
- Перевод статьи «Resign Patterns» — Проломы проектно-дезориентированного проектирования — пародии на книгу «Банды четырёх»
- Perl Design Patterns book
- The Diaper Pattern Stinks
- Большой список антипаттернов на русском
Для улучшения этой статьи желательно:
|