考えることを減らせる様に書く
ちょっと遅れたけど参戦するよ。
槍玉に挙がっているのは、次の3か条。
- 変数のスコープは小さく抑える
- Do Not Repeat Yourself (DRYの原則) 同じコードは2度書くな
- 言語を極めよ
何人かは「ケースバイケース」だと言ったし、それは間違ってない。しかしケースバイケースだと言うのは簡単だがこれは何にも指針を示してない。ケースバイケースだと言われた側は、結局そこから何も学ぶことが出来ない。納得はしちゃうかもしれないけどね。この中で Leo さんは「依存関係を減らすか増やすか」ということではじめの2つをまとめてみた。その視点は悪くないし、コードの「動作」ではなく「意味」を追うように言ったのはすばらしい。
ところで、こういうエントリを読んだってことは何かを知りたかったわけだよね。だとしたら、何か曲がりなりにでも指針が示されるべきじゃないかな。というわけで僕なりの指針を示したいと思う。
僕の指針はこうだ。すなわち、「考えることを減らせるように書く。」
変数のスコープは小さく抑える
変数のスコープを小さくすることで考えることを減らせる様になるのは当然だよね。そのスコープの中だけ追っていれば良いのだから。考えることが減らせると思えば、別に変数をグローバルにしたって構わない。毎々〜を渡して云々を考える必要がなくなる。言語のいろんなパラダイム、例えば関数型言語やオブジェクト指向も、それぞれのやりかたで考えることを減らすのに成功している。もちろん、馴染めない人には余計な思考が入ってしまって嫌がるんだろうけどね。
Do Not Repeat Yourself (DRYの原則) 同じコードは2度書くな
これも結局は考えることを減らすのに他ならない。コピペコードだって結局その場で考えることを減らしているだけだ。すなわち、今考えることを減らすか将来考えることを減らすか、を天秤にかけていることになる。しばしば、2回コピペしたら一つにまとめることを考えろなんて言われるけど、これは次の不等式が成り立っていると思ってるんじゃないかな。(コピペのコスト + 将来苦しむ可能性のあるコスト)<(関数にまとめるコスト)<(コピペのコスト + 将来苦しむ可能性のあるコスト) *2。
言語を極めよ
まあ、これも実は極めていれば余計な思考が入らなくなるから、言語を極めることは重要なんだ。もちろん、「極めているかいないか」だけの軸で見た場合。学ぶことはたくさんあるし、アルゴリズムを知っていることも重要だ。個人的にはだけど、少なくとも一つの汎用言語はかなり極めておいた良いと思う。それもモダンな奴を(関数型言語をおすすめしたいけどね)。それと同時にアルゴリズムは一通り習得しておくこと。アルゴリズムは一度習得したらどの言語でも使えるからね!
考えることを減らせる様に書く
長くなったけど、もう一回言うよ。考えることを減らせる様に書く。これが僕の指針だ。
October 29th, 2008 at 09:55
Leo’s Chronicle: 優秀なプログラマは空気を読んで空気を描く
面白かったので参戦。
October 29th, 2008 at 11:39
考えることを減らすのは「誰か」という視点が欠けているように思いました。協業においては、ある人が省力化した分のコストは別の人が支払うわけですから。「どの人も常に自分が考えることを減らすように書くようにすれば全体として最適化できるはず」かもしれませんが、おそらく仮説の域を出ないでしょう。
October 29th, 2008 at 12:59
お昼休みなので今書き込んじゃいますね。
もちろん、目指すべきは全員が考えることを減らすこと。自分が考えることだけを減らすわけにはいかない。上の仮説はあんまり良くない極小解に陥ってしまう恐れが高い。
一人で書いているときとみんなで書いているときは、書き方がちょっと変わる。具体的には、他人が書いたコードをなるべく読まなくてもいいように結合を疎にしたりあるいはインタフェースを切ったりする。それ以降は書いている人が責任を負ったらよいと思う。そのとき、グローバル変数を使いたければ使ってもいいけど、それはもしかしたら別の誰かに変更されてしまうかもしれないだとか、実はドキュメントに書いてなかったけど取れる値に範囲があるのにそれを無視されてしまうとか、いろいろ考えなきゃならないことが増えてくる。それを補ってもメリットがあるのだとすれば使っても良い。
ここで書いたのは指針だから、時には外れるケースがある。でも基本ははずしていないつもりだ。
October 29th, 2008 at 14:19
まさに我が意を得たりという答えです。そのインタフェースを切るコスト(全体が支払うことになるコスト)はいったい誰にオフロードし得るのかなどと水掛け論を続けることも可能かもしれませんが、それは本意ではありません