自分が関わっていないソフトウェアは設計できない
概要
- 大規模ソフトウェア設計においては、現場エンジニアの具体的知識が不可欠
- 一般的な設計アドバイスは既存システムにはほとんど役立たない
- 設計議論は個別の詳細や現状コードベースを中心に展開
- アーキテクト職の抽象的設計は現場で実装困難な場合が多い
- 新規プロジェクトや全社方針には一般論が有効な場合もあり
大規模ソフトウェア設計と現場エンジニアの役割
- 大規模システム設計には、日々そのシステムに携わるエンジニアの現場知識が必須
- 具体的なコードの理解がなければ、有効な設計判断は下せない現実
- 一般的な設計原則やパターンよりも、現状のコードベースの把握が重要
- 一貫性の維持が「良い設計」よりも大切なケースが多い
- 実際のコードベースは複雑で予測困難な影響が多発
- 安全な変更を行うには、実装選択肢が大幅に制限される傾向
- 大規模コードベースは常に複数設計の中間状態で存在
- 理想的な設計目標よりも、変更後の全体像が重視される
一般的なソフトウェア設計アドバイスの限界
- 一般論の設計アドバイスは、既存システムの現場課題にはほぼ無力
- **「問題に対する設計」**は、ドメイン理解はあっても既存コードに疎い場合の助言
- 設計本やブログで語られるのはほぼこのタイプ
- 現場では具体的要素が一般的要素を圧倒
- 現状のコード把握こそが最優先事項
具体的な設計議論の実態
- 有用な設計議論は、システム詳細を深く知る少人数で行われる
- 議論内容は抽象的原則ではなく、具体的なシステム事情に集中
- 例:「この新機能をサブシステムAに入れられるか?」「Bの情報がCのコンテキストにないから無理」「Dを書き換えずにEを分割すれば…」など
- 設計哲学よりも具体的な誤解の指摘が重要
- 例:「Cは最近リファクタされてBを渡せるようになった」など
一般的設計アドバイスが役立つ場面
- 新規プロジェクト立ち上げ時は、具体的制約がないため一般論が有効
- 複数の具体案で迷った時の「タイブレーク」に一般原則が使える
- 会社全体の方針決定時(例:クラウド利用、k8s導入、AWS vs Azure選択)に有用
- ただし、この場合も具体的制約を無視すると失敗リスク大
- 例:クラウドで独自ハード依存不可、自社DCでグローバル展開不可など
アーキテクト職と抽象設計の落とし穴
- 抽象設計を専門とするアーキテクト職は、現場実装と乖離しやすい
- 実装担当エンジニアが抽象設計を現実のシステムに落とし込むのは困難
- アーキテクトは成果の責任を負わず、功績だけ主張しやすい構造
- 現場で実装可能な設計を考えるエンジニアこそが真の設計者
まとめ・提言
- 大規模既存コードベースでは、設計議論は具体的・現場的な内容が中心
- 現場貢献者でないと有用な設計は困難
- 抽象的なアーキテクト職は、価値提供が限定的
- 設計者は実装責任も負うべきという主張
- 現場で苦労する設計者が正当に評価されるべき
ソフトウェア設計の純粋系・非純粋系について
- 純粋系ソフトウェア工学:単一目的ライブラリや宇宙探査機向けソフトなど、妥協なく設計できる領域
- 非純粋系ソフトウェア工学:ビジネス要件に応じて妥協や変更が頻繁な領域
- 両者の違いを理解しないと、設計議論で誤解や衝突が生じやすい
- AI開発や大企業外部人材の適応失敗もこの違いが一因
参考
- 記事内容のさらなる詳細や関連投稿は、原文や著者のブログ参照