A Philosophy of Software Design ch3 Working Code Isn't Enough (Strategic vs. Tactical Programming)
Working Code Isn't Enough (Strategic vs. Tactical Programming)
- tactical
- 可能な限りすばやく、動くものを作る
- strategic
- きれいな設計のために時間を投資
- 後者のほうが長い目で見ればコストが安く済むよ、という話
Tactical programming
- 「動けばよかろう」で、可能な限りすばやく作り上げる姿勢
- 機能追加
- 不具合修正
- 犠牲をともなう
- 複雑性を持ち込んでしまう
- その場しのぎの解決策
- 目先のことしか見えておらず、将来のことが二の次
- この取り組み方では、良い設計を生むのはほぼ不可能
- 複雑性は蓄積する(再掲)
- 1つ1つの妥協は理にかなって見える
- しかし、開発者全員の全変更分が蓄積すると、システムは急速に複雑化する
- 悪循環を抜け出せなくなる
- tactical tornado
- どんな組織にも一人くらいいる、tactical極振りな人
- 実装の速さは他の追随を許さない
- 管理者は彼らをヒーロー扱いしがち
- 彼らが汚した跡は、他の技術者 -- 本当のヒーローが掃除することになる
Strategic programming
- よいソフトウェア設計者になりたくば「動くだけでは不十分」
- タスクを早く終えるために不要な複雑性を持ち込むのはNG
- 長い目で見よ
- ほとんどのコードは「既存のコードベースの拡張」
- ゆえに将来の拡張を容易にするのが最重要
- コードは「動く」必要があるが、それを最優先目標には据えない
- 「戦略的プログラミング」のためには投資的な考え方が必要
- あとで効いてくる
- 先を見越した投資の例
- クラスの作成
- 最初に思いついた案ではなく、別の設計をいくつか比較検討し、最もきれいなものを採用する
- ドキュメンテーション
- 将来の変更を助ける内容を書く
- クラスの作成
- 後から行う投資
- どれだけ先行投資しても、設計の選択をしくじることはある
- 設計の問題点を見つけたら
- 無視したりツギハギで直したりしない
- たえず少しずつ設計を向上させる
- cf. 「戦略的」ではたえず複雑性を導入し続けてしまう
How much to invest?
- どれだけ投資する?
- システム全体を予め設計する?
- それウォーターフォールやんけ!
- ソフトウェア設計ではうまくいかない(ch1)
- 触っている内に適切な設計が湧いてくるもの
- 小さな投資をたえずたくさん行うのが最良
- 全開発工数の10-20%くらいがちょうどよい
- はっきりとスケジュールに影響が出るほどではなく
- はっきりと利益を享受できるくらい
- 数カ月以内に効果が出る
- 最初はtacticalよりも10-20%時間を食う
- 開発速度が10-20%速くなるまでそう時間はかからない
- もとを取れる
- 逆もまたしかり
- 戦術的姿勢でつくられたまずい設計のコードベースは、生産性を20%は下げる
Startups and investment
- 反・戦略的立場の言い分
- スタートアップではすばやいリリースが重要
- 稼いだら掃除のために追加人員を雇う
- 戦術的姿勢をとってもコストは下がらない
- ひとたびスパゲッティになったコードベースはほぼ修復不能
- 設計の質の良し悪しの影響はすぐ出る
- コードベースがひとたびめちゃくちゃになると、悪い噂がたち、平凡な技術者しか雇えなくなる
- 技術者の質は最重要事項のひとつ
- コストを下げるためには良い設計者を雇え
- 平凡な技術者と比べて、コストは大差ないわりに、生産性が途方もなく高い
- 最も優れた技術者は、設計について深い思慮をもつ
- Facebook
- 戦術的姿勢で積み上げてしまった負債を掃除した例
- 前: Move fast and break things
- 後: Move fast with solid infrastructure
- Google, VMWare
- もともと戦略的姿勢だった例
- シリコンバレーで名を轟かせ、技術的トップ層の雇用において他の追随を許さなくなった
- 設計に気を配っていて、きれいなコードベースな現場で仕事するほうが楽しいよ
Conclusion
- よい設計はタダでは手に入らない
- たえず投資が必要
- 小さな問題が蓄積して大きな問題にならないよう
- 幸い、思ったよりもすぐに元を取れる
- たえず投資が必要
- 戦略的な姿勢を一貫せよ
- 明日ではなく今日投資せよ
- 危機的状況では、掃除を後回しにして乗り切りたい誘惑にかられる
- が、今回を乗り切ったところでどうせ別の危機的状況が来る
- ひとたび設計の向上を先延ばしにすれば、永久にやらなくなる
- これすなわち戦術的な姿勢
- 設計の問題は、取り組むのが遅れるほど肥大化する
- なおさら手を付けられなくなり、先延ばしされる
- 開発者全員がたえず小さな投資をし続けるのが最良
英語
- kludge
- その場しのぎの解決策
- crunch
- 危機的状況
- intimidating
- 手強い
- facilitate
- 容易にする
- proactive
- 先を見越した
- reactive
- 後手後手の
- latitude
- (不可算)自由