たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

YAGNIと設計とバランス

目的と良い設計と抽象化/汎化と複雑性

オーバーエンジニアリング 欲しくないもの: 非効率な資源の利用

ある実装をする際

  • シンプルに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. 個別最適化