Информационные списки

Антипаттерн: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Добавление ссылок на электронные версии книг (20210523)) #IABot (v2.0.8) (GreenC bot
отмена правки 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-х годов приобрели значительную популярность каталоги [[Шаблон проектирования|шаблонов проектирования]] (англ. design patterns) — элегантных и проверенных на практике способов решения типичных проблем. Паттерны и на сегодняшний день являются мощными и чрезвычайно популярны, однако многие разработчики, используя популярные паттерны в ситуациях, к которым они не приспособлены, делали программы крайне неэффективными, порождали гораздо больше проблем, чем было в проекте перед использованием паттерна. Кроме того, у ИТ-инженеров, как и у работников любой сферы деятельности, можно выделить типичные ошибки, обусловленные недостаточной базой знаний или отсутствием опыта у программиста, сжатыми сроками сдачи проекта, финансовыми ограничениями и прочим.
С развитием ИТ-индустрии масштабы программных проектов и затраты ресурсов на них стремительно росли, что порождало большое количество проблем, что вставали перед программистами. Большинство этих проблем были типичными и встречались практически в каждом крупном проекте. В начале 90-х годов приобрели значительную популярность каталоги [[Шаблон проектирования|шаблонов проектирования]], «паттернов» ({{lang-en|design patterns}}) — элегантных и проверенных на практике способов решения типичных задач. Паттерны и на сегодняшний день являются мощными и чрезвычайно популярны, однако многие разработчики, используя популярные паттерны в ситуациях, для которых они не предназначены, порождали этим больше проблем, чем решали. Кроме того, у ИТ-инженеров, как и у работников любой другой сферы деятельности, можно выделить типичные совершаемые ошибки, обусловленные недостаточной базой знаний или отсутствием опыта, спешкой и оказываемым давлением из-за сроков сдачи проекта, финансовыми ограничениями и прочим.


Впервые термин «Антипаттерн» в смысле формальной модели типичного неудачного решения используется в 1996 году Майклом Эйкройдом (англ. 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 = }}</ref> В своей презентации «Антипаттерны: предотвращение неправильного использования объектов» Эйкройд обращал внимание на вредные, но частые программные конструкции, в частности, те, что противоречат принципам ООП. К тому же, для каждой такой конструкции он предлагал эффективную замену.
Впервые термин «антипаттерн» в смысле обобщенного описания типичного неудачного решения был применен в 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|страницы = 267-268|страниц = |isbn = 978-0735683204}}</ref>): Объединение нескольких [[Интерфейс (объектно-ориентированное программирование)|интерфейсов]], разделенных согласно принципу изоляции интерфейсов (Interface segregation), в один.
* [[Каша из интерфейсов]] (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): любой менеджер, который упрям не по разуму и использует подход к управлению «Победа любой ценой» или «Я прав, а вы нет». У них часто есть кофейная кружка с «Правилами управления»: «Правило №1: Босс всегда прав. Правило №2: Если босс не прав, см. Правило №1».
* [[Дикий менеджер]] (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>:
Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики<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|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]:

Антипаттерны разработки

[править | править код]

Технические проблемы и решения, с которыми имеют дело программисты[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]:

Нейл и Лапланте приводят следующие антипаттерны[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]:

Примечания

[править | править код]
  1. Budgen, D. Software design. — Addison-Wesley, 2003. — ISBN 0-201-72219-4.
  2. Brown, 1998, Chapter 2.
  3. Smith C. U., 2000.
  4. http://c2.com/cgi/wiki?AntiPattern. Cunningham & Cunningham, Inc.. Дата обращения: 15 февраля 2006. Архивировано 3 апреля 2005 года.
  5. 1 2 3 Neill, Laplante, 2005.
  6. 1 2 3 4 5 6 Settas, 2011.
  7. Miroslav Kis. Information security antipatterns in software requirements engineering. In Proceedings of the 9th Conference on Pattern Language of Programs (Plop), 2002.
  8. John Long. Software reuse antipatterns. In ACM SIGSOFT Software Engineering Notes, volume26, page 4, July 2001.
  9. 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
  10. J. Krai and M. Zemlicka. The most important service-oriented antipatterns. In proceedings of the International Conference on Software Engineering Advances (ICSEA), 2007.
  11. P.A. Laplante, R.R. Hoffman, and G. Klein. Antipatterns in the creation of intelligent systems. IEEE Intelligent Systems, 22:91-95, 2007.
  12. 1 2 Rajiv Ramnath, Cheyney Loffing. Beginning IOS Programming For Dummies. — John Wiley & Sons, 2014-04-14. — С. 105. — 470 с. — ISBN 9781118799277. Архивировано 23 июля 2016 года.
  13. 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 года.
  14. Gary McLean Hall. Adaptive Code via C#: Agile coding with design patterns and SOLID principles. — Microsoft Press, 2014. — С. 267—268. — ISBN 978-0735683204.
  15. В оригинале: socio-political forces
  16. Phillip Laplante The Burning Bag of Dung—and Other Environmental Antipatterns Архивная копия от 19 сентября 2015 на Wayback Machine ACM Queue November 30, 2004 Volume 2, issue 7

Литература

[править | править код]