2016年7月8日金曜日

文科省の言うプログラミング的思考

このエントリーをはてなブックマークに追加
Clip to Evernote
Pocket

小学生へのプログラミング教育の導入を文部科学省が検討している。それに関する有識者会議の資料に「プログラミング的思考」と言う文言があり、それを枕にシリコンバレー在住のエンジニアの上杉周作氏が、氏が考える「プログラミング的思考」について解説をしている

「コンピューターが問題を解きやすいように、問題の正しい見方をすること」と言う氏の説明は一般論としては簡潔で良いと思うのだが、教育関係者が小学生へのプログラミング教育の導入を考えるための材料としては、問題がある。文科省が教えようと考えているのは、単に命令をストアして逐次実行させるような事であって、氏が紹介する「コンピュテーショナル・シンキング」では無いからだ。

1.「プログラミング的思考」は小学生に教えられる程度のモノ

文科省の言葉は仰々しいが、小学生に教える内容を議論している事は、常に念頭に持っておくべきだ。「プログラミング的思考」は、平均的な小学生に教えられるもので無ければならない。これを踏まえて、上杉氏が引用している箇所を読んでみよう。

コンピュータの働きを理解しながら、それが自らの問題解決にどのように活用できるかをイメージし、意図する処理がどのようにすればコンピュータに伝えられるか、さらに、コンピュータを介してどのように現実世界に働きかけることができるのかを考えること

抽象的ではあるが、「プログラミング的思考」とはこのようなモノだそうだ。仕入れをどうするか悩んだ小売店主が、売上情報から売れ筋商品を抽出し、それを元に発注をかける作業をイメージすると、良く当てはまる。赤で強調したところが文科省が教えたい所になり、続いてそれに必要な能力が詳細に説明される。

自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力

「命令」ではなく「記号」になっているのが謎ではあるが、どのように命令を組み合わせれば意図した処理になるかを考えられるようにしたいそうだ。つまり、複数の命令をストアして逐次実行させられるようにしたいとわけだ。品目を売上げ数で単純ソートするような処理が例になる。

もちろん「意図した処理」によっては色々と困難になる。上杉氏が出した例題のように計算量が膨大になって困るケースもあるし、そもそも下手な計算方法も思いつかないケースもあるであろう。アルゴリズムとデータ構造は重要だし、少なくとも大学生や専門学校生には教えるべき知見がある。しかし、小学生に複雑な事は求められない。より効率的だからと言って、クイックソートを書いてもらうわけにはいかない。

2. プログラミング的思考≠コンピュテーショナル・シンキング

こういう分けで文科省の「プログラミング的思考」は、上杉氏が解説した「コンピュテーショナル・シンキング」と比較すると、必然的にしょぼくなる。実際、上杉氏のエントリーの追記によると、文科省資料には「プログラミング的思考」と「コンピュテーショナル・シンキング」は違うと書かれている。

追記: 有識者会議の資料には、「プログラミング的思考とは、いわゆる『コンピュテーショナル・シンキング』の考え方を踏まえつつ、プログラミングと論理的思考との関係を整理しながら提言された定義である」と、ふたつの概念は微妙に違うように書かれていますが、定義を必要以上に複雑にしているだけなので、無視して構わないと思います。

わざわざ違うと書いてあるのだから、無視すべきでは無いであろう。「定義を必要以上に複雑にしている」のではなくて、文科省は同じモノだと思うなと宣言している。実際のところ両者で求める水準は大きく異なるので、同じにされるとカリキュラムが苦しくなるのは想像に難しくない。「コンピュテーショナル・シンキング」は情報系の学部の大学生に教えるものであって、文科省の言う「プログラミング的思考」は平均的な小学生に教えるものなのだから。

クイックソートでは無くて、単純ソートが出来るようにする。上杉氏が例示していたドミノタイリング問題であれば、二種類のタイルの総数を数えるのではなく、しらみつぶしに試してみる*1。文科省が教えようとしている「プログラミング的思考」はこういうものだと思った方が良いであろう。上杉氏は可読性云々の話もしているが、小学生が書けるコード量からしてそういう話にはならない。

3. 文科省の言うプログラミング的思考を教えるべきなのか?

さて、上杉周作氏は「コンピュテーショナル・シンキング」を教えることには賛成なのだと思うが、文科省の言う「プログラミング的思考」を教える事には賛成なのであろうか。算数の時間に数え上げ問題*2を教えた方が、上杉氏の言う「コンピュテーショナル・シンキング」にまだ近く、プログラミング言語教育を行える人材が十分にいない事から容易な方向になる。

*1ドミノタイリング問題の場合は力技で解く方がコードが長く複雑になるので、もし教えるとすれば賢い方法の方になるであろう。

*2関連記事:パズル的に読める『離散数学「数え上げ理論」』

0 コメント:

コメントを投稿