Источник: Nuances of Programming
Разработка нового программного обеспечения — дело непростое. Этот процесс включает в себя ряд шагов, и многое в нем может пойти не так. Чаще всего антишаблоны — следствие недостатка опыта или несоблюдения стандартов, хотя в некоторых случаях их причиной оказывается банальная лень.
Я сгруппировал основные антишаблоны по следующим категориям:
- Программистские антишаблоны.
- Архитектурные и конфигурационные антишаблоны.
- Методологические антишаблоны.
- Антишаблоны ветвления и слияния.
- Антишаблоны управления проектами.
Предлагаю рассмотреть каждую из них. Итак, начнем!
Программистские антишаблоны
Культ карго в программировании
Этот антишаблон является порождением “ритуального” (бездумного, чисто подражательного) включения кода или программных структур, которые не служат никакой реальной цели. Программист при этом не понимает допущенной ошибки.
Поток лавы
Этот антишаблон возникает, когда разработчик не удаляет нежелательный код (избыточный или некачественный), чтобы избежать лишних затрат или непредсказуемых последствий.
Ненужная сложность
Этот ошибочный шаблон обнаруживается при внесении в какое-либо решение ненужной сложности.
С моей точки зрения, ненужная сложность также возникает тогда, когда код переделывается с единственной целью — показать, что тот, кто его переписал, умнее остальных.
Лодочный якорь
Этот антишаблон похож на поток лавы. Он создается при сохранении частей системы, которые больше не являются полезными.
Спагетти-код
Этот антишаблон возникает, когда структура кода настолько запутана, что становится сложной для понимания и управления потоком.
Спагетти-код — один из самых распространенных антишаблонов.
Жесткое кодирование
Жесткое кодирование — это порочная практика, когда конфигурация или входные данные определяются в исходном коде, а не получаются из файла конфигурации или другого внешнего источника.
Главная проблема этой техники заключается в том, что она работает должным образом только в определенных условиях. При изменении условий требуется изменить исходный код, обычно в нескольких отдельных местах.
Полтергейст
Этой ошибкой грешит объектно-ориентированное программирование, когда определяются объекты, единственной целью которых является передача информации другому объекту.
Пакраттинг
Этот антишаблон часто вызван неопытностью разработчика, который не очищает память от зарезервированных объектов, которые больше не используются, а оставляет их на неопределенный срок, тем самым перегружая память.
Магические строки / числа
Этот антишаблон похож на жесткое кодирование, но в данном случае строки текста или цифры с затемненным смыслом разбросаны по всему коду. В результате код с магическими строками / числами сложно поддерживать, потому что никто не знает, к чему они относятся, даже тот, кто их туда поместил.
Кроме того, если понадобится изменить магические строки или числа, придется просмотреть весь код и изменить каждое место, где они появляются.
Сокрытие ошибок
Этот антишаблон возникает, когда, вместо того чтобы показать пользователю ошибку или исключение, их скрывают или выводят сообщение, в котором ничего не говорится о внештатной ситуации. Таким образом, некоторые программисты хотят избавить себя от лишних проблем.
Иногда сокрытие ошибок может быть полезно (к примеру, в тех случаях, когда нельзя раскрывать конкретную информацию). Но, как правило, это порочная практика, которую нужно изживать.
Антишаблоны архитектуры и конфигурации
JAR-каша
Этот антишаблон встречается, когда несколько файлов JAR (сокращение от “Java archive” — архив приложения на языке Java) с одинаковыми классами вызывают проблемы с управлением версиями и неожиданные результаты.
Например, недавно я увидел в старом java-проекте (разработанном с помощью apache ant) две разные версии Junit, рандомно вызывающие ошибки во время выполнения.
Каша из зависимостей
Этот антишаблон аналогичен предыдущему, только в данном случае проблемы возникают, когда некоторые классы зависят от одних и тех же общих пакетов или библиотек. При этом они зависят от разных и несовместимых версий.
Дымоход
Истоком этого антишаблона является создание в одной компании изолированных участков (“островков”), конфликтующих друг с другом.
Каждый такой “островок” может разрабатывать части системы, необходимые для удовлетворения своих потребностей, не согласовывая их с остальными “островками”.
Подразумеваемая архитектура
Причиной возникновения этого антишаблона является проектирование системы без документально оформленной архитектуры. Подобное часто происходит из-за чрезмерной самоуверенности проектантов, основанной на недавнем успехе.
Архитектура как требование
Этот антишаблон возникает, когда инструменты, фреймворки или библиотеки навязываются без обоснования, даже если они не являются лучшими вариантами. Причина такой стратегии, как правило, заключается в том, что лидер не хочет покидать зону комфорта.
Альянс с технологией или поставщиком
Рождение этого антишаблона связано с сильной зависимостью от поставщика, решения или технологии. Если подобный союз окажется неудачным, у разработчиков будет много проблем.
Методологические антишаблоны
Изобретение колеса заново
Этот антишаблон создается решением для того, что уже имеет четкое и проверенное решение.
Серебряная пуля / золотой молоток
Отправной точкой такого ошибочного шаблона является убеждение в универсальности одного решения, которое можно применить практически ко всему, независимо от его затратности.
Преждевременная оптимизация
Этот антишаблон сигнализирует о том, что время и ресурсы тратятся нерационально, до того, как получено достаточно информации.
Было бы разумней действовать оперативно (но продуманно), чтобы клиент мог заблаговременно убедиться в непродуктивности проекта.
Программирование посредством копирования-вставки
Этот антишаблон возникает при копировании (и/или легкой модификации) существующего кода вместо создания общих решений. К сожаленью, это то, с чем приходится сталкиваться все чаще и чаще.
Антишаблоны ветвления и слияния
Паранойя / фобия слияния
Этот антишаблон — спутник разработчиков, которые избегают слияния своего кода с репозиторием. Обычно это происходит из-за боязни последствий или из-за опасения того, что кто-то пересмотрит уже созданный код.
Слияние мегамонстров
Этот антишаблон возникает, когда разработчик откладывает объединение своих ветвей, насколько это возможно, и пытается объединить все ветви одновременно в конце процесса.
Как правило, при слиянии мегаветвей что-то теряется или вводится неверный код.
Чрезмерное ветвление
Создание множества ветвей без ясной причины.
Каскадирование ветвей / непрерывный каскад
Этот антишаблон сопутствует созданию ветвей, которые никогда не сливаются с основной ветвью.
Берлинская стена
Возникновение таких шаблонов — симптоматика плохой атмосферы в команде разработчиков, которые используют ветвление, чтобы отгородиться друг от друга вместо разделения выполняемой совместно работы.
Антишаблоны управления проектами
Дымовая завеса
Этот антишаблон свойственен командам разработчиков, менеджеры которых пускают пыль в глаза клиентам. Поэтому важно, чтобы команда разработчиков знала ожидания клиентов и вместе с руководителем проекта правильно ими управляла.
Кукурузный початок
Этот антишаблон возникает, когда разработчики с тяжелым характером (кукурузные початки) создают проблемы в команде своим деструктивным поведением.
Такие люди отвлекают от проекта и тормозят производственный процесс, отягощая его своими проблемами или разногласиями с другими членами команды.
Типичные причины:
- У кукурузного початка есть скрытая повестка дня, которая противоречит целям команды.
- Между членами команды существуют непримиримые разногласия.
- Руководитель проекта не соответствует возложенной на него роли и самоустраняется от решения всех проблем.
Я испытал подобное антируководство, когда закончил учебу и начал работать в новой компании. Один сотрудник всегда смотрел свысока на то, что делают другие, и нагнетал атмосферу.
Руководитель проекта ничего не предпринимал, и ситуация становилась все хуже и хуже. Закончилось все тем, что однажды кукурузный початок ударил другого разработчика, за что был уволен.
Заочный менеджер
Такая ситуация возникает, когда главное ответственное лицо либо постоянно отсутствует, либо не посвящается в курс дел в критические моменты, либо не принимает никаких решений. Менеджеры подобного типа обычно думают, что все само собой образуется, или предпочитают не принимать никаких решений, опасаясь совершить ошибку.
Выдвиженец
Этот ошибочный шаблон возникает там, где определенные возможности, обязанности, признание или награды всегда достаются одному члену команды. Руководитель в таких случаях либо связан личными отношениями с выдвиженцем, либо имеет неверное представление об остальных членах команды.
Это еще одна классика управленческого жанра, которую я довольно часто наблюдал за годы своей карьеры. Некоторые менеджеры с течением времени не пересматривают свое отношение к членам команды разработчиков, не принимая во внимание, что люди развиваются как в лучшую, так и в худшую сторону.
Последствия очевидны: создается токсичная атмосфера, и пропадает мотивация у недооцененных членов команды.
Раздувание ПО
Причиной этого антишаблона является убеждение, что привлечение большего числа сотрудников к проекту сократит время выполнения. Часто это выливается в отчаянные потуги ускорить проектирование без понимания того, как должна осуществляться разработка программного обеспечения.
Другое проявление этого антишаблона заключается в том, что к последующим версиям системы разрешается добавлять больше аппаратных ресурсов без анализа возможности оптимизации программного обеспечения.
Групповое мышление
Этот антишаблон — бич команд разработчиков или руководителей, которые не желают выходить из зоны комфорта и отвергают передовые идеи, даже если они лучше группового мнения, сложившегося в команде.
Заключительные мысли
За свою карьеру мне не раз приходилось сталкиваться с каждым из этих антишаблонов. Тем не менее, не могу не признать: мы склонны наступать на одни и те же грабли, прекрасно осознавая последствия своих ошибок.
Поэтому никогда не помешает вспомнить типичные антишаблоны разработки ПО, чтобы в очередной раз не облажаться!
Читайте также:
Перевод статьи Kesk -*-: Software Anti-Patterns