目的と良い設計と抽象化/汎化と複雑性
オーバーエンジニアリング 欲しくないもの: 非効率な資源の利用
ある実装をする際
- シンプルに1時間で実装
- 実装のメンテコストは中
- 実装の拡張コストは大
- 抽象化しつつ1時間で実装
- 実装のメンテコストは中
- 実装の拡張コストは小
の2択があるとする。 抽象化したコードを書くことを「オーバーエンジニアリング」って呼ぶか? -> 「良いコード書いたね」としか言わない。
すなわち、オーバーエンジニアリングは profit/resource の話.
(featureの勝手な追加は考えない) オーバーエンジニアリング c.f. アンダーエンジニアリング resource = implementation + maintainance + expansion
作りこみすぎ
Service implementation
profit by Service cost for Service
implementation => Service (working codes)
total value = profit/(costimpl + E(costmaint) + E(costex))
E(costmaint) = E(cost) * E(period) E(costex) = E(cost) * E(ex)
implもmaintも上げる => ダメ 爆速クソコード => メンテコストが異常になってダメ
オーバーエンジニアリングはw2の過大見積もり? アンダーエンジニアリングはcostmaintが大きすぎるコード
本当は将来が分布になっている.
"You are gonna need it" = E(ex)を過剰見積もりしがちなのでE(costex)を上げるエンジニアリングをするな
c.f. 個別最適化