2009/02/12(木)プログラムを組むのに必要なこと
プログラミングとはなんぞや。とかぼんやりと考えてること。
seedsのapplyでneedsをsolveすること?
プログラムを書くときの思考を思考してみたところを、適当にだらだら書いた。
今まで自分が作ってきたものに関して時系列を見れば、プログラムは次のような順で形成されていく。
- 要求「こうしたら便利、こうしたら楽しい!」
- 分析「そうするには何が必要?」
- 設計「どうしたら美しい?」
- 開発「実際に作ってみよう」
最初は「設計」の部分がなかった(というか書きながら考えてた)気がするけど、ここ3年くらいは一通り考え終わらないと書き始めなくなったかな。
要求はそこらにたくさんころがっている。自分の計算機の使用経験だったり、誰かのぼやきだったり。
分析には経験で培われるだろうセンスが必要だと思う。説明されれば簡単な話だけど、それを自分で見つけ出すのが難しいのかもしれない。隣に住んでるあの子とお喋りしたい、という要求から糸電話というソリューションは時代遅れかもしれないが、まぁなんでもいい。糸電話を作るには何が必要か。紙コップと糸であろう。それを見つけ出すのが「現実に見えるわけではない部品を想像して組み立てなくてはいけない世界」においては難しいのかもしれない。同時にそれを思いつけるようになるための土台も必要になる。「紙コップと糸」という答えにたどり着くには、紙コップというものの存在と糸というものの存在について知っていなければならない。
設計。つか、「美しい」ってなんぞ(笑) エレガントだとかスマートだとか言われるが、この感覚はなかなか他の言葉であらわし難いなぁ。"必要十分であること"かなぁ、なんて思ってるけど。まぁ、ここはすっ飛ばしても動くもんはできるかもしんない。ただ、規模がでかくなるととたんに苦しくなるわけで、後で拡張することを見越しておくことが必要になったりもする。要求に沿って何かを作ってるのだけど、人間は欲深くて、どんなによい環境が与えられても満足するということはそうそうない。この要求が実現した後、どんな要求に変化するのか、どんな要求が加えられるだろうかと想像しながら形作る。そうすることで仕様変更に柔軟なプログラムが作れる。それは、要求者の立場に立たないとわかりにくいことだけど。
開発はコーディングのこと。全体通して開発なんだけどまぁ、適当な語がみつからなかったので。設計されたものを、使っている言語でどう実現するか。うまく翻訳したい。しかし、結局コーディングは翻訳作業に過ぎないのだ。言語の勉強をするときは、コーディングこそがいい練習になるのだけど、プログラムを作るというのはむしろその他の部分が大きいと思う。
だから要するに重要なのは分析と設計。何を使ってどう解決すればよい。それを思いつけるかどうか。現実世界で必要なものは材料で、プログラミングで必要なものとは機能だ。しかし、実は現実世界で必要なものも機能なのだ。
糸電話を作るには糸とカップが必要だ。でも、本当に必要なのは糸とカップではなくて、「空気の振動を取り出す機能」「取り出された振動を伝える機能」「伝わってきた振動を空気の振動に変換する機能」が必要なのだ。しかし、そこまで考えて糸電話を作る人間はそういないだろう。もう、糸電話がどんなものであるかを知っている。それは、機能分割しなくても使用できる道具として解決される。つまり、アルゴリズムとして確立されている。けど、電子の世界では、今まで自分が知っているアルゴリズムたちが通用しない。慣れるまで、このことを意識的に考えるのが難しいのかなぁと思ったりもする。
音声チャットを作るには何が必要なのだ、実は糸電話とおんなじなのだ。音をデータにする機能、データを他のコンピュータに伝える機能、データを音にする機能あたりだろうか。音をデータにする機能はたぶんあるだろう。サウンドレコーダというソフトがある。データを他のコンピュータに伝える機能はたぶんあるだろう。インターネットエクスプローラというソフトがある。データを音にする機能もたぶんあるだろう。私のコンピュータはよくエラーを出すし音も鳴らす。後は一つ一つの機能について、使い方を本なりgoogleなりで調べていけばいいんだよね。最近はライブラリも豊富で、便利な時代になったものだ。
ただ、「そういう機能が存在する」ということを知っておくことは大事で、DirectXなんか使ってゲーム作ってると、Direct3Dの機能をよく知らないがために遠回りしたり、パフォーマンスの悪いものができたりする。情報を幅広くそろえておかないといけない。たとえば音声チャットなんかは経験的に材料がそろえられることがわかってるからいいけど、もしコンピュータから音が鳴ってるのを知らないと、そもそも音声を扱えるのかどうかがわからないわけで。言語にせよライブラリにせよOSにせよ、自分が今から住む世界のことはよく知っておかないといけないみたいだなぁ。
プログラムを組むの必要なこと。
それは、知ることと考えること。