masayuki5160's diary

名古屋でエンジニアしてます。

TDDをはじめてみたら気づきが多くて驚いている

興味を持ったきっかけ

そもそものきっかけは転職活動時に受けたある企業からテストコードを書くことを採用試験時に要求されたことでした。 それまでテストコードをちゃんと書いたこともなかった僕は採用試験に向けてxUnit系のツールの使い方を覚えるのもあれだな、と思い、今から思えば非常に雑に書いたコードを提出しました。 もちろんその結果、採用は見送りw

その後、他の企業での採用が決まったわけですが、どうしてもその時のテストコードを書く試験が気になっていました。 なんでテストコードを採用試験で書かせたんだろう、ということですね。

それからなんやかんや自分で調べてTDDにたどり着き、というのが始めるまでの僕のきっかけでした。

興味を持ってから

それからやったことは例えば以下。

qiita.com

qiita.com

この辺は自分で本を読みながら試行錯誤していた時です。(今でもだいぶ試行錯誤してますがw) そしてそのあと、和田さんのセミナーに参加しました。

event.shoeisha.jp

自腹で名古屋から参加ということでちょっと海外行くくらいお金かかったんですが、このセミナーに参加してやっとTDDの入り口に立てた気がしたのはほんとです。 特によかったのは、

  • 和田さん、安井さんから直接話を聞ける
  • セミナーの大半を占める実習時間の中でわからない点は和田さん、安井さんからのアドバイスをすぐもらえる
  • 強制的にTDDする時間になる

というあたりでしょうか。 あまり頻繁にやっているセミナーではないのでほんとたまたま参加できてよかったです。

現場でTDD

セミナーを受けてから一番感じたのはTDDは座学でゴニョゴニョするよりは現場で実践を繰り返すのが一番良さそうだ、ということでした。 それは例えば以下資料でもいわれていて、自分の思ってることがそんなずれてなさそうだな〜という確認にもなった。

習うより慣れさせろ、と14ページあたりで記述があるがほんとそうだな、と思った。

そしてちょうどタイムリーに勤め先でTDDを始めることになった。(タイミング良すぎw) でも経験者もいないってことでたまたまセミナーを受けてきたての僕がまずはTDDの紹介をすることになった。 内容としては、

  • TDDの概念ざっくり10min
  • decodeでの和田さんのライブコーディングを一緒に見る 40min
  • セミナーで和田さん、安井さんから聞いてきた内容のシェア 10min

で1時間ほど。 時間をみてもらえるとわかるが、和田さんのライブコーディングを一緒に見る時間をだいぶ多くとった。 ここで僕がTDDを実演してもいいわけだけど、それよりは和田さんがやってる方が説得力あるからな〜というのと(このタイミングでは、何を言うかより誰が言うか、の方が大事だよな〜と感じた)、擬似的にTDDを一緒にやっている体感が得られそうだったから。

FizzBuzz問題のTDDライブコーディングは20分頃からで、その辺りから一緒に動画をみた。 僕が和田さん、安井さんのセミナーで2人がペアプロでTDDをしてくれる様子をみたときも自分の今までの考えがぶっ壊されるくらい衝撃を受けたわけだが、それが参加してくれている人にもおきているような様子があった。

その後は、実際に一部の開発でTDDをしてみたりTDDの練習問題をモブプロで言語別にチームを別れて取り組んでみたりしている。

TDDを通しての気づき

まだ始まったばかりだし、僕自身のTDDやテストコードを書いてきた経験値が少ないのもあってあれだが、例えばこんな気づきがある。

  • ある程度複雑な処理でもテストコードがあるから手戻り少なく開発を進められることがある
  • 途中でTDDじゃなくなってきそうな時もあるが、少なくともサイクルを意識してるのでリファクタリングをマメにする
  • TDDはいい手法だけどそこにとらわれすぎるのもよくない
  • オブジェクト指向についての理解がしっかりあるとよりTDDがいいサイクルでまわりそう
  • 自分がオブジェクト指向を理解仕切れてなさそうなことに気づいたw

と、タイトル倒れの気づきリストで書き出してみてビックリだがこのままにしとくw 個人的には最後の項目が大きくて、大学でもわけのわからないオブジェクト指向の講義を受けたしエンジニアとしてもいくらかコードを書いてきたのにまだ理解が曖昧だったんだ、という気づきはほんとによかった。

この気づきは実はほんとについ最近のもの。そこで以下本を読んだ。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座

アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座

アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座

  • 作者: 長瀬嘉秀,小林慎治,大崎瑶,まつもとゆきひろ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2017/06/29
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

後者の本にはTDDに関して記述があります。 この本でTDDについて本格的に学ぶのはオススメしませんがオブジェクト指向とTDDについてやさしめに話が進んでいくのでそこは素晴らしい本だと思っています。 前者の本はJavaの本で後者の本の元になった本のようで内容がそっくりですがRubyに慣れていない僕にとってはちょうどいい練習問題が参考になりました。

そんなこんなでオブジェクト指向という考えがTDDには欠かせないんだな、と気づき、改めて手元にあるこの本を読んだらなるほどでした。

実践テスト駆動開発 (Object Oriented SELECTION)

実践テスト駆動開発 (Object Oriented SELECTION)

まだ全部読みきれてないのであれですがサブタイトルにも、 テストに導かれてオブジェクト指向ソフトウェアを育てる 、とある。 色々納得がいき、自分に今足りないものに気づけました。

TDD練習問題

ちなみに和田さんと安井さんのセミナーでやった練習問題が公開されています(安井さんありがとうございますmm) 正月明けにもう一度自分で取り組んでみたのが下記です。

github.com

順番逆ですが問題はこれです。

gistc906216ab1fdf68a133ba0fbade1a395

お題3までしか解いてないですがはじめて解いた時とだいぶ内容が変わって自分で驚きました。

おわり

以上です。 今年は引き続きTDDに取り組みつつテストコードを書く経験値を増やしていこうと思います。