登 大遊@筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記 このページをアンテナに追加 RSSフィード

Daiyuu Nobori's SoftEther VPN Diary since 2004

登の Web サイト: http://dnobori.cs.tsukuba.ac.jp/

mixi : http://mixi.jp/show_friend.pl?id=672294
Twitter : http://twitter.com/dnobori/
Facebook: http://www.facebook.com/dnobori

日記などへのリンク集
IKeJI さん | Cedar さん | Mayaqua さん | thisjun さん
bakueikozo さん | mugen さん | 分散計算の神林君 | 榮樂先生 (hdk) | 吉田戦車 (ceekz) | 高木先生 | ron さん
AC の古澤さん | AC の TAKAO 君 | AC の NIES 君 | AC の古橋君 | AC な wakatono さん | AC のいのひろ君
AC な三戸君 | AC な柴田君 | AC の小野君 | AC すぎる松本君 | AC な小西君 | AC な google の及川さん | AC な tomocha さん
まつもとゆきひろ氏 | 板野先生の blog | 新城先生の最近の fj への投稿 | つくばあさひなあんてな | hatena 筑波大学 AC リング

日記でよく出てくる「AC」(もともとは筑波大学用語) について詳しくは ここここ をお読みください。

 | 

2007年3月24日 (土)

論理的思考の放棄  論理的思考の放棄を含むブックマーク  論理的思考の放棄のブックマークコメント

僕は、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 もお読みください

スプートニクスプートニク 2007/03/25 04:05 興味深い視点だが、単純に経験量(ストック)とか向き不向きの差とも考えられるんじゃないかな?
論理的思考とは意識化しておこなっている作業であり、上記で指摘している“脳の感覚的思考”とは無意識的作業(所謂、“沸いてくる”とか“降ってくる”という感覚に依存する作業)と考えられるが、要は、意識的作業ではなく無意識的作業のほうが効率が良いということだろう。
 例えていうなら、車の運転にしろ文章にしろ慣れないうちは一々手順やルールを考えて行動に移すといった意識的に行うが、慣れてくればそういう中間的作業をすっ飛ばして行うようになる、つまり無意識的に行えるようになるので、登君の言う「論理的思考」を介さないで行うようになるということではないかな?

興味深い文章を読んで、いくつか沸いてきたものがあったので、コメントとしておきます。
深夜ゆえ、的外れなことを書いている可能性もあるが、その折はご容赦くださいm(__)m

softethersoftether 2007/03/25 04:07 そのような文書化して解説する作業が論理的思考です。しかし文書化しないとblogには書けないので、その時点で情報の欠損が生じています。”単純な経験量・向き不向きの差” ではありません

ceekzceekz 2007/03/25 04:29 「努力しないこと」は「苦労しないこと」じゃないかな?日本の社会通念上努力と苦労は同意ですが…。

softethersoftether 2007/03/25 04:34 努力しようとするから、苦労することになり、しかも期待していた成果が得られないことがある。努力しようとしなければ、苦労することはなく、かつ常に期待していた成果を得ることができる。
このことは実際に試してみないと分からないが、多くの場合、努力しないことによってさらに悪い結果が生じるという恐怖心から、試すことができないことになる。
また、「努力しないこと」を「楽をしようとすること」「何もしないこと」と同じであると誤解するとうまくいかない。

ceekzceekz 2007/03/25 04:45 言いたいのは、本当の努力は無意識にするもんじゃないのかと。
とおもって辞書を調べたら、苦労してやることを努力というんですね :(

スプートニクスプートニク 2007/03/25 04:45 なら、プログラムを書くのも論理的思考ということになるよ

softethersoftether 2007/03/25 04:50 そのために、多くのプログラムは、人間が意図した通りに動かないという結果になる。キーボードを通じてコンピュータに物理的に入力する必要がある以上、論理的思考は完全にゼロということにはできないけれども、可能な限りゼロに近づける、これがコツです

handahanda 2007/03/25 04:51 実際のプログラミング作業以下のくだりで、(論理的に考えずに)「ソフトウェアの設計図やデータ構造といったものを思い起こす」、というのができそうもないんですけど、その変を無意識でできるようになれってことでしょうか。それって天才にしかできないんじゃないかと。

softethersoftether 2007/03/25 04:54 それを普通の人が諦めずに、同じくらいのことができるようになる方法を伝えたいと思って、論理的な言語を使った表現方法である文章としてこれを書いたのですが、その時点で情報量が削減されてしまうことが、自分にとっての最大の難題です

shariasharia 2007/03/25 04:57 脳内で、どのように言語変換しているかが知りたいです。

また、努力しないの件はちょっと誤解が発生するかも。
英語を理解するのは、どう考えても努力なしには難しい。
とても楽に、習得する方法を考えることは非常に正しい、だけれども、
個人的にまったく興味がもてない → しかしおぼえなければならない局面に出くわす
というときに、つまり自分を広げなければ通用しないことがわかったときに、どうやって広げればいいのかについて、ちょっと障害を与える気がします。

C言語がデファクトでなくなることは、当たり前のように多分どこかで起こると思うのです。これまでオランダ語がデファクトだったのに、英語がデファクトになったように。
論理化しないことは、多分とても重要なファクターだなと思うのですが、シュリーマンの言語取得のフローを見ていてとてもうなずけるところが多いのですが、問題はどうやって身に着けるかの部分でしょうか。
 これが解決できれば、多分、みんなの将来は明るい!
 それが解決できないからみんな努力するのだと思います。

softethersoftether 2007/03/25 05:03 プログラミングのとき ”脳内で、どのように言語変換すればいいか” を知っていますが、現時点で、論理的記述言語である言葉を用いて文章化することが困難です。だからプログラミングの分厚い良書というのは何十冊もあるが、それを読んだからといって、なかなかわからないわけです

softethersoftether 2007/03/25 05:06 何かを習得するために、最初は ”努力する” ことから入るのが良いのかも知れません。その結果、努力することによって習得することは不可能であるということに気付き、努力するのを止めることになります。このとき、大抵の場合は習得することを諦めるようなのですが、そうではなく、努力しないでその対象物の本質を知る、即ち自分の思考プロセスにおいてその対象物への関数ポインタを獲得して保持するというとても簡単な作業を行えば、習得したことになると思います

shariasharia 2007/03/25 05:15 >そうではなく、努力しないでその対象物の本質を知る、即ち自分の思考プロセスにおいてその対象物への関数ポインタを獲得して保持するというとても簡単な作業を行えば、習得したことになると思います

この理解が非常に難しいですよね(^^;
本質的な理解ですよね。それができなければどんなに努力してもだめである、という話だと思います。それはとてもよくわかります。
でも、どうしたら、みんながそれができるようになれるのかが、すごい大切なのだとも思います。

MalanMalan 2007/03/25 06:10 >プログラミングに専念していても、この程度だという。イメージしていた現状と全然違う。
趣旨からずれますが、職業プログラマよりも趣味でプログラマやってる人のほうがハイレベルだったりすることが多々あります。きっと趣味でやってきた人が職業にすると、平均レベルの低さに愕然とすることも少なくないんじゃないかなー、とか。

shoji12shoji12 2007/03/25 10:34 私の7年間の平均値は、2500行/月でした。(仕様書作りからデバッグまで含む)
コーディングだけだと、2000行/日が最高記録です。
これだけでも、あなたがいかに非凡なACかということがよく判るでしょう。
特に、状態せんい図を必要とする場面での値だから、なおさらです。
ギネスブックに申請してみれば?

hamastahamasta 2007/03/25 10:43 こんにちは。 とても興味深い話だと思いました。
と同時に、典型的な天才肌の文章だなぁと。
多分平均レベルのプログラマから見たら、このエントリを読んでもわけがわからないと思います。そして、ハイレベルなプログラマは、まさにそうだと納得するのだと思います。

両者の認識のギャップを埋めるにはどうすればいいのか?
思考を文章化しようとすると困難なのですよね。
そこで恐らくですね、過去の行動を文章にすればいいんです。

プログラムに興味を持ち始めてから今まで、どれくらいプログラムに関わることに時間を費やしてきたかその行動を文章化するんです。
特に、小学生〜高校生くらいの間の時期が重要だと思います。
自分にとっては当たり前の行動でも、第三者から見たらあり得ないと思う行動をしている事があります。

例えばですね、ネットに詳しい人が、最近ネットを始めた人に「なんでそんなに詳しいの?」と聞かれたとします。
そこで行動を答えます「1日3時間×10年くらい、ネットをやってるかなぁ。パソコン雑誌とかも読むよ。週アスとねとらんとか。」
すると、3×3600=10800時間になりますね。
普通の人はここで驚くんです。あり得ないと。 でも、ネットが好きな人ならこれは普通です。

ところで、この「過去の行動を文章化する」を先に書いてしまうと、
>「さらにこのことについて詳しく解説」
のほうがぼやけてしまう可能性があるので、もし余力があれば、、、お願いします。
次のエントリも期待してます。

umiumi 2007/03/25 12:04 人間とコンピュータのアーキテクチャの違い辺りは面白かったし、プログラミング的にも科学的にも重要な観点ですね。

osakajin-intokyoosakajin-intokyo 2007/03/25 13:25 どうも。
とても興味深い内容なので楽しく読ませて頂きました。

“1つだけ”、話の展開において気になるところがあります。

それは、この話をする上での「前提条件」として、
『プログラムを書くための環境はxxx』と言うことを定義しない限り、
説得力どころか、整合性を維持できないのでは?。

>僕は、1 日に少なくとも 3,000 行程度、多く書くときで 10,000 行以上の
>プログラムを書くことができる。

>いろいろ調べたの結果によると、普通の開発者の作業能力は、
>1 ヶ月数百行程度、多い人でも 1 ヶ月で 3,000 行程度らしい。

この違いを、

プログラムを、
「感覚的思考」でつくるか、
「論理的思考」でつくるかの「違い」に、

答えをみいだしているところに若干、無理があるのではないでしょうか。
私自身も、「感覚的思考」にプログラムをつくる方が良いモノができ、
「作業効率」もはるかに良いと思っていますが、

『普通の開発者』と定義されている方も、
「プログラム」をつくる『環境』さえ整っていれば、

私個人の意見としては、
一日、何万行という数字は特別難しいものではないのではないかと思います。

ただ、
残念ながら「職業プログラマ」は社会のしがらみにより、
結果として「論理的思考」を余儀なくされるのでないでしょうか。

つまり、
一人で「企画」から「仕様」から「プログラミング」までをこなすのであれば、
誰でも「感覚的思考」で効率よく作業すると思いますが、

企業で、1プログラマーとして仕事をするのであれば、
それこそ同じプロジェクトのメンバと認識を一つにするために、

プログラムを「論理的思考」でうんぬん「以前」に、
チームの認識を一つにするために「論理的思考」が不可欠であり、

その作業後に、
「プログラム」という作業があると言う『現実』があるのではないでしょうか。

つまり、
「プログラムを1万行書く」には「感覚的思考」が適しているぐらいに、
的を絞って頂いた方が良いのではないかと個人的に思いました。
ここに、「職業プログラマ」を持ち出してしまうと話が複雑化するのでは?。

と、
通りすがりで、話が長くなりまして、
「的」を外していたら済みません。

応援してます。

ahoaho 2007/03/25 13:53 要するに簡単な問題しか解いて無いんでしょう。量が多ければいいというものでも無いですよ。一度、Haskellみたいな言語でも勉強してみれば?

brainhackbrainhack 2007/03/25 14:11 日経サイエンスか何かで読んだのですが,認知科学者がチェスを初めてから10年間どの様に上達していくかを調べた話がありまして,その結果,記憶の構造が変化していったそうです.駒がどの様に動けるかとかそういう低レベルな思考(論理的思考)ではなく,局面や局所的な駒の配置が,どの様に有利かなどという意識の側から見ると直感的とも言える判断ができる様になっていました.また,チェスマスターに記憶テストを行なったのですが,実際の試合の局面での配置(スナップショット)は簡単に覚えられるのに,ランダムに駒を配置した局面の場合には,成績は著しく落ちました.このことも記憶の構造がビギナーとは異なることを示唆しています.

doha2doha2 2007/03/25 14:36 コンパクトでより高速なアルゴリズムで記述可能なものを,
大量の愚の集積で記述しているとしたら,それはけだし莫迦というものだ.

依然として行数の多寡でプログラマの能力を議論しているあたりに,
日本のソフトウェア業界の未熟性が伺える.

S.A StudioS.A Studio 2007/03/25 15:09 ……長門さんみたいに伝達できればいいのにな。

AllyAlly 2007/03/25 15:26 何かを創ろうという感覚的思考とそれを実現するための過程として論理的思考があると思うんです(卵が先か鶏が先かの議論は別にして)。
登さんの場合だと、論理的思考の作業がほぼ無意識的にできるため感覚的思考がより際立って意識されるしそれに集中することができる。したがって論理的思考は厳禁といった発言につながっていると理解します。
ただ、感覚的思考のその背後では、何かしら無意識の論理的思考がほとんどの場合働いてるように思えます。この関係が成り立てば、感覚的思考は無意識に裏付けられた論理的思考に価値があるんだということになります。
結局のところ、あまり深く考えるな。しかし、高田純次ほどには考えろ。といったところでしょうか?

>文章を読む限りでは、初学者も区別せず非論理的思考の勧めをしているようにも受け取れるのですが論理的な思考をしないで欲しいという意図を説明するために書くのだから、論理的に間違っている点については目をつぶって欲しい。
←将来は政治家ですか??(笑)

クソワロタクソワロタ 2007/03/25 15:36
2^n と書けるところを 2*2*2*... と n 回乗算して
「どうだ、俺はこんなに長い数式を書いたんだぜ」

wenlywenly 2007/03/25 15:49 非常に興味深いですね。
全てのプログラミングが「自分一人で自分の思い通りに出来るのであれば」、
月10万行は無理にしても1万行程度まではかける人は結構いるのではないかと思います。

職業プログラマの場合の数百行というのは、
顧客の要件を抽出する、つまり、ソフト開発の着想の部分や、
品質を満たすことを示すための試験の証明作業等、全部込みこみです。
実際のプロジェクトの中ではプログラミング工程は短いです。
ここだけ取り出せば行数は数百行というレベルではなく、もっと高いと思います。

同列で比較するのであれば、ソフトイーサというアイデアを着想した時からの
完成した期間までの平均行数で述べるのが良いかと思います。

感覚的な思考は実現したいことが明確で、それをどう設計に落としていくか
という時に重要な思考スタイルだと思います。

showyoushowyou 2007/03/25 16:39 文がだめなら図にしてはどうでしょう?(そういう問題じゃないんだろうけど

kurukuru-nekokurukuru-neko 2007/03/25 16:41 おそらく頭で完成イメージが出来れば、既に殆ど完成に近い感覚を持って
いると思われる。(コーディング時)
当然ながら頭の中でシュミレーションしてデバックがある程度すんでいる。
当然バグも少ない。 
ただこれが出来る職業プログラマは殆どいない。

職業プログラマの場合、コード以外の物が全てカウントされているので実際は
もう少し生産性はある。 その一方で開発者個人の能力の揺らぎが非常に大きく
不具合は、開発者数の増加と共に級数的に増加する傾向があると思える。
未然に防ぐ各種防衛をボトムラインにあわせる設定する傾向があり、最終的な
生産性が下がってしまう。

大部分の職業プログラマは違う意味で「何も考えない」ように思われる。

naoya2knaoya2k 2007/03/25 18:09 普通のソフトウェア会社で仕事をしていました。確かに必死でがんばっても1ヶ月で1000行程度のペースでしかプログラムを作成できませんでした。それは、でも、要件定義、顧客との折衝、設計書の起こし、コーディング、テストコード作成、テスト実施、特許調査、CMM/ISO9000対応のための書類作成その他もろもろ含めて全部やって最終的に商品に載るコードを1000行あたり1ヶ月くらい、という見積もりであって、コーディングをガリガリやったのは1ヶ月のうちのほんの2日くらいでした。
一番イヤだったのは特許調査でしたが。

通りすがり通りすがり 2007/03/25 19:10 なぜ100%オレンジジュースなのでしょうか?

CiboCibo 2007/03/25 19:30 私の場合仕事柄論理的に考えざるを得ない立場なのでどうにもこのエントリには共感出来ない部分が有るんですが、それ以前に、一つだけ質問をば。貴方は「プログラムする」という事のみに主点を置いて話していますが、それは「自分の思う様にプログラムしている」のか、「仕事として依頼されたモノをプログラムしている」のか、どちらなんでしょう?――何れにしても興味深い文章だったので、相方(趣味でプログラマをやっている)にも帰ってきたら見せてみようと思います、では。

this_companythis_company 2007/03/25 19:56 人の起こす行動や思考の選択を行う決定権を握っているのは脳であってその脳に宿る意識には無いのではないかと思います。
(”私”と”私の脳”は別物という考え方です)
もっといえば、世の中に頭がいい人悪い人、絵のうまい人下手な人プログラムの書ける人書けない人が存在するのはそれぞれの脳が戦略としてそのような決定を行った結果だからじゃないかとまで考えています。

たとえば、プログラムを書く事が、楽しい・楽しくない、苦痛である・苦痛でない、といった感覚は脳の持ち主の意思に関わりなく沸いてくるわけで(個人的な感覚ですけど)
じゃぁ、プログラム書くのが苦痛なんだけど、まるで服を着替える感覚で明日から苦痛じゃなくするわという風にはできないわけです。これらの感覚は、脳によって本人の意思に関わりなく決定されているんじゃないでしょうか。言葉をしゃべるように、体を動かすように、まるで呼吸する感覚でプログラムを書けるか否かは脳によって勝手に決定されるので、そうじゃない人はあきらめてください・・・・・

というのも違うような気もします。というのは、脳を”説得する”のは不可能ではないと思うからです。脳をどう動かすかの決定権は脳にあり、意識はその奴隷であると捉え、意識のできることは、脳に対する説得のための材料を揃えて説得することしかないと思います。

ロンリテキシコウというものを脳に強いるというのは、脳と意識の主従関係を無視する行為なので非効率的になるのは当然
と言う風に感じました。

同意する所もあるが同意する所もあるが 2007/03/25 20:13 あたまおかしい

xx 2007/03/25 20:18 有名オープンソースのコード行数を数えてみれば?

hamlet-rhamlet-r 2007/03/25 22:11 はじめまして。

質問ですが、プログラムの行数とソフトウェアの実現できる機能というのは、やはり比例しているのでしょうか。私のまわりには、やたら行数をかけて、プログラムを書くプログラマが割りと多く居るように思います。それをデバッグの際に見直して、コードサイズを減らすことも多く、あります。質を問わずに量だけを論議しても仕方ないように思うのですが。・・・・

xx 2007/03/25 22:19 ↑コード行数に関しては25日の日記に書いてありますよ

客 2007/03/25 22:25 論理性という”性質”は、感覚という”結果”の後にしか発生しないということ。
それを追う論理的な思考は、感覚的な脳の働きよりも効率が悪くなるという当たり前のことですね。
なんだかんだいって、大衆でも理解できる感覚だと思いますし
ある程度の能力を有している方なら知らずに様々な事について行っているでしょうね。
ただ例が少し悪いのと、説明が少し洗練されていないので理解力の乏しい方には正確に理解するのは難しいかもしれませんね。

pmintpmint 2007/03/25 22:48 この記事が理解できるかどうかが勝ち組プログラマーと負け組プログラマーの境界なんじゃないすかね。

BunBun 2007/03/25 23:12 職業プログラマの場合、自分の頭の中で消化し切れない発注をされる場合もあるため、そのあたりで平均値が下がっているのでしょう。仕事のプログラムは遅いけれども、個人で作るプログラムは信じられない速度できちんとしたものを仕上げる人もいます。
自分の脳内で消化できないものは論理的に積み上げていくしかないですからね。

職業プログラマ職業プログラマ 2007/03/25 23:15 ↑それは, その職業プログラマが”自分の頭の中で消化し切れない発注”を無意識領域で処理できる形式に変換する能力に劣ってるということでしょう.

t-tanakat-tanaka 2007/03/25 23:33 耳が聞こえない人にむかって「相手の行動や唇の動きから言ってる事を推測するんじゃない。あいての出している声を聞くんだ」といっているようなもの。コードを感覚的に捉えること自体が一つの能力であり,それができない人には,この文章は無意味。ただ「世の中には自分が持っていない特殊な能力を持っている人がいるんだ」と思うだけ。

ちなみに,「コードを感覚的に捉える能力」は持っている方が少数派です。「楽譜を見ただけで音楽をイメージできる」のと同じくらいの特殊能力です。

ただ,音楽を職業にしている人はほぼ全員,楽譜を読む能力を持っているのにたいし,プログラミングを職業としている人の中でもコードを感覚で捉えられる人が(少なくとも日本では)少数派です。これについては業界人として日本の将来に不安を感じる点ではあります。

kenken 2007/03/26 12:34 バンドとプログラミングが趣味のため、非常に納得できる意見でした。
PGが論理的であると捉えられていることに非常な違和感を抱いていました。
PGって、すごく感覚的なことだと思います。本当、音楽作るときと一緒。

ちゃむちゃむ 2007/03/27 02:25 結局「設計段階でのイメージが重要」という結論でしょうか?

その通りだとは思いますが、経験を積んだ設計者はみんなやっていると思います。。

ちなみに、他の人も書いてるので詳しくは書きませんが、職業プログラマの生産行数が少ないのは、コーディング以外の作業が非常に多いためです。
一度『ちゃんとした』製品の開発を担当してみれば分かると思います。

ceekzceekz 2007/03/27 02:53
素朴な疑問ですが、コーディング以外の作業が多い開発が「ちゃんとしている」と考えるのは、どういうところから来てるんでしょう?単に、世間はそんなものだよ。という話でしょうか?

匿名匿名 2007/03/27 11:01 >普通のソフトウェア開発者が 1 ヶ月にわずか数百行 〜 3,000 行程度しかプログラムを書くことができない
そんなバカな。どんだけできないんだよ。ww
1-2ヶ月で作らないとやってられないシステムでも、2万行くらいはあるっしょ。

白い夏雲白い夏雲 2007/03/27 11:23 三年間ぐらいその感覚を忘れていました。思い出させてくれてありがとうございます。

ちゃむちゃむ 2007/03/28 01:14 >ceekzさん
「コーディング以外の作業が多い開発が『ちゃんとしている』」ではなくて、「『ちゃんとした』製品の開発はコーディング以外の作業が多くなる」と書いたつもりです。
膨大な量のテストとか、品質管理のための文書や製品開発のための各種帳票作成などです。

その定義の場合その定義の場合 2007/03/28 01:16 Windows NTなどの製品は『ちゃんとした』開発によって作られていないということですね

ceekzceekz 2007/03/30 15:58 ↑↑テストや品質管理は、プログラマが以外が行う方が良いと思うのですが、現実はそうもいかないんでしょうね…。
プログラマが何でもやる現状がおかしいんじゃないかと思って聞いてみましたです。

通りすがり通りすがり 2007/04/03 04:31 ちと、大げさでは?
そりゃあ、一人で完結するなら多くの人が3K/day〜10K/day程度はいくでしょう?
要件定義もせず、設計書も書かず、レビューもせず、試験項目書も作らず、証跡も取らなくて良いんだったらね。
そんな幸せな仕事ってあんまり無いですね。
そんな生産性が出るのは趣味で書くときぐらいですよね。書いてて楽しいし。コメントなんてあんま書かないし。エラー処理もあっさりしたもんだしね。
登さんの感覚的思考というのは賛同しますけど、感覚だけに個人差があると思われるので、それベースだと絶対仕事が回らない。チームなんて組めない。
まぁ、優秀な技術者ばっかりが集まってるプロジェクトだと随所で神業が見れますけどねぇ。なかなかそんなのはねぇ・・・。
システム作りなんて、所詮、他者との関わりのほうがファクタとしては大きいし、そこは論理的に話をして意識あわせをしないとねぇ。メイク〜単体なんて全体の1/4〜1/5にも満たないんじゃないの?昨今、特に・・・。

通りすがり通りすがり 2007/04/09 23:58 確かに、読むのが面倒になるレスの多さですね。
だから、それらのレスを踏まえずに、あなたの日記を読んだ感想を言うと、
「感覚的に考える」とあなたが言っているものは、すでに論理的であるから、
その主張は間違っている、ということです。
あなたが電車に乗ったり、運転したりしているときにプログラミングについて考えていることは、無意識に論理立てて考えている。論理だてるというのは、説明可能な客観的方法でその考えを構築しているということ。その作業をあなたは慣れや能力の高さ?から、あたかも感覚で行っていると感じているけれど、論理的根拠のないところから考え始めている訳じゃないから、感覚的とは言えない。実際にPCに向かってプラグラムを組んでいる時は、ある約束事に沿って機械的に作業をこなしているから、論理的な思考を働かせているとはいえない。だけど、それを機械的に行える程度にあなたは作業に慣れているし能力もある、そこには個人差があると言える。感覚的に行うからできる、という話じゃない。
あなたがなんの悪気もなく本心で上記の日記を書いているなら、
あまりにも自分や他者を知らないのだと思う。
それは、自慢していると思われても仕方ないのではないでしょうか。
どう思いますか?

通りすがり2通りすがり2 2007/04/10 00:40 論理的ですね!

てるやんてるやん 2007/05/01 09:07 赤ちゃんの頃にできてたこと、、ここで再発見することができました。
登さんほんとにありがとうございます(T^T)

とても腹に落ちたことを、僕なりに解説してみようと思います。
右脳でおおまかにイメージを捕らえて、
出力を左脳で微調整していく。

フローやゾーンの状態とでもいうのでしょうか。
凄い集中力を得られます。

フローやゾーンは別に登さんのこの方法じゃなくても入れます。
ほぼ意識しないでできることがそうであり、
低レベルのテトリスを長時間つづけるとか
すいすい進むRPGに熱中してるときとか
職人さんの熟練した高度な作業もそうですし、
単純な仕分けといった肉体労働でもこの状態に入れます。
ただこの状態は、外部からの圧力で解けやすい。

電話とかで中断すると、
もう一度そのフロー状態に戻るのに苦労します。
左脳で一から考えてしまうから。

また、壁にぶつかっても解けます。
自分の知らない単語、今までになかった状況
その他のいろいろな変化で、もってるもので対応しきれない場合
スランプというか、手が止まってしまう。

みんな多かれ少なかれ、フロー状態にはもっていけるものの
毎回中断や、壁によって途切れてしまい、再開できなくなる。

ですが「考えない」とすると
中断や、壁にぶつかったところで
もう一度イメージからすぐにはじめれられる。

中断された作業はすぐにノッた状態で再開できるし
壁にぶつかっても、そこを論理でくずそうとせず
イメージによって、自分にとって最短の道で突破できる。

(なんか書いてて気持ち悪いけど気にしないw)
ちょっと話し戻して「考えない」っていうのも厳密には違いますね。
最初に抽象イメージを設定するから、右脳では考えてます。
そのイメージを左脳で修正して肉体を通して出力すから、
考えてはいるんです。
ただ、言語野を通らないというか
右脳全体の活動に対して、言語野の働きが比較で小さくなるというか。
脳がイメージで動いてるから、意識的に考えてるとは思わない。
出力のために言語野が働いてるだけで
みんながいう、考えるために言語野が動いてるわけじゃない。

ピラミッドの絵を描くとき
考える人は、白紙にドットでひとつひとつ点を打って描いてます。
登さんのやり方は、
ピラミッドのJPEGイメージの最低画質を右脳から画面上にまず投影して
それを左脳で修正するような、、、
最低画質だから修正も間に合わずところどころほころびがありますが
圧倒的に速い。
次に似たような画像を描くときは、中画質ぐらいのJPEG画像が出てくるから
ほころびも減ります。

壁にぶつかったとき、
例えば英語だと知らない単語では話せないはずです。
でも、意外と意思疎通はできてしまう。
他の単語を組み合わせて似たニュアンスを表現したり
相手の単語から、読み取っていきなりスラングを作り出したり。

プログラムも似たようなもんじゃないでしょうか?
壁にぶつかった場合、左脳的に考えれば教科書と文献を調べなおします。
知らないライブラリーや、関数が必要になるからでしょうか?
でも、考えないで抽象イメージでそのまま進めていくなら
自分で最適な関数やライブラリーを作り上げたり、
これまでの既存コードから、別の組み合わせや抜け道を見つけたり
他人の似たプロジェクトコードから、すぐにコアを拾い上げたり
知識の蓄積とは違う、最短な方法で結果を出してくる。

似たような話はいくらでもききます。
ブルースリーがいう「考えるな、感じるんだ」
「チーズはどこへ消えた?」の2匹のねずみと、2人の小人の寓話で
一番最初に結果を出せたのは何も考えずにイメージを求めるねずみでした。
思考は現実化するとたくさんの偉人はいいます。
イメージが共有されたチームはとんでもなく強いです。
(逆にみんなこれができないから苦労する)
緊張の場面で成功を意識するほど失敗します。
成功しようという意識そのものが失敗の逆暗示となって。
例えばこの文字をみてても、
ひとつの文字を意識してひたすら観察すると文字は崩れます。
この文字の意味は?
この線の、この形の意味は?
と意識するほど読めなくなります。
同じように手を見つめて、
手の意味を考え出すと手が崩れていくような錯覚に陥ります。
精神病患者にありがちな思考ですね。
これを続けてたら自律神経からおかしくなっていくでしょう。
イメージこそが自分の体を保持している。
と、どこかの医学者がいってそうです。
作家が「神が降りてくる」というような状態もフローでしょう。
キャラが勝手にしゃべりだして、動き出す。
ひたすら、物事を考えてわからなくて、、、
考えるのをやめたとき、ふとお風呂場の中で、布団の中で、
街を歩いてあるものを見て、解決案を見つけるというポップアップもそうです。
考えないからイメージだけ残っていっきに解決に向かう。
自分がどうやって歩いてるのかと意識しても歩き方がおかしくなってしまう。
ギネスに載った小惑星を最多で発見した人の秘訣も
「小惑星をみつけようと思わなかったこと」でした。
一流選手が一流選手を育てられないのも意識を通して教えようとするから。
弟子が師匠を超えられないのも、意識で学ぼうとするから。
この場合師匠がない人や、師匠をバカにしてる人のほうが大成します。
フロー状態だとアホみたいにでてきますね、、とりあえずこのへんで。

「抽象イメージを設定して、考えないで取り組む」
(イメージの舵取りするぐらいには考える)

これなら中断があっても、壁にぶつかっても、
いつでもフロー状態に戻れます。
まわりの雑音が気にならないぐらいの集中力。
しかも、どこまでも持続できます。
(昨日この記事を見て、フロー状態が面白いままWebサーフィンをしてたところ
終身時間9時間オーバーしててびっくりでしたw
気づかないうちに徹夜、体は疲れてないですけど
脳が凄い疲れてます。
疲れてるのかどうかわからないけど血が集まってるような感覚。
それでも集中力は切れませんが、
甘酸っぱいものがほしいですね。
ブドウ糖の大量消費と、クエン酸が足りないのでしょうか?
なるほど、、、オレンジジュースw
グレープフルーツジュースでもいいかなと思いましたが
それより甘そうなオレンジが飲みたいですw

ところで登さんは
「自分の能力は、上記程度」とありますが、
この抽象イメージの上限を上げていけば
上記程度ではなく、天才プログラマーに変身したりしないでしょうか?

いつでもフローの状態といっても、
そんな普通と極端に変わるわけじゃありません。
途切れない集中力と、自己最短で壁を越える手段が身につくぐらい。
普通の営業マンとトップ営業マンぐらいの差でしかないでしょう。
その積み重ねが天才と呼ばれるゆえんなんでしょうか?
24時間ずっとひとつのことに熱中できる偉人とかは
この状態にもっていくのがうまかったとしたら納得もいきます。

コメントで指摘されてるとおり、一流の職人さんは
その同じ作業でフローに入ることはたやすいでしょう。
ですから、そういう人たちより
むしろ未熟な僕とかの方がいろんなことに応用できて有益に思えます。

どうにもデタラメな文章ですみません。
ここを読む人が理論解説の一助となれば幸いです。

なにか、これをやって結果が出たらいつかトラックバックでもしてみます。
赤ちゃんの頃にできたはずの、無垢な失敗を恐れない進み方。
それに気づけたことはホント大感謝ですo(> w <)〇゛

u2uniu2uni 2008/03/15 22:20 >多く書くときで 10,000 行以上のプログラムを書くことができる
ホントかよw話半分でもかなわんな^ω^;
一度やってみます。うまくいけばトラックバックしますね

ひなゆきせひなゆきせ 2009/03/16 17:54 感覚的思考からプログラムという形にする際、行動を自動化しているんですかね。
論理的思考の自動化、意識からの排除とでも言えそうですが。
スキルとして身につけるには感覚的思考から実際のタイピングへの脳内翻訳処理システムが作れるかが鍵になりそうです。

ういおういお 2009/04/27 01:02 論理的ではなく感覚で意味を捉えたり扱ったりすることができる。才能とはそういうものなのではないでしょうか?

ぴえろぴえろ 2010/04/13 12:18 私の理解だとこれは手法の統計的な結果の優劣と読めました。
つまり、仕様書を紙に書き作成して脳内でプログラムのエミュレートしてバグや仕様変更をできるだけ減らすことに時間を費やすよりも
作りたいものをおおまかに考えて、実際にそれをダイレクトにプログラムにする際、整合性などを脳が勝手にいままでのプログラムの経験やそれにともなうバグや仕様書変更の回避を勝手に補正したプログラムを組挙げるので、
結果、仕様書を作り上げてからプログラムする手法よりも、バグが少なくプログラムがくみ上がるという手法的な経験則の話だとおもいました。
あるいは人が発想段階でくみ上げたブログラムは実はそれほどバグが少ないという統計学的、経験則なのかもしれません。
そうでなければ、天才のたわごとでけどねw
プログラムミングへのアプローチを検索していたところ、ココで出会いましたが良いヒントになりそうです。

puchibanpuchiban 2011/02/22 10:02 感覚でプログラミングしている人(早く・正確に書ける人)と、
論理的にプログラミングしている人(遅く・バグが多い人)
の脳の状態を計測すれば、脳のどの部分を使ってプログラミングをしているか?がわかりそうですね。

誰か、研究者かどこかの番組でやってくれないかな?

yuzuyuzu 2011/06/12 22:58 > 自動的に手がキーボードを打ち、プログラムを入力して完成させてくれる。
論理的思考を放棄して、直感的感想のみを。
「良いなー」。

setupsetup 2012/02/11 00:05 僕はそれほどは速くはないですが、商業プログラマをしていたころ、人よりだいぶ速かったです。他の人と比べて、僕は「感性」とか「直感」とか「感じの流れ」でプログラムを作ってるのが違うんだなあ・・・と思ってた。それで、自分のやり方を「感性考法」と呼んでました(笑)。

Scheme言語処理系:Gaucheの川合さんが、コードを書いている時は自分がやっているという感じじゃないような事を書いていたのを見たことがあります。ページは思い出せませんが。 http://practical-scheme.net/index-j.html

setupsetup 2012/02/11 00:10 http://blog.practical-scheme.net/shiro

トラックバック - http://d.hatena.ne.jp/softether/20070324
 | 

<< 2007/03 >>
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31




※ この Web サイトのコンテンツは 登 大遊 が個人的に運営しているものであり、ソフトイーサ株式会社や筑波大学内での立場として公式なコメントを掲載しているものではありません。一応コメントは投稿できるようにしていますが、個人的に運営している日記のため、自分が不快に思ったコメントは前触れ無く削除しております。ご了承ください。同様に会社に関するコメントなどについても、削除される可能性があります。コメント書き込み機能については、匿名の掲示板のような状態になることを予防するため、はてなユーザーからのみ受け付けるように設定することもあります。