ソースコードの内側

 リファクタリングとヒステリシス - カタチづくりを読んでヒステリシスという用語を知った。Wikipediaの例がイメージしやすい。

パテの塊を押しつぶし、変形させたとする。手を放しても元の形には戻らない。

ヒステリシス - Wikipedia

 なるほど、いままでに受けた変形の果てに今の姿があり、今の姿から完全ではないにせよ、過去に受けた変形を想像できるというのは頷ける。これは面白いテーマだ。

 新人が書いたコードとか見ていると試行錯誤の跡がありありと残っていたりして面白い。その誤り方から彼が何を理解していて、何を理解できていないか、何を誤解しているのか、そういうことが透けて見えるんだ。そして僕らがそれを何から読み取っているかと言えば件のヒステリシスだと思う。

 さて、リファクタリングなのだけど、まずはっきりしておきたいのだけど、至高のソースコードというものはない。究極のソースコードというものもない。なぜなら、シチュエーションによって何がよくて何が悪いかなんてのは変わってくるからだ。単一の評価軸で評価できるような単純なものじゃない。電気のない土地に行ったらパソコンよりもそろばんのほうが役に立つ。

 リファクタリングは向かう方向によりけり。何を重視するかによる。たとえば木構造のデータがあったとして、Compositeパターンにしようとするか、Visitorパターンにしようとするかというのは何を可変にするかという狙いによるのだけど、その狙いというか価値観の重み付けというのは、システムそのものの事情が変わると変わってくる。

 そういうわけで、「リファクタリングとは設計からヒステリシスを除去すること」にはならないんじゃないかと思う。ヒステリシスの除去が方向をを持つだろうか?ということだ。リファクタリングをしても設計思想の変遷というヒステリシスがソースコードに残ってしまうんじゃないだろうか

 いやいや、まてまて。

 新人のコードなどは痕跡というか、ゴミが多く残っている。考えて変更した末に未使用の変数が残っていたり、役割が変化した変数やメソッドに過去を偲ばせる名前がついていたり、かつてのロジックに引きずられたデータ構造になっててそれに合わせた不合理なロジックになっていたり。

 だからこそ、会話などなしにソースコードの内側に潜って考えが読み取れる不思議な夜を僕らは体験することになる。

 設計思想の変遷だって、適当にリファクタリングをしたならば、名前やデータ構造やロジックの継ぎ目などにその痕跡が残るものだけど、丁寧に作業すればそうした痕跡もなくなって、あたかも最初からそのような設計思想だったかのように綺麗なソースコードになる。新人の書いたロジックでも、ベテランがクリーニングすればヒステリシスは消えうせてしまう。

 というわけで、ヒステリシスの多寡というのはソースをいじればいじるほど増える傾向にあるだろうけども、作業の丁寧さによって減るようなものである気がする。雑なリファクタリングをすれば設計思想の変遷というヒステリシスが重なっていく。じゃぁ、雑なリファクタリングは価値がないかというと、これから作るコードの形が変わるわけで、雑であっても骨格があるべきかたちになっているかどうかは大きな差だ。

 ヒステリシスの多寡と設計の綺麗さというのは、多分大きな正の相関性があると思うけど、何か違うシロモノに思える。僕らは何をもって設計のよしあしを判断しているのだろう?