2017年の私とYAGNI

2017年は YAGNI でした。

古い話でいえば Ron Jeffries さんのこれになるわけです。

ronjeffries.com

ここには、

  • 考えがずれちゃってるよ、クラスがどうなるべきじゃなくて、どうなりそうか考えるなんて。集中しろよ
  • コードをいじくりまわしてないで、実際の問題を解決して前に進んでる感覚高めていこうぜ
  • 結局いらないかもよ。いらないとしたら書いた時間、読んだ人の時間、保存してた場所、全部無駄になるぜ

などと書いてあります。

これはこれでエモーショナルないい話なのですが、個人的には大好き Martin Fowler さんが書いた

martinfowler.com

こっちのが好きです。こっちには、要求ではなくて推測で作られたコードのもたらすコストってのが書かれていて

  • Cost of Building (作っても誰も使わないメソッドやクラスと、そのテストと、ドキュメントなんかに使うコスト)
  • Cost of Delay (推測で作ったもののために他が遅れた分のコスト)
  • Cost of Repair (半年後に必要になった時、すでに負債となってしまったコードを修正するコスト)
  • Cost of Carry (結局使われたかもしれないが、それまでの期間使われないコードのために増していた複雑性)

なんてふうにまとめられていて、これらが「推測が外れていた」「推測は当たっていたが、間違った実装をした」「推測は当たっていて、正しい実装をした」という状況ごとに適用されます。推測も実装方法も正しかったとしてもコストはあるよ、というのが一番のポイントです。

しかし、なんでもかんでもめんどくさがってヤグニャればいいかということそんなことはなくて

Yagni only applies to capabilities built into the software to support a presumptive feature, it does not apply to effort to make the software easier to modify.
YAGNI は、推測された特徴のために作られるソフトウェアの能力に対して適用されるものであり、ソフトェアを変更しやすくする努力については適用されない。

と注意も書いてあります。変更可能性を高めておけば、というか高めておくことで「予め用意しておかなかったコスト」を小さくでき、天秤を効率的な方に傾けることができてビジネス的に正当化されます。わかりやすい。ここまでは復習です。

組織のYAGNI

僕これほんと思ったんですけど、これってチームにも適用されますよね。

僕の尊敬する人事の人が「新しい人は『いい人を見つけたから何かやってほしい』とか『他所と比べて少ない気がするから採っておきたい』ではなくて、帰宅途中にふと『これ以上は工夫のしようがない。もう無理だ』って思ったくらいから探し始めればいいよ」って言ってて、なんだか納得感があって、まあ極端ですけど、これ YAGNI ですね。

つまり、実際の要件ではなく推測した要件にもとづいて採用したメンバーというのは、 Martin Fowler が言う4つのコストをチームに対して持ってしまうわけです。

  • Cost of Building (採用活動にかけたコスト)
  • Cost of Delay (採用活動で遅れた制作のコスト)
  • Cost of Repair (まだ仕事がないのに、半年後に仕事があるからといって採用した人が半年間暇してる間にアル中になってしまったので矯正病院に入れたり、解雇したら裁判沙汰になったときのコスト)
  • Cost of Carry (本当に必要になるまでのお給料、人が増えたことによる意見のばらつき、会議室が取りづらくなるとか、WIP・仕掛りが増えてチームが集中できなくなるとか)

うーん、これは渋い。

ちなみに、チームを修正・変更しやすくする努力は最初からずっとやっていていいということです。コードだと主に自動テスト、継続的デリバリーです。つまり人だと…あんまり考えたくないです。

つまり、変更可能性を担保するためにはコードよりもっとずっとリスク回避志向にならないと駄目だよということですが、リスク志向ではなく、リスク回避志向になった結果、上記のコストが目に入りにくくなってとりあえず採用しておこう、みたいな意思決定をしてしまったりするのですから、リスクやらコストの見積もりってつくづく難しいなあって思います。

見送るにせよ見逃すにせよ、失った(と思い込んだ)ことによるコストと、手にしたものが手にした後に生むコストとリターン、そして推測した要件は必ずずれるということを正しく天秤にかけられる人・場面はそうそうなさそうです。もはやよく寝る、とか幸せでいる、とかが大事なんじゃないかなあ。