Как сложность убивает проекты
Вадим Мингажев
5.63M
Category: programmingprogramming

Как сложность убивает проекты

1. Как сложность убивает проекты

Вадим Мингажев

2.

О чем
■ Почему нужно бороться со
сложностью
■ Откуда берется
■ Кто и как может с ней бороться
Сложность – это усилия, потраченные коллективом на
создание определенного количества материала

3.

Управление сложностью
каждый день
■ Команда должна понимать и
дописывать код (хотя бы в текущем
проекте)
■ Сложность, остается в проекте
надолго
■ Сложность «заразна»
■ Чтобы код понимал аналитик, PO,
тестировщик

4.

Откуда появляется сложность
■ «Протекание» и смешение
уровней абстракции
■ Неправильное именование
■ Слабая связанность,
сильная связность
■ Отсутствие unit-тестов
■ Не применяются SOLID,
YAGNI …
■…

5.

Что мешает развитию системы, в
которой в общем-то все неплохо
■ Сложность предметной
области
■ Сложность, внесенная
разработчиком
■ Сложность, внесенная умелым
разработчиком
■ Сложный язык, Framework,
сложные задачи
■ Сложно поднимать окружение

6.

Оверинжиниринг
■ Желание решить задачу
выше своих компетенций
■ Недостаточное понимание
задачи
■ Чаще встречается у
молодых разработчиков

7.

Желание написать «классно»
■ Желание использовать
модный фрэймворк/подход
■ Желание развить
компетенции
■ Чаще свойственно
разработчикам среднего
уровня

8.

Гений
■ Гибкий и качественный код
■ Продуманные точки
расширения
■ Сложные алгоритмы

9.

■ CodeReview для всех
■ Отдельный пункт
CodeReview – «проверить
понятность»,
■ Управление творческой
энергией разработчика

10.

Практики из SCRUM
■ Не давать задачу «целиком»
■ Force collective code ownership
■ Коммуникации

11.

Как повысить качество и сложность кода
■ DI/IoC
■ AOP
■ DDD и Enterprise-паттерны
■ Асинхронность/многопоточность
■ Обобщенные классы и алгоритмы
■ Использование готовых компонентов
■ Функциональный стиль
■…

12.

Работа на глубине
Business logic
Common
business logic
Common Code
.NET Sources
Module common code
Nuget lib
sources
IL Code
Нативный код

13.

Enterprise
ServiceWrapper
Locator
Layer
ActiveRecord
Tier
Interceptor
Repository
Service
Broker
Bus
Microservices
Adapter

14.

Уровень классов

15.

Уровень методов

16.

Что делать?
«А не рано ли
принимается
решение»
Написать как обычно

17.

#1
#2

18.

Ограничение набора
инструментов
■ Знать возможности
используемого фрэймворка
■ Предпочитать встроенные
инструменты
■ Бюрократия при добавлении
новых библиотек – это не
всегда плохо

19.

Непреодолимая сложность
■ Требования к
производительности
■ Сложность предметной
области
■ Компромиссы и ограничения
фрэймворка, библиотек и
бизнес-требований

20.

#1 Просто код

21.

#1 Контекст

22.

#1 Документация и
комментарии

23.

#2 Просто код

24.

#2 Комментарии

25.

Документация, комментарии
■ Описание сложного алгоритма
(возможно со ссылками)
■ «Почему так»
■ Контекст

26.

Валидация графа
Алгоритм
■ Поиск «треугольников»
■ Упрощение графа с
использованием шагов:
a. Убрать «петли»
b. Сократить пути,
относящиеся к одной
параллельности
c. Убрать «тупики»
d. Упростить пути, сходящиеся
в одной параллельности
• …. еще сколько-то шагов

27.

MutableSchemeGra
ph классы
Другие
ParallelBranchScheme
Validator:
ITaskSchemeValidator
(163 Строки)
GraphReducer
(342 строки)
GraphRouteBuilde
r ...

28.

Изоляция/Инкапсуляция
■ Сложность не отражается на
публичных интерфейсах
■ От сложности ничего не
зависит
■ Сложность сконцентрирована
в одном месте

29. Вадим Мингажев

Разработчик
в г. Уфа
[email protected]
Благодарности:
Тимур Асадуллин - рецензирование
English     Русский Rules