プログラミング教育とプログラミング教育で何の言語を使うべきかを真剣に考える。

# はじめに
[2020年度から小学生へのプログラミング教育が義務化される](http://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1403162.htm)ようになりますが、このことに関して皆様はどのように捉えていますか？

私は肯定的に捉えていますが、先生の負担は増えそうで大変ですね・・・

ということで、今回はプログラミング教育のことじたいとプログラミング教育で何の言語を使うべきかを、私の教育現場での経験を踏まえてそこそこ真面目に考えてみました。

*伝えたいことを書いていたら、だいぶ長くなってしまったので、飛ばし飛ばしか時間のあるときにどうぞ*

# 私の経歴
まず本題に入る前に私の経歴（主に教育周り）をざっくり紹介します

- 生まれ：平成入ってすぐ
- はじめてのPC：Windows me（タイピングソフトとマインスイーパーばかりやってた
- はじめてのプログラミング：中学１年（Java）
- 大学：工学部の電気・電子・情報科（あとで細分化→情報コースへ進む）
- 大学院：情報系で 大学内のTA + 教育実習と情報科教育法で現場（高校。計１ヶ月分ぐらい）
- バイトなど：家庭教師 約半年（中高 数学・英語）
- 教員経験：非常勤 約１年（高校情報）
- 教育方針：~~顔が怖いので~~アメ１０割

※ なお、記事執筆時点では教員ではありません

# プログラミング教育の義務化とは？
文科省の[このページ](http://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1375607.htm)に色々と載っています。

今回の「小学生へのプログラミング教育の義務化」は平成２９年３月に告示された新しい学習指導要領の目玉の１つなのですが、情報関連の変更点として大きく以下の３つがあります。

1. 情報活用能力を「通常の」学習の基盤とする
2. 学校内のICTを活用する
3. **小学校においては、文字入力など基本的な操作を習得、プログラミング的思考を育成** 

1はもっとググれってことでしょう（たぶん）。２は予算消費のために買ったICTをちゃんと使えということでしょう（きっと）。今回の主題は３のため、１と２の議論は省略します。

で、問題なのが３です。以下は「[小学校学習指導要領（平成 29 年告示）解説 総則編](http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387017_001.pdf)」から引っ張ってきた文になります。引っ張ってきても少し長いので大切な部分は強調しておきました。

> (前略)子供たちが**将来どのような職業に就くとしても時代を越えて普遍的に求められる「プログラミング的思考」（自分が意図する一連の活動を実現するために，どのような動きの組合せが必要であり，一つ一つの動きに対応した記号を，どのように組み合わせたらいいのか，記号の組合せをどのように改善していけば，より意図した活動に近づくのか，といったことを論理的に考えていく力）**を育むため，小学校においては，児童が**プログラミングを体験しながら**，コンピュータに意図した処理を行わせるために必要な論理的思考力を身に付けるための学習活動を計画的に実施することとしている。その際，小学校段階において学習活動としてプログラミングに取り組むねらいは，**プログラミング言語を覚えたり，プログラミングの技能を習得したりといったことではなく**，論理的思考力を育むとともに，プログラムの働きやよさ，情報社会がコンピュータをはじめとする情報技術によって支えられていることなどに気付き，身近な問題の解決に主体的に取り組む態度やコンピュータ等を上手に活用してよりよい社会を築いていこうとする態度などを育むこと，さらに，教科等で学ぶ知識及び技能等をより確実に身に付けさせることにある。したがって，教科等における学習上の必要性や学習内容と関連付けながら計画的かつ無理なく確実に実施されるものであることに留意する必要があることを踏まえ，小学校においては，教育課程全体を見渡し，プログラミングを実施する単元を位置付けていく学年や教科等を決定する必要がある。なお，小学校学習指導要領では，算数科，理科，総合的な学習の時間において（以下略） p85~86より


学生時代これを呼んだ感想は、「小学生にどれだけ求めてるんだよｗｗｗ」でした。私に情報科を教えていただいた高校の先生も「小学校の先生は大変になるねぇ〜」のようなことをおっしゃっていたと思います。

要するに、文科省は子どもたちに**プログラミング的思考**をつけさせたいようです。その過程で**，プログラミング技能の習得は不要**で、情報技術によって支えられていることに気づかせてほしいということです。

つまり、子どもたちに体験させるプログラミング言語は何でもよい訳で、効果的な授業・学習を進めるためにもその言語の選び方が重要になってくるのは言うまでもありません。

なお、**「プログラミング教育」 ≠ 「コーディングを伴うプログラミング」**な点に気をつけてください。文科省の謳う「プログラミング教育」では、「身の周りにプログラムが活用されおり、それが条件に応じて動作していることに気付く」ことも「プログラミング教育」の一貫としており、ここでの「プログラミング」はかなり広義な意味を持っていると言って良いでしょう。


# 平成最後の高校生・大学生のICT・プログラミング技能
さて、ここで少し話を変えて、私がティーチングアシスタント（TA）、カテキョ、講師をしていた時の生徒・学生たちのICT事情を紹介しましょう。だいたい、平成２６〜30年あたりの話と考えてください。また高校は公立・田舎での話ですので、私立や都会とは大きく状況が異なるかもしれません

## 高校
私が授業を持ったクラスでは、生徒たちのICT活用状況を知るためにまずICT活用に関するアンケートを実施していました。そこから見えてくることは、

- 自宅に自分用のPCを持っている生徒は非常に稀（5%以下）で、**そもそも自宅にPCが無い生徒（約10%）や親の仕事用のPCしか無い生徒がいる(約30%)**
- 一方で**スマートフォンの所持率は95%を超える**（田舎でも高校入学時点で持たせる親御さんが多いようです）

といった感じです。冗談抜きでまずPCの電源のON/OFFを教えないと不安なレベルの生徒がそれなりにいます。
また、タイピング技術は絶望的です。利き手の人指し指のみでポチポチしている生徒が１０〜２０％くらいいるため、毎授業のはじめに５分程度時間を取りタイピング練習アプリケーションで練習をさせていました。

PCを扱う能力の低い生徒たちは決して彼らが悪いのではなく、単に今まで経験したことがないだけです。実際にどのような生徒でも１年取り組めば、両手（ブラインドタッチはさすがに無理です）でタイピングして、MS Office３種をちゃんと扱えるようになります（ました）。

逆に、**ICT能力の高い生徒はどの程度いたかというと、４０人クラスに１人いるかいないかのレベル**でした。そのような生徒は、プログラミングに興味があったり、PCゲームをしていたり、日常的にブログや動画投稿をしていたり、イラストレーターを使っていたりするらしいのですが、「う〜ん・・・人口少ないなぁ」というのが正直な感想です。やはり、スマートフォンに吸われているようですね。

なお、何かのプログラミング言語を用いてコーディングをするという授業をしたことはありませんでした。**主な原因は授業時間が足りないためです**。JavaScriptなどに少しだけでも触れさせてあげれたらと思っていましたが、中途半端なら他のことに時間を回すべきだと考えて、結局プログラミングの授業をすることはありませんでした。

## 大学
大学では主にTAとして、まれに教授に講義を~~丸投げ~~任されてプログラミングを学生に教えていました。私のいた大学は総合大学で、担当した講義すべてを一括りにできないため、以下の３つに分けて話します。

- 全学部が対象の「全学教育」
- 工学部の電気・電子・情報科が対象の「専門教育」
- 工学部の電気・電子・情報科の情報コース向けの「コース別教育」

### 全学教育
全学教育では、文学部などの文系から医学部など理系のすべて必修の講義を担当していました。
なお、電源のON/OFF方法などをはじめとして基本的なPCの操作方法も解説しますが、（差はもちろんありますが）高校でMS Office程度のPC技能を習得してるようでした。
しかし、プログラミングの経験や知識はほぼなく、この全学教育の講義ではじめてのプログラミングをするという学生が大半でした（９５％くらい）。

--- 
#### ちょっと余談： なぜC言語が講義で使われるのか？
講義ではC言語を使っていました。今でもC言語を講義で使っている大学も多いと思います。古くない？と感じつつ、先輩TAや個人的に理由を考えてみると以下の３点にいきつきました。

1. Linux環境であれば動作環境の構築・設定が不要なこと
2. メジャーなコンパイラ言語であること
3. 融通のきかないこと

1は教える側の都合なので議論を省きますが、教える側のコスパも考慮すべきという点は心がけたいです。

2に関してですが、本格的にプログラミングを教えるのであれば、はじめはコンパイラ言語がよいと考えています。というのも、ICTを利用者でなく開発者として携わるなら「機械語」という概念を理解することは必須であると考えており、コンパイラ言語なら嫌でも「機械語」知ることになります。また、メジャーなためネット上にたくさんドキュメントが落ちていることや、[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp)などで問題の提供と自動正誤判定をしてくれるサービスがあるなど、様々利点があります。

3に関してですが、基本的にコンピュータは命令されたことを命令通りに実行する融通の効かないモノなので、これらが意識できる言語をはじめに学ぶべきだと考えています。たとえば、型宣言をキッチリする必要があり、括弧で命令のスコープを指定する、といった言語です。~~（お前が例外なんやぞPython~~

---

さて、実際の講義中の学生の様子ですが、全体的にやる気がない感じで、楽しんでやるというより、黙々と作業をこなす学生が目立ちます。

その原因は（少なくとも人間には）課題が簡単すぎるため、もしくは与えられた問題に現実味がないためです。たとえば、以下の問題はどう感じますか？

> 問. xの二乗の解を、x=1~100(整数)まで出力するプログラムを作りなさい。

このような類の問題は、よくfor文の練習としてよく見かけますね。ループの便利さを実感させる例ですが、１つ１つの計算は単純（かつ意味がない）なため、「これに一体何の意味があるんだ・・・」と感じる学生も多いようです。

とはいうものの、未経験者にいきなり「マージソートやろっか☆」というのも不可能で、単純でも基礎から教えていく必要があります。教える側としては、プログラミングして得られる嬉しさを学生に伝えて行く必要があると言えます。

一方で、このような問題はあくまで「プログラミング技能」の勉強であり、プログラミング的思考能力や論理的思考力の育成には繋がりません。

### 専門教育
専門教育では、より本格的なプログラミングとしてマージソートなどのメジャーなアルゴリズムの実装を課題にします。使用する言語は「全学教育」の関係上C言語でした。

やっと本格的なプログラミングの講義になってきた・・・のですが、「専門教育」は「工学部の電気・電子・情報科」が対象のため、電気や電子系の一部の学生からは「俺はこんなことをするためにこの大学に来たんじゃない！！」オーラをものすごく感じます。~~（なお一部必修の模様~~

なお年数人はコピペチェッカーに引っかかるので、（オーラとかの雰囲気だけでなく）興味のない学生たちがいるのは事実のようです。

オーラの話はともかく、このレベルになるとICTに興味があるかないかで、「ICT周りの基本的能力」や「プログラミングの能力」に大きな差が出ているように感じます。

といっても、鶏が先か卵が先か問題で「興味」と「能力」どちらが先かわからないですが、少なくとも「趣味で動画作ってます」や「バイトでPCへデータの入力やってます」など普段からPCを使っている学生は、総じて課題の出来も良いものでした。

「マージソート」などのアルゴリズムをしっかりと考えて構築しなければならない段階になってようやくプログラミング的思考能力や論理的思考力が育っていきますが、興味のない学生にとってはなぜ取り組んでいるのかわからず「？」状態なのでしょう。そのかわりと言って何ですが、このレベルのプログラミングに真剣に取り組むことで、「プログラミング的思考能力」や「論理的思考力」が飛躍的に向上すると感じています。


### コース別教育
コース別教育では、情報コースを希望した学生のみが受講することもあり、プログラミングに関する関心は非常に高いです。このレベルになると趣味でプログラミングをしている学生（それでも半分いるかいないかですが）も多く、またゼミ・研究室でプログラミングしていることもあり、プログラミング課題で使用する言語も任意（マイナーなのは勘弁してくれといいますが）にしています。

また課題のレベルも高く、かなり高度なプログラミング技術が必要になるものもあります（「ブラウザ上で動くアプリの作成」「単語ベクトルのクラスタリング」「固有表現抽出器の学習」など）。しかし、専門教育で説明したような講義をいくつもこなしてきていることもあり、なんなく課題を完成させます（ほとんどの学生は８０点以上をあげるレベルです。AとかAAとかになるのかな？）。


## 高校・大学のICT・プログラミング技能まとめ
さて、長くなりましたがまとめますと、

- 高校入学時にPCをまともに扱えない生徒がいるが、１年の授業で基本は身につく
- 現状高校で本格的なプログラミングの授業を実施するためには時間が足りない
- 実際にコーディングをするのは大学に入ってからで、大半の学生はプログラミングの知識ゼロである
- 「プログラミング的思考能力や論理的思考力の育成」のため「アルゴリズムを考える必要があるレベルのプログラミング」に取り組ませたい
- 「アルゴリズムを考える必要があるレベルのプログラミング」だと、個人のICTへの興味や能力が教育・学習へ大きく影響する

# 本題
さて、「プログラミング教育で何の言語を使うべきか」という元々の話に戻しましょう。

*以降、上記の現状を踏まえて、私自身の主観だらけの内容をお送りします*

## 小学校
**そもそもコーディングを伴うプログラミング自体不要です。**
「は？」と思う方も多いと思いますが、不要というよりも、実施することがかなり厳しいといった方が良いかもしれません。

上記の私の教員経験談で、「高校生なら１年で基本的なPCのスキルを取得できる」と話しました。１年と書きましたが、実際にはもっと短い期間でタイピングなどはこなせるようになるでしょう。長く見て半年くらいでしょうか？半年後であれば、大学１年生時に受講する全学教育でのプログラミング講義を受け、一通りのプログラミングスキルを身につけることができるでしょう。「PC未経験」から「簡単なコーディング」まで、約１年で身につけさせることができると思います。

しかし、これはあくまで高校生での話です。実はコーディングを実施するためには様々な基本的技能が必要です。たとえば、大学生では`xの二乗`が簡単な計算だと言いましたが、小学生ではどうでしょうか？また「繰り返し」という概念を正しく理解できるでしょうか？そもそもローマ字を理解しているでしょうか？もっと言えば電源のON/OFFの概念を正しく理解しているでしょうか？

と、最後の方はさておき、実際に論理的思考能力への教育効果のあるレベルのコーディング（e.g. マージソートレベル）をさせるためには、大学生（高校生）レベルで直感的に感じることができる概念や、常識的知識を習得している必要があります。~~（まあ、それがプログラミング的思考能力かもしれませんが・・・~~

ところで**「小学校って情報の時間なんかあった？いつやるの？」** と思ったあなた。ご安心ください。しっかりと書いてあります。

> なお，小学校学習指導要領では，算数科，理科，総合的な学習の時間において（以下略

総合的な学習の時間でやってくださいとのことです。~~えっ？算数科？理科？今でもギリギリなのに、そんな時間取れるわけ無いだろ！いい加減にしろ！~~

といったように、知識や概念以前の問題として**そもそも授業時間が確保できない**んですよね。結局、ちまちま総合的な学習の時間に組み込むことが限界でしょうか。ホントは授業にICTを取り入れて、算数科とかで四則演算の課題を解いたり、理科で動画やシミュレーションを操作させたり見せたりできるといいんですけどね。現実的には、算数や理科がほんの少しかわり、総合的な学習の時間でPCを触る時間が増える程度になると思います。

なお元高校教員（情報）の立場からすると、小学校では「プログラミング教育」というフワッとしたものよりも、情報モラルの勉強やPCの基本的技術の習得に時間を割いてほしいというのが実際のところです。

## 中学校
小学校が↑のような状態なので、中学校でもほとんどコーディングすることはできないでしょう。
したがって、「どのプログラミング言語が良いか？」という議論が始まりません。

それよりも、高校のときにプログラミングの授業をするために**中学校でPC周りの基本的スキルを一定以上にして欲しいと感じています。**

というのも、高校で非常勤をやっていたときに、出身中学によってPCスキルがマチマチだったという経験があるからです。あの中学はWordとExcelをきっちりやってる、こっちはWordちょっと、ここは全く・・・といった感じで本当にバラバラなんですね。多分高校で情報を担当されている先生方は皆様体験していることだと思います。

そのため、中学時代にある程度やってきた生徒にも、中学時代に情報の授業をやって来なかった生徒と同じ内容の授業をしなければならない訳で、もったいないのなんの。中学卒業時点でMS Office３種扱えますってレベルなら、高校の授業でぞんぶんにプログラミングの授業ができるようになり、プログラミングを教えたかった私としては嬉しい限りです（もう教員ではないので過去形ですが）。~~早い時期からプログラミング教育を実施するよりも、情報技術を扱う能力を鍛えるべきそうすべき~~

**したがって、文科省は中学校へ全国で共通のICTに関する基本的な能力を測る指標を導入し、その値を一定数以上に上げる努力をすべきである。**

一方プログラミング教育ですが、中学生であればある程度常識的知識や一般概念が育ってきていると思うので、**現実の問題にアルゴリズムの考え方を落とし込んでみる**のが良いと思います。たとえば、身近で単純な機械のアルゴリズムを概念スキーマ的に紹介したり考えさせたり、校内の特定の場所へ誘導するための命令文を紙に書かせ、他人に渡して実際にたどり着けるか試したりなどです（後者の話は、高校生へ講義して、そこそこ好評でした）。

なおコーディングの一歩手前の教材として[アルゴロジック](https://home.jeita.or.jp/is/highschool/algo/index.html)などの論理的思考能力を高めるWebサービスを使ってみるのも良いでしょう。プログラミングの基礎的な知識も身につくので**時間があれば**おすすめです。~~そりゃ増やされるだけだったら、時間は足りなくなるよなぁ！~~


## 高校
中学校まででPCの基本的な操作技術が身についていれば、高校の時点でようやく本格的なプログラミングの授業を始めることができると思います。（プログラミング言語まで長かった・・・

なお、目標はマージソートや動的計画法などの論理的思考能力が鍛えられるアルゴリズムの実装で、高校生レベルの数学力・思考力であれば前提知識や概念、実応用先の理解も可能でしょう。

で、本題である何の言語を使うかですが、主なポイントは4つです。

1. メジャーな言語で、将来性が高いこと
2. 導入コストが低いこと
3. 文法がわかりやすいこと
4. 情報の授業以外で（高校生にとって）実用的であること

1ですが、はじめてプログラミング言語にふれることになるので、メジャーな言語で、できれば将来的にも使う機会がある言語であることが望ましいです

2ですが、お金も時間も手間がないほうが良いことは言うまでもありません。**特にお金は重要**な問題で、公立高校の予算は雀の涙なので、できれば無料のものを使いたいです

3ですが、はじめてのコーディングなのでいわゆるとっつきにくい言語は避けたいです。必要最低限なコードの量や「おまじない」が少なく、読みやすい言語が良いです。なお、高校生レベルでは数千行に連なる大きなコードは書かない想定します。

4ですが、生徒がせっかく習うので、生徒が恩恵の得やすい言語が良いと思います。といっても、統計的な処理＋可視化くらいで、数学や理科で出てきた数式・グラフの可視化ができれば良いのではないでしょうか。

上記の４点を踏まえると、候補となるのはPython, JavaScript, C言語あたりに落ち着くと思います。

次点だった候補外
- Java: メジャーだが、コード量が多くなりがち。
- Ruby: 今から習うならPython
- PHP: 今から習うならJavaScript
- MATLAB: 金銭的に辛い

導入コストが最も安いのはどう考えてもJavaScriptです、Windows環境でもほぼ何もしなくて良いのは素晴らしい限り。ただ、アルゴリズムが複雑になってくると面倒そうです。

PythonもAnacondaを放り込めばWindowsでも動くので比較的低コストです。また、人間的に読みやすいのも利点です。

C言語は少し導入コストが高いですが、コンパイラ言語である点が、「機械語」という概念を理解する上で非常にプラスです。


# まとめ
- 「プログラミング教育」 ≠ 「コーディングするプログラミング」
- 小・中学生時はコーディングしない「プログラミング教育」で「プログラミング的思考」を身につけさせるのが現実的
- 小学生時は情報モラルやICTの基本的技術の習得に時間を割いてほしい
- 中学生時に全国統一で一定以上のPCスキルを身に着けてほしい
- 実際にコーディングするのは高校生からが現実的で、やるなら論理的思考能力が鍛えられるマージソートや動的計画法までやりたい
- プログラミング言語はPython、JavaScript、C言語がよさげ


# 参考
[文部科学省 教育の情報化の推進 プログラミング教育](http://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1375607.htm)
[小学校学習指導要領（平成 29 年告示）解説 総則編](http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387017_001.pdf)