radioc@?

レディオキャットハテナ

【読書メモ】レガシーコードからの脱却

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

色々と噂を聞いて興味を持ったので、積ん読待ち行列を追い越して読みました。タイトルからご察しの通り、例えば次のような、「いまだにウォーターフォールで開発していて、10年前に流行った某フレームワークを使っていて、当然テストコードも無いです。このままでは良くないので変えたいんですが、何から変えていけば良いでしょうか?」的な課題に立ち向かう勇気をもらえる本だと思います。

レガシーコードから脱却する

一言で言ってしまうと「レガシーコードから脱却する」ということは、「テスト駆動開発できる状態を目指す」ことであると私は読み取りました。

レガシーコードから脱却するためのテスト駆動開発

テストファーストに徹することで、テストコードを仕様書として扱えるようになり、変更に柔軟なコードへリファクタリングできるようにしていくと、設計が最後に完成します。これらは常にCLEANなコードを意識し、これを維持することで実現できると筆者は述べています。9つのプラクティスのうち後半の半分がCLEANコードによるテスト駆動開発の話です。

CLEANコードとは

  • Cohesive(凝集性)
  • Loosely Coupled 疎結合
  • Encapsulated(カプセル化
  • Assertive(断定的)
  • Nonredundant(非冗長)

オープン・クローズドの原則

CLEANなコードを維持して前述のような開発が実現できれば、いよいよレガシーコードをリファクタリングし脱却に向けて動き出すことができるようになります。レガシーコードのリファクタリングはオープン・クローズドに行うべきだと述べています。オープン・クローズドの原則とは以下の意味です。

拡張に対して開かれているが変更に対して閉じられている

※参考

レガシーコードから脱却するためのアジャイル開発

レガシーコードに囲まれた状態で、いきなりCLEANコードを意識してテスト駆動開発しましょうと言っても実現は難しいと思われます。そのベースを作るのがアジャイル開発です。9つのプラクティスの前半の半分がアジャイル開発の話です。

アジャイルの実践

本書は2部構成になっており、9つのプラクティスの解説に入る前の第1部ではソフトウェア開発の業界が抱える課題や、そこからアジャイル開発が生まれた経緯、筆者が重要と考えることをアジャイル開発から出発して9つのプラクティスとしてまとめた経緯について、丁寧に述べられています。

  • 小さな単位でビルドすることの目的は可能な限り早くタスクを完成させることであり仕掛り中の作業を制限することである。
  • アジャイルはいかにスコープを箱に収めるかだ。作業対象の範囲をいかに限定するかだ。
  • ここで重要なのは、スコープや仕事の単位の観点で小さくしようと努めることであり、時間の単位ではない。

継続的インテグレーション

開発プロセスアジャイルに変えることは、体制を変えてイベントを導入するだけではないということは今さら説明不要だと思います。

いつ統合するかは、アジャイルスクラムの実施有無や、イテレーションスタンドアップミーティングなどとはほとんど関係ない。もし、2週間のイテレーションで開発していて、各チームがコードを自分たちのブランチに統合し、年末にすべてのブランチを統合しているんら、悪いニュースがある。あなたはウォーターフォール開発をしてしまっている!

人もコードもプロダクトも、小さな単位のイテレーティブな開発を手に入れることが、テスト駆動で開発をするための土台であるということだと思います。

9つのプラクティス

レガシーコードからの脱却のためにテスト駆動開発を取り入れる。テスト駆動開発を取り入れるために、まずアジャイル開発を取り入れる。その流れに沿って必要なことを分解し整理したのが9つのプラクティスです(あくまで私の理解ですが)。

  1. やり方より先に目的、理由、誰のためかを伝える
  2. 小さなバッチで作る
  3. 継続的に統合する
  4. 協力しあう
  5. 「CLEAN」コードを作る
  6. まずテストを書く
  7. テストでふるまいを明示する
  8. 設計は最後に行う
  9. レガシーコードをリファクタリングする

書籍の冒頭の「はじめに」で筆者は次のように述べている。

成功するチームと失敗するチームの差は、プラクティスがなぜ重要なのかを理解していたかどうかだ

テスト駆動開発でのテストコードの作り方やアジャイル開発でのユーザーストーリの作り方などの具体的なやり方なども解説されていますが、大事なのは具体的な手法をなぞることではなく、プラクティスの本質を理解することにあります。一度読んで満足するものではなく何かあった時に読み直し、書かれている概念的な要素を反芻して腹落ちさせることで理解を深めていく書籍であると思いました。手元に置いて繰り返し読むことにします。

参考

翻訳した吉羽さんのスライドです。読後に改めて読むとまた理解が深まります。

slide.meguro.ryuzee.com