Всем привет. Меня зовут Таня, я работаю системным аналитиком в МТС. В этой статье я расскажу о том, как писать документацию для разработки микросервисов.
Моя команда развивает несколько виджетов на главном экране мобильного финтех-приложения. Когда мы «пилим» новую фичу, как правило, мы разрабатываем под нее новый микросервис. Я, как системный аналитик команды, проектирую наш будущий сервис и пишу документацию для разработки. Так как почти каждая новая фича требует создания своего микросервиса, мне часто нужно писать под это дело документацию. Поэтому хочу поделиться с хабровчанами тем, как это делается у нас в команде.
![](https://habrastorage.org/getpro/habr/upload_files/641/096/294/641096294bd3667bfd84fc4ce25e33d6.jpg)
Единый подход
Начну свое повествование с напоминания о том, как важно стремиться к единообразию. Когда компания становится большой, то появляется много команд и, соответственно, аналитиков. Приходит осознание того, что документация без единого шаблона становится слишком разной, она пестрая, не структурированная. Появляется потребность в разных формах стандартизации документации. Про важность единого подхода и о том, как плохо без него, я уже писала в статье «Как мы создали шаблон функциональных требований в разработке ПО» в соавторстве с моей коллегой Лизой Марковой.
Если кратко – не стандартизированная документация приводит к тому, что легко что-то упустить, а разработчикам приходится каждый раз привыкать к новому виду документации. Кроме того, не ясно, по каким критериям ревьюить эту самую документацию. Именно поэтому и у нас в стриме принят шаблон, о котором я и буду рассказывать.
Из чего состоит шаблон
Наш шаблон требований к микросервису состоит из следующих частей:
общее описание микросервиса;
методы;
алгоритм;
входящие данные;
исходящие данные;
исключения;
база данных;
справочники;
нефункциональные требования;
маппинги.
Это части необходимы для того, чтобы требования были полными.
Сразу скажу, что здесь вы не увидите данных о мониторинге сервиса. Это не потому, что его нет. Просто этот раздел мы не включаем пока в наш шаблон. Для постановки сервиса на мониторинг у нас разработан небольшой процесс, который требует также результатов нагрузочного тестирования и согласований с отделом, отвечающим за качество разрабатываемого ПО.
Итак, перейдем к детальному описанию каждого из разделов.
Описание микросервиса
Для того, чтобы каждому, кто придет смотреть документацию на наш сервис, было понятно, что это за сервис (для чего он нужен, кому принадлежит и в рамках какой задачи разрабатывался), у нас есть головная страница с описанием. Выглядит она так:
![Главная страница Главная страница](https://habrastorage.org/getpro/habr/upload_files/a34/1ed/dc8/a341eddc8e6b6d9055acf4ac5bbaae98.png)
На данной странице располагается название сервиса. Важно дать понятное название, которое будет описывать главную функцию сервиса. У нас в команде название сервису мы придумываем все вместе – накидываем варианты и выбираем лучший.
Далее идет таблица с интересным макросом. Называется он JIRA и выглядит так:
![Макрос JIRA Макрос JIRA](https://habrastorage.org/getpro/habr/upload_files/f0f/352/443/f0f352443d454d5c07542799c1a1dc88.png)
Добавив этот макрос, вы сможете вставить на страницу в Confluence список задач из Jira. Даже можно вписать JQL запрос и отобразить отфильтрованные задачи.
Подробнее о JIRA Query Language (JQL) можно почитать, пройдя по ссылке. Это очень удобный инструмент для всех, кто работает с Jira.
Далее идет стандартное отображение включенных страниц. В последней части этой страницы располагается таблица, куда можно добавить владельцев сервиса, его краткое описание и ссылки на Jira.
Головная страница собирает все включенные в нее страницы, что помогает в навигации по спецификации. Эта страница может претерпевать изменения, подстраиваться под сервис и команду.
API для сервиса
Далее по важности в первой вложенности следует описание API. Я покажу вам нашу реализацию на примере описания REST API. Методы в свою очередь тоже описываются по шаблону. В шаблон REST API входят:
общее описание;
алгоритм;
входящие данные;
исходящие данные;
исключения.
Важно то, что каждый раздел в описании метода описан на отдельной странице. Так удобно редактировать какую-то одну часть метода и иметь историю изменений именно по этой части, например, по алгоритму.
Итак, начнем с первой описательной части метода.
![Описание метода Описание метода](https://habrastorage.org/getpro/habr/upload_files/464/4dc/f0a/4644dcf0aa01559d0e4873bc0d42762d.png)
Здесь мы даем название методу. Как и в случае с сервисом, название методу нужно сделать интуитивно понятным для людей, которые будут сталкиваться с вашей документацией. Далее в таблице приводим тестовый UPI и ссылку на JIRA. У нас каждый метод разрабатывается в рамках отдельной таски.
Далее необходимо написать о назначении метода и, если это имеет значение, какую-то дополнительную информацию о методе. В конце мы кратко описываем результат этого метода.
Далее идет страница с описанием алгоритма метода. Алгоритм – это та логика, которую проворачивает сервис для получения результата по конкретному методу. Так сказать, его сердце.
![Алгоритм Алгоритм](https://habrastorage.org/getpro/habr/upload_files/b54/974/704/b54974704eee71680a7c68167ba71b77.png)
Если в алгоритме есть несколько фильтрацией или валидаций, то можно указать их в таблице для наглядности. Шаги описанные в алгоритме – это не обязательно то, как будет реализована последовательность проверок в коде. Главное – описать все, что нужно сервису для получения результата. Далее разработчик сам реализует так, чтобы сервис отрабатывал оптимальным образом.
Для визуализации мы добавляем диаграмму последовательности UML. Конечно, я напомню и о том, что есть прекрасный инструмент PlantUML, который позволяет делать такие диаграммы с помощью написания кода.
Вернемся к описанию методов. Далее мы описываем входящие и исходящие параметры, добавляя пример JSON-сообщения с помощью двух макросов Раскрыть и Блок кода.
![](https://habrastorage.org/getpro/habr/upload_files/43c/01b/515/43c01b5156f47d6381403b2f50c5a0b1.png)
Для того, чтобы описать все параметры и их структуру в запросе и ответе мы также использует таблицу со следующими столбцами:
параметр;
тип параметра;
формат данных;
кратность (обязательность);
описание.
![Входящие параметры Входящие параметры](https://habrastorage.org/getpro/habr/upload_files/ef9/dad/f07/ef9dadf0791b10e96b3922879c78fe94.png)
![Исходящие параметры Исходящие параметры](https://habrastorage.org/getpro/habr/upload_files/4ad/8af/3de/4ad8af3de2ca63825671658f08f0c07d.png)
Для выделения Типа параметра и Формата данных можно использовать Статус. Добавлю скрин из Confluence, где показано как его найти.
![](https://habrastorage.org/getpro/habr/upload_files/8eb/98b/777/8eb98b7777e3e9c9f3880a8e5f1a8800.png)
Как вы видите на скрине алгоритма, некоторые исключения описаны именно в нем. Но метод также может содержать бизнесовые ошибки. Их возможно описать в исходящих данных следующим образом:
![Описание ошибки Описание ошибки](https://habrastorage.org/getpro/habr/upload_files/d20/009/98b/d2000998b29dd29fc7dc8507b1f85305.png)
На этом описание метода подошло к концу. Перейдем к следующем разделу нашей спецификации.
База данных
Куда же без описания структуры хранения данных в нашем микросервисе? Для того, чтобы узнать, что хранится в нашей БД, не обязательно получать к ней доступ. Достаточно зайти в нашу документацию.
Из нее можно узнать, какие таблицы есть в БД, какие сущности хранятся в этих таблицах, как они связаны, какие форматы данных у полей и так далее. Каждая таблица описана на отдельной странице. Как ни странно, но для описания таблицы мы используем другую таблицу со следующими полями:
name;
type;
nullable;
description.
![Описание таблицы в БД Описание таблицы в БД](https://habrastorage.org/getpro/habr/upload_files/0c2/bfa/3e1/0c2bfa3e1d7b6d1ebdebb93333d8d6d7.png)
Также мы добавляем ER-диаграмму для того, чтобы визуально показать связи между таблицами. Для создания этой и многих других диаграмм можно использовать встроенный макрос Draw.io Diagram.
![](https://habrastorage.org/getpro/habr/upload_files/2cf/4ad/ce3/2cf4adce397b4cc1308aafe8461f5cdd.png)
В целом, описать структуру БД достаточно просто. Но иногда знаний одного аналитика недостаточно. В таком случае на помощь может прийти архитектор или разработчик.
Если в БД находится какая-то справочная информация (так называемые справочники), то мы выносим их описание в отдельный раздел.
Справочники
В этот раздел помещается все, что можно оценить как справочник, например, перечисление платформ, мест показа фичи, каких-нибудь триггеров, условий и так далее. Цель описания справочника в том, чтобы можно было увидеть хранящиеся варианты в БД, не заходя в БД. Чтобы было понятнее, приведу пример:
![](https://habrastorage.org/getpro/habr/upload_files/11f/ef2/269/11fef2269a5283b46826752706700a07.png)
У нас есть фича Онбординг в мобильном приложении. Онбординг может открываться в нескольких местах. Мы фиксируем эти места и обновляем данные по мере расширения функционала по приложению.
Итак, мы уже описали несколько разделов, но это еще не все. Любой аналитик спросит – а как же НФТ (нефункциональные требования)? Вот про них я сейчас расскажу подробнее.
Нефункциональные требования
Начнем с пояснения. НФТ – это требования, определяющие свойства, которые система должна демонстрировать, или ограничения, которые она должна соблюдать, не относящиеся к поведению системы. Например, производительность, удобство сопровождения, расширяемость, надежность, факторы эксплуатации.
В требованиях важно зафиксировать главные параметры, например, скорость ответа на вызов.
![](https://habrastorage.org/getpro/habr/upload_files/192/d8b/f09/192d8bf090e2eadc0f02e624ea27797d.png)
В данном разделе может содержаться таблица со следующими характеристиками:
производительность;
безопасность;
масштабируемость;
надежность;
совместимость;
доступность;
особенности хранения данных;
поддерживаемость;
тестируемость;
ремонтопригодность;
концептуальная целостность;
удобство использования.
Маппинг
Это следующий опциональный раздел в описании микросервиса. Маппинг данных – процесс сопоставления полей данных (определенных элементов источника или всего источника) и связанных с ними полей данных в другом месте назначения. Так что если в вашем сервисе присутствует маппинг – его необходимо описать. Самое простой способ – создать таблицу с 3 столбцами. В первый столбец поместите названия параметров первой системы, во второй столбец – названия соответствующих параметров из второй системы, ну а в третий – описание этих параметров.
![Пример маппинга Пример маппинга](https://habrastorage.org/getpro/habr/upload_files/1e0/176/800/1e0176800ef1dae7899dcb236c692f27.png)
Заключение
Безусловно, это не исчерпывающий список того, что можно включить в спецификацию для микросервиса. Пока мы остановились на таком наборе, но если функционал сервиса требует описать дополнительно какой-нибудь раздел, – его легко можно включить в шаблон. Мы стараемся не останавливаться на том, что у нас есть сейчас. Каждый аналитик или другой специалист может привносить что-то новое в наш шаблон. Главное, чтобы эти новшества делали шаблон удобнее.
Кстати, в разделе Инструменты для пространства можно создать шаблоны для каждого из приведенных мной примеров и поместить в доступные варианты, которые будут видны при создании новой страницы.
На этом я заканчиваю свой рассказ, спасибо вам за внимание! Буду очень рада пообщаться в комментариях о том, что вам откликнулось, а что вы бы сделали иначе.