ソフトウェア・クリエイション

昨日のエントリに、事前に設計を固めるなんてことはユーザーの意見を無視しかねず、危険であるという話に絡むことで、プログラミングに関しては、そもそも設計とコーディングを分けること自体が何かおかしいという話。


まずは、前川徹の「日本のソフトウェアに未来はあるか」 連載第2回 ソフトウェア開発におけるパラダイムシフトの、「「計画を立てそれを実行する」方式は正しいか」を読むと、下のような図がある。

http://f.hatena.ne.jp/images/fotolife/v/viver/20070422/20070422191219.gif

Hotwired Japan 前川徹の「日本のソフトウェアに未来はあるか」より引用



この記事ではこの図が間違っていることが説かれているのだが、この図にもその先の説明にも、どうも違和感を覚える。

私がプログラムを作るときの感覚は、次の図のようなものである。
http://f.hatena.ne.jp/images/fotolife/v/viver/20070422/20070422191148.png


ウォーターフォールモデルの図と比べると、全然違う。


「要件定義」と「つくりたい」を、「使う」と「保守」を同じ地点だとすれば(そこのところは今回の話題ではない)、私の感覚では「設計」と「コーディング」と「テスト」は不可分で、一緒くたにして「つくる」になる。


感覚的になってしまうが、コーディングとは設計である。もう少し正確に言うと、頭の中にある設計をコンピュータの分かる言語に変換する単純作業がコーディングであり、コーディングとは設計のオーバーヘッドである。そもそも最初からコンピュータの分かる言語で考えていれば、オーバーヘッドがなくなって良い。




仙石浩明の日記 - 「ソフトウェア開発」は「モノ作り」ではないに、この感覚に近いことが分かりやすい文章で示されている。

自動車とソフトウェアを比較するなら、「自動車の設計図」が、「ソフトウェア」(より正確に言えばソースコード) に相当する。「自動車の製造」に相当するのは、ソフトウェアを出荷するときに行なう「ビルド」「コピー」「パッケージング」であろう。


ソフトウェア開発はモノ作りではなく、仮にモノにたとえるならばモノを作るための設計の段階に相当する。そもそもコーディングと設計は不可分なので、コーディング=設計なのある。


と、ここで「コーディング」という言葉が、どうも的を得た用法で使われていないのではないかと思えてくる。コーディングとはコードを書くことだが、コードを書くことは設計のオーバーヘッドであるから、実際「コーディングしている」とは「設計している」と同じことになる。
しかし世の中で「コーディングしている」と言っても、「設計」の意味で取られることはほとんど無いと思われる。
「プログラミング」あるいは「プログラマ」という言葉もほぼ同じである。


そこで、「コーディング」と言う言葉を別の言葉で置き換えるのはどうかという提案をしたい。


「ソフトウェア開発」という言葉はかなり的を得ていると思うのだけど、他の場面で過去にも良く使われてきた言葉なので、「コーディング」を置き換えたことを明示的に示せない。
それに、ぱっとしない。名前なのだから、「Ajax」とか「Ruby on Rails」のように、見た目で「おっ」と思わせないといけない。



「ソフトウェア・クリエイション」というのはどうだろうか。「プログラマ」は、「クリエイター」になる。
(どうもIPAはクリエイターと呼びたがっている節がある)



「クリエイターと言うと、もっと芸術的な分野で使うのではないか」と思われるかもしれない。それで合っている。設計にはある程度のひらめきとセンスが要求されるから、どちらかというと工業的と言うよりも芸術的である。
話がずれるが、「数学は芸術的である」と言うのとは少し違う。数学は芸術的であっても、数学者は数学を作り出しているわけではないので、数学者はクリエイターではない(と私は思っているが、数学者に言わせると違うかもしれない…)。しかし、ソフトウェア開発者はクリエイターである。


あるいは、プログラマとクリエイターを分けた方が良いという意見もあるかもしれない。
Life is beautiful - ソフトウェアの仕様書は料理のレシピに似ている
仙石浩明の日記 - プログラマ 35歳 定年説

論理的な思考

ところで、優秀なプログラマプログラマは止めよう。優秀なソフトウェアクリエイターとは、どのような人であろうか。


ソフトウェアを作るときには、4つの段階がある。(ソフトウェアだけに限らないかもしれない)

  • これをやりたい
  • こうやったらできるんじゃないか
  • やってみた
  • できた(できなかったら、「こうやったらできるんじゃないか」まで戻る)


私のいる環境は、見渡すと優秀なSWクリエイターがすぐに見つかるという素晴らしい環境なのだが、どうも優秀なSWクリエイターは、「これをやりたい」から、「こうやったらできるんじゃないか」に到達するまでの時間が、極端に短い。場合によってはゼロである。
そして、「やってみた」から、「できた」に至るまでの精度が非常に高い。「できなかった」にならない。


「こうやったらできるんじゃないか」から「やってみた」にすぐ移行できるかどうかは、環境に依存する。優秀なSWクリエイターを最大限に活かしたいなら、この間の時間をできる限り小さくできる環境を作ると良いのだと思う。


大学やベンチャーにいると、この時間はほぼゼロにできる(できるが、本当にそうするかどうかは別)。
すると、「これをやりたい」から「できた」に到達するまでの時間が、限りなくゼロに近くなる。やりたいと思った次の瞬間には完成している。


こうなると、論理的な思考が介在する余地がない。結果として、非論理的な思考によって結果が導き出されたかのような感覚になる。
これが、登 大遊@筑波大学情報学類の SoftEther VPN 日記 - 論理的思考の放棄につながるのではないかと思う。つまり、論理的思考を放棄したから良い結果が得られるのではなくて、何らかの行動の結果としてきっかけから結果までの時間がゼロになって、論理的思考が介入する余地が無くなるのではないか、というのが私の考えである。


そうすると問題は、いかに「これをやりたい」から「こうやったらできるんじゃないか」までの時間を短くするかと、「やってみた」から「できた」までの精度を上げるかということになる。



その方法はどうも、論理的な思考をしないことらしい。


論理的な思考には時間がかかるのである。それに人間が行う論理的思考は、極めて不完全である。
これは人間の脳は「直感」とか「常識」とか「なんとなく」といったものを処理するのに特化したプロセッサだからである。


人に「何でそれをやったのか?」と聞くと、だいたい「なんとなく」とか、「当たり前でしょ」とか、「直感だ」とか言う返事が返ってくる。これは論理的でない思考は言葉にできないからで、だいたいの行動は論理的な思考なしで行われていることを示している。
日常の会話などは、完全に「なんとなく」の世界である。これをコンピュータにやらせることは非常に難しい。人間の脳は「なんとなく」を極めて高速に処理できるのである。(人間がこのような脳を持っている原因は、そうでないと社会に適応できなかったからなどの推察ができるが、とりあえずそこのところは置いておく)


人間はコンピュータとは逆に、論理的な思考をするためにエミュレーションを介する。
そして、エミュレーションはどうも非常に不完全で、自分では「論理的だ」と思っておきながら、非論理的な行動を起こす。これは別に特別な場面だけではなくて、日常的に行われている。(この文章も論理的に繋がるように書いているつもりだが、やっぱりどうしても、非論理的になってしまう)
人間は論理的な思考はヘタなのだ。



と、つまり、論理的な思考なしに結果を出すにはどうしたらよいか、ということになる。
結果を出すまでの工程を、「常識」だけで構成できるようにしてしまえばいい。人間の脳は「常識」を極めて高速に処理できるから、膨大な数の「常識」を組み合わせて、結果を得るためのフローを構成するなどという作業は、瞬間的に行える。
ちなみに、これをエミュレーションされた論理的な思考でやると、やたら時間がかかる。それにそのエミュレーションが不完全であるから、間違いが生じる。


TCPを待ち受けるにはsocket()してbind()してlisten()するのは当たり前だし、socket()は失敗したら-1が返るのは当たり前だし、エラー処理するのは当たり前だし、bind()の引数はコレコレなのは当たり前だし…この場合これを関数にまとめたいのは当たり前だし、その関数の第一引数は待ち受けアドレスで、第二引数はポート番号にするのは当たり前だし、返り値がint型のは当然だし…
(これは脳内活動のイメージ。もちろん他の要因が多様に絡んでプログラムはできていくけど、それさえも常識ならOK)


というわけで、常識の連鎖でプログラムが完成していく。と言っても、この例は局所的すぎて「設計」という感じではないが…(ちなみに上の文を書くのに、私は「あれ?」と思ってmanページを開いたりした。人間の脳は「第一引数が」などという論理的な記憶はヘタである。そういうことはコンピュータの記憶能力に頼れば良く、人間は必要なものと結果として得られるものさえ「なんとなく」分かっていればいい)


もちろん、この常識の連鎖を論理的に意識することはない。意識できるのは、「なんとなくできた」だけである。


これができると、晴れて「何でそれをやったのか?」「…まぁなんとなく」となる。これは人間の脳が自分の得意な方法(非論理的な思考)で物事を処理できた証拠である。


…特に登さんの日記を意識したわけではないが、似たような話になってしまった。やっぱりそういうことなのである。


では、物事を「常識」としてとらえられるようにするには、どうしたらいいのか。
…そこのところは、良く分からない。それが分かれば苦労はしないと言うか。


結局訓練を積むしか無いような気もする。