見出し画像

[#36] Cocoaの印象 その2 : 緩やかな制約の強み

初出: MacPower 2003年 7月号

プログラマーの行動を制限するものには、何があるだろうか?1つにはコンパイラの存在がある。コンパイラとは、プログラマーが書いたソースコードをCPUが理解できるバイトコードに変換するプログラムのことだ。この、用意されているコンパイラが理解できるかたちでしか、プログラマーはソースコードを書くことはできない。プログラミング言語も制限されるし、そこで使われる文法も決められたものしか使えない。これが制限としては一番強いモノだ。コンピューターの都合に合わせた制約、ハードな制約といえる。

一方、それに対してソフトな制約というのがある。このソフトはソフトウェアではなく、「緩い」とか「柔らかい」という意味のソフトだ。例えばおなじみの「Human Interface Guideline」に代表されるガイドラインなどはソフトな制約といえる。それを作ることに物理的な制約はほとんどないのだが、あまり歓迎されることではない、というような緩やかな制約だ。

一般社会の例に置き換えてみれば、ハードな制約とは法律のようなモノである。それをすることは禁じられています、それをすると罰せられます、という強制力の強いルールだ。それに対しソフトな制約は、社会の規範のようなモノだ。常識的にはそんなことはしてはいけません、親からするなと教わりました、というぐらいのモノだ。強い強制力はなく、逸脱することは簡単なのだが、それを守らないと社会生活に支障が出る、といったたぐいのルールといえる。

さて、プログラマーによって書かれたコードが正しく動作するためには、そのコードの仕組みにミスがあってはいけない。プログラマーの役割は正しい仕組みを設計して、それが正しく実行されるようにソースコードを書くという作業だ。単純だが、基本的にはこの作業の組み合わせだ。処理の流れが単純であれば、どんな大規模になってもこの仕組みを正しく維持していくのは、さほど難しいことではない。

しかし、コンピューターが決められた処理をこなすだけの単なる計算機から、ユーザーの指示に従っていろんなことを自由にこなすことができる現在のウィンドウ型のシステムに変わってくる過程で、アプリケーションがこなす処理は複雑怪奇になってしまった[*1]。

そのために、今までのようなソースコードの書き方をしていると、いろんなミスが簡単に起きるようになってしまった。例えば、よく知られているメモリリークという問題がある。これは確保したメモリーを破棄しなかったり、逆にまだ使われているメモリーを破棄してしまうなどの問題だ。メモリ一管理の仕組みが破綻してしまったことを意味している。

そこで最近のプログラミング環境には、自然とこうしたことへの何らかの対処が組み込まれることになった。ここで、C言語の発展系であるC++言語やJava言語で用意された環境の多くは、言語的な制約を強める方向に走った。例えば先のメモリリークの例で言えば、C++言語が言語的に備えている仕組みを使って、作ったモノは自然と破棄されるように、プログラマーの負担を極限まで下げる方向で対処したのだ。つまりハードな制約を課したわけである。

ところが、Cocoaはそれに対して違うアプローチを取っている。Cocoaではソフトな制約で問題の解決を目指している。メモリーを使うときには、それがどのように使われるのかを意識して、正しく使いましょう、みんながそのルールに従っていれば問題は起きません、というアプローチなのだ。ルールを破ることは簡単なのだが、破ったら、もはやCocoaのアプリケーションとして動作するのも難しくなってしまうのだ。こうしたルールがCocoaにはたくさんある。それが前回述べた一貫性の元となっているのだ。つまりCocoa社会で生きていくための常識というものがあり、それが一貫性を作り出していたということになる。

まぁ、もともとObjective-C言語はC言語に最低限の拡張しか施していないので、ハードな制約を課すことが難しかったということはある。Objective-C 言語の柔軟性を生かす設計のためには、ハードな制約が向いていなかったということもあるだろう。なんにせよ、そんなこんながいい方向に働いたのは確かだといえる。

プログラマーにとって、ハードな制約とソフトな制約、どちらがよいのだろうか?ハードな制約は通常破ることはできない。なので間違えてミスを犯してしまうという心配は少なくなる。ソフトな制約では、起こそうと思えば簡単にミスは起こりうる。だからハードな制約のほうがいいのか?しかし、一般常識を身につけた大人が社会規範から外れた行為をそうそう行うことはないのと同様に、いったんCocoa社会での常識を身につければ間違いはほとんど起こらない。となれば、問題はその常識がいかに身につきやすいかであり、その点では前回書いたように、Cocoaは非常に納得できる常識となっている。身につくのはたやすいことだろう[*2]。

ではソフトな制約が持つ利点は何かといえば、それはプログラマーに考える余地があることではないかと思う。ソフトな制約があるということは、その制約が存在する理由の説明が必要だ。ただ禁止するだけでなく、その制約によって守られる範囲などを記したドキュメントも必要になってくる。そのぶん、問題の背後にまで意識を向けなくてはならない。これは余計な負担に感じられるかもしれないが、プログラマーの能力の維持のためにはとても必要なことなのではないだろうか。「何故できない?禁止されているから」というのでは、プログラマーはそこで考えることを停止する。そのことを学び、常識を身につけるチャンスを失ってしまっているかもしれない。これは大変危険なことではないだろうか。

バスケ(http://www.saryo.org/basuke/)
世の中blogが大流行ですな。そんな流れに乗ってみましょうということで、更新の止まっていた自分のサイトをblogで作り直してみました。一見変わっていないんだけどね(笑)。来月はblogについて考えてみましょう。

[*1] 複雑怪奇になってしまった - 例えばメニューでも画面上のコントロールからでも操作ができ、キーボードショートカット、さらにはAppleScriptの処理にも備えていなくてはならない。大変なのである。
[*2] たやすいことだろう - 初心者にとっては、これは障害となってしまうかもしれない。言語と仕様のほかに常識まで必要となると敷居が高い。

編集・矢口和則

この記事が気に入ったらサポートをしてみませんか?