リファクタリングは手術?

以前、「リファクタリングは手術に似てる」という人に会って、そうだなあと納得したのだけれど、どうも違う気がしてきた。そもそも手術は、人体が損傷・劣化するという前提があり、その変化した分を元に戻すか代替するということだと思う。対して、ソフトウェアは決して劣化しないことが非常に重大な特徴であることは明らかで、この前提の違いは無視できないだろう。

また、手術は、「何が健全なのか」について明らかな指針がある。それは健康体であって、つまり究極的なTO-BEが明確にある。対して、ソフトウェアはそもそも劣化しないのだから、リファクタリングが目指すべき姿は究極的には存在しない(部分的な模範=パターンはある)。

かようによくよく考えれば、「リファクタリングは手術だ」というのは、「コードをいじる」という感覚以上には類似性が乏しいように思う。

 

じゃあリファクタリングとは何かというと、ふっと思いつくのは「鏡を磨く作業」に似ている。

ソフトウェアを最初に構築したとき、その中身は開発者の意図を明快に反映しているだろう。このとき、ソフトウェアは開発者の意図そのものと言える。ところが、些細な要求のためにトリッキーコードを入れたり、環境の変化にアドホックに対応したりすると、ちょっとずつソフトウェアの中身が開発者の理解からずれてくる。

これは、鏡が汚れて、ソフトウェアが開発者の意図を正確に映さなくなっている感覚に似ていると思う。また逆の解釈も可で、開発者がソフトウェアの姿をぼんやりとしか把握できなくなっている状態と見てもよい。

このような状況において、鏡を拭く、つまり開発者の意図が再び明確に反映された状態にすることがリファクタリングだと思う。リファクタリングが適切になされれば、ソフトウェアは開発者と意図と一体になり、変更容易性が大幅によくなる。

これは、DDDのいうところの「ドメインモデルを継続的に更新せよ」というパターンともいえる。要は、ソフトウェアは開発者と一心同体であることが、非常に重要であるということだ。

 

ところで、上記では、単に「良くない設計を直す」ことには言及していない。それは、そもそも最初から間違っているのであるから、それに対応する作業は単に不具合の修正だろう。ソフトウェアと一心同体になるのに必要な力量がない未熟な者は、リファクタリングの前に、まず完璧を期すことを心がけるべきだ。不具合対処を「リファクタリング」などといってさも高尚なことであるかのように見せかけるのは、あまり望ましくないと個人的には思っている。