「誰にでも読めるソースコード」は良い物なのか?

「プログラムは誰にでも読めるように書くべきである」
そう言うことも聞くし、今日行った会社の説明会で少しそんな話を聞いたので、自分の意見をまとめて見ようと思う。
なお、あくまで持論であり、今の考えを纏めたものなので、異論は認める。


4/16追記:まず、反響に自分が一番驚きました。
自分の文章が下手で、言いたい事がうまく伝わっていないところもあるので、原文を残しつつ修正稿を上げようと思っています。が、少々忙しい状況が続くので、コメントに対する返信なども含めてしばらくお待ち下さい。

論理学的命題と定義

結論を言うと、「誰にでも読めるソースコード」は存在しない。言い換えれば、命題「誰にでも読めるソースコードは存在する」は偽である。
これは厳密には証明出来ないが、悪魔を連れてくる(と言う)ことはできる。つまりは、全くプログラムを勉強したことが無い人にソースコードを見せても、その意味は理解出来ない。この事から、誰にでも読めるソースコードとは、そもそも存在しえないのである。
しかし、条件付けすることで先の命題を真にできる。その条件とは、頭に「特定コミュニティの」をつけることである。
一般的に「誰にでも〜」という場合は、この単語、おそらく「自社内の人間なら誰にでも〜」という意味で用いられる。
そのためここでは、「誰にでも」という言葉を、「特定グループに属している人ならば誰でも」という意味で用いる。
さて、誰にでも読めるということを定義したが、では、その「誰にでも読める」というのはどのように決められているのだろうか?
全員に全てのソースコードを読ませることが確実だが、現実的にはそのような時間はない。
そのため、おそらく「コーディング規約」という形でそのことを表現する。

コーディング規約

書くときに従うべき内容の事である。
だが、現在の(日本の)コーディング規約は、私は良い物とは思えない。私がそう思っている理由を以下に示す。ただし、これらは大筋が推測であり、自分の意見が全くの的外れである可能性もある点に注意して欲しい。

  • 更新が遅い

技術は次々と新しくなるのに、(これは日本に限らずだが)保守案件ではプロジェクトのソースコードを修正する。すなわち、その当時のソースコードを当時の規約に従って修正することになる。
そう言った案件が多くなるに連れて、案件毎に別々の規約を作らず、昔のコーディング規約を使い回すことが多いと考えられる。

開発者と保守者が違うことは多くある。そのような中で一貫性を取っていても、結局は綻びが生まれるのではないかと思う。
また、「誰にでも読める」の定義でした通り、規約を知らない人間には必ずしもソースコードは読めないのである。果たして、その程度の規約に意味はあるのだろうか?

  • 下に合わせる

誰にでも読めるようにするために、低レベルな人と高レベルな人をまとめて扱う。すなわち、人月の単位でしか物事を見れなくする手助けをしてしまう。
この辺りの考えは、リファクタリング・ウェットウェアにある「達人」の考え方が私の根底にあるためである。詳しくは上記本を参照されたい。


コーディング規約そのものには反対はしない。しかし、コーディング規約は必要最低限にするべきだと自分では思う。
そもそも、ルールを定めるのはメリットがあるためである。メリットがあるからこそルールを守るのであって、そこには客観的理由が必要だと考える。


具体例を挙げよう。
あるコーディング規則には「条件演算子を使うな」というルールがあり、その理由は「条件演算子は分かりにくいから」である。しかし、分かりにくいというのは所詮主観である。主観は明確では無く、評価できない。次に挙げるソースコードは、どちらが分かり安いだろうか? (記述はJava)

// (1) if文
if( a > 10 ) {
    return a*10;
} else {
    return 0;
}

// (2) 条件演算子
return (a > 10) ? a*10 : 0;

私は条件演算子を使った(2)の方が分かり安い。しかし、これは主観であり、(1)が分かり安いという人も間違いなくいるだろう。
なので、私は(この程度であれば)ソースコード中にどちらを書いても良いと思う。
ここで「条件演算子」を使えなければ、(1)の様なコードを記述しなければならないが、私からみれば長々しく書くのが嫌で、(2)で書かせて欲しいと思う。
これは、所詮主観の問題であって、私はコーディング規約に含めるべきではないと考える。


コーディング規約は、実力差を埋めるものであり、実力向上の指針にはなり得る。
しかし、ただそれだけに過ぎない。下手なコーディング規約は実力を良くも悪くも均一化し、プログラマを人月の地獄へと誘う。

主観的判断による「読める」

「自分に取って読みにくい」ソースコードを「読めない」と言い張る人もおそらくいる。
「メソッド化しすぎて分からない」という人も(残念ながら)いる。
そう言った人たちの意見を統合すれば、おそらくループも関数もない、メイン一本のプログラムができるのでは無いだろうか?
しかし、そう言ったコードには重複があり、結局、例えば私によっては読みづらい。
誰にとっても読みやすいソースコードは存在しない。


だからこそ、客観的に良い構造をソースコードに求めるのである。
テストが簡単であるか、機能拡張に対して簡単に変更ができるか、無駄な機能が無いか、他との依存は薄いか、適切な変数名であるか、などなど
これらが「分からない」「読めない」というのはそもそも論外だ。
客観的に良いものを「自分に取っては〜だ」という主観的な理由で片付けてはいけない。
しかし、これらの良い物を読めないという人がいる。結果として、誰にでも読めるソースコードでは無くなってしまう。だが、その「誰にでも読めない」ソースコードの方が客観的価値は高いのだ。

結論

これらの理由より、「誰にでも読めるソースコード」は必ずしも良いものでは無い、という結論を得る。もちろん、ある観点から見れば利点もあるので偽とは言えない。
その上、そもそも「誰にでも読める」ということそのものが主観的な価値観を含んでおり、この「誰にでも読める」という建前が、コードの質を下げることはある。その原因は下手な規約によるものであると考えられる。