|
1 | 1 | --- |
2 | 2 | title: Эргономичный подход |
3 | | -description: Способ быстро создавать кодовые базы, которые легко менять для поддержки новых требований |
4 | 3 | type: docs |
| 4 | +weight: 125 |
| 5 | +bookHref: "/docs/about-ea" |
5 | 6 | --- |
6 | 7 |
|
7 | | -:source-highlighter: rouge |
8 | | -:icons: font |
9 | | -:sectanchors: |
10 | | -:toc: |
11 | | -:imagesdir: /docs/images |
12 | | - |
13 | | -== Об Эргономичном подходе |
14 | | - |
15 | | -_Эргономичный подход — способ быстро создавать эргономичные кодовые базы — кодовые базы, которые легко менять для поддержки новых требований._ |
16 | | - |
17 | | -Критерии, которым должна соответствовать хорошая кодовая база, давно известны: её поведение должно быть полностью покрыто быстрыми автоматическими тестами, а реализация должна обладать высокой функциональной связанностью (cohesion) и низкой сцепленностью (coupling). |
18 | | - |
19 | | -Однако множество кодовых баз всё ещё не соответствуют этим критериям. |
20 | | -Как следствие, критичные ошибки и горящие сроки являются «естественным» состоянием дел для многих команд. |
21 | | - |
22 | | -Мне такое состояние дел не подходит, и для того, чтобы вместе со своими командами систематически и быстро создавать хорошие кодовые базы я разработал Эргономичный подход. |
23 | | - |
24 | | -Эргономичный подход — это набор принципов, моделей, методик и шаблонов, которые помогают быстро проектировать и разрабатывать кодовые базы, полностью покрытые автоматическими тестами и с реализацией, обладающей высокой функциональной связанностью (cohesion) и низкой сцепленностью (coupling). |
25 | | - |
26 | | -Помимо этой вики я пишу об Эргономичном подходе в своих https://t.me/ergonomic_code[Telegram-канале] и https://azhidkov.pro/posts[блоге]. |
27 | | - |
28 | | -== Суть Эргономичного подхода |
29 | | - |
30 | | -По большому счёту Эргономичный подход можно свести к нескольким link:++{{<ref "docs/principles/">}}++[принципам] в трёх областях: |
31 | | - |
32 | | -. Тестирование: |
33 | | -.. тесты должны работать через публичное АПИ; |
34 | | -.. 100% поведения системы должно быть покрыто тестами; |
35 | | -.. моки должны использоваться только для верификации взаимодействия с неуправляемыми зависимостями, либо для симуляции трудновоспроизводимого поведения управляемых зависимостей (в первую очередь системные ошибки); |
36 | | -.. тесты должны быть быстрыми — < 10 секунд на полный цикл запуска одного теста, <300 секунд на запуск всех тестов сервиса; |
37 | | - |
38 | | -. Моделирование предметной области: |
39 | | -.. Предметная область должна быть разбита на небольшие слабосвязанные агрегаты; |
40 | | -.. Агрегаты и связи между ними должны образовывать направленный ацикличный граф; |
41 | | -.. Агрегаты должны быть представлены в коде неизменяемыми объектами, хранящиеся в изменяемых репозиториях. |
42 | | - |
43 | | -. Проектирование поведения: |
44 | | -.. Бизнес-логика и ввод-вывод должны быть разделены; |
45 | | -.. Бизнес-логика должна быть написана в виде чистых функций без побочных эффектов; |
46 | | - |
47 | | -На практике соблюдать эти принципы не так просто, как может показаться на первый взгляд. |
48 | | - |
49 | | -Прямолинейный подход к написанию тестов без моков может привести к их очень медленной работе, а тестирование через публичное АПИ — кровавому и хрупкому месиву в коде сетапа фикстуры. |
50 | | - |
51 | | -А разделение бизнес-логики и ввода-вывода в сложной операции системы или декомпозиция нетривиальной модели на агрегаты может оказаться сложной задачей даже для опытного разработчика. |
52 | | - |
53 | | -Поэтому весь свой опыт разработки в соответствии с этими принципами я свожу в модели, методики и шаблоны, которые позволяют всей команде не наступать на одни и те же грабли и не изобретать одни и те же велосипеды по нескольку раз. |
54 | | - |
55 | | -== Промышленное применение Эргономичного подхода |
56 | | - |
57 | | -С 2020 года я вместе с несколькими командами сделал в соответствии с Эргономичным подходом девять коммерческих проектов — от реинжиниринга ключевых подсистем и разработки небольших сервисов до реинжиниринга и дальнейшей разработки системы размером в два человек-года. |
58 | | -Суммарно по Эргономичному подходу написано уже порядка ста тысяч строк коммерческого Kotlin- и Java-кода. |
59 | | - |
60 | | -Все проекты были успешно переданы в промышленную эксплуатацию или заказчикам, а проекты по реинжинирингу дали объективное и существенное улучшение характеристик кодовой базы. |
61 | | - |
62 | | -Про опыт и результаты применения Эргономичного подхода в некоторых из этих проектов я рассказываю в своих выступлениях и постах. |
63 | | - |
64 | | -В докладе https://www.youtube.com/watch?v=wq9LBouRULs&list=PLVe-2wcL84b80nQ0KGik2CJ_H9G6DRc5d&index=5[Структурный дизайн. Древний секрет простого и быстрого кода] на Joker '24, его https://azhidkov.pro/posts/24/11/structured-design/#_%D0%BA%D0%B5%D0%B9%D1%81_3_project_e[расшифровке], а также серии постов (https://azhidkov.pro/posts/23/07/project-e-results/[1], https://azhidkov.pro/posts/23/09/project-e-part1/[2], https://azhidkov.pro/posts/23/10/project-e-part2/[3]), я рассказываю о том, как, выполнив реинжиниринг проекта силами юниоров, я повысил скорость и качество работы команды в три раза. |
65 | | - |
66 | | -В том же https://www.youtube.com/watch?v=wq9LBouRULs&list=PLVe-2wcL84b80nQ0KGik2CJ_H9G6DRc5d&index=5[докладе] и его https://azhidkov.pro/posts/24/11/structured-design/#_%D0%BA%D0%B5%D0%B9%D1%81_2_project_daniel[расшифровке] я также рассказываю о реинжиниринге модуля маршрутизации чат-центра Threads (сейчас — edna.chatcenter). |
67 | | -В результате реинжиниринга производительность модуля выросла в 300 раз, а код реализации превратился из спагетти-кода в аккуратное дерево: |
68 | | - |
69 | | -image::threads-reengineering.png[link={imagesdir}/threads-reengineering.png] |
70 | | - |
71 | | -В докладе https://youtu.be/7u7LGhXlpcE?t=1352[Рациональный подход к декомпозиции систем на модули или микросервисы] на JPoint '23 и link:https://azhidkov.pro/posts/23/04/ergonomic-decomposition/#\_%D0%BA%D0%B5%D0%B9%D1%81_%D0%BA%D1%8D%D0%BC%D0%BF[посте] с его расшифровкой я рассказываю о проекте Кэмп. |
72 | | -Проекте, сделанном в срок двумя юниорами, и с отзывом руководителя проекта на их работу: «К бэку у меня вообще претензий нет. Он просто работает». |
73 | | - |
74 | | -В посте https://azhidkov.pro/posts/22/06/220611-true-story-project/[Диаграмма эффектов: пример построения] я рассказываю о проектировании небольшого сервиса для X5 Group, обеспечивающего актуализацию информации о десятках тысячах магазинов сети "Пятёрочка" по всей стране в Яндекс.Картах и 2Гис. |
75 | | - |
76 | | -Наконец, в посте https://azhidkov.pro/posts/21/03/210321-project-l-testing/[Тесты, которым можно доверять], я рассказываю об устройстве тестирования проекта по проверке бизнес-гипотезы. |
77 | | -Этот проект позволил заказчику быстро и за фиксированную стоимость инвалидировать неудачную бизнес-идею и минимизировать потери. |
78 | | - |
79 | | -Также у меня есть два проекта с открытыми исходным кодом, сделанных по Эргономичному подходу: |
80 | | - |
81 | | -* https://github.com/ergonomic-code/Trainer-Advisor[Trainer Adviser] — некоммерческий, но настоящий и относительно большой (16К строк Kotlin-кода, 17 таблиц) с двумя реальным пользователями; |
82 | | -* https://github.com/ergonomic-code/Project-Mariotte[Project Mariotte] — минимальный демонстрационный проект. |
| 8 | +Редирект на индексную страницу |
0 commit comments