コンピュータの算数
皆さんはプログラミングが好きですか? 好きこそものの上手なれという言葉があります。好きな人はプログラムを上手に書けるのではないでしょうか。一方、嫌いな人はそもそも自ら進んでプログラムを書こうとはしないでしょう。
ほんの20年前ならプログラムが書けない事は全く問題ありませんでした。しかし、今は少なくない数の小学生や園児さんがプログラムをタブレット教材や塾で習っています。2025年の大学入学共通テスト(以前のセンター試験)で国立大学は英国数理社に加え情報科目を課すことが決まりました。プログラムを書けないと肩身が狭くなる時代がすぐそこまで迫っています。そうは言われても、ほとんどの人にとってプログラミングはとても難しい事なのです。
実例をあげましょう。私は関西大学総合情報学部で教鞭をとっています。学生構成は文系65%に理系35%で、彼らは情報科学を必修で学んでいます。残念な現状を率直に申し上げると、私のゼミに所属する大学3年生の90%がプログラムを好きではなく、30%はforやwhileといった繰り返し構造を使ったプログラムを書けませんでした。
学生さんと話をしてみると、プログラムの授業は教科書どおりにタイピングしていただけで、意味を理解する事を放棄していると感じます。課題はたぶんこうじゃないかなと、変数や値を適当に変更する試行錯誤の繰り返しでクリアしていました。運が良ければプログラミングが出来上がる。これではプログラムが書けないのも納得です。
このままではまずいという教員間の意識から生まれたのが本書であり、その趣旨は「プログラムを好きになってもらう」です。最初に好きになってもらえば、プログラムも上達するに違いありません。では、どうすれば好きになってもらえるのでしょう。
「好きこそものの上手なれ」という言葉は逆も言えます。つまり「上手だから好きになる」です。体育のサッカーで偶然ゴールを決めることができたことがきっかけでサッカー好きになったり、テストの点数がよかった科目が好きな科目になったりします。これをプログラミングに当てはめると、その第一歩は、プログラムは結果が運に左右される運ゲーではなく、プログラムに書いてあることを理解すれば動作がわかる、という事になります。
「難しいかと思っていたけど、ちょっと考えたら簡単だった。もしかして私ってプログラミングの才能ある?」と思ってもらえればしめたもの。プログラミング好きへの道を歩み始めることができます。
とはいってもこれはプログラミングに限らず、すべての学習の王道、というか当たり前の事でしかありません。では、本書は何が違うのでしょうか。先ほど学生さんは「プログラムの意味の理解を放棄している」と書きましたが、実際には理解したくても、何をどうすれば理解できるのか分からないのです。きっと、何がわからないかも分からないのです。
それならば、最初の一歩として簡単な問題、数学ではなく算数や園児さんが解けるような問題から始めればどうでしょう。せっかくですので体験してみましょう。
図1の問題(1)を見てください。これは園児さん向けの知育問題です。
図1 問題:空欄には何が入るでしょう?
問題(1)空欄に入る答えは+ですね。では、どうして●や▲ではなく+なのでしょうか。その理由を考えてみてください。この後、理由の言語化がプログラムの理解につながることを見ていきましょう。
では理由の例を一つ挙げます。
そうですね。この理由で問題(1)の空欄は埋まります。では問題(2)に移りましょう。理由1を使って問題(2)は解けるでしょうか? 問題(2)も空欄前は●です。理由1「●の後ろは+」を使うと問題(2)の答えは+。正解は♥なので間違えてしまいましたね。
「は? なぜ変な事をしているんだ?」と思った人は正しい反応です。理由1で「●の後ろは+」としたのは問題(1)の図系列の最初が●+だからです。そもそも問題(1)を解くための理由だから、問題(2)に当てはめる事が間違っています[1]。
それでは気を取り直して問題(1)(2)を共通して解ける理由を考えてみましょう。例えば次のような理由はいかがでしょう?
理由2 ●を問題の図形列から探します。見つかった●の後ろの図形が空欄に入ります。
理由1の+が、「●の後ろの図形」に変わっています。これで問題(1)(2)が解けるようになります。
さきほどと同じく理由2では問題(3)は解けません。問題(1)から(3)を解ける理由は思いつきますか? 詳しくは本書に譲りますが、このように理由を考えていく過程こそが、プログラムを理解して書いていく過程と同じなのです。プログラミングが得意な人は、このような過程を無意識のうちに辿っています。しかし例が高尚だったり、数学だったりすると初学者は挫折し、嫌いになっていくのだと思います。
100点満点のプログラム
プログラミングを学ぶ理由は、プログラムを書くことだけではありません。プログラムを自分で書かない管理職の皆さん、プログラムを発注する事務職、使ったりする学生さんにも必要な知識があります。その中で私が一番知ってほしいのは、100点満点のプログラムは作れないし、そもそも採点ができない、という実態です。
小学、中学、高校とこれまで皆さんは沢山のテストを受け、平均点や偏差値に一喜一憂してきたと思います。プログラミングの授業では私が設定した条件を全て達成したら100点満点です。算数や数学と同じく、必ず正解が存在してきました。しかし、正解は常に存在し、採点できるのでしょうか。
プログラミングはゲームアプリを作ったり、会社でソフトウェアを開発したり、自動運転を実現したりするために必要です。趣味から実益まで幅は広いですが、共通していることが1つあります。みなさんが作るまでそのプログラムは世界に存在しないという事です。もし、存在するならダウンロードしてインストールすればいいので、自分で作る必要はありません。そして、存在していないならば、正解例も存在しないということになります。つまり、「正しく」動くプログラムかどうか採点することができないのです[2]。
もちろん正しく動くプログラムを作ったり、正しく採点したりするために研究者も含め多くの方が努力されています。しかし、努力したからといって試験で100点が取れないように、正しく動く100点満点のプログラムは作れません。そのため、最近のアプリは間違って動く部分が見つかるたびにアップデートで修正を繰り返しているわけです。見方を変えると、有名な企業のプログラマーでさえ100点満点のプログラムが作れないという現実がわかります。
それではここで視点を変えてみましょう。スマホのアプリから、Web検索、銀行のATM、自動車や原子力発電所の制御まで、世の中にはたくさんのプログラムが動いています。年に何度も使えなくなる銀行ATMがあったりして社会が混乱したりもしています。これも100点満点のプログラムが書けないからですが、原子力発電所とかの場合、どうしているのでしょうね。ここでは問題提起だけに留めておきますが、プログラムを書くことに無縁な人も、このような疑問を抱き、社会の状況を知っておいてほしいと思っています。