こちらの成り上がりたくて必死に読んだ感謝の技術書6冊という記事を読んで、そういえば僕も15年前に初めてアジャイル開発を始めた時、いくつかお世話になった本があったなと懐かしく思い出したので書いてみます。アジャイル開発が当たり前になった今のエンジニアの皆さんからすると古典に分類されるかもしれませんが、僕の目にかかっていた鱗を何十枚も剥がしてくれた名著たちでした。
エクストリーム・プログラミング(ケント・ベック)
一番最初に読んだアジャイル開発の本です。根底に流れる「変化ヲ受容セヨ」というメッセージに、突然目の前が開けたような気がしたことを覚えています。いくつものプラクティスがありますが、僕が特に重視していたのは反復すること、テストを書くこと、リファクタリングすることの3つでした。これは15年経ったいまも変わっていません。今でも、テストコードを書くことに対して工数が増えるという勘違いからテストを開発プロセスの中に組み込まないチームがあります。しかしそういったチームは、「手動でデバッグする工数とどれだけ違うんですか?それ何回繰り返せます?」という問いかけに答えられません。ここにあるプラクティスを試しに実践してみれば分かるはずなのに。小さく始めたプロジェクトを、テストとリファクタリングを繰り返し、品質を確保したまま徐々に大きく広げていく。これは経営層がみんな大好きPDCAなんだけど、その辺りがまだまだ現場から遠いところにいる人には理解されてない気がします。
リファクタリング(マーチン・ファウラー)
リファクタリングは、コードにきな臭さを感じたら実施するという説明を初めて読んだとき、何を言っているのかさっぱり分かりませんでした。しかし、テストを書いて実行しグリーンランプをキープし続けながらコードの中身を洗練していくことを繰り返していると、徐々に分かってきます。気持ち悪いというかムズムズするというか、リファクタリングの神が舞い降りてくる瞬間が。この本にはいくつものリファクタリングの手順が記載されていますが、それらは全てテストコードが書かれていて、コードを洗練してもクラスの振る舞いが変わらないことが保証できる前提です。リファクタリングのタイミングが神学論争にならないようにしたければ、CheckStyle、PMD、Findbugsなどの静的/動的解析ツール、ClovaやOpenCoverなどのカバレッジ計測ツールの結果を参考にするのも良いと思います。匂いを数字で知ることができるかもしれません。
Java言語で学ぶデザインパターン入門(結城浩)
Javaで自前のXMLソケット通信サーバーを作るときに、TomcatやStrutsのソースコードを読み解きながらどうすればいいのか悩みながら、常に手元におき何周も読んでボロボロにした本。15年経った今でも手元に置いて時折読み返しています。この中で特に好んで使うパターンは、Factory、Command、Facadeかな。あと Chain of responsibility は検証ロジックを動的に構成したいときに1度だけ使いました。マルチスレッド編にあるTwo phase terminateはみなしごスレッドを作らないためには必須のパターンだと思いますし、Futureパターンはasync/awaitを理解するのにとても役立つと思います。一度だけ、自分でこのパターンを実装したことがありますが、僕自身はFire and Forgetの方が楽で好きです😁
実践UML―パターンによる統一プロセスガイド(クレイグ・ラーマン)
ものすごく分厚く重い本ですが、通勤電車の中で1ヶ月間に3周くらい読み返しました。要求というあやふやなものをどのようにしてUMLのダイアグラムで設計として表現し、実際に動くコードに落とし込んでいくかという手順が明確かつ詳細に記述されています。当時僕は、IBM RationalのUPとXPとの間で揺れている時期だったのですが、この本を精読したあとXPを選択し後にSCRUMへと移っていきます。XPを選択はしましたが、この本のおかげでデザインパターンの選択と適用、フレームワークの重要性、データの永続性などを理解し、それらをアーキテクチャとしてコードに落とし込めるようになったことは大きな転換点になりました。このときに作り上げたソケット通信サーバーフレームワークのアーキテクチャは、JavaからC#に言語が変わった今も生き続けています。
2003年頃の開発環境を参考までに載せておきます。AntとMavenで継続的インテグレーションを行っていたのも今となっては良い思い出です。
Java:Java2 SDK 1.4.2
IDE: Eclipse
バージョン管理:CVS
ビルドツール:Maven、Ant
情報共有:MoinMoin (Wiki)
課題管理:Scarab
プロジェクト管理:XPlanner
ドキュメント:JavaDoc + aurigadoclet (JavaDoc to PDF)