考えなければならないことを減らせる様に書く

今書くべきものに集中できる環境を整えよう。

次の3つのブログエントリがありました。

美しいプログラムの書き方についてですが、これをネタに何を考えながらコードを書くべきかについて議論します。

槍玉に挙がっているのは、次の3か条です。

  1. 変数のスコープは小さく抑える
  2. Do Not Repeat Yourself (DRYの原則) 同じコードは2度書くな
  3. 言語を極めよ

何人かは、それは「ケースバイケース」であると主張しましたし、それは間違っていません。しかし、ケースバイケースだと言うのは簡単ですが、それでは言われた方は何をしていいかわからず、結局そこから何も学ぶことができません。

そこで、このエントリでは、1つの指針を与えます。考えなければならないことを減らせるように書くということです。

変数のスコープは小さく抑える

変数のスコープを小さくすると、考えなければならないことを減らせます。変数が、そのスコープの中にしかないことは分かっているので、他を見る必要がないからです。

しかし、わざわざグローバルに参照できるところに変数をおくことで、考えなければならないことを減らせることもあります。もし、プログラムの様々な場所で、その変数に依存するような動作をするならば、きっとそれはグローバルにおくべきなのです。例えば、まれに変更される設定変数などが良い例です。ここで、グローバル変数と言っているのではなく、グローバルに参照できる変数と言っていることに注意してください。グローバル変数かもしれませんし、シングルトンの様なものかもしれません。

言語のいろんなパラダイム、例えば関数型言語やオブジェクト指向も、それぞれのやりかたで考えることを減らすのに成功しています。関数型言語は変数の書き換えを許さないことが多いですが、これは一度定義されてしまえばそれ以降変更されている箇所を探す必要がないという点で考えるべきことが少なくなっています。オブジェクト指向も、変数を変更できるのはオブジェクトのメソッドを通してのみ、ということになるためそのクラスのみを見ればよくなります。

Do Not Repeat Yourself (DRYの原則) 同じコードは2度書くな

これも、結局は考えることを減らすのに他なりません。しかし、これは*いつ考えるか*を減らすものです。

コピペコードは、その場で考えることを減らしています。しかし、後に変更をする場合には苦しむでしょう。これは思考を先送りにしていると考えることができます。これは、技術的負債に対応すると考えることができます。

同じコードを2度書かないようにするのは、今は苦しいかもしれません。しかし、上手く設計されたコードは純資産であり、将来考えるべきことを減らしてくれるでしょう。

言語を極めよ

これも、考えることを減らすことにほかなりません。言語はある程度極めて、息を吸うように記述できるぐらいでなければなりません。わざわざあれはどうかくんだっけ? と言語の機能を探すようでは、そちらに気を取られるばかりで必要なことを考える時間に支障がでるからです。

もちろん、極めるのは言語だけではだめで、アルゴリズムなどに関してもある程度は何も見ずに書けるようになっておく必要があります。

プログラムを書く以上、少なくとも一つの汎用言語をかなりの水準で極めておくべきです。できるだけモダンな奴が望ましいでしょう。関数型言語をおすすめしますが、C++でもJavaでも構いません。しかし、少なくとも一つの言語をきわめて置けば、新しい言語を学ぶときにも非常に役に立ちます。新しい言語のこの機能は、前にやった言語のあの機能とおなじ、というように覚えるべきことが少なくなっていくからです。

まとめ

将来無駄に考えなければならないようにならないかを今ちょっとだけ考えてからコードを書くのです。そして、余計なことを考えないでもよいように、考えなければならないことを減らすための投資をしましょう。それには言語の習得、アルゴリズムの習得など、様々な勉強が必要です。頑張りましょう。

2008-10-29