Как жить в согласии с SOLID?
Евгений Тюменцев
HWdTech, LLC
hwdtech.ru
11-я конференция .NET разработчиков
31 октября 2015
dotnetconf.ru
2
Особенности разработки ПО
Фредерик Брукс
«Мифический человеко-месяц»
3
Программист VS каменщик
4
Почему так получается у
программистов?
5
• Сроки нарушаются
• ?
• ?
6
• Сроки нарушаются
• Требуется все больше разработчиков
• ?
7
• Сроки нарушаются
• Требуется все больше разработчиков
• Быстрее переписать, чем продолжать
8
Логика Хоара
1969 г. An Axiomatic Basis for
Computer Programming
1971 г. Procedures and Parameters:
An Axiomatic Approach
1980 г. премия Тьюринга
1990 г. Медаль “Пионер
компьютерной техники”
2000 г. рыцарский титул за заслуги
в области образования и
компьютерной техники, премия
Киото
Чарльз Хоар
9
Факты о логике Хоара
Система аксиом, содержащая if и while
полна
При добавлении новой конструкции в язык,
существующие аксиомы для goto делают
логику противоречивой.
10
Факты о логике Хоара
Если использовать
1. статическое связывание
2. Рекурсию
3. Вложенные процедуры
4. Процедуры, принимающие в качестве
параметров процедуры.
5. Глобальные переменные
то не существует полной системы аксиом.
11
Логика Хоара часто противоречива
⊢ 𝐿 𝞿 и ⊢ 𝐿 `𝞿
Значит, что любое изменение в коде надо
тестировать!
12
Противоречивость: сильно страшно?
13
Противоречивость: сильно страшно?
14
Противоречивость: сильно страшно?
15
Противоречивость: сильно страшно?
16
Что делать?
Итерации, velocity
Низкая степень связности
Небольшая вложенность процедур
Модульное тестирование
Рефакторинг
Planning poker
Agile
Хорошо определенные требования
17
Что делать?
SOLID
Доказаны математически (2014 год)
Верны не только для ООП, но и для
функционального, и процедурного
программирования!
18
Активная
разработка
Схема разработки
Ядро
Кандидаты
в ядро
Направление миграции кода
19
switch
enum
Приведение типов
new
20
Процессоры уже не те!
21
Многопоточность?
Это Вам не это!
22
Базы данных
• Скорость выполнения запросов
• Миграция
• Репликация
• Непротиворечивость
• ORM
23
Один формат для всех данных
{
‘фамилия’: ‘Иванов’,
‘заказы’: [
{
‘дата’: ’01.09.2015’,
‘стоимость’: 2000
},
{
‘дата’: ’01.10.2015’,
‘стоимость’: 2000
}
]
}
24
Интерфейс работы с данными
interface IObject
{
object getValue(string name);
void setValue(string name, object val);
}
class Field<T>
{
public Field(string name) {…}
public abstract T this[IObject o]
{
get;
set;
}
}
Генерация строго типизированных
оберток для IObject по интерфейсам
interface MyObj
{
int A
{
get;
}
string B
{
get;
set;
}
}
Унификация обработчиков
26
Акторы – альтернатива многопоточности
Carl Hewitt,
Peter Bishop,
Richard Steiger
A Universal Modular ACTOR
Formalism for Artificial Intelligence
1973
27
Что такое актор?
Актор – вычислительная
сущность, которая может
за один шаг
• Отправить конечное число
сообщений другим акторам
• Создать конечное число
акторов
• Выбрать поведение для
приема следующего
сообщения
28
Многопоточность vs Акторы
29
Почему своя реализация акторов, а не, например,
Erlang, Scala и т.д.?
http://benchmarksgame.alioth.debian.org
30
Архитектура
31
Маршруты сообщений
32
Управление маршрутами без программиста
33
Контрольные точки
Контрольная точка сохраняет в БД
входящее сообщение как есть
Конечная точка маршрута сообщения
34
Преимущества контрольных точек
Контрольная точка сохраняет в БД входящее
сообщение как есть
входящий
запрос
ответ
35
Библиотека акторов
 Публикация
 Загрузка по требованию
36
Библиотека конфигураций
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
37
Преимущества библиотеки
конфигураций
• Быстро клонировать
• Автоматический деплой
• Можно выставлять время
обновления
• Автоматический откат
• Ни одна конфигурация не теряется
• Можно иметь одновременно
сервера, которые работают с
разными версиями данных
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
38
Методы обнаружения разладки
Карты Шухарта
Все процессы подвержены вариабельности.
Управляемое явление - используя прошлый опыт
можно предсказать, каких его вариаций можно
ожидать в будущем.
ГОСТ Р 50779.42-99 (ISO 8258-91)
выявление точек выхода
процесса из стабильного
состояния для установления
причин появившегося
отклонения и их устранения.
39
Как узнать, что изменения дали
положительный эффект
40
Все ли пользователи
одинаково полезны
41
Если коллеги не идут на
сотрудничество
42
Активность пользователей можно
создавать
43
Преимущества решения
• Масштабируемые приложения могут строить
разработчики с небольшим опытом работы или вообще
без опыта
44
Преимущества решения
• Масштабируемые приложения могут строить
разработчики с небольшим опытом работы или вообще
без опыта
• Нет проблем с миграциями данных
45
Преимущества решения
• Масштабируемые приложения могут строить
разработчики с небольшим опытом работы или вообще
без опыта
• Нет проблем с миграциями данных
• Методы объективного контроля работоспособности всей
системы, не зависящие от программистов и
тестировщиков
46
Преимущества решения
• Масштабируемые приложения могут строить
разработчики с небольшим опытом работы или вообще
без опыта
• Нет проблем с миграциями данных
• Методы объективного контроля работоспособности всей
системы, не зависящие от программистов и
тестировщиков
• Быстрое клонирование и развертывание серверов по
необходимости
47
Преимущества решения
• Масштабируемые приложения могут строить
разработчики с небольшим опытом работы или вообще
без опыта
• Нет проблем с миграциями данных
• Методы объективного контроля работоспособности всей
системы, не зависящие от программистов и
тестировщиков
• Быстрое клонирование и развертывание серверов по
необходимости
• Возможность адаптации или правки автоматизируемых
бизнес-процессов без участия программистов.
48
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
49
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
50
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
• Количество ошибок по сравнению с
предыдущей версией уменьшилось в
1000 раз!
51
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
• Количество ошибок по сравнению с
предыдущей версией уменьшилось в
1000 раз!
• Количество серверов уменьшено с
15 до 3!
52
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
• Количество ошибок по сравнению с
предыдущей версией уменьшилось в
1000 раз!
• Количество серверов уменьшено с
15 до 3!
• Объявление можно подавать
простым текстом вместо длинной
формы: “Двушка в Советском округе,
проспект Мира, 64, в районе ост.
Политех, 50/34/8, 3/5п, не требует
ремонта, санузел раздельный, хрущевка.”
53
Существующие внедрения – платформа
для контекстной рекламы
• Требование – время отклика строго меньше 100 мс
• Попытки задействовать ElasticSearch, MongoDb и т.д. дают
в некоторых случаях 200 мс и больше
•
54
Существующие внедрения – платформа
для контекстной рекламы
• Требование – время отклика строго меньше 100 мс
• Попытки задействовать ElasticSearch, MongoDb и т.д. дают
в некоторых случаях 200 мс и больше
• Был написан актор, который хранит все критерии
рекламных компаний сразу в памяти.
55
Существующие внедрения – платформа
для контекстной рекламы
• Требование – время отклика строго меньше 100 мс
• Попытки задействовать ElasticSearch, MongoDb и т.д. дают
в некоторых случаях 200 мс и больше
• Был написан актор, который хранит все критерии
рекламных компаний сразу в памяти.
• Получили время отклика 7-46 мс (сам поиск по структуре
в памяти < 1 мс)
• Для масштабирования система поддерживает работу с
несколькими экземплярами серверов
56
Существующие внедрения –
кроссплатформенное приложение
• Приложение считает время по
каждой задаче программиста,
снимает скриншоты, мониторит
активность клавиатуры и мыши
• Интерфейс написан на HTML5 и CSS3
• Бизнес-логика написана на нашей
библиотеке
• Приложение работает без
изменений под Mac, Window, Linux
(кроме методов снятия скриншота и
логирования активности – это малая часть
– до 40 ч работы – по сравнению со всем
приложением)
57
Спасибо за внимание
Евгений Тюменцев
HWdTech, LLC
etyumentcev@hwdtech.ru
twitter.com/etyumentcev

Как жить в согласии с SOLID?