どのようにプログラミング学習を支援するか?
最近の私の投稿は誰かの投稿を受けてってのが多いですがまたこれもそのような記事になります。
@rhiroe さんの記事ですが、大変なるほどと参考になる話であると思います。@rhiroe さんとても良い記事ありがとうございます。
読んでの感想
さて内容ですが、同感、同意できる内容が多かったと思います。最近ではエンジニアの方がプログラミングスクールを否定する人たちが多いと思いますが、私はそうではなく、プログラミングスクールも一定の効果があるように思えます。
私もエンジニアとして働く傍ら私は子どもにですがプログラミングを教える(というか支援する)という立場です。その上で私が今回論じてみたいのが、以下の2点です。
- どのようにメンターや講師は支援していくべきか?
- どのように学習者は学習していくべきか?
上記のことについて私の考えを書いていこうかなと思います。
どのように支援していくべきか?
さて読んでて私が気になったのはこの部分です。
受講生さんからすれば、自身の抱えている課題を素早く解決してくれる良いメンターに映ると思います。メンターも素早く問題が解決できてさぞ気持ちの良い事でしょう。僕もそうしろと言われれば喜んで素早く解決します。win-winで誰もが幸せに見えます。ただし、ここで受講生さんには、なんのためにスクールに高いお金を払って通っているのか一度冷静に考え直していただきたいですね。ちなみに受講生さんからのフィードバックでは素早く解決してもらう事で手が止まらないので高評価です。課題の提出期限が迫っている場合も多いみたいですしね。
受講生さんのゴールは「カリキュラムの完遂」や「ポートフォリオの完成」ではなく、「カリキュラムの理解」であったり「ポートフォリオ作成を通しての知見の習得や問題解決能力の向上」であるべきなのです。これを上記のようにわからない事をメンターに質問してすぐに答えをもらうようではこれらは何も身に付かないのです。
この点もよくわかる一方、講師も講師側で学習者の視点に立つことができていないように感じます。もちろん、能力の向上を目的としている点は私も同様に感じます。しかしながらそれを最初から求めすぎているように感じます(もちろん詳細な背景、状況、コンテキストが分からないので、断定はできないのですが)。
読んでみていると最初から最終的なゴールに一気にジャンプさせようとしているように読めてしまいます。しかしながら、学習者にとってはとてもつらいものです。最初から「完璧な学習者」を講師が求めているように感じます。
たとえば、以下の学習者への質問に関してです。
エラーメッセージがどこに表示されているのかがわかるか?
エラーメッセージに書かれている英語は読めるか?
エラーメッセージの言っている意味はだいたいはわかるか?
エラーがどこで起こっているかわかるか?
エラーの種類(原因)はなんとなくわかるか?
エラーを解消するためにどういったアプローチが必要かなんとなくでもわかるか?
エラーを解消するための具体的なコードの記述がわかるか?
だいたいこれくらいの粒度で確認します。
受講生さんからいただく質問の内容的には「エラーの解消」なので4か5くらいの理解度を想定して対応しますが、実際には1にも達していないそもそも「エラーメッセージを読んでいない」という場合がほとんどです。話になりません。
私はこれを読んで、確かに「学習者にここまでやってほしい」とは思います。しかしながら、少しばかり学習者に厳しいものではないかとも思うのです。そもそもエラーメッセージを読めるレベルであれば質問してこないように思います。
何度も言いますが、このレベルになってほしい、なるべきだとは思います。しかし、私は初めからこれらを学習者に求めていくことは厳しいだろうと考えています。私がプログラミングを支援するとき、学習者は本当に様々なことを学びます。その中には我々が既に慣れてしまっているもので気づかない暗黙知のようなものが沢山あるように思えます。
たとえば、単純にソースコードを写経してコンパイルするだけで一苦労だったりするのです。たとえば、初学者に以下のコードを写経させたとしましょう。
const ps = [];
const count = 100;
function setup() {
createCanvas(windowWidth, windowHeight);
blendMode(SCREEN);
for(let i=0; i < count; i++){
ps.push(new Particle());
}
}
初学者のうちはこのコードを理解するだけでも大変です。そうして四苦八苦しながら初学者が以下のコードを書いたとしましょう。
const ps = [];
const count = 100;
function setup() {
createCanvas(windowWidth, windowHeight);
blendMode(SCREEN);
for(let i=0; i < count; i++)
ps.push(new Particle());
}
}
このコードforの{
がありません。なので何かしらエラーメッセージを出して、コードが上手く動かないでしょう。
初学者の目線に立つとこのような気分でしょう、「一生懸命コードを写経したのに、全然上手く動かない!なんで!?」。このようなパニック状態になるわけです。私は主に小学生や中学生を教えることが多いのですが、まずパニックになりますし、大人の方でもあわわあわわとなる方が多いように感じます。
このような状態の方に対して、「答えをすぐに教える」という行為は果たして本当に良くないことでしょうか?また、「エラーメッセージを読ませる」という行為は本当に学習者の支援に最適な行為でしょうか?
私はまず「プログラミングが上手く動いた!!!」という成功体験を積ませます。そうして心理的にほっとさせるのです。そして、ほっとした後の心余裕があるときに、エラーの解説をするのです。もし、困って訳が分からなくなっているときに、いきなりエラーメッセージのことを伝えてもなにも伝わらないと思いますし、経験上実感することこです。
そのような成功体験を積んだらその人に一つのプログラミングへの経験になり、それらは蓄積されていきます。そうしてプログラミングに対してある程度コンテキストを持つようになったときにエラーメッセージの便利さを理解できるようになるのです。最初からエラーメッセージが便利だと思える人間なんて極わずかでしょう。
プログラミングの先生でもメンターでもなんでもプログラミングを支援する人間の立場の人間は、「学習者がまずプログラミングを好きになってもらう」「プログラミングで成功体験を積んでもらう」ということがまず大切なように感じます。そのためには、プログラミング学習に対して、適切な補助が必要なのであり適切な見本が必要なのであり適切な助けが必要なのは間違いありません。そのためには学習者の置かれている状況等をよく考えて指導するべきだと思います。
どのように学習するべきか?
それではプログラミングの学習者はどのように学習するべきでしょうか?
受身的な学習ではよくないのは間違いないように感じます。学習に取り組む主体性が必要なように感じます。たくさんプログラミングに対する体験を積んでいくことが大事なように感じます。それは写経のみではなくて、プログラミングのソースコードを弄ったりして、プログラミングやマシンに関する自分自身のモデルを頭の中に構築することが大事なのです。
プログラミングやマシンのモデルを頭の中に構築していくというのはどういうことでしょうか?たとえば、次のコードを書いたとしましょう
println("Hello");
そうしたコンソールに
Hello
という文字が表示されたとしましょう。そうするとprintln("Hello");
と書けばHello
と表示されるんだな認知すると思います。
次は逆に思考をたどるのです。例の場合で言えば「Hello
とコンソールに表示すればprintln("Hello");
と書く」ということです。当然じゃないか?と思われるかもしれませんが実はわりと重要な視点の変換だと思います。この視点の変換をすることによって、「Hello World
と書きたければ、ソースコードをどのように書けばいいか?」という発想が出てきます。
つまり、あるソースコードを書いて、その結果が出てきた。その結果が出てきたのはどのような流れでその結果になったのか?を考察することが大事なのです。そのように私は考えます。そのためには、コードをよく読み、マシンでの動きがどうなるか?をよく観察したり、頭の中のマシンで操作したりして、プログラミングのモデルを上手く構築してみて頂ければと思います。
ちょっと、難しいことを言っているように感じるかもしれませんが、少しでも伝わったらならば幸いです。
さいごに
プログラミングは本来楽しいもので、ずっとやれるものです。ぜひとも、学習者は主体的に取り組み、プログラムを書いて上手くコードが動く体験を得て、そしてプログラムを構築する、プログラミングすること自体を楽しんでいただければと思います。また、学習を支援する方はできるだけ、学習者の傍に立ち、観察し、できる限り同じ目線にたって、プログラミングを楽しめるように導いて欲しいと思います。
Discussion