読みやすさの大切さ

みなさん、コーディング中に『良い名前』付けてますか?


皆さんは「可読性」という言葉をご存知でしょうか?
「可読性」とは、文章やコードなどの読みやすさの度合い、のことを指します。
つまり、「可読性がいい」とは、その文章やコードが読みやすいということを意味します。
最近は書籍や Web の記事などでよく目にするのではないでしょうか?

では、皆さんは読みやすいコードとはどういうことか分かりますか?


■直感的

以下の 2 つのコードを見てください。読みやすいのはどちらですか?
どちらがより直感的だと感じますか?

System.out.println(date.add(-1));

System.out.println(date.previousDate());

もちろんこのコードだけを単体でみれば、さほど悩むほどのものでもありません。
しかし現実はそう簡単ではないんです。このような少しだけ分かりにくいコードが次第にコード全体を埋め尽くしていくと、
もはやそのコードは決して「読みやすい」コードとは言えなくなります。
つまり、「可読性が悪い」コードになっていくのです。


■ローマ字は悪か?

日本人が書くコードには、外人から見ればなぜそのような英語を使っているんだ?
みたいなコードがきっとあると思うんです。
そりゃ日本人は外人に比べて英語が得意ではないのは当然の話です。
(たまに外人が変な日本語を唐突に喋るのと同じで)
でも、だからってそこで思考を停止して、コンテキスト(文脈)を考えずに、
適当にネットで調べて見つかった単語をそのまま使ったりするんですね。

「じゃーコンテキストに合った単語を見つけるのが難しい(面倒)なら、ローマ字で書けば良いじゃないか!」

おいおいちょっと待ってくれ。確かにコンテキストに合った単語を見つけるという作業は、
時に難しく、特に面倒な作業であるのは分かります。
だからって、ローマ字表記のコードなんて誰が見たいんですか?
もちろんケースバイケースな一面はあると思っています。
例えばプロジェクトの方針で、ある日本語は英語が無いからローマ字表記で統一するとか、
そのドメインの中で一般的な単語がローマ字なのでそれを使うとか。そういった場面があるのも事実です。

でも、それらはあくまで例外的な話であって、本来はちゃんと英語を使うべきだと思うんです。
私たちが開発している中で利用する様々なフレームワークやら API やらというのは、基本全て英語です。
それらを使って開発をするということは、必然的に私たちのコードも大半が英語になっています。

しかし、その中で自分が考えるのが面倒だからとか、自分は英語力が無いからとか、
理由になってない理由を並べて、英語で書くのを諦めてローマ字で書いたりするんですよね。

そうした、大半が英語で埋め尽くされたコードの中に、たまに顔を出すローマ字表記の変数名やら関数名やら。
そのようなコードを見てどう思いますか?見やすいですか?
『あ〜良い単語が見つからなかったんだな〜』なんて寛大な心でそのコードを受け止められますか?
少なくとも私は『あ〜逃げたんだな〜』と蔑んだ目でコードを受け止めますけどね(笑)

私の先生とする人はこう言っていました。

ディズニーランドみたいに全てが調和してればゴミはすぐ見つけられ片付けられる。JavaならJavaらしくSunの人が書くプログラムと見分けがつかないように書く。ただし、文字数だのCaseだのといった歴史的な制約はその限りではない。これだけでいいんジャマイカ

■コード量が少ないのは善か?

最近私は著マーチン・ファウラーの『リファクタリング』という書籍を読みました。
あれは良書ですね。コードを読みやすくするための小さなテクニックがいくつも掲載されており、とても勉強になりました。

でもあれを読んで、コード量を少なくすることが良い!みたいな幻影に見せられた人(私も含めますw)が、
狂ったようにコード量を少なくするリファクタリングばかりをやっていたりします。
もちろん悪いことではないと思います。コードの量が多いということは、読むべきコードが多い、
それ即ち理解する時間が長くなるということに繋がるからです。

しかし、ただ単純にコード量が少ないだけで、そのコードの理解に掛ける時間は長くなるのでしょうか?
私は必ずしもそうとは言い切れないと思います。

たとえば、以下の 2 つのコードを見てください。どちらが理解しやすいですか?

if (user.getFather().getBirthday().before(user.getMother().getBirthday())) {
    // 何らかの処理
}
Date fatherBirthday = user.getFather().getBirthday();
Date motherBirthday = user.getMother().getBirthday();
if (fatherBirthday.before(motherBirthday)) {
    // 何らかの処理
}

確かにこんな簡単なサンプルだけ見てもどっちが良いなんて言えないと思う。
だけど、感じてくれましたか?コード量が多いことだけが悪いことではないと。
(次はもう少しマシなサンプルを考えてくるよ)


■そのコードは "誰" のためのコードか?

で、つらつらと書いてきたましたが、そもそも今あなたが書いているコードは、
"誰"のために書いていますか?もちろん自分のためでもあり、お客さまのためでもあり、会社のためでもあり、
彼女のため...ではないですね(笑)

もっと簡単に言うと、今後そのコードを「読む全ての人」のためだと思うんです。

あなたが頑張って開発したシステムがようやくリリースされました。そしてあなたは晴れて自由の身です。
が、早速バグが出たようです(笑)(よくあるよね)
でも、もうあなたの手からは離れているので、バグを直すのは残された人、保守の人、お客さま自身が
そのバグを直さなければいけません。
そうなったときに、あなたのコードを「読んで」、バグを直す人は何と言うでしょうか?

「なんだこのクソコードは!!」
「意味分かんねーよ!」
「書いた奴ぶっ飛ばす!!」

なんて、恐ろしい言葉が飛んでくるかもしれません。

もちろん、あなたが今書いているコードは、今この瞬間は「あなた」のためかもしれませんが、
数日後、もしくは数時間後には、そのコードを「読む人」のためになります。

そうなった時に、帰り道に後ろから刺されないようにするためには、
日々のコーディングの中でも、「あなた」のためだけでなく、そのコードを今後「読む人たち」のために、
読みやすいコーディングを心掛けるのはとても大切だと思います。

しかし、これは経験も大事だと思います。
ここで指す経験とは、「良いコード」に触れる経験と、「悪いコード」に触れる経験と、両方必要だと私は思います。
「良いコード」に触れることによって、自分がコードを書くときの参考になったり、テクニックを学べたりします。
逆に「悪いコード」に触れ、自分が辛い思いや怒りを覚えることによって、反面教師的に良いコードを書こうという
ポジティブな発想になりやすいです。
(が、逆にもっと悪いコードを書いて、俺以外も苦しめてやる!となる恐れも人によってはありますので注意が必要)


最後にもう一つ先生の言葉を借りて終わりにしましょう。

キミが名前考える時間よりもそれを読む人の時間の方が重要だから。もっとも、一番読むのはキミのはずだが。。。晩飯