アーキテクチャ設計における垂直思考と水平思考
このADRをレビューするにあたっては、コンテキストのセクションもよくよく議論すべきで、意思決定が妥当かだけ見ても、「実はコンテキストに誤りやあやふやなところがありA案よりもB案の方が良かった…」みたいなことが発生するし、十分にコンテキストが理解されていない第3者や有識者をまじえてのレビューでは、レビューアに意思決定の構造を理解してもらいにくい、ということもある。
このとき、デシジョン(代替案とその中から1案選択する過程)とコンテキストは使う思考法が異なる。
コンテキストは水平思考(ラテラルシンキング)
デシジョンは垂直思考
したがってレビュー/議論の観点は以下のようなものになる。
コンテキストがロジカルに構成されているか?
前提条件が確からしいか?
なぜ、それが前提条件なのか確固とした理由があるか?
「誰か」が言ってるから、が根拠の場合は疑ってかかる
前提条件には時間的な制約がある? 時期をずらせば解消できない?
前提条件がSpecific過ぎないか?
起案者自身ができる範囲でしか考えてない?
抽象化レイヤーを一段あげれない?
解決したいことはもっと一般的表現できるのでは?
視点を変えてみると、条件に足りないものがないか?
代替案と意思決定までがロジカルか?
コンテキストに沿って代替案が抜けもれなく検討できているか?
コスト/実現性が現実的か?
他の似たような案件や世間一般の類似事例と比較してみた?
代替案の評価(pros/cons)
客観的で公平か?
サンクコスト効果に引きずられてない?
ノックアウトファクターがないか?
実例
「データ同期するのにSQSのメッセージサイズ上限を超えるので、IDだけ送って実際のデータはデータベース共有して、相手先システムからSELECTしてもらおうと思うのですが、それって疎結合といえますか?」
という下図の最下層の意思決定だけが、アーキテクチャ相談として持ち込まれることがよくある。
この妥当性をみるには、まず検討のプロセスを図のように可視化し、代替案を客観的評価する必要がある。
https://gyazo.com/5655e8b46c4b53024277f3fac84e643c
加えて、そもそもの前提条件を疑うことも必要で、それが前述のラテラルシンキングによりコンテキストを議論することになる。
https://gyazo.com/d013c4330c4cf881d47589db21db6deb
コンテキストの議論によって「更新データを送る」前提がただの代替案にすぎず、他の代替案を選んだほうが、組織にとっては良い決定になることも多い。
現実との整合
現実のプロジェクトには、コンテキストがあやふやだけど、わからないながらも最小限の手数で、とりあえず意思決定して先へ進まなきゃいけない、というケースもある。だからといってコンテキストをしっかり書かず、代替案だけ並べて議論しても、コンテキストが明らかになってきたときに、その決定の妥当性を見返すチャンスを失う。そういう場合でも、仮定で良いのでコンテキストはしっかり書き出し、関係各位の共通認識を作るようにしよう。