~ プログラミングって面白そうと思った方に向けた連載エッセイ ~
どんな論理、手法、手順で組み立てられているか。一般的にプログラムの美しさというと、これを指すことが多いかもしれない。
ロジックは、短く簡潔にまとめられているのが美しい。
プログラミングにおいて、短さは善である。短かければ短いほど美しくもある。極端な話、コードを一行も書かないで実現できればそれがベストだ。一行でも書けばバグの可能性が生まれる。ゼロ行ならバグの入り込みようがない。かつてはプログラミング作業の成果を「ステップ数」と呼ばれる記述行数で測ることが多かったが、最近ではプログラムの規模を把握するための一つの参考指標にその位を下げている。苦労して行数をたくさん書くのではない。短時間でコードを量産することが偉いのではない。たくさん書けば、その分保守すべき対象も増えてしまう。考え抜いて簡潔なロジックで表現し、奮闘の成果としてコード量を減らすのである。
コンピュータのスペックが貧弱な時代には、保存領域や読み込み時間、実行時のメモリ使用量を抑えるため、プログラムサイズを小さくすることが重要だった。今でも組み込み系開発では重視される要件だろうが、パソコンに限って言うと、大容量のハードディスクがメモリや安価に購入できるようになり、その優先度は低くなった。人は制限がなくなれば甘えるものである。実現できることの幅が広がったのは喜ばしいことだが、パソコン向けのソフトウェア開発において、極力コード量を減らそうという動機づけが一つ減ってしまったのは残念な副作用である。プログラマには、感じない方がいい自由もある。
処理速度についても同様である。パソコンの処理能力向上に比例して、プログラマの意識は低くなっている。このくらいの無駄は、今のパソコンの処理能力をもってすれば体感できるほどのロスにはならないだろう、というわけである。しかし、わずかな負荷も積み重なれば無視できない大きさになる。プログラムの処理では、繰り返しが頻繁に行われる。ある一塊のロジックを記述するということは、それがほかのプログラマによって、ときとして別のプログラムからも使用される可能性があるということであり、その使用方法を完全に制御することはできない。どのタイミングで呼び出され、何度繰り返されるか、将来にわたって正確に想定するのは難しい。コンマ1秒の処理は体感できないかもしれないが、それが千回繰り返されれば百秒である。これを体感できないほどおおらかなユーザーはいないだろう。決してわかりやすく強調した大げさな話ではない。実際にこうした問題が起こって原因を調査し、非効率な実装に気づくことも少なくないのである。
現代のプログラミングでは、ある程度の汎用的なロジックは部品として提供されており、それを駆使してプログラムを組む。一からすべてを実装することはまずない。部品の処理仕様は公開されているが、その具体的実装は基本的にブラックボックスである。その中身が効率よく実装されている保証はない。部品を使う側のプログラマは、仮に非効率な実装であっても極力パフォーマンスに影響が及ばないよう、呼び出す回数をなるべく少なくするなどの心がけを――常に最優先というわけではないが――忘れてはならない。優しく使ってあげよう、ということだ。そして部品を作る側に回ったときには、使う立場に思いを馳せ、できるだけ効率的なロジックで実装してあげるのである。双方の気遣いがロジックに込められて、優れたパフォーマンスのプログラムとして提供される。ユーザーは気持ちよく操作する。料理は愛情という。プログラムにおいても愛情が大切である。これもまた美しいとは、こじつけかもしれないが。
「見た目」について記述した先の章で "DRY"("Don't repeat yourself")――重複を避けろ――という原則を紹介した。これはロジックにも関わることである。無駄なロジックは美しくない。ロジックがすでに部品化されているのに自前で実装しようとするのも、また無駄である。それは「車輪の再発明」と揶揄されたりする。
ここで例を挙げよう。
今年二十歳を迎えた劉さんの娘が座ったまま眠ってしまった。
今年二十歳を迎えた劉さんの娘は昨日、現在私とその家族が住んでいる家にやって来たのだった。
たぶん飲みすぎたんだろうな。
言い忘れていたが、今年二十歳を迎えた劉さんの娘というのは女性である。
「今年二十歳を迎えた劉さんの娘」を読むたびに、それが誰かを特定するための信号が脳内を駆け巡ると想像していただきたい。繰り返すのは無駄である。
一文目と二文目は時系列が逆である。二文目を読んだ後に一文目を解釈し直さなければならない。
二文目の「現在私とその家族が住んでいる家」は、それを表す便利な言葉がすでに発明されている。
三文目は文芸的には価値があるのかもしれないが、ロジック的に遅れて種を明かす価値はない。
四文目に関しては、丸ごと無駄である。しかし笑ってはいられない。あなたがプログラマになったら、このようなコードに出会うこともあるだろう。
組み直してみる。
劉さんの娘は今年二十歳を迎えた。
彼女が昨日我が家にやって来た。
彼女は飲みすぎたのか、座ったまま眠ってしまった。
「彼女」という代名詞を使うことで、誰だが特定する処理を一回に減らすことができた。無駄が一つなくなった。プログラミングの世界では、「変数」という仕組みを使って同じことが実現できる。
無駄は美しくない。ロジックについても然りである。ある課題を無駄のない効果的な方法で解決したとき、そのロジックを美しいと評することができるだろう。美しいロジックは理解しやすく、使いやすく、変更しやすい。
ロジックはその目的たる処理動作とも不可分である。無駄のないロジックは無駄のない処理動作の基礎となる。プログラムの機能美という側面からは、処理動作の効率性も美しさの重要な位置を占めるだろう。
序章
第一章 その美の特徴
第二章 見た目と冗長性
第三章 ロジック
第四章 命名
第五章 アーキテクチャ
第六章 リファクタリング
第七章 デザインパターン
第八章 正規化
終章