2008-03-15

いい質問だ

プログラムを書けるということはプログラムを設計できるという意味じゃない。ルールを知っているのと囲碁を打てるのが違うように。

ルールを覚えたら、次は定石を覚えないといけない。覚えなくても打てるが、とても傍から見ていられない囲碁になる。同じように、プログラム言語を覚えたら、プログラミングの定石を覚えなければならない。プログラミングの定石は、まず次の二つが大事。

これは武道で言えば型、球技で言えば素振りに相当する。つまり、「こう来たら、こう対応する」ということを考えずにできるようにしないといけない。「並べ替えろ」といわれたらクイックソート、表引きといわれたらハッシュが出てくるように勉強する。で、きちんと抑えれば碁やスポーツと同じでそのアプローチの弱点も分かるから、頓珍漢な場所で使うことも無くなる。

アルゴリズムデータ構造は、きちんとした教科書一冊で基本をたっぷり勉強できるから、あまり苦労しなくて済む。

で、次なんだけど分割統治(モジュール化)と情報遮蔽って考え方を徹底的に自分の意識に刷り込む。これはモットーみたいなものなので必ずしもみんなが意識しているわけじゃない。だけど、ある程度大きなプログラムを書くときには決して避けて通れない。だから、この意識は徹底しておくほうがいい。分割統治のコツは合理的な分割。たとえば囲碁プログラムをどうやって組めばいいのか分からなければ、全体を

と言う風に分割して、それぞれについて独立して考える。それでも大きすぎるなら盤面描画を

  • 木目の描画
  • 線の描画
  • 石の描画

のようにさらに分割する。合理的な分割であれば、分割するほど分かりやすくなるはず。

分割統治を行うと、それぞれのモジュール間のデータのやり取りが出てくるのでモジュールインターフェースが必要になってくる。このとき、情報遮蔽の考え方を使う。情報遮蔽は「見せなくてもいいデータは見せない。見せなくてもいいアルゴリズムは見せない」と言うもの。銀行の細かい仕組みを知らなくても、ATMの使い方を知っていればお金を下ろせるように、モジュールの実装方法を知らなくてもインターフェースを知っていれば使えるようにするためのモットーが情報遮蔽。

情報遮蔽をきっちりやって薄くて小さいインターフェースモジュールを開発するすると、モジュールの交換が簡単になる。たとえば木目生成のもっといいアルゴリズムを思いついたとき、モジュールインターフェースが薄くて軽いなら、同じインターフェースを持つ別の木目生成モジュールを作って差し替えることができる。インターフェースが込み入っていると、差し替え自体もうまくいかない。

分割統治と情報遮蔽にも今では定石があって、デザインパターンと呼ばれる。これはクラス分割と役割分担の定石集みたいなもの。

ここまで抑えるのに、学生なら半年くらいでいいはず。あとはこれを意識しながら、組みたいプログラムの分野の文献を読み漁り、自分でも書いちゃ壊し、書いちゃ壊しを続ければいい。目を肥やして経験をつめば、規模を克服する力も付いてくる。

http://anond.hatelabo.jp/20080315035622

記事への反応 -
  • 情報系の学部の学生です。 大学でプログラミングの演習をしています。(言語はJavaです) if,for,whileとかの制御構文は理解し、クラス、メソッドや継承やインターフェイスといったオブジェ...

    • プログラムを書けるということはプログラムを設計できるという意味じゃない。ルールを知っているのと囲碁を打てるのが違うように。 ルールを覚えたら、次は定石を覚えないといけな...

    • プログラムには書き方がある。その書き方とは、規模が線形で大きくなっても開発を続けるコストも(償却)線形でしか大きくならないものの事をいう。 設計にも同じ事が言えるし、極...

    • ボードゲームのプログラムって結構難しい部類に入るし、囲碁なんてその中でも特に難しいものだから、そりゃ書けなくてもしょうがない。 ああいうのの難しさって、規模というよりは...

    • いいとは思うけどね。だけどそれに集中することが大切かと。まあ、囲碁のプログラムは果たしてプログラムをするに足る対象だろうか、などの問題もあるけど、まずは目的を定めること...

    • 元情報系の学部の学生です(現在は大学院生です)。 >みなさんは、どうやって大きめのプログラムが書けるようになりましたか? ということなので、私のプログラミング変遷を書いて...

    • 問題分割の概念が必要なんじゃないか。 囲碁のプログラム、ととらえるとすっごい大きく見えるけど、これを 囲碁の画面を描くプログラム 指定した位置に石を置くプログラム 囲碁...

    • 囲碁漫画「ヒカルの碁」の単行本のおまけページに(ヒカルの碁のゲームが出たという話題) 「囲碁のゲームはまだ発展途上で、コンピューターの一手はすごく時間がかかる。何分も待...

      • 考慮時間の割りに強いプログラムを組むのはそりゃハチャメチャに難しい。しかしそうでなくても碁は石の生死判定とかでいろいろ厄介だと思う。ファミコン黎明期の碁のソフトは石の生...

      • 碁がほんとうに難しいのは、本当に難しいからなんだ。 自分の手版だったとしよう。 将棋の場合升目は9*9しかないから、手持ちの駒があったとしても打てる手順は81通り 2手先を読もう...

    • Javaスクールの危険 とりあえずSICPでも読めば?

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん