ドキュメントを書く
この部の 4 / 9 章 ・ 全体で 16 / 76 章 ・ 読了目安 40 分
- 実装前に設計を文章で合意できる
- 読み手が最初の1行で判断できる文章を書ける
- 腐らないドキュメントの残し方を知っている
新人が最初に評価されるのは、コードではなく文章です。
理由は単純で、あなたのコードを読む人は数人ですが、 あなたが書いた PR の説明・相談・設計ドキュメントは、 チーム全員が読むからです。そして読みにくい文章は、読まれません。
読まれなかった設計ドキュメントは、無いのと同じです。
この章では、実務で書く文書の型と、書き方の技術を扱います。
コードは「どう」しか語らない
コードを読めば、何をしているかは分かります。しかし次のことは、 どれだけ丁寧なコードを書いても伝わりません。
- なぜその方法を選んだのか
- 何を検討して捨てたのか
- どういう制約があってこうなっているのか
- この処理がいつまで必要なのか
これらは文章にしか残せません。だから設計ドキュメントを書き、 PR の説明を書き、コミットメッセージを書きます。
読まれるコードを書くで「コメントは WHY を1行で」と書きますが、 1行で書けない WHY はコードコメントではなくドキュメントに書きます。
- コードコメント: 「なぜこの順序なのか」(1行)
- コミットメッセージ: 「この変更で何が変わるか」
- PR 説明: 「なぜこの変更が必要か、どう確認したか」
- 設計ドキュメント: 「なぜこの設計にしたか、何を捨てたか」
背景や検討経緯をソースコードに長々と書くと、コードが読めなくなり、 しかも変更時に更新されず嘘になります。
まず読み手を決める
すべての文章術は、これに集約されます。
誰が → チームの他のエンジニア? 未来の自分? 非エンジニア?
いつ → 今すぐ? 半年後の障害対応中?
何のために → 判断するため? 手を動かすため? 経緯を知るため?
読むのか
「半年後、深夜3時の障害対応中に読む人」を想定すると、 書くべきことがはっきりします。その人は焦っていて、前提知識がなく、 最後まで読む時間もありません。だから結論を最初に書きます。
実務で書く6種類
| 文書 | 目的 | 寿命 |
|---|---|---|
| PR の説明 | レビュアーが判断するため | 短い(マージまで) |
| 設計ドキュメント | 作る前に合意するため | 中(プロジェクト中) |
| ADR | 決定と理由を残すため | 長い(永続) |
| README | 初めて触る人が動かすため | 長い |
| Runbook(手順書) | 障害時・定型作業で手を動かすため | 長い |
| ポストモーテム | 同じ障害を繰り返さないため | 長い |
寿命が長い文書ほど、更新されないと害になります。 「そのうち直す」で放置された手順書は、障害時に人を迷わせます。
設計ドキュメント(デザインドック)
コードを書く前に、何を作るかを文章で合意するための文書です。 実装に何日もかかるものは、まずこれを書きます。
書くのが面倒に見えますが、実装後に「そもそも要らなかった」と言われるより はるかに安いというのが、これが広く使われている理由です。
型
# タイトル: 何を作るのか(1行で分かる名前)
## 背景 / 課題
今どういう状態で、何が困っているのか。
数字があれば必ず入れる(「遅い」ではなく「p99 が 3.2 秒」)。
## ゴール
これができたら成功、と言えることを箇条書きで。
## 非ゴール ← ここが最も重要
今回はやらないこと。「将来的にはやるかもしれないが今回は対象外」を明示する。
## 提案する設計
図を1枚。それから、変更するコンポーネントごとに何をするか。
## 検討した他の案
案A / 案B を挙げ、なぜ採らなかったかを書く。
## リスクと影響
壊れうるもの、移行の手順、ロールバックの方法。
## 未解決の点
決まっていないこと、レビューで意見が欲しいところ。
設計レビューが長引く原因のほとんどは、 レビュアーが「もっと汎用的にすべきでは」と広げることです。
「今回は単一リージョンのみ対象。マルチリージョン対応は非ゴール」 と最初に書いておけば、その議論は「では次のフェーズで」で終わります。
やらないことを先に宣言するのが、スコープを守る一番簡単な方法です。
設計ドキュメントは7割の完成度で早く出すものです。
完璧に書き上げてから出すと、根本的な指摘を受けた時に 書いた時間がすべて無駄になります。しかも人間は、 時間をかけたものほど手放せなくなります。
「未解決の点」を空欄のまま出して構いません。 むしろそこが議論の入口になります。
ADR — 決定を1件1ファイルで残す
ADR(Architecture Decision Record)は、 「なぜそう決めたか」だけを短く残すフォーマットです。
# ADR-0007: セッション管理に JWT ではなく Redis を使う
## ステータス
承認済み(2026-08-08)
## 文脈
- ログアウトを即時に反映する要件がある
- 認証基盤は今後 SSO に置き換える可能性がある
## 決定
セッション ID を発行し、実体は Redis に持つ。JWT は使わない。
## 理由
JWT は有効期限まで失効させられず、即時ログアウトの要件を満たせない。
ブラックリストを持つなら結局ストアが必要で、JWT の利点が消える。
## 結果として受け入れること
- Redis が単一障害点になる → レプリカ構成にする
- 水平分割時にセッションストアの共有が必要になる
一度書いた ADR は書き換えません。
決定が変わったら、新しい ADR を追加して 古いものに「ADR-0021 により置き換え」とステータスだけ書き足します。
こうすると「なぜ昔はこうだったのか」が残ります。 これが分からないせいで、同じ検討を何度も繰り返すチームは多いです。
README
初めてこのリポジトリを開いた人が、動かせるようになるための文書です。 それ以上のことは書かないでください。
1. これは何か(1〜3行)
2. どう動かすか(コピペで動くコマンド)
3. どう開発するか(テスト・ビルド・よく使うコマンド)
4. どこに何があるか(ディレクトリの説明)
5. 詳しいことはどこを読むか(他ドキュメントへのリンク)
- 前提が書いていない — Node のバージョン、必要なツール、権限
- コマンドがコピペで動かない — 途中に説明文が混ざっている
- 書いた時点でしか動かない — 誰も再現していない
新しく入った人に手順書を見ながらセットアップしてもらい、 詰まった箇所をその人に直してもらうのが、最も確実な更新方法です。 開発環境を作るにも書きましたが、手順書を疑うのは新人の仕事です。
Runbook(手順書)
障害対応や定型作業で、焦っている人が上から順に実行する文書です。 設計ドキュメントとは書き方が根本的に違います。
| 設計ドキュメント | Runbook |
|---|---|
| 読んで理解してもらう | 読まずに実行してもらう |
| 背景から説明する | いきなり手順から始める |
| 散文でよい | 番号付きの命令形だけ |
# API の応答が遅い時
## 判断(30秒で見る)
1. ダッシュボード X を開く → p99 レイテンシを見る
2. 3秒を超えていたら、以下を実行
## 対応
1. Pod の状態を見る
kubectl get pods -n api
2. Restarts が増えていれば、直前のログを見る
kubectl logs <pod> -n api --previous
3. OOMKilled なら、レプリカを一時的に増やす
kubectl scale deploy/api -n api --replicas=6
4. 5分待って回復しなければ、直前のリビジョンに戻す
kubectl rollout undo deploy/api -n api
## エスカレーション
15分で回復しない場合は #incident に投稿し、@oncall-lead を呼ぶ
判断基準を数字で書くのが要点です。 「重ければ」ではなく「p99 が3秒を超えていたら」と書きます。 深夜3時の人間に判断させないでください。
相談・質問の文面
この教科書の使い方の「詰まった時にどうするか」を、文章の型にしたものです。 これが書けるだけで、新人としての評価が変わります。
【やりたいこと】ユーザー一覧に検索を追加したい
【やったこと】 ListUsers に filter を足して proto を再生成した
【起きたこと】 生成後のビルドで undefined: FilterRequest が出る
【調べたこと】 生成先の .pb.go を見たが FilterRequest が入っていない。
buf.gen.yaml の paths 設定を疑っている
【聞きたいこと】proto の再生成手順が他にありますか?
【急ぎ度】 今日中に PR を出したい。30分詰まっています
悪い質問は「エラーが出ました。どうすればいいですか」です。
これは、答える側に**「何をしようとしていたのか」「どこまで調べたのか」を 聞き返す往復**を強制します。往復1回につき数十分が失われます。
上の型は、答える側が1回で答えられる情報を全部含んでいます。 書いている途中で自己解決することも多く、これも利益です。
そして重要なこととして、この型で書くと「調べていない」ことがバレます。 だから調べるようになります。
書き方の技術
型より先に、文そのものの品質があります。
結論から書く
悪い: 調査したところ、A の可能性を検討しましたが B ではないかと思われ、
C も見た結果、おそらく D が原因ではないかと考えています。
良い: 原因は D です。(改行)根拠: ... / 他に見た可能性: A, B, C
読み手は最初の1行で「自分に関係あるか」を判断します。 そこに結論が無いと、読むのをやめます。
曖昧な言葉を消す
| 書かない | 書く |
|---|---|
| なるべく早く | 今日の18時までに |
| 遅い | p99 が 3.2 秒(目標は 500ms) |
| だいたい終わった | 実装は完了、テストが未着手 |
| 少し直した | エラー処理を3箇所追加した |
| 問題ないと思います | 手元で再現手順を3回試して再現しませんでした |
「思います」と書きたくなったら、確かめられるかを考えてください。 確かめたなら事実を書けます。確かめていないなら「未確認」と書きます。
1文を短くする
悪い: 今回の変更ではリトライを追加しましたが、その際にタイムアウトも
調整する必要があったため合わせて修正し、テストも追加しています。
良い: リトライを追加しました。
合わせてタイムアウトを 3s → 1s に変更しています(リトライ3回で合計3秒に収めるため)。
テストを2件追加しました。
1文に「が」「ため」で3つ以上つなげたら、切ります。
主語を省略しない
悪い: エラーになったので直しました
良い: CI の lint ジョブがエラーになったので、import の順序を直しました
日本語は主語を省けてしまうため、 誰が・何がを意識して書かないと、読み手が推測することになります。
図を1枚入れる
処理の流れ・システムの構成・状態遷移は、文章より図のほうが速いです。 凝ったツールは要りません。この教科書と同じテキストの図で十分です。
[ブラウザ] --HTTP--> [API] --gRPC--> [検索サービス]
|
+--------> [Spanner]
書いたドキュメントは、放っておけば必ず現実とずれます。 間違ったドキュメントは、無いより有害です(人が信じて動くため)。
対策は3つです。
- 量を減らす — 更新されない100ページより、正しい2ページ
- 正本を1つに決める — 同じ内容が2箇所にあると、必ず片方が腐る
- コードの近くに置く — リポジトリ内に置き、PR で一緒に直させる
「ドキュメントを更新する」という別タスクにしないでください。 変更の PR に、ドキュメントの差分も含めるのが唯一続く方法です。
実装に3日かかる機能を任されました。最初にすべきことはどれですか。
実務の落とし穴まとめ
- 結論が最後にある — 読み手は最初の1行で読むかを決める
- 「なるべく早く」「だいたい」 — 数字と事実に置き換える
- 設計ドキュメントを完璧にしてから出す — 7割で早く出す
- 非ゴールを書かない — 設計レビューが無限に広がる
- ADR を書き換える — 過去の判断理由が消える。新しく追加する
- README がコピペで動かない — 新人に試させて直させる
- 手順書が散文 — 焦っている人は読めない。番号付きの命令形で
- ドキュメント更新を別タスクにする — 必ず腐る。同じ PR に含める
まとめ
- コードは「どう」しか語らない。なぜ・何を捨てたかは文章にしか残らない
- 最初に読み手(誰が・いつ・何のために読むか)を決める
- 実装に日単位かかるなら設計ドキュメント。特に非ゴールを書く
- 決定は ADR に1件1ファイルで残し、書き換えずに追加する
- README は動かすため、Runbook は実行するため。書き方が違う
- 相談は【やりたいこと / やったこと / 起きたこと / 調べたこと / 聞きたいこと】
- 結論から・数字で・1文を短く・主語を書く
- ドキュメントは腐る。量を減らし、正本を1つにし、同じ PR で直す
公式ドキュメント
迷ったら一次情報に戻ってください。
| 対象 | リンク |
|---|---|
| Google Technical Writing(無料コース) | https://developers.google.com/tech-writing?hl=ja |
| Architecture Decision Records | https://adr.github.io/ |
| Diátaxis(ドキュメントの4分類) | https://diataxis.fr/ |
| Design Docs at Google | https://www.industrialempathy.com/posts/design-docs-at-google/ |
章末問題
障害対応用の手順書に書くべきでないものはどれですか。
半年前に「認証は Redis セッションで実装する」と決めた経緯を調べたい。どこを見るのが最も確実ですか。
次の章では、そのコードと文章をAI と一緒に書く時に、 何を任せて何を任せないかを扱います。