Hatena::ブログ(Diary)

まめめも このページをアンテナに追加 RSSフィード

2009-06-25

[] ダメなマニュアルの特徴

めちゃくちゃ遅い反応ですが、「よく言ってくれた!」という話。

現状のRDocはユーザリファレンスに向いてないと思ってる。

RDoc書いただけで「リファレンスは完璧だお!」とか言ってるやつなんなの - Greenbear Diary %282009-06-04%29

以下関係あるようなないような話。わが身は振り返らない方向で。


ダメなマニュアルの特徴

rdoc に限った話ではないですが、以下はダメなマニュアルに共通する特徴だと思います。

  • クラスやメソッドを ABC 順に並べている
  • メソッドの説明が長い
  • サンプルコードがない

こういう文書は読み手を普通のプログラマだと思ってません。


なぜダメか

ABC 順だと、どこから読めばいいかわからない。砂漠の真ん中で迷子になったような気分になります。早く使ってみたいのに使えない歯がゆさ。

説明が長いのは、メソッドの名前が適切でない可能性や、無駄に全機能を列挙しようとしている可能性が高いです。そもそも機能を詰め込みすぎている可能性もあります。

サンプルコードは一番大切です。百聞は一見にしかず。極論すると、サンプルコードさえあればメソッド単位の説明はなくても構いません。サンプルコードでは説明しきれないというなら、そんな API は見直すべきではないか *1


ぼくらのような普通のプログラマに必要なのは、そんなボトムアップな説明ではなく、「典型的な使い方がささっとわかる文書」のはずです。


マニュアルは「初めて使うときに読む文書」

ぼくはマニュアルとは「そのライブラリを初めて使うときに読むべき文書」だと考えています *2 。なので、とりあえずの使い方さえわかればよくて、advanced な機能は無理に載せてくれなくてもいいと思っています。

「なんでもいいからとりあえず動かしてから考えたい」というのは性格によるところが大きそうですが、習うより慣れろといいますし、そんなに間違ったことだとは思いません *3 。特に Ruby の場合は、動的型なことと、include や extend やその他いろいろでクラス階層をいじくり倒せるために、使いながらでないと理解しにくいという事情もあるかも。


リファレンスマニュアルはその名の通り、初心者の導入用文書ではなく、使いなれた人が確認のために参照する文書だ。その場合は上記の特徴が便利だ」という反論は考えられますが、サンプルコード集のような文書でも検索するだけのことですし、Ruby の場合、本当に詳しく知りたい場合はソースを読むものです。

「ソースは実装であって仕様ではないので、それに頼るのは危険だ。文書化された仕様は別途必要だ」という反論は正論です。仕様書を書くのには反対しません。が、仕様書マニュアル (手引き本、説明書) と呼ぶことはできません。蛇足すると、Ruby のユーザには互換性をそれほど重要視しない人が多い気がしますので、明文化された仕様であっても頼れないかも。


JavaDoc の場合

ダメなマニュアルの特徴を全部満たすのは (Ruby ではないですが) JavaDoc です。ぼくの Java 嫌いの 1/3 くらいはこいつのせいなんですが、このことは JavaDoc の Principle にひとこと書かれていて

At Java Software, we have several guidelines that might make our documentation comments different than those of third party developers. Our documentation comments define the official Java Platform API Specification. To this end, our target audience is those who write Java compatibility tests, or conform or re-implement the Java platform, in addition to developers. We spend time and effort focused on specifying boundary conditions, argument ranges and corner cases rather than defining common programming terms, writing conceptual overviews, and including examples for developers.

Thus, there are commonly two different ways to write doc comments -- as API specifications, or as programming guide documentation. These two targets are described in the following sections. A staff with generous resources can afford to blend both into the same documentation (properly "chunked"); however, our priorities dictate that we give prime focus to writing API specifications in doc comments. This is why developers often need to turn to other documents, such as the J2SE Documentation, Java Tutorial or the Java Class Libraries (in hardback only) for programming guides.

How to Write Doc Comments for the Javadoc Tool

要約すると

  • JavaDoc には 2 つの役割がある。1 つは Java プラットフォームを移植・新規開発をする人のための「Java API 仕様書」。もう 1 つは Javaプログラムを書く人向けの「プログラミングガイド」。
  • JavaDoc は前者にフォーカスしているので、境界値条件やコーナーケースを書くのに注力している。普通のプログラマは必要に応じて他のドキュメントを参照されたし。

ということで、この文書は普通のプログラマをメインの想定読者としていないのです。だからマニュアルとしてダメなのはしょうがない。実際 Java のあれは「Java Platform, Standard Edition 6 API 仕様」という名前なので、これは仕様書です。嘘いつわりは全くありません。マニュアルがないだけです。


JavaDoc にしても rdoc にしても doc としか言ってないので、それで作っただけで「マニュアル」ができたと思うなってことですね。


どんなのならいいのか

というのにちゃんと答えられないのでダメなんですが、最近ぼくがいいマニュアルだと思ったのは、sequel (DB アクセスライブラリ) のドキュメント。

コードで語ってますよね。あーそうか、ぼくの主張は「チートシートをください」というものだ。


言いたいことまとめ

以上、何を買っても説明書を読まないダメ人間のわがままでした。

*1:もちろん問題や対象ユーザ層にもよるのであくまで極論ですが、他人も使う API はそのくらいの気持ちで設計したほうが良いってことで。

*2チュートリアルがほしいわけではないです。長い自然言語は書く方も読む方も大変。

*3セキュリティを意識しなきゃいけない問題は別かも。ライブラリ側で隠してくれるのが理想ではあるけど。

yuguiyugui 2009/06/26 14:16 やっぱり出来がよいのはCPANですかねー。

http://hisashim.livejournal.com/255051.html

ku-ma-meku-ma-me 2009/06/26 22:13 ああー CPAN のあれは読み手にも書き手にもすばらしいフォーマットですよねー。
gem がこの辺継承しなかったのはとても惜しい。hoe のスタブはわりといいんだけど。

hogehoge 2009/06/27 17:23 ・ABC順がなんで駄目なんですかね ? 「このメソッドは大方こんな名前だろう」と調べられますよ ? 場合によりけりです。あなたは何順にすれば読みやすい、あるいは理解しやすくなると思いますか ?
・「サンプルコードさえあればメソッド単位の説明はなくても構いません。」とありますがそんな事は無いですよ。説明が無い ( あるいは理解出来ていない ) コードを書くのは危険です。極論ですが。
・サンプルコードがあれば「マニュアルとして良くなる」と仰っていますが、サンプルコードだらけだと読み難くないですか ?
・あなたの言う通り JavaDoc はマニュアルではありません。なのでこの文章に登場させるべきではありません。嘘が書いていないのであれば JavaDoc 自体は駄目ではないと思いますよ。
・私もマニュアルを書く際に「どうしたら読みやすい、理解しやすいマニュアルになるか」について悩むのですが、読む人が何をしたいかなんて千差万別だし、技術レベルも様々なので、結局そのマニュアルを読む人全員に「良い」と思ってもらえるのは難しいと思います ( 理想を追う事は素晴らしいと思います ) 。バランスなんですかね。
・sequel (DB アクセスライブラリ) のドキュメント。僕には良いと思えませんでした。あのサンプルコードでどうやってエラー処理を学べば良いのでしょうか。それに説明が一切書かれていないから何をやっているのかメソッド名から判断するしかありません。もしupdateというメソッド名でdeleteのクエリが発行されたらどうしますか ? メソッドの一つ一つを理解するのに自分でテストケースを書かなければなりません。
・あなたがほしがっているのはチュートリアルであってマニュアルではありません。「何を買っても説明書を読まないダメ人間」にマニュアルの善し悪しが語れますか ?

# 危険な書き方をしているのでコメントしてみました。気を悪くしたらごめんなさい。

ku-ma-meku-ma-me 2009/06/28 23:37 熱いコメントありがとうございます。

> あなたの言う通り JavaDoc はマニュアルではありません。なのでこの文章に登場させるべきではありません。嘘が書いていないのであれば JavaDoc 自体は駄目ではないと思いますよ。

マニュアルではないんですが、他にマニュアルとして参照できるものがないんですよねえ。それはともかく、JavaDoc 自体がダメとは書いてないつもりです。ただ、あのダメなフォーマットは JavaDoc が普及させたんじゃないかと思ってるんですが、その際に「JavaDoc はマニュアルではない」ということをきちんと周知しなかった罪はあると思っています。

> マニュアルを読む人全員に「良い」と思ってもらえるのは難しいと思います

それはもちろんその通りでしょうね。なので、みんなが自分のいいと思う形を主張し合って、より多くの人が共感する形になるといいと思います。これはその主張のひとつだと思ってください。
この辺は本文のカテゴリを [Ruby] にしてる理由の 1 つで、なんとなく Ruby ユーザなら共感してくれる人が多いんじゃないかなと思って書きました。

> sequel (DB アクセスライブラリ) のドキュメント。僕には良いと思えませんでした。あのサンプルコードでどうやってエラー処理を学べば良いのでしょうか。

この文書は想定読者が Ruby ユーザなので、Ruby ユーザならイメージ通りです。Ruby でエラー処理といえば基本は例外です。具体的にどういうときにどういう例外が投げられるかは、たぶん特に決められてません。マニュアルがどうこう以前の問題ですね。
残念ながら Ruby は (本体もライブラリも) 例外の設計が無頓着でダメなところです。この辺は過去に問題提起していたり (http://d.hatena.ne.jp/ku-ma-me/20090423/p1) 。

> それに説明が一切書かれていないから何をやっているのかメソッド名から判断するしかありません。もしupdateというメソッド名でdeleteのクエリが発行されたらどうしますか ? メソッドの一つ一つを理解するのに自分でテストケースを書かなければなりません。

それってマニュアルに一言あるだけで許せるんですか?
ライブラリを使うということは、普通はその作者とソースコードを信用するということです。さもなくば、テストケース書いても不足で、ソースコードを全部精査するしかないでしょう。

> 「何を買っても説明書を読まないダメ人間」にマニュアルの善し悪しが語れますか ?

「説明書を読まないダメ人間」だからこそ語れると思います。現状を問題だと思わない人から改善は生まれません。
あと、説明書を読まなくても使える製品は結構ありますが、ドキュメントを読まなくても使えるライブラリというのはちょっと見かけたことがありません。残念ながら。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ku-ma-me/20090625/p1