Разработка через документирование (documentation-driven development)
29.05.2022
|
velkin |
Что-то там driven Development
Многие не раз слышали о разработке что-то там driven Development, та же разработка через тестирование. Разработка через тестирование разрабатывалась не потому, что без неё ну никак не обойтись, а потому, что есть ленивые программисты, которым лень писать тесты, после того, как они закодировали алгоритм.
Разработка по RUP
Возьмём ключевые процессы разработки по RUP.
Ключевые процессы
Или возьмём ключевые процессы из википедии.
1) Моделирование
2) Требования
3) Проектирование
4) Кодирование
5) Тестирование
6) Отладка
7) Документирование
8) Развёртывание
9) Сопровождение
Смена порядка процессов разработки
По сути разработка через тестирование это просто смена порядка процессов разработки. Кодирование и тестирование меняются местами. Но не только, в каком-то роде тестирование становится главенствующим процессом.
Исходя из этой нехитрой логики можно получить следующие виды разработки.
Процесс (роль).
1) Разработка через моделирование (бизнес аналитик)2) Разработка через требования (системный аналитик)
3) Разработка через проектирование (архитектор)
4) Разработка через кодирование (кодировщик)
5) Разработка через тестирование (тестировщик)
6) Разработка через отладку (отладчик)
7) Разработка через документирование (документовед)
8) Разработка через развёртывание (мейнтейнер)
9) Разработка через сопровождение (поддержка)
Чаще всего люди кодируют, потому разработка через кодирование это самый частый вид разработки. Но тот же архитектор программного обеспечения мог бы разрабатывать программы посредством разработки через проектирование.
Тоже самое можно отнести и к другим процессам разработки, причём их как и ролей гораздо больше. Тот же менеджер (управляющий) проекта управляет проектом. У него может быть древовидная канбан доска для задач или ещё что-нибудь. Но заметьте, что для понимания любого процесса лучше подойдёт документирование.
Теги в коде
Более того, современные системы документирования позволяют внедрять теги в код, а потом при генерации отображать уже не весь код, а только его часть.
В AsciiDoctor это может выглядеть как-то так.
abs.lua
print(
-- tag::example[]
math.abs(-25)
-- end::example[]
)
documentation.adoc
.показать весь документ
include::abs.lua[]
.показать только тег example
include::abs.lua[tag=example]
Получим документацию.
показать весь документ
print(
-- tag::example[]
math.abs(-25)
-- end::example[]
)
показать только тег example
math.abs(-25)
О том для чего это нужно говорилось в других статьях.
Модифицируемость кода (Changeability QA)
Отсечение целей (сложность разработки)
Ascii-графика
Самый простой способ документирования схем использовать ascii-графику. Хотя можно поднапрячься и использовать более сложные схемы, а то и просто внедрить обычный svg код.
8-ми битный байт
[ditaa, target=byte8]
....
+--+--+--+--+--+--+--+--+
:0 :1 :2 :3 :4 :5 :6 :7 :
+--+--+--+--+--+--+--+--+
|1 |2 |3 |4 |5 |6 |7 |8 |
+--+--+--+--+--+--+--+--+
....
Граф
[ditaa, target=graph]
....
/--\
/->+b +-\
/--\ | \--/ | /--\
|a +-+ +->|d |
\--/ | /--\ | \--/
\->+c +-/
\--/
....
Диаграмма активности
[ditaa, target=activitydiagram]
....
● начало
|
v
/-+-\
+----+{c}+----+
| \---/ |
v v
/----+-----\ /-----+----\
|активность| |активность|
\----+-----/ \-----+----/
| /---\ |
+----+{c}+----+
\-+-/
|
v
◉ конец
....
Диаграмма состояний
[ditaa, target=statediagram]
....
/------\
|начало|
\--+---/
|
/----/
|
v
/--+--\ /-------\
|ждите+->+закрыть|
\--+--/ \---+---/
| |
\----+----/
|
v
/--+--\
|конец|
\-----/
....
Интерфейс
[ditaa, target=interface]
....
/------------------------------\
| Привет чумба _[]x|
+--+--+--+---------------------+
|N |O |S | |
+--+--+--+--+------------------+
| | |
| | |
| | |
| | |
| | |
| | |
| | |
+-----------+------------------+
|я слежу за тобой чумба... |
+------------------------------+
....
Классификация понятий
Так же можно использовать классификацию понятий в программировании. Это нужно для борьбы с забыванием, которое можно наглядно наблюдать на кривой забывания.
Самый быстрый способ провести классификацию это использовать комбинированную версию списка описаний и древовидного списка.
.классификация по [признаку1]
Категория 1::
* Элемент 1
* Элемент 2
Категория 2::
* Элемент 3
* Элемент 4
.классификация по [признаку2]
Категория 3::
* Элемент 1
* Элемент 3
Категория 4::
* Элемент 2
* Элемент 4
Как видим элементы всё те же, то есть Элемент 1, Элемент 2, Элемент 3, Элемент 4, но когда они классифицируются по другим признакам, то входят в другие категории понятий.
Особо стоит отметить, что в файловых директориях понятие может располагаться только по одному признаку, который условно можно признать за основной.
Содержа́ние поня́тия — это знание о совокупности существенных признаков класса предметов.
Объём понятия — это знание о круге предметов, существенные признаки которых отображены в понятии.
Обобщить понятие — это значит перейти от менее общего к более общему понятию.
Ограничить понятие — это значит перейти от более общего понятия к менее общему понятию.
Заключение
Вот таким не особо хитрым образом можно документировать как свой, так и чужой код. По сути это означает сделать процесс документирования первичным, а все остальные процессы разработки вторичными. Благодаря этому все полученные знания могут быть преобразованы в html страницу или электронную книгу.
29.05.2022 7 комментариев |
V>
Что-то там driven Development
Эти идеи уже в прошлом. На практике программные системы настолько сложны, что их детальное проектирование и верификация неподъемны.
scf>Эти идеи уже в прошлом. На практике программные системы настолько сложны, что их детальное проектирование и верификация неподъемны.
Недокументируемые особенности
Здесь дело не только в обучении, но и в недокументируемых особенностях. Да, системы сложны, только вот когда программисты над ними думают, то прорабатывают множество вариантов. Одни отбрасываются, другие наоборот становятся основными. Но из кода мы никогда не узнаем почему было сделано так, а не иначе.
Приёмы мышления
Более того, простой алгоритм может быть завёрнут в сложную мультипарадигмальную абстракцию. Здесь было бы уместнее говорить, что данный алгоритм просто адаптирован под конкретную архитектуру. Даже если у программиста есть время на разбор программы, то всё равно желательно иметь какой-то вспомогательный инструмент для сравнения, анализа и синтеза.
Системы документирования
Да и опять же, почему бы и нет. Хотя на эту тему я больше нахожу статьи на английском. Идея как бы не нова, но реализация тоже играет существенную роль. Как-то читал какую-то книгу по программированию, так автор там хвалил некую систему документации, что он смог всё сверстать благодаря ей. Я не помню, может это LaTex, может ещё что, но важен принцип разделения и сборки. В моём примере я использовал AsciiDoctor.
Модель разработки
Опять же с документацией у программистов точно такая же проблема, как и с тестированием. Не набрал сразу, потом просто лень это делать. Про устаревание я слышал лишь, что водопадная модель разработки представляет проблему, так как требует заканчивать этап до перехода к следующему. Взамен ему пришла итеративная модель разработки. Сам процесс документирования никто не отменял, а я и нигде не говорил, что нужно сначала абсолютно всё задокументировать, а потом кодировать.
Исчерпывающая документация
Речь лишь о том, чтобы программист мог получить исчерпывающую информацию при просмотре документации, включая полный исходный код, сравнение разных фрагментов кода, объединение его по функционалу, отображение бизнес моделей, требований, архитектуры и даже логи юнит тестов и бенчмарков, если надо.
водопадная модель разработки
итеративная модель разработки
V>
итеративная модель разработки
V>Image: 320px-Iterative_development_model.svg.pngscf>Эти идеи уже в прошлом. На практике программные системы настолько сложны, что их детальное проектирование и верификация неподъемны.
Включение кода
Мне ещё вот что подумалось. В худшем случае при разработке через документирование разработчик будет включать код каждого файла и всё. Тем более это скорее всего желательно будет делать в любом случае для обзора программы или её части пофайлово.
Исходные файлы
Но по мере продвижения разработчик может помимо этого начать вставлять теги в виде обрывков кода, которые могут представлять собой классы, функции, любые случайные части. И тогда уже можно группировать функционал по тегам, что упростит анализ кода, нежели мотание в IDE. Тем более IDE без тегов всё равно не знает где один и тот же функционал, а где нет.
Функционал 01
Функционал 02
Функционал 03
Я об этом уже написал в основной статье. Но это я к тому, что никто не заставляет делать всё сразу. Именно этого боятся люди, когда вместо решения небольшой задачи на них будет взвален неподъёмный вес. Конечно, если программист не может проанализировать маленький кусочек кода с помощью документации, то тут уже ничего не поделаешь.
V>
Ascii-графика
Открой уже для себя PlantUML
Ошибочное предположение
Здравствуйте, Ночной Смотрящий, Вы писали:
V>>Ascii-графика
НС>Открой уже для себя PlantUML
Это давно уже известно. В статье я ограничился комментарием.
Под более сложными схемами как раз и имелись в виду PlantUML, Syntrax и прочие. Просто у меня не было желания обсуждать нубские темы в гораздо более серьёзной статье следующего уровня развития. Но раз уж ты затронул эту тему, то объясню более подробно почему получилось то, что получилось.
Полный список расширений можно посмотреть здесь.
https://docs.asciidoctor.org/diagram-extension/latest/
Виды PlantUML
Обрати внимание как выглядит PlantUML:
https://plantuml.com/ru/
Uml диаграмма:
1) Диаграммы последовательности
2) Диаграммы использования (прецедентов)
3) Диаграммы классов
4) Диаграммы объектов
5) Диаграммы активности (вот устаревший синтаксис)
6) Диаграммы компонентов
7) Диаграммы развёртывания
8) Диаграммы состояний
9) Диаграммы синхронизации
Другие диаграммы:
1) JSON данные
2) Данные в формате YAML
3) Диаграммы сети (nwdiag)
4) Каркасный графический интерфейс
5) Диаграммы ArchiMate
6) Язык описания и спецификации (SDL)
7) Диаграммы Ditaa
7) Диаграммы Gantt
8) Диаграммы MindMap
9) Диаграммы иерархической структуры работ (WBS)
10) Математика в нотации AsciiMath или JLaTeXMath
11) Диаграммы типа сущность — связь (ER)
Минусы PlantUML
Давай для примера возьмём диаграмму активности из примера на сайте.
Здесь есть очевидные минусы:
1) Диаграмму активности нельзя править без специальных знаний синтаксиса PlantUML, который сложнее ascii-графики.
2) Этот синтаксис по сути просто дублирует код, пусть и на псевдоязыке, то есть лишняя работа.
3) Документацию при правке в которой и будет происходить вся работа придётся видеть не в виде схемы, а в виде кода.
4) Документация может быть сгенерирована без использования диаграмм,
то есть так (без генерации диаграмм)
а не так (с генерациями диаграмм)
5) Чтобы проверить диаграмму PlantUML на правильность придётся её сгенерировать и обновить страницу, это очень много лишней работы.
6) Синтаксис конкретных диаграмм как правило менее универсален, в отличии от ascii-графики, которая имеет менее жёсткие ограничения.
И вот ты скажешь, ерунда, ничего сложного. Но давай посмотрим на диаграммы классов без генерации изображений.
По мне так наглядность подобных "схем" стремится к нулю. Я когда давным давно попробовал PlantUML был впечатлён, как впрочем и другими генераторами. Но вот когда начинаешь набирать что-то сам на практике, то некоторые вещи становятся слишком сложными.
Плюсы PlantUML
Но у генераторов не из ascii-графики, в частности у PlantUML есть плюсы. Например, если сгенерировать формулу с помощью stem
https://docs.asciidoctor.org/asciidoc/latest/stem/
Для примера вот так:
То при отключении интернета вдруг обнаружишь, что тебе выдало на странице не формулу
а текст
А почему так происходит можно почитать:
https://docs.mathjax.org/en/latest/input/asciimath.html
https://docs.mathjax.org/en/latest/input/tex/index.html
https://en.wikipedia.org/wiki/MathJax
И вот здесь пусть даже сложный синтаксис может прийти к месту. Тем более он что так, что так сложный для вывода математики. Главное, что в результате получим изображение в формате svg, а не какой-то JavaScript.
Иные генераторы Ascii-графики
Помимо Ditaa есть так же A2S (ASCIIToSVG), Shaape, Svgbob. Хотя за некоторые генераторы можно сказать, что они более продвинутые, тогда как Ditaa самая скромная по функционалу, так же стоит отметить их сложную установку в некоторых случаях.
Иные возможности генерации
Помимо генераторов диаграмм на мой взгляд интересные возможности предоставляют генераторы кодов, такие как qrcode и прочие.
Например, ссылка:
Превращается в:
И считывается смартфоном. Да, сейчас такое модно не только в печатных книгах, но и на сайтах.
Теория против практики
Вкратце я описал, почему в примерах не использовался PlantUML и другие генераторы. А там, кстати, есть ещё и не генераторы, а редакторы. Хотя когда-то на заре изучения мне это тоже казалось хорошей идеей. В этом даже нет ничего такого уж плохого, кроме перечисленных мною минусов и того, что придётся нанять какого-нибудь специального человека для ведения документации.
Я ведь в статье не шучу, что разработку через тестирование придумали из-за лени. А всё почему, да потому что всё, что замедляет процесс работы программисты очень быстро отбрасывают. И они понимают это, но ничего не могут с собой поделать. Тогда появляются что-то driven Development. Попробуй заставить даже не других людей, а себя писать на PlantUML.
Какие-либо рациональные предложения должны решать проблемы, а не создавать их.
Обрати внимание на старую тему (25.06.20):
https://www.rsdn.org/forum/shareware/7763329.all
Как я и сказал в самом начале, ничего нового ты не открыл. Вопрос в том, есть ли у тебя самого успешный опыт применения PlantUML. Не в стиле, я знаю что есть PlantUML, сейчас пойду пацанам с форума расскажу. Чем-то ты можешь обосновать, что PlantUML эффективнее, или просто не мешает программировать. А то мой опыт говорит об обратном, хотя кто знает, что там дальше будет. Ведь я лично перепробовал уже огромное количество разнообразных систем.
V> По сути это означает сделать процесс документирования первичным, а все остальные процессы разработки вторичными. Благодаря этому все полученные знания могут быть преобразованы в html страницу или электронную книгу.
Я работал в таком ключе, оказалось, что это очень, очень скучная и непродуктивная работа.