プログラミング教育の落とし穴
From programmer with love
2015.10.26
Updated by Ryo Shimizu on October 26, 2015, 15:44 pm JST
From programmer with love
2015.10.26
Updated by Ryo Shimizu on October 26, 2015, 15:44 pm JST
今年に入ってから、プログラミング教育に関するニュースをいくつも聞くようになりました。
ちょうど1年ほど前、安倍内閣の「世界最先端 IT 国家創造宣言」の中に、山本一太IT担当大臣(当時)の働きかけで「義務教育段階におけるプログラミング教育」について言及してもらったこともあってか、あちこちで子供向けのプログラミング教室が開講されることになりました。
しかし、急激にその流れが生まれたためか、果たしてこれが本当に「プログラミングができる子供を育てる」ということになっているのか、と考えると甚だ疑問を感じます。
筆者らは米国カリフォルニア州、スウェーデンのウプサラ大学、米国メーン州、タイのパタヤビーチなどでしばしば非プログラマー向けのプログラミング講座を開講してきました。
また、東京をはじめ日本国内では札幌、仙台、新潟、福島、大阪、福井などでもプログラミング講習会を開催し、来月11日からもNHK文化センター青山教室で大人向けではありますが、非プログラマー向けに「教養としてのプログラミング iPhone/iPadだけでゲームから人工知能まで」と題したシリーズ講演を行います。また、12月5日には、新潟県長岡市で現地の子供たちを対象としたプログラミング教室を開講する予定です。また、2013年から3年間、成蹊大学経済学部でもプログラミングを教えています。
実際に子供から大人まで、多くの人たちにプログラミングを教えてきた筆者の経験からすると、現在さまざまな企業が参入しようとしているプログラミング教室には、疑問を感じざるを得ないものも少なくありません。
プログラミングの「何を」学ばせたいのか、そして子供たちにプログラミングを学ばせることで、どうしたいのか、という指導方針が各社まちまちで、「果たして高い月謝に見合うだけの価値があるのだろうか」と首を傾げるものが多いのです。
プログラミング教室で最も問題となるのは教材の質です。
小学生などを対象にしたプログラミング教室では、主にマサチューセッツ工科大学のミチェル・レズニック教授らが開発した子供用ビジュアルプログラミング言語Scratch(スクラッチ)を使った講座が数多く組まれています。
確かに、Scratchはプログラミング入門の第一の障壁であるキーボード操作に習熟しなくても手軽にプログラミングを体験できるため、入門には適しているのかもしれません。
しかし、Scratchの明らかな問題点は、Scratchを構成するそもそもの発想が古すぎるということです。
そもそもScratchは手続き型プログラミング言語、平たく言えばかつてのFORTRANや、BASICといった世界観に原始的なオブジェクト指向を組み合わせた世界観しか表現できません。
プログラミング言語が長い年月とともに飛躍的に進化した結果獲得した、オブジェクト指向による差分プログラミングやカプセル化といった重要機能は隠蔽され、子供たちは過度に低機能なプログラミング言語をなんとか工夫しながらシステムをだましだまし使うことを余儀なくされます。
この世界観の中では、アルゴリズムの基礎的なことを学ぶのがせいぜいであり、プログラミングの持つ本当の可能性には多くの子供たちが存在すら気づくことがなく終わるのです。
もっと大きな問題は、Scratchの延長上に普通のプログラミングがないことです。
たとえば、かつてBASICが隆盛を極めたことがありました。
大人も子供もBASICを学んだ時代です。
BASICでできることは、今日Scratchでできることとほぼ同じです。
しかし、BASICの場合、その延長上にプロとしての仕事がありました。
商業用ソフトがBASICで書かれたり、また、企業や工場の中で使うアプリケーションがBASICで書かれたりということはよくあったのです。
ですから、BASICが書ければ飯が食える、という状態が一定期間ありました。
これは90年代の終わり頃まで続きます。
その後、プログラミング言語の主流はC言語に移り、C++言語に移り、Javaに移行していきました。
一貫していたのは、CだろうがC++だろうがJavaだろうが、延長上に仕事としてのプログラミングがあったことです。
飯が食えるなら、勉強するのも悪くありません。
ところがScratchは、いくら勉強しても仕事になりません。せいぜい、Scratchを教える教員になれるくらいです。
Scratchのすごいハッカーである子供が、enchant.jsに苦戦している、という話を聞いたことがあります。
過度に保護されたScratchとは、プログラミングの概念もなにもかも違うので理解するのに時間がかかっていたそうです。
私からみるとScratchは過保護にすぎるように思えます。
Scratchと本物のプログラミングは、三輪車と乗用車くらい違います。
三輪車には誰でも乗れますが、乗用車を運転するには免許が必要です。
筆者らがJavaScript向けプログラミング学習環境として、enchant.jsと9leapを作ったのは、Scratchの方針に疑問を持ったからです。
どうせ同じ時間をかけて勉強をするなら、本物のプログラミングというものを学ぶべきだし、学習意欲のある子供は、さらにそのまま突き進んでいけるようなレールを用意するべきだと思うのです。そのレールの先は、決して「ここで行き止まり」であってはならず、そのレールをずっと進んでいけばその先には本物のプログラマーへの道が開けるようなものでなくてはいけません。
スポーツの世界では、こんなことは当たり前です。
たとえば子供に卓球を教えるのに、子供用の卓球のルールを押し付ける親はいません。
子供にサッカーを教えるのに、フットサルをやらせる親もいないでしょう。サッカーとフットサルは似ていますが、フットサルを極めてもプロのサッカー選手にはなれません。
プログラミングを教えるというのは一種の英才教育ですから、なぜわざわざ子供を檻の中に閉じ込めてプログラミングを教えなければならないのでしょうか。これは却って深刻な悪影響を与えてしまうと私は思います。
事実、私はScratchに触れ、そしてすぐに飽きてしまった子供たちを何人も見てきました。
「むかしやってみたんたけど、限界が低いから思い通りのことができなくて飽きちゃった」
これではプログラミングを教えることが、却って子供たちを本物のプログラマーから遠ざけてしまいます。
JavaScriptがいいのは、その延長上にプロのプログラマーへの道があるのはもちろん、JavaScriptを書くのに使うテクニックは、他のプログラミング言語にも容易に転用できるからです。
JavaScriptを英語だとすると、Scratchは中国の一部の地方でだけ使われている少数民族の使う方言のようなものです。どちらが優れているかという議論ではなく、教えるのなら応用可能性が広く、そのなかでは最も習得しやすいJavaScriptを教えたほうが、他に転用が聞きづらいプログラミング言語を学ぶよりもずっといいということです。
これは、Objective-Cにも言えます。
Objective-Cは、もはや過去の遺物です。
Swiftは、Objective-Cよりずっとマシですが、それでもAppleという、一私企業が提唱する新言語に過ぎません。SwiftはObjective-Cよりは遥かに転用性が高いのですが、C++やJavaやJavaScriptに比べると汎用性は低いです。
一方で、我々自身もScratchに似た「MOONBlock」というビジュアル言語を開発しています。
我々がMOONBlockを開発したのは、子供がプログラミングを覚えるためではなく、大人やプロを含めたすべての階層のプログラマーがプログラミングそのものを簡略化するためです。
ScratchとMOONBlockの決定的な違いは、MOONBlockがJavaScriptに変換されて実行され、そのプロセスを確認できるのに対し、ScratchはScratchという閉じた環境のなかでしか生立し得ないところです。
MOONBlockは追求するとすぐにJavaScriptの世界に入ることになります。
キーボードが苦手だった子供が、MOONBlockから少しずつJavaScriptの世界に入門する道筋をつけています。
そして同時に、十分習熟したプログラマーであっても、目的によって簡単なプログラムならばMOONBlockのほうが素早くプログラミングできるようなものになっています。たとえば、私がJavaScriptでゲームを作ろうとすると、かなり簡単なものでも最短でも3分はかかりますが、同じものをMOONBlockで作ろうとすると、46秒でできることがわかっています。3倍以上のスピードで同じプログラミングができるわけです。キーボードを打たないというのはそれほど強力なことなのです。そしてScratchでは、むしろもっと時間がかかります。Scratchは効率的にプログラミングを行うことが目的なのではなく、「プログラミングとはこういうものだ」という道徳を教えることを目的化しているからです。
昨年行われた全国高校生総合文化祭では、選抜10チーム中7チームがMOONBlockを使用していました。
優勝チームにインタビューすると、彼らはC++言語を使いこなす能力を持っていました。
しかし、短時間に目的の結果を得るために、敢えてMOONBlockでプログラミングするという選択を積極的に行ったとのこでした。
MOONBlockならば、必要に応じてJavaScriptのコードを挿入し、柵を安やすと乗り越え、MOONBlockのポテンシャルを超えたJavaScript本来のプログラミングが可能になるからです。
これはScratchにはない特徴でした。
この大会では、Webで動作すること、という条件以外には、enchant.jsを使うとかMOONBlockを使うとか、そういう制約は一切ありませんでした。それどころか、Scratchでさえ選択肢として使うことができたのです。しかし10チーム中、Scratchを選択したチームはゼロでした。
また、一部の界隈ではむしろBASICを教えるべき、という議論もあります。
私はこれも論外だと思います。
BASICが世界的にブームになった70年代から80年代、実際には数多くの人々がBASICに挑戦し、挫折を経験しています。
私の通っていた小学校は、地元の名士や比較的裕福な家の子供が多かったので、学年の男子の8割、およそ50人はBASICを一度は触ったことがあります。私の世代は特にBASICを触ったことが多い世代です。
では実際にその中で何人が生き残ったのでしょう。私の小学校では、私を含めて3人です。しかし私以外の二人は、プログラミングを仕事にするに至っていません。
BASICは、今のモダンな言語に比べると、あまりに非力で、あまりに理不尽です。
私も数年前に一度、懐かしさもあってBASICを触ってみたのですが、あまりの言語仕様の古臭さにものの五分で投げ出してしまいました。
オブジェクト指向もない世界でゲームを作るというのは一種の拷問です。
イベントドリブンのない世界でインタラクティブなプログラムを書くというのはろくでもないことです。
BASICで教えても、プログラミングができるようになる子供はゼロではないでしょう。
しかし、90%以上が挫折することが既に分かっています。
なぜわざわざ、うまくいかないことがわかっている言語で教えようとするのでしょうか。
結局、21世紀にBASICをリバイバルして子供に教えようとしている大人というのは、自分たちがBASICで挫折しなかった人だけで、そういう人の子供は、遺伝的に見ても、BASICに適応可能な程度の知能指数を備えていると想像できます。
Scratchだけを教えられた子供にしろ、BASICだけを教えられた子供にしろ、彼らはとても不幸に見えます。
どちらも牢獄の中で牢獄で暮らすためのルールを学ぶにすぎません。
Scratchで書かれた実用的なソフトウェアは、たぶんゼロです。ゼロでないとしても、限りなくゼロに近いでしょう。
一方、JavaScriptやC言語で書かれた実用的なソフトウェアは、無数にあります。世の中にあるオープンソースのソフトウェアの大半は、C言語やJavaやJavaScriptで書かれたものです。これが世界の共通語であって、なぜわざわざ少数派しか使わない言語を教えるのでしょうか。
もちろんこれは宗教論争に発展する可能性があります。
教育者は誰もが自分のやり方が正しいと信じているからです。
しかし断言しますが、今からScratchの名人になっても、今からBASICの名人になっても、JavaScriptを使いこなせる子供よりは将来性は確実に低くなります。
身の回りにIT関係の人が居たら聞いてみるといいと思います。「Scratchしかできないが凄腕のエキスパートがいるんだが、君の会社で雇わないか?」と。そんな人材を採用するまともなIT企業はまずいません。
しかしJavaScriptのエキスパートや、C++のエキスパートなら、高校卒業でなくても仕事はあります。ITの世界は実力主義です。
その人の書いたプログラムを見て、問題なさそうならば相手が中学生だろうが採用します。実際、ドワンゴでは中学生が働いて商用のコードを書いていたこともあります。
重要なのは、途切れなくプログラミングを学び続ける道が繋がっていることです。
ScratchもBASICも、残念ながら行き止まりがあまりにも早くきてしまいます。
私が危惧するのは、子供達がこの段階で飽きてしまうことです。
あまりに早く壁にぶつかった時、「なあんだ」と思って諦めてしまうことです。
プログラミング教育が注目されている今こそ、教える側の意識として「なぜ教えるのか」「なにを教えるのか」といったことを明確にするべきではないかと思うのです。
おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)
登録はこちら新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。