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

良い設計文書の書き方

概要

  • デザインドキュメント の意義と目的を明確化
  • 読み手を納得させるための 論理的な構成 の重要性
  • 編集・推敲 によるドキュメントの簡潔化
  • 実践的な執筆・編集のコツ の紹介
  • 継続的な練習 の必要性と執筆文化の価値

良いデザインドキュメントの書き方

  • デザインドキュメント とは、システム実装方針を 技術的観点・制約・トレードオフ とともに記述する技術文書
  • 目的は、 与えられた状況下で最適な設計 であることを読み手に納得させること
  • 数学の証明のように、 論理的筋道 で「なぜこの設計が最適か」を説明
  • 書き手自身が一番納得することが重要で、 執筆過程で思考の曖昧さ が明らかになる
  • コード同様、 ドキュメントの構成 も品質に直結
    • まとまりのない「 スパゲッティドキュメント」は読み手を混乱させる
    • 文や段落の流れが自然で、 読者が驚かない構成 を目指す
    • 問題提起から結論まで、 一貫した論理展開 が必要
  • 読者の知識レベルや疑問を 事前に想定 し、先回りして説明・反論を用意
  • 編集作業 で無駄な言葉を削除し、 簡潔さ を追求
    • 読者の集中力は有限、 30%程度の削減 が目安
    • 他人のドキュメントを添削することで、編集力向上
  • 練習量が質を生む
    • Amazon(AWS)など 執筆文化のある職場 での経験が成長を促進
    • 会議でドキュメントを全員で黙読し、 赤ペンで添削 する文化

実践的な執筆・編集のコツ

  • 短い段落 を心がける
    • 各段落は 1つの主張や観察 に絞る
    • 読者が 1文で要約できる 内容にまとめる
    • 必要に応じて説明を加えるが、 本質は1アイデア1段落
  • 箇条書き的な構成 を意識
    • 例:観察A → 観察B → だからアイデアC → 問題D・E → 観察F → よってアイデアG → 改善案H
  • 付録(Appendix) の活用
    • 複雑な計算やシミュレーションの詳細は 本文ではなく付録 に記載
    • 本文は結論の理解に集中、 付録は興味ある読者向け
  • 編集例
    • Before: 各箇条書きは段落にし、要約できるべき。実際は1文でなくてもよいが、読者が要点を1文で把握できるように。
    • After: 各箇条書きは1文で要約できる段落に。必要なら説明を加えるが、要点は1文で把握できるように。

執筆文化と継続的な練習の重要性

  • 多くの実践経験 が良いドキュメント作成力を育てる
  • 執筆文化のある職場 (例:Amazon)の会議スタイル
    • 会議冒頭で全員がドキュメントを黙読、 赤ペンでコメント
    • フィードバックを受けることで、 執筆力が強制的に向上
  • 他人のドキュメント添削 で編集力を磨く
  • 短文(例:ツイート制限)で要点を伝える練習 も有効

まとめ

  • 論理的な構成・簡潔な表現・読者視点 が良いデザインドキュメントの鍵
  • 編集・添削・実践 を通じてスキルを高める
  • 執筆文化のある環境 での経験が成長を加速
  • 読者が「当然」と思える流れ を目指すことが最良のデザインドキュメントへの近道

Hackerたちの意見

記事の中で特に目を引く2つの引用があります。まず、Xのスクリーンショットからの引用: 「書くプロセスには、あなたのアイデアを10倍良くする何かがある」。次に、冒頭近くからの引用: 「説得すべき最も重要な人は著者だ」。デザイン文書はとても重要で、業界での数年を経ても、いわゆる「プロダクトマネージャー」たちがこのアイデアに反対するのを見ると驚きます。レスリー・ランポートが言ったように、「書くことは、私たちの考えがどれだけ雑であるかを教えてくれる自然の方法です」。技術的な文章の質を向上させたい人は、「アマゾニアンのように書く」を見てみてください: https://medium.com/@apappascs/write-like-an-amazonian-14-tip...

形容詞をデータに置き換えろ このアイデアはテクノロジー全体に広がりすぎて、今私が受け取る履歴書は数字だらけで、何をどう解釈すればいいのかわからなくなっています。

自分だけが読むことになるかもしれないデザイン文書を書くこともあります。こういうことを書き留めるのは本当に力強いです。参考になる例文書があれば、他の人の最終的な構造と自分のを比べてみたいです。

アマゾンで7.5年働いていて、サイドプロジェクトでもPRFAQを書いて、ステークホルダーと共有してフィードバックをもらっています。アマゾンではPMTですが、別の人生では多くのプロジェクトでコーディングをして、インフラやアーキテクチャを開発しています。できるだけ多くのことを書くのを楽しんでいます。とはいえ、顧客のニーズを最優先に考えよう!

そんな風には考えたことがなかった - PR/FAQ - プレスリリース / よくある質問 https://productstrategy.co/working-backwards-the-amazon-prfa...

デザインレビューをする立場として、すべてのデザイン著者はこの概念を内面化すべきだと思います。> しかし、良い文書は問題とメンタルモデルを示し、数週間の思考を経て生まれた解決策が文書を読む頃には明確になるようにします。私のお気に入りの引用はこれです: 「もっと時間があれば、短い手紙を書いただろう」。デザイン文書は複雑なことをシンプルにするべきです。エンジニアが経験した知的な苦労や失敗の記録のゴミ箱になってはいけません。それを記録する価値はあるかもしれませんが、それは別の文書、もしくは少なくとも付録にすべきです。前に進む道はシンプルで理解しやすく保ちましょう。

「もっと時間を、短い手紙がいいな」

自分に聞く二つの質問は、「これについてバイクシェディングが起こるかな?」と「これについてバイクシェディングする価値がある?」ってこと。自分の目標は、初めて読む人にとって難しいアイデアを話しやすくすることなんだけど、重要じゃない問題を避けることも意識してるんだ。

こういう文書が大好きで、書く文化全般も好きです。でも、これが裏目に出ることも見たことがあります。このアプローチは、読者があなたが出した結論に至った理由を理解したいと思っている文書には特に良いと思います。文書が説得力のある議論のようなものです。これは貴重な文書だと思います(私が書くのも読むのも好きなスタイルです)が、常にそうとは限りません。しばしば、結論、つまり「終わり」から始めて、読者を方向付けるのが良いと思います。また、あなたの判断を信頼している読者に対して、スピード感を持たせるためにも。読者が論理の流れに沿ってついていく準備ができていない場合も多く、彼らはオチを知りたいのです。一度それを知れば、続きが気になるかもしれません。

私の経験では、組織や明確さが、ドキュメント作成を改善しようとするソフトウェアエンジニアにとって最大の障害です。著者のスパゲッティコードの比喩は、文書内でのアイデアの整理の重要性を示していて、私も同じ概念を伝えるのに苦労していたので、今後これを使おうと思います。以前は、読者を思考プロセスを通じて「運ぶ」ことについて話しましたが、この投稿はその概念をより親しみやすい形で説明しています。昨年、似たような投稿を書いたことがあり[0]、異なる会社の人との類似点(簡潔さ、練習の重要性)や違いを見るのは興味深かったです。「短い段落」については同意できないかもしれません。それは情報密度の高い文章の自然な結果かもしれませんが、アイデアが洗練されていなければ、行の区切りだけではあまり役に立ちません。「編集」セクションは、その根本的なアイデアにもっと直接触れていると思います。[0]https://ryanmadden.net/things-i-learned-at-google-design-doc...

テクニカルライティングのクラスを受けたおかげで、文書を要約する能力が大幅に向上したよ。このコースでは「赤ペンで切る」アプローチ(書いて、消して、書き直す)を強調していて、できるだけ少ない言葉で概念やアイデアを明確に伝えることに焦点を当ててた。これにはいくつかの層があって、練習するほど簡単になるんだ。チームともこの知識を共有しようとしてるけど、定期的なトレーニングが必要なスキルだってことを忘れちゃいけないね。

明瞭さと編集に関する良いアドバイスだね。ただ一つの欠点は、文書が承認された後はどうなるかってこと。メンテナンスがないと「デザイン考古学」になっちゃう。数年前、アンドリュー・ハーメル=ローが、軽量なアーキテクチャ決定記録(ADR)を使った会話的なアーキテクチャのスケーリングについて面白いアプローチを書いてたんだ。ADRsはコードの横にあって(adr/001-use-postgres.md)、コンテキスト、決定、ステータスを短いフォーマットで記録するから、PRのたびに見直せるし、現実が変わったときには簡単に上書きできる。元の理由が数ヶ月後も検索できる状態になるんだ。興味がある人のために、ハーメル=ローの投稿のリンクを貼っておくね: https://martinfowler.com/articles/scaling-architecture-conve...

MF.comのリンクをちゃんと読まなきゃいけないけど、これに気づかざるを得ないね。「それが全てだ。それがアドバイスプロセスの全貌だ。」(関係者全員に話す)。おそらく、役職名に「マネージング」ってついてる人は、だいたいこの辺でぼんやりしちゃうんだろうね。で、本題に入ると「四つのサポート要素」ってなる。ADRについて調べようとしたら、最初のリンクをたどって、最終的にこの素晴らしいものにたどり着いたよ(上のページの一番下に大きなダウンロードボタンがある): https://www.thoughtworks.com/content/dam/thoughtworks/docume... 実際のADRの定義を教えてもらえる?

セッションメッセンジャーもそうだね。デザインやアーキテクチャの変更が多すぎて、どう動作するかの権威ある情報が一つもないんだ。ちなみに、安全なメッセージングが必要なら、Signalを使った方がいいよ。

アマゾンの会議は、プレゼンターが文書のコピーを配るところから始まる... 会議はみんなが黙って座って、文書を読み、赤ペンで余白にメモや質問を追加するところから始まる。アマゾンで働いたことはないけど、これをよく聞くし、いつも変な慣習だなと思う。さらに奇妙なのは、どうやらこれがうまくいくらしく、話す人たちはみんなこれを好きみたい。みんなが一緒に文書を読んでいる間に貴重な会議の時間を無駄にしてるよ。会議の前に同じことをやれば、もっと短い会議になるのに。同期でやるってことは、みんなが一番遅い読者が準備できるまで待たなきゃいけないか、全員が時間内に終わらないってことだし。「一番遅い読者」ってのは、単に読みの速さだけじゃないと思う。おそらく、文書のコンテキストをもっと理解している人は、早く理解できるんだろうね。グーグルのデザインレビューでは、ほとんどの参加者が準備不足で、チームメイトが文書を議論している間に初めて文書を読んでいるのが明らかだった。おそらく、グーグルには強い文書文化がなくて、リーダーやマネージャーは人々が準備不足で来るのを静かに許容していたんだろう(時には、彼ら自身も準備不足だったり)。実際に見たことはないけど、レビュー会議の前に文書をレビューすることで、両方の良いところを取り入れるのは難しくないと思う。文書を事前に読むことが強い文化的規範になれば、会議はただの議論の場になるはずだし、ただ読むための場や、読んだふりをするための場にはならないはず。

みんなが同じページにいないときや、誰かが自分の特殊ケースがカバーされてないんじゃないかと心配してるときに、もっと時間を無駄にしてるよ。

自分の経験から言うと、会議で起こらないことは実際には起こらないよね。

会議の前に同じことを簡単にやれるはずだし、そうすれば会議もずっと短くなるよね。アマゾンのやり方は、実際に誰もこれをやっていないことへの反応なんだ。数年前に読んだ記事によると、「会議の前に読書の文化を強化する」ことも実際には難しいって気づいたみたい。なぜなら、多くの参加者がこの会議の前に別の会議があって、その準備ができなかったから。紙の上では、これにたくさんの穴をあけられるよね:参加者の会議の数を減らせばいいじゃん? 読書が会議で実際に意思決定するための時間を減らすんじゃないの? でも実際には、参加者が出席している会議には価値があることがわかったみたいで、読書の時間があっても多くの決定が下されているんだ。だから、理論的にどう変えられるかを心配するんじゃなくて、結果を見なきゃいけないことの一つかもしれないね。少なくともアマゾンでは、みんなその結果が本当に好きで、このアプローチのメリットがデメリットを上回っているみたい。

いつ読むかって、そんなに重要? 会議のためにもっと時間が必要なら、時間を増やせばいいだけだし。唯一のデメリットは、会議のスロットを見つけるのが難しくなることだけど、総時間は変わらないよ。

効果的なプロセスの一つ: ステップ1. 文書に思いつくことを全部書き出す(もっと早く考えをまとめるために音声入力を使うのも考えてみて)。ステップ2. LLMに構造と進行を与えてもらう。読みやすさのために考えを整理しているから、たぶん捨てたくなるだろうね。この段階ではまだ考えを洗練しているところだから。ステップ3. LLMの出力を出発点として使うか、最初からアウトラインを書く。そこから初稿を作り上げる。ステップ4. 簡素化する: 言葉を削ったり、大きな言葉を小さな言葉に置き換えたり。ステップ5. ステップ4を繰り返す。LLMは言葉の洪水から構造への橋渡しをしてくれる。LLMから得たものは捨てる覚悟を持つべきだね。少なくとも30%は常にカットできる。意図を失わずにどれだけ削れるかは驚くべきことだよ。

拡張、圧縮、圧縮、拡張、圧縮。で、誰かが特定のことについて聞いてきたら、また拡張する。最後には、ペットアイデアが満たされた後にLLMを使って圧縮する。ほんと、終わりのないジェットコースターに乗ってるみたいだね。