世界を動かす技術を、日本語で。

例が最良のドキュメントである

概要

公式ドキュメントは多くの場合、 実用的なコード例 が不足しがち 多くの開発者が 複数の技術領域 を同時に扱う現実 簡単なサンプル があれば理解が格段に速くなる ClojureDocsのような コミュニティ主導の例集 の有用性 APIリファレンスよりも 具体例やチュートリアル を求める傾向

公式ドキュメントの課題

  • 公式ドキュメントは 熟練者向け の記述が多い傾向
  • 基礎知識 や文法の前提が多く、初心者や他言語経験者には難解
  • 例えばPython 3のmax関数ドキュメントでは
    • /*の意味、 位置専用・キーワード専用引数 の理解が必要
    • イテラブルkey引数の使い方の知識が前提
    • 実際の 呼び出し例 が少なく、使い方が直感的にわかりづらい

簡単な例の重要性

  • 多くの開発者は 実装例を一目で知りたい ケースが大半
  • 例えば以下のような例があれば、理解が一気に進む
    • max(4, 6) # → 6
    • max([1, 2, 3]) # → 3
    • max(['x', 'y', 'abc'], key=len) # → 'abc'
    • max([]) # ValueError: max() arg is an empty sequence
    • max([], default=5) # → 5
  • 例があれば説明文を読む必要が減る ため、効率的な学習が可能

ClojureDocsのアプローチ

  • ClojureDocs はコミュニティが 実例を投稿 できる仕組み
  • intospitmapなどのページで 現実的な使用例 を多数掲載
  • 関連関数の例も一緒に載せることで 実践的な理解 が深まる
  • 日々の開発で参考になる ドキュメントとして高評価

ドキュメント利用時の心理

  • 公式「Documentation」リンクは 自動生成のAPIリファレンス が多く、敬遠されがち
  • 具体的な例やチュートリアル を求めて検索する開発者が多い
  • チュートリアルを選ぶ理由は 一から学びたいからでなく、例が欲しいから の場合が多い

まとめと提案

  • 公式ドキュメントにも シンプルな実例 を必ず掲載する工夫が必要
  • コミュニティ参加型の例集 を併設することで、実用性向上
  • 複数言語・フレームワーク間を移動する開発者 への配慮が今後の鍵

Hackerたちの意見

コードの例は、ドキュメントの退化や劣化を防ぐためにユニットテストとして実行できるけど、人間の言葉ではできない方法だよね。

今はLLM(大規模言語モデル)があるから、APIドキュメントをチェックするようになるかもね。

例は初心者やたまに使うユーザーには最適だけど、経験豊富な開発者には普通のドキュメントが必要だよ。パラメータのリストが全部載ってるやつね。例えば、requestsのページ。GoogleでいつもQuickstart[0]みたいな例がいっぱいのページに飛ばされるけど、上級者には全然役に立たない!俺の限られた脳でも、「get」を呼び出してHTTP GETを発行するのは覚えてるよ。他にどんなオプションがあるの?タイムアウトはどうするの?content-typeはどうやって渡すの?raise_for_statusは204を無視するの?どちらにもメリットはあるけど、開発者がどちらか一つしか時間がないなら、ちゃんとしたドキュメントを選ぶかな。 [0] https://requests.readthedocs.io/en/latest/user/quickstart/

例は初心者だけじゃなくて、実はすごく価値があることが多いんだ。中には、5秒で1時間分のドキュメントを読んで実験するのと同じ理解を与えてくれるものもある。特にgitのドキュメントページなんかがそうだよね。でも、概念的にはすごくシンプルだけど、明確かつ簡潔に説明するのが難しい単一の関数にも当てはまる。開発者はどちらの時間もないか、両方の時間があるかだよね。一方の生産性の壁を突破したら、もう一方はほんの少しの追加努力で済む。そういう場合は、両方を提供するべきだと思う。例外的に自己説明的なものが少数あるけど、そういう場合は通常ドキュメントだけで十分だね。

同意するよ。良いドキュメントはプログラムの動作をほぼ完全に指定していて、例だけでそれを実現するのは実用的じゃないし、無理だと思う。

参照のようなドキュメントを通じて動作を理解するより、例を通じて理解する方が何倍も簡単だよ。人は物の名前をつけるのが下手で、それをドキュメント化するのも苦手だからね。今日も数時間かけて、あるパラメータが特定の値のときだけ動作することを理解するのに苦労したよ。コードを理解するには魔法が多すぎて、LLMが最新バージョンはそのパラメータをサポートしてないって間違って教えてくるし、ドキュメントも見つからない。結局、動くはずの小さな例を作って、問題を絞り込むためにいろいろ変えてみるのが一番効果的だった。要するに、例は多くのことを凝縮した形式で示していて、非常に高い忠実度を持ってるんだ(通常は実行可能なコード例だからね)。APIドキュメントみたいなものは、比較的広範囲をカバーしていて、維持するのにかかる手間も少ない。ちなみに、俺は明確で、はっきりしていて、ほとんど努力なしでわかるような動作に関してはライブラリを全く信用してない。READMEの最初にそのことが書いてあったり、その一つのことを示すセクションがあったり、型で定義されていることが大事だと思ってる。ステータスコード周りの動作は変わるだろうと考えて、呼び出しコードではできるだけ問題を軽減するようにしてるよ。

たまに使うユーザー それが俺が投稿で指摘してることだよね。>プロジェクトや言語、フレームワークを行き来する時、コンテキストを復元して何が起こっているのかを理解するのにかなりの精神的エネルギーが必要だよ。

ちゃんとしたドキュメントは、詳細を提供する必要があるよね。でも、例を一つか二つ最初に出すのは、ユーザーにとってサクッと概要を掴むのにいい方法だと思う。インタラクティブな例があればなお良し。Redisみたいに、使い方の例があるとさらにいいよね。リンクはここだよ:https://redis.io/docs/latest/commands/incr/

それは相反するものじゃないよ。例とちゃんとした技術的なドキュメント、両方あってもいいんだ。

不公平な例だけど、Googleのドキュメントは最悪だよ。役に立たない簡単すぎる例が一つあるだけのクイックスタートか、全く別のサイトに自動生成されたクラスリストがあるだけで、説明はどこにも見当たらない。結局、使い方を学ぶためにライブラリのソースコードを見に行くことが多いんだ。

Diátaxisフレームワーク[1]は、異なるタイプのドキュメントとそれを使うタイミングについて良い提案をしているよ。これらのタイプの中で「最良」のものはないし、それぞれ異なる目的に役立つんだ。 [1] https://diataxis.fr/

概念的にはdiataxisは素晴らしいと思う。でも、実装するのは簡単じゃないよね。プロジェクトごとに各コンポーネントの比率が異なるし、すべての形式を同じフォーマットで一つのウェブサイトにまとめるのは非常に非効率的だよ。比率はコミュニティの採用や専門知識のレベルによっても変わるし、もっと実行可能な形になればいいのに。ドキュメントは難しい問題だし、いつかもっと良い方法が見つかるといいな。それまでは、ドキュメントはそこにかけられた時間と専門知識の量に依存するけど、リソースの制約でそれが十分じゃないことが多いんだよね。

Hacker Newsで議論の続きを見る