2015/03/29

ダメなコードを改造しなくてはいけなくなったときは、ダメさを片っ端から潰していくしかない

仕事としてプログラミングをしていると、ときどき、どう見てもダメなコードを扱わないといけないことがある。そういうコードでも動いている以上はそれなりの価値を提供しているわけだけど、ときどき触るのすら嫌悪感を感じるようなものがある。

なぜ嫌悪感を感じるのかといえば、自分で最低限だと思っている想定すら守られていないからだ。常識の通じない人たちの書いたコードには身の毛もよだつようなものがある。
  • コーディングスタイルが統一されていない
  • インデントが狂っている
  • 到達不能なデッドコードがたくさんある
  • 無意味なコメントやコメントアウトされたコードがある
  • コメントの文章が文章としておかしい
  • コピペの繰り返しがたくさんある
  • ネストが恐ろしく深い
  • 関数が絶望的に長い
  • 無意味に複雑
こういったコードを触らなくてはいけなくなったとき、そのままで編集するのはかなり難しい。コードの内容以前に、不自然な部分でいちいち引っかかりが生じるので、コードが何をしているのか理解することに精神を集中することすら難しいからだ。

こういうコードを読むときにはどうしたらいいだろうか。

こういうコードを読むときには書き換えまくるのがよいと思う。「この関数は意味ありそうにみえるけどほとんど何もしていない」とか「ここのインデントは狂っているが前回もそう思った」といった付加情報を頭にすべて入れつつコードの全体像を掴むのはかなり困難だからだ。

こういうときには、機械的に等価で、しかし簡潔なコードに置き換えるつもりで、ひたすらブルドーザーのように小さな改良パッチをチェックインし続けるのがよい。意味不明なコードも等価で簡単なコードにステップを踏んで変換していくことで理解可能な範囲に収まることがよくある。デッドコードなら跡形もなく削除してしまえばよい。命名規則も、微妙に引っかかるだけのものも含めて、すべて統一されたきれいな形に書き換えてしまうほうがよい。無意味なコメントは、瑣末なものであっても徹底してキレイに消してしまえばよい。ちょっとしたくだらないことであっても、コードそのものをわかりやすくなるよう修正すべきだ。

こういったことは個人の好みといったレベルの物事ではないと思う。世の中にはよいコードと悪いコードというものがあり、悪いコードというのは本当に悪いコードなのだ。とにかく低レベルでのひっかりをなくさないことには普通のレベルでの改良も満足に進めることはできない。

プログラマをしているなら、最低限、低レベルでの引っ掛かりを他のプログラマに生じさせようにするように気をつけるべきだと思う。これは別に難しいことではない。ほかの周りのコードと同じように見えるようにコードを書けばよいだけだ(全体的に腐っている場合を除く)。どういうコードが普通なのか、という感覚を身につけるためには、よいオープンソースのコードを読んでみるのがよいと思う。

ネイティブの言語である日本語であっても、文章が多少おかしい人というのはたくさんいる。それと同じように、お手本のコードを嫌というほど目にした後でも「普通に見える」コードがなぜか書けない人というのはいるようだ。そういう人はどうすればいいのかは僕にはよくわからない。とにかくインデントや命名規則といった機械的な規則は最低限守ればよいとは思うのだが、それすら守れない人というのがいるようだ。心あるプログラマならそのラインはクリアしてほしいと思う。