プログラミング教育に求められるプログラミング的思考とはなにか?

プログラミング教育について調べていたら「プログラミング的思考」なる謎のキーワードにたどり着いた。20年以上プログラミングしているがそんな言葉聞いたことが無い。2020年に必須化されるプログラミング教育ではプログラミング的思考を育むことを目的としている。プログラミング教育は本当に役にたつのか?論理的考え方が身に付くのだろうか?

注意

筆者はプロのプログラマーですが教育のプロではありません。本記事は20年以上プログラマーを経験した筆者の個人的な意見です。小学校教育について不適切な表現があるかもしれませんがご了承ください。

システム開発の流れ

プログラミング教育について話す前にざっくりではあるが一般的なシステム開発の流れについて説明する。細かいことを言うと入札、RFP、RFIなどもあるが割愛する。

ビジネス分析 ビジネスの成長や継続のために戦略的に何をするか決める。
要件定義 ビジネス分析の結果をもとに構築するシステムを決める。
外部設計 システムをデザインする。
詳細設計 システムの詳細をデザインする。
製造 システムを構築する。
単体テスト 製造が正しいことをテストする。
結合テスト 詳細設計通りに製造されていることをテストする。
システムテスト 外部設計通りに製造されていることをテストする。
運用テスト 要件定義通りに製造されていることをテストする。
リリース ステージング環境でテスト後リリースする。
運用 ビジネス分析通りに成果が出ていることを確認し維持運用する。

工程の重要度

製造までの重要度はこのようになる。

「ビジネス分析>要件定義>外部設計>詳細設計>製造」

上流工程と呼ばれている部分が一番重要でここでミスるとすべて水の泡となる。業界にいてよく聞く言葉が「作ったシステムの6割は使われていない」である。一般的によく聞くのが上流工程のミスである。問題プロジェクトを分析すると要件定義の段階で7割近く失敗していると聞いたことがある。変化の激しい現在ではシステムの完成前に要件が変化するなんてことも。

どんなに品質の良いプログラムを作ったとしても上流工程のコンセプトが間違っていたら意味がない。システム開発においてビジネス分析や要件定義はプログラミングに比べものにならないくらい重要なのである。

起点の違い

ニーズはお客様や市場が求めるものでシーズは技術からサービスやビジネスを生み出すことである。

消費者の求めている必要性を「ニーズ」、メーカーのもっている特別な技術や材料を「シーズ」といいます。特に、消費者の求める商品の機能を追及したり、問題を解決するような新商品や新規事業を生み出すことを「ニーズ志向」、技術的に可能であるということから新しいアイデアを得て、新商品や新規事業を生み出すことを「シーズ志向」と呼んでいます。
引用:マーケティングがわかる事典 オンライン版 | 日本リサーチセンター

技術起点であっても消費者の潜在要求をウォンツであれば成功する。市場が無くても顧客ニーズがあればいいのだ。技術は手段でしかないので最終的には顧客起点でものごとを考えないと成功しない。技術よりも市場を分析することの方が重要だと言える。

製造工程の重要性

上流工程に比べるとプログラミングの重要度ははるかに低い。システム開発でもプログラミングを製造するのは孫請けやひ孫請けである。現状はシステム開発の中で一番賃金が安い人たちプログラミングしている。特殊な技術の場合を除いてプログラミングは誰にでもできる作業なので賃金が低い。

何度か新人教育をしたことがあるが出来る人は三ヵ月程度でプログラミングをマスターしてしまう。玄人的なノウハウはそう簡単には身に付かないがすぐに実践で使えるレベルになる。特に偏差値の高い学校を出ている人たちは恐ろしいくらいに覚えが早い。筆者は学校の勉強ができない方であるがプログラミングが好きすぎて一月くらいでC言語を覚えてしまった。

プログラマーというポジション

システム開発でいったら末端の作業者である。低賃金、長時間労働、非正規雇用とかなり条件が悪い。プログラマーは渡された設計書をもとにプログラミングを作成するだけでシステムのビジネス的な背景などはまったく理解していない。いかに設計書と一致した品質の高いプログラムを製造するかが重要なのである。

Point

プログラミングとはだれでも簡単に身に着けられる技術であり競合優位性が低い。上流工程で必要となる問題を自ら見つけ解決する能力の方が重要である。

プログラミング的思考とは

小学校でのプログラミング教育とはプログラミング的思考を育むことを目的としている。プログラミング的思考とはなんだのだろうか?筆者は20年以上プログラミングしているがそんな言葉聞いたことが無い。

現在,中央教育審議会では,小学校段階において「プログラミング的思考」などを育むことを目的としたプログラミング教育を新たに必修化することや,外国語教育について,小学校中学年において外国語活動を早期化して実施すること,高学年において新たに教科化することが検討されている。
引用:「2020年代に向けた教育の情報化に関する懇談会」最終まとめ

プログラミング的思考の定義を確認

他のサイトもそうであるが以下の文言を「プログラミング的思考」の定義としている。

プログラミング的思考とは
自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力
引用:小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)

内容を詳しく確認してみる。

自分が意図する一連の活動とは

ここでいう一連の動作とはシステム開発でいう詳細設計~製造の段階である。パズルのようなゲームであれば外部設計なしに直観的に作ることができる。上流工程が必要なのは巨大なシステムを作るときだけ。簡単なプログラムであれば詳細設計や製造から作業することができる。なのでここでイメージするのは直観的に簡単に作れる大きさのプログラムということ。

動きの組合せ

判断や繰り返しといった制御文やイメージを動かす処理などを組み合わせてプログラムを作成する。制御文はバリエーションが少ないので判断と繰り返しだけ覚えればいい。処理はバリエーションが多いので少しづつ覚えていけばいいだろう。

動きに対応した記号

スクラッチであればパーツとしてドラッグアンドドロップで制御文などを入力することができる。アルファベットを打ち込むことにたいした意味はないのでパーツの組み合わせで覚えてもいいだろう。

どのように組み合わせたらいいのか

スクラッチのようにビジュアルで結果を確認できる言語であれば直観的にできるだろう。

意図した活動に近づくのか

初心を思い出せないのでまったくイメージできない。多分プログラミングに興味を持った子供ならすぐに覚えると思う。うちの子も5歳でスマホをかなり使いこなしている。気づいたらスワイプ、ピンチイン、ピンチアウトができるようになっていた。子供の吸収力は想像以上にすごい。

論理的に考えていく力

論理的に考えるって論理思考やクリティカルシンキングのことだろうか?筆者はプログラミングで論理的に考えた覚えがまったくない。論理思考やクリティカルシンキングの本を何冊か読んだがプログラミングで役立ったことがまったくない。

ここで言うプログラミングって手続き型言語なのでパズルに近い。考えることは論理と言うより制御構造である。慣れると制御構造をイメージでとらえられるようになり直観でプログラムが組めるようになる。そこに論理的云々なんてものは微塵も感じない。特にオブジェクト指向プログラミングなどは論理よりイメージ力の方が重要である。

Point

早い段階でプログラミングに触れるのは意味があるが論理的思考力が身に付くとは思えない。

手続き型言語

プログラミング的思考は手続き型言語を指している。この他には非手続き型言語や関数型言語などがあり仕組みが異なるため習得するために新たに学び直す必要がある。SQLのような集合演算に近いものも手続き型と大きく異なる。

手続き型プログラミング(てつづきがたプログラミング、英: Procedural programming)は、「手続き呼び出し」の概念に基づくプログラミングパラダイムの一種。命令型プログラミングと同義に扱われることが多い。「手続き」はプロシージャ、ルーチン、サブルーチン、メソッド、関数(数学の関数とは異なる。)など様々な呼称があるが、実行すべき一連の計算ステップを持つものと定義できる。
引用:手続き型プログラミング – Wikipedia

実はプログラミングでは記号の組み合わせよりも「データの流れ」の方が重要である。処理中心ではなくデータ中心にシステムを考えることが必要とされている。

まとめ

早い段階でのプログラミング教育は苦手意識を無くすためにも重要だと思う。大人になったら嫌でも何らかの形でプログラミングすることになるので必須である。

プログラミング教育で期待できること
  • 小学生からプログラミングに触れることで苦手意識を無くせる
  • プログラミングを手足のようにツールとして使えるようになる
  • ICT人材の下地作りができる

ただしプログラミング教育で「論理的に考えていく力」を育むことはできないと思う。個人的に論理力を鍛えるにはディベート教育の方が向いていると思う。システム開発の上流工程で必要となる問題も自ら見つける力もディベートでディスカッションすることで鍛えられるんじゃないだろうか。

プログラミング教育の気になるところ
  • プログラミング教育で論理的に考える力がつくとは思えない
  • 上流工程で必要となる問題を自ら発見し解決する能力は身に付かない
  • 論理力がないと役にたたないプログラムができてしまう

プログラミング教育が目指すところが何であるか調べてみたがおおむね賛成である。早い段階でプログラミングなどに触れることで苦手意識がなくなり子供たちの選択肢が広がるのは良いことだと思う。ただ、論理力云々はプログラミング教育と違う気がする。プログラミングスキルよりも常識にとらわれず論理的に考える力の方が重要である。日本でもディベートのような論理力を鍛えるトレーニングを授業に取り入れてほしい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です