Magnolia Tech

いつもコードのことばかり考えている人のために。

「テスト駆動開発」を読んで2018年における開発手法へのスタンスへ思いを馳せる

半年前に購入した「テスト駆動開発」を読み直した話

テスト駆動開発

テスト駆動開発

昨年、新訳版が出版された直後に購入し、Scalaで写経し始めたけど、結局「JavaのコードをどうやってScalaに落とし込むか?」ということばかりを考えてしまい、度々本書で触れられている「歩幅の調整」「仮実装」「明白な実装」「三角測量」等の概念をきちんと理解しないままただコードを書いている状態状態になってしまった。また、その後に「Javaでそのまま写経すればどうか」と思ったけれど、今度はいつの間にか、ただ写経だけに専念している自分に気がつき途中で止めてしまった。

この手の概念を理解するための技術書は、流し読みして分かったつもりになってしまうのが一番怖いので、コードを考えながら書く、都度読書メモを書くなど、自分自身の中に「引っかかりポイント」を作っておかないと、せっかく時間をかけて読み終わってもキーワードしか頭に残らず、「キーワード言いたいだけオジサン」が爆誕してしまうので、「手を動かすこと」「考えること」「結果をアウトプットすること」の3つに気をつけながら読み進めることにした。

と言うわけで、今回は3度目の正直の読書記録…本書は全部で320ページと技術書としては決して分量が多い訳では無いですが、プログラミング自体の入門書やリファレンスではなく、コード例を元に概念を学ぶことが目的の本なので、全ページを同じ密度で読み進めるのはなかなか大変です。

なぜ2018年に「テスト駆動開発」を読むべきか?

原著者のKent Beckによる「Test Driven Development: By Example」が出版されたのが2002年、日本で「テスト駆動開発入門」というタイトルで和訳が出版されたのが2003年と、既に出版から15年が経過しています。以降、原著自体は改版されていませんが、一旦日本語版が2013年に絶版になった後、昨年和田卓人さんによる新訳「テスト駆動開発」が出版されました。新訳にあたっては全編JUnit5とPython3に対応するようにコードが書き直されているほか、後述する訳者による「付録C」が追加されている、という変化点は有るものの、本質的には2002年にリリースされたオリジナルの内容から変わっているわけではありません。

この変化の激しいプログラミングの世界で、2002年に出版された本を2018年に読む意味が有るか?というと、それは確実に有るな、と改めて全ページ読み直して思いました。テスト駆動開発までいかなくてもテストコードを書くことは充分に当たり前になってきましたし、プログラミング言語やライブラリの進化、gitやビルドツール、CIツール等の開発をサポートするツールチェーンの進化、アジャイル開発手法の普及など取り巻く環境が大きく変化しました。

更にはそれらが普及することで、「1つの言語や、開発手法、ツールを導入すれば課題が全て解決する」なんていう都合の良い"銀の弾丸"は無いことをみんなが理解してきたことも大きいのではないかと思っています。

現代のソフトウェア開発は複雑化していて、目の前の課題に対して色々な手法やツールを目的と状況に合わせて組み合わせるしかなく、絶対解唯一解は無いと分かっている状況の中、1つの選択肢として"テスト駆動開発"を理解することは非常に重要で、その意味でもこの本は全然古くなっていないと言えるでしょう。

「付録C 訳者解説:テスト駆動開発の現在」

新訳された「テスト駆動開発」をどこから読めばいいかと言われれば、まずは訳者の和田卓人さんによる「付録C 訳者解説:テスト駆動開発の現在」から読み進めた方が良いでしょう。"テスト駆動開発"という手法を取り巻く歴史、特にRuby on Railsの作者であるDHH(David Heinemeier Hansson)の「TDD is dead. Long live testing.」というブログエントリを出発点として始まった議論について詳細に書かれていて、2017年時点での"テスト駆動開発"の置かれた状況、向き合い方がよく理解できる内容になっています。

「付録C」の最後にこう書かれています。

優れたプログラミングテクニックパラダイムは「使いすぎてみて」少し戻ってくるくらいが良い塩梅です。

「過ぎたるは猶及ばざるが如し」と言いますが、それでも一度ハマってみて一歩引いて俯瞰する姿勢が正しい技術に対するスタンスなのかもしれません。この辺りのスタンスを念頭に置いておく意味でもまずは付録Cを読むことをお勧めします。

一方で、15年前の、出版当時の環境を追体験するために、いきなり冒頭から読み進め、ガツっとハマって、”テスト駆動開発最高!これで全部解決!ロックだ!"みたいな所に思考を一旦持って行って、最後に付録Cでクールダウンするのも良いですね、情熱重要です :)

おわりに

テスト駆動開発」訳者の和田さんに「いいね」押してもらえたこのツイートが自分なりの「テスト駆動開発」に対する感想・解釈の全てかも(誤字があるけど)。

あと、TDDに特化していなくても、テスティングフレームワークにはさまざまソフトウェア開発の知見が詰まっているので、それはそれで色んなテスティングフレームワークのソースを見るのは良い習慣だと思っている。TDDではないけど、PerlTest::Moreと、Test::Harnessソースコードを延々と読むことでPerlについての深い理解を得られたと思っている。

テスト駆動開発」の第Ⅱ部は本当にさらっとだけxUnit系テスティングフレームワークの構造の触りだけを紹介しているだけなので、あれを出発点に実際の色々なソースを読むと更に深い学びが有るので、お勧めです。