だんだん開発スピードが遅くなっていくのをどうやってとめたら良かったんだろう?

先日、モブプロをやってきた。その中で、モブプロとは別で、いくつか感じたことがあって、今日はその中のひとつを思い浮かんだままにメモ。

bufferings.hatenablog.com

要件を満たすプロダクトをより早く出す

モブプロでTDDしながら、要件を満たすプロダクトをより早く出すことに集中してみた。例えば、第2ラウンドのお題はTDDBCなどでお馴染みの「自販機」。

「100円を入れてボタンを押すとコーラが1本買えること」

最初に「100円を入れてボタンを押すとコーラが1本買えること」と言われ。

assertThat(get(100), is("コーラ"));

みたいなテストを書いて。

String get(int money) {
  return "コーラ";
}

みたいな実装を書いた。爆速!

「200円を入れてボタンを押すとオレンジジュースが1本買えること」

次に「200円を入れてボタンを押すとオレンジジュースが1本買えること」と言われ。

assertThat(get(200), is("オレンジジュース"));

実装はこうなった。

String get(int money) {
  if(money == 200) {
    return "オレンジジュース";
  }
  return "コーラ";
}

その後

その後は

  • 200円でコーラが2本買えること→( ゚д゚)ハッ!「getOrangeJuice()とgetCoke()に分ける?」
  • コーラの在庫を追加することができること→( ゚д゚)ハッ!「・・・ざ、いこ・・・?」
  • 900円入れてコーラを2本とオレンジジュースを2本とビールを1本買って100円お釣りが出てくること→( ゚д゚)ハッ!「ボタンが必要・・・?てか、お、お釣り?」

とかなりながら、だんだん遅くなりながらも、要件を全て満たすだけのコードを書き続けた。

その結果として出来上がったもの

は、要件は満たすけど、色んなif文に溢れ、在庫を減らす処理はいくつかの場所に散らばって(たしかビールの在庫は減らなかったと思うw)、「あぁ・・・」という感じのものだった。

プロダクトオーナーのセリフ

僕らが「え?在庫なんてあるんですか?」というと、POは「ふつー自販機ならあるやろー」って言ってた。まぁ、自販機ならそりゃそうよなー、と思いつつ。でも普通のプロジェクトで「そんなの普通あたりまえでしょ?」とか言っちゃうPOだとたぶん開発うまくいかないだろうなーとか思いながら聞いてた。

それと、POはしきりに「聞いてくれていいよ」と言ってはくれてたけど、でも自分から「このプロダクトをチームと一緒に良くしたい!」という気持ちは見えなかったなぁw

チームのメンバーのセリフ

途中でメンバーの中では「色んな商品を取り扱えるように、Productクラスを作った方が良いのでは?」という意見が出てきた。その段階では、要望には、コーラとオレンジジュースしかなく、この後、本当に商品が増えていくのかどうかも分からなかった。

とか色んなこと

をバーっと1時間の中で経験して、みんなと「もうちょっと設計をちゃんとやった方が良かったかもしれないね」みたいな話もした。

帰り道

で、ぼーっと考えながら。「これって、うまくいかないプロジェクトの縮図っぽいなぁ」と思った。

  1. 僕らは、「自販機」というものが何をできるものなのかを知らない状態で開発を始めて、要望を満たすものを急いで作る。
  2. 次の要望くらいまでは大丈夫なんだけど、だんだん開発スピードが遅くなってくる。
  3. 動いている部分には極力触るなの精神で、if文で分岐を追加して新機能対応をする。
  4. その結果、例えば「在庫を減らす」という処理が散らばってしまい、バグを埋め込んでしまう。
  5. 本来、少しの変更で対応できそうなことが、その複雑さのためにすごく時間がかかるようになってしまう。

んで、おまけで、

  1. 最初の開発をやってた人がマネージャとかになる
  2. 「僕がやってたころは、もっと開発スピード速かったんだけどな」とか言ってる。
  3. その人しか知らない仕様やif文があって、結局全てその人に聞かないといけない状態になってる。

みたいなね。

じゃあどうすれば良かったのか?

  1. そういう経験をしてきた僕は「ちゃんと設計をしたらマシだったはずだ!」と、しっかり設計をしようとする。
  2. 「自販機」というものを誰も知らない状況で「これはジュースだけでなく、どんな商品でも購入できるように、汎用的に作らなければならない!」とか考え出しちゃう。
  3. これも必要かもしれない、これも今入れておかないといけない、とかでどんどん仕様が膨らんでいく
  4. だいぶ時間をかけてできあがったけど、ほとんどの機能が使われない
  5. 新機能を追加するのに、使われていない機能のテストもしないといけなくて、スピードがあがらない

あれ?(´・ω・`)

じゃあどうすれば良かったのか?

そのあいだなのかなー?

目の前のことに追われすぎない、かつ、分からない先のことを想像で考え過ぎない。

だから、何かに気づいたときに、それを元に全体をリファクタリングする。できるようにしておく。というのが大切なのかなって思った。

「在庫」という概念を発見したら「在庫をどうもたせるべきか」というのを考えてリファクタリング

たぶんそういう発見はブレイクスルー的なリファクタリングになるから、ため息をつきながら、プレッシャーでドキドキしながら、やる。

そのためには、スキルと勇気と変更容易性が必要。

というところなのかなー。

それと「自販機」というものを知って、早く小さくブレイクスルーを起こすために、POはもっと中から発言をすると良さそうかなー。

ということで

誰も知らない新しいものを作るときは「全員の知識を持ち寄って、変化(発見)に対応し続ける」というのができたら良いのかなーって思った。

おわり。