※エントリの最後にお知らせがあるよ!
プログラミング教育の熱が高まり始めている今日この頃。今年から本格的に、小中学生向け プログラミングスクール「TENTO」にて、ソフトウェア開発教育のボランティアをしています。巷ではワークショップ型で1回ぽっきりのものが多いですが、TENTOでは書道やピアノの塾と同様、継続して指導している点が特徴です。
さて、最近こんな記事がありました。
イギリスの場合は、Key Stage 1(5歳〜7歳)のコンテンツは以下の通り。アルゴリズムって何?から始まり、デバッグしたり、学校外でのテクノロジーの利用とか、個人情報についてのこととか、たしかに大事!と思うことが多い。
(中略)
そして、どちらかというと、プログラミングの教え方がわからない先生ほど、「お手本を見て、このとおりに書いてみましょう」みたいな授業をしてしまうんじゃないかな、と思います。そうすると、子どもたちはきっと、「わけがわからないまま」に、ただ写してしまうのではないかと思います。
ただ写すのがトレーニングになるかもしれない、という可能性もありますが、本来与えたかった学習目標はそうしたことなのか、というのが考えるポイントだと思います。
一つ一つの項目について、いろいろな話があるのですが、今回は「デバッグ」について僕が指導中に引っかかったお話を、「知識」「モデリング」そして「心理」の3つまとめてみようかと思います。
知識が無いばかりに遠回りな実装をしている
まずは、知識の有無によって出る問題です。
知識が無いばかりに、遠回りな実装をしてしまう生徒さんがいます。例えば、Scratchでゲームを作る際、単に敵キャラを増やすために複数のスプライトを予めコピーして増やそうとする事があてはまります。
こうしてしまうと、あらかじめ複製した敵キャラ スプライトの一つのプログラムを変更してしまうと、他のものも同様に実装し直すか、コピーし直さなければなりません。そうしていくと、いつかどのスプライトのどのプログラムをなおしたのか、そもそもどういう実装にしたかったのか、生徒さん自身がわからなくなることがしばしあります。
この問題を解決する方法の一つは、基となるスプライトをクローンして増やす事です。こういった知識を、指導者は提供します。また、僕は指導の時に実装例を積極的に作って、理解してもらうようにしています。こうする事で、どういった境遇のときにどのようなメソッドを使えば良いのか、腹の底で理解してもらいやすいのです。また、他者の実装をまねてみることで理解を深める場合もあり、その場合はどのように探し出すのかを指導しています。
これは、アルゴリズムなどでも同様です。プログラミングで必要な数学の知識は高校以上で学習する事が多くあります。例えば、敵キャラを動かすために三角関数を用いたり、出現率を計算するために確率論を用います。とはいえ、これはほんの触りです。
従って、指導者は各種プログラミング言語で実装できる力が求められます。Scratchは阿部先生が書かれた本がありますので、ぜひ参考にしてみて下さい。
構造を生徒自身で理解できないでいる
続いて、モデリングの問題です。
小学生は、特に「こんなものを作りたい!」と思って、ガシガシとコーディングします。この集中力は目を見張るものがあり、感服するばかりです。しかし、ここは小学生、途中でコードがこんがらがり始め、バグが出てきます。そのときに、どこでどのような問題が起きているか生徒自身が理解できなくなってくるのです。例えば、Scratchではメッセージをブロードキャストする事で他のスプライトの挙動を制御する事ができるのですが、そのメッセージの管理が破綻したりするのです。
この問題の解決方法は実に様々あり、実際に開発現場で働く方々の中でも数多くの知見があるかと思います。そんな中、僕は2つの方法をとって解決を促しています。
- プログラムのライフサイクルを整理する
- グローバルに影響するメッセージや変数を整理する
1つ目ですが、次の2次元に分けます。Scratchですと、1次元目は「背景」及び「スプライト」毎に分けます。2次元目は、「初期時」「実行時」そして「終了時」の3つの時間軸に分けます。肝は2次元目です。例えば、ゲーム開発であれば、敵キャラですと「初期時」にはどこに生成するか、HPはいくつにセットする、など初期状態とは何かを整理し、生徒自身が定義します。これを忘れてしまうと、ゲーム中に敵キャラがおかしな場所に登場したり、ダメージを受けきった状態で生成されてしまっていきなりやられてしまうなどの問題が出ます。また「終了時」は、ボスを倒したあとに敵キャラを全て隠してステージクリアの背景に変える、そしてスコアを保存してランキングにまとめる、等の整理をしてもらいます。
ライフサイクルを理解しないまま進めてしまうと、どのタイミングでどのスプライトがどのような動きをしているか理解できず、問題を切り分ける事ができません。そのため、生徒自身でバグを収束させる事が大変困難になってしまいます。
2つ目ですが、これまたScratchを例にとります。メッセージを使うと全てのスプライト・背景にブロードキャストされる事はご存知かと思います。これを使って別のスプライトを制御する事はよく使われる実装ですが、このメッセージがどこでどのように掴んで処理しているのか、そしてそもそも1つ1つのメッセージがどのような意図を持って発しているかを定義せず、生徒さんがなんとなく実装を進めてしまっている場合があります。コードを書いた事がある方であれば、あーこれはいわゆるスパゲッティコードになる要素が満点!である事がおわかりいただけるかと思います。
僕は、メッセージ毎に何をしているか、整理して書き出してもらう事で解決しています。見通しが立ちますと、自分自身がどのような実装をしているのか、生徒自身で理解できるようになります。そうすれば、自分で問題を解決するのは時間の問題ですね。
プログラミングに限らず、問題をどのように発見し、クールに解決するかは、以下の本が大変参考になります。
問題を自分自身に受け入れない
これは、気持ちの持ち方の問題かもしれません。
上記の2つの問題を指摘した時、素直に聞く生徒さんと、そうでない生徒さんがいます。素直な子はここではあまり問題になりません。問題は後者です。
これは僕自身の分析ですが、次のような心理になっているのだと思います。
- 自分は正しいと思っているのに間違いを指摘されるのが辛い
- コードの問題を追及しているときに自分自身が追及されていると思っている
- 気が乗らない
1は、大人でも難しい時があります。ただ、プログラムは大変素直でして、原則「実装した人が書いた通りに動く」のです。話を聞いたあと、だいたい僕はそれを伝えています。ただ、それをいち早く生徒さんに飲み込んでもらえるための良い方法を知りません。どなたかと知見を共有できたら良いなと思います。
2は、これまた大人でも難しい問題です。行った作業について問題を指摘しているのに、自分自身の人間性に問題があると捉えてしまい、かたくなになる生徒さんがいます。この、物事と自分自身を分離させるのは、一度紐づくと切り離すのはなかなか難しいのです。特に、自分自身で精魂込めたプログラムだとしたら、問題はより深くなります。僕は、「君ではなくてプログラムの作りについて指摘している」点を明確にしながら指導しています。ただ、先の1の問題と同様、より良い方法を誰かと共有できたらと思っている今日この頃です。
3は、僕自身も仕事のときにあります。想定と違い動かなくなったコードを目の前にするのは辛い事です。ですので、気が乗らない時は、気が乗るまで待ちます。大人と違い、小中学生は切替が早い子が多く、気分転換すればだいたいあとは大丈夫だったりします。また、気を晴らすのがあまり上手でない子は、全く違うプログラミング言語や教材に触ってもらって、気持ちを切り替えてもらう時もあります。または、雑談をする事もあります。実は、僕が妖怪ウォッチを知るきっかけはTENTOだったりします。
必要であれば、児童心理学をやった方がいいのかなとも考えています。
生徒と同じ目線で 成長は早い
ここまで、僕がプログラミング教室でデバッグの指導をしている際の3つの事柄を、「知識」「モデリング」そして「心理」の3つに分類してお話ししました。
将棋や囲碁に「多面打ち」というのがあります。これは、指導者や上級者が、複数の生徒と同時に対局します。僕はやっているのはまさに(便宜的に言うと)ペアプログラミングの多面打ちなのです。というのも、プログラミングは一人一人が違う成果物を作りますから、成果物に対する指導は画一的に行う事はほぼできません。講義形式の指導は、できたとしても多くの人が使う知識に関する部分までです。
また、ここまで「指導」や「教える」という言葉を便宜的に使いましたが、僕自身はその意識はありません。あくまで、問題を「一緒に考える」事を通じて、生徒さん自身がプログラミングを学ぶ際の手伝いをしているだけです。それどころか、中学生にもなってくると、自力でプログラミングスキルを磨き続けてきた子は、指導者の知識を凌駕する分野を持つため、まるで大学院生が指導教授に相談する姿そのものをやるだけです。それほどまでに、生徒さんの成長が早いのです。従って、同じ目線で接する事が今は最善であると、僕は考えています。
そう考えて行きますと、指導者はめまぐるしく変わるコンピュータ技術の知識を日々獲得し実践しつつ、その技術を支えるモデリングスキルと心の持ちようを予め作り上げておく事が大切だと、僕は思っています。その上で、日々指導者の立場として生徒と向き合う事を試されているのではないでしょうか。
お知らせ: 小中学生が開発したプログラムの発表を聴きにいらっしゃいませんか?
来る2014/10/26(日) 13:00より 渋谷ヒカリエにて、TENTO・ビスケット塾(デジタルポケット)で学ぶ生徒さんたちが開発したプログラムを発表する「第3回 プレゼン大会」を催します!一般の方も観覧できます(1,000円)。ご家族そろって足を運んでいただけましたら幸いです。プログラミング教育の一つの例、そしてTENTO・デジタルポケットがプログラミング教育を通じて何を目指しているのか、知っていただけると思います。
事前にWebサイトからお申し込みをお願いします。直前でも大丈夫です。
また、過去の模様はブログにまとめています。どのような雰囲気か知っていただけるものと思います。あわせてご覧ください。