「リファクタリング」の完全読破。その2
ソフトウェアシステムはほぼ間違いなく、汚く滅茶苦茶になってしまうことに気づいたからです。 最初はプログラマの心のなかでけがれのない水晶のように輝いていた設計が、時間が経つことで劣化し、悪くなった肉のように腐敗していきます。 1年前に構築した、こぢんまりした出来の良いシステムが、翌年には関数や変数が絡まり合ったひどい泥沼に変わります。 いったい何が起きているのでしょう。 「レガシーコード改善ガイド」まえがき
大きなシステムに携わったことがあるなら、痛いほど気持ちがわかると思う。
私はこの問題を、プログラマのレベルが低いプロジェクトにのみ起こる現象だと思っていたが、どうやらそうではないらしい。
そんな簡単な問題では無かった。
第2章 リファクタリングの原則
ここではリファクタリングの定義にはじまり、行う理由、いつ行うべきか、などが示される。
中でも、私はこの文が気に入っている。これは冒頭の問題への回答でもある。
(P55) リファクタリングなしでは、プログラムの設計は徐々に劣化していきます。 リファクタリングを定期的に行うことで、コードの状態をしっかりと保つことが出来ます。
つまり、システムが劣化していく、汚れていく、泥沼になる、というのは避けがたいことで、それを浄化するのがリファクタリングである。
汚れた泥沼というのはリファクタリングをしなかったシステムということだ。
リファクタリングの定義
ここで、リファクタリングの定義を引用する。
(P53,54) リファクタリング(名詞):外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること。 リファクタリングする(動詞):一連のリファクタリングを行って、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること
定義に続けて2点強調されている。
・ソフトウェアの外部的振る舞いを保つこと。
・ソフトウェアを理解しやすく、変更を容易にするために行うこと。
つまり、機能追加はリファクタリングでは無い。
リファクタリングをするときは「機能追加をしない」ことを意識するように書かれている。
いつリファクタリングをすべきか
明確な答えは無いが、いくつかのガイドラインがある。
・3回重複したコードを書いたとき/無駄なことをしていると思ったとき。2回なら我慢する。
・設計が原因で、機能追加が困難なとき。
・バグフィックスでコードが不明確なとき。
・コードレビューのとき。例えば二人一組レビューを行い、そこでリファクタリングを行う。
別の節で、Ward Cunnninghamは未着手のリファクタリングを借金に喩えている。
P66 借金に利子があるように、あまりに複雑化したコードは、維持と拡張のコストがかかります。 利子もある程度ならば払うことができますが、あまりに高くなると、自分の首を絞めることになってきます。 借入金は適切に保たねばなりません。ときどきリファクタリングを行って負担を軽減していくことが重要です。
管理者を説得するには
品質を気にする管理者は説得することができる、と方法が書かれているが、やはり面白いのは次の箇所だろう。
品質よりもスケジュールを気にするマネージャの場合はどうするか。これは引用しておきたい。
P61 いささか問題発言的なアドバイスをしておきましょう。彼らにはだまってリファクタリングするのです。 これはマネージャたちに対する反乱でしょうか。私はそうは思いません。 ソフトウェア開発者はプロとしての誇りを持っています。 (中略) スケジュールを気にするマネージャであれば、開発者が最も速い方法を選択するのを望むでしょう。 ただし、どのような手段で実施するかは、マネージャの知るところではありません。 最も速い方法はリファクタリングです。だからリファクタリングをするのです。
プロとしての誇りを持つソフトウェア開発者が、最も速い方法で開発する。そこには何の問題も無い。
まとめ
他にもいくつかの節があるが、読み通すことで思想が理解できる体験談・エッセイなので、要約のようなことは難しい。
それでも、最後に一つ紹介するならばこれ。
P57 ここで、Kent Beckが自らを語ったセリフを思い出しました。 「僕は、偉大なプログラマなんかじゃない。偉大な習慣を身につけたプログラマなんだ」。 リファクタリングによって、堅牢なコードがずっと効率よく書けるようになるでしょう。
ファウラー自身も、バグ探しは得意ではないと言っている。
ただし、リファクタリングできればコードに立ち向かえるようになると。
私もいろいろな場面で「自分は偉大なプログラマじゃないからこれができないんだ」とよく感じる。
しかし、それも偉大な習慣を身につけることで少しずつ変わっていくのかなと。
そして、偉大な習慣を身につける第一歩は、本書をマスターすることかなと理解して、進んでいる。