プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

美しいプログラムとは何か


美しいプログラムは使い勝手がよく(プログラマの言う)構造的にも優れているものだと思います。どちらかがよければいいと言うものではなく、プログラマとユーザがお互い納得した上で作ることが理想でしょう。相手の全てを理解する必要はありませんが、お互いが歩み寄って同じ土台で話し合うことにより、美しいプログラムは生まれてくるものだと思います。

美しいプログラムとは


Panyawoさんのブログで見つけた記事より:


軽快に作動するブラウザ、日夜動き続けるコンビナート… 気絶するほど美しい!技術の中にある“美” - CNET Japan


プログラマとユーザの対比といった観点でよく話題にあげられるのが、プログラムの美しさです。プログラマはプログラムのソースコードや内部構造などの美しさにこだわり、ユーザはプログラムの使い勝手と機能の美しさにこだわる、というようなことがよく言われます。はたして、美しいプログラムとはどのようなものなのでしょうか。

「美しさ」の観点の違い


双方の主張する「美しさ」の観点には違いがあると言われています。まずはその違いを明らかにしてみましょう。

プログラム構造としての美しさ


美しいソースコードとはどういうものでしょうか。なかなか一言で表すのは難しいですが、それはプログラムの各モジュール構造にムダがなく理論整然とまとまっていることだと思います。


プログラムは大きく分けて、データを処理するコード部分と、各種データを表現するデータ部分に分かれます。単一のデータとコードから成り立つことはあまりなく、一般的にプログラムは多くのデータとコードが複雑に絡み合った形で実現されています。


最初は単純な構造であっても、プログラムは度重なる機能追加やバグ修正によって、どんどん複雑さを増していきます。もちろんプログラムはある程度の機能拡張を想定して作られることが多いのですが、大きな仕様変更に対応するのは容易ではありません。いっそ設計を最初からやり直したいと思うこともありますが、納期の問題からなかなかそうはいきません。



そうなると本来位置すべきではない場所にデータやコードが埋め込まれていくことになります。プログラマはこういう状態を「美しくない」と呼んで嫌います。正しい位置にデータやコードを配置することがプログラマにとっての「美しい」ことであり、願っているものなのです。

機能や使い勝手としての美しさ


ユーザが望む機能や利用方法が直感的に理解できるプログラムは、美しいプログラムなのだと思います。


使いやすいプログラムというものは、マニュアルやヘルプを見なくても使えるものです。使っているうちに基本的な使い方が理解できる。「こんなことをしたいな」と思った時に、その機能を実現する方法が直感的に分かる。そういうプログラムは機能的に美しいと言えるでしょう。


どのようなインタフェースになっているのが自然だろうか。こういう機能も追加したいんだろうけど、どのように実現すべきだろう。「自然な」デザイン設計というのは思ったよりも難しいものです。実際に作ってみたら「ここはこうした方がいい」と思うことも珍しいことではありません。


こういった改変とフィードバックを繰り返すことで、プログラムはより洗練され使いやすいものになっていきます。

求めるものに違いはない


一見これら両者の主張は観点が違うように見えます。しかし、私は両者が求めるものは同じものだと思います。使い勝手がよくて、機能理解が容易であり、誤動作しないプログラムを作るという、最終的な目的は同じはずです。


双方の主張が違うように見えるのは、それぞれがこだわっていることへの理解不足から来ているのではないでしょうか。プログラマが主張する理論整然としたコードの重要性をユーザに理解してもらうことが難しいように、エンドユーザが求める機能要求の背景や重要性を、プログラマは正しく理解していないことから、両者の対立が生まれているのだと思います。


利用者が求めるものを正しく実装してこそ、満足する製品となるはずです。プログラムの中身はどうでもよい、性能が重要なのだから多少使いづらくても構わない。そういうプログラムというものは、どこかに歪みが生じているものです。機能は十分だけど普段と違う使い方をすると結果がおかしくなる、性能はいいけど意図した使い方ができない場合があるなど、結局どこかにしわ寄せが来るのです。

お互いを理解しよう


美しいプログラムは使い勝手がよく(プログラマの言う)構造的にも優れているものだと思います。どちらかがよければいいと言うものではなく、プログラマとユーザがお互い納得した上で作ることが理想でしょう。


もちろん現場はそんなに単純なものではありません。ムリなロジックを組み込んだり、運用で回避したり。納期もある。理想に近づけることはとても困難なことであることは私も理解しているつもりです。


だからこそ、プログラマとユーザはお互いを理解しようとする努力が必要なのではないでしょうか。プログラマは「そんな機能は作れない」と要求を突っぱねるのではなく、プログラムに与える負荷や問題点をユーザに納得できるように説明するべきです。ユーザも「こんな追加要求が来たからやっておいて」と言うだけでなく、その機能の重要性やユーザへの影響を正しくプログラマに伝えて納得してもらう必要があるでしょう。


相手の全てを理解する必要はありませんが、お互いが歩み寄って同じ土台で話し合うことにより、美しいプログラムは生まれてくるものだと思います。