IT用語辞典によると、「リファクタリングとは、プログラムの振る舞いを変えることなくソースコードを変更すること。…一部省略…各種問題を解決し、将来の仕様変更に柔軟に対応できるようソースコードの手直しを行うこと。」と記載されています。

様々な企業の方とお話ししていると、「今まさにリファクタリングやってます」「リファクタリングのやり方が分からない」「検証済みのソースコードなので、リファクタリングをする事への理解が得られない」などの話が飛び交います。皆さんと情報交換しているうちに気づいた事があります。それは…

「リファクタリング」という言葉を使っていても、それぞれ考えていることが違う。

ということです。これはコミュニケーションにおいて、大変な問題です。互いに意味が違う会話をしているからです。

リファクタリング_認識ずれ

「リファクタリング」を理解を深めるために、「家」を例に出してみましょう。
建設済みの家を改良するために、私たちがする事と言えば、「模様替え」「リフォーム」「増改築・建替え」などがあります。「模様替え」と言えば、部屋の中の家具の位置を変えたり、壁紙を張り替えたりすることです。つまり部屋の広さや窓・ドアなどは変えず、かつ低予算で短期間で見た目を変える行為です。「リフォーム」と言えば、風呂場や台所を最新式の設備に変えたり、手すりやバリアフリーに変えたり、古くなった柱を新しい柱に置き換えるなどです。これらはある程度の予算と工事を必要とします。しかし、家の構造そのものを大きく変えることはありません。最後に「増改築・建て替え」と言えば、今まで無かった筋交いを打ち付けたり、土地の上物をごっそり取り替えることです。これらはかなりの予算と工期を必要とします。しかし、根本的な問題が解決したり、望む形になります。

リファクタリングと家

ソフトウェアでも似たようなことが言えます。
ファイルや関数・変数などの名前を変更する行為は、「模様替え」のような感じですね。関数やファイルを分割したり、統合したりする行為は、「リフォーム」のような感じですね。特定のパッケージ(フォルダ)やファイルの中身を一新したり、既存パッケージを新しいパッケージと置き換える行為は、「増改築・建て替え」のような感じですね。

このように、「模様替え」レベルの軽いものをイメージしている人と、「増改築・建て替え」レベルの重いものをイメージしている人が、「リファクタリング」という共通の言葉を使って議論をしてもかみ合うはずがありません。さらに厄介な問題は、用語辞典にあった「プログラムの振る舞いを変えることなく・・・」という説明は、「模様替え」「リフォーム」「増改築・建て替え」のどのレベルでも意味的に通じてしまいます。ですので皆さん自分が使っている「リファクタリング」という言葉は正しいと考え、相手がどのレベルで話しを聞いているかを意識していない事が多いのです。ここに大きな誤解が生まれてしまうのだと考えます。

著者はリファクタリングについて話をする際に、必ずこの点(どのレベルの話をしているか)を注意して説明します。「模様替え」「リフォーム」「増改築・建て替え」では、必要とするスキル・技術力、予算、時間(工数)は当然異なりますし、それはソフトウェアのリファクタリングでも同じ事が言えます。ソフトウェアの世界においても、各レベルはきちんと切り分けて考える必要があります。

リファクタリング_レベル別の様子

区別さえつけば、言葉の定義上「模様替え」「リフォーム」「増改築・建て替え」どれも「リファクタリング」と言っても良いのですが、分かりにくくなるため著者は「リフォーム」の事を「リファクタリング」と言うようにしています。それだけソフトウェアの世界で言う「リフォーム」は特殊な技術が必要だという事です。リファクタリングの各レベルの詳しい内容については別の機会に・・・。