小中高大生にプログラミング教育をしてきて分かったこと

# はじめに

私はこれまでにアルバイトやTA (Teaching Assistant)を通して小学生、中学生、高校生、大学生にプログラミング教育をしてきました。また、予備校に通って一浪して大学に入学したという経歴もあります。これらの経験から、「教育とはどうすべきか」「学ぶのに必要なものは何か」「プログラミング学習の特別な点はなにか」などを自分なりに悟りました。

本記事ではこれらのことを踏まえながら、「プログラミングが上達しない人の傾向」や「よく陥るエラー」などを紹介しつつ、プログラミング教育者がすべきことのヒントを示せたらいいかなと思います。

※本記事はプログラミング教育のハウツーをまとめたものではありません。

# プログラミングが上達しない人の傾向

- **検索力が低い**、検索の仕方を知らない、知ろうとしない
- 調べる癖がない、分からなかったことを分からないままにしていても生きていられる
- 説明文を読まない、あるいは**文字が読めていても内容は理解していない**
- **エラー文や警告文を恐れている**・読まない・目に入っていない
- 日本語じゃないと諦める（英語を読みたがらない・恐れている）
- 分かっていないのに分かったフリをする
- プログラミングができる人やハッカーのことを雲の上の存在だと思い込んでいる
- 自分はできる方の人間だと思い込み、先人(年齢や経歴は関係ない)を敬わない
- まだ早い（学ぶに足りるほどの知識や知能のベースが出来上がっていない）
- 達成したいことに対する情熱が足りない
- 知的好奇心がない(そもそも考えることがあまり好きではない)
- 論理的思考能力が育っていない
- **プログラミングを学ぶことが目的(ゴール)になっている**

ほとんどの項目は、意識を変えるだけで覆せます。教育者がしてあげなければならないことの根本は、**意識改善**であると思っています。
もしもこれからプログラミングを始めようとしている、あるいはプログラミング学習を始めたばかりという人がこの記事を読んでくれているのであれば、ぜひともこのリストに並ぶ項目の何がいけないかの本質について考えてみてほしいです。

# プログラミングが向いている子の特徴

- ものづくりが好きな子
- 仕組みを考えるのが好きな子
- ゲームのセンスがある子（ゲームをプレイするのが好きな子という意味ではない）
- 生活環境を快適にするのが好きな子
- 効率の良さにロマンを感じる子
- 限られた条件下で工夫することができる子（無いものを代用品でなんとかしたり）
- 単純なことでも喜びを感じられる子（それこそ，Hello Worldと表示されるだけでも嬉しいとか）

# 初心者が気にしていること

## タイピング速度の遅さ

タイピング速度の遅さに関しては、**気にしなくて**OKです。続けていれば速くなっていきますし、速ければいいということではないので。プログラマは文字打ってる時間よりも考えている時間の方が長いと思いますし。タイピングができないから自分にはできないと諦めてしまう場合がありますが、ゆっくりでもいいから自分のペースでやろうと励ましましょう。

※勘違いしていらっしゃる方が多いようですが、タイピング速度が学習において重要でない訳ではありません。むしろ重要なファクターの１つです。ただ，タイピングが遅いから・タイピングが苦手だからとプログラミングの習得を端から諦めるのは間違っていると思うのです。

## 経験のなさ

経験のなさについては、気にするくらいならその時間で一つでも多くコードを書いて、アルゴリズムを組んで、アプリを作って、リリースしようとしか言いようがないですね。どんな一流プログラマも未経験だった時代がありますよね。

## 質問をする行為に対する恥じらい

「質問をする行為に対する恥じらい」に関しては、プログラミングに限った話ではありませんよね。本当にもったいないです。独学で一度挫折した経験がある身としては、質問ができる環境というのは恵まれていると思います。分かるようになれるチャンスなのでいっぱい質問をしましょう。
「質問」に関する話でもっと大切なのは、「誰に教えを乞うのか」ということです。説明の仕方が合わない人や質問者がどのくらい分かっていないのかを配慮できない人に教えを乞うてもダメです。時間の無駄です。余計分からなくなる可能性の方が高いまであります。

# 初心者がよく陥るエラーベスト５

1. スペルミス、大文字小文字の間違え（エラーの80%以上がこれ）
2. 閉じ括弧がない、セミコロンがない
3. 初期化しないで変数を使う（いわゆるぬるぽ）
4. 作った関数を呼び出していない、呼び出すタイミングが間違っている
5. 保存していない、更新していない

よく陥るエラーの栄えある第1位は**スペルミス**、**大文字小文字の間違え**です。よくあるのは、`b`と`d`、`p`と`q`、`l`と`1`、`m`と`n`の間違いですね。リファレンスを写すときはちゃんと見て、単語を読んでくれという思いですが、やはり英語が苦手な人だと結構間違いあるんですよね。あとは大学生でもタイピングミスは割とあります。IDEの補完・修正を利用してほしいものです。

第2位の「閉じ括弧がない、セミコロンがない」というのはあるあるなミスですよね。私はこれについて教えるとき、「セミコロンがないのはトイレに行った後おしりを拭かないのと一緒だよ」と説明しています。小中学生はハッとした顔をして次からこのミスはかなり減りますね。

第3位の「初期化しないで変数を使う」NULL落ちに関しては本職のプログラマでもたまにある話ですよね。NULLという難しい概念の説明としては、「財布にお金入っていないと困るでしょ。使う前に中身を入れておかないといけないね。」という風に説明しています。みんな「困る〜(￣∇￣)」と返事をします。

第4位の「作った関数を呼び出していない、呼び出すタイミングが間違っている」はちょっと高度でお茶目なミスですよね。
生徒「頑張って書いたのに動かないの〜」
私「ん？...いや、作ったのに使ってないや〜ん」
というやりとりは結構ありましたね。
呼び出すタイミングが間違っているというのはようやくロジックに関わるミスですね。プログラムは上から順に処理されていくというのを理解していないと起こりやすいミスです。

第5位の「保存していない、更新していない」は教える側としては結構ずっこけますね。全然コードが間違ってないのに警告やエラー表示がされていて頭を捻ったのに更新やクリアを行ったら動くというパターン。IDEの反応が鈍くなることたまにあるので、一旦更新をかけてみるというのは覚えておくと良かったりします。

全体として、初心者のミスはロジックによるものではありません。正直教師が必要なものではありませんね。しかし、大抵のプログラミング教育の現場では、凄腕のプログラマがそのスキルリソースを発揮しなくてもいいようなミスへの対応に忙しいのです。

# 先生のぼやき

- **お願いだからインデントしてください**
- Copy,Paste,Cut,Undoのショートカットを知ってください
- Tabを使うことを覚えてください
- 画面を確認しながら文字を入力してください
- 保存をしてください
- 変数名と関数名を「自分の名前+数字」にしないでください
- 同じコードをコピーして各所の末尾に`2`をつけるのをやめてください
- 質問をしてください
- 話を聞いてください
- メモをとってください

※「IDEの機能を使えばいくつかは補えるだろ」と言っている方がいらっしゃいましたが、その方は現場にいないので分かっていないのだと思います。甘くみています。一部の生徒はIDEのありがたい機能を全て台無しにする特殊スキルを持ち、何度やり方を教えても改善しないのです。そもそも、プログラミングという新しいものを学ぶ時にIDEの使い方まで学ぶというのは、学ぶべきことが膨大で、生徒のキャパシティを超えているのだと思います。

# プログラミングを学び始めるベストな時期

言語ベースのプログラミングを習学するのに最適なタイミングは、中学3年生〜高校１年生だと思います。理由としては

- 負の数の概念を学んでいるなど基本的な**数学知識が修得済み**である
- 一般的な英単語が読め、**未知の英単語でも推論ができる**
- **自己管理能力**が身につき始める

などが挙げられます。と言っても、人によりけりで、小学生でも大学生顔負けの論理的思考能力や数学力を有している子もいますので、あくまで目安ですが。英才教育として（あくまで言語ベースでのプログラミングに関しては）やれば良いというものではないと思います。

言語ベース以外のものとしては、Scratchとかマインクラフトとか、最近ではNINTENDO LABとかありますので、そちらからやってみるというのはありだと思います。あまりにも理解力や知能のベースが出来上がっていない状態で始める必要性はないと思います。本人も楽しくないと思いますし...。　

# プログラミング学習の特別な点はなにか

- 正解が一つではない点
- 学んだことがすぐに活かせる点
- 身に付けることにより生活での生産性、効率が向上する点
- 語学力、数学力を同時にある程度高いレベルで必要とする点

# 結局のところ...

極論を述べます。
ズバリ「**できるやつは自力[^1]で伸びる。できないやつは教えても無駄[^2]。**」ですね。

「なんだ、それじゃあ教育者なんかいらないじゃないか。読んで損した...。」と思われるかもしれませんが、これはできない人にはどんな風に教えても意味がないという**ネガティブなことを言いたいのではありません**。

「**本人のやる気なしでは成長は見込めない**」という実体験・実務経験に基づく私の見解です。

では、教育者は何をすればいいのか？　保護者は何をすればいいのか？　

教育者は**好きになるきっかけ**を与えてあげればいいのです。
保護者は**好きなもの・夢中になれるもの**を見つけてあげればいいのです。

ことわざでも「**好きこそ物の上手なれ**」といいますね。

しかし、本人のやる気スイッチ（潜在能力）をみつけることは非常に難しいです。
（私は、例えば野球が好きな子なら野球のルールで例えるとか、ゲームが好きな子ならゲームのキャラクターの動きで例えるとか、そういった工夫をして本人がピンときてくれるまで粘りました。そのため、まず生徒の目線になって、どんなことにはまっているかや最近楽しかったことなど話を聞くことが大事です。）

つまり、「生徒を**できるやつにする**ためには、生徒を**自立させる**ことが大切」です。
ことプログラミングに関しては、自ら経験を積んで学び、実力に変えていくことが必要不可欠です。何故ならば、プログラミングは答え合わせをするようなものではなく、試験で穴埋めをする力があれば良いというものではないからです。暗記教科じゃないのです。

はじめに述べた極論の真意は、「**できるやつにしたいなら自立させるべき、できないやつを好転させたいなら、教材を用いて教える前に自立するきっかけを与えるべき**」です。

ここで、「自立させる」というのは、放置できるようにするという意味ではありません！「**作りたい・学びたい・試したい**」と**自発的に思わせる**ことです。教育者は生徒が困った時に支えてあげられるよう万全の準備をしておく必要があります。１つの項目に対して10倍の経験と知識を持つのが理想ですし、どんな生徒であっても伝わるように様々なパターンの比喩表現を日々編み出していく努力が欠かせません。

義務教育の良くないところは、好きになるきっかけを与えてあげられるようなカリキュラムが組まれていない、授業がなされていないことだと思います（少なくとも自分にとってはそうでした）。保護者の抱える問題は、自分の理想を子供に押し付けてしまいがちということだと思います。子供たちの未来のこと、子供たちの幸せのことを本当に考えてますか？ということです。自分の理解できないものに子供がハマっている時、あなたはどんな態度をとるでしょうか。その子の才能を最大限発揮できる舞台は、あなたの範疇を超える世界にあるかもしれません。でもちゃんと見てあげて、話を聞いてあげてほしいです。そこから、学びは始まるのだと思います（大学院生のガキが何言ってんだと思われるかもしれませんね、恐縮です）。

第一ステップとして、子供達にとって本当に必要なものは、「夢中になれるもの」「憧れの存在（なりたい人物像)」だと思います。これを超えた先に関しては私はまだはっきりとはわかっていませんが、第二ステップで必要なものは「ライバル」「野望」「執念」ではないかと推測しています。

[^1]: ここでの「自力」とは他人の助けを一切借りないことではなく、能動的に課題に挑戦することに加え、自発的に質問することも含めます。
[^2]: 「無駄」＝「聞く耳を持っていないのでそのままでは成長に繋げてあげられない」の意です．

# 好きになるきっかけ
好きになるきっかけが大事だとわかったけれど、その具体的な方法やその先が知りたいという意見が多数あったので、参考までに実際にあったやる気スイッチが入った瞬間の例を挙げたいと思います。

## 小学生の場合
変数にとんでもなく大きい値を入れたり、プログラムの挙動を激しくランダムにしたりといったことで、出力結果が荒ぶるのを見て楽しいと感じ、今度はこっちの値を変えてみよう、こっちのループもたくさん入れ子にしようといった風に自らプログラムをいじるようになったことがありました。
また、いたずらが好きな子の場合、先生を驚かせたり、困らせたりしようとしてプログラムをいじっている間に、いつのまにか夢中になってプログラミングにハマったというケースもありました（これは、教本通りにカリキュラムを進めてもらうことが必ずしも良い訳ではないことを示しているかもしれません）。
中には、ペットを飼っていて動物の画像を扱うアプリの開発に意欲が爆発したパターンや、音声を扱うアプリで自分の声を録音して組み込むことに没頭したパターンもありました。

なんとなくですが、思い通りに動くこと、あるいは予想外の動きをすることに喜びを感じることでエンジンがかかっているような気がします。

## 中学生の場合
中学生になると、他人を意識するようになってくるので、生徒同士の開発物の見せ合いがかなり効果的なことがありました。お互いの開発物の良い所や改善点などを言い合い、競うように開発する空気を作ることで、触発されたパターンもありました。一方で、他人と接することが苦手な子もいるので、開発物の見せ合いを強制参加にするのは逆効果の可能性があります。

中学生は体格や理解力などの差が大きいこともあり、思春期に入りセンシティブな部分もあるので、同じ目線に立った対話を繰り返すことが重要だと思います。

## 高校生の場合
私が担当したことのある高校生の生徒は、すでに作りたいものがあったり、プログラミングに対する意欲があったため、やる気スイッチがオンになった瞬間について、直接参考になる例はありません。ただ、マンネリ化してきたり気分が乗らなかった時、教本にはないテクニック講座なんかを休憩がてら行うことで、気持ちが切り替わったことがありました。

生徒それぞれにツボが違うので万能な解はありませんが、何か足がかりになれば幸いです。

# プログラミング学習のフローチャート
あくまで参考としてですが、私なりに導き出したプログラミング学習のフローチャートが以下になります。
## 基本編
大雑把に箇条書きで説明すると、次の型にはまれたら勝ちです。

1. とにかく作りたいものを見つけます
2. 作ります
3. 改善します
4. これをひたすら繰り返します
5. いつの間にかプログラミング強いマンになっています

図としてはこんな感じです。
![プログラミング学習のフローチャート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/efa36f40-f4ce-22e3-0445-bd137add3eb7.png)

プログラミング言語の構文や開発手法については、ざっと入門書を読むといいと思いますが、念入りにする必要はないと思います。必要な時に必要なことをその都度学んで実際に使っていくことが定着に繋がると思います。

## 作りたいものがどうしても見つからない場合編
正直なところ、作りたいものがないならプログラミングを学ぶ必要はないと思うのですが、それでは話が終わってしまうので、作りたいものがないパターンについて考えてみました。

1. とにかく作ります
2. 作ったものを使ってみて、不満な所、もっとこうしたほうがいいのにという点を見つけます
3. 改善します
4. これをひたすら繰り返します
5. いつか作りたいものを見つけたら基本編に移行します

図としてはこんな感じです。
![プログラミング学習のフローチャート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/6deaaa0e-a671-f565-15a8-59fd1496d10f.png)

与えられた課題でもたまたま手にした参考書にあった例でもなんでも良いので見よう見まねで作りましょう。そして、次が大事なのですが、できたものを**自分でしっかりと評価**しましょう。評価することによって開発物と向き合うことが学習の種になると思います。

# 面白い気づき
自分で記事を読み直していて思い出したのですが、**プログラミングを教えている側の方が何倍も速く広く深くプログラミングを学習する**んですよね。料金を支払って学びにきている生徒よりも、給料を貰って教えている方が学び[^3]があるというのは不思議な話です(といっても教える側の給料は現場のハードさに比べて低いかもですが…)。ただ、生徒の年齢層や教える範囲が決まっている場合は、それ以上のことには触れないので、学べることの限界はありますね。

[^3]: ここでいう学びはプログラミングに限ったことではありませんね。教えることの難しさやコミュニケーションの仕方、今という時代の保護者の実態、子供の生態など…。

# 関連記事
大学生相手にTAをやっていた頃の記事です。文体からしてこの頃はやつれていたようです。

- [プログラミングの授業を受けている大学生に調べておいて欲しいキーワード](https://qiita.com/Kyome/items/f71c1d1720826fc41296)
- [インデントをしてほしい叫び](https://qiita.com/Kyome/items/0aca0208ac1ccc53ace8)
- [初心者に贈る エラー文の出ないバグを潰す方法](https://qiita.com/Kyome/items/b33867c793596259cfdf)