agile architecture

72
@dmytromindra #xpdays Agile Архитектура Дмитрий Миндра Lohika

Upload: dmytro-mindra

Post on 29-Nov-2014

1.427 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

@dmytromindra #xpdays

Agile Архитектура

Дмитрий Миндра

Lohika

@dmytromindra #xpdays

Что я обещал

Я обещал поделиться своим представлением об архитектуре и

проектировании в Agile. Многие популярные методологии не

описывают архитектурные практики. Некоторые команды,

работающие по гибким методологиям не уделяют достаточно

внимания проектированию. Но проектирование было и остается

той важной основной, на которой строится любое программное

обеспечение. Проектирование – это принятие решений.

Традиционный подход утверждает, что эти решения должны быть

приняты в самом начале. Гибкий подход заключается в том, что

решения должны приниматься тогда, когда они действительно

необходимы. Таким образом с развитием проекта гибкая

архитектура эволюционирует. И эта гибкость дает больше

возможностей для адаптации к изменениям. В индустрии

разработки программного обеспечения нет серебряных пуль. Я

постараюсь развеять некоторые мифы и познакомить

слушателей с проверенными практиками.

@dmytromindra #xpdays

Разработка ПО – это просто !

@dmytromindra #xpdays

Проблема №1: Завершенность

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

@dmytromindra #xpdays

Проблема №2: Дефекты

Объем работы, связанной с устранением дефектов и ошибок в «завершенном» программном продукте, необходимой для того, чтобы сделать продукт готовым к использованию часто занимает значительное количество времени. Часто это время больше чем время разработки продукта.

@dmytromindra #xpdays

Проблема №3: Требования Функциональность программного обеспечения редко соответствует требованиям конечных пользователей.

@dmytromindra #xpdays

Проблема №4: Поддержка

После создания программного обеспечения его практически невозможно поддерживать, т.к. способность разработчиков понять, что они написали быстро уменьшается с течением времени.

@dmytromindra #xpdays

@dmytromindra #xpdays

Программист или инженер ?

http://www.codethinked.com/the-programmer-dress-code

@dmytromindra #xpdays

Программист 1.0

Спецификация Программный продукт

Спецификация на входе – программное обеспечение на выходе.

Изменения в спецификациях не любит. Расценивает как угрозу.

Старается всячески избегать изменений.

@dmytromindra #xpdays

Программист 2.0

Программист 2.0 и клиенат 2.0 учатся понимать друг друга.

Программист 2.0 все еще боится изменений, поэтому приписывет к

каждой версии продукта BETA.

@dmytromindra #xpdays

Программист 3.0

Понимает клиента, его бизнес, разделяет ценности.

Всегда готов к изменениям. Понимает и принимает их необходимость.

Стремится делать рабочее и готовое к использованию ПО.

@dmytromindra #xpdays

Agile методологии говорят о

людях

@dmytromindra #xpdays

Миф: Архитектор

Сидит отдельно. Все решения принимает сам.

Занимается асоциальным проектированием.

Охраняет свою территорию.

@dmytromindra #xpdays

Agile Архитектура

Ваш менеджер

вне всяких

сомнений

будет рад

Agile

архитектуре

@dmytromindra #xpdays

Agile Architecture

Как это ?

@dmytromindra #xpdays

Agile ценности

• Individuals and interactions

• Working software

• Customer collaboration

• Responding to change

@dmytromindra #xpdays

Что такое архитектура и

проектирование?

В наиболее успешных программных

проектах, опытные разработчики

обладают общим пониманием

структуры системы. Это общее

понимание называется "архитектура".

@dmytromindra #xpdays

Более официальное, но все еще

хорошее определение.

Архитектура является основной

организации системы, воплощенной в ее

компонентах, их отношениях друг к другу

и к окружающей среде, и принципы,

определяющие ее дизайн и эволюцию.

[IEEE 1471]

@dmytromindra #xpdays

Характеристики Качества

Correctness

Robustness

Extendibility

Reusability

Compatibility

Efficiency

Portability

Easy of use

Functionality

Timeliness

Verifiability

Integrity

Reparability

Economy

@dmytromindra #xpdays

Самые важные характеристики

Корректность Усточивость

Расширяемость

Возможность повторного

использования

@dmytromindra #xpdays

Наш враг сложность

@dmytromindra #xpdays

Враги архитектуры

Неподвижность Жесткость

Вязкость Хрупкость

@dmytromindra #xpdays

Масштабируемость

Больше серверов

Больше людей

@dmytromindra #xpdays

Coupling (Сцепление)

Сцепление классов, когда изменения в

одном могут повлиять на другой и

наоборот. К сожалению полностью

избавиться от сцепления невозможно.

@dmytromindra #xpdays

Cohesion (Сплоченность)

Сплоченность классов, по своей

ответственности. Т.е. классы,

выполнябщие похожие действия

сгруппированы в одном и том же модуле.

@dmytromindra #xpdays

Scocialization

@dmytromindra #xpdays

Latency

Задержка – это время, которое должно

пройти прежде чем первая

функциональность увидит свет

@dmytromindra #xpdays

Throughput

Пропускная способность – количесво

функциональности, которое можно

реализовать за определенное время.

@dmytromindra #xpdays

Все всегда начинается с проблемы

@dmytromindra #xpdays

Объектно

Ориентированный

Анализ

@dmytromindra #xpdays

Вход:

Проблема

Выход:

концептуальная

Модель (Domain objects,

Use cases, Interactions,

some UI mockups )

Анализ

@dmytromindra #xpdays

Методы OOA

• Метод OOSA Шлеер-Меллора • Метод Коада • ОМТ • Метод Мартина Оделла и средства проектирования Ptech • Метод “класс-связь” • OSA • Метод SEOO • Метод BON • Fusion • OBA • Syntropy • MOSES • Метод Текселя (Texel) • Метод OORAS

@dmytromindra #xpdays

Проектирование

Вход:

концептуальная

модель

Выход:

Архитектура (дизайн)

системы

@dmytromindra #xpdays

Принципы и инструменты OOD

SRP — The Single Responsibility Principle

OCP — The Open Closed Principle

LSP — The Liskov Substitution Principle

ISP — The Interface Segregation Principle

DIP — The Dependency Inversion Principle

REP — The Reuse Release Equivalency Principle

CCP — The Common Closure Principle

CRP — The Common Reuse Principle

ADP — The Acyclic Dependencies Principle

SDP — The Stable Dependencies Principle

SAP — The Stable Abstractions Principle

@dmytromindra #xpdays

А также

• Design Patterns

• Domain Driven Design

• CQRS

• Event Sourcing

• MVC

• DCI

• SOA

• …

@dmytromindra #xpdays

Кажется, что можно все

спланировать ?

Подробнее в книге Agile Samurai ;)

@dmytromindra #xpdays

Big Upfront Design (BUFD)

@dmytromindra #xpdays

No Upfront Design (NUFD)

@dmytromindra #xpdays

Миф о рефакторинг

Ничего не будем делать заранее, сделаем

как получится, затем сделаем

рефакторинг и будет архитектура.

@dmytromindra #xpdays

TDD и Архитектура

TDD укажет вам на проблемы в проектировании. Но

если вы не задали основные направления для движения

и эволюции, дизайн и архитектура не получатся.

@dmytromindra #xpdays

UnixWay от Кента Бека

• Make it work

– ( Сделай что-то рабочее)

• Make it right

– ( Сделай рабочее правильным)

• Make it fast

– (Сделай правильное быстрым)

@dmytromindra #xpdays

Инструменты

А также принципы и практики

@dmytromindra #xpdays

Парное программирование

• Не программируй один. Найди себе

друга.

@dmytromindra #xpdays

Ревью кода

Тимлид сурово смотрит в код ...

@dmytromindra #xpdays

DDD

@dmytromindra #xpdays

CQRS

@dmytromindra #xpdays

Event Sourcing

Состояние доменного объекта переносится в событие. Система хорошо

распараллеливается.

@dmytromindra #xpdays

Design Patterns

@dmytromindra #xpdays

ООП

• ООП – это как в C#

• ООП – это как в PHP

• ООП – это как в Java

@dmytromindra #xpdays

Пользователь

@dmytromindra #xpdays

Что же делает пользователь ?

Это отражено в коде ?

@dmytromindra #xpdays

Один UseCase разнесен по многим

классам.

@dmytromindra #xpdays

Мы что-то теряем

@dmytromindra #xpdays

MVC 1979

MVC улучшает восприятие

Но по-прежнему не отражает поведение

@dmytromindra #xpdays

DCI

@dmytromindra #xpdays

Как пользователь представляет

себе это действие ?

@dmytromindra #xpdays

Ментальная Модель пользователя

Данные Роли

Взаимодействия

@dmytromindra #xpdays

Простой пример

Transfer Money

User

Берем один счет,

затем берем другой счет,

определяем сумму перевода,

переводим деньги.

@dmytromindra #xpdays

Данные (Data)

Account

Sav ingsAccountCheckingAccount

@dmytromindra #xpdays

Роли (Interaction)

«interface»

TransferMoneySink

«interface»

TransferMoneySource

Пассивные (Methodless)

«interface»

TransferMoneySink«interface»

TransferMoneySource

TransferMoneySourceTrait

+ TransferTo() : void

Активные (methodful)

@dmytromindra #xpdays

Контекст (Context)

Берем один счет,

Берем другой счет,

определяем сумму перевода,

переводим деньги.

«interface»

TransferMoneySink

«interface»

TransferMoneySource

TransferMoneySourceTrait

+ TransferTo() : void

TransferMoneyContext

«Property»

+ TransferMoneySource

+ TransferMoneySink

+ Ammount: int

+ Execute() : void

@dmytromindra #xpdays

DCI & MVC вместе

@dmytromindra #xpdays

DCI – это еще одна точка зрения

@dmytromindra #xpdays

Комбинируя подходы мы получаем

архитектуру системы

MVC

DCI

Domain Model

Концептуальная модель

проектирование

@dmytromindra #xpdays

Do try this ;)

@dmytromindra #xpdays

Links and References

http://www.artima.com/articles/dci_vision.html

http://www.leansoftwarearchitecture.com/

@dmytromindra #xpdays

Итоги

• В проектировании очень важны знания

• В проектировании очень важен опыт

• В проектировании очень важно

понимание

• Agile архитектура – это люди

• DCI стоит попробовать дома

• Попробуйте Lean

@dmytromindra #xpdays

В заключение

Программное обеспечение не ограничено физикой, как здания. Оно ограничено фантазией, дизайном, организацией. Короче говоря, оно ограничено свойствами людей, а не свойства мира. "Мы встретили врага, и этот враг мы сами".

-- Мартин Фаулер

@dmytromindra #xpdays

Программист 3.0

@dmytromindra #xpdays

Спасибо!