A Philosophy of Software Design ch3 Working Code Isn't Enough (Strategic vs. Tactical Programming)

APoSDソフトウェア設計勉強メモ

出典: 


Working Code Isn’t Enough (Strategic vs. Tactical Programming)

  • tactical

    • 可能な限りすばやく、動くものを作る
  • strategic

    • きれいな設計のために時間を投資
  • 後者のほうが長い目で見ればコストが安く済むよ、という話

Tactical programming

  • 「動けばよかろう」で、可能な限りすばやく作り上げる姿勢

    • 機能追加
    • 不具合修正
  • 犠牲をともなう

    • 複雑性を持ち込んでしまう
    • その場しのぎの解決策
  • 目先のことしか見えておらず、将来のことが二の次
  • この取り組み方では、良い設計を生むのはほぼ不可能
  • 複雑性は蓄積する(再掲)

    • 1つ1つの妥協は理にかなって見える
    • しかし、開発者全員の全変更分が蓄積すると、システムは急速に複雑化する
  • 悪循環を抜け出せなくなる

    • 複雑性の問題が顕在化し、後悔しはじめる
    • が、改善はしない

      • リファクタリングは長い目で見れば助けになろう
      • が、目先のタスクの完了が遅くなってしまうので、やらない
    • 結局つぎはぎだらけになり、さらに複雑化する
    • ついには掃除に数カ月もかかるようになり、スケジュール上、手を付けられなくなる

      • 問題を2,3解消したところで焼け石に水なので、突き進むしかない
    • 【所管】前職のコードを思い出す
  • 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

    • (不可算)自由