zurück zum Artikel

Dokumentation schreiben in 30 Minuten

Golo Roden

Eine gute Dokumentation ist Ă€ußerst wertvoll, trotzdem scheuen die meisten Entwickler den Aufwand, sie zu schreiben. Dabei muss das Entwerfen einer guten Dokumentation weder langwierig noch aufwendig sein. 30 Minuten genĂŒgen in der Regel vollkommen.

Eine gute Dokumentation ist Ă€ußerst wertvoll, trotzdem scheuen die meisten Entwickler den Aufwand, sie zu schreiben. Dabei muss das Entwerfen einer guten Dokumentation weder langwierig noch aufwendig sein. 30 Minuten genĂŒgen in der Regel vollkommen.

Angenommen, ich beschĂ€ftige mich mit einem neuen Modul. Was interessiert mich dann? Sicherlich nicht, welche Bedeutung der vierte Parameter von einer relativ selten benötigten Funktion hat. ZunĂ€chst interessiert mich vor allem, ob das Modul die Aufgabe, die ich lösen muss, ĂŒberhaupt bewĂ€ltigen kann. Dazu möchte ich möglichst schnell einen Beweis sehen.

Das heißt, das erste, was mir eine Dokumentation vermitteln muss, ist die kurze und prĂ€gnante, aber prĂ€zise Information, worum es in einem Modul ĂŒberhaupt geht. Danach möchte ich wissen, wie sich das Modul installieren lĂ€sst und wie ich es verwende. Dabei brauche ich noch nicht alle Informationen zu jedem erdenklichen Sonderfall, sondern ich will innerhalb von ein paar Minuten ein Erfolgserlebnis haben und sehen, dass ich in die richtige Richtung laufe.

Wenn ich dann sehe, dass die grobe Richtung stimmt, dann tauche ich tiefer in die Details ein. Dann möchte ich wissen, was das Modul alles kann und wie ich es verwende. Der springende Punkte dabei ist, dass ich wissen will, was das Modul macht. Das letzte, was mir erzÀhlt, was ein Modul macht, ist eine API-Referenz.

Was ich stattdessen lesen will, ist ein Tutorial, das mich auf eine Reise mitnimmt und mir erklÀrt, wie das Modul zu benutzen ist. Dabei will ich von den allgemeinen zu den SpezialfÀllen kommen und nach und nach mehr lernen. Ich sage damit nicht, dass eine API-Referenz nicht ihren Wert und ihren Sinn hÀtte, sie taugt nur nicht als Einstieg, weil alles gleich behandelt wird: Ich sehe in einer Referenz nicht, welche Funktionen und Objekte wie miteinander zusammenhÀngen. Ich sehe nur eine flache Liste.

Interessanterweise ist das Schreiben einer Geschichte eine viel einfachere Sache als das Dokumentieren jeder einzelnen Funktion. Dazu muss man nĂ€mlich lediglich das niederschreiben, was man einem Verwender erklĂ€ren wĂŒrde: Es genĂŒgt, sich vorzustellen, man wĂŒrde neben jemandem sitzen und erlĂ€utern, wie das Modul zu benutzen ist. Niemand wĂŒrde in der Situation beginnen, eine API-Referenz zu rezitieren.

Ganz am Ende, wenn ich mit dem Modul dann glĂŒcklich geworden bin und weiß, dass es die Aufgabe erfĂŒllt, die ich zu lösen hatte, dann mache ich mir vielleicht noch Gedanken, wie ich zu der Weiterentwicklung des Moduls beitragen kann, beispielsweise wenn ich einen Fehler gefunden habe. Dazu muss ich dann wissen, wie ich die Tests ausfĂŒhre, ob es Coderichtlinien gibt und Ähnliches. Auch das gehört also in die Dokumentation.

Was heißt das nun fĂŒr die Praxis?

In meinem Unternehmen, the native web [1] gibt es kein Modul, das nicht dokumentiert wĂ€re. Jedem Modul, das wir schreiben, fĂŒgen wir eine Datei README.md hinzu. Das gilt fĂŒr Code, den wir als Open Source veröffentlichen genauso wie fĂŒr rein internen Code. Damit sind wir einerseits gewappnet, jeglichen Code jederzeit als Open Source veröffentlichen zu können, und helfen uns andererseits auch intern: Der erste Verwender von Code ist nĂ€mlich unser eigenes zukĂŒnftiges Selbst.

Jeder Entwickler kennt die Situation, dass man sich bei undokumentiertem Code bereits nach kĂŒrzester Zeit fragt, wie er zu verwenden war. Indem man jedes Modul mit Dokumentation ausstattet, stellt sich diese Frage nie wieder.

Dass wir die Dokumentation als Markdown-Datei schreiben, hat den Grund, dass wir sie auf dem Weg in die Versionsverwaltung einchecken können und man zu jedem beliebigen Codestand automatisch auch die zugehörige Dokumentation erhĂ€lt. Außerdem fĂ€llt das Pflegen der Dokumentation leichter, wenn sie sich im gleichen Repository befindet, als wenn man dazu erst ein weiteres externes System bemĂŒhen muss.

Nach den bislang genannten GrundsÀtzen ist beispielsweise die Dokumentation des flaschenpost [2]-Moduls geschrieben. Die README.md beginnt mit folgenden Zeilen:

# flaschenpost

flaschenpost is a logger for cloud-based applications.

> *A [/ˈflaʃənˌpɔst/](https://en.wiktionary.org/wiki/Flaschenpost) is a
„message written on a scrap of paper, rolled-up and put in an empty
bottle and set adrift on the ocean; traditionally, a method used by
castaways to advertise their distress to the outside world”.*
(from [Wiktionary](https://en.wiktionary.org/wiki/message_in_a_bottle))

## Installation

'''bash
$ npm install flaschenpost
'''

## Quick start

First you need to integrate flaschenpost into your application.

'''javascript
const flaschenpost = require('flaschenpost');
'''

Damit ist klar, was das Modul flaschenpost macht, wie es installiert und integriert wird. Als NÀchstes folgt die Sektion Using a logger, in der beschrieben wird, wie man einen Logger erhÀlt und ihn verwendet:

### Using a logger

Next, call the 'getLogger' function to acquire a logger. If you don't
provide a parameter flaschenpost identifies the caller automatically.

'''javascript
const logger = flaschenpost.getLogger();
'''

In rare cases you need to specify the caller manually, e.g. if you
wrap flaschenpost in your own logging module. In these cases, provide
'__filename' as parameter.

'''javascript
const logger = flaschenpost.getLogger(__filename);
'''

Then you can use the functions 'fatal', 'error', 'warn', 'info' and
'debug' to write log messages. Simply provide the message you want to
log as a parameter.

'''javascript
logger.info('App started.');
'''

Ich will an der Stelle nicht die gesamte Datei wiederholen, aber man sieht das Prinzip, wie sie aufgebaut ist. Nachdem am Ende die Details erklĂ€rt sind, wie sich die Logmeldungen an andere Systeme wie ElasticSearch schicken lassen, folgt noch ein kurzer Abschnitt zu der Frage, wie man die Codeanalyse und die Tests ausfĂŒhrt:

## Running the build

To build this module use [roboter](https://www.npmjs.com/package/roboter).

'''bash
$ bot
'''

Anschließend folgt noch die Lizenz, und das war's. Es gibt in dem Fall noch nicht einmal eine API-Referenz, da alle wichtigen Punkte bereits im Fließtext behandelt sind. Da das Modul eine sehr ĂŒberschaubare GrĂ¶ĂŸe hat, passt die gesamte Dokumentation auf wenige Bildschirmseiten.

Nun kann man natĂŒrlich argumentieren, dass das fĂŒr große Module nicht funktioniert. Das ist richtig, aber dem wĂŒrde ich entgegnen, dass sich jedes grĂ¶ĂŸere Modul sinnvoll in kleinere Module zerlegen lĂ€sst. HĂ€ufig erhalte ich darauf als Antwort, dass das im vorliegenden Fall nicht möglich sei – tatsĂ€chlich habe ich noch keinen Fall erlebt, wo es nicht doch möglich gewesen wĂ€re, ein grĂ¶ĂŸeres Modul in kleinere und dennoch sinnvolle Einheiten zu zerlegen.

NatĂŒrlich ist das Zerlegen von Code kein Selbstzweck, aber es ist viel einfacher, ein Modul zu dokumentieren, das aus lediglich fĂŒnf Dateien und insgesamt 500 Zeilen Code besteht, als eines, bei dem ein Vielfaches der Werte gilt. Abgesehen davon sind kleinere Module auch leichter zu warten, zu testen und zu pflegen. Und sie entsprechen der Philosophie von JavaScript und Node.js besser.

Damit unsere Module in einem möglichst einheitlichen Stil dokumentiert sind, folgen unsere README.md-Dateien alle der zuvor genannten Struktur:

# <Add module name here>

<Add module description here>

## Installation

'''bash
$ npm install <Add module name here>
'''

## Quick start

...

## Running the build

To build this module use [roboter](https://www.npmjs.com/package/roboter).

'''bash
$ bot
'''

## License

<Add license text here>

Das ist zumindest die Vorlage, wenn wir mit der Arbeit an einem neuen Modul beginnen. SelbstverstĂ€ndlich passt eine Vorlage nicht immer und ĂŒberall auf jede denkbare Dokumentation, aber auf dem Weg haben wir zumindest eine einheitliche Ausgangsbasis, die sich bei Bedarf immer noch anpassen lĂ€sst.

Unsere Erfahrung mit JavaScript und Node.js in den vergangenen Jahren zeigt uns, dass wir mit dem gewĂ€hlten Ansatz sehr gut arbeiten können: Das Schreiben von Dokumentation fĂ€llt leicht und geht schnell. Schon mehrfach waren wir sehr dankbar dafĂŒr, dass wir uns zu einem frĂŒheren Zeitpunkt die Zeit genommen haben, Dokumentation zu schreiben.

Unsere Erfahrung lehrt uns auch, dass diese Art von Dokumentation zumindest im Kontext von JavaScript und Node.js, wo (sehr) kleine Module favorisiert werden, hervorragend funktioniert und akzeptiert wird. Und das ist es doch, was am Ende zĂ€hlt, denn was nĂŒtzt die beste Dokumentation, die niemand liest?

tl;dr: Dokumentation zu schreiben muss nicht aufwendig und langatmig sein. Es genĂŒgt, eine Geschichte zu erzĂ€hlen und den Verwender mit einem Tutorial abzuholen. API-Referenzen haben ihre Daseinsberechtigung, sind aber ĂŒberbewertet. ( [3])


URL dieses Artikels:
https://www.heise.de/-3552720

Links in diesem Artikel:
[1] http://www.thenativeweb.io/
[2] https://www.npmjs.com/package/flaschenpost
[3] mailto:webmaster@goloroden.de