こんにちは、 @kz_morita です。
先日行われた勉強会 でデザインドキュメントというソフトウェア開発時に各ドキュメントについて聞いて,興味が湧いたのでしらべてみました.
デザインドキュメントとは
デザインドキュメントは Google などの企業でソフトウェア開発を行う際に一緒に書かれるドキュメントのことです.
ソフトウェアがどのような問題をどのように解決するのかを,ソフトウェアよりより高いレベルで伝えるための手段としてもちいられます.
何を書くべきか
このドキュメントには,実装のアプローチや,主要な設計上の決定事項,考慮されたトレードオフなどが書かれます.
何を書くべきかという明確なルールはないためそれぞれのプロジェクトに合った形で改造していくのが良さそうです.
以下に自分が参考にした一例を載せます.
- プロダクト開発・機能開発・改善の背景
- 課題は何か=何を解決するのか
- システムの技術的概要, アーキテクチャー図
- スコープ
- プロジェクトの参加者
- 用語集
- 選定した解決手段について
- 選定の根拠、トレードオフ
- 詳細なアーキテクチャー図など
- PoCの内容と結果
- 選定しなかった解決手段について
- 手段の概要と、不採用の根拠
- 外部依存の概要
- 機能そのもの、解決手段についてセキュリティ観点からの考察
- 現時点で考えられるリスク
- リスクの概要
- 考えられるリスクへの対応策
- 現時点で対応策を取らない理由
- テスト観点からの考察
- 運用観点からの考察
- 運用時の考慮事項
- 障害の発見と復旧手法
- References
- etc...etc..
特に重要なのは,考慮したけど採用しなかったものや,技術選定の際の選定基準やトレードオフ,またその技術を使うことで起こりうるリスクなどになるかなと思います.
デザインドキュメントの価値
メリット
ドキュメント化することにより,早い段階で設計のレビューを行ったり問題点を話し合うことで手戻りがすくなるほか,組織内での合意形成などにも役に立ちます.
そして何より,考古学をしなくてよくなるということが最大のメリットに感じました.
ここで考古学といったのは,例えば古いシステムの古い仕様について聞きたいときに,プロジェクトに当時在籍していた人がすでに退職してわからなかったりする場合には,コードやコミットログ,チャットのログなどから状況を推測する必要がある事象のことです.
ドキュメントの形になることにより,なぜこういった仕様なのか,なぜあの技術を採用しなかったのか,作られた当初に考えられたリスクは何なのか,などがソースコードから読み解かなくても良くなります.
特になぜ,おこなわなかったのかという判断については,ソースコードから読み解くのが非常に難しいためこれらの情報が残っていることはとても重要に感じます.
結果として古いコードに対しても修正を行いやすくなり,継続的に改善がしやすくなる期待があります.
デメリット
純粋にドキュメントの作成はオーバーヘッドになります. そのため,その労力がこの文書によって得られるメリット(設計に関する,共有やレビュー,合意形成など)より大きいかといった点には注意する必要がありそうです.
たとえば,解くべき課題がとてもシンプルで誰にとっても明確な場合,このデザインドキュメントの価値は低くなるでしょう.
書くべきか
個人の意見としては,デザインドキュメントはこれから積極的に書いていきたいと考えています. 理由としては,もちろんドキュメントという形で残すことによるメリットもありますが,加えてデザインドキュメントを書くという工程に,PoC やプロトタイピングが含まれることにあります.
何らかの技術を選定することはなんらかの技術を捨てることであり,なにをどういう基準で捨てるか(トレードオフをしっかり理解した上で)ということは重要だと思っています.
自分はつい目の前の技術で解決しようとしてしまうことがあるため,デザインドキュメントを書くという行為を通して,他のよりよい選択肢はないか?ないとしても他にどういった候補があり,どういう理由で採用しないのかをしっかり検討する良い機会になると考えます.
運用
ドキュメントでしばし問題になるのがそのメンテナンスコストだと思います.メンテナンスされてないドキュメントがあるくらいならば,ドキュメントが無い方が誤解がなくましという意見もあると思います.
運用としては,ソースコードとデザインドキュメントは同じようなサイクルで更新していくのが良さそうです. デザインドキュメントをつくり,実装をはじめていくうちに設計の問題点が浮き彫りになることは一定数起きると思います. そういったときに,ソースコードをすぐに修正したい気持ちを抑えて,ドキュメントを直していくということが重要だと考えます. ドキュメントの更新のイテレーションをできるだけ短く保つと一回あたりの修正量も減りそうです.
ただ,この方法は純粋にソースコードだけを修正するよりも手間がかかるのは事実なのでプロジェクトの状態などによってやるべきかどうかは判断が必要そうです.
まとめ
今回はデザインドキュメントについて軽くまとめました. いわゆる設計書なのですが,どういった観点で情報を残すべきなのかといった点を知ることができて良かったです.
また,個人的に未知の技術に対して取り組むときに,実装段階になってから設計や仕様のまずさに気づくという経験が何度もありました. このデザインドキュメントを意識的に書くことですこしでもそういった事象が減るかもしれないため,まずは積極的に書いていくようにしていきたいと思います.
デザインドキュメントに関する資料
- https://www.industrialempathy.com/posts/design-docs-at-google/#the-actual-design
- (上記の日本語訳) https://tkybpp.hatenablog.com/entry/2020/08/03/090000
- https://www.youtube.com/watch?v=edWYe9q5aCg
- https://rebuild.fm/206/
デザインドキュメント例
公開されている実際のデザインドキュメントがあったので載せておきます.