mcommit's message

ソフトウェア開発の仕事をしているsimotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

小学1年生の娘にC言語を教えてみて気付いた、プログラミング教育を通して子供に伝えるべきたった1つの大切なこと

意識高そうなタイトルをつけてみましたが、単純に自分の子供にプログラミングを教えてみました。

実際に教えてみると、子供にプログラミングを教えるという体験を通して逆に教えられたことがあったので書いておきたいと思います。

動機

昨年の年末(12/24頃)に誰かが我が家に任天堂Switchを置いて行ったのですが、それ以来うちの娘はSwitchにはまってしまい次から次へゲームソフトをねだってくるようになりました。

かわいい娘に頼まれると断りきれず、

を立て続けに購入し気がつくと家計はパンクしかかっておりました。

しかもどういうわけか、クレジットカード会社から

¥39,390 Nintendo Switch

という請求がきているのです。

おかしい。いやおかしくはない・・・


いや、そんなことよりもこのままでは家計がやばい・・・


そんな私の混乱をよそに娘は、

「ねぇパパァ、友達がね、みんなマリオカート8デラックス持ってるの。あたしも欲しい!」

マリオカート8 デラックス - Switch

マリオカート8 デラックス - Switch

とまた新しいゲームソフトをねだってきました。


おぉ、そなたがベルーカ・ソルトか。

俺はお前のATMじゃねぇ!お前も女なら自分で体張って稼いでこんかいあほんだら!


と内心思ったのですが口には出さず、

買ってあげたいけどゲーム買うのにもお金がいるからね。プログラミング覚えて、パパの仕事手伝ってくれたら買ってあげるよ。


とやんわりとお引き取り願いました。

すると、

じゃあ私、プログラミングやる!

と、娘は急にやる気になりました。
*1

教育方針

プログラミング教育というと、

  • 頭を使って考えさせる
  • コーディングよりもまずはフローやアルゴリズムという概念を教える


というイメージがあります。プログラミング教育のバズワードをみても

  • 「親子で学ぶscratch!」
  • 「ゲームで学ぶプログラミング~マイクラプログラミングで自動化しよう!~」
  • 「ロボットを思い通りに動かしてみよう!」

みたいなのが多いようです。どれも面白そうで私も流行に乗っかってscratchも試してみましたが、「面白くない」と一言でぶった切られ終わりました。

マイクラ×pythonプログラミング

Minecraftで楽しく学べる Pythonプログラミング

Minecraftで楽しく学べる Pythonプログラミング

この本も買って子供と一緒にやってみたことがあるのですが、

最初のほうは楽しそうにpythonのコードを書いていたのですが、
途中で「なんかふつーに(マイクラ)遊んでるほうが楽しい」
と言われ辞めてしまいました。どうもうちの子供はプログラミングにはそこまで興味はないようです。
マイクラ上でpython使ってごにょごにょするのは楽しかったんですけど、どうやら楽しんだのは大人だけだったようです。


そういった経験もあり、今回子供にプログラミング教えるにあたって私が重視した点は、ズバリ

「体で覚える!」

ということでした。

フローやアルゴリズムを考える作業は、プログラミングの本質的な部分であり、大切な面だと思います。
また、パソコンやスマホを使わずとも紙と鉛筆があればできますし、プログラミング言語を書かなくても学ぶことはできます。

一方でコードを入力するコーディング作業はパソコンに向かわなければできません。
エディタの使い方やコンパイルの仕方も覚えなければいけません。
面倒な作業に感じて普通の子供だったらすぐにプログラミングが嫌いになるかも知れません。

子供にプログラミングを教える際の方針としては間違っているような気もしたのですが、とにかくコードを書かせて体で覚えることを重要視して教えてみました。

具体的な方法

では具体的に何をさせてみたかというと、

「写経で始めるC言語~世界さんコンチワ\(^o^)/~」

みたいな感じで、Hello World、scanf、if文などを使う簡単なC言語のコードを何日かに分けて写経させました。
写経が終わって、コードの内容を説明した後は、定着のために口頭で課題をだして似たようなコードを書かせます。*2

1回課題のコード量は10~20行程度です。
エディタはサクラエディタ。白と黒を基調にした、シンタックスハイライトな着こなし。*3

コンパイラcygwin/gccコンパイルコマンドラインで自分でやってもらいました。


「プログラムになんか間違いがあったらなんか英語でびろびろ~っていろいろでてくるから」

「なんも間違ってなかったら何にもでーへんから。間違ってたらこちょこちょ10回な!」

みたいなことを言ってコンパイルというイベントを盛り上げたりします。

ソースコードが打ち終わり、なんとかコンソールに、

gcc main.c

と打ち込み、ゆっくり深呼吸して「タンッ」っとエンターキーを押す娘。


$ gcc main.c
$

すごいやん、コンパイル通ったやん!エラーもでてないやん!

ここでものすごく大げさに拍手。コンパイル通す前に、私がその場でコードレビューして、明らかな間違い箇所を修正させたのでまぁ当然といえば当然。


$./a.out
Hello World!

「おおーちゃんと動いたね!すごーい!」

みたいなことを何日間か続けました。

工夫した点

少し工夫した点として、お題を渡すときにただコードを見せるのではなく、IPメッセンジャーを使って「パパからの指令」感を演出したりしました。

これは結構楽しそうでした。お題に関係なく、「なんさいですか?」みたいなメッセージに対して「7さいです」とけなげにキーボードをたたいて返事を返してくれました。*4

f:id:simotin13:20180224011848j:plain
「コードレビュー」前の写経中に取った写真。タイプミスがかわいく思えます。

土台となるタイピング・パソコンスキルについて

上記の通り、娘にはこれまでにも機会があるたびにパソコンには触れさせていて、その過程でアルファベットのタイピング・ローマ字日本語入力はある程度できるようになっていました。

タイピングの練習にはよくこちらのサイトで遊ばせて貰っています。
Flashタイピング 【寿司打 - SushiDA -】

アルファベットとローマ字は3年生で習うことですがちょっと先取り学習です。*5

結果

最初はがんばって私が出す課題を一生懸命打ち込んでいたのですが4日目くらいで、
「scanfからのif文からのprintf x 2セット」みたいな課題のコードを見せたら

もういい。疲れた、嫌や!Switchなんかやらんもん・・・

と言って途中で投げ出してしまいました。それ以降、本人の口からプログラミングをやりたいとは言っていません。

そもそも本人の動機は、

一日も早くマリオカート8デラックスがやりたい

というもので、プログラミングがやりたいというわけでないので執着心はあまりなかったようです。

良かったこと

途中で辞めはしましたが、教えてみてよかったことがありました。

写経させるコードで、

printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");
printf("こんにちわ!");

のようなコードをお題として渡したときに、

え~めっちゃ多いやん、めんどくさい!こんなん無理や!

と反応しました。
※このお題は割と前半でだしたので、この時点ではループはまだ教えていません。

この時に、「Ctrl+CとCtrl+Vよるコピペ」を教えてあげると

これ、めっちゃ楽やん!一瞬やな!

という嬉しそうな反応をしました。

考えてみれば日常的にパソコンを使っている社会人や学生であっても、ショートカットキーを使ったコピペを知らない人を時々見かけます。
コピペ機能は知っていてもマウスを使って「右クリック→コピー(C)→以下省略...」やっている人も多いです。

ショートカットキーによるコピペという基本的な機能だけでも、知っている人と知らない人では仕事の作業効率にものすごい違いがでます

コピペとショートカットを覚えたということは、本人にとってプラスになったと思いますが、

なによりも、

めちゃくちゃ大変だと思っていたことが、ちょっとしたことで圧倒的に楽になった!

という経験を早い段階でするのはとても有意義なことではないかと思います。
大げさかも知れませんが、人間がコンピュータを使うことの本質がこの経験に集約されていると言ってもいいかもしれません。

「大変なこと・面倒くさいこと」を「楽して解決する」→「楽しい!気持いい!」

この快感を味わせてあげることがIT教育・プログラミング教育の一つの意義ではないかと思いました。

手を抜けることでは手を抜くことが正義である

なぜなら

手を抜いた分だけ、もっと大切なことに自分の時間と能力を費やすことができるから

そういう価値観は学校で学ぶ5教科では学ぶことができないのではないでしょうか。
これから先、義務教育でプログラミングを学ばせるならそういう人間とコンピュータとの関わりの本質的なことが伝わるような教育をして欲しいものだと思いました。

補足・ポエム

いい感じに締まった気もするので後は補足的な文章と私のポエムです。

反省

本来、報酬提示によって何かを学ばせるのはよくない。また同じように恐怖で何かを学ばせるのもまたよくない。
そのことは自分も理解できるのですがじゃあどうすればいいのかは分からない。

報酬(お金)と教育

そもそも昔の人は自分の子供を労働力として、田畑や工場で働かせたり、女郎屋に売り飛ばしたりしていたらしいので、子供に何かをさせることと報酬を結び付けてはいけないというのはかなり近代的な発想だと思う。きっと世の中が豊かになった証拠だ。

しかし資本主義の世の中に生きている以上、お金持ちでもない限り、報酬(お金)と教育は切り離せないテーマだ。

お金持ちは報酬やお金に関することを客観的に子供に教えていて、子供はいい感じに成長してさらに発展→お金持ちの勝ち組無限ループみたいな構図はできていると思う。

子供に伝えたいこと

面白いゲームがあれば買って欲しいと思うのは子供心として当然だ。
ゲームが好きなら日常生活に支障が出ない限りいくらでもやっても構わない。

子供には自分が一番夢中になれるものを早く見つけて欲しい。そのためにできる限りのことはしてあげたい。

「何でもしてあげるとハングリー精神がなくなる、最近の子供はハングリーさがない」

とか言われるけど、ハングリー精神みたいなのは実際ハングリーになったら勝手に湧き上がってくるだろう。

子供たちに伝えたいのはハングリーになった時に「狩りをして獲物を倒す技術と喜び」だ。

同時に、ハングリーになった時にハングリーだからといって人のものを奪ったり、傷つけたりしないような精神性もできれば伝えたい。

*1:そもそも任天堂が面白いゲームをハイペースで作りすぎるのがよくない。のんびりいこうぜ

*2:写経の後の課題は効果があるようで、課題と写経したコードの類似性を見つけて「ここをこう変えればできそう!」みたいな発見をしてくれました。

*3:シンタックスハイライトの色の違いには目が行くようで、色の違いをとっかかりとして文字列や数値、キーワードといった違いを認識してくれました。

*4:slackとかだとアカウントつくったりが面倒くさい。こういうときはインストール型アプリがかえって楽

*5:英語の大文字と小文字の違いは子供にはちょっと辛そうでした。いつもLとlとiとかで混乱してこんがらがっています。