Антипаттерны
К сожалению, все современные программные языки обладают слишком большой гибкостью. Они слишком много позволяют и слишком мало запрещают.
Например, Java не имеет ничего против того, чтобы вы вместили целое приложение в один единственный «class» с помощью 5000 разных методов. Технически приложение компилируется и запускается, но это хорошо всем известный антипаттерн, который называется Божественным объектом.
![image](https://habrastorage.org/files/213/9ba/96f/2139ba96f93c4bf9b79b4b824c0b09e8.gif)
Таким образом, антипаттерн — это технически допустимый способ разработки, общеизвестный и ошибочный. В каждом языке уйма таких антипаттернов; их присутствие в продукте аналогично наличию опухоли в живом организме. Как только он начинает разрастаться, остановить его уже невозможно. В конечном итоге погибает целый организм. Целый программный продукт становится неремонтопригодным и должен быть переписан.
Как только вы допустили один антипаттерн, их сразу становится больше и больше, и эта «опухоль» только растет.
Это утверждение особенно правдиво для
Всегда старайтесь относиться с достаточной долей скептицизма к своему проекту и не расслабляйтесь, если он «просто работает». Чем раньше вы диагностируете проблему, тем проще ее вылечить.
Неотслеживаемые изменения
При работе с любым программным продуктом вы должны в любой момент быть в состоянии объяснить, что было изменено, кто это сделал и почему. Более того, время, требуемое для того, чтобы получить ответы на эти вопросы, должно измеряться в секундах. Для большинства проектов это не так. Приведем несколько практических рекомендаций:
![image](https://habrastorage.org/files/ff9/cd5/32f/ff9cd532f8f34c2c8b2532b0d9ea33eb.gif)
Всегда используйте тикеты. Неважно, насколько мал проект или команда, которая его обслуживает — даже если вы работаете над ним в гордом одиночестве, всегда используйте тикеты для любой возникающей проблемы. Объясните в двух словах суть проблемы, зафиксируйте свои предположения. Используйте
Ссылайтесь на тикеты в коммитах. Нет необходимости поучать, что каждый коммит должен сопровождаться сообщением. Коммиты без сообщений достаточно противная штука; тем не менее, просто сообщения недостаточно. Каждое сообщение должно начинаться с номера тикета, над которым вы работаете. Многие
Ничего не удаляйте. Некоторые
Ad Hoc релизы
Перед доставкой к конечному пользователю каждый программный продукт должен быть упакован. Если это библиотека Java, она должна быть заключена в файл.jar и распаковываться в
![image](https://habrastorage.org/files/4ad/06c/c3f/4ad06cc3fc984ff28729cb7bd7c4f891.gif)
Идеальное решение — автоматизировать эту процедуру, чтобы было возможным выполнять ее с командной строки посредством одной команды:
Многие проекты далеки от этого. Процессы их релиза — это всегда
Здесь может быть только один совет: автоматизируйте процесс.
Волонтерский статический анализ
![image](https://habrastorage.org/files/3e8/d0d/1c4/3e8d0d1c4ba14a388d16c1dc097edbad.gif)
Обязательно используйте анализатор кода. В большинстве проектов, где используется анализатор кода, разработчики просто делают на его основе красивый отчет и продолжать писать код дальше — так же, как и делали это раньше. Такой «волонтерский» подход к статическому анализу не делает чести программному проекту. Более того, он просто создает иллюзию хорошего качества.
Статический анализ должен быть обязательным этапом в конвейере разработки продукта, и его правила не должны игнорироваться.
Неизвестное тестовое покрытие
Тестовое покрытие — это степень, в которой ПО прошло интеграционное тестирование. Чем больше покрытие, тем больший объем кода был выполнен во время тестирования. Очевидно, что высокое покрытие — хорошая штука.
![image](https://habrastorage.org/files/186/31e/54b/18631e54b87a46e78f3ae256495d43e3.gif)
Тем не менее, многие разработчики не знаю, каково их покрытие: они просто не измеряют этот показатель. Возможно, они и проводят
Конечно, высокое покрытие — не гарантия высокого качества. Но неизвестное покрытие — это четкий индикатор проблем с функциональной надежностью продукта. Когда проект попадет в руки нового разработчика, он или она должны иметь возможность внести
Непрерывная разработка
Под непрерывной здесь подразумевается разработка без временных рамок и релизов. Неважно, ПО какого типа вы создаете, вы должны часто делать релизы и изменять его. Проект без четкой истории релизов — это просто неподдерживаемая программная неразбериха. Все это потому, что возможность поддержки продукта — это если, например, мы будем в состоянии понять вас, читая ваш код.
![image](https://habrastorage.org/files/c9f/279/0a5/c9f2790a524148ea82a3ed4326480ff9.gif)
Просматривая исходный код и историю его релизов, каждый должен быть в состоянии определить намерения его разработчика, скажем, год назад, что происходит сейчас, дальнейшие перспективы
Некоторые
Недокументированные интерфейсы
Каждый участок ПО имеет свой интерфейс, через который предполагается его использовать. Если это
![image](https://habrastorage.org/files/213/9ba/96f/2139ba96f93c4bf9b79b4b824c0b09e8.gif)
Как и все сказанное выше, этот факт относится к возможности поддерживать продукт. Любой новый программист начинает изучение проекта с его интерфейсов, и любой должен понимать, для чего нужен тот или иной интерфейс и как его использовать.
Мы здесь говорим о документировании для пользователя, а не для разработчика. В общем и целом, мы против документации внутри ПО: работающее ПО гораздо лучше, чем понятная документация к нему. Но это не относится к «внешней» документации, которая предполагается для использования пользователями.
Взаимодействие конечного пользователя с ПО должно быть документировано в обязательном порядке. Если ваша программа — это библиотека, то ее конечные пользователи — разработчики, которые не развивают продукт, а просто используют его как «черный ящик».
Все эти критерии используются для проектов с открытым исходным кодом.
Комментарии (12)
Buzik
12.05.2016 12:16+1Спасибо. Прочитал с удовольствием.
Только одна неверная ссылка я думаю.
«Ссылайтесь на тикеты в коммитах. Нет необходимости поучать, что каждый \»коммит"/ должен сопровождаться сообщением." — тут ссылка на коммит ведет в описание коммита SQL, хотя должно быть описание комита для Гита.
molchanoviv
12.05.2016 12:16>Некоторые веб-сервисы для хостинга ИТ-проектов, например, Git
Что? С каких пор git стал веб сервисом? Вот и возникает вопрос а стоит ли доверять мнению автора статьи который даже не в курсе что такое git и путает его с GitHub(BitBucket, etc)ю Плюс с некоторыми пунктами не согласен. Например с предпоследним. Имхо роллинг релиз ничем не хуже классической системы с периодическими релизами.
vaniaPooh
12.05.2016 12:36+3Тестовое покрытие — это степень, в которой ПО прошло интеграционное тестирование.
Почему только интеграционное? Куда делось юнит-тестирование, компонентное тестирование и остальные?
Очевидно, что высокое покрытие — хорошая штука.
Не очевидно. Хорошая штука — достаточное покрытие. Слишком большое количество тестов приведет к тому, что вырастут издержки на поддержку тестов при изменении кода.
staticlab
12.05.2016 12:43Бросилась в глаза фраза «Некоторые веб-сервисы для хостинга ИТ-проектов, например, Git, имеют сильные инструменты для создания такой информации». Решил посмотреть, как же там в оригинале. А там: «Git tags and GitHub release notes are two powerful instruments that provide me such information». И как это называется?
HexGrimm
12.05.2016 13:26Недокументированные интерфейсы
Каждый участок ПО имеет свой интерфейс, через который предполагается его использовать.
Пустил слезу…
Апогей недокументированных интерфейсов — отсутствие интерфейсов
Beowulfenator
12.05.2016 13:51Не совсем понятна фраза «Волонтерский статический анализ». Подозреваю, что автор имел ввиду «добровольный анализ», который плох, потому что он должен быть обязательным.
hudson
12.05.2016 17:07Ну или анализ ради анализа и красивых отчетов. Без применения на практике в ежедневной разработке.
amarao
12.05.2016 17:26Объясните в двух словах суть проблемы, зафиксируйте свои предположения.
«Клиент жалуется, что ничего не работает».
Не «в двух словах» — гигантский paper на грани scientific на тему обнаруженной самовозбуждающейся системы из пяти системных компонент, каждая из которых работает правильно.
SamSol
12.05.2016 19:18Какие-то части из оригинальной статьи пропущены?
Например это:
I've written about this in Strict Control of Java Code Quality. I use qulice.com in Java projects and rubocop in Ruby, but there are many similar tools for nearly every language.
Или это оригинал поменялся?SamSol
12.05.2016 19:24...has been tested by unit or integration tests.
Перевод
… прошло интеграционное тестирование.
?!
kesn
Спасибо за статью. Скажите, а что плохого в непрерывной разработке? И в тему: как в коде указывать, что планируется сделать и каким курсом идёт проект?