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