プログラミング授業の必修化とMimir Yokohamaのプログラミング授業のおはなし
はじめに
2020年、プログラミングの授業が小学校において必修化されます。
これは高校まで含めて(要請上は大学も含めて)政府の人材教育プランの一部となるものです。
これは、多くのエンジニアが反対を示す中、十分な検討のなされないまま実施されるものになります。 しかし、この問題点はエンジニアリングにかかわらない方にも非常に通じにくいものです。
そこで、この問題を詳しく解き明かしていきましょう。
政府の目論見
そもそも、この話は「AI人材を作ろう」という話に帰結しており、「25万人のAI人材を育成する」という「AI戦略」に基づいています。
大学において即戦力となるAI人材を育成するため、高校ではAIにおいてよく使われているPythonという言語を学ばせ、中学ではプログラミングができるように教育し…といった流れです。
政府がAI人材を強調するのは、これが国家戦略として、販売、国際競争力、あるいは国家ブランディングにおいても有効な切り札だと考えているからです。
しかし、これは非常に根本的な問題がかなりたくさんあります。
最も根本的なのが、「AIが一過性の流行であり、既に廃れつつあり、それは見放されつつあるからである」ということです。
私はAI技師でもありますが、AIというのはちょっと特殊なプログラムです。 最も特殊なのは、プログラムに通常みられる「確実性がない」ということです。
AIはわざわざ「曖昧な結果を返す」ようにできています。そしてなおかつ、「結果に再現性がない」ようにされています。 コンピュータは通常、正確に、全く同じように動作することを期待しますが、AIには「人間と同様の問題」かあります。
AIそのものにとって非常に困難な問題を表す言葉として「AI完全」という言葉があります。 しかし、仮にAI完全な問題を全て解けるAIを作ったとして、それでも依然として「人間にとって難しいことはAIにとっても難しい」のであり、 それはつまり「プログラムでなければ実現できないようなことに比べ、AIによってしか実現できないものは非常に少ない」ということを示しています。
さらに、正確で再現性のある動作はそれが「正しいかどうか」を検証することができます。 しかし、AIの動作は正しいかどうかを確かめることが非常に難しく、検証されない曖昧な知識を蓄えたものになってしまいます。
この曖昧な知識の集積を正しい答えに導くことは現実的でない、ということが徐々に認識されつつあります。 もちろん、将来的に深層学習という手段がさらに進化し、より強力なツールとなっていく可能性もありますが、少なくとも万能にして究極のものでないということが明らかになっています。
「今流行であるもの」を何年もかけて、国を挙げて追いかけることに問題があることは容易に想像できるかと思います。 特にこれは多くの人の人生がかかることですから、今流行っていることを今から目指そうというのはなかなか危険です。
なかなかわからない「プログラミングというもの」
プログラミングというのは、「こうである」「こういるものである」と言うのは非常に難しいですし、実際にやっていてもプログラミングのなんたるかを知るのは非常に難しく、膨大な好奇心で不得手なことにも、未知のことにもどんどん挑戦していくことを躊躇っては知ることすらできません。
プログラミングは単なる事務的な作業にすることも、工作にすることも、創意工夫にすることも、数学的な解の導出にすることもできます。 これは、行為の質は全く違いますし、頭の使い方も違います。 必要とされる能力も違いますし、「プログラミング」という言葉にまとめてしまうにはあまりにも多様すぎます。
私にとってはプログラミングは多くの場合「トリックとテクニック」もしくは「日常的行為」です。 人がメモをとったり、メールを読んだり、ファイル名を変更したりという行為と同じレベルでプログラムを書きますし、より大きなプログラムは大抵、難しいように思われる問題の本質をいかに穿ち、簡単に解決するかを目指します。 しかし、これは日常的な手段としてプログラミングを行っている、また捉えているからこそのものであり、趣味でプログラミングしない人には決してわからず、なおかつ趣味の方向性としても日常的な生産行為とプログラミングが結びついていなければならず、プログラミングをできる、する人の中でも未知の感覚であることが多いでしょう。
プログラミングは単純に手段としての行為だと考えて良いでしょう。 「コンピュータを使う」ということが、実際に何をするかというのは千差万別であるのと同じように、プログラミングもまた千差万別です。
このために、「プログラミング」に対する正しいイメージを持つことは非常に難しく、プログラミング経験が十分にない人の漠然としたイメージは、プログラミングという行為がどのようなものであるのか正しく捉えることができません。
仮にプログラミングを知っている人だけで「プログラミングを教える」ことについて語ったとしても、思想的対立が発生してしまいます。
「プログラミングを教える」の意味の齟齬
「プログラミングを教える」というのは、「ペンの使い方を教える」みたいなもので、その言葉だけでは食い違いが発生してしまいます。
ペンの使い方、というのは、子供が字を書けるようにするためかもしれませんし、整った字を書くためかもしれませんし、帳簿をつけるためかもしれませんし、特段に美しい字を書くためかもしれませんし、デザイン性の高い字を書くためかもしれませんし、物語を書くためかもしれませんし、イラストを描くためかもしれませんし、ロゴを描くためかもしれません。 とにかく話が幅広すぎます。
特にプログラミングの場合、重要な観点として「何を目的として」というのがあり、これは
- (プログラミング自体の)趣味として
- 実用として
- 工作の一環として (つまり、付随するものとして)
- 職能として (就職上有利にするため)
- 技芸として (より高度なことを目指して)
- 思考訓練として
といった観点が考えられます。
実用としてプログラミングを学ぶ、というのは「料理を学ぶ」というようなことに似ています。 料理ができなくても現代社会において生きていくのにどうしようもないほど困るわけではありませんが、料理ができれば活躍する場面は多いでしょう。それは直接的に自炊によって「おいしいものを食べる」「食べたいものを食べる」「節制につなげる」といったこともありますが、おいしくない料理を少しでもおいしく食べる方法、食材が傷んでないか判定すること、必要な食材が手に入らない状況で代用する方法、など、料理ができることを活用できる場面は多々あります。
職能として、というのは就職前に資格をとっておく、というようなものと似ています。 どちらかといえば、TOEICのスコアを上げておく、というのに近いかもしれません。
現実的には、職業として行使するプログラミングの能力は、至ってその会社など限られた範囲での常識とルールに基づいて行われるため、「仕事の手順を覚える」などと同レベルで一般化できないものです。ですから、職能として、職業訓練としてのプログラミングがそのまま活用できることはありません。 しかし素地にはなるため、プログラミングの経験や知識があることはいくらか有利に働きます。 とはいえ、実際に学ぶ側からすれば、その目的はあくまで「就職を有利にするため」に限るといって間違いではないでしょう。
「子供にプログラミング」での一大勢力は「工作」
世の中には「子供プログラミング教室」のようなものが結構ある(イベントとしてやっているものも多い)のですが、大多数が「電子工作」です。
電子工作の場合、主軸になるのはパーツの組み立て、配線、はんだ付けなどであって、プログラミングは「組み込みプログラミング」という、専用の言語を使って制御構造を書くものであり、プログラミング全般に通じる要素が非常に少ないので、「プログラミングを学ぶ」という上で電子工作を据えることには、私は強く反対しています。
もうひとつの勢力として、それ以前に「子供向けプログラミングといえば」ということで流行していたビジュアルプログラミングがあります。 特に人気だったのがScratchというMITメディアラボが開発したものです。
私見ですが、これは「体験」としては良いものの、将来につながるプログラミング知識の獲得という面ではあまりよくないと思っています。 条件式、ループ、アクションといった要素があり、プログラミングの要素はいくつかありますし、体験としてはプログラミング的な考え方を習得することができるでしょう。
しかし、これは「思考訓練として」という側面に特化した話になります。 そして、思考訓練としてプログラミング要素に触れるのであれば、RPGツクールのようなもののほうが良いと考えるのです。
職能としてのプログラミングが至上ではない
一般に「プロである」「それを仕事にしている」というのは、その技芸における頂点であるように捉えられがちです。
しかし、実際のところプログラミングにおいてはそうではありません。 「仕事にしている者は劣っている」ということではなく、「技芸としてのプログラミングは仕事にしているかどうかはあまり関係ない」ということです。
その理由は、プログラミングに創造性、そして芸術性があることにあります。 つまり、本質的にレベルが高いプログラミングというのはクリエイティブです。
しかし、音楽や映像作品、あるいは絵画と違って、プログラミングは消費者がプログラムそのものを評価して欲するものではありません。 一般消費者向けのプログラムというのはどちらかといえば(IT従事者の割合でいえば)少数派ですが1、その場合ですらもプログラミングと商行為はイコールではありません。 普通は、あくまでも商業的に企画され、制作されたものであり、プログラマはアーティストたりえません。「〇〇さんが書いたプログラムだから買おう」とはならないわけです。
こうなると、商業的なシステムが適用されることになります。 企業としては代替が効かないアーティストよりも、雇えば戦力になるマニュアルのほうが重要です。 規模が大きくなれば個人の能力ではどうしようもありません。「数を投入する」ということができるように「誰でもできる仕事」にしなければなりません。
企業運営上、「型に嵌める」というのは最も安全な方法です。 複雑で職人的なことをやらせるよりは、ベルトコンベアの単純作業にしたほうが良い、と考えるわけです。
そのため、IT企業において必要とされるのは「〇〇が遂行できる」ということであり、あくまでその企業が求める作業が行える、という作業者である必要があります。 そこにどの程度の技能が必要とされるかはさておき、それ自体に一般性はありません。そして、その人がアーティスト足り得る能力を持っていたとしても、スターではなく作業者にならなければならないのです。
職能としてのプログラミングというのは、企業として要求されることが多い、「会社ウケすることを覚える」ということを意味します。 「プログラミング」に限定しなければ、 IT企業への就職に備えてするべきことはExcelの操作を覚えることや、派遣に関する法律を覚えることです。
何が問題なのか
大学に対して「会社で求めている実用的なことを教えろ」と要求してしまうようなご時世ですから、基本的には企業にとって都合の良い、今企業が欲しがっている人材を育成するためというのが政府方針だと考えて間違いありません。 仮に国家戦略をそのまま受け取り、なおかつそれが成功すると仮定したとしても、それは個人資産を増やし、能力を充実させ、人生をよくすることを目的としているわけではなく、「AI製品を輸出して稼ぎたいので、AI製品を作れる人を増やそう」と言っているに過ぎません。
ここに
- AIという「今の」流行で未来を決めている
- それを言っている人がプログラミングについて知悉していないので見当違いなことを言っているのに気づけない
- 教える人はそもそもプログラミングなんてわかっていない
という問題が加わるわけです。
プログラミング言語としてPythonを使おう、というのも問題のあるところです。
Pythonが採用される理由は、「AIの開発において一番使われているから」です。
職能、セルフブランディングとして考えるのなら、後述するようにPythonを学ぶという選択肢は悪くありません。 むしろ私としては推奨できるくらいです。
しかし、未来を見据えた学校教育でPythonを使うというのはいくらなんでも問題があるように思います。 Pythonには確定した仕様というものはなく、作者の意思によっていくらでも変わります。 実際、Python2からPython3にかけては、Python2のことを学んでいた人の知識が役に立たなくなるような大きな変更が加えられました。
エンジニアにとっては、あるいはハッカーにとっては別に構わない話です。 自分が使う道具ですから、今まで使っていた道具が廃止になり、新しい道具に置き換わったとしても、それは最新の情報にアップデートし、使えるように知識を追加すれば良いだけです。 今までの知識が無駄になることなんて何も珍しくはありませんから、それほど難なく受け入れられます。
しかし、学校で学ぶことには普遍性が必要です。学校は(専門学校等でもなければ)専門的な教育や職業訓練をする場ではないからです。 そして、「Pythonを学ぶ」ことにはその普遍性がありません。
これは、「Pythonが悪い」といっているわけではありません。 「学校教育とPythonがなじまない」という話です。
実際、今まで学校で触るプログラムといえばBASICかCでしたが、「今や使いどころの一切ないBASICよりはだいぶマシ」と言えなくもありません。 ただ、BASICはそもそもが教育用ですし、実用性がないので、「あくまでも概念的な話」として受け入れることができます。 Cも、規格のある言語ではありますが、いくらなんでも学習には適さないので、Cというのもいかがなものか、と感じます。 「BASIC, C, Pythonのどれで教えるか」と聞かれたならば、私は苦い顔をしながらPythonと答えるでしょう。(私がPythonをあまり好まないので)
また、将来のことを考えて職能としてプログラミングしたいのだけれど、どの言語を学べば良いか、という質問には私は第一にPythonを挙げています。
今、IT業界で最も多いのはJavaであり、特にIT派遣業界におけるJavaは非常に大きな勢力です。 それ以外だと、WordPressというブログソフトウェアを中心としたPHP、「Ruby on Rails」というソフトウェアの利用を前提としたRubyが非常に大きな勢力だといえます。 これに、「ウェブフロントエンド」というくくりでこれらとは違った使わ方をするJavaScriptを加えて、これら4言語が日本のIT企業に就職するために備えられる主要な言語になります。
しかし、世界的に見ればPythonのほうが有力です。 最大の理由はGoogleが「JavaとPythonの会社」であることにありますが、世界的に見ると「結構どこもかしこもPython」な印象があります。 実用面で見ても、(AIも含めて)何か作るのにもっとも環境が揃っているのはPythonなので、Pythonを学んでおくと応用が効きやすいですから、トレンド変化にも強いと言えます。
日本のウェブサービスでPythonを採用する例はだいぶ少ないので、「日本のIT業界」を狙うならPythonはあまり有望ではなく、実際ITエンジニアでPythonを使う人はそこまで多くはありません。 ところが、外資系を狙うならばぜひ覚えておきたいのがPythonであり、少ないとはいえ日本でもPythonを採用するところはチャレンジングなところが多いことを踏まえれば「求人数こそすごく多いわけではないけれども、強いウリになる」ということが言えます。
JavaScriptがそれ以上の存在である、とも言えますが、JavaScriptだけで仕事ができることはだいぶ稀なので、むしろ「とりあえずJavaScriptとPython」というような話になる、と考えていただけると良いでしょう。
独特な考え方をするMimir Yokohamaのプログラミング授業
Mimir Yokohamaの家庭教師サービスでは、プログラミングに関する授業もしています。
実際には要望に応じてかなり幅広く取り扱いますが、基本となっているのは
- 基礎
- 実践
の2つです。
実践は実際にコードを書きながらトレーニングする、というものであり、スポーツのようなトレーニングになっています。 これはこれで独特ですが、本当に独特なのは「基礎」のほうです。
基礎の目標は先に挙げた
- (プログラミング自体の)趣味として
- 実用として
- 工作の一環として (つまり、付随するものとして)
- 職能として (就職上有利にするため)
- 技芸として (より高度なことを目指して)
- 思考訓練として
のいずれにも当てはまりません。
プログラミングの授業は、まず概要について学び、そして概念を学び、いよいよ言語について学ぶ、という形になっています。
思考訓練としてのプログラミングであれば、特に言語はなんでも良いと考えられますが、そうでもないの特定のにプログラミング言語によらない、というのは非常に独特だといえます。
そして、Mimir Yokohamaの授業は「思考訓練」ではなく、「プログラミングの知識の獲得」です。 ですから、やっていること自体はScratchで学ぶようなことではありますが、「〇〇という言語ではこう、〇〇だとこう」というように、その言語が実際にどのように使われるか、どのように表現されるか、ということを示したり、「〇〇という文化圏ではこう書くことが多い」「この機能は〇〇という文化圏でしか使われない」というような説明もされたりします。
目指すのは、「一般性のあるプログラミングの知識」です。
私が肩書上使えるプログラミング言語は
- Perl
- Ruby
- JavaScript
- Zsh
となっています。 しかし、程度を問わないのであれば
- BASIC
- C
- C++
- Java
- COBOL
- Elisp
- Common Lisp
- FORTRAN
- sed
- awk
- Python
- PHP
- Lua
なども扱えます。
多くの言語を扱えるのは、それだけ多くの言語を学んだから、と言えなくはありませんが、どちらかといえば「プログラミングにおける常識と概念」として認識しているから、という面が大きいです。
例えば、「イテレータ」という概念があります。 この概念は、私が得意とするRubyだと
%w(foo bar baz).each do |i|
#...
end
であり、Perlだと
foreach $i %w(foo bar baz) {
#...
}
Zshだと
for i in foo bar baz
do
#...
done
Luaだと
for i in pairs(["foo", "bar", "baz"]) do
-- ...
end
Pythonだと
for i in ["foo", "bar", "baz"]:
#...
Common Lispだと
dolist (i '("foo" "bar" "baz"))
(
(;...
) )
という感じです。似ているといえば似ていますが、各言語で明らかに表記方法は違い、表記方法で覚えるとなかなか大変です。 しかし、「イテレータ」という概念自体を理解していれば、「〇〇という言語ではイテレータはこういうふうに表現できるんだな」という理解が成り立ちますから、習得はかなり楽になります。 (ちなみに、イテレータは割と新しくて、高度な概念なので、C言語などにはありません。残念。)2
プログラミングを学ぶ上で、どうしても障害になるのが、「最初に覚えたプログラミング言語の概念や機能が当たり前だと覚えてしまうので、その言語と違う部分が入ってこない」ということであったりします。
かくいう私も、Perlをがっつりやってしまったために、現代では当たり前になっている「オブジェクト指向」が理解できない、という苦しみを抱えていた時代がありました。Perlにもオブジェクト指向そのものはあるのですが、Perlのオブジェクト指向は必要以上に複雑かつわかりにくく、概念も扱い方も独特なので、「Perlにおけるオブジェクトのイメージ」が染み付いてしまい、「普通のオブジェクトの考え方」が入ってこなかったのです。
こうしたことを踏まえ、Mimir Yokohamaのプログラミングの基礎授業では、特定のプログラミング言語を使うのではなく、あくまで概念として学び、その概念をいくつかのプログラミング言語で表現してみる、という方法で学習します。 これは、「『プログラミングできる人』になるための素地を作る」という考え方であると言えます。
この仮定では論理的思考力を構築するための思考訓練の要素も入ってきますし、概念を一通り覚える頃には「〇〇を書いてみましょう」とお題さえ与えられれば書けるようにもなります。 言語別になると、「発想し、検討し、構築し、設計する」という部分と、「良い形で書く」という部分などを学ぶことになります。
プログラミングの授業に関しては、実はMimir Yokohama以前から実施しており、「どのように教え、どのような知識を獲得するのがプログラミングの世界に広く渡って通用する普遍性のある知となるのか」ということを突き詰められています。 そのため、Mimir Yokohamaのプログラミング授業は、実は目玉であったりもします。
プログラミングの世界さえ理解していれば、職能として求められるプログラミング知識を獲得するのにそれほど時間はかかりませんから、「基礎を最初にやることが一番の近道」という形になります。 より高度なプログラミングの道へ進む場合は、その土台になります。
Mimir Yokohamaのプログラミング授業は、「生きていく上で、人生に渡って役立つ普遍的な知性を得る」ことがテーマです。