天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

実践テスト駆動開発を読んだ

最近読んだ中で特に良かった、「実践テスト駆動開発」についてまとめます。

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

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

 

 

本を読んだきっかけ

アジャイル開発と出会ってすぐに、インクリメンタルな開発というキーワードが入ってきました。
しかし、どんなに短くても1ヶ月の単位でこれまで開発してきた自分にとって、インクリメンタルな開発が何かイメージが掴めずにいました。
そんな中TDDに出会い、t_wadaさんのライブコーディングやテスト駆動開発の本を読み、少しずつインクリメンタルな開発のイメージが掴めてきた手応えがあったので、もう少し学びを深めたく、本書を手に取りました。

 

この本を読んだお陰で現場で実感できた成長

今まで問題意識を持たずに実装していたコードに対して問題意識を持てるようになった

幾つかあるのですが、この本を読んだ前後で特に見方が変わったのは"列車事故コード"です。
同じソースコードに数年触れていた自分は、クラスの内部構造がある程度頭に入っていました。
そのため、デメテルの法則に違反した"列車事故コード"に対して問題意識を持たず、平然と1行あたり4つや5つのドットがあるコードを生み出していました。
しかし本を読んだ後は、1行あたり複数ドットがあるコードを書くのに物凄い抵抗が生まれ、クラスの内部構造に疑問を持ったり、ラッパーメソッドを切り出したりたくなりました。*1
その他、乱立している「XXXImpl」クラスにも問題意識が持てるようになり、インターフェイスの切り方や概念を見直しするようになりました。

オブジェクト指向設計の理解度向上*2

日本語版の本のタイトルとは離れていますが、オブジェクト指向設計に対する理解が確実に上がり、オブジェクト指向で設計や実装を行えるようになりました。*3
具体的に言うと、オブジェクト同士の関係性を考える時に3タイプのオブジェクトピア(依存/通知/調整)の話が役に立ったり、オブジェクト構造の探求をする際にロール/責務/コラボレーターの観点に基づいた整理(CRCカード)が役に立ちました。

テストコードを通して既存の実装や自分の実装に対する問題点に気が付けるようになった

本書を読んで"テストの声"に気が付けるようになったことで、テストコードを作る過程で、実装したコードや既存コードの問題点に気が付けるようになりました。

 

この本を通して学べた知識

まだ知識としか持っていないものの、いつか現場で役立つだろうと思われるものを幾つか抜粋して記載します。

  • テストピラミッド

  • 早い段階で重大なアーキテクチャーの誤りに気が付くための工夫(=動くスケルト)

  • テストコードから読み取る不吉な匂い

  • インターフェイスの発見とスコープ削減(プッシュではなくプルしてインターフェイスを作る)

  • テストの可読性を上げるコツ

  • 柔軟でメンテナンスコストが低いテストコードを作るコツ

 

感想

本書で度々提言される、「どのようにやるかではなく何をやるか(なぜやるか)がシステム開発に大事なんだ」という言葉通り、沢山のテクニックや考え方が「なぜそういうテクニックが必要なのか(なぜそういう考え方が必要なのか)」「テクニックや思考を通して何を実現したいのか」という部分に焦点を置いて説明されており、非常に腹落ちしやすい解説でした。
また、第9章~第19章では実戦形式でテスト駆動開発を解説しており、身につけた知識を、手を動かしながら確認できるのも良かったです。
個人的には、第9章~第19章以外を先に読んで一通りの知識を獲得した上で、第9章~第19章で手を動かしながら自分の理解を確認すると、効率的に知識が身に着けられると思うのでお勧めです。

*1:ThoughtWorks アンソロジーにある"1行につきドットは1つまでにする"のルールにも、ドットが多いコードの問題点について言及されています

*2:とはいえまだ第一歩を踏み出しただけで、まだまだ学ぶべきことは多いです。。

*3:英語版タイトルはGOOS = "Growing Object-Oriented Software, Guided By Testsなので、ちゃんとオブジェクト指向をテストで育てる旨が強調されています