© istockphoto.com/haya_p
Erfolgreiche Command-Line-Clients bauen

CLI <3


Fast jeder kennt sie, und viele Entwickler benutzen sie täglich: Command-Line-Clients, zu Deutsch Kommandozeilenprogramme. In diesem Artikel werfen wir einen Blick auf erfolgreiche Command-Line-Clients und versuchen die Gemeinsamkeiten auszumachen, die sie miteinander teilen. Denn man kann viel von erfolgreichen CLIs lernen, um in Zukunft selbst bessere Kommandozeilenprogramme zu entwickeln.

Es gibt in der Tat einige sehr erfolgreiche Programme, die auf der Kommandozeile des Terminals ausgeführt werden. Zum Beispiel Git, das seinen Ursprung im Linux-Projekt hat, oder npm, mit dem das Node. js-Projekt einen (auch kommerziell) sehr erfolgreichen Paketmanager hat. Das Apache-Projekt CouchDB entwickelt nmo (gesprochen nemo), um Datenbank-Cluster zu verwalten. Wenn man sich die drei Kommandozeilenprogramme genauer anschaut, kann man viel von ihnen lernen, um selbst bessere CLIs zu schreiben.

Im Web gibt es mittlerweile jede Menge Diskussionen sowie Material, wie man gute APIs designt, besonders zum Thema REST-APIs. Leider gibt es kaum Material zum CLI-Design.

Was macht ein gutes CLI aus?

Um die Frage zu klären, was ein gutes CLI ausmacht, schauen wir zuerst einmal, wie ein Command-Line-Interface genutzt wird: Typischerweise (Ausnahmen bestätigen die Regel) bedient ein Mensch vor einer Tastatur den Command-Line-Client. Das ist der Grund, warum wir einfache und leicht zu merkende Befehle für unser CLI benutzen möchten, doch damit werden wir nicht weit kommen.

Eventuell wird es einfacher, wenn wir uns ein Beispiel anschauen – ein Beispiel für ein meiner Meinung nach schlechtes CLI:

(01:11:02) [robert@tequila-osx] ~ $ mycli -A -a 16 r foo.html error: undefined is not a function (01:11:02) [robert@tequila-osx] ~ $

In diesem Beispiel muss ich ein kryptisches Kommando eingeben, daraufhin bekomme ich eine genauso kryptische Antwort zurück. Was bedeutet -A -a 16 und r? Benutze ich das Programm falsch oder ist der Command-Line-Client selbst fehlerhaft? Was bedeutet der Fehler, und wie bekomme ich mein Anliegen jetzt erledigt? Was macht also ein gutes CLI aus? Wir werden es mit diesen drei Regeln versuchen:

  • Auch als Erstbenutzer ist man niemals aufgeschmissen.

  • Ein simples Interface, das auch Power-User unterstützt.

  • Es ist vielseitig für alle Aufgaben verwendbar.

Kurz gesagt: Ein Command-Line-Client ist erfolgreich, weil seine Nutzer erfolgreich und glücklich sind.

Auch als Erstbenutzer ist man niemals aufgeschmissen

Kaum jemand hat Freude in einem Stau, bei dem man mitten im Verkehr feststeckt und nicht weiterkommt. Man möchte doch ans Ziel der Reise kommen. Dasselbe gilt für unsere Nutzer. Benutzer und Entwickler werden sehr schnell unzufrieden, wenn die Tools, die sie benutzen, ihnen im Weg stehen.

Was bedeutet „niemals aufgeschmissen“ also wirklich? Es bedeutet, dass wir unseren Nutzern immer einen Weg anbieten sollten, um ihre Aufgabe zu erledigen. Ein Befehl für den Command-Line-Client sollte niemals in einer Sackgasse enden. Zusätzlich sollten die Entwickler eines CLI jede Quelle zusätzlicher Reibung bei der Erledigung einer Aufgabe vermeiden. Im folgenden Beispiel versuche ich Git zu benutzen:

(01:11:02) [robert@tequila-osx] ~ $ git poll git: 'poll' is not a git command. See 'git --help'. Did you mean this? pull (01:11:02) [robert@tequila-osx] ~ $

Wie man sieht, gebe ich ein falsches Kommando ein. Git antwortet freundlich: „Hey Robert, es sieht so aus, als hättest du einen falschen Befehl eingegeben. Wenn du git help eingibst, bekommst du alle möglichen Befehle aufgelistet. Ach, und bevor du gehst, es sieht so aus, als hättest du dich beim Schreiben vertippt – meintest du eventuell git pull?“. Git zeigt mir sofort Wege auf, wie ich meine Arbeit fortsetzen und meine Aufgabe erledigen kann.

Wenn wir einen Blick auf npm, einen anderen erfolgreichen Command-Line-Client werfen, sehen wir das gleiche Konzept (Listing 1).

Listing 1

(22:05:16) [robert@tequila-osx] ~ $ npm ragrragr Usage: npm <command> where <command> is one of: access, add-user, adduser, apihelp, author, bin, bugs, c, cache, completion, config, ddp, dedupe, deprecate, dist-tag,...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang