学びの最前線

未来がもっと楽しくなる「プログラミング」の学び方

中学校では技術・家庭科で学び、高校では22年度から必修となる「情報Ⅰ」に含まれるプログラミング。25年以降の大学入試共通テストでも出題科目となることが決まりました。どんなことを心がけて学んでいくといいのでしょうか? ロボット・プログラミング学習キット「KOOV(クーブ)®」などテクノロジーを活用した教材の開発に取り組む株式会社ソニー・グローバルエデュケーション代表取締役社長・礒津政明さんにうかがいました。

礒津 政明さん

(株式会社ソニー・グローバルエデュケーション 代表取締役社長)

1998年東京工業大学卒業。2000年同大学院修了、ソニー株式会社入社。ソフトウェア、ネットワーク、ウェブ関連の研究開発に従事。2015年株式会社ソニー・グローバルエデュケーションを設立、現職に就く。2016年5月文科省「小学校段階における論理的思考力や創造性、問題解決能力等の育成とプログラミング教育に関する有識者会議」委員に就任し、「プログラミング的思考」を提唱する。教育者向けイベント、教育シンポジウム・学会、AI・ブロックチェーン技術イベントでの講演多数。

プログラミングはデジタル時代におけるリテラシー

中高生のみなさんがプログラミングを履修することが必須となった背景の一つに、社会が複雑になっているということがまず挙げられます。世の中の課題や問題はさまざまな要因が絡み合っていますし、人々の価値観も多様化しているため簡単に答えが出せなくなったうえに、正解が一つとも限らなくなっています。

そんな複雑な社会の中で物事を考え、何らかの課題を解決しようとするときには、自分のもっている知識や今ある技術の中から複数のものを結びつけることで解決策を生み出せることがあります。このようなときに、自分のもっている知識の幅が広ければ広いほど、幅広い選択肢から何と何を結びつけるとよいか?と考えることができるというのは、容易に想像できるでしょう。つまり、このような社会における学びにおいて重要になるのは、基礎学力だけでなく、基礎学力を土台に幅広く学び、多様な視点をもつことです。その中で、プログラミングは幅広く学ぶための土台になるものです。

今、世の中の多くのものはデジタル化されてきていますから、英語の知識があれば海外の文献まで読み漁ることができます。同じように、プログラミングを始めとしたデジタルに関する知識があることで、世の中にたくさんあるデジタルなものを理解することも、主体的に活用することもできるようになるわけです。プログラミングを習得することは、まさにデジタル時代におけるリテラシー(読み書き)を身につけることと言えるでしょう。

さらに、プログラミングの知識があれば、自分でアプリケーションを作って情報を集めたり、発信したりすることもできます。たとえば、何かの課題を解決するための手順を考えついたときに、それをアプリケーションにしてみんなに配布すれば、みんなが同じ手順でその課題を解決できるようになるでしょう。これはどういうことかというと、「知識や自分の考えをデジタルでコピーできるようになる」ということです。さらに、そこから誰かと協働して新しいものを作ることもできそうです。

すでにみなさんの中には、デジタル端末を使って動画や静止画を加工・編集したりしている人もいると思います。プログラミングを学べば、個々の動画や静止画を組み合わせるなどさらにいろいろな表現ができて、より高度な、また、オリジナリティの高い創作物をつくることもできますよ。

具体と抽象を行き来する思考を鍛えよう

中学や高校でプログラミングを学ぶ際には、少し難しい言い方をしますが、「物事(=具体)を一度記号に置き換えて、具体に適用する。適用してみて改良点が出てくればまた記号に抽象化したうえで、具体に戻す」という、具体と抽象を行き来する考え方を意識して学んでほしいと思います。

具体と抽象とはどういうことか、インターネット上の「航空写真」と「地図」を例に考えてみましょう。たとえばGoogleマップでは「地図」のほかに「航空写真」を選ぶことができます。みなさんは、見たことがありますか? 「航空写真」には、道路や建物、川、橋、森林などその土地に存在するものすべてが上空から写されているので、目で見た情報と一致するというわかりやすさがあります。しかし、それぞれの配置や距離を把握するには情報が多すぎてわかりづらいですよね。この地図だけを持って目的地にたどりつくのは、難しそうです。そこで、道路や建物といった情報を、一定の線や形、地図記号などに抽象化して地図を作れば、配置や距離が把握しやすくなります。これをやっているのが、みなさんがよく見るGoogleマップの「地図」です。

この抽象化という考え方は、コンピュータの歴史の中で昔からなされてきたものです。「何かを入力して、出力する」というのがコンピュータの基本的な考え方で、大昔のコンピュータは、コードやデータを入力しなければ、画面上に何かを表示(=出力)することができませんでした。それが今では、たとえば自動運転なら、入力にあたるのが「車に備え付けられたカメラやセンサーがとらえた映像や位置といった情報」で、出力にあたるのが「自動運転のアルゴリズムで車を走らせること」です。そして、この入力と出力の間で入力時の具体的な情報を抽象化し、具体的な出力につなげているのがプログラミング言語になります。つまり、デジタルでものを作ろうとすると、プログラミングを用いて具体と抽象を行き来しながら考えることが必要になるというわけです。

この具体と抽象を行き来する考え方を、私は「プログラミング的思考」と名づけ、文部科学省のプログラミングに関する有識者会議でも提唱しています。もう少し詳しく言うと、「自分が意図する一連の活動を実現するために、どのような動きの組み合わせが必要であり、一つひとつの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組み合わせをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力」をプログラミング的思考と説明しています。
「自分が意図する一連の活動を実現するために、どのような動きの組み合わせが必要」かを考える、というのが具体的な思考で、「一つひとつの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組み合わせをどのように改善していけば、より意図した活動に近づくのか」を考える、というのが抽象的な思考です。

ものごとは抽象度を上げることによってその特徴を抽出しやすくなり、ほかのことにも応用が可能となります。また、このように抽象化して考えるということは、大多数の社会人が働く中で自然とやっていることです。みなさんもぜひ、プログラミングを学ぶことで、今のうちからこの思考を培ってほしいと思います。

創造性は才能ではなくこれから磨いていけるもの

さらに、プログラミングを学ぶことでみなさんに培ってほしいのが、クリエイティブシンキング、創造的思考です。

みなさんの中には「創造性はもって生まれた才能。自分には創造性がないから新しいものは生み出せない」と思っている人もいるのではないでしょうか。でも、実際のところ、創造性がある人というのは、すでに知っていた物事や過去に体験したことをうまく結びつけられる人のことなのです。知っている物事や体験したことが多ければ多いほど結びつけられる材料は多くもてるし、結びつけることによって新しいものを作ることができれば、それはすなわち創造性が発揮されたということです。何もないところから何かを作ることだけが創造性ではないのです。

したがって、創造性を発揮するのに必要なのは、才能ではなく強い好奇心とたくさんの経験・知識、そして、何がなんでも結びつけるという意思だと私は考えています。好奇心が強くて、やり抜く力があって、いろんなことを知っている。これは決して特別な才能ではなく、後天的に身につけられるものです。そして、今の時代はデジタルのツールを使いこなすことで、これまでになかったような創造性をいくらでも発揮することができます。その土台になるのが、プログラミングをはじめとしたデジタルの知識なのです。

今、ソニー・グローバルエデュケーションで開発に取り組んでいるプログラミング学習サービス「VIRTUAL(バーチャル) KOOV(クーブ)」では、「創造的思考を鍛えることを目的に、デジタルを使ってさまざまなものを創作する」ということに力を入れています。プログラミング学習というと、パソコンに向かってコードを打ち込むような「プログラミング言語を学ぶ」というものを思い浮かべる人が多いかもしれませんが、プログラミング言語を使えるということは、あくまでデジタルで命令を出す道具が使えるようになったということにすぎません。それよりも、「課題を見つけて、それを解決するものを創作する」ことをより重視したいと考えているのです。

プログラミングは他科目とも密接にかかわっている

プログラミングは技術・家庭科や情報の授業の中にとどまるものではありません。ほかの科目とも密接にかかわっていて、それぞれの関連性を意識することでより学びが深まります。

たとえば、数学で学ぶx軸、y軸、z軸の概念や関数の概念は、バーチャル空間でのものの動きを理解するときに必須です。逆に言うと、数学の知識があるからこそ、画面上でプログラムできるものが増えるのです。これは、どういうことかと言うと、かなりプログラミングができる小学生であっても、高校の物理で学ぶ重力加速度の知識がないと、ボールを投げて落ちてくるプログラムを書いたときに放物線を描く自然な動きではなく、等速運動の不自然な動きを書いてしまいます。ところが、重力加速度について学んでいれば、頭の中でボールの動きを数式で組み立てられるので、自然な動きを書くことができるでしょう。高校では、ほかにも三角関数やベクトル、微分・積分なども学ぶので、バーチャルな空間をより数式と連動させられるようになります。これは、中高生ならではの深い学びと言えるのではないでしょうか。

数学や物理だけではありません。社会や国語、英語などともプログラミングは関連しています。たとえば、プログラミングでシステムを設計する際には、いかにして一人ひとりに公平で平等なしくみにするかということを考えて作りますが、このような考え方と、社会科で学ぶ「所得の再分配」の考え方は似ています。こういった共通点を見いだすことも、学びを深める一端になると思います。

また、今、AI(人工知能)の進化が、現場にいる人間からすると考えられないほど速く、とくに、自然言語と呼ばれる、私たちが日常的に使っている言葉の処理にかかわるAIの進化が急速に盛り上がっています。具体的には、文章を3行ほど書けばその続きをAIが生成してくれる技術が英語でどんどん出てきていて、その精度がものすごく上がっています。こうした技術の進化によって、英語や国語といった言語のあり方や、自然言語とプログラミングの関係を考える機会も今後増えていくのではないかと思います。

ソニー・グローバルエデュケーションより提供されているロボット・プログラミング学 習サービス、VIRTUAL KOOVでは、パソコンやタブレット上のアプリにてプログラミン グを行い、3D空間でプログラムどおりにロボットが動くのかを確認しながら学習を進め ていく。物理的な場所や機材など学習環境の制約なく進めることが可能となっている。
https://www.koov.io/

さらに学びたい人には目的に応じた内容を学ぼう

学校の科目としてだけでなくもっとプログラミングを学びたいという人は、学ぶ目的や興味の方向性がどこにあるのか考えてみましょう。それにより学ぶべきプログラミングの内容は分かれてきます。方向性としては、大きく次の3つがあります。

1つ目は、プログラミング言語そのものや、アルゴリズムの設計について学びを深めていく道。将来的には、論理数学、問題解決力、データ分析力などが求められる、プログラミング言語設計者、AI研究者、データサイエンティストといった職業が考えられます。2つ目は、システムやサービスをデザイン視点で設計する思考や方法を学ぶ道。プログラミングや技術に関する幅広い知識と応用力、()(かん)力、調整力が必要で、これらを用いる職業は、「システムアーキテクト」、「ソフトウェアアーキテクト」と呼ばれるエンジニアが考えられるでしょう。3つ目は、世の中の課題を意識しながら、プログラミングにとどまらず、サービス全体を設計し、解決する方法を学ぶ道。解決したい課題について、課題をブレイクダウンして整理した一つひとつの小課題を解決するためにどういうプログラムがあればよいかを考え、それらを組み合わせて課題全体を解決する方法を設計するというもので、実社会では「プロダクト・マネージャー」などと呼ばれる仕事につながりますが、システムやそれを使ったサービスをつくる際には、全体設計ができる人がプログラムを組める人とは別に必要です。この仕事では、プログラミングの素養があった方が有利ですが、必須ではありません。社会や他者と関わる力、企画提案力、問題発見力、コミュニケーション力が問われます。

このように、一口にプログラミングといっても、目的や興味の方向性によって学ぶべきことが大きく異なります。また、これら3つはあくまで基本の部分で、この基本をゲーム開発に応用するのか、アプリ開発に応用するのか、Webサービスの開発に応用するのかなど、応用先によっても学ぶべき内容が変わってくるでしょう。今はピンとこなかったとしても、高校生くらいになって興味の方向性や課題意識などがはっきりしてくれば、自ずと学ぶべき方向性が見えてくると思いますよ。

また、「どこまでプログラミングができるようになればいいの?」というのもよく受ける質問です。プログラミングはデジタル社会における読み書きにあたるものと言いましたが、あくまでもツールです。外国語学習の目的やゴールが人によって異なるように、プログラミングも自分が表現したいものや解決したい課題に対して必要であれば使う、必要なければ使わなくていいものです。また、プログラミング自体も、最近ではコーディング(プログラミング言語でコードを書くこと)しなくてもプログラムが作れてしまう「ノーコード」という考え方や手法が出てきたので、必ずしもプログラミング言語を使って書く必要はなくなっています。ですが、プログラミングは現代のデジタル社会を生きるうえでは重要なツールであるのは確かです。プログラミング学習をとおして具体と抽象を行き来する考え方を磨き、そのうえでプログラミングを使って作りたいものや表現したいこと、解決したいものがあれば、必要な言語やツール、考え方についてさらに学んでいけばよいと思います。

「将来どうなりたいか?」を考えながら学んでほしい

最後に、みなさんが今、学んでいる目的は何でしょうか? 大学受験に合格するため、将来いい仕事に就くためといった目的もあると思いますが、教育の本来の目的は、well-being、すなわち幸福に生きるためだと私は考えます。中高生のみなさんにとっては、「社会に求められているからこういうことを学んでこういう力をつけなきゃ」と意識する以上に、「将来、自分は何を成し遂げたいのか?」「どういうふうに成功したいのか?などと将来をイメージし、目的意識をもって学ぶことが幸福に生きることにつながります

私はよく「中高の6年間は人生における壮大な時間稼ぎ」と話しています。ぜひみなさんには、中高の6年間じっくりと時間をかけてさまざまな経験をしながら「自分は将来、どうなりたいか?」という人生の目標を考えてほしいですし、自分の課題や社会の課題を見つけたなら、どういう方法でアプローチすればいいかということも考えてほしい。その中で、デジタルの社会を生きるうえで必須のツールとして、必要に応じてうまくプログラミングを学んでほしい、そう願っています。