使いやすいコマンドをつくるために 「スマートデフォルト」と「オプションウィザード」
Usage により色んなコマンドラインオプションを見せるあり方は古典的であり、わかりやすさという面では好ましくありません。
もちろん、コマンドとして多様なオプションを備えておくことは有益ですが、それだけでは不親切です。
この不親切な潮流のキラーとなるのがスマートデフォルトとオプションウィザードです。
スマートデフォルト
スマートデフォルト(Smart Default)とは、何のコマンドラインオプションもつけずに実行したのに、最大公約数的な無難な動作をするという挙動を指します。
また、動作の結果として、何が起きたのかも観測しやすくなっています。
例としてソースコードの行数カウンタを考えましょう。cloc のようなものをイメージしてください。
仮に cntln コマンドとします。
まず、オプションなしで実行できます。
すると、最大公約数的に行数カウンタが動作し、結果も出力されます。
ただし、これだけだと、どのようなオプションがあるかがわかりませんので、そのあたりをつけるために、わかりやすい形で出力します。
たとえば以下のように表示します。
すると「カレントディレクトリをスキャンしたのか」「結果はjsonなのか」「特殊なフォルダは一部除外してるな」といったことがわかります。
※ここでは挙げませんが、行数カウンタには他にも言語固有の設定が色々とあり、スマートデフォルトとして上手く設定する必要があるでしょう。
目新しく感じられないかもしれませんが、最も重要なのは最大公約数的な動作です。README で長々と Usage を説明しなくてもいいほど秀逸な動作にしなければならない、ということです。別の言い方をすると、
❌リファレンスを見て自分で使い方を考える
⭕スマートデフォルトの挙動と使われている設定を見て、あたりをつける
利用者が後者のメンタルモデルで動くほど秀逸な動作を提供するということです。
これは単に「よく使われるであろうオプションの値」を選ぶのみならず、そもそもオプションの設計の上手さが問われます。
多くのプログラマはこれができず、単に機能を詰め込んでしまいます。API もそうですが、選択肢を広く見せつけてあとは任せるようなスタイルは不親切であり、未だにこの文化がまかり通っているのが不思議なくらいです。
スマートデフォルトは、別の名前をつけるならゴールデンユースケース(Golden Use Case)でも良いでしょう。そういうニュアンスがあります。デフォルトの動作として、徹底的にこだわるものです。
オプションウィザード
オプションウィザード(Option Wizard)とは、「各コマンドラインオプションの解説」と「典型的なオプションの組み合わせ方(ユースケース)」を情報として保持し、利用者にわかりやすく見せる機能です。
その名のとおり、見せ方としてはまずウィザードがあります。チュートリアルと捉えても構いません。インストーラで見られるウィザードや、あるいはA Tour of Goのようなものを浮かべてもらえると、イメージは合ってます。
ただし、ウィザードで流す「コース」は複数用意します。初心者用、中級者、上級者用のように分けるなり、ユースケース別に分けるなり、色々ありますが、ここも腕が問われます。
もう一つ、オプションウィザードではオプションの検索機能も提供します。これは単に解説文を検索させるものではなく、検索されそうなワードも含めておいてヒット率を上げるというものです。
先の行数カウンタ cntln を例にして、スキャン先のディレクトリを除外したいとすると、以下のようなキーワードを「除外オプションの解説」に含めておくイメージです。
除外
無視
フィルタ
ignore
exclude
要は探しやすさを確保するために、冗長な情報を盛り込みます。
参考までに、これはHelpFeelで使われている技術です。実際はもっと複雑な技術ですが、要は利用者が使いそうなキーワードをあらかじめ仕込んでおくことでマッチ率を上げます。
上記の二つあるからこそ、オプションウィザードはオプションを理解する手段として重宝します。
重要なのはCLIで完結すること
「ブラウザでドキュメント読めばいいじゃん」と思われがちですが、違います。
重要なのはスマートデフォルトで実行したときの動線です。まずスマートデフォルトを見て、あたりをつけて、オプションウィザードで調整して、実行して、またあたりをつけて――といった体験にしたいのです。
UI をまたがないシームレスさは大事です。快適性が違います。連携(Integration)や拡張機能(Add-on や Add-in)をお使いの皆さまなら、よくわかっているはずです。しかし、CUI の世界では難しいことでした。
それを実現しうるポテンシャルを持つ発想が、このスマートデフォルトとオプションウィザードです。
おわりに
コマンドによりわかりやすさをもたらすという、新たなパラダイムを実現したい方は、ぜひご活用ください。