Действительно ли документация так необходима?

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

  • Есть у документации и комментариев в коде одна проблема. Они устаревают. Если не поддерживать документацию и комментарии в актуальном состоянии, они начинают вредить, поскольку мы оказываемся в ситуации, когда код делает одно, а в комментариях написано другое. Если же поддерживать документацию и комментарии в актуальном состоянии, нам приходится делать в два раза больше работы по сравнению с простым написанием кода.
  • Ни для кого не секрет, что многие программисты ненавидят писать документацию. Я лично к написанию документации отношусь спокойно, но это еще не значит, что я умею хорошо ее писать. Сколько раз я не пробовал писать документацию, никто кроме меня не был ею доволен. Выходит, для ведения документации либо нужно привлекать отдельных специалистов, либо заставлять программистов делать то, что они не умеют и/или не любят.
  • Допустим, мы раскошелились на технических писателей. Является ли хороший технический писатель хорошим программистом? Другими словами, сможет ли он написать толковую документацию, просто глядя на код, или придется посадить рядом с ним кого-то из программистов, чтобы он все объяснил? Сможет ли программист нормально объяснить код, а технический писатель — понять его? Будет ли написанная таким образом документация исчерпывающей и пригодной для чтения программистами?
  • Мелкая, казалось бы, проблема — кодировка комментариев. Конечно, если изначально было принято соглашение хранить все исходники в UTF-8, то никакой проблемы нет. Однако мне нередко приходилось сталкиваться с ситуацией, когда часть исходных кодов хранится в кодировке CP1251, часть — в KOI8-R, а часть — в UTF-8. Не всякие средства разработки умеют работать с таким зоопарком кодировок. В общем, кодировки иногда создают проблемы.
  • Не совсем очевидная проблема — а где будет хранится документация? Если в почтовом ящике одного из сотрудников, то это 100% плохая идея. Если на wiki-сайте, то это уже лучше. Но его кто-то должен админить — делать бекапы, обновлять ПО, управлять доступом и тп.
  • С появлением документации программисты начинают хуже ориентироваться в коде. Что делать, если wiki с документацией лежит, а человек, администрирующий его, недоступен по телефону? Представьте, что программисты, работающие с WinAPI, внезапно остались без доступа к MSDN. Не конец света, конечно, но жить становится намного сложнее. Если у программистов сложилась привычка искать все ответы в уже написанном коде, временная недоступность документации им не страшна.
  • Если вы используете систему контроля версий, то в результате автоматического мерджа нескольких веток проекта комментарий может оказаться вовсе не перед тем куском кода, к которому он относится. Или кусок кода может оказаться внутри многострочного комментария.
  • Когда программистам не на что полагаться, кроме как на код, это дает им лишний стимул следить за его чистотой.
  • С документацией или нет, код все равно приходится читать, и читать его приходится много.

Я ни в коем случае не призываю вас, дескать «не пишите документацию, самодокументирующийся код — наше все». Я только хочу сказать, что в силу описанных выше причин, отсутствие документации вполне имеет право на жизнь. Более того, достоверно известно, что такой подход используется во многих командах. Ведь в действительности вся «документация» уже есть в самом коде, нужно лишь научиться ее находить. Например, с помощью утилиты grep можно легко найти место, где объявляется конкретный класс и изучить его интерфейс. Или найти примеры его использования. Или отыскать все метки типа «TBD» и «FIXME».

Также существует промежуточный вариант между отсутствием документации и документированием всего и вся. Во-первых, вполне достаточно документировать лишь интерфейсы модулей/классов, используя систему типа Doxygen или Javadoc. Во-вторых, использование «очень декларативных» языков, вроде Haskell, снижает потребность в документации. Наконец, в роли документации вполне могут сойти тикеты в багтрекере (особенно в сочетании с VCS). Конечно, при условии, что в тикетах дается нормальная формулировка задачи, а не в стиле «сделать ту фигню, о которой мы сегодня говорили».

А что вы думаете по поводу написанного?

Подпишитесь на блог с помощью RSS, E-Mail, Google+ или Twitter!
Также, пользуясь случаем, приглашаю вас посетить мой форум.

  • http://twitter.com/megakott Aleksandr Kotov

    Всё хорошо в меру :)

    Комментарии в коде могут быть уместными:
    - вида # TODO, # Bad solution, but works, ….
    - к нетривиальным строчкам и/или формулам — например, которые объясняют принцип кодирования/декодирования данных
    - URL’ы на внешние ресурсы — API, perldoc, stackoverflow, wikipedia … рядом со строчками, реализующими _именно такое_ поведение
    - «макро»-комментарии для блоков кода. Например, if () { # do this block …. } else { # do that block … }
    - актуальное документирование интерфейсов (POD, JavaDoc, …), как было отмечено в статье — это просто MUST

    Отдельно стоящая от кода документация может быть уместной:
    - (Автоматически сгенерированная) документация для внешних API
    - Документ с ТЗ перед написанием кода, если таковой имелся
    - Картинки: диаграммы последовательностей, какие-нибудь схемы взаимодействия различных компонентов и т.п.
    - Ну и конечно же комментарии из системы контроля версий и из багтрекера

    В общем, комментарии и документация — не страшны, если тратить на них лишь 5% от времени, которое посвящаешь реальной работе.

  • http://blog.ksdaemon.ru Константин Буркалев

    Да, все хорошо в меру. Комменты в коде конечно же должны быть для описания не очевидных алгоритмов, или костылей, глядя на которые не сразу сможешь вспомнить/понять для чего они тут. Классический пример для веба — какой-ньть костыль исключительно для ИЕ….
    Однако по большей части сами классы/методы/публичные свойства должны быть самодокументированы, ну то есть иметь осмысленные названия.
    Лично я во всех своих проектах описываю все классы/методы/вх. и вых. параметры в стиле а-ля javadoc/phpdoc/jsdoc, и при каждой сборке проекта генерирую соответствующую документацию, которая потом выкладывается в общедоступное место, например в wiki.

  • http://twitter.com/signalpillar SignalPillar

    Умение документировать — это культура, которую нужно развивать и учиться ее. Она влияет на этап написания кода и у меня она — это первый этап разработки — что-то вроде док/тест-дривен разработки=)

    На моем проекте код доступен заказчикам и часто используется для филд-разработки. В нашем случае документация очень важна — начиная от мета информации по которой генерятся доки и заканчивая простыми коментами. Мое же мнение очень сильно изменило поверхностное ознакомление с литеральным программирование (Д. Кнут). Я не могу сказать что сейчас использую инструментарий литарального пр., но некоторые концепции очень сильно изменили мое отношение к докам. Так флоу я пишу как небольшую статью, а при фиксах код, которого «я касаюсь», проходит небольшой рефакторинг или выравнивание именований (если нужно) + агрессивное документирование изменений и логики в целом.

    Чтобы дока не устаревала — она должна быть как можно ближе к коду и генериться из него же. Для развития своей культуры документирования использую pycco.

  • http://twitter.com/Nevkontakte Alek$

    Я сталкивался с двумя случаями, когда без документации не обойтись:
    1) Нетривиальные конструкции, в том числе регэкспы. Регэксп гораздо проще разбирать, когда рядом есть два-три-четыре (в зависимости от сложности) примера, чего этот регэксп должен находить. Другой случай из практики — описание логики построения сложных запросов, которые генерируются динамически, например поисковых.
    2) Описание различных API и их логики в гетерогенных проектах. Во-первых, на документацию я потрачу куда меньше, чем члены других команд — на изучение моего кода, из которого не всегда просто понять все нюансы, и, во-вторых, не раз случалось, что реализация отличалась от документации и это было поводом исправить код, а не документацию :-) Просто во время разработчки я что-то упустил, а при документировании написал правильно — и это обнаружилось.

    • http://eax.me/ afiskon

      На счет регэкспов не согласен. Если достаточно долго с ними работать, они вполне самодокументирующиеся. Ну разве что можно написать комментарий «проверяем e-mail».

      На счет Api и всякой хитрожопой логики согласен — иногда лучше задокументировать, а то через пол года сам разобраться не сможешь.

  • http://twitter.com/gailimov Kanat Gailimov

    Я в основном пишу только PHPDoc комментарии для генерации API-документации. Считаю что документация, как и тесты, является хорошим тоном. Главное знать меру

  • http://redplait.blogspot.com/ redp

    вопрос из той же серии что и
    нужна ли компиляторам полная поддержка стандарта языка ?
    нужно ли в наше тяжелое время заморачиваться с производительностью кода ?
    можно ли верить писулькам детского юмористического журнала ксакеп ?

    всегда ваш К.О.

  • http://profiles.google.com/skaunov Сергей Каунов

    Хренасе твой blog разросся! ☺ Из всех букв которые я в этой записи увидел можно сделать чуть ли не единственный вывод – в системы управления версиями надо включать инструменты для работы с документацией.

    • http://eax.me/ afiskon

      О, какие люди :) Неужто прям так разросся?

      В действительности, если правильно пользоваться VCS, то в них все уже есть. Например, можно давать бранчам имена в соответствии с номерами тасков. А по git diff [хэш коммита, от которого ты форкался] можно увидеть, что было написано в рамках таска. Ну и doxygen + комментарии к коммитам, естественно. Не представляю, что еще тут можно добавить, связанное с документацией.