2018-05-29

世の中にはプログラミングを理解できない人間が存在する

現在、C++によるプログラミングの入門書を書いているので、初心者のプログラミングの学習過程にとても興味がある。私自身も初心者の気持ちを取り戻すためにHaskellを学んでみた。最初の数日は頭が痛くなるほど難しかったが、そこを過ぎてみれば後は楽になってしまった。結局、初心者の気持ちはあまりわからなかった。結局、プログラミングの基礎はすでに学んでしまっているので、

先日、FizzBuzzがわからないから教えてくれという知人がいたので、これは初心者の気持ちを知るいい機会と話を聞いてみたところ、想像を絶する世界が見えてきた。

まずこれが動かないと悩んでいたコードだ。


for ( int i = 0 ; i <= 100 ; i++ )
{
}
else if ( i % 15 == 0 )
{
    Debug.log("FizzBuzz") ;
}
else if ( i % 3 == 0 )
{
    Debug.log("Fizz") ;
}
else if ( i % 5 == 0 )
{
    Debug.log("Buzz") ;
}
else
{
    Debug.log(i) ;
}

一見するとそれらしいソースコードのようにみえるが、そもそも文法が間違っている。文法が間違っている箇所を指差しても納得しない。for文の文法を説明しようとするが聞く耳を持たない。「これが間違っているなら参考にしている教科書も間違っている」との一点張りで誤りが存在していることを頑なに認めない。参考にしているらしいスライド資料にのっているコード例と比較させても間違いの箇所を判断できない。for文の文法の説明をもう一度試みるがやはり聞く耳を持たない。

そしてソースコードの見た目を適当に書き換えてなんとか問題を「修正」しようと試みる。私はいつシェイクスピアの名作が出来上がるだろうかと考えながらその様子を見守っていた。

ややあって、奇跡的にソースコードが適切な形に「修正」された。しかし出力は期待通りにならない。当然だ。なぜならこれはUnityで、使っているのはデバッグログ用の機能であって、重複は省かれるからだ。出力は、1, 2, "Fizz"というメッセージが何件, 4, "Buzz"というメッセージが何件, 7, 8...と続く

そもそも基礎的なプログラミングの知識が十分ではないのだから、Unityはやめてもっと罠の少ないCLI環境でプログラミングの基礎を学ぶべきだと諭しても、「Unityは私がやりたいことを実現できる環境であり私のモチベ維持のために重要であるからUnityでやる」といって改めようとしない。

これは一体どうすればいいのだろう。こういう人間は教育不可能だ。この人物の経歴を見るに、どうもそれらしく見えるモックアップをでっち上げてきたアート系の人間のようだ。本人は今の時代は科学とアートは同じものでありアートを融合することでユーザービリティを考慮したUIが云々などと、まるでピタゴラス派のようなことを言う。世界は人間にとって美しい数字とか法則で定義されるべきであり、定義が観測結果に従わないとしても定義は正しいと主張したのがピタゴラス派だ。アートに引きこもっているならそれでいいのだが、それは科学ではない。コンパイラーのソースコードの解釈はこの自然界には珍しいことに冪等性を持っているのだから、見た目をでっち上げるのではなくて本質を理解すべきなのだ。たとえその本質が自分の美学に合わなかったとしてもだ。私は本棚にあったアラン・ソーカルの著書、知の欺瞞を手に取らせてみたが、あまり興味は示さなかったようだ。

こういう人間によって書かれたソースコードは一見もっともらしく見えるが、文法違反の間違ったコードとなる。どこかからか発見してきたコードをコピペしてツギハギしてそれらしい見た目のソースコードをでっち上げる。人間相手であれば、いかにも主題について理解したかのようにもっともらしくでっち上げた小論文を書いて読ませれば筆者は主題を理解していると読者を騙すことは可能だが、ことコンパイラーが相手では文法違反のソースコードを騙すことなどできない。

思うに、先天的に、あるいは幼少期の教育の結果、プログラミングに向かない学習方法に最適化されてしまった人間がいるのではないだろうか。物事の本質を完全に理解するにはコストがかかる。しかし、不完全な理解だがそれらしいものをでっち上げるにはコストがかからない。そして、人間には、それらしくでっち上げられた偽物と、本質を理解した上で作られた本物を判別するのが難しい。一方コンピューターは違う。コンパイラーはソースコードがいかに本物のソースコードらしい見た目をしていようとも、文法違反のソースコードを判別できる。コストを書けずに結果を出すためにそれらしくでっち上げる学習方法に最適化されてしまった人間は、コンパイラーに対して、それらしくでっち上げられたソースコードを食わせてコンパイラーが騙されてくれることを期待する。しかしコンピューターは騙されない。そもそも騙しようがない。コンパイラーは定義済みの規則に則って判断するだけで騙すという概念すらないのだから。

25 comments:

Anonymous said...

そもそもなんでUnityでFizzBuzzなんかやってるのでしょう。
参考書に書いてかったとか?

Anonymous said...

プログラムわからなくてごめんなさい

Anonymous said...

わかるわぁ、わかんない意味が。
知人さんの思考はあいまいな表現でも許される国語的なもので、見慣れた文字は国語言語にしか見えない。プログラムはルールに忠実に実行するごまかしがきかない、ある意味清潔な世界だって事が理解できてない。だから、見慣れた文字の羅列なら小手先でなんとかなると思っちゃうし、そこに微塵も疑いはない。
初心者が一番苦しむのは、(プログラミング)言語=国語言語ではないってことを、認識して、理解することだから。

Anonymous said...

そりゃあそうだよ。プログラミングに限らず、何かをやろうと頑張ってもそれができない人は必ずいる。ただ、プログラミングのできない人の総数はかなり少ないと思ってます。例えば、歌とか、絵とかと比べると。

Yutaka Kachi said...

アート系の人は、Processingとかが良いんじゃないですかね。
あと、教科書と自分の環境を合わせる。

Anonymous said...

分からない理由、なんとなく分かります。
こういう人って、数学みたいな厳密な論理を積み上げていく経験が殆ど無いんですよ。
なんとなく自分の要望を集めれば、あとは根性でモノが出来上がると思っているタイプですね。

自分は所謂SIerの人間ですけど、お客さんには、こういう人たくさん居ます。

Anonymous said...

これは理解できないタイプではなくて、一度誤った概念モデルを獲得してしまうと二度と崩せないタイプの人ではないですか

Anonymous said...

対象者のプログラミング適正よりも
投稿者との人間関係に問題があるような気がします。
理性では貴方に教えを請わないといけないと解っていながら
どこかで素直に貴方に従えない心の問題があるような・・・

Anonymous said...

> そりゃあそうだよ。プログラミングに限らず、何かをやろうと頑張ってもそれができない人は必ずいる。ただ、プログラミングのできない人の総数はかなり少ないと思ってます。例えば、歌とか、絵とかと比べると。

義務教育で経験するもの(歌や絵)と、そうでないプログラミングを比較する時点で母集団が異なる。
プログラミングができない人の総数がかなり少ないというのは違うと思う。

Anonymous said...

うーんこういう内容かー。
昔プログラマやってて先輩に同じこと言われた自分でもさすがにここまでひどくはない。
ちなみに自分も先輩に言われた通り本当に初級以上のレベルに全く到達できなかったのは、ひとつずつ問題を切り分けて回答を出していき正解に導くということが極端に苦手なのが最大の原因だった。
いきなり答え求めちゃうタイプは多分プログラミングに向かない

Anonymous said...

>文法が間違っている箇所を指差しても納得しない。for文の文法を説明しようとするが聞く耳を持たない。「これが間違っているなら参考にしている教科書も間違っている」との一点張りで誤りが存在していることを頑なに認めない

こういう姿勢の人はプログラミング以外も出来ないのでは。
たまたま問題がプログラミングで顕在化しただけで。

Anonymous said...

きっと、江添亮さんが書き終えた入門書に乗っているサンプルコードも
「これが間違っているなら参考にしている教科書も間違っている」
と言われてしまうんですね

Anonymous said...

いるでしょあちこちに。プログラミングやりたいって言って環境そろえて本買って(いや今ならweb検索か)、いざ買いてみたら全然動かなくて間違ってる場所もわからなくて諦めちゃうパターン。ていうか九割がそうじゃないの。大昔の話で済まないが、「マイコンを買ってもBASICが出来るようになる人は一割くらい」とか言われてた時代から割合は変わらないでしょ。プリグラミング以外でも同じで、楽器でもゴルフでもスキーでも、道具揃えてちょろっと触るまでは簡単にいくけど、それなりに弾ける飛ばせる滑れるようになるまでやめない人はわずかだよ。そんなもんだ。向いてないなら次いっとけ。

Anonymous said...

資質以前に、教えを素直に受け入れられない人間は人に教えを請う資格がないと思うのです。

Anonymous said...

> なぜならこれはUnityで、使っているのはデバッグログ用の機能であって、重複は省かれるからだ。
その動作はConsole Windowの上部にあるCollapse=ONによるものです。こちらをOFFにするとよいです。

Anonymous said...

プログラミングの基礎でGUI使うケース多いけど
いくら概念を理解させても実際コーディングで
つまずいたらどうしようもないって事が分かる例

Anonymous said...

逆に全ての人がプログラミングを理解出来ると思っていたことに驚きです

t tak said...
This comment has been removed by the author.
Anonymous said...

アート野郎はもっとエンジニアリングに飛び込まなきゃいけないし、エンジニアはもっと自分とは違う価値観の人がいることを受け入れて広く心を持ったほうがいいと思う。

Anonymous said...

これはプログラミングの問題ではない。
議論どころか会話すら成立してないのだから知性の問題。
人間相手なら、慈悲深いいくらかの人々は懸命に意を汲んでくれるがコンパイラはそうしてくれないだけ。
普通の人々は早々に見限って関わりがなくなる。

game-online said...

cool math games run 3
Awesome Tanks 2
Harry Potter: Hogwarts mystery

Anonymous said...

アートやプログラミングは関係ないと思われます。

昔、BASICをやりだした友人が「a = a + 1」は式として成り立たないと言い出しました。どれだけ「=」は代入を意味すると説明しても、プログラミングはクソだと言っていました。話を聞くに高度な数学的思考ではなく、「=」は両辺が同等でなければいけないと習ったからだという理由でした。

固定観念を払拭出来ない人か、出来る人かの違いだけだと思います。

Anonymous said...

江添自身がプログラミングを理解していないところがさらに問題を根深いものとしている。

Anonymous said...

極端なバカな質問に反応しすぎ
でもこのコメはなるほどと思った
> 昔、BASICをやりだした友人が「a = a + 1」は式として成り立たないと言い出しました。

Anonymous said...

GUIからプログラムを始めたいのであれば、VBかHSP辺りから始めるのが妥当かな。
エンジニアを目指していないアート路線の人ならば、尚更、昔のBASICレベルの言語と同等であるそのような言語を使って変数の代入レベルから勉強していくべき。