日々常々

ふつうのプログラマがあたりまえにしたいこと。

凝ったコードは凝っているように見えない

"凝ったコード"……はどうだろう。

コードを書くことに凝るのはいい。でも、出来上がったコードが "凝っている" なんて言われるのはよくない。なぜなら "凝っている" と言われるコードは、おそらく "巧妙なコード" になっているから*1。そう言うのは得てして読みづらくて、凝りを解きほぐさないと理解しづらかったりする。そのようなコードは書くべきではない。コードの可読性から来る理解の容易さが全てじゃないが、他の条件がすべて同じ場合、読みやすいコードを書いた方が良いに決まっている*2
コードのメンテナンスは書いた瞬間から始まっているし、その場しのぎは長生きするものだ*3


ならば"凝ったコード"におけるメリットはなんだろう。書いてて楽しい?とても重要だけれど、それは置いておく。きっとそのコードは複雑で難解でありながらも、とても様々なことをこなすスーパープレイヤーのような存在だろう。スーパープレイヤーはそのうち神と呼ばれるようになる。ゴッドオブジェクトの誕生だ。とてもよろしくない。

コードに限らず、コンピュータは「一つのことをうまくやる」のに向いている。一方で、様々なことに対応するのはあまり得意でない。これは人間が得意とする領域だ。このコンピュータが得意でない「様々なもの」をうまく扱う方法が抽象化で、それらを同じものと見立て、同じように扱えるようにすることで「一つのこと」をやらせようという考え方。うまく出来ればシンプルになるし、うまく出来なければ歪になる。ここがプログラマの主戦場だと思う。


閑話休題。 "凝っている" と言われる状況は、あれもこれもやりすぎている可能性が高い。一見複雑だからそう表現される。そして見るからに複雑なコードは、おそらくYAGNIに反していたり、責務を持ちすぎていたりする。

私は自分の求めている "CleanCode (that works)" を "驚きのないコード" と捉えている。つまり「普通そう書くよね」と言われるようなもの。あるべくして自然とそうなっているもの。おそらく出来上がるコードは "凝ったコード" とは言われない。むしろ時間をかけずに書殴ったコードの方が凝っていると表現されるのではないだろうか。
コードに凝れば凝るほど、コードはシンプルになり、言われるような "凝ったコード" から離れていくと思う。凝る方向性だけの問題かもしれないけれど。


"新しく入ってくる人にもわかるように書く"……発言者の意図を考えると「新しく入ってくる人=何も知らない人≒ド素人」だったりするのだけれど、最後の「ド素人」は無視する。「何も知らない人」はその業務に精通していない程度の意味で良い。プログラミング言語を知らないとかも考える必要はない。何故なら、自分がプロとして書くコードを見る相手もまたプロだから。
新しく入ってきたかどうかに関わらず、コードは人にわかるように書かなければならない。そしてこれは、コードに凝った結果として出来るものだったりする。


……長々と書いたけど、元ツイートのコンテキストからズレてることは二行目あたりから理解してる(´・ω・`)


プログラマが知るべき97のこと

プログラマが知るべき97のこと

プロジェクト・マネジャーが知るべき97のこと

プロジェクト・マネジャーが知るべき97のこと

Clean Code アジャイルソフトウェア達人の技

Clean Code アジャイルソフトウェア達人の技

*1:プロジェクト・マネジャーが知るべき97のこと 23:巧妙なコードはメンテナンス困難

*2:とか言いつつ 「xxxした方がいい」は役に立たない - 日々常々 とか書いてたりする。

*3:プログラマが知るべき97のこと 52:「その場しのぎ」が長生きしてしまう