論理的思考の放棄
僕は、1 日に少なくとも 3,000 行程度、多く書くときで 10,000 行以上のプログラムを書くことができる。その結果、多い月で 10 万行 / 月くらいである。なお、言語は書くソフトウェアの性質上、大半が C 言語である。
また、プログラミングにはバグが付き物だが、ここ 2、3 年の間は、発生するバグの数を極めて少なく保つことに成功している。
とても大きく複雑で、かつレイヤ的に OS に近い処理をたくさんやるプログラムを書く場合は、プログラミングをするときでも、事前の設計が極めて重要となる。設計をうまく行わないと、後になって全面的に書き直しをしないといけなくなったり、パフォーマンスが低下したりする原因となり、開発者の苦痛の原因となる。
当然のことながら、これまで書いたいくつかの大きく複雑といえるソフトウェアの大半の設計も、自分で行った。いかなる場合でも、設計は、最初の 1 回目で確定させ、それ以降、プログラミングの作業に入った後もその設計を後悔したり修正しないといけなくなったりするようなことは、極力起こらないようにしており、その結果、そういう惨事は発生していない。
このようなことは、僕が大学に入学してから現在までの 4 年間ずっとやってきたことだが、同時にソフトウェア開発だけでなく、大学の単位の履修 (大学では普通に進級し特に留年等することなく卒業できた)、学術活動 (4 年間で、学会で 4 件の招待講演、1 件の受賞、5 件程度の他大学での招待講演を行った)、ベンチャー起業と経営などいろいろなことを高い密度で行ってきた。同時に多数のことを行っても、能力不足による支障はほとんど出なかった。
自分の能力は、上記程度であるが、能力というのはこれくらいが標準的なのだろうと思っており、自分の能力が特別高いということは思っていなかった。しかし、どうやら、いろいろなソフトウェア開発者の話を聞いたり、記事を読んだりしてみたところ、上記の程度にできる人はごく少数らしいということに、最近気付いた。
いろいろ調べたの結果によると、普通の開発者の作業能力は、1 ヶ月数百行程度、多い人でも 1 ヶ月で 3,000 行程度らしい。"1 日、数百行" ではなく、"1 ヶ月、数百行" である。もちろん職業プログラマーの話で、仕事の他に、毎日大学へ行ったり自分の会社を持っていたりしている訳ではなく、プログラミングに専念していても、この程度だという。イメージしていた現状と全然違う。
そこで、ここ 4 年間くらい、自分自身の能力の根源について探求を重ねると共に、いろいろなことを調べているうちに、普通の人の考え方と、自分の考え方とが大きく乖離しているらしいという事がわかった。
このようなことだけを書くと、「自分にはそういう能力には縁が無い」とか「少しできるからといって自慢するな」とか「偶然だ」とか思う人がいるかも知れないから、これから、誰でも少し考え方を変えるだけで、上記のような能力・作業効率を獲得することができるのだということを伝えたいと思う。そうすれば自分一人ではなく、みんなにとって有益だと思うからである。
まず最も重要な前提知識として、以下の 3 つのことを遵守することが必須である。
① 努力しないこと
② 論理的に考えないこと
③ 頭を使わないこと
いきなり上のようなことを読むと、普段言われているようなことと正反対で、驚いたり疑ったりする人がいる (というか、大半の人がそのようである気がする)。我々は、普段、社会通念として、① 努力すること、② 論理的に考えること、③ 頭を使うこと、といったようなことをいつも言い聞かされているのだ。そのような誤った「指導」を小学校〜就職〜退職までの間 (つまり人生のほぼすべて) で受けるので、全く自分の能力に気付かないまま、一生終わるという人もいるようだ。
特にコンピュータプログラミングは、論理的な仕事の極端な例なので、プログラミングをするときの開発者の頭の中はとても論理的に思考しているのだろうと思われるのが通常であり、上記の「② 論理的に考えないこと」にとても大きな違和感を感じる人が多いと思うので、まずこの点について説明する。
最近、色々話してみると、「コンピュータに関する技術的な仕事 (特にプログラミングやソフトウェア設計など) は、論理的思考で行うのが良い」と誤解している人が結構いることを知った。
確かにプログラミングなどはコンピュータに対する指示をプログラミング言語を用いて論理的に記述する作業なので、その作業中は、「論理的な思考」をすればするほど能率が上がるというように考えてしまうことは自然である。
しかし、実は正反対である。
複雑で難易度の高い作業においては、例えコンピュータプログラミングなどの超論理的な結果を得るための作業でも、「論理的な思考」はほとんど不要である。
ここで「論理的な思考」の定義を細かくすることはしない。そもそも、細かく定義しようとすること自体がすなわち「論理的な思考」である (論理的に、厳密に定義しないので、あなたの頭の中で、「論理的な思考」というイメージを自在に思い浮かべれば良い)。
僕は脳科学について詳しくない (今勉強を始めようとしている) ので、以下に書くようなことは、論理的・(既存の) 科学的には間違っているかも知れない。だが、論理的な思考をしないで欲しいという意図を説明するために書くのだから、論理的に間違っている点については目をつぶって欲しい。
プログラミング処理を行うのは、当然、人間である。人間は、プログラミングを行うことによって、実現したい処理内容の指令を論理的に記述し、コンピュータに書き込む。これがプログラミングである。
コンピュータに対する論理的な指令という目的があるため、プログラミングは、「論理的な仕事」であるというように思ってしまい、プログラミング作業の全部において、人間の側が論理的な思考でもって作業を行ってしまうのである。実は、プログラミングの作業のほぼすべてにおいては、論理的な思考というのはほぼ全くといって良いほど必要無い。
例えば論理的でない作業について考えてみる。音楽を聴いて「これは良い」と思ったり、映画を観て感動したりするといった作業は、論理的思考というよりも、どちらかというと直感的な作業である。音楽を聴いていて、「この周波数やパターンの音色が●●ミリ秒ごとに連続して現れる。これは良い」というようにいつも論理的に思考していては、音楽をちゃんと聴くことはできない。もっと直感的に、「なぜか上手く言葉で正確に論理的に表現することはできないが、この音楽は良い」というような知覚が発生する。
コンピュータのプログラムを読んだり、書いたりするといった、論理的な記述方式を対象とする作業でも、論理的な思考というのは、音楽を聴いたりするときと同様に、ほぼ全く必要無い。
論理的でない考え方をすることが重要なのだが、ここでは仮に「感覚的な思考」とでも書いて表現することにする。
一応、現在の科学では、人間の脳は、コンピュータのようなものであるということになっている。しかし、当然フォン・ノイマン型のコンピュータ (現在の普通のコンピュータ) のアーキテクチャではない。もっと効率が良い方法で色々な作業を行うことができるのである。
現在のコンピュータは、論理的な処理しかできないが、人間には感覚的な思考処理が行える。人間のアーキテクチャと、現在のコンピュータのアーキテクチャは、全然効率が違う。ところが、なぜかプログラミング作業をやっていると、対象となるコンピュータが論理的処理しかできないので、人間の側も、いつの間にか、無意識のうちに、論理的思考しかできなくなってしまう。ここに、大きな落とし穴がある。
人間のアーキテクチャは感覚的思考によって動作し、その処理能力はとても高い。そのため、人間は、努力すれば、感覚的思考の機能の上に、普通のコンピュータが行っているような論理的処理を行う環境を仮想的にエミュレーションし、その上で色々な論理的プログラムを実行することができる。例えば、電卓を使用しなくても数字の暗算ができたり、短いプログラムであれば、コンピュータに入力しなくても、頭の中で実行することができる。
だが、人間の感覚的思考機能の上でエミュレーションされた論理的処理機能は、所詮エミュレータ上のようなものなので、実マシン (人間本体) と比較すると、とても処理が遅い。オーバーヘッドが大きすぎるのである。あらゆる方式の処理を瞬時に同時実行することができる人間の頭脳がせっかくあるのに、論理的処理用の仮想環境を脳の中で構築し、その上で物事を考えるから、効率が悪くなる。
これが、普通のソフトウェア開発者が 1 ヶ月にわずか数百行 〜 3,000 行程度しかプログラムを書くことができないという原因になっている。人間の中に構築することができる仮想の論理的処理エミュレータは、性能が低すぎるのである。
そこで、論理的思考を極力排除し、人間の本来の得意な思考方法である、感覚的思考機能を用いて、色々な作業を行うことにすれば、とても効率的になる。
ここで、多くの人は、この人間が持っている超高性能な「感覚的思考機能」は、例えば作曲や小説の執筆、絵画の制作などの芸術的な創作作業でのみ使用することができ、プログラミングとか設計とか計算とかそういう類の論理的な作業では使用することができないと誤解してしまっている。論理的に考えると、確かに論理的な作業は、論理的な基盤の上でしか行うことはできない。
だが、僕は、プログラミングや、その他の論理的な作業についても、超高性能な「感覚的思考機能」のほうを直接用いることにより、わざわざ脳内論理回路エミュレータを用いなくても、効率良く処理できるということを知っているので、そっちを使っているというだけである。
実際のプログラミング作業を例にして、解説する。
まず、だいたいこういうソフトウェアがあればいいなあとか、このような機能を付ける必要があるなとかいった、とても抽象的なことを思い浮かべる。この際、「絶対に論理的に考えないこと」が必要である。論理的に少しでも考えてしまうと、途中までうまくいっても、それが壊れてしまい、最初からやり直しになるので注意する。感覚的な思考でもってこれを行うのである。
次に、だいたいイメージができたところで、心の中に、ソフトウェアの設計図やデータ構造といったものを思い起こす。ここで注意するのは、「絶対に論理的に考えて設計をしないこと」である。徹底して、感覚的な思考でもって設計する。
ここまではすべて頭の中で処理することができるので、別にコンピュータがなくても良い。電車の中でも授業中でも運転中でも行うことができ、便利である。
上記までで、ほぼすべての作業は完了している。残された仕事として、最後に、コンピュータに対して、プログラミングを行う必要がある。これには物理的なコンピュータとキーボードが、どうしても必要である (紙にペンで書くと手が疲れるし、キーボードを打たなくてもコンピュータに入力することができる便利で高品質なデバイスはまだないためである)。
プログラミングの目的は、コンピュータに処理を実行してもらうことなので、コンピュータにプログラムを入力しないと意味が無い。そこで、仕方無くコンピュータの前に座る。
コンピュータの前に座って、キーボードの上に両手を置けば、後はあまり考える必要はない。自動的に手がキーボードを打ち、プログラムを入力して完成させてくれる。この処理は一切、論理的思考では行われていないので、途中で論理的思考を行うことは厳禁である (作業の邪魔になる)。ひたすら何も考えない。
入力エラー無く手を動かせる速度には、物理的な限界があるようだ。多くても 1 日 1 万行程度くらいである (それでも、入力エラーは頻繁に発生する)。この作業は、エネルギーが必要なので、食事をちゃんと採ることや、好きな飲み物 (100 % オレンジジュースが良い) 等を机の上に用意しておくことが推奨される。
プログラムがひととおり完成したら、テストしてみる。上記の過程でも、やはり若干のバグが発生することがある。その大半は、コンピュータへのプログラムの入力中に発生する脳内での変換エラーのようである。脳内にある感覚的なプログラムの構成データを、コンピュータが理解できる論理的なプログラミング言語のソースコードに変換する部分で、若干間違うことがある。しかしこれも回数を重ねる度により正確になっていくので、心配する必要がない。
何度テストしても、後になってバグが出てきてしまうこともある。論理的に考えれば、上記のような正確なプログラミング作業の後には若干の誤りも無いはずなのだが、これは論理的な処理ではないので、なぜバグが発生してしまうのかは、論理的には分からない。これは仕方が無いものと考えて、バグを直せば良い。それでも、普通のプログラマーが論理的な思考でプログラムを書く際と比較して、バグの発生件数は大幅に減り、楽になる。
上記のような方法は、恐らくプログラミングだけでなく、色々な物事の設計や、文章の執筆、自動車等の運転などおおよそほとんどの作業で活用することができるのではないかと思う。
しかもこの方法は、一切努力をしたり苦労したりする必要が無く、とても気楽である。
なお、何人かの、作業効率が良いコンピュータ関係のことをやっている人と話したところ、大体は上記のようなことを (表現は異なるが) 普段から実践しており、それによって、平均的なレベルと比較して遥かに高い能力で作業をしているようである。
最大の問題点は、せっかく上記のようなことを読んでも、大抵、まずは頭の中にある論理的思考が、「上に書いてあるようなことは論理的に有り得ない」というように論理的に考えてしまい、いつまでも論理的に考えてしまうことがあるということである。
論理的に考えないほうがうまく行くと聞いても、それが正しいかどうかやってみずに、論理的な正誤判断をしようとして、「論理的に考えた結果、まさかこんなことはないだろう」という論理的な考えに従い、いつまで経ってもやってみないということがある。それはとてももったいないことである。
そこで、今後時間があるときに、日記か何かで、さらにこのことについて詳しく解説し、できれば誰にでも利用してもらって役に立つ程度にまとめたいと思う。
※ コメント書く前に http://d.hatena.ne.jp/softether/20070325 もお読みください