<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD</id>
	<title>Анти-паттерн - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD"/>
	<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD&amp;action=history"/>
	<updated>2026-11-04T09:23:29Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://t8.lbstr.eu/index.php?title=%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD&amp;diff=6378&amp;oldid=prev</id>
		<title>imported&gt;Junkiekun в 19:49, 16 апреля 2020</title>
		<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD&amp;diff=6378&amp;oldid=prev"/>
		<updated>2020-04-16T19:49:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{95%}} &lt;br /&gt;
[[Файл:Swing project.png|thumb|Пример активного применения анти-паттернов в проекте.]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Анти-паттерн&amp;#039;&amp;#039;&amp;#039; (от англ. &amp;#039;&amp;#039;anti-pattern&amp;#039;&amp;#039;; он же ловушка, англ. &amp;#039;&amp;#039;pitfall&amp;#039;&amp;#039;) — это то, как поступать не надо, но как всё равно все, всегда и повсюду поступают, сколько их ни предупреждают. Потому как [[дедлайн]]ы. Потому как бизнес. Потому как долбоёбы.&lt;br /&gt;
&lt;br /&gt;
Термин пришел из информатики, из книги «Банды четырёх» «[[:w:Design Patterns|Шаблоны проектирования]]», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «шаблонами (паттернами) проектирования», а антиподами им и являются, соответственно, «анти-паттерны». В принципе, анти-паттерны применимы не только в ИТ, но и в любой другой области человеческой деятельности.&lt;br /&gt;
&lt;br /&gt;
== Анти-паттерны программирования ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Жёсткий код&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;hard code&amp;#039;&amp;#039; — про него ещё говорят «прибито гвоздями». Код настолько привязан к конкретной аппаратной конфигурации и/или системному окружению, что оторвать его для переноса в другое место можно только [[:w:Рефакторинг|гвоздодёром]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Мягкий код&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;soft code&amp;#039;&amp;#039; — почти то же, что мягкий стул, или, техническим языком, код, конфигурируемый настолько гибко (и запутано), что хочется, чтобы лучше уж это был &amp;#039;&amp;#039;hard code&amp;#039;&amp;#039;. Возникает вследствие выноса в файлы конфигурации программной логики, что в разумных количествах, к слову, бывает иногда оправданно.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Магические числа&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;magic numbers&amp;#039;&amp;#039; — то, на чём нередко строится &amp;#039;&amp;#039;hard code&amp;#039;&amp;#039;. Всяческие константы в программе без пояснения их физического (или любого иного) смысла. Как правило, при изменении магического числа или его удалении код магически перестаёт работать вовсе. Типичные примеры — 17 и 54.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Магические строки&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;magic strings&amp;#039;&amp;#039; — как магические числа, но только это строки.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Магическая кнопка&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;magic button&amp;#039;&amp;#039; — весь код написан в обработчике нажатия кнопки. Этим страдают на всех языках с графическим редактором гуя — C#, делфи.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Гонки&amp;#039;&amp;#039;&amp;#039;, англ. &amp;#039;&amp;#039;race condition&amp;#039;&amp;#039;, &amp;#039;&amp;#039;race hazard&amp;#039;&amp;#039; — начинаются тогда, когда программист попадает в чудный мир параллельного программирования с его нитями, потоками и семафорами.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ненужная сложность&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;accidental complexity&amp;#039;&amp;#039; — делать сложно то, что можно сделать просто. Как правило, программисту хочется побыстрее применить всё, что он изучил (и воон ту новую библиотеку для обмена данными по протоколу XXX), а ещё заполучить по результатам проекта сразу много новых строчек в резюме. Если это желание побеждает [[Бритва Оккама|доводы рассудка]], то в проекте появляется &amp;#039;&amp;#039;accidental complexity&amp;#039;&amp;#039;. Также см. статьи [[Индусский код]] и [[KISS]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Спагетти&amp;#039;&amp;#039;&amp;#039; (рус. солянка) из кода, от англ. &amp;#039;&amp;#039;code spaghetti&amp;#039;&amp;#039; — это тот самый код, который вам однажды дают сопровождать и после пяти минут &amp;lt;del&amp;gt;причёсывания вставших дыбом волос&amp;lt;/del&amp;gt; просмотра которого вы молча закрываете редактор и открываете броузер на хуехантере.ру в поисках вакансии в более другой фирме, где не практикуют такого жестокого обращения с программистами. Характеризуется тем, что в одном куске кода описывается куча перемешанных до полного непонимания сущностей, которые по-хорошему необходимо разделять. Например, HTML теги в PHP коде вместо выноса всей верстки в шаблоны.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Катамари&amp;#039;&amp;#039;&amp;#039; — внедрение новых возможностей исключительно в виде внешних костылей и подпорок вместо периодического пересмотра базового функционала. В итоге со временем код превращается в тугой комок какого-то нечта, в чём даже сами разработчики отказываются ковыряться. В итоге получаем следующую порцию костылей и подпорок. Может применяться как в отдельно взятом фрагменте кода, так и глобально во всём проекте.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Божественный Объект&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;God Object&amp;#039;&amp;#039; — небольшая часть кода, где сконцентрировано всё. Буквально всё. Возможно, там даже прячется [http://books.rusf.ru/unzip/add-on/xussr_av/azov_m11.htm?1/1 немаленьких размеров галактика]. Весь прочий код программы — исключительно декорация вокруг Божественного Объекта.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Детонатор&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;detonator&amp;#039;&amp;#039; — очень распространён, но редко обнаруживаем. Наглядный пример: использование в вычислениях с датами [[Проблема 2000|поля из двух цифр]]. Бомба заложена, и [http://ithappens.ru/story/10931 детонатор рано или поздно сработает]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Не-виноватая-я&amp;#039;&amp;#039;&amp;#039;, англ. &amp;#039;&amp;#039;absolver&amp;#039;&amp;#039; — паттерн встречается в коде, написанном бывшими сотрудниками компании. В таком коде заключено столько старых проблем, что теперешние сотрудники могут защитить свои наработки от обвинений, утверждая, что именно чужой код — причина всех возникающих ошибок. Также известен под именем &amp;#039;&amp;#039;Это-Не-Моя-Правка&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Исторический вклад&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;stake&amp;#039;&amp;#039; — паттерн имеет место в программе, написанной сотрудником, который впоследствии получил продвижение по службе. Несмотря на изобилие ошибок в программе, вклад этого сотрудника слишком велик, чтобы позволить кому-либо начать переписывать код, поскольку он является апофеозом технических достижений этого товарища.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Павлик Морозов|Паблик Морозов]]&amp;#039;&amp;#039;&amp;#039; (сугубо русская идиома, нет английского эквивалента) — класс, который по запросу выдаёт доступ ко всем, даже приватным, свойствам класса-родителя. Не столько плохо само по себе, сколько означает, что в коде что-то не так.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Спасти рядового Райана&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;Private Ryan&amp;#039;&amp;#039; — паттерн, в котором доступ к полю получить в принципе можно, но для этого надо [http://habrahabr.ru/blogs/java/75661/ снаряжать экспедицию], сопряженную со множеством опасностей.&lt;br /&gt;
&lt;br /&gt;
== Анти-паттерны системного администрирования ==&lt;br /&gt;
&lt;br /&gt;
Специально для сисадминов есть два антипаттерна, в которые они попадают в зависимости от своей специализации.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ад зависимостей&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;dependency hell&amp;#039;&amp;#039; — для [[unix|юниксовых]] сисадминов. Прямо проистекает из того факта, что строители юниксовых дистрибутивов (в первую очередь [[Linux|линупсов]]) однажды возгордились и решили &amp;lt;del&amp;gt;возвести Вавилонскую башню&amp;lt;/del&amp;gt; упорядочить весь линуксовый софт, так, чтобы одна программа в дистрибутиве не мешала другой. Последствия этой попытки пользователи порой ощущают в виде «циклических зависимостей» и прочих дорожек в &amp;#039;&amp;#039;dependency hell&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ад DLL&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;DLL hell&amp;#039;&amp;#039; — персонально для сисадминов [[Windows]]. Проблема является частным случаем &amp;#039;&amp;#039;ада зависимостей&amp;#039;&amp;#039;, применительно к формату библиотек (DLL) в [[Windows]], особенно в старых версиях этой системы.&lt;br /&gt;
&lt;br /&gt;
== Организационные анти-паттерны ==&lt;br /&gt;
&lt;br /&gt;
Есть такое искусство — «[http://flibusta.is/b/112072/read пасти котов]», или, скучно выражаясь, управление программистами. Рисование всяких там диаграммок Ганта и прочей псевдонаучной лабуды, которую потом все дружно игнорируют. Этим занимаются менеджеры. Не секрет, что в менеджеры уходят те, кто в ИТ пришёл к своему финишу, постарел и отупел, чтобы писать код и ваять вечное, а может быть, и вовсе кроме [[Word|ворда]] и аутлука ничем не пользовался и потому подался сразу &amp;lt;del&amp;gt;в управдомы&amp;lt;/del&amp;gt; управлять людьми. Поэтому антипаттерны в этой области просто-таки цветут пышным цветом. Дополнительную дезорганизацию в организацию разработки порой привносят сами разработчики, помогая менеджерам во внедрении анти-паттернов.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Управление [[гриб]]ами&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;mushroom management&amp;#039;&amp;#039; — метод управления подчиненными по принципу: вы все муравьи, а я муравейник! Английский лозунг грибного менеджера — «{{Acronym|we keep them in the dark and feed them a steady diet of manure|держим в темноте и кормим исключительно навозом}}» (Richard Henderson). Менеджер всячески &amp;lt;del&amp;gt;окучивает грибы&amp;lt;/del&amp;gt; убеждает подчинённых в том, что кроме их непосредственных заданий, им не надо ничего знать, а утруждать мозги думами о проекте в целом — исключительно манагерский удел. Для внедрения данного метода следует разбить проект на несобираемые кусочки паззла, чтобы никто не понимал, что из них можно собрать вообще и затем выдавать каждому эти кусочки в достаточных количествах, чтобы грибы [[Сумрачный гений|перманентно были заняты работой и не отвлекались на раздумья]] «а на уя вообще мы делаем именно так?». Как правило, грибной менеджмент приводит к полностью [[epic fail|провальным финалам]], поскольку менеджер сам забывает (либо изначально не понимает), к чему и зачем идёт проект. Что любопытно, грибной менеджмент практикуют не только менеджеры, но и отдельные программисты, очутившись на ролях старших в проекте. Как правило, это индикатор неквалифицированных программистов, боящихся раскрывать коллегам те немногие знания, которыми они обладают — чтобы не обнаружилось, насколько эти знания малы. Та же причина справедлива и для менеджеров.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Чайка-менеджер&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;seagull management&amp;#039;&amp;#039; или &amp;#039;&amp;#039;corporate seagull&amp;#039;&amp;#039; — распространённый подкласс менеджеров, действующих в следующей последовательности: прилетел, поорал и улетел, оставив за собой кучки проектного дерьма, которые потом, матерясь, подчищают подчинённые. По поведению напоминают &amp;lt;del&amp;gt;морских ворон&amp;lt;/del&amp;gt; чаек, парящих гордо между тучами и морем и прилетающих на берег с целью быстро пожрать и попутно опорожнить кишечники, за что они (менеджеры) и переняли данное наименование. Самый бестолковый для проектной деятельности тип, но начальство их любит, так как &amp;#039;&amp;#039;корпоративные чайки&amp;#039;&amp;#039; умеют громко &amp;lt;del&amp;gt;хлопать крыльями&amp;lt;/del&amp;gt; заявлять о себе, выдавая копеечную деятельность за великие свершения. Живучи, их сложно поймать на ошибках, так как ошибок они не совершают (поскольку, как известно, для этого нужно хоть что-то делать).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Разработка комитетом&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;design by commitee&amp;#039;&amp;#039; — аналог пословицы «у семи нянек дитя без глазу» применительно к ИТ. Раздувается в гигантские нежизнеспособные стандарты и спецификации с over 9000 уровней абстракции, которые потом всё равно никто не реализует. Примеры — модель OSI{{Lolwhat}}&amp;lt;!-- не реализует? а tcp/ip это что? --&amp;gt; и CORBA.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Аналитики-паралитики&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;analysis paralysis&amp;#039;&amp;#039; — проект застревает на стадии анализа задачи, в бесконечных спорах «как делать лучше». В результате получается вообще никак.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Рыцарь на белом коне]]&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;РНБК&amp;#039;&amp;#039;&amp;#039;), от англ. &amp;#039;&amp;#039;Knight in shining armor&amp;#039;&amp;#039; (&amp;#039;&amp;#039;[[Кошка|KISA]]&amp;#039;&amp;#039;) — непогрешимая личность, с ЧСВ, равным как минимум квадрату собственной технической квалификации. Появляется на сцене в кризисный момент и начинает чинить всё подряд, как правило — чинит успешно, только без сообщений о том, какие изменения он сделал, и почему. Так что при очередном обновлении системы ничего не подозревающим сисадмином старые ошибки возвращаются на свои места, что даёт повод РНБК заявлять о тупости и некомпетентности окружающих, что ещё более увеличивает его ауру непогрешимости.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Аврал!&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;Tempest Method&amp;#039;&amp;#039; — применяется не ранее, чем за несколько дней до сдачи проекта. При этом пограммисты начинают в срочном порядке генерировать код без комментариев и содержащий в себе связки бомб с &amp;#039;&amp;#039;детонаторами&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Охота на ведьм&amp;#039;&amp;#039;&amp;#039;, от англ. &amp;#039;&amp;#039;witch hunt&amp;#039;&amp;#039; — попытки отыскать [[козёл отпущения|козла отпущения]] после успешного внедрения анти-паттернов выше, но поскольку проблем это не решает, результатом будет являться отстрел всё новых и новых козлов отпущения. В финале игры должен оставаться только один — &amp;lt;del&amp;gt;Duncan McLeod&amp;lt;/del&amp;gt; менеджер на белом коне, с подтверждениями некомпетентности предыдущей команды и уверениями руководства фирмы в том, что новая команда под его руководством достигнет небывалых проектных успехов.&lt;br /&gt;
&lt;br /&gt;
== Антихитрожопость ==&lt;br /&gt;
&lt;br /&gt;
Как говорил [[гуру|рядовой программист]] Э. Дейкстра: «Компетентный программист полностью осознает строго ограниченные возможности своего черепа, поэтому подходит к задачам программирования со всей возможной скромностью».&lt;br /&gt;
&lt;br /&gt;
Заблуждения по поводу потенциала мозга руководителя или программиста являются перманентным источником антипаттернов.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Раскрытие потенциала технологии на 110%&amp;#039;&amp;#039;&amp;#039;. Быстрое развитие платформ, средств разработки и их зарастание возможностями туманит мозги рядовому кодеру, который предполагает, что если он не будет писать код с десятью операторами на строку, использовать все возможные варианты генераторов, шаблонов, тегов, тонкие нюансы работы интерпретатора и низкосистемные хаки, то коллеги сочтут его полным [[школота|junior]]&amp;#039;ом. Но, как правило, все получается ровно таки наоборот и каждая хитрожопость в коде с лихвой аукается при дальнейшей поддержке продукта, не говоря про то, что бедные разработчики платформ, сред и библиотек кучу фич включают просто для галочки, не уделяя им соответствующее внимание. При этом простых и понятных дедушкиных подходов, которые не обязательно означают [[Квадратно-гнездовой способ мышления|квадратно-гнездовой подход]], обычно с лихвой хватает для решения подавляющего большинства задач.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Манипулирование сроками&amp;#039;&amp;#039;&amp;#039;. Любому [[сказочный долбоеб|эффективному руководителю]] рано или поздно приходит в голову мысль, а не стоит ли назвать разработчикам срок в 3,14 раз меньше оценочного, чтобы пошевеливались, хотя, если инвестиции затуманили его мозг, то в 3,14 раза больше, чтобы в этот раз ну точно успеть к [[анальная кара|дедлайну]]. Мысль о том, что все будет относительно хорошо, только если план работ соотносится с оценкой объема работ, считается слишком банальной и не достойной настоящего гуру руководства. Как следствие — множество проектов заканчивается феерически.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Экономия&amp;#039;&amp;#039;&amp;#039;. Так как заказчик часто желает получить золотой замок за ведро пожухлого говна, то встает вопрос об экономии. Истинная хитрожопость диктует, что вместо того, чтобы сократить слой позолоты в два раза (обрезать фичи и требования), лучше сократить проектирование, прототипирование, внутренние конвенции, тесты, автотесты, команду разработчиков и прочие вещи, которые все равно не получается делать по-человечески. Разумеется, ответ на [[Взлетит или не взлетит?|ключевой вопрос]] [[хуй|очевиден]], так как на заводе для производства денатурата никак не удастся изготовить бочонок шотландского виски, что все вроде как головой понимают, но в душе все равно хотят.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Раскрытие кадрового потенциала на 110%&amp;#039;&amp;#039;&amp;#039;. В голову среднестатистического эффективного проджект-менеджера никак не укладывается, что программиста, написавшего в день десять строк, вполне можно назвать нормально поработавшим, а сто годных, отлаженных и протестированных строк — поработавшим отменно. Это приводит его к мысли, что в качестве программиста можно посадить секретаршу, так как у нее скорость набора выше, но так как секретарша отказывается, [[Анальный|менеджерская]] логика подсказывает, что пора нагнетать панику, бегать со страпоном и всячески стимулировать процесс, дабы поиметь отдачу на 110%. В результате проект дохнет под собственным технологическом долгом (неудачные решения, неправильные оценки и тупо баги), не успев толком начаться. Правда, сам менеджер, как правило, двигает кони в первых рядах, а команда разработчиков, поправив резюме, на следующий же день переползает в какие-то другие конторы в надежде на лучшее.&lt;br /&gt;
&lt;br /&gt;
== Гиперссылки ==&lt;br /&gt;
* [http://c2.com/cgi/wiki?AntiPatternsCatalog Большой неиллюстрированный каталог анти-паттернов (англ.)]&lt;br /&gt;
* [http://web.archive.org/web/20130320175826/http://dou.ua/lenta/articles/resign-patterns/ Проломы проектно-дизориентированного проектирования]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Языки программирования|Программизм}}&lt;br /&gt;
&lt;br /&gt;
[[w:Анти-паттерн]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Junkiekun</name></author>
	</entry>
</feed>