Персональные инструменты
 

TDD + DDD + MVP + GoF + PoEAA = Love! (AgileDays-2009)

Материал из CustisWiki

Версия от 18:23, 18 апреля 2011; StasFomin (обсуждение | вклад)

Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

TDD + DDD + MVP + GoF + PoEAA = Love!

Докладчик
Антон Бевзюк (Intel)

Наша команда имеет более чем 6-летний опыт использования гибких методологий.

За это время мы разработали десятки бизнес-приложений. Мы используем передовые практики (Scrum, XP, Kanban) и шаблоны (GoF, PoEAA), доказавшие свою эффективность.

Мы расскажем о том, как мы «поженили» все это разнообразие в одном финансовом приложении. Это приложение спроектировано по Domain-Driven Design (DDD), разработка ведется в строгом следовании парному программированию. Test-Driven Development (TDD) обеспечивает 100 %ное покрытие тестами бизнес-логики, а применение шаблонов MVP и Model-View-Viewmodel позволяет протестировать презентационную логику unit-тестами без применения внешних инструментов для тестирования интерфейса.

Построенная доменная модель постоянно эволюционирует в соответствии с растущими и постоянно изменяющимися требованиями. Нам удалось добиться того, что изменения в коде проходят сравнительно легко из за гибкой, приспособленной к изменениям архитектуры и дизайна приложения. Это достигается за счет использования множества шаблонов проектирования (GoF, PoEAA, DDD).

Отличительной особенностью нашего кода является то, что он вообще не содержит комментариев без ущерба для понимания. Код самодокументирующийся. Мы активно используем DSL для упрощения написания тестов. К настоящему моменту система содержит 4500+ тестов, которые выполняются не более 1 минуты.

Наш доклад раскрывает ряд best practices в области программной инженерии, например:

  • Автоматизированный деплоймент (на развертывание приложения уходит около 10 минут, делается это одним кликом).
  • Специализированные парные станции
  • Совместное использование всех практик XP (синергетический эффект)
  • Kaizen (постоянный пересмотр как процесса разработки, так и самого кода)
  • Элементы fun’а

В этом году мы успешно выдержали внешний и внутренний аудиты, нацеленные на анализ качества кода и оправданность использованных нами решений. Внешний аудит проводился специалистами Microsoft. По результатам этих проверок наш проект получил высокие оценки процесса и продукта.


Видео в HD-качестве, смотрите в полноэкранном режиме.

HTML-код включения <iframe src="http://player.vimeo.com/video/8333707?byline=0&portrait=0" width="640" height="512" frameborder="0"></iframe>

Краткое резюме описываемого проекта в цифрах (в стиле заставки сериала «Numb3rs»:

  • 2 года
  • 12 разработчиков
  • 50 человеко-лет (нет, вдумайтесь — это целая человеческая жизнь, по крайней мере, в разумном возрасте, среднего мужчины в РФ)
  • 32 проекта в solution’е Visual Studio
  • 3-хзвенная архитектура (WebForms/WinForms-клиент и MSSQL)
  • 140000 строк
  • 100000 из них — это строки 5000 тестов
  • 20 экранных форм
  • 10 Гб БД.

Note.svg По нашим меркам, это совсем небольшой проект, с удивительно большими затратами людских и временных ресурсов. Впрочем, читателю лучше сделать самостоятельное сравнение с своими проектами, а для подсчета различных SLOC-метрик рекомендуем использовать утилиту CLOC.

Ребятам удалось активно заинтересовать аудиторию — ведь с одной строны продемонстрировано следование самым модным тенденциям в архитектуре и разработке, плюс удивительный факт, что их Intel-группа успешно прошла оценку аудиторами из Microsoft. С другой — таки осталось непонятно, оправдано ли это экономически.

Из отзывов наших сотрудников:


С точки зрения архитектуры подход Intel’а отличается от книжного DDD, который описывал в своем докладе и Андрей Бибичев (например, если почитать тут ). Используя принцип Inversion of Control, они изолируют сборку с классами домена от инфраструктуры. Таким образом, домен у них не зависит ни от чего, и поэтому хорошо портируется, тестируется, и легко переносит существенные изменения инфраструктуры. Именно это, «чистый домен», они и ставят во главу угла своего подхода.

…Ребята также показались TDD-экстремистами, не знаю насколько это хорошо или плохо. Их мантры такие

  • Подумай->Напиши тест, который падает где ты ожидаешь -> Сделай минимальное исправление
  • Assert, по-хорошему, должен быть один, а исправление — минимальным. Если это не так, скорее всего нужен еще один тест.

… Все-таки они там TDD-маньяки и стремятся оттестировать все, что можно, и что нельзя. С тестированием «чистого домена» все более-менее просто, а дальше они начали тестировать GUI. По опыту прошлых проектов было известно, что ручное и скриптовое тестирование малоэффективно и мучительно. Поэтому они начали думать, как приспособить инструменты и методики unit-тестирования к тестированию GUI. Для этого они начали пересматривать архитектуру GUI-слоя (как неоднократно звучало, TDD — это не тесты, это методика проектирования!)

… Докладчики рассмотрели несколько паттернов устройства GUI (ModelViewController -> ModelViewPresenter -> ModelViewViewmodel). Собственно, смысл этого сводится к тому, чтобы сделать View единственной и максимально простой, зависящей от платформы частью паттерна, а все остальное — покрыть тестами.

… Я так понял, что этот подход позволил им достаточно безболезненно перевести клиента с WinForms на WebForms. С замечанием из зала о том, что для Web-интерфейса с активным использованием JavaScript’а на клиенте такой подход не работает, докладчикам пришлось, …, согласиться.

… Докладчики с гордостью заявляли, что стараются тестировать все, что может сломаться и с чем бывают проблемы: код, конфигурации, хранимые процедуры, даже связывание (binding) GUI. Любопытно, что в тестах они проповедуют принцип «1 тест — 1 assert». Мне не очень понятно, как это можно реально соблюдать, не впадая в безумное дублирование, и какой в этом смысл. Книжное «сразу понятно, что сломалось» смешно — нам почему-то и без этого принципа обычно понятно, что сломалось.

…Реализация DDD-подхода в данном случае состоит в том, что domain описан в отдельной сборке, которая является полностью независимой. Для обеспечения независимости используется прием Inversion-of-Control и одноименная библиотека.

  • Плата за такой чистый дизайн велика — для каждого типа доменный модели нужен еще тип, реализующий для него работу с базой
  • Зато 5000 тестов работают одну минуту.

…Действительно впечатляющие данные — 5000 тестов у них выполняются за минуту. Около 200 тестов, все-таки требующих наличия БД, у них выполняются минут за 10 и их запускают нечасто.

…Тесты, как известно, должны быть максимально простыми и выразительными. Поэтому они активно используют в тестах всякие практики типа FluentInterfaces, а также забавные методы-расширения, например, для задания дат в виде 11.12.of2009().

… При написании тестов использует свои embedded DSL. Например, вот такое:

var testDate = 11.12.of2009
 
public static class DoubleExtensions
{
    public DateTime of2009(this double date)
    {
        return new DateTime((int)date.Floor(), (int)(date-date.Floor())*100, 2009)
    }
 
}

…Много обсуждаемая в форумах по архитектуре (например, здесь) проблема — как отделять домен от инфраструктуры доступа к данным так, чтобы это было красиво и удобно. Они для этого активно используют паттерн Specification с возможностью сложных операций над спецификациями.

…Не со всем хочется согласиться, но заставляет задуматься, что можно улучшить в наших системах с точки зрения общей архитектуры/тестопригодности. Выкладывать свой framework как пример архитектурного паттерна они отказываются, ссылаясь на коммерческую тайну.


Кстати, повторимся, дискуссия о «правильном DDD» продолжилась и в онлайне. Присоединяйтесь к ней, если есть конструктивные замечания.

Caution.svg К сожалению, видео не совсем полное, мудак-оператор (я, Стас Фомин), куда-то задевал конец выступления. Сорри!