SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Как жить в согласии с SOLID?
Евгений Тюменцев
HWdTech, LLC
hwdtech.ru
11-я конференция .NET разработчиков
31 октября 2015
dotnetconf.ru
2
Особенности разработки ПО
Чем больше размер проекта, тем
медленнее работают
программисты.
На графике пунктирная линия –
трудозатраты, если бы скорость
работы была постоянной, а
сплошная – реальные
трудозатраты.
Фредерик Брукс, «Мифический человеко-месяц»
3
Если сравнить программиста и каменщика
Предположим, что
каменщик кладет один
кирпич за 5 минут. Тогда он
первый и тысячный
кирпичи уложит за 5 минут.
Программист же первый
кирпич кладет за 5 минут, а
тысячный почему-то за 100
часов!
4
Почему так получается у программистов?
Программисты перед тем, как
сделать что-то новое, вносят
изменения в уже написанный
код, структуру базы данных.
Во-первых, нужно еще найти это
место, куда внести изменения, а,
во-вторых, убедиться, что новые
правки не сломали то, что уже
работало.
Это как, если бы строители,
перед тем как построить
очередной этаж, сначала ломали
и перестраивали все
предыдущие.
5
• Сроки нарушаются
• Требуется все больше разработчиков
• Быстрее переписать, чем продолжать
6
Логика Хоара
1969 г. An Axiomatic Basis for
Computer Programming
1971 г. Procedures and Parameters:
An Axiomatic Approach
1980 г. премия Тьюринга
1990 г. Медаль “Пионер
компьютерной техники”
2000 г. рыцарский титул за заслуги
в области образования и
компьютерной техники, премия
Киото
Чарльз Хоар
7
Факты о логике Хоара
Система аксиом, содержащая if и while
полна
При добавлении новой конструкции в язык,
существующие аксиомы для goto делают
логику противоречивой.
8
Факты о логике Хоара
Если использовать
1. статическое связывание
2. Рекурсию
3. Вложенные процедуры
4. Процедуры, принимающие в качестве
параметров процедуры.
5. Глобальные переменные
то не существует полной системы аксиом.
9
Логика Хоара часто противоречива
⊢ 𝐿 𝞿 и ⊢ 𝐿 `𝞿
Значит, что любое изменение в коде надо
тестировать!
10
Противоречивость: сильно страшно?
11
Противоречивость: сильно страшно?
12
Противоречивость: сильно страшно?
13
Противоречивость: сильно страшно?
14
Что делать?
Итерации
Низкая степень связности
Небольшая вложенность процедур
Модульное тестирование
Рефакторинг
Planning poker
Agile
Хорошо определенные требования
15
Что делать?
SOLID
Доказаны математически (2014 год)
Верны не только для ООП, но и для
функционального, и процедурного
программирования!
16
Активная
разработка
Схема разработки
Ядро
Кандидаты
в ядро
Направление миграции кода
17
Если SOLID, то, скорее всего, нельзя
switch
enum
Приведение типов
new
18
Процессоры уже не те!
• Рост производительности одного
ядра процессора остановился!
• Рост производительности
приложений теперь должен
обеспечиваться за счет активного
использования многоядерности.
Herb Sutter, 2005 The Free Lunch Is Over A
Fundamental Turn Toward Concurrency in Software
“The bad news is that, at least in the short term, the
growth will come mostly in directions that do not take
most current applications along for their customary
free ride.
19
Многопоточные приложения сложны
• Нужны специалисты
• Трудно прогнозировать результат
• Дорого
20
Базы данных
• Скорость выполнения запросов
• Миграция
• Репликация
• Непротиворечивость
• ORM
21
Один формат для всех данных
• Все данные хранятся в виде JSON в реляционной БД (не NoSQL
база). Почему реляционная – есть транзакции.
• Структура базы очень проста – всего 6 (!) запросов к БД.
• Всегда известно среднее время выполнения любого запроса (в том
числе полнотекстовых поисковых запросов). Поскольку запросы
фиксированы, то время их выполнения не зависит от квалификации
разработчика.
• Не нужно миграций вообще – одновременно можно хранить сразу
несколько версий одних данных (система будет корректно работать
со всеми версиями)
• Базу легко масштабировать и поддерживать скорость выполнения
запросов – достаточно выделить нужные записи в отдельную
коллекцию. Например, если у Вас объявления о продаже
автомобилей и из них половина – это Toyota, то их можно выделить в
отдельную коллекцию, или, наоборот, из-за ухода General Motors
количество продаваемых Chevrolet, Opel снизилось, то их можно
собрать в одну коллекцию. Это делается однажды написанными
процедурами и хорошо отлаженными слияния и разделения
коллекций, то есть участие программиста для этих операций не
требуется.
{
‘фамилия’: ‘Иванов’,
‘заказы’: [
{
‘дата’: ’01.09.2015’,
‘стоимость’: 2000
},
{
‘дата’: ’01.10.2015’,
‘стоимость’: 2000
}
]
}
22
Интерфейс работы с данными
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;
}
}
23
Унификация обработчиков
Каждый обработчик принимает на
вход IObject
Как организовать связи между
обработчиками?
Нужно использовать оператор
расширения (см. доклад с 10
конференции DotNetConf)
Лучше всего подходит отправка
сообщений, так как она не требует,
чтобы оба обработчика
находились в одном адресном
пространстве
24
Акторы – альтернатива многопоточности
Carl Hewitt,
Peter Bishop,
Richard Steiger
A Universal Modular ACTOR
Formalism for Artificial Intelligence
1973
25
Что такое актор?
Актор – вычислительная
сущность, которая может
за один шаг
• Отправить конечное число
сообщений другим акторам
• Создать конечное число
акторов
• Выбрать поведение для
приема следующего
сообщения
26
Многопоточность vs Акторы
Многопоточность больше всего
похожа на телефонию. Доступ к
ресурсу – телефонный звонок.
Адресат может быть занят или не
брать трубку – живая и мертвая
блокировки. Чтобы одновременно
принимать много звонков, в
телефонии используют офисные
АТС – объекты синхронизации.
Акторы похожи на почтовую систему.
Чтобы выполнить какое-либо действие
актор посылает сообщение – письмо
адресату, и дальше занимается своими
делами. Не нужно никаких блокировок
вообще, можно послать много
сообщений за 1 раз, но нет гарантий,
что каждое сообщение будет
доставлено адресату.
27
Почему своя реализация акторов, а не, например,
Erlang, Scala и т.д.?
• У нас низкий порог вхождения – разработчики
без опыта работы – надо знать только чистый
Java без Framework’ов.
• Erlang не подходит для длительных вычислений
(типичная ситуация, когда при решении
многопоточных задач Erlang проигрывает в
скорости – см., например, рис. справа 18,19 место
и проигрыш в ~20 раз!)
• Подход Scala (без инверсии зависимостей –
Philipp Haler, Martin Odersky, 2006 Event-Based
Programming Without Inversion Control)
заставляет разработчика самого задумываться о
распараллеливании задач в коде, то есть
требуется наличие хорошего опыта
• Мы предлагаем решения в акторах, которых нет
ни на одной платформе (речь пойдет далее)
28
Архитектура
Каждый актор запущен внутри некоторого процесса – Node. Каждый актор
подключен к одному или нескольким каналам шины сообщений – MessageBus.
Чтобы отправить сообщение актору, надо его опубликовать в соответствующем
канале.
29
Маршруты сообщений
• Акторную модель можно представить в
виде графа, где каждая вершина – это
актор, а стрелка показывает, что один
актор (основание стрелки) посылает
сообщение другому актору (конец
стрелки)
• Маршрут сообщения – это путь в графе,
которое проходит сообщение от
момента создания до завершения
обработки.
• Обычно, информация о том, кому
посылать сообщение зафиксирована в
исходном коде актора.
• Это требует модификации актора и,
соответственно, обновления сервера,
каждый раз, когда нам необходимо
внести изменения в соответствующий
алгоритм (например, в
запрограммированный бизнес-процесс)
30
Управление маршрутами без программиста
• Наше решение предлагает вынести
информацию об адресатах сообщений
за пределы актора, так чтобы он ничего
не знал о следующих акторах
маршрута.
• В таком случае акторы можно легко
компоновать в любых сочетаниях для
реализации сложных операций.
• Маршруты формируются динамически,
так что их можно менять без
обновлений и перезагрузки сервера.
• Изменение маршрута может проходить
без участия программиста.
Программисты нужны только для
разработки новых акторов.
31
Контрольные точки
• При поступлении запроса
(сообщение) от пользователя, при
прохождении через контрольную
точку сообщение сохраняется как
есть в базе данных.
• Дальше сообщение отправляется по
маршруту
• Если в результате сбоя в работе
какого-либо актора, запрос в данный
момент не может быть выполнен, то
благодаря тому, что все данные
сохранены в контрольной точке, мы
можем исправить ошибку и
повторить операцию без
дополнительных действий со
стороны пользователя.
Контрольная точка
сохраняет в БД входящее
сообщение как есть
Конечная точка маршрута
сообщения
32
Преимущества контрольных точек
• Можно ответить пользователю раньше, чем
завершится обработка операции, что
уменьшает время отклика (ответ значит не
то, что операция завершена, а то, что
успешно принята заявка на выполнение
операции – в большинстве случаев этого
достаточно, как например, в платежном
терминале)
• Пользователь не видит, что внутри нашей
системы могут проблемы – для него система
всегда работает правильно – ошибка
выражается лишь в увеличении времени
обработки операции
• Можно использовать несколько
контрольных точек в одном маршруте,
чтобы уменьшить объем работы в случае
сбоя
• Не теряется информация от внешних систем,
например, платежных, в случае сбоя в
нашей системе – данные от внешних систем
сохранятся в некоторой контрольной точке
Контрольная точка сохраняет в
БД входящее сообщение как
естьвходящий
запрос
ответ
33
Библиотека акторов
Актор имеет имя и версию. Чтобы система
стала использовать актор, разработчик обязан
опубликовать его в библиотеке акторов. Ни
один актор не потеряется, а библиотека будет
хранить информацию обо всех акторах,
которые когда либо были в нашей системе, а
также о тех, кто их опубликовал! Исключается
человеческий фактор при деплое на сервера,
обеспечивается безопасность.
34
Библиотека конфигураций
• Структура каждого сервера описывается
JSON
• Все конфигурации с версиями хранятся в
библиотеке конфигураций
• Чтобы обновить конфигурацию на
сервере, ему посылается сообщение с
идентификатором конфигурации
• Сервер обращается в библиотеку
конфигураций и получает требуемую
конфигурацию
• При необходимости сервер сам
выкачивает из библиотеки акторов
требуемые конфигурацией акторы
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
35
Преимущества библиотеки
конфигураций
• Быстро клонировать сервера – достаточно
установить нашу библиотеку (скопировать
файлы) и послать сообщение с необходимой
конфигурацией
• Автоматический деплой – надо только написать
конфигурационный файл
• Можно выставлять время обновления
• Автоматический откат – если возникают ошибки
при инициализации сервера, то автоматически
откатываемся до старой конфигурации
• Ни одна конфигурация не теряется
• Можно иметь одновременно сервера, которые
работают с разными версиями данных,
например, если часть клиентов, которые
работают с Вами по API еще не перешла на
новую версию
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
36
Методы обнаружения разладки
Используем мат.
статистику для
обнаружения и
исправления
ошибок. Акторы-
датчики измеряют
поведение системы,
потом эта
передается на вход
специальных
алгоритмов,
позволяющих
обнаруживать
ошибки на
работающей
системе без
программистов и
тестировщиков.
37
Как узнать, что изменения дали
положительный эффект
Карта количества сообщений в контрольной точке
Рост числа сообщений говорит о возникновении систематической
ошибки, резкий спад – о том, что ошибка была устранена.
38
Все ли пользователи
одинаково полезны
Обмен сообщениями между пользователями
Анализ аномальной активности показал, что появился
пользователь, который стал активно предлагать другим
переходить на ресурс-конкурент.
39
Если коллеги не идут на
сотрудничество
Аргумент при общении со сторонними разработчиками
Один из клиентов предъявлял претензии, потому что его
разработчики (компания-аутсорсер) говорили, что проблема в
нас.
40
Активность пользователей можно
создавать
Грамотный троллинг увеличивает рейтинги
Постоянные посетители готовы общаться – им нужно только
немного помочь. Стоит ли эффект вложенных средств?
41
Преимущества решения
• Масштабируемые приложения могут
строить разработчики с небольшим
опытом работы или вообще без
опыта
• Нет проблем с миграциями данных
• Методы объективного контроля
работоспособности всей системы, не
зависящие от программистов и
тестировщиков
• Быстрое клонирование и
развертывание серверов по
необходимости
• Возможность адаптации или правки
автоматизируемых бизнес-
процессов без участия
программистов.
42
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
• Количество ошибок по сравнению с
предыдущей версией уменьшилось в
1000 раз!
• Количество серверов уменьшено с 15
до 3!
• Объявление можно подавать
простым текстом вместо длинной
формы: “Двушка в Советском округе,
проспект Мира, 64, в районе ост.
Политех, 50/34/8, 3/5п, не требует
ремонта, санузел раздельный, хрущевка.”
43
Существующие внедрения – платформа
для контекстной рекламы
• Требование – время отклика строго меньше 100 мс
• Попытки задействовать ElasticSearch, MongoDb и т.д. дают
в некоторых случаях 200 мс и больше
• Был написан актор, который хранит все критерии
рекламных компаний сразу в памяти.
• Получили время отклика 7-46 мс (сам поиск по структуре
в памяти < 1 мс)
• Для масштабирования система поддерживает работу с
несколькими экземплярами серверов
44
Существующие внедрения –
кроссплатформенное приложение
• Приложение считает время по
каждой задаче программиста,
снимает скриншоты, мониторит
активность клавиатуры и мыши
• Интерфейс написан на HTML5 и CSS3
• Бизнес-логика написана на нашей
библиотеке
• Приложение работает без
изменений под Mac, Window, Linux
(кроме методов снятия скриншота и
логирования активности – это малая часть
– до 40 ч работы – по сравнению со всем
приложением)
45
Спасибо за внимание
Евгений Тюменцев
HWdTech, LLC
etyumentcev@hwdtech.ru
twitter.com/etyumentcev

Weitere ähnliche Inhalte

Was ist angesagt?

Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
Yuri Zhloba
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
Sergey Xek
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Badoo Development
 

Was ist angesagt? (14)

Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
рентабельный код
рентабельный кодрентабельный код
рентабельный код
 
Что и почему писать на Erlang
Что и почему писать на ErlangЧто и почему писать на Erlang
Что и почему писать на Erlang
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Erlang&rails
Erlang&railsErlang&rails
Erlang&rails
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
 
Максим Лапшин — введение в Erlang
Максим Лапшин — введение в ErlangМаксим Лапшин — введение в Erlang
Максим Лапшин — введение в Erlang
 
Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?
 
Erlang ruby
Erlang rubyErlang ruby
Erlang ruby
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for Yandex
 
Отличие Erlang от объектных языков
Отличие Erlang от объектных языковОтличие Erlang от объектных языков
Отличие Erlang от объектных языков
 

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

2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
HappyDev
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей Шетухин
Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Ontico
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
HappyDev
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
Iosif Itkin
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
it-people
 

Ähnlich wie Как жить в согласии с SOLID? (20)

Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешево
 
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
 
Team workflow
Team workflowTeam workflow
Team workflow
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей Шетухин
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentMobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Sivko
SivkoSivko
Sivko
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
методики управления развитием ис на базе 1с
методики управления развитием ис на базе 1сметодики управления развитием ис на базе 1с
методики управления развитием ис на базе 1с
 
Методики управления развитием ис на базе 1с
Методики управления развитием ис на базе 1сМетодики управления развитием ис на базе 1с
Методики управления развитием ис на базе 1с
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
Moscow js node.js enterprise development
Moscow js node.js enterprise developmentMoscow js node.js enterprise development
Moscow js node.js enterprise development
 

Mehr von etyumentcev

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
etyumentcev
 
разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1
etyumentcev
 
введение в Sql
введение в Sqlвведение в Sql
введение в Sql
etyumentcev
 
ук 03.011.01 2011
ук 03.011.01 2011ук 03.011.01 2011
ук 03.011.01 2011
etyumentcev
 
ук 03.010.01 2011
ук 03.010.01 2011ук 03.010.01 2011
ук 03.010.01 2011
etyumentcev
 
ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011
etyumentcev
 
ук 03.007.02 2011
ук 03.007.02 2011ук 03.007.02 2011
ук 03.007.02 2011
etyumentcev
 
ук 03.006.02 2011
ук 03.006.02 2011ук 03.006.02 2011
ук 03.006.02 2011
etyumentcev
 
ук 03.005.03 2011
ук 03.005.03 2011ук 03.005.03 2011
ук 03.005.03 2011
etyumentcev
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
etyumentcev
 
ук 03.001.02 2011
ук 03.001.02 2011ук 03.001.02 2011
ук 03.001.02 2011
etyumentcev
 

Mehr von etyumentcev (20)

Программирование глазами математика
Программирование глазами математикаПрограммирование глазами математика
Программирование глазами математика
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
 
Как 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проектКак 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проект
 
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1
 
высокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затратвысокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затрат
 
зачем нужны системы управления проектами
зачем нужны системы управления проектамизачем нужны системы управления проектами
зачем нужны системы управления проектами
 
введение в Sql
введение в Sqlвведение в Sql
введение в Sql
 
почему буксует тайм менеджмент
почему буксует тайм менеджментпочему буксует тайм менеджмент
почему буксует тайм менеджмент
 
ук 03.011.01 2011
ук 03.011.01 2011ук 03.011.01 2011
ук 03.011.01 2011
 
ук 03.010.01 2011
ук 03.010.01 2011ук 03.010.01 2011
ук 03.010.01 2011
 
ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011
 
ук 03.007.02 2011
ук 03.007.02 2011ук 03.007.02 2011
ук 03.007.02 2011
 
ук 03.006.02 2011
ук 03.006.02 2011ук 03.006.02 2011
ук 03.006.02 2011
 
ук 03.005.03 2011
ук 03.005.03 2011ук 03.005.03 2011
ук 03.005.03 2011
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
ук 03.001.02 2011
ук 03.001.02 2011ук 03.001.02 2011
ук 03.001.02 2011
 

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

  • 1. Как жить в согласии с SOLID? Евгений Тюменцев HWdTech, LLC hwdtech.ru 11-я конференция .NET разработчиков 31 октября 2015 dotnetconf.ru
  • 2. 2 Особенности разработки ПО Чем больше размер проекта, тем медленнее работают программисты. На графике пунктирная линия – трудозатраты, если бы скорость работы была постоянной, а сплошная – реальные трудозатраты. Фредерик Брукс, «Мифический человеко-месяц»
  • 3. 3 Если сравнить программиста и каменщика Предположим, что каменщик кладет один кирпич за 5 минут. Тогда он первый и тысячный кирпичи уложит за 5 минут. Программист же первый кирпич кладет за 5 минут, а тысячный почему-то за 100 часов!
  • 4. 4 Почему так получается у программистов? Программисты перед тем, как сделать что-то новое, вносят изменения в уже написанный код, структуру базы данных. Во-первых, нужно еще найти это место, куда внести изменения, а, во-вторых, убедиться, что новые правки не сломали то, что уже работало. Это как, если бы строители, перед тем как построить очередной этаж, сначала ломали и перестраивали все предыдущие.
  • 5. 5 • Сроки нарушаются • Требуется все больше разработчиков • Быстрее переписать, чем продолжать
  • 6. 6 Логика Хоара 1969 г. An Axiomatic Basis for Computer Programming 1971 г. Procedures and Parameters: An Axiomatic Approach 1980 г. премия Тьюринга 1990 г. Медаль “Пионер компьютерной техники” 2000 г. рыцарский титул за заслуги в области образования и компьютерной техники, премия Киото Чарльз Хоар
  • 7. 7 Факты о логике Хоара Система аксиом, содержащая if и while полна При добавлении новой конструкции в язык, существующие аксиомы для goto делают логику противоречивой.
  • 8. 8 Факты о логике Хоара Если использовать 1. статическое связывание 2. Рекурсию 3. Вложенные процедуры 4. Процедуры, принимающие в качестве параметров процедуры. 5. Глобальные переменные то не существует полной системы аксиом.
  • 9. 9 Логика Хоара часто противоречива ⊢ 𝐿 𝞿 и ⊢ 𝐿 `𝞿 Значит, что любое изменение в коде надо тестировать!
  • 14. 14 Что делать? Итерации Низкая степень связности Небольшая вложенность процедур Модульное тестирование Рефакторинг Planning poker Agile Хорошо определенные требования
  • 15. 15 Что делать? SOLID Доказаны математически (2014 год) Верны не только для ООП, но и для функционального, и процедурного программирования!
  • 17. 17 Если SOLID, то, скорее всего, нельзя switch enum Приведение типов new
  • 18. 18 Процессоры уже не те! • Рост производительности одного ядра процессора остановился! • Рост производительности приложений теперь должен обеспечиваться за счет активного использования многоядерности. Herb Sutter, 2005 The Free Lunch Is Over A Fundamental Turn Toward Concurrency in Software “The bad news is that, at least in the short term, the growth will come mostly in directions that do not take most current applications along for their customary free ride.
  • 19. 19 Многопоточные приложения сложны • Нужны специалисты • Трудно прогнозировать результат • Дорого
  • 20. 20 Базы данных • Скорость выполнения запросов • Миграция • Репликация • Непротиворечивость • ORM
  • 21. 21 Один формат для всех данных • Все данные хранятся в виде JSON в реляционной БД (не NoSQL база). Почему реляционная – есть транзакции. • Структура базы очень проста – всего 6 (!) запросов к БД. • Всегда известно среднее время выполнения любого запроса (в том числе полнотекстовых поисковых запросов). Поскольку запросы фиксированы, то время их выполнения не зависит от квалификации разработчика. • Не нужно миграций вообще – одновременно можно хранить сразу несколько версий одних данных (система будет корректно работать со всеми версиями) • Базу легко масштабировать и поддерживать скорость выполнения запросов – достаточно выделить нужные записи в отдельную коллекцию. Например, если у Вас объявления о продаже автомобилей и из них половина – это Toyota, то их можно выделить в отдельную коллекцию, или, наоборот, из-за ухода General Motors количество продаваемых Chevrolet, Opel снизилось, то их можно собрать в одну коллекцию. Это делается однажды написанными процедурами и хорошо отлаженными слияния и разделения коллекций, то есть участие программиста для этих операций не требуется. { ‘фамилия’: ‘Иванов’, ‘заказы’: [ { ‘дата’: ’01.09.2015’, ‘стоимость’: 2000 }, { ‘дата’: ’01.10.2015’, ‘стоимость’: 2000 } ] }
  • 22. 22 Интерфейс работы с данными 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; } }
  • 23. 23 Унификация обработчиков Каждый обработчик принимает на вход IObject Как организовать связи между обработчиками? Нужно использовать оператор расширения (см. доклад с 10 конференции DotNetConf) Лучше всего подходит отправка сообщений, так как она не требует, чтобы оба обработчика находились в одном адресном пространстве
  • 24. 24 Акторы – альтернатива многопоточности Carl Hewitt, Peter Bishop, Richard Steiger A Universal Modular ACTOR Formalism for Artificial Intelligence 1973
  • 25. 25 Что такое актор? Актор – вычислительная сущность, которая может за один шаг • Отправить конечное число сообщений другим акторам • Создать конечное число акторов • Выбрать поведение для приема следующего сообщения
  • 26. 26 Многопоточность vs Акторы Многопоточность больше всего похожа на телефонию. Доступ к ресурсу – телефонный звонок. Адресат может быть занят или не брать трубку – живая и мертвая блокировки. Чтобы одновременно принимать много звонков, в телефонии используют офисные АТС – объекты синхронизации. Акторы похожи на почтовую систему. Чтобы выполнить какое-либо действие актор посылает сообщение – письмо адресату, и дальше занимается своими делами. Не нужно никаких блокировок вообще, можно послать много сообщений за 1 раз, но нет гарантий, что каждое сообщение будет доставлено адресату.
  • 27. 27 Почему своя реализация акторов, а не, например, Erlang, Scala и т.д.? • У нас низкий порог вхождения – разработчики без опыта работы – надо знать только чистый Java без Framework’ов. • Erlang не подходит для длительных вычислений (типичная ситуация, когда при решении многопоточных задач Erlang проигрывает в скорости – см., например, рис. справа 18,19 место и проигрыш в ~20 раз!) • Подход Scala (без инверсии зависимостей – Philipp Haler, Martin Odersky, 2006 Event-Based Programming Without Inversion Control) заставляет разработчика самого задумываться о распараллеливании задач в коде, то есть требуется наличие хорошего опыта • Мы предлагаем решения в акторах, которых нет ни на одной платформе (речь пойдет далее)
  • 28. 28 Архитектура Каждый актор запущен внутри некоторого процесса – Node. Каждый актор подключен к одному или нескольким каналам шины сообщений – MessageBus. Чтобы отправить сообщение актору, надо его опубликовать в соответствующем канале.
  • 29. 29 Маршруты сообщений • Акторную модель можно представить в виде графа, где каждая вершина – это актор, а стрелка показывает, что один актор (основание стрелки) посылает сообщение другому актору (конец стрелки) • Маршрут сообщения – это путь в графе, которое проходит сообщение от момента создания до завершения обработки. • Обычно, информация о том, кому посылать сообщение зафиксирована в исходном коде актора. • Это требует модификации актора и, соответственно, обновления сервера, каждый раз, когда нам необходимо внести изменения в соответствующий алгоритм (например, в запрограммированный бизнес-процесс)
  • 30. 30 Управление маршрутами без программиста • Наше решение предлагает вынести информацию об адресатах сообщений за пределы актора, так чтобы он ничего не знал о следующих акторах маршрута. • В таком случае акторы можно легко компоновать в любых сочетаниях для реализации сложных операций. • Маршруты формируются динамически, так что их можно менять без обновлений и перезагрузки сервера. • Изменение маршрута может проходить без участия программиста. Программисты нужны только для разработки новых акторов.
  • 31. 31 Контрольные точки • При поступлении запроса (сообщение) от пользователя, при прохождении через контрольную точку сообщение сохраняется как есть в базе данных. • Дальше сообщение отправляется по маршруту • Если в результате сбоя в работе какого-либо актора, запрос в данный момент не может быть выполнен, то благодаря тому, что все данные сохранены в контрольной точке, мы можем исправить ошибку и повторить операцию без дополнительных действий со стороны пользователя. Контрольная точка сохраняет в БД входящее сообщение как есть Конечная точка маршрута сообщения
  • 32. 32 Преимущества контрольных точек • Можно ответить пользователю раньше, чем завершится обработка операции, что уменьшает время отклика (ответ значит не то, что операция завершена, а то, что успешно принята заявка на выполнение операции – в большинстве случаев этого достаточно, как например, в платежном терминале) • Пользователь не видит, что внутри нашей системы могут проблемы – для него система всегда работает правильно – ошибка выражается лишь в увеличении времени обработки операции • Можно использовать несколько контрольных точек в одном маршруте, чтобы уменьшить объем работы в случае сбоя • Не теряется информация от внешних систем, например, платежных, в случае сбоя в нашей системе – данные от внешних систем сохранятся в некоторой контрольной точке Контрольная точка сохраняет в БД входящее сообщение как естьвходящий запрос ответ
  • 33. 33 Библиотека акторов Актор имеет имя и версию. Чтобы система стала использовать актор, разработчик обязан опубликовать его в библиотеке акторов. Ни один актор не потеряется, а библиотека будет хранить информацию обо всех акторах, которые когда либо были в нашей системе, а также о тех, кто их опубликовал! Исключается человеческий фактор при деплое на сервера, обеспечивается безопасность.
  • 34. 34 Библиотека конфигураций • Структура каждого сервера описывается JSON • Все конфигурации с версиями хранятся в библиотеке конфигураций • Чтобы обновить конфигурацию на сервере, ему посылается сообщение с идентификатором конфигурации • Сервер обращается в библиотеку конфигураций и получает требуемую конфигурацию • При необходимости сервер сам выкачивает из библиотеки акторов требуемые конфигурацией акторы { ‘actors’: [{ ‘name’: ‘emailSender’, ‘smtp’: …, }, { ‘name’: ‘dailyReport’, … } ‘messagePaths’: [{ ‘name’: ‘newAd’, … }], ‘enpoints’: […] }
  • 35. 35 Преимущества библиотеки конфигураций • Быстро клонировать сервера – достаточно установить нашу библиотеку (скопировать файлы) и послать сообщение с необходимой конфигурацией • Автоматический деплой – надо только написать конфигурационный файл • Можно выставлять время обновления • Автоматический откат – если возникают ошибки при инициализации сервера, то автоматически откатываемся до старой конфигурации • Ни одна конфигурация не теряется • Можно иметь одновременно сервера, которые работают с разными версиями данных, например, если часть клиентов, которые работают с Вами по API еще не перешла на новую версию { ‘actors’: [{ ‘name’: ‘emailSender’, ‘smtp’: …, }, { ‘name’: ‘dailyReport’, … } ‘messagePaths’: [{ ‘name’: ‘newAd’, … }], ‘enpoints’: […] }
  • 36. 36 Методы обнаружения разладки Используем мат. статистику для обнаружения и исправления ошибок. Акторы- датчики измеряют поведение системы, потом эта передается на вход специальных алгоритмов, позволяющих обнаруживать ошибки на работающей системе без программистов и тестировщиков.
  • 37. 37 Как узнать, что изменения дали положительный эффект Карта количества сообщений в контрольной точке Рост числа сообщений говорит о возникновении систематической ошибки, резкий спад – о том, что ошибка была устранена.
  • 38. 38 Все ли пользователи одинаково полезны Обмен сообщениями между пользователями Анализ аномальной активности показал, что появился пользователь, который стал активно предлагать другим переходить на ресурс-конкурент.
  • 39. 39 Если коллеги не идут на сотрудничество Аргумент при общении со сторонними разработчиками Один из клиентов предъявлял претензии, потому что его разработчики (компания-аутсорсер) говорили, что проблема в нас.
  • 40. 40 Активность пользователей можно создавать Грамотный троллинг увеличивает рейтинги Постоянные посетители готовы общаться – им нужно только немного помочь. Стоит ли эффект вложенных средств?
  • 41. 41 Преимущества решения • Масштабируемые приложения могут строить разработчики с небольшим опытом работы или вообще без опыта • Нет проблем с миграциями данных • Методы объективного контроля работоспособности всей системы, не зависящие от программистов и тестировщиков • Быстрое клонирование и развертывание серверов по необходимости • Возможность адаптации или правки автоматизируемых бизнес- процессов без участия программистов.
  • 42. 42 Существующие внедрения – портал бесплатных объявлений и новостей • Команда – 5 студентов без опыта работы и филолог • Среднее время открытия страницы уменьшено с 4,5 с до 400 мс • Количество ошибок по сравнению с предыдущей версией уменьшилось в 1000 раз! • Количество серверов уменьшено с 15 до 3! • Объявление можно подавать простым текстом вместо длинной формы: “Двушка в Советском округе, проспект Мира, 64, в районе ост. Политех, 50/34/8, 3/5п, не требует ремонта, санузел раздельный, хрущевка.”
  • 43. 43 Существующие внедрения – платформа для контекстной рекламы • Требование – время отклика строго меньше 100 мс • Попытки задействовать ElasticSearch, MongoDb и т.д. дают в некоторых случаях 200 мс и больше • Был написан актор, который хранит все критерии рекламных компаний сразу в памяти. • Получили время отклика 7-46 мс (сам поиск по структуре в памяти < 1 мс) • Для масштабирования система поддерживает работу с несколькими экземплярами серверов
  • 44. 44 Существующие внедрения – кроссплатформенное приложение • Приложение считает время по каждой задаче программиста, снимает скриншоты, мониторит активность клавиатуры и мыши • Интерфейс написан на HTML5 и CSS3 • Бизнес-логика написана на нашей библиотеке • Приложение работает без изменений под Mac, Window, Linux (кроме методов снятия скриншота и логирования активности – это малая часть – до 40 ч работы – по сравнению со всем приложением)
  • 45. 45 Спасибо за внимание Евгений Тюменцев HWdTech, LLC etyumentcev@hwdtech.ru twitter.com/etyumentcev