見出し画像

プログラミング教育を考える(4) プログラミングは試行錯誤か

 PDCA もしくは PDCAサイクル。
最近ではこれを時代遅れとする向きもあるようだが,問題解決の手法として高校の情報の教科書にも載っている。

 プログラミング教育を考える(1)で紹介した,電子掲示板STS喫茶室でのやり取りの続きがある。
「プログラミング的思考」の引用をしたところ

~小学校プログラミング教育の手引(文科省H30.3.)より抜粋引用~
プログラミング的思考(①~④)
意図した一連の活動をさせるために
 ① 必要な動きを分けて考える
 ② 動きに対応した命令(記号)にする
 ③ 組み合わせる
 ④ ①②③の中で試行錯誤しながら継続的に改善することで問題が解決する
~引用終わり~

このあとに,いちのせさんが書いている。

プログラマーはアプリケーションを作る時に、はたして試行錯誤をしているでしょうか。試行錯誤をしていると思っているプログラマーはいるのでしょうか。
試行錯誤ではなく、
=========
これでうまくいくはずだと確信する
 ↓
実行
 ↓
エラー・バグの発生
 ↓
思い違いの発見
 ↓
修正
=========
という繰り返しだと思うのです。これは試行錯誤とは全然違いますよね。プログラムしながら論理的に考えないで、やみくもに変数をいじったり、構文を変えたりして、「うまくいった~\(^o^)/」っていうのは、何も思考しないお子様レベルとしか思えません。

私はその通りだと思った。
小学校プログラミング教育の手引にある

 ④ ①②③の中で試行錯誤しながら継続的に改善することで

は,どうやら PDCAが念頭にあるようだ。
小学校プログラミング教育の手引には,「試行錯誤」という言葉が何度も登場する。

第2章 小学校プログラミング教育で育む力
(1)プログラミング教育のねらい
学習指導要領に示すとおり、児童がプログラミングを「体験」し、自らが意図する 動きを実現するために試行錯誤することが極めて重要となります。

ここでは,「試行錯誤することが極めて重要」としている。

正三角形を描くプログラムの例

正三角形をかくのに「必要な 動きを分けて考える」、「動きに対応した命令にする」、「それらを組み合わせる」、「必要に応じて継続的に改善する」といった試行錯誤を行う中でプ ログラミング的思考を働かせています。

この4つのステップはPCDAではないだろうか。

総合的な学習の時間での例:ジュースの自動販売機のプログラムの作成

児童は、生活の中での経験を基に、自動販売機はどのような手順で動作しているのか、それを再現するには命令(記号)をどのように組み合わせれば よいかを考え、試行錯誤します(プログラミング的思考)。

自動販売機の動作のしくみを考えるのだが,これを試行錯誤というのだろうか。

音楽 第3学年~第6学年 での例

様々なリズム・パターンの組み合わせ方について、このようにつく りたいという思いや意図をもち、様々なリズム・パターンの面白さに 気付きながら、プログラミングによって試行錯誤をすることを通して、 まとまりのある音楽をつくります。

音楽を試行錯誤で作る?

いろいろな場面で「試行錯誤」が使われているのだが,これらをすべて「PDCA」で置き換えると話はだいぶすっきりする。

しかし,プログラミングはPDCAではないのだ。

もう一度,小学校プログラミング教育の手引の記述を,システム開発の手順に照らし合わせて考えてみよう。

プログラミング的思考(①~④)
意図した一連の活動をさせるために
 ① 必要な動きを分けて考える         ・・・・・ 問題分析
 ② 動きに対応した命令(記号)にする     ・・・・・ 設計
 ③ 組み合わせる               ・・・・・ プログラミング
 ④ ①②③の中で試行錯誤しながら継続的に改善する ・・・ やりなおし

③をプログラミングとしたが,③までをプログラミングとしてもよいだろう。
④はプログラミングではないのだ。
プログラミングでは,最初から④を想定しているわけではない。結果としてそうなることがある,というだけだ。必ずそうなるのではなく,そうなることがある,のだ。

すると,④はデバッグか,と思われるかもしれない。
「なぜ,今学校でプログラミングを学ぶのか」(平井・利根川 技術評論社 2020 2月)には,次の記述がある。教室掃除のマニュアルつくりについて書いた部分だ。

グループで教室掃除の手順をすべて書き出して,マニュアルを作りました。
 ① 掃除での行動を一つひとつ洗い出す
 ② 流れをグループの中で話し合いながらまとめていく
 ③ グループ同士でまとめたものを交換し,お互いの感想や意見を追加
 ④ 意見や感想を参考に掃除手順をまとめ直す。
 ここで,意見交換から掃除手順をまとめ直すことは,プログラミングでいう「デバッグ」そのものです。

プログラミングをしたことのある人なら,それは違うと言うだろう。
知らない人のために「デバッグ」の意味を説明しておこう。
設計にしたがってひと通りプログラムを書いて実行する。
すると,予定していた動きをしないことがある。(いつもではありません。ここ大事)場合によってはプログラムが暴走することもある。
なぜか。
原因はいろいろ。
そもそも設計に手抜かりがあった。
アルゴリズム(実行手順)に見落としがあった。
コードのタイプミス。
これら,誤動作の原因となるものをバグ(虫)といい,虫を駆除することをデバッグという。

どうだろうか。
デバッグは,プログラムを書いて実行したあとで行うものなのだ。
掃除手順のマニュアルで言えば,できたマニュアル通りにやってみたら不都合があった,という場合に,見落としがないか,手順に誤りがないかを再考するものだ。

考えてもみてもらいたい。
設計をして,プログラムを書いて,「まあ,ちゃんと動くかどうか分からないけどやってみよう」というプログラマがいるだろうか。
「よしできた」と思ってやったときに,「あれ?しまった」となるものなのだ。
もちろん,絶対にないとは言い切れない。
それは,シミュレーションを行う場合だ。
どんな条件が必要かを分析しきることが難しいために,まずある条件を与えて実行して結果を得て,それを分析して再度実行する。これがシミュレーション。
そうでない場合は,「できた」と確信してから実行するものである。

プログラマ(正確には設計をする段階があるからシステムエンジニアなどという)を採用するとき,
「私は試行錯誤しながらプログラミングができます」
という人を採用するだろうか。
私だったら採用しない。
そんな人は,システム開発の能率を下げるだけだ。

小学校でのプログラミング教育推進には,これからの時代のエンジニアを養成していく,という目的もあるだろう。
しかし,小学校の段階で,「プログラミングは試行錯誤だ」という概念を植え付けてしまったらどうなるか。
この,背筋が寒くなることを進めていこうとしているのが今の「小学校でのプログラミング教育」なのである。