概要
- ソフトウェア設計 は実践を通じて学ぶもの
- 組織構造とインセンティブ が設計やコード品質に大きく影響
- 科学コードと産業コード の違いは知識よりも動機や制約の違い
- 具体的な設計例 としてrust-analyzerの経験を紹介
- 推奨リソース や学び方のアドバイスも記載
研究者物理学者がソフトウェア設計を学ぶには
- ソフトウェア設計 は「実際に手を動かす」ことで身につけるもの
- 大学の「設計」科目やプロジェクトは、現実の課題解決とは異なる経験
- 本当の学びは、実務やリーダー的立場での失敗と成功から得るもの
- ソフトウェア工学 は好奇心があれば独学でも習得可能
- ブログ記事や実践から原理を学ぶことも十分可能
組織構造とインセンティブの重要性
- Conway’s Law :「ソフトウェアの構造は組織の社会構造を反映する」原則
- コードよりもアーキテクチャ、アーキテクチャよりも社会的要因が重要
- 産業用と科学用ソフトウェア の違いは「知識」より「インセンティブ構造」
- 例:「3ヶ月で論文を出す必要がある」などの外的要因
- インセンティブ構造 を設計できるタイミングは稀だが、非常に重要な機会
- TIGER_STYLEの本質もこの社会的文脈に依存
制約下での最適化と適応
- 理想的なインセンティブ構造 はほぼ存在しない
- 変えられない場合は「受け入れて適応」する能力が重要
- 産業プロジェクト でも常に「制約下で最良を目指す」姿勢が求められる
rust-analyzerの設計経験
- プロジェクトの物理的現実 :「深さ」と「広さ」を兼ね備えた設計
- 深い部分(コンパイラ)は少数の熟練者向け
- 幅広い機能(IDE特有)は多くの短期貢献者向け
- 貢献しやすさの工夫
- rust-analyzerはrustc不要・C依存なし・テスト高速化で敷居を下げる
- 各機能は独立性を高め、catch_unwindで障害を局所化
- コア部分は品質管理を厳格化、機能部分は「動作すればOK」で柔軟に対応
- 設計の意図と現実
- LSPのアーキテクチャ改善が目的だったが、最終的にコンパイラが一つ増えた結果に
- uutilsも同様に、学習用から本格的なシステムへと変化
学び方とおすすめリソース
- 唯一無二の良書 は存在しない、実践こそが本質
- Borgesの短編小説にしかないような「真理の書」は現実にはない
- 注目すべきリソース
- Gary Bernhardt「Boundaries」:オブジェクト設計とメタ思考
- 「How to Test」:実用的なテストの考え方
- Pieter Hintjens「∅MQ guide」およびConway’s Lawの解説
- Jamii「Reflections on a decade of coding」:メタ視点の経験談
- Ted Kaminski blog:ソフトウェア開発理論のまとまったノート
- 書籍では「Software Engineering at Google」「The Philosophy of Software Design」も推奨
- 特に前者は用語理解に役立つが、決定的なブレークスルーではない
まとめ
- ソフトウェア設計力 は「実践」「適応」「社会的文脈理解」で磨かれる
- 書籍や理論 よりも、現場での経験とフィードバックの蓄積が重要
- インセンティブ構造や組織文化 への理解が、設計や開発の質を左右