@midia21

Как вы ведете документацию кода?

Многие говорят, что код должен быть самодокументируемым. Я считаю, что это безусловно важно. Однако существует много моментов, которые как мне кажется не сделаешь ясными без дополнительных пояснений, например: описание бизнес процессов, значение бизнес терминов, взаимосвязи модулей, различные тонкости, контекст внесения определенных изменений и т.д. В свою очередь такая - "отдельноживущая" документация начинает приносить свои проблемы - в виде необходимости постоянной поддержки.

В тех проектах, где я работал документацию поддерживали по настроению. Многие важные аспекты не были описаны. Много было неактуальной информации. Если посмотреть в перспективе на такой подход, то чем сложнее будет становиться проект тем больше будет появляться пробелов в документации и тем больше будет неактуальных мест. По моему в больших масштабах такой подход вообще не приносит пользы.

По мере накопления опыта работы все больше приходит ощущение, что в в ведении технической документации нужно применить многие из тех подходов, что применяются в проектировании хорошей архитектуры программного кода. Например: принцип DRY - не допускать чтобы информация в документации повторялась, для избежания расхождений, SRP - чтобы в определенном блоке документации не было ничего лишнего, что-то похожее на TDD - когда ты пишешь документацию а потом код. Было бы здорово иметь какие то CI/CD проверки документации, которые автоматически показывали бы покрытие кода документацией. Отдельная тема, которая интересует - это в каком виде хранить документацию, чтобы она была тесна связана с описываемым ею кодом. В идеале, чтобы при изменении логики определенного класса, сразу было понятно в каких местах нужно править документацию.

Это только сумбурные идеи. Хотелось бы найти что то более целостное. Какого то воркфлоу-фрэймворка типа DDD в мире документации, которые описывал бы что и как делать, чтобы было хорошо. Здорово было бы узнать и о какой-то книжке на эту тему, самому найти пока не удалось.

Собственно вопрос: как вы ведете документацию, какие подходы используете?
Буду рад любой информации. Заранее спасибо :)

Update:
Нашел пару интересных ссылок только что :)
https://www.writethedocs.org/guide/docs-as-code/
https://swimm.io/
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka
Токсичный шарпист
Многие говорят, что код должен быть самодокументируемым.

Так говорят только про случаи типа:
// Время до перегрева реактора в секундах
var a = 42;

return id % 3; // 3 - это количество наших серверов. Тут мы находим id нужного сервера, на котором хранятся данные

В вышеназванных случаях комментарий не нужен и может быть заменён нормальным неймингом.
В некоторых случаях комментарии можно заменить на нормальные типы.
// ПЛОХО!
/// <param name="time">Дата и в формате rfc2822</param>
public void DoSomething(string time) {}

// Хорошо!
public void DoSomething(DateTime time) {}

Писать комментарии в коде нужно там, где что-то не очевидно (описание какого-то алгоритма или протокола, например, ссылки на задачи, в рамках которых был добавлен какой-то неочевидный, но важный "костыль" и так далее)
+ Следует пользоваться встроенными средствами для документирования.

В тех проектах, где я работал документацию поддерживали по настроению. Многие важные аспекты не были описаны. Много было неактуальной информации. Если посмотреть в перспективе на такой подход, то чем сложнее будет становиться проект тем больше будет появляться пробелов в документации и тем больше будет неактуальных мест. По моему в больших масштабах такой подход вообще не приносит пользы.

Если вашей команде документация действительно важна, то её нужно вносить в основной цикл разработки.
Что-то типа
Specification -> Design review -> Development -> Review -> Testing -> Documentation -> Release
Тоесть нет документации - нет релиза. Нужно вносить роль технического писателя, который будет писать тексты и следить за актуальностью.

которые автоматически показывали бы покрытие кода документацией.

Код документацией покрывать не надо (по крайней мере так, как это обычно тестами происходит).
А вот для покрытия методов и публичного api и так есть инструменты для проверки. Например в C# даже warning есть соответствующий.

что-то похожее на TDD - когда ты пишешь документацию а потом код

Ну так это и так должно быть в процессе разработки. Аналитик пишет спецификацию, ты, как разработчик, её дорабатываешь до уровня "это вот так лучше реализовать", потом по этой спецификации можно написать тесты и код.

PS: Попробуй отталкиваться от того, кто будет эту документацию читать.
1. Новые разработчики в твоей команде во время онбординга? Тогда проще C4 Diagram нарисовать
2. Другие разработчики, которые хотят с твоим сервисом интегрироваться? Тогда и описывай протокол взаимодействия, примеры приложений, и имеющиеся публичные методы
3. Техподдержка? Тогда лучше посмотреть в сторону базы знаний
4. Пользователи системы? Тогда лучше отталкиваться от вариантов использования - инструкции, как сделать то или иное действие, обзоры разных модулей.
5. Аналитик при продумывании новых фич? Тогда тут нужно что-то среднее между п1, п2, и п3.
6. Никто? Тогда и не мучай бумагу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы