「プログラミング的思考」とは、頭の中で難しい言語を使ってプログラムを書くようにものを考える……ということではなく、ある目的を達成するために「何をどの順番でどうすればいいか」を考える力のことです。
デザイン思考がデザイナー以外にも役に立つ能力であるように、プログラミング的思考もプログラマーやエンジニア以外……極端な話、その人の役割が「お母さん」だったとしても役に立つ能力です。
2020年から小学校でもプログラミング教育が必修化し、大人たちのプログラミングリテラシーも脅かされる今日ですが、今回はその「プログラミング的思考」について解説していこうと思います。
プログラミング的思考とは?小学生にもプログラミング教育が必修化
冒頭にも書きましたが、プログラミング的思考は、思考にプログラミング言語を取り入れることとは違います。
実際にプログラミング的思考を養うためには、プログラミングをしてみるのが早いかもしれませんが、「お母さん」という役割の人が日常生活に「プログラミング的思考」を活かすためにプログラミング言語を覚えて、最強のキッチンタイマーアプリをつくるとか、そういう話ではないのです。
2020年度から、小学校でプログラミング教育が必修化されました。といっても、小学生がいきなり何らかの言語でプログラムをつくるための学習をするわけではありません。
文部科学省による「小学校プログラミング教育の手引」にも
児童がおのずとプログラミング言語を覚えたり、プログラミングの技能を習得したりするといったことは考えられますが、それ自体をねらいとしているのではない
出典 : 文部科学省. 小学校プログラミング教育の手引. 第三版, 2020年. (参照 2021-05-12)
と記載されています。
実際に小学校のプログラミング教育では「Scratch」というビジュアルプログラミング言語が使われていることが多いそうです。
ビジュアルプログラミング言語は、PHPやJavaScriptのようなテキスト言語とちがって、処理を表す単語や文法を覚えなくても直感的にプログラムを「つくれる」ため、小学生でもパズルを組み立てるような操作で、プログラミング的思考を習得できます。
「プログラミング的思考」はどんな能力?何の役に立つ?
では、どんな能力が「プログラミング的思考」なのでしょうか?
文部科学省による「小学校プログラミング教育の手引」では、以下のように説明されています。
自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力
出典 : 文部科学省. 小学校プログラミング教育の手引. 第三版, 2020年. (参照 2021-05-12)
「自分が意図する一連の活動を実現するための過程を検討したり改善したりすること」と考えると、「ゲームをつくる」ことや「アプリをつくる」ことだけでなく、「料理をつくる」ことや「部屋をきれいにする」ことのための行動も「プログラミング的思考」で改善できること、と考えられるのではないでしょうか?
つまり、プログラミング的思考は、今を生きる全人類が「課題解決能力を身につける」ために有効な考え方と言えると思います。
「家が汚い問題を解決するプログラム」を考えてみる
こんなシチュエーションはないと思いますが、たとえば知り合いのAさん・Bさん・Cさんから別々に「家が汚い」という悩みを相談されたとします。
3人それぞれにヒアリングして最適な方法を考えるのは面倒なので、「これを上から下まで読んで実行して!」と単一の説明で済ませたいですよね。(親切な人はそう思わないかもしれませんが、ここではそう思ったことにしておいてください。)
1.問題を「分解」して「順番」と「組み合わせ」を考える
家を「きれい」にするために、持ち物を全部捨てたり引っ越しをしたり、ということも現実では考えられますが、ここでは向かうべきゴールを「今の家を片付けたり掃除したりしてきれいにする」と定めます。
「家が汚い」ってどういう状態でしょうか?
- 不要なものが捨てられず部屋に物があふれている
- 物があるべき場所にしまわれていない
- 掃除をしていなくてホコリやゴミが溜まっている
など、いくつか一般的に考えられる原因がありますよね。
こうして「家が汚い」という問題をいくつかの要素にまず「分解」します。そうすると、家をきれいにするためにやるべきことが見えてきます。
今度は、それをどの順でやったらいいのか考えていきます。
たとえば最初にゴミを全部捨ててホコリを掃除機で吸っても、他のところを片付けているうちに後から後からゴミやホコリが出てきて結局最後にもう一度……というのは「掃除あるある」ですよね。そういう二度手間が発生しないように、効率のいい「順番」「組み合わせ」を探します。
するとおそらく、
- まず不要なものを判別してまとめて
- 家具を拭いたりしながら必要な物をあるべき場所に戻し
- 床に掃除機をかけてからゴミを捨てる
という手順になると思います。
また、
- 引き出しがあったら開ける
- 「不要ならゴミ箱に入れる
というような「分岐」や、
- ゴミ袋がなくなるまでゴミ袋をゴミ捨て場に持って行く作業を繰り返す
という「反復」の動きも「組み合わせ」を考える中で組み込んでいきます。
実際のプログラミングも、あるべき表示の状態などに向かって、コンピューターが理解できる粒度まで分解し、それを効率よく動かすために組み合わせを考えていきます。
たとえば「不要なものを判別してまとめる」というのも実際はまだまだ抽象的なので、「家の奥から玄関まで一歩ずつ歩いて、目に入ったものを端から手に取り、箱や引き出しがあれば開けて確認する」となります。
また、不要かどうかの判断も「最後に使用したのが1年以上前であれば不要」といった感じで定義しておきます。
2.似たような部分をまとめて「一般化」、想定できるパターンを見渡して「抽象化」する
また、「物が増える」原因として「似たようなものを買ってしまう」というようなことも多々あると思います。
たとえば食器。載せるもののイメージにピッタリ合った食器を使う生活は豊かで素敵だと思いますが、増えすぎると収納が足りなくなってしまいます。
そこで「何にでも使えそうなボウル」を持っている人は多いのではないでしょうか?
ごはんでもサラダでも味噌汁でも、情緒と引き換えにはなりますが、多くの料理の器はこれで事足りますね。
こんな風に、ひとつのことだけでなく他のことでも使えるようにすることを「一般化」といいます。
また、「何にでも使えそう」とか「複数の用途で使えそう」と考えるときに頭に浮かんだイメージがあると思います。「カレーライス」「豚汁」「チャーハン」「刺身」など、具体的な種類をあげたらきりがないですが、「器の形態を決める」という目的のためにそこから「汁物である」とか「量がかさむ」等の要素を取り出しますよね。
問題を明確化するために物事から必要な要素を取り出すことを「抽象化」といいます。
実際のプログラミングでは、できるだけユーザーの端末やサーバーに負荷をかけたくないので、「一般化」と「抽象化」を意識して、プログラムがなるべく効率よく動くように記述することが大切です。
想定できるパターンを見渡して抽象化し、似たような部分をまとめて一般化することで、プログラム全体もスッキリし、それを使う人にとっても幸せな結果が生まれます。
我々は暮らしの中で「手間のかかったもの」や「面倒くささ」を愛することも多々ありますが、抽象化したり一般化したりすることで生まれる「シンプルさ」や「効率」によって、解消されるストレスもあるはずです。
3.プログラム実行後「分析・評価」する
さて、「家が汚い」という悩みを持っていたAさんとBさんとCさんの家をきれいにするプログラムは、なんとなくイメージできてきたでしょうか?実際に書き出してみると、けっこうな文字量になると思います。
さらにそれを実行してみると、本を並べるときに1冊ずつ並べるのではなくて10冊くらいのかたまりにしたほうが腰に負担をかけないとか、当初より広い視野で見られることも増えると思います。
そんな風に「分析」や「評価」を繰り返すことで、意図した結果にさらに近付けたり、成果物をより良い感じに改善したりできるようになっていきます。
これはもうプログラミングに限った話ではないですが、過去に自分が作ったものを見ると「下手くそだな」とか「雑だな」とか思ってやり直したくなることは少なくないですよね。
まとめ:「プログラミング思考」は物事をシンプルに考えるために大切
「プログラミング的思考」と聞くとなんとなく「難しいことを覚えなくてはいけないのかな」と構えてしまいますが、わたしはむしろ、物事をシンプルに考えるために大切な能力だなと思います。
「分解」「組合せ」「抽象化」「一般化」「分析・評価」といった要素を見てわかるように、プログラミング的思考はプログラマーやエンジニアだけが持つ特殊能力ではありません。
実はこれを読んでいるエンジニアではない方も、やってみたらすっごい得意だったりするかもしれません。逆に、エンジニアの肩書を持っている自分がその能力に長けているとも思っていません。
解決したい複雑な問題にぶちあたったとき、この記事のことを思い出して、少しでもその問題が解決に近づいたらうれしいです。
また、BAsixsはエンジニアリング思考で、あらゆる課題の解決をサポートしていきますので、お困りの際はぜひご相談くださいね。