Сталкивались ли вы когда нибудь с долгим поиском документации к используемой библиотеке или пакету? Я считаю странным, что исходный код не распространяется с пользовательской документацией. Ведь она такая же важная часть кода, как тесты или зависимости. Без хорошей пользовательской документации мы можем «убить» уйму времени на анализ кода и комментариев. Так почему бы не хранить пользовательскую документацию вместе с исходными кодами программы? Речь не о DocBlock и генерацию документации по API проекта, я говорю именно о пользовательской документации, которую мы так любим за последовательное повествование и множество примеров.

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

Многим статья может показаться «капитанской». Если вы почувствуете на своих щеках соленые брызги и услышите шум волн, немедленно прекратите чтение!

Пользовательская документация


      В отличии от документации, добавляемой прямо в исходные коды (в виде комментариев), пользовательская документация более «user-ориентированная», если можно так выразится. Представьте, что вы долго искали подходящую библиотеку и вдруг коллега назвал ту, которая «может вам подойти». Вы быстро находите ее на GitHub, но с чего начать? Хорошо если в корне есть файл README.md, но даже ознакомление с ним может оставить множество вопросов. Обычно все заканчивается одним исчерпывающим примером (если библиотека не большая) или ссылкой на официальную документацию в виде Web-сайта или PDF документа. После доступа к одному из этих ресурсов вы вздыхаете с облегчением, внимательно читаете несколько страниц, изучаете пятерку примеров и начинаете уверенно пользоваться библиотекой.

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

      Использование Web-сайта или документа в качестве пользовательской документации это хорошее решение, но у него есть несколько минусов:
  • Документация отделена от проекта и, возможно, пользователю будет сложно получить к ней доступ
  • Ответственность за пользовательскую документацию лежит полностью на плечах разработчика. Если пользователь найдет ошибки или опечатки в ней, ему будет сложно (относительно предлагаемого в этой статье решения) связаться с разработчиком и сообщить ему об этом
  • Если пользователь решит помочь разработчику и перевести документацию на другой язык, это будет так же проблематично сделать
  • Документация может стать недоступной по техническим причинам (упал Web-сайт, потерялась ссылка на документ т.д.)Потому сейчас я постараюсь убедить вас в пользе хранения пользовательской документации прямо внутри проекта.

Как тесты


      Вы храните unit-тесты вашего проекта вместе с кодом или в отдельном репозитории? Обычно они находятся в каталоге tests и являются неотъемлемой частью проекта. С документацией так же. Она — часть вашего проекта, но в отличии от тестов, она нужна пользователям не для проверки работоспособности вашего решения, а для быстрого и безболезненного ознакомления с ним.

      Я предлагаю выделить для пользовательской документации отдельный каталог в вашем проекте. Пусть он называется docs и содержит файлы с расширением md (почему выбран именно Markdown вы узнаете позже). Полезно так же снабдить вашу пользовательскую документацию «точкой входа» — это файл оглавления, с помощью которого пользователям будет проще ориентироваться в этом каталоге. Я предпочитаю называть этот файл index.md и записывать в него список ссылок на остальные файлы в этом каталоге.

Пример
1. [Введение](./getting-started.md)
2. [Обработка файлов](./files.md)
3. [Работа в сети](./network.md)

      Рекомендую так же использовать файл «Введение» (getting-started.md), который можно использовать для «быстрого старта». В нем должны быть кратко и доступно описаны основные возможности вашего решения с примерами и комментариями. Информации в этом файле должно хватить для того, чтобы начать пользоваться вашим решением на пользовательском уровне.

В пользовательской документации должна быть «точка входа» — документ, который ознакомит читателя со структурой и содержанием.

      Остальные файлы должны содержать подробное описание компонентов вашего решения, подробные примеры использования и возможные проблемы, с которыми может столкнуться пользователь. Лучше, чтобы эти файлы не были связаны друг с другом, чтобы пользователь мог начать изучение того компонента, который он считает нужным.

Прямо в репозиторий


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

Пример
# Bricks.Cli.Routing

Пакет позволяет работать с данными, получаемыми при вызове PHP интерпретатора из 
командной строки. Он так же реализует маршрутизацию на основе опций вызовов 
командной строки.

## Установка и Автозагрузка

Этот пакет сопровождается файлом [composer.json][], что позволяет использовать 
[Composer][] для его инсталляции и автозагрузки.

Так же можно установить его загрузив [исходные коды][] пакета в виде Zip архива 
или клонировав этот репозиторий. Все компоненты этого пакета загружают 
зависимости автоматически.

Перед использованием рекомендуется выполнить тестирование с помощью утилиты 
[PHPUnit][] вызвав ее в корневом каталоге пакета.

## Зависимости

Этот пакет зависит от интерпретатора PHP версии 5.5 или выше.

## Поддержка

Если у вас возникли сложности или вопросы по использованию пакета, создайте 
[обсуждение][] в данном репозитории или напишите на электронную почту 
<Artur-Mamedbekov@yandex.ru>.

## Документация

Пользовательскую документацию можно получить по [ссылке](./docs/index.md).

Документацию API можно получить из исходных кодов пакета или с помощью утилиты 
[Doxygen][].

[composer.json]: ./composer.json
[Composer]: http://getcomposer.org/
[исходные коды]: https://github.com/Bashka/bricks_cli_routing/releases
[PHPUnit]: http://phpunit.de/
[обсуждение]: https://github.com/Bashka/bricks_cli_routing/issues
[Doxygen]: http://www.stack.nl/~dimitri/doxygen/index.html

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

      Так как вся документация находится в репозитории, на нее удобно ссылаться извне по ссылке вида: https://raw.githubusercontent.com/Bashka/bricks_cli_routing/master/docs/call.md — а если «прикрутить» сюда Web-интерфейс, то можно получить полноценный Web-сайт без необходимости переноса документации. Удобно не правда ли?

      Более того, если вы переместите документацию из каталога docs в каталог docs/ru, то позволите вашим пользователям переводить ее просто добавляя новые каталоги и копируя в них переведенные файлы документации.

Пока все


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

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


  1. DevMan
    31.10.2015 02:52
    -5

    имхо, намного удобнее связка в виде доксетов + вьюер для них (dash, velocity, zeal).


  1. stas404
    31.10.2015 03:07
    +10

    Говорят, если приложить документацию к уху, то можно услышать шум моря.


  1. SirEdvin
    31.10.2015 12:29
    +2

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

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


    1. Delphinum
      31.10.2015 13:12
      +2

      Те же аргументы можно привести относительно тестов. Код и без них может прекасно работать и на их составление прибется убить уйму времени, но их хранят вместе с исходниками.


      1. SirEdvin
        31.10.2015 13:15
        +1

        Я видел так же много кода без тестов.
        Например, в официальном репозитории calibre, я не нашел тестов (может плохо искал).
        Но тесты часто нужны самим разработчикам и пишутся ими во время разработки.
        А пользовательскую документацию нужно писать отдельно в любом случае.


        1. Delphinum
          31.10.2015 13:17
          +3

          Но тесты часто нужны самим разработчикам и пишутся ими во время разработки

          Если вы пишете OpenSource сугубо для себя, то да, можно (возможно) обойтись без документации.

          А пользовательскую документацию нужно писать отдельно в любом случае

          Что же мешает делать это параллельно с написанием кода? Программирование через Readme сильно упрощает разработку.


          1. SirEdvin
            31.10.2015 13:36
            +2

            Если вы пишете OpenSource сугубо для себя, то да, можно (возможно) обойтись без документации.

            Мне кажется, не возможно, а почти наверняка она будет без документации.

            Что же мешает делать это параллельно с написанием кода? Программирование через Readme сильно упрощает разработку.

            Если я не ошибаюсь, это две разные задачи.


            1. Delphinum
              31.10.2015 15:01
              +1

              Мне кажется, не возможно, а почти наверняка она будет без документации

              Я пишу документацию на все мои решения, ибо потом возвращаться к ним становится проще.

              Если я не ошибаюсь, это две разные задачи

              Ну так и тестирование это другая задача, но параллельное их выполнение положительно сказывается и на обоих процессах.


              1. SirEdvin
                31.10.2015 15:04

                Ну так и тестирование это другая задача, но параллельное их выполнение положительно сказывается и на обоих процессах.

                То есть, когда вы пишите код, вы не запускаете его потом, что бы проверить, сработает ли оно?


                1. Delphinum
                  31.10.2015 15:10

                  Код можно и запустить, но автоматические тесты для этого писать не обязательно.


                  1. khim
                    01.11.2015 03:33

                    Разница между пользовательской документацией и тестами совсем в другом. Тесты (какие бы они ни были) помогают прежде всего разработчику, который «в теме». Пользовательская документация нужна там, кто ещё не въехал.

                    Хотя на самом деле писать пользовательскую документацию, конечно, нужно. И именно разработчику. Просто потому, что когда вы попытаетесь подробно описать «как этим пользоваться» и увидите весь тот ужас, который у вас выльется на бумагу, то вы пойдёте и причишите наконец хидеры и прочие интерфейсные файлы! А то и API подправите… А профессиональный документописатель этого сделать, конечно, не сможет.

                    Но вот уже полноценные мануалы и «поучительные истории» — тут да, тут, наверное, смешивать с разработкой не стоит.


                    1. Delphinum
                      01.11.2015 13:46

                      Но вот уже полноценные мануалы и «поучительные истории» — тут да, тут, наверное, смешивать с разработкой не стоит

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


    1. aikixd
      31.10.2015 13:56

      Если вы пишите в стол, то делайте как хотите, но если вы пишите для людей, то и ваш код и документация должны быть соответсвующими. Ни раз натыкался на проекты, от которых пришлось отказаться из-за отсутсвия доков.


      1. SirEdvin
        31.10.2015 14:02
        +1

        Одним из главных недостатков Open Source является то, что слово должны тут не очень работает.


        1. aikixd
          31.10.2015 14:04
          -1

          Это свободный рынок, открытый код — это такой же товар. Если он плохого качества то не ждите репортов и коммитов.


          1. SirEdvin
            31.10.2015 14:08

            Зависит от того, зачем этот код.
            Например, моды для minecraft часто без документации (readme файл не в счет, там просто описание).
            Документация к инструменту для написания модов (Forge) плоховата, на самом официальном сайте полно устаревшей информации, про официальную вики страшно говорит, но…
            Приходится с ним работать.


  1. AlexZaharow
    31.10.2015 13:54
    +2

    Я вас полностью поддерживаю, не смотря на очевидность. Лучше лишний раз напомнить разработчикам, что нужно писать пользовательскую документацию. Хотя разработчик думает, что «и так всё понятно» (много кода или мало), но даже он, переключившись на другой проект и через неделю вернувшись обратно уже сам будет плавать в своём коде и чесать лоб, зачем что-то было сделано? Меня уже не раз выручали такого рода документы, которые я сам же себе и писал. Ещё если бы и не лень было делать скриншоты, чтобы знать, что должно получиться в итоге.

    Было бы правильно, если бы вы кроме обозначения проблемы вы провели бы анализ, откуда вообще берётся «нежелание» писать документацию? Я возьму на себя смелость заявить, что действительно трудно просто писать документацию, т.к. нет хороших инструментов для этого. На каждое простое действие (например, сделать скриншот и вставить его в справку) — целая задача, отвлекающая от написания документации — собственно, сделать скриншот, «обтравить» его стрелочками и надписями, «сохранить» в каталог, а потом ещё и в тексте (если это markdown) дать ссылку. Т.е. после таких мыслей садиться и писать документацию совсем не хочется. Если у вас есть какой-то набор инструментов, который позволяет вам упростить эту задачу, не могли бы вы поделиться им и рассказать нам бонусы от их применения? У меня например zim desktop wiki (для заметок), ditto (clipboard manager), fast stone capture (пачками плодить скриншоты и накапливать их в ditto, потом пачкой вставлять в zim). Но это мой личный набор.


    1. Delphinum
      31.10.2015 15:05
      +1

      Отсутствие удобных инструментов это одна из проблем. Другой является неумение писать документацию. Часто разработчик относится к написанию документации как к написанию книги, старается подобрать слова, украсить их элементами могучего Русского языка и сделать красивое оформление, что превращает его в писателя.


      1. AlexZaharow
        31.10.2015 15:57
        +1

        Конечно. Но ведь и программистом человек становится не сразу. Много пробует, ошибается в итоге обретает чувство баланса и начинает писать код вполне нормально. Так и с документацией. Написал для себя, прочитал через неделю, заметил огрехи, поправил. Потом уже пишешь без этих огрехов. В написании документации есть большой плюс — начинаешь думать уже как пользователь и лучше понимаешь что и зачем есть в программе.
        Исключительно из любопытства, если касаться технической стороны написания документации, не могли бы вы поделиться какими-то программками или удобными (на ваш взгляд) ресурсами, которые могут упростить написание документации?


  1. iroln
    31.10.2015 14:38
    +3

    В мире Python пользовательскую документацию обычно всегда пишут с использованием Sphinx, хранят в репозитории вместе с исходными кодами и автоматически хостят на ReadTheDocs. И всем хорошо. :)


  1. lair
    31.10.2015 14:54

    Во-первых, на гитхабе есть GitHub Pages, которые предназначены ровно для того, о чем вы пишете, но при этом позволяют не смешивать код и обобщенную документацию.
    Во-вторых, для многих языков есть встроенные средства документирования, которые позволяют генерить необходимую информацию на основании разметки прямо в коде.


    1. Delphinum
      31.10.2015 15:09
      +2

      Во-первых, на гитхабе есть GitHub Pages, которые предназначены ровно для того, о чем вы пишете

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

      Во-вторых, для многих языков есть встроенные средства документирования, которые позволяют генерить необходимую информацию на основании разметки прямо в коде

      Я об этом упоминал в статье. Это документация API, а не пользовательская документация. В статье обсуждается второй тип документации.


      1. vaniaPooh
        31.10.2015 22:01
        +3

        Кстати, вики на Гитхабе — это тоже отдельный git-репозиторий, который можно отдельно версионировать.


        1. Delphinum
          31.10.2015 23:10
          +1

          Да, тоже хорошее решение. Проблема только в том, что это число GitHub'овское решение, и если ваш пользователь потеряет доступ к GH, то ему документация станет не доступна. Это может показаться глупым, интернет сегодня стабильный, а GH обещал долго жить, но когда начинаешь мотаться по командировкам в места без цивилизации, понимаешь что все должно быть на готове.


          1. occam
            01.11.2015 06:19

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


  1. massimus
    31.10.2015 21:49

    В Perl документацию к каждому модулю принято писать прямо в нём:
    https://en.wikipedia.org/wiki/Plain_Old_Documentation
    Очень удобно (для пользователя, по крайней мере).


    1. Delphinum
      31.10.2015 23:11

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


      1. massimus
        31.10.2015 23:55

        > если захочется превратить доку в книгу
        Есть такие инструменты. Вот, например: https://metacpan.org/pod/distribution/App-Pod2Epub/bin/pod2epub

        > с какого же файла следует начать
        Все либы лежат в ./lib, главная называется так же, как и весь проект. Самое место для старта.
        Но обычно искать не приходится, прежде чем пользоваться читаешь доки на сайте CPAN (там вся документация как раз из самих модулей показывается), а если уже поставил, то читаешь perldoc имя_модуля.
        А для дополнительной документации, не относящейся к конкретному модулю/скрипту, в проект кладётся отдельный .pod
        Вот пример: https://metacpan.org/pod/distribution/Dancer2/lib/Dancer2/Tutorial.pod
        Вот ещё бы гитхаб их так же показывал, как cpan…


        1. Delphinum
          01.11.2015 00:16

          читаешь доки на сайте CPAN

          А если нет доступа к CPAN?


          1. PerlPower
            01.11.2015 04:06

            Документация находится в самом коде библиотеки, которая у вас уже установлена. CPAN по сути красивая обертка для утилиты, которая выдирает документацию из кода и показывает в виде html. Документацию можно читать в простом текстовом редакторе. Ну или можете скормить либу утилите pod2html, которая идет в стандартной поставке perl, если вам надо как на cpan.


            1. Delphinum
              01.11.2015 13:48

              Доки в исходниках я люблю, но мне кажется их должно быть:
              1. Немного
              2. По существу
              Считаю пользовательскую документацию лучше выносить. Так ее будет проще править и переводить силами самих пользователей.


  1. Xao
    01.11.2015 11:18

    Но ведь есть github wiki для каждого репозитория, более того, их можно клонировать себе, и вести как отдельный репозитрий, для удобства.


    1. khim
      02.11.2015 14:29

      Самая большая проблема любой документации — её актуальность. Любой другой репозиторий, кроме основного — это проблема синхронизации.

      Потому вне репозитория должна жить только та документация, актуальность которой не будет поддерживаться. Скажем обзорные статьи, где ссылки на конкретные API — это только примеры. А всё остальное — должно быть в основном репозитории.


  1. zahardzhan
    02.11.2015 15:41

    Мне кажется в вашем примере с роутингом отдельная документация в формате маркдаун это оверкил. Javadoc-образных средств документирования и грамотного ООП-дизайна для подобных программ хватает с головой (с учетом того что они будут разрабатываться и использоваться в основном как библиотеки из специализированных IDE).

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


    1. Delphinum
      02.11.2015 15:45

      Мне кажется в вашем примере с роутингом отдельная документация в формате маркдаун это оверкил

      Отчасти соглашусь. У меня есть пакет с 1 файлом и 2 файлами документации ) Часто можно обойтись DocBlock-комментами в стиле Javadoc.

      Весь проект состоит из одного единственного README-файла документации, и программа на языке высокого уровня генерируется непосредственно из README-файла с помощью IDE

      IDE дали искуственный интеллект? )


      1. zahardzhan
        02.11.2015 17:24

        Эта IDE была разработана в Лаборатории Искусственного Интеллекта MIT, так что да ) Вот черновик, можете глянуть, но смотрите быстрее пока я не закрыл доступ gitlab.com/zahardzhan/well-tuned-emacs


        1. Delphinum
          02.11.2015 17:27

          я там не зареган, потому — спасибо, нет )


          1. zahardzhan
            02.11.2015 18:38

            Вообще, если интересуетесь документацией ИТ-проектов, посмотрите на TeX, потому что он эпически документирован во всех отношениях www.dropbox.com/s/868kii13wtifswx/tex.pdf?dl=0 www.dropbox.com/s/ov098y98q8wcyum/tex.web?dl=0 www.dropbox.com/s/mw24dccitb8nee2/TeXbook.pdf?dl=0


            1. Delphinum
              02.11.2015 19:12

              Благодарю.