読者です 読者をやめる 読者になる 読者になる

ちしきよく。

雑多系ブログ。みなさんの「何かを知りたい!」という欲を叶えましょう。

「でもそれ理論的には可能じゃん!」と言い張る人の説得の難しさ



あとで読む

f:id:zetakun:20170218125017p:plain

この前、こういう記事に出会った。

anond.hatelabo.jp

私もプログラミングをやっていた時期があるから、「バグのないプログラムを書くこと」の難しさはよーく理解しているつもりだ。特にやりたてのC言語なんて……

int型の変数に小数やら文字など変なものを代入しようものなら即、値がおかしくなってしまうので、銀行とかでは絶対に用いられないと習った覚えがある。

だが今回は、プログラミングにあまり詳しくない人でも理解できるように、もっと話を一般的にして考えてみようと思う。

 

そこで、

バグのないプログラムは書けるのか?という問いをこう変えてみよう。

「理論上可能なあらゆることは実践できるのか?」

と。

 

こう聞くと、98%の人間は『んなわけねえだろカス』とでも言うのだろうが、実はあまりよくわかっていない人がいるなぁと思うので、こうやって記事にしてみた。

あなたがもし日頃から「でもそれ、理論的には可能だよね?」と言う口癖があるなら、ぜひこれを読んで考えを改めてほしい。

 

 

理論とは

ここから考えてみることにする。我々は理論という言葉を当たり前のように使っているが、そもそもどういう意味なのだろう?

理論……科学研究において,個々の現象や事実を統一的に説明し,予測する力をもつ体系的知識

 Weblio辞書からとってきているが、全然意味がわからないと思うので、説明してみよう。

 平たく言えば、

今までに観測された現象を、矛盾なく概念やら数式やらによって説明でき、それによって未知の現象も予測できるもの

が、理論ということになる。矛盾があればその理論はおじゃんになり、別の理論が台頭してくる。だから、今は理論と呼ばれているものが、後々間違っているなんてことはいくらでもある。

 

理論の弱み『モデル化』

では、理論的に可能とはどういう意味だろう。それはつまり「概念とか数式とかを用いてその現象を矛盾なく説明できるものの上では実現できる」という意味だ。さっきの理論を言い換えただけなのだが。

だが、ここに一つ、理論の弱みがあることを付け加えておこう。

それは、

理論が現実と必ず食い違っている

という点である。言い換えれば、「その理論が世の中の全ての現象を矛盾なく説明できるわけではない」と。

 

なぜなら、科学にいつも付きまとう問題の一つとして、"現実との誤差"があるからである。

 

理科や物理や化学の問題にこういう但し書きがしてあるのを見たことがあるだろうか。

 

「ただし、空気抵抗、摩擦、糸の重さは無視するものとする」

「ただし、液体の体積は無視するものとする」

「ただし、物体は限りなく小さく、質量のある点として扱う」

 

なぜこんな前提をわざわざ付け加えるのか?理由はただ一つ。

 

無視しないと数式化して解けないから。

 

物理の例でいけば、本当の糸には重さがあって、物体には大きさがあって……とするのだが、そこまで考慮していくと問題は際限なく複雑になってしまう。

こう聞くと驚くかもしれないが、摩擦と空気抵抗のある空間で一定の大きさをもつ物体が床を水平に滑るときの速さというのを、数式化することさえできないのだ。

人間の限られた数学力では。

だから、摩擦とか空気抵抗のない空間……そんな空間が実際にあると仮定して、理論を立てていくのである。

 

そうすれば少なくとも「その空間内での物体の挙動」は、完全に予測できる。ただし理論はあくまで理想的な空間のことを述べているにすぎず、それをいつでも現実の問題に応用できるわけではない

 

これをモデル化という。モデルというとよく聞く言葉だろう。モデルハウスだとか、モデルさんだとか。

もともとmodelには模型とかひな形という意味がある。模型は現実を完全再現したものではない。

 

ちなみに実学に近いような学問……経済学だって医学だって工学だって少なからずモデル化をしている。

経済学では「人々が感情を持たず、常に論理的に思考し、最善の行動をとるように動く」とみなすし、

医学では「千差万別の患者のそれぞれの例をほとんど統合できるようなケースを考える」し(少なくとも研究においては)、

工学では「コンデンサーの端っこの電場は無視する」。

 

そうしないと、扱う変数が膨大になり、正確な数式化や分類ができなくなるからだ。

現実に即して考えていたら、複雑すぎて何も生まれないだろう。

ちなみに経済学はモデル化をしていってもかなり変数が多いらしく、肝心の計算はコンピュータに任せている、という(経済学の先生がおっしゃっていた)。

 

理論にだけ偏っても意味がないので、科学者は現実と理論の折り合いをうまくつける。

例えば、『限られた条件での』とか『線形モデルにおける』という枕詞をつけて考察するのだ。そうして、数式化できるギリギリのラインを探ることで、より役立つ理論を構築するに至る。本当にすごいと思う。

 

しかし、いくら理論が理論で完璧だったとしても、理論はあくまで理論にすぎない。

現実問題では考慮すべきいくつかの点について無視して考えたのが理論だから、

「どうして計算と違うんですか!!」なんて言われても困っちゃう。

そして、そんなことを平気で言ってくる人、というのも残念ながらいる。

現実に適用すると……

今までの話で、理論は現実とは違うんだよ、それはね、理想的な環境を整えることで仮説を立てていくからなんだよ、と説明してきた。

だが、理論を無理に現実の問題に適用しようとする人が現れれば、彼らは何を言い出すだろう?

 

それが冒頭の「バグのないプログラム作ってよ~」である。

 

上司と話がかみ合わないのはいわば現実と理論の食い違いが起こっているからであり、ここを解消しなければ一生議論が平行線のままだろう。

上司は「十分気を付ければバグのないプログラムを作れる」と考えている。

これは理論である。

 

なぜか?それを今から説明しよう。

ミスを防ぐためには二つの手法がある。

一つ、『十分気を付けること』

二つ、『長い時間をかけること』

 

一つ目はたぶん……無理だと思う。

人間の認識は完全ではない。この前も書いたけど。

 

www.chishikiyoku.com

どれだけ気を付けていたって、認識の中に脳の誤作動や無意識が介在する以上、それらを排除して考えることなんてできはしない。

『なんで?(殺意)』と尋ねられれば、原理だからとしか答えようがないが。

錯覚とか先入観の前に、我々の脳は無力なのだ。

 

だから、結局二つ目の手法をとるしかなくなる。

結局時間をかけて虱潰しするしかない。

そりゃあ確かにそうかもしれないけどさ、現実そうもいかないのよ。

 

これに似ているのが素因数分解の問題である。

私がここにある数字を書く。これを二つ以上の数の積に分解してほしい。

8759397902357447211294358303840257842981001478439352457

これを分解しようとするソフトは確かに存在する。実際に作ったこともある。

が、とてつもない時間がかかるのだ。何しろ素因数分解にかかる時間は、その数が大きくなるにつれ指数関数的に増大するのだから。

上司が言っているのはつまり。

「頑張れば、この数字を素因数分解できるよね」と。

 

我々はこう答えざるを得ない。

そりゃまあ、時間をかければ……まあ。

 

だがよくよく考えてほしい。現実は理論とは違うのだ。時間を正の無限大に発散させるのをのんきに待ってくれるクライアントなんていない。

ちょっと待ってください!今頑張ってますから!なんて言ったとて、無理だよそりゃあ。締め切りや納期があるのに。

 

冒頭で紹介した増田さんはこうおっしゃっていた。

バグは人のミスなんだから、理屈的には正しいような気がする
だけど未だかつて人類はこれを達成できていないという観測的事実がある、何故そうなるのかを説明することは可能だろうか

 それにこたえるなら、「人間に与えられた時間は無限大ではないから」とするのがよいだろう。バグは人のミス、それは確かに正しい。

だが、十分気を付けたからといって先入観やら錯覚やらは排除できないのだから、結局ミスを探すには時間を探すしかない。

 

バグを直すためには考えうるミスや問題点を一つ一つ洗い出し、あらゆる値を入力していって、そのどんな値にもバグが起きないことを証明する必要がある。

これをするのがゲームの"デバッグ"の人なのだが、彼らの根気の強さは並大抵ではない。全てのモンスターにあらゆる魔法攻撃をかけて、そのどれもにバグがないことを確かめるのだから。

そうやっていっても、システム上のバグとか、セーブデータのバグとかが発売後に発見され、パッチで改善されるという例があるのだ。

これらのバグも、デバッグ係の人が無限人いるか、時間が無限大あれば解決される。

 

そして、上司さんに説明するときには、

「限りなく長い時間をかければバグなしプログラムを作ることも可能ですが、それはつまり『84789582090282192845802198931』を手で素因数分解するのと同じだと思いますよ」と言えばいいのではないだろうか。もしくは、

「四書五経を全部手で書き写していって、漢字が一つも間違ってないことを証明するのと同じだと思いますよ」と。

 

現実と理論は違う、というこのように根本から説明せねばならないので、

「でもそれ理論的には可能じゃん」なんて言う人を説得するのは難しい。

 

ちなみに、私もこういう人の餌食?になったことがある。

私は生徒会活動をしていた。代表として学校全体の目標を決めなければならないのだが、その時の一コマ。

「『今月の目標は遅刻をなくす』で、そのための方策に、『遅刻したら自学ノート1ページを宿題として課す』にしようと思います」と言ったところ、なんで?と先生に聞かれてしまった。

彼曰く、「全員が気を付けていれば遅刻は起きないはずだ、だからその目標は不適だ」と。

目標が不適なのは認めるとしても、その理由に『全員が気を付ければ』というのは……うーん?そりゃあ気を付ければ遅刻はなくなるはずだけど、そうじゃないから起きてんだろアホって気持ちを抑えながら、結局今月の目標を変えてしまった。

 

それに比べれば、例の増田さんの上司、だいぶいい人だと思う。

ただ、現実と理論の区別があまりついていないというだけで。

 

というわけで、皆さんも、「理論的に可能だああああああ!!!」派になって、他の方を困らせないようにしましょうね。