[コラム/雑記] 美しいコード

今日はサッカーのおかげで職場が早々に捌けて、私もうまうまとそれにのっかって早く帰ることができたので、折角この時間のあるときにこのことについて書いておこうかと。

美しいとはなんだろうか。

といっても、美しい女性とは、とか、美しい風景とは、みたいな話ではなく、美しいコードとは何か、ということについて考えてみたい。

いきなり余談だが、私は以前、転職活動をしていたとき、某ゲーム系専門学校のプログラミングの講師に採用されかかったことがある。あれは私がフリーになる約1年前。当時、私が社員だった会社のブラックっぷりにほとほと疲れて、転職先として検討している中の選択肢のひとつだったわけですが、ほぼ採用が決まった段になって蹴ってしまったのよね。理由はぶっちゃけ薄い給料だったのだけど、今にして思えば、そうでなくても蹴ったのは正解だったかなと。学校にも私にも、お互いにとってね。

正直、当時の私は人に教えられるほどプログラムに習熟してなかったと思う。当時経験していた言語といえば、VB、C、C++、あとはDelphiというニッチもニッチな言語だけだった。ゲーム制作で使う言語の主流が何なのかはよく知らないけど、仮に新しい言語を教えろということになったら、まともに教えることなんかできなかったんじゃないか。まぁ、教えながら自ら成長するという例もよくあるといえばあるのだけど。

ただ、プログラミング初学者に、最初から間違った(その可能性が高い)概念や知識を植えこんでしまうというのは、なかなかに罪深いだろうと思う。それから1年後にフリーに転身してから今に至るまで
1つの現場にとどまらずいろんなシチュエーションでいろんな言語に触れながら、それこそいろんな人の書いたソースコードも見てきたが、中にはなんでそうするのか納得いかないコードもあれば、そういうやり方もあるのかとひどく感心するコードもあったりで、書く人の考え方や性格なんかもコードの中に見えたりして、それはそれで面白い経験ができたと思っている。

で、ようやく本題。そんな経験の中で、これはキレイだ!美しい!と思えるコードというのもいくつかあり、それらの共通点は何だろうと自分なりに考えたのだけど、きっと確実にいえるだろうことがひとつあった。

それは“単純”であること。

そう、シンプル・イズ・ベスト。 全く同じ要件を実現するコードでも、よりステップが少ない、より階層が少ない、よりシンプルな方法で実現されているものの方が「美しい」と思える。これはコードに限らず全ての論理でいえることで、同じことができるなら、より少ない手順でやれるものの方が価値が高いという考え方。いわゆる「オッカムの剃刀」。

……という観点で見て、逆に「これは酷い」と思えるコードもやっぱり同程度にある。やれif文の分岐をこれでもかと幾重にも重ねてみたり、段々畑かと突っ込みたくなるほど何ブロックも書いてみたり、それはそれで見た目に面白くて、ビジュアルでは壮観なんですが、きっとそれは美しいコードではない。

ブロックをあまりたくさん書くと一体どれがどの終了ブロックかわからなくなったり、途中で登場する変数のスコープがどこまでか判別しづらかったり、全く同じ処理が同じブロック内に2度3度コピペされてたり……とにかく、そんなバグの温床になるようなコードが山盛りで、こんなものが今も本番環境で稼働してるとかと驚愕することが多々ある。もちろん、そんなコードばかりというわけじゃない。少なからずそういうコードを見る度に、これホントにプロの仕事?とか思っちゃうのよね。

なんて、相当上からかモノをいっちゃってる私だけど、そんな私自身も美しいコードを書けてる自信は全くない。ただ、少なくとも自分なりに美しいコードを書こうという努力はしてる。

目指すところはシンプルさ。例えばありがちなところで、if else if else if else if ... なんて続く分岐の嵐は switch にした方が見た目にもキレイだし可読性も上がる。もちろん、言語によってはそれが使えない場合もあったりコーディング規約に縛りがあったり処理速度が落ちたりすることもあって、そういう避けられない理由なり何かポリシーがあってのことであれば、それも是だとは思う。

あと、やりたいことが複雑だったり一定の規則にはないイレギュラーな処理が必要だったりみたいなことは往々にしてあり、それを実現するには理想の規則に従ったコードでまるくおさめられないことも少なくない。また、後からお客の要求で仕様変更や機能追加を強いられたりとか、致命的な設計ミスがわかってそう書き直さざるをえなかったりとか、なるべく影響範囲を狭くするために後付コードにしてあるとか、特に受注型のシステムのプログラミングだと、なかなか理想通りのコードに落ち着かないものである。

ただ、そういう理由もなしで結果的に実現出来れば良しの精神でダダ打ちされたコードというのは、美しくないだけでなく、それを書いた本人さえ誤読しやすく、後でメンテする人とかなおさら……ということになってくる。全く最適化された形跡がないコードというのは、大体ぱっと見でわかる。まあ、最適化する時間もなかったのかな、と若干の同情がなくもないが。

多分、私が今プログラミングの講師になったら、下手な自前ポリシーは経験を積んでいくと変化するので(それは学んだ)それは押し殺しつつ、とりあえず「シンプル・イズ・ベスト」だけは教えると思う。これは多分、コーディングに限らない美意識という気がする。

タイトルとURLをコピーしました