Pedagogy #01 計算論的思考
TL;DR
解決できない課題にぶつかったときには、計算論的思考(Computational thinking)を試してみましょう。
42というエンジニア養成機関で仕事をしていると、生徒の課題をレビューすることが時折あります。小さい課題だと生徒たちはサクサクと課題を解いていきますが、実際に理解して課題を解いているかを見るのもレビューの肝心なところです。
例えば、「マニュアルに書かれている処理をしていなさそうだなあ。このとてつもなくでかい値を入れてみるとどうなるか、ちょっと試してみようか?」などと、生徒たちの顔から血の気が引いていくのがわかるような厳しいレビューをしたりします。
生徒が使ったコマンド(コンピュータに特定の機能の実行を指示する命令)を質問してみて、生徒がちゃんとそのコマンドを理解していないなと判断した場合、その生徒と一緒にコマンドのマニュアルを読み直したりググったりします。知らない時はググる習慣を覚えさせたり必要な知識を再認識させたり、そこから新たな発見を見つけさせるのもレビューの一環ですね。
このように小さい課題に対して、レビューの仕方というのはある程度決まっています。
大きい課題に関してはどうでしょう。
大きい課題に対しては生徒たちがどのようにして取り組めばいいのかわからず、失敗に終わるケースが多々あります。そんな時、レビューをしていて生徒によく聞かれるのが、「どのようにして解決していけばいいかわからない時はどうすればいいですか?」という質問です。
とてもいい質問ですが、正直これでは課題の丸投げです。
そこで、「どのようにして解決していけばいいか分からない」場合の対処法の一つを今回は具体例を使用して紹介したいと思います。
課題:「この三角形の中に三角形が何個あるでしょう。」
簡単でしたね。ではこの三角形の中に三角形が何個あるでしょう。
時間がかかりましたか?
では、問題です。
このような三角形で、一番面積が小さい三角形が50個ある三角形の中には三角形が何個あるのか答えて下さい。
Step 0: Meta-cognition(メタ認知)
問題文自体はシンプルです。一番面積が小さい三角形が50個ある場合、三角形が何個そこにあるのか答えればいいということです。
でも、どうやって解けがよいか、とっかかりすらわからないとします。
何が分からないのかが分かれば進むべき道は決まるのに、今は
問題を解くために何が分からないかが分からない。
この状況を認知するのはとても大切なことです。
自分がこんな状況にいると認知したら、計算論的思考(Computational thinking)を試してみましょう。
この計算論的思考は、つぎの4つのステップから成り立っています。
Step 1 : Decomposition (問題の分解)
Step 2 : Pattern Recognition (パターン認識)
Step 3 : Abstraction (抽象化)
Step 4 : Algorithm Design (アルゴリズム設計)
では最初のステップ、問題の分解です。
Step 1: Decomposition(問題の分解)
現状、「わからないところがわからない!!」とパニックっている場合、このステップでわからないところを解き明かしていきます。もうわかっている場合は、Step2に進んでください。
このステップで定義するのはインプットとアウトプットです。
インプットが何かわからない状態だと、何から手をつければいいかわからない今の状態を生みます。提出期限の迫った課題なら、なおさらパニクりますね。
つまり、インプットに何を使えば良いかがわかればこの状況を抜け出せるということであり、そのインプットに対して色々な試行錯誤を試してインプットとアウトプットの関係性を割り出すことで課題を解いていくことがが可能ですね。
この三角形の中に三角形が何個あるでしょう。
この文章を読むに、求めているものは”三角形が何個ある”か、ということなので目指すアウトプット(質問で求められている答え)はこれになります。
アウトプットの定義が出来ましたので、次にインプットを探していきましょう。
さて、アウトプットと違って、インプットは問題文の中には出てきません。
これを見つけるために、三角形の図を見ながら可変的な要素を見つけ出してインプット候補を洗い出してみましょう。
図を見ると、一番面積の大きい三角形は不変ですが、一番小さい面積の三角形の数や、一番面積の大きい三角形のなかに描いてある棒線の数も可変的です。
ということは、この二つがインプットとなり得る可能性が高いですね。
もっと可変的な部分があるかもしれませんが、ここら辺でまず考えてみましょう。
今行っているのは、インプットとなりそうな要素を見つけ出し、アウトプットの関係性があるかどうかを仮定してみることです。インプットの候補が2つ見つかったので、それぞれアウトプットと一緒に書き出してみましょう。
- 一番面積の大きい三角形のなかに描いてある棒線の数(インプット)と三角形が何個あるか(アウトプット)の関係性
- 一番小さい面積の三角形の数(インプット)と三角形が何個あるか(アウトプット)の関係性
同じ質問文でも、人それぞれ課題を前にした時の分解の程度や分解の仕方など変わりますが、やっていることは一緒です。このStep 1の問題分析で行っていることは、問題を自分なりの理解・解釈できる領域まで分解してインプットとアウトプットを定めることです。
このように問題を分析することによって、自分の今いる地点とゴールが決まりましたね。次は自分のいる地点からゴールにたどり着くためのヒント(関係性)を探っていきます。
Step 2: Pattern Recognition(パターン認識)
このステップでは、関係性を探るために試行錯誤しなければなりません。出来るだけ多くのパターンを見つけ出すのが目的です。
- 一番面積の大きい三角形のなかに描いてある棒線の数(インプット)と三角形が何個あるか(アウトプット)の関係性
- 一番小さい面積の三角形の数(インプット)と三角形が何個あるか(アウトプット)の関係性
と二つの関係性を先ほどのステップでは導き出しましたね。
インプットとアウトプットの関係性を探るために、インプットに一番小さい数字から当てはめてみて、アウトプットを4つまで書き出してみましょう。
まず
一番面積の大きい三角形のなかに描いてある棒線の数(インプット)と三角形が何個あるか(アウトプット)の関係性
から探っていきましょう。
棒線の数とその棒線の数が含まれている場合の三角形の数を出します。
input ➡️ output
0 ➡️ 1
1 ➡️ ️3
2 ➡️ ️6
3 ➡️ ️10
これをみても自分では何もパターンを認識できないため、次の
一番小さい面積の三角形の数(インプット)と三角形が何個あるか(アウトプット)の関係性
を探っていきます。
一番小さい面積の三角形の数とその一番小さい面積の三角形の数が含まれている場合の三角形の数を出します。
input ➡️ output
1 ➡️ 1
2 ➡️ 3
3 ➡️ 6
4 ➡️ 10
この2つのパターンを比べた場合、パターン2の規則性に気づきませんか?
例えば、インプットが4の場合、インプットが3の場合のアウトプットと4を足すと答えになっています。
インプットが4の場合のもう1つのパターンであれば、アウトプットは
1 + 2 + 3 + 4= 10
となります。
もちろん、パターン1の棒線を使っても規則性は見つけられます。
ただし、最初の三角形の中には棒線が無いので、インプットが0から始まるということです。
あえて0から始まることになっても、自分は棒線が好きだ!という場合には、それでも良いのです。
多少面倒くさくなるかもしれませんが、そのまま先に進んでみましょう。
インプットは0から始めなければならないことも、実際にはあるからです。
大事なことは、自分の視野からデータ(インプットとアウトプット)をみて分析(パターン認識)を行う、ということです。
Step 3: Abstraction (抽象化)
Step 3では、Step 2でパターン認識によって認知した情報から必要なものを切り出して抽象化するのが目的です。
では、Step 2で見つけ出したパターン、一番小さな三角形の数と一番大きい三角形の中に三角形がいくつあるかの関係を抽象化していきましょう。
インプットを4の値と仮定して、先ほど、このようなパターンが認知されました。
1 + 2 + 3 + 4 = 10
インプットが5の値はどうでしょう?
1 + 2 + 3 + 4 + 5 = 15
では、最後にインプットがNの値の場合を想像してみてください。
1 + … + (n-1)+ n= Output
1からN(インプットの整数)の和がアウトプットになっていますね。
「あ、これは数列だ!」と思ったら公式が思い浮かびますね。
数列が思い浮かばなくても、1からnまでの数の和、足し算、総和というキーワードが出せれば、他人やインターネットに頼れますので、迷わず頼りましょう。もちろん、公式を使わずに計算機で1からNまでの数を入力して足していきながら結果を出力するというのもアリです。
つまり、インプットが4だろうと5だろうと、または50だろうと、総和を出す定理を見つければ、簡単に計算できますね。
Step 4: Algorithm Design (アルゴリズム設計)
ここまでくれば、あとはインプットから何をすればアウトプットになるのかを設計するだけです。
- 一番面積の小さい三角形の数(インプット)を数える(50個と指定されてある場合は数えなくても良いので楽ですね)
2. 1の値からそのインプットの値の総和を出す(アウトプット)
このアルゴリズム設計を書き終えて、実行したのちに課題の答え、すなわち求めるべきアウトプットである小さな三角形が50個ある場合の三角形の数は得られたでしょうか?
課題を解決するために必要なこれら4つのプロセス(ステップ)を組み合わせたものを計算論的思考(Computational thinking)と呼びます。
簡単に言えば、問題解決を行うための思考法の一つです。この計算論的思考を実行するのは簡単に見えますが、
「どこから手をつければいいのかわからないからやらない」とか、「失敗しちゃいそうだからやらない」というメンタルでは解決の糸口は見つかりません。
何をやってもうまくいかなくてネガティブなメンタルに陥った時は、Googleが提示した計算論的思考に役立つ5つの気質や態度を参考にしてみましょう。
複雑なものと対峙できる自信
難しい問題でも粘り続ける根気強さ
曖昧さを許容する心
答えのない問題にも対応する意志
共通の目標や解決策に至るまでの他者とのコミュニケーションやグループワークを行える能力
このような態度や気質を意識しながら計算論的思考を行うと、「どのようにして解決していけばいいかわからない」のような難しい課題ぶつかっても、諦めず、試行錯誤しながら前に進んでいけるのではないと思います。
きっと役に立つと思います。
最後に
生徒たちがなかなか大きな課題に取り組めない要因の1つは、従来の教育手法で課題を解こうとしているからではないかと良く思います。
従来の教育手法とは、課題を解くために必要な情報を先生が生徒に全て渡してから課題を解かせるという手法です。
例で例えると数学の定理をまず教えてから、その定理を使わないと解けない課題を解かせるとということです。
もし、このような定理ありきのメンタルで課題に取り組んでいる場合は、問題解決の糸口さえ分からない「どのようにして解決していけばいいかわからない時はどうすればいいですか?」状態に陥った時、そこから抜け出すことが難しくなります。
そういう時は、計算論的思考で課題解決を試みたり自分の問題解決へのアプローチの仕方を再検討してみて下さい。
そして、課題を解くために必要な定理を分析したり逆算して見つけたり、またはやったことの無い応用を試行錯誤しながら課題に取り組んでいって下さい。