ページへ戻る

+ Links

 印刷 

OT​/0002 :: OSASK計画

osaskwiki:OT/0002

Page Top

0.重要なこと anchor.png

  • 以下に書いてあることは「よいこと」ではありません。速くて小さいプログラムを作るために役立つ思想が書いてあるだけであって、これはただの技術なのです。何が正しいのかとか、ここに書いてあることは正しいのかどうかではなくて、開発をしているときだけこういう気分になりさえすれば、小さくて速いプログラムが誰でも作れるようになりますよ、とそれだけのことなのです。小さくて速いことよりも、他のことが重要なことは十分にありえます(仕事の上ではまず納期が一番重要、なんてことはあるでしょう。・・・そんなときはどんな犠牲を払っても納期が優先です。納期に間に合うと分かってから納期に遅れない範囲で以下の努力をするのはとてもすばらしいです)。それをはき違えてはいけません。
  • 以下は平均するとまあまあ効果のある「技術」であり、例によって開発思想的な面が強いのでほぼどんなプログラミングにおいても活用可能なものです。効果の程度はまちまちですが、うまくいったときは劇的であり、たいていは空振りです。
  • 開発時間に余裕がないときは空振りのリスクは大きすぎるので、素直に既存の技術を活用するほうがいいでしょう。
Page Top

1.車輪の再発明 anchor.png

  • これは既に発明済みの技術を知らない人が、あとからまた同じ技術を発明してしまう現象(行動?)を指し、同じ物を苦労して発明しても意味がないから、先人の技術は積極的に学んで、発明の才はその上に新たな何かを積み上げることに発揮するべきだ、という格言です。この格言の正しさには説明の必要もないでしょう。とてもよい格言だと思います。
  • しかし一方で、この格言は多くの進歩の機会を奪ってきたと思います。
  • 科学の世界では追試という考えがあり、つまりある人が行った実験を再びやり直すことがあります。これは本当にその実験結果が正しいかを確かめるためのものです。数学の世界でも、既に証明済みのものに対して別解を探すことはあります。追試によって新しいことが分かったり、別解を求める過程で新しい考え方が生まれることはよくあることです。
  • プログラミングにおいて追試や別解の探索のための有力な方法の一つとして、とりあえず自分でも作ってみるというのがあると僕は思うんです。もちろん、既存の方法を学んだ上でそれとは違う新しい方法を探せればそれに越したことはないのですが、どうも学んでしまうとそっちの素晴らしさに圧倒されてしまい、自分で考えるときはその発想からなかなか抜け出せません。だから、何も知らないまま車輪の再発明に終わってしまう危険があるのは分かっていても、とりあえず自分なりに作ってみるしかない気がします。それで結局既存のものと同じものしかできなければ、まあ既存のものをそのまま使うしかないでしょう。もし既存のものと違うものができれば、どっちがいいかを比べて、いいほうを使えばいいと思います。
Page Top

2.再発明でしかなかったとき anchor.png

  • 運良く既存のものよりもいいものができたら、それはそれでまったく申し分はないのですが、まあたいていは既存のものよりも劣ったものしかできないでしょう。よくて同じくらいのものでしょう。
  • 数学で誰かが見つけた解法をあとから見つけてもなんの自慢にならないのと同じで、この場合は誰にも自慢できません(たまにそれを自慢している人がいますが、確かにそれは失笑ものです)。でも自分では改良解が見つけられなかったという証明にはなりますし、それだけ既存の解法がベストである可能性が高まったわけです。そのぶんだけ世間に貢献していると思います。少なくとも、時間の無駄だからと何も考えずに既存のものをそのまま使った人よりは貢献しています(もちろんこの人が、車輪の再発明の精神どおりに、その節約した時間で別の何かを発明してくれればそれで大貢献なわけですが)。
Page Top

3.無知の利点 anchor.png

  • 無知であることはもちろん一般的には恥ですが、しかし知らないからこそいろいろやってみられるのであって、正攻法を知ってしまえば新しい方法を思いつけなくなるものです。そういう意味で、無知はわずかながらアドバンテージであるともいえます。
  • (それともそんなのは僕だけであって、世の中の人は知っていてもそれに影響を受けることなく斬新な方法を考えられるのだろうか・・・。)
  • とにかく僕は、まるでパターンで試験問題を解くような、ほとんど何も考えないパターンプログラミングは悪だと思っています。もちろんそういうことは知識や経験が豊富だからできるわけですが、こんなことをしていたら、そりゃまあ有益なプログラムをたくさん作ることはできるかもしれませんが、新しいアルゴリズムはなにひとつ生み出せません。それはそれでプログラミング世界の機会損失じゃないかと僕は思います。
  • いや本人が望んで機会損失しているのならそれはそれでいいのですが、他の人がチャレンジしているときに、それに対して車輪の再発明だからやめなよというのは、有害なのではないかなと、僕は思います。
Page Top

4.競争 anchor.png

  • 性能としては似ているけど違うものができる場合もあるでしょう。その場合は既存のものとの競争状態に入ることができます。これは非常に有益で、お互いに相手の技術を参考にできるなら、結果的に非常によいアルゴリズムに到達できるでしょう。
Page Top

5.まとめ anchor.png

  • 新アルゴリズムの開発は、成功すれば劇的に速度やサイズを改良できるものです。また十分にセンスを持っていれば(=つまりプログラミングとは既存のアルゴリズムを組み合わせることだけではない、というふうに考えることができるなら)あまり既存の技術を知らないでいるほうが、既存の人たちが見過ごしていたシンプルでエレガントなアルゴリズムは発見しやすいでしょう(複雑でゴテゴテしたアルゴリズムなら、知識過多状態でも簡単に思いつける・・・しかしここではそういうアルゴリズムは期待されていない)。
  • 無知でがむしゃらにがんばる人を「それは車輪の再発明だろ」と馬鹿にする人がいますが、それは有害で、できることなら気が済むまでやらせてあげるべきなのです。もちろん、結果的に車輪の再発明になってしまう場合はあります。もし車輪の再発明になっていることに本人が気づいていなければ、それは是非指摘してあげてください。
  • 問題分野によっては、これ以上簡単なアルゴリズムがあるとは思えない、なんていう場合もあるかもしれませんが、しかし何事もやってみるまで分からないのです。OSはだいたいこれくらいの大きさ、速さになるはずだという一般的合意をあっさりと、しかも劇的に打ち破ったのがOSASKであって、しかもそれは既存のOSを分析して生まれたものではなく、OSはどんなサービスを提供するべきか、それはどのように提供するべきかを先入観なしに考えた結果なのです。既存の技術を知ってしまうと、どうしてもその素晴らしさに目が行ってしまい、新しいものを考えようとしなくなります。自分ではどうやっても超えられない気がしてしまいます。それは損です。行き着くところまでやってみないと何事も分かりません。
  • 今無知でいる人で、しかもそれなりに時間があるなら、是非できるだけ少ない知識で自分の問題を解決するプログラムを考えてみるといいでしょう。もちろん、実力不足でどうしようもなくなることはあります。そんなときはその部分だけちょっと勉強しましょう。また、そのときにすごく良さそうなアルゴリズムを知ってしまうかもしれませんが、しかしとりあえずはあえて自分の方法にこだわり、テストとしてどちらがいいかを比べてみましょう。悪そうに見えて、実はよかったなんてことはよくあるのです。
  • 自分の思いのたけをコードにぶつけ終わったら、今度は既存のアルゴリズムをじっくり理解しましょう。自分が思いつけなかった部分がきっといくつかあると思います。なぜそんな仕組みが必要なのかとかも、一度同じ問題で苦労した経験がありますから、納得しやすいでしょう。もし自分のほうがいい方法だったと思う部分があれば、それを既存のアルゴリズムに組み込んでみるといいでしょう。たいてい好ましい結果が得られます。
Page Top

こめんと欄 anchor.png


Last-modified: 2009-11-21 (土) 00:00:00 (JST) (319d) by lina