Привет! Это Катя из Ozon — руководитель отдела техписателей. Сегодня буду рассказывать: 

  • как и зачем менять Confluence на статический генератор сайтов; 

  • зачем техписателям знать git и CI/CD; 

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

Дисклеймер

В разных компаниях и даже в разных командах люди с одними и теми же названиями должностей могут заниматься разными вещами. В Ozon техписатели занимаются не только сложными техническими описаниями API/SDK, архитектурными доками или техзаданиями, но и пользовательскими инструкциями. Если вы читали, как вернуть товар на Ozon — это тоже работа технических писателей. Подробнее об этом в другой статье, здесь посмотрим на инструменты, которые мы используем в отделе техписателей.

Confluence и другие вводные

Исторически сложилось, что все в Ozon используют Confluence для внутренней документации. Поэтому когда понадобилось писать ещё и внешнюю документацию, рабочим решением стал плагин для публикации пространств из Confluence во внешний интернет.

Получается, что техписы писали во внутреннем пространстве и переводили страницы по статусам. Когда статус становился «Production», тексты публиковались во внешний, как мы его называли «маленький», Confluence и были доступны всему интернету. Но количество и размер файлов в Confluence начали выходить за рамки приличного, плагин не справлялся с отрисовкой инструкций и нам пришлось в сжатые сроки искать новое решение, чтобы не оставлять пользователей с ошибками отображения вместо статей о, например, способах оплаты.

Первым шагом надо было куда-то выгрузить все существующие тексты. Самое универсальное, что умеет Confluence из коробки — перегнать в Markdown через утилиту Pandoc. Подробнее в документации npm

Дальше решали, что делать с полученными md-файлами. Благо есть целая туча генераторов статических сайтов (SSG) из Markdown, надо было выбрать тот, который а) могут поддерживать в компании; б) легко дальше кастомизировать и дополнять всякими ништяками вроде форм обратной связи. На этом этапе у нас не было ни разработчиков, ни адекватного плана, какие же дополнительные фичи нам понадобятся, поэтому очень важно было оставить пространство для маневра.

Про сам процесс выкатки, хранение файлов и работу с ними — поговорим позже. Сейчас про выбор инструментов.

Hugo vs Gatsby и сборка на коленке

Из всех генераторов статических сайтов наш взгляд упал на два: Hugo и Gatsby. Оба поддерживают кастомизацию, технологии обоих используют в компании. Но для хотя бы первоначальной настройки Gatsby «под себя» вместо стандартных тем надо действительно быть фронтендером, а не гуглокодером. Поэтому мы рисковали полностью зависеть от разработчиков, которых в команде техписателей на тот момент не было. А вот Hugo был проще в написании кастомных штук за счёт своих шорткодов, поэтому мы перевели на него пользовательскую документацию. К тому же сам Hugo написан на Go, который в Ozon особенно популярен — в компании есть свой бесплатный курс Route 256 по разработке на Go: за два месяца миддл-разработчик с любого стека может перейти на Go и присоединиться к команде Ozon.

Первую версию новой платформы документации на Hugo я писала сама до четырёх утра в ночь перед релизом. Целью было просто не испугать пользователя слишком новым дизайном и вроде получилось неплохо, но дальше развивать и кастомизировать внешний вид документации должна всё же полноценная команда разработки. Хотя для пет-проектов на Hugo можно сделать и MVP интернет-магазина, если потратить чуть больше времени.

Первая версия docs.ozon.ru, октябрь 2020
Первая версия docs.ozon.ru, октябрь 2020
Версия на октябрь 2022
Версия на октябрь 2022

Сейчас Hugo с доработками — наш основной инструмент и все внешние Помощи размещаются именно на нём. Переход из Confluence стал некоторым трейд-офф, потому что вместо простого WYSIWYG-редактора техписатели переехали в GitLab и Markdown, но получили стабильную масштабируемую платформу.

Зачем документации git

Изменения в Помощи обычно инициирует либо продакт, который запускает новую функциональность, либо техписатели замечают, что что-то в Ozon изменилось, а в доке — нет. Технический писатель составляет черновик, отдаёт его на вычитку внутри команды, потом людям, которые эту функциональность разрабатывали, проверяет фактаж, проходится по описанному процессу, добавляет скриншоты и только потом выпускает на docs.ozon.ru.

Все наши статьи обязательно проходят через два круга вычиток: другим техписателем и держателем знаний.

Вычитки надо сохранить любой ценой, потому что без них качество доки упадёт моментально и безвозвратно. Мне показалось логичным перевести команду на процесс, известный любому разработчику — git. Как выяснили на практике, это не такой уж rocket science и после первого решения merge-конфликтов любой технически неопытный человек запоминает, что сначала надо обновить мастер, а потом уже вливать свои ветки.

В Ozon есть стандартный сценарий для работы с изменениями в гите:

  1. Создать ветку под тикет в Jira.

  2. Поработать в ней.

  3. Создать релизную ветку из свежего мастера.

  4. Оформить merge request.

  5. Получить аппрув от коллег и заказчиков.

  6. Докатить релиз.

И заглянем под капот. Так выглядит статья у техписа:

Мир глазами техписа: Markdown и шорткоды
Мир глазами техписа: Markdown и шорткоды

В шапке md–файла — заголовок, порядок статьи в левом меню, информация для SEO и описание. Дальше — стандартная разметка Markdown и шорткоды Hugo. 

Шорткоды уже упоминали — это обёртки над текстом. Например, на скрине есть шорткод show-in-country и указаны те страны, в которых каждый вариант текста и должен быть показан. Можете сами попробовать: сравните версии главной страницы помощи для покупателей Ozon для России и для Беларуси.

Такую страницу видят пользователи из России
Такую страницу видят пользователи из России
Эта же страница у пользователей из Беларуси
Эта же страница у пользователей из Беларуси

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

Шорткод для генерации разводящей страницы
Шорткод для генерации разводящей страницы
Шорткод для генерации разводящей глазами пользователя
Шорткод для генерации разводящей глазами пользователя

Другие популярные шорткоды, которые можно найти в наших статьях: табы, каты, плашки и некоторая скрытая магия для нас и наших читателей. Многие из них — просто стандартные элементы Hugo под нашими кастомными стилями.

Первое время мы справлялись сами: у меня и у некоторых техписов в команде есть опыт разработки, поэтому что-то быстренько накостылить — вообще не проблема. Когда костыли начали мешать ходить встал вопрос о полноценных фичах, сборе аналитики и масштабировании — мы просили помощи у соседних команд разработки, а потом и вовсе открыли собственные вакансии на фронт- и бэкенд-разработчиков.

Зачем документации разработка

С фронтендом в целом понятно — чтобы было красивенько и всё работало. А вот бэкенд для документации, полностью живущей в SSG, был под вопросом. Тогда мы расписали все наши хотелки, опросили людей внутри Ozon, послушали наших читателей из разных типов документаций. Из этой свалки идей и хотелок получился некоторый бэклог, в котором часть фичей всё же требовала бэкенда.

Например, формы обратной связи. Сейчас в покупательской Помощи есть оценка статей и возможность передать нашей команде какой-то письменный фидбек по статьям — мы отсматриваем его и вносим корректировки в статьи.

ФОС — формы обратной связи
ФОС — формы обратной связи

Ещё одно применение бэкенда — хранилище файлов, которые мы потом используем в документации. Поскольку хранить все картинки, версии оферт и другие приложения прямо в репозитории не очень правильно — увеличивает время сборки и выкатки, усложняет замену файлов. Так у нас появился Ozon Disc — внутренняя оболочка для CDN, куда мы и заливаем все изображения, чтобы в документации указывать только ссылку на них.

И третья задача бэкенда — хранить информацию о самих статьях и документах. Это пока в разработке, поэтому расскажу, когда решение появится в проде и появятся первые результаты.

Как работает Docs Ozon

Итого, сейчас работа над документацией выглядит так:

  1. Появляется задача на техписателей в Jira. Нам нужен её номер, чтобы создать ветку в git’е.

  2. Уточняем требования, проверяем факты, пишем тексты сразу в md и коммитим их. Для Hugo есть локальная сборка проекта — поэтому до вычитки можно проверить, как статья будет выглядеть в проде со всеми красивостями и шорткодами.

  3. У многих IDE есть спеллчекеры и проверка пунктуации, поэтому на вычитке мы, конечно, проверяем опечатки, но основной фокус уже на суть отдельной статьи и структуру всего документа.
    Чтобы передать текст на вычитку — надо оформить его в merge request и отдать коллегам-техписателям. Там же, в GitLab, запускается CI/CD и к моменту вычитки другим техписом версия документации уже есть на dev-контуре и из внутренней сети можно посмотреть, как оно будет выглядеть в проде.

  4. Дальше мы отдаём ссылку на dev заказчику и просим сверить факты. После правок и финального одобрения всеми тремя сторонами текст готов к публикации.

  5. Через CI/CD и прожмакивание статусов в пайплайне тексты докатываются до прода — а значит и до внешнего потребителя. Там нам становится доступна статистика по просмотрам, устройствам и источникам, а читателям — формы обратной связи.

Процесс работы с задачами
Процесс работы с задачами

Документация API живёт на другом решении: из спецификации Open API мы генерируем сайт через Redoc, но общий процесс такой же. 

Раньше мы пробовали raml-to-html, но, к сожалению, raml практически не развивается и мы отказались от него, хоть это было и попроще Redoc. Сейчас мы встраиваемся в пайплайн разработки, чтобы перед выходом какого-либо метода в прод нужен был аппрув от техписателей.

Что получилось

Получилось, что из-за ограниченности ресурсов Confluence мы не просто сменили инструмент, но и переизобрели процесс документирования в Ozon. Причём настолько, что теперь у нас есть собственная платформа и разработчики. Из очевидных осязаемых плюсов:

  • версионность файлов: в два клика можно найти кто и почему вносил какие-то правки в документацию, посмотреть на тикет, задать вопрос коллегам;

  • прозрачность вычитки: комментарий можно оставить к конкретной строке, обсудить, накидать смайликов и закрыть — это сильно проще, чем присылать друг другу файлы с правками и замечаниями;

  • кастомизация документации: в SSG текст живёт отдельно от темы и в достаточно универсальном формате, поэтому разработка не тормозит техписателей и наоборот — каждый работает в своём репозитории и только на этапе сборки CI/CD они объединяются в один docs.ozon.ru.

К тому же git оказался не таким уж и страшным — люди без технического опыта сами приносят нам на вычитку merge-request’ы, потому что это иногда проще, чем поставить тикет на небольшие правки. 

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

Это был краткий обзор платформы документации — пишите вопросы в комментариях, о чём надо рассказать подробнее. А пока смотрите подробнее о команде в пятиминутном видео People Tech Ask.

Комментарии (28)


  1. ivfilin
    28.10.2022 13:13
    +2

    А как решался вопрос выгрузки документации в pdf с нормальным оглавлением и размером страниц А4, А№ и т.д. (если вообще такая задача ставилась)?

    Если такой опыт был, может подскажите, какой инструмент использовали чтобы в реальном времени формировать превью pdf документа.

    ---

    Вообще вопрос сообществу - есть набор документов (html и или markdown), они формируют документацию - как это можно быстро и хорошо перевести в pdf. Вообще желательно уже на этапе создания документа видеть превью, как оно будет выглядеть в pdf.


    1. ringova Автор
      28.10.2022 13:27
      +2

      Мы не особо используем pdf, наоборот стараемся всю документацию перевести онлайн, чтобы у пользователей не было "точно_последняя_инструкция_fin(5).pdf". Но да, версии оферт, например, надо хранить — тогда мы копируем нужный md-файл в отдельную папку со всеми изображениями, руками делаем оглавление через якори (### <a id="n">) и дальше в любой конвертер md-to-pdf. Но это удобно только для единичных страниц, признаю, глобально мы стараемся не использовать pdf.


      1. BeLord
        28.10.2022 13:45

        А если вам документация понадобится на бумаге в виде одного документа, то вы делаете что?


        1. ringova Автор
          28.10.2022 13:50
          +4

          Пока таких ситуаций не возникало. Думаю, так же из md-файлов сделаем html или pdf через pandoc или подобную утилиту и распечатаем)

          Но приоритетным вариантом всё же попытаемся убедить в достаточности онлайн-версии. Можно, например, настроить доступ только из конкретной подсети, если документ не должен быть публичным. Но любые физические артефакты и тот же pdf устаревают слишком быстро, поэтому мы всеми силами стараемся избегать таких документов.


          1. BeLord
            28.10.2022 17:08
            +1

            Есть два типа документации - актуальная и отчетная, если для первой онлайн это хорошо, то для отчетной могут быть нюансы, поэтому и нужен pdf, чтобы документ Х созданный 5 лет назад выглядел ровно также, как при подписании с точностью до пробела.


            1. ringova Автор
              28.10.2022 18:02

              Всё так, храним версии оферт в pdf, но в общем объеме документации генерация pdf пока не требовала оптимизации. Но спасибо за столько вопросов — действительно надо поисследовать)


              1. Jara62
                29.10.2022 13:51

                Мы онлайн-документацию делаем в git, и можем, в том числе, формировать pdf. Недавно потребовалось распечатать на бумаге для госзаказчика, 800 страниц))) Правда титульник печатала отдельно из word.


                1. ringova Автор
                  29.10.2022 13:51

                  А расскажете подробнее?) Как именно генерируете? Может, какие-то неочевидные проблемы всплыли?


                  1. Jara62
                    31.10.2022 10:21
                    +1

                    Использовали gitbook-pdfgen.

                    Вы правильно выше заметили, при формировании pdf появляются сложности с пониманием актуальности. Поэтому мы тоже держим документацию на одном из поддоменов основного сайта.

                    Ну и при формировании pdf верстка не слишком красивая, так как у нас довольно много картинок (скриншотов).


        1. dunmaksim
          28.10.2022 18:59

          На этот случай я бы использовал AsciiDoc.


  1. Pesicot
    28.10.2022 16:41
    +1

    Для тех кто ещё не определился, советую посмотреть на Asciidoctor + Antora.


    1. osipov_dv
      28.10.2022 19:00
      +1

      Мы тоже этот комплект используем для сборки pdf и docx, последний бывает удобнее в некоторых случаях. А вот сама документация, по крайней мере как сделано у нас, в гите мне не нравится. Документы вроде руководства пользователя или руководства администратора, разбито более мелкие файлы, которые сливаются в единый документ. Так вот, по pdf или docx искать где находится кусок, который необходимо корректировать - то еще удовольствие. Внятных wisywig редакторов, полностью показывающих итоговый документ, прямо из гита, я не нашел.


      1. ringova Автор
        28.10.2022 21:16
        +1

        У Idea адекватное превью, с картинками и таблицами, но да, несколько файлов в один она не соберёт. В целом Jet Brains анонсировали нечто для техписов: https://lp.jetbrains.com/writerside/ — ждём, надеемся)


        1. QuAzI
          29.10.2022 20:04
          +1

          У JB, особенно в DataGrip, можно из Markdown даже примеры запросов запускать, наподобие Jupyter Book, а с установленным HTTP Client и REST-запросы. Ну и примерно то же самое можно из VSCode (только вместо HTTP Client лучше httpyac)


  1. QuAzI
    28.10.2022 17:22
    +1

    Отличная статья, нужно попробовать на выходных этот Hugo. Выглядит куда менее проблемным, чем Jekyll с его рубями. Для каких-то мелочей пока крутил Jekyll в качестве генератора, Obsidian отлично подошёл в качестве ненавязчивого редактора (есть мобильная версия в т.ч.). Но начальная конфигурация Jekyll для невайтишника может быть несколько напряжной, вопреки оф.документации. Впрочем с лёту уже столкнулся с тем, что Hugo без темы генерит только XML-файлы и на всё показывает "Нет страницы". И делает это совершенно молча (хоть бы ворнинг написал)

    Что касается конвертации документации в PDF/EPUB - это довольно нужная штука, когда хочется например прихранить всё на читалку и почитать на досуге подробнее, не крючась над монитором.


    1. ringova Автор
      28.10.2022 17:39

      Да, Obsidian тоже использовала для проб разных генераторов и для личных заметок)

      у pandoc есть генерация pdf, думаю можно попробовать через него


  1. Polazhenko
    28.10.2022 19:07
    -5

    Так гит ныне для РФ не особо вариант...


    1. Pesicot
      28.10.2022 20:10

      А что мешает поднять свой GitLab на VDS?


    1. Ringov
      28.10.2022 21:03
      +5

      Гит-то никто не трогает. А хостить при необходимости можно где и на чем угодно.


  1. igramnet
    28.10.2022 22:19

    А как вы решили проблему с поиском по документации?


    1. BosonBeard
      29.10.2022 01:01
      +1

      К hugo можно прикрутить поиск, на практике не помню что использовал, но помню, что есть почти коробочное решение, которое генерирует файл при билде сайта, а потом js из него читает на фронте


      1. ringova Автор
        29.10.2022 07:10
        +2

        Сейчас используем один из стандартных: https://gohugo.io/tools/search/

        Но в перспективе смотрим как прикрутить поиск по всему docs.ozon, а не по одному документу — в такое hugo не умеет)


  1. BosonBeard
    29.10.2022 00:59
    +1

    Спасибо! Хороший опыт возьму на заметку.


  1. sargon5000
    29.10.2022 16:08
    -2

    А я вот далеко не здоровый человек – зрение ни к черту, сердце, да и не только. Правда, я не люблю, когда мне этим в лицо тычут. И когда я вижу такой заголовок, я огорчаюсь и дальше уже не читаю. Чувствую, что меня походя унизили ни за что ни про что.


  1. aim
    29.10.2022 19:44
    +1

    Спасибо за увлекательную статью!

    Почему md, а не adoc? Как то обосновывался выбор?


    1. ringova Автор
      29.10.2022 20:07
      +1

      Md выиграл своей популярностью среди команды и причастных к переезду людей. Посмотрели на adoc, примерили, поняли, что надо привыкать и вникать и ушли в md. Тем более что в ssg в любом случае надо было дорабатывать элементы — так что чистого языка разметки всё равно не получилось бы. Вот и выбрали привычный для команды.


      1. aim
        30.10.2022 17:08
        +1

        спасибо за ответ!

        замечание про SSG с одной стороны верное, с другой — есть специализированные SG типа Antora которые не вносят ничего "сверху" AsciiDoc.

        В общем мы пока ещё размышляем. Но ваш опыт полезен.


  1. nuald
    31.10.2022 00:15
    +1

    Мы начинали с markdown, но в итоге полностью перешли на asciidoc, когда наши аудиторы попросили переформатировать таблицы в соответствии с официальными требованиями. К счастью, конвертер автоматический и работа заняла недолго.

    У markdown достаточно бедное форматирование и даже подсветки синтаксиса кода нет из коробки. Да, есть расширения и прямое использование html, но это все выглядит полумерами. Например, с помощью asciidoctor у нас есть:

    • TOC (в markdown требуется скрипт для генерации)

    • Диаграммы (mermaidjs или PlantUML), gitlab поддерживает автоматически

    • Include (самое мощное что есть, все примеры кода у нас рабочие и вставляются из реального кода), поддерживается gitlab, вряд ли когда-нибудь будет поддерживаться github

    • Admonitions (вставки NOTE, WARNING etc)