金子勇さん ―― なぜ動くのかわからないけどプログラムはできる
金子勇さんは2ちゃんねる発のP2Pソフト「Winny」の作者として(そしてそれが理由で逮捕されたという経歴でも)有名だが、1990年後半には茨城大学のドクターから日本原子力研究所に入って物理シミュレーションを専門にする傍ら、ニフティサーブなどに自作のプログラムを発表し好評を得ていた。プログラミング自体は小学校からずっとやっているが、あまり仕事にはしたことはなく、「究極の趣味プログラマー」を自認する(司会の吉岡さんは「孤高のプログラマー」と紹介した)。
今回の話はそういった趣味の3Dシミュレーションにおけるプログラミング手法を中心に、そのバックグラウンドにあるプログラミング手法について語られた。「今まであまり話したことが無い」と前置きしながら語るその技術的背景はとても面白く、会場も話に引き込まれていた。
プログラムはシミュレーションのモデル
金子さんは、表現としてプログラミングという技能は使うけども、自分自身への印象はプログラマーではない。英語がしゃべれるからといって翻訳者ではないように、プログラミングをするからプログラマーというわけではないという。自分はシミュレーション屋、コンピュータはシミュレーション物理学の道具として考えている。
ここでいうシミュレーション物理学は、理論物理学と実験物理学の中間にあり、複雑だけどもある程度モデル化はでき、コンピュータ上でなら検証できるような事象を扱う。端的に言えば「カオス系」と呼ばれるものが多い。モデルは理論上かなり難しいものになるが、プログラム自体はすごく短いコードで簡単に作れるという。しかし、動かしてみると、作者自身も想像もしなかった結果が出る。「これが面白いんですよ!」と金子さんは何度も繰り返し強調した。
普通のソフトウェア設計は「ウォーターフォール型」で、分析して設計したとおりに作るものだが、金子さんにとってみれば「設計したとおりに動くのは、当たり前で、つまんないんですよ」。逆に、何が起きているのかわからないようなプログラムが大好き、という金子さんのプログラミングは、次の4工程からなる。
- コンピュータ内にモデル(=プログラム)を構築
- 結果を検討
- パラメーターを変更して、2に戻る
- モデルを変更して、1に戻る
プログラムは何らかのモデルを表した記述物。初期設計はあまり重視せず、とにかく動けばよいという感覚で、とりあえず最低限のプログラムを作ってみる。しかし、ベースとなる理屈やコンセプトは重要で、何がやりたいかがブレてはいけない。
プログラムを実際にランさせてみる。基本モデルは単純なほうがいいが、そこから生み出される結果は複雑なほうが面白い。とくにCG、中でも物体の運動はカオス性が高くて、見ているだけでも面白いという。
パラメーターで挙動が変わるように仕込んでおいて、パラメータをちょっと変えて、またランさせる。カオス(複雑系)は決定論的なのでパラメータですべて決まるが、それをちょっと変えただけで結果が大きく変わる。これをすごい勢いで何回も何回も繰り返す。つまり試行錯誤を重視し、細かいパラメータチューニングに落とし込む。
パラメータチューニングに限界を感じたら、ぜんぜん違うモデルに切り替える。プログラムを捨てることも厭わない。プログラムを書き変えたら、またパラメータを細かく変えて、トライ&エラーを延々と繰り返す。
話を聞いていると、アジャイル開発手法的なところもあるようにおもえるが、何かが大きく違うようにも感じる。金子さん自身も、一般向けじゃないので「絶対にお勧めしない」と何度も念を押していた。
さらに、金子開発手法ではバグも厭わない。むしろ「バグを喜んじゃうんですよ!」という。バグがあって予想外の結果が出たときには、そこに面白い切り口があるのではないかと期待して、突き詰めていく。一般のプログラム、たとえば文字処理プログラムがバグったからといって、そのまま進めば文章が自動生成されるようになることはない。しかしシミュレーションでは、狙ってない結果がコンピューターを通すことによって出てくる。「それが非常に面白い!」
これはWinnyでも同様で、プログラムはすごくけっこうシンプルだが、動かしてみると複雑な挙動をする。そこでバージョンアップを繰り返すと、「今度の実装はなんか変な挙動をしてる!」と気付くことがある。そこに、自分の能力を超えるものを新しく発見できる可能性がある。
よくわからない挙動を切り捨てないで突き詰めると、「理屈は良くわからないんだけど、プログラムだけ作れちゃう」ことがある。「これが何で動くのかわかんない、ということがすごく多いです」。
金子さんの話を聞いていて思い出したのだが、「理屈はわからないが、ちゃんと動作するプログラム」という発想は、ダニエル・ヒリス『思考する機械 コンピュータ』(草思社)にも人工知能の将来像として描かれていたことだ。Winnyと人工知能ではずいぶん違うが、金子さん自身が「お勧めしません!」と連呼していたシミュレーション的開発手法で、Winnyのような巨大ネットワークが制御できるのなら、何か可能性はあるのかもしれないと感じないではいられなかった。