息をするようにプログラムを書く
このブログ記事は、朝日中高生新聞2021年5月30日号の連載「プログラミングでかわる!?私たちのミライ」第7回と合わせてお読みください。朝日中高生新聞に掲載された記事全文はこちら(転載許可取得済み)。
「プログラムを書く」とは?
プログラミングを学び始めた頃は、様々な命令や概念が出てきて、どれくらい勉強すればいいのだろうと不安になることがあります。プログラミングを学ぶとはどんなことなのかについて少し私見を書いてみようと思います。
そもそも、プログラムを書くとは何をすることなのでしょう?
プログラムは、コンピュータにとっての「手順」です。ですから、プログラムを書くというのは「手順にする」ということです。
何のことだかわかりにくいですね。世の中にはいろんな手順が有ります。料理のレシピ、機械の使い方、プラモデルの組み立て方。どれにも共通していることは、「何かを達成することを、単純な操作の組み合わせに分解する」ということです。
カレーを作るためには、野菜を切る操作、炒める操作、煮込む操作、またそれらの繰り返しに分解できます。ビデオを録画するのは、メニューを開く操作、番組を選択する操作、保存を指示する操作、などに分解できます。
もう少しプログラミング的な例だと、筆算がわかりやすいかなと思います。1桁の足し算というシンプルな知識と、紙と鉛筆があれば、2桁以上の足し算ができます。繰り上がった時にどこにどういう情報を書き記すか、次の桁の計算の時にどのように使うか、などの「手順」に分解していますね。
コンピュータのプログラムも同じで、こうした細かい操作に分解することでできています。足し算引き算などの四則演算の他に、条件分岐や繰り返し処理などがありますよね。プログラミングを勉強していくと、こうした操作を一つずつ覚えていくことになります。
はじめはいろんな操作があって面食らってしまいますが、実際によく使うのは10個程度しかありませんし、極端に言えば条件分岐とループがあれば大抵のことはできます。Playgramではこれらを体系的に学ぶことができるように設計されています。大事なのはたくさんの操作を覚えることではなくて、これらの組み合わせが大事であること、組み合わせることで様々なものが作れるということなのです。
例えばみなさんが普段遊んでいるゲームも、こうした簡単な操作の組み合わせだけでできています。足し算なんてどこでもしてないよ? そう思うかもしれません。
例えば画面のキャラクターを動かすことを考えてみましょう。プログラムはキャラクターの位置を覚えておき、ボタンが押されたら位置をずらして(位置に足し算して)キャラクターを表示し直す。また押されたら、またずらす。これを繰り返すと、画面上ではキャラクターは移動しているように見えるのです。ここで大事なのは、「キーを押したら、値を変えて、表示する」という手順でできているということです。

手順が分かれば、何でもできる
「手順に分解できれば何でも作れるんだ」。
プログラミングを始めて数年経つとこういうことに気づくでしょう。ではこれで何でも作れるようになるのでしょうか?
職業でプログラムを書いている人は、息をするように手順をプログラムに起こしていきます。学び始めた時にあれだけ苦労した「手順をプログラムにすること」は、当たり前のようにできるようになっています。
より難しいのはその周囲にあります。手順がわかれば何でも作れると書きましたが、逆に具体的な手順がわからないものが世の中にたくさんあるのです。
これまでの特集で紹介してきた、ロボットや人工知能のプログラムの殆どは、具体的な手順自体が(人類にとって)よくわからないものばかりです。人が手を動かす時にどのような順番で筋肉を動かしているかわかるでしょうか? 人が言葉を理解する時に、何に基づいて理解しているかわかるでしょうか?
ちょっと考えても簡単にはわからないと思いますが、それもそのはず、多くのことはまだ人類に解明されていないのです。
「どう作ったらいいのかわからないもの」を作るための知識は、プログラミングの外にあります。
そこには学校で学んでいる数学や物理などの知識が使われています。人の構造や物理の法則、それらの計算方法、数学、物理学、生物学、言語学、いろいろな学問の知識を総動員して、具体的な「計算の手順」を考案しているのです。
中学や高校で習うこれらの学問が何の役に立つのか、というトピックは時折話題になりますが、おおよそほとんどの知識は皆さんが日常的に使う道具や仕組みを作るのに使われています。この知識で何が作れるだろう、ということを考えながら授業に臨むと面白いかもしれません。また逆に、世の中に新しいものを生み出すためにはこうした知識を習得した先に、新しいことを生み出す必要があります。
ゲームなどで使われている、3DのCGを表示することを考えてみましょう。知識のない人にとっては、どうやったらいいのかすぐにはわからないのではないでしょうか。それもそのはず、3D CGを表示するためには高校・大学レベルの数学や物理の知識が必要になります。3次元空間中の図形をカメラのレンズを通してフィルム面に至ったときの位置を計算しています。これを計算するために、三角関数や複素数、あるいは行列などを利用した計算手順に落とし込むことが必要になります。
こうした専門性の高い知識をもっていないと、複雑な問題を計算手順に落とし込むことはできないのです。逆の見方をすると、数学や物理学の知識を得ることができれば、新しいものを作りただすことができるようになります。
良いプログラム、悪いプログラム
プログラムの書き方自体に工夫はもうないのでしょうか?
そんなことはありません。同じ料理を作るための手順にも、作りやすい手順と作りにくい手順があるように、プログラムにも良し悪しが有ります。例えば家を建てる時に、柱を立てて、壁を作って、床を作るよりも、最初からパーツ化された部品をもってきて組み立てたほうが早く仕上がりそうですね。
プログラミングも同じように、全て一から作らずに、できあいのパーツを組み合わせたほうが効率がよく、ミスも少なくなりますし、うまく分業できるようになるかもしれません。複数人で作るなら、うまく作業を分担したくなります。
いかに効率よく、間違いを含まず、他人と協働できるか、こうしたことをしっかりと考慮されたプログラムの方が、一般的には良いプログラムと呼ばれます。そうした良いプログラムをいかに生み出すかの方法自体を、何十年間も多くのプログラマが模索し続けているのです。
プログラミングを学ぶということ

このように、プログラミングを学ぶというのはものの作り方を学ぶということです。
一方で、作り方はわかったが何を作ったらいいのかわからない、このように感じる人も多いようです。はじめのうちは興味の赴くままに、自分の知っているものを作ってみるといいのではないかと思います。ゲームを作ってみる初学者は非常に多いですし(プロのプログラマも含めて)、作るもののイメージを持ちやすいのでやりやすいでしょう。
何か社会の問題を解決したい、人の役に立つものを作りたい、ということを考えるのであれば、もっと視野を広くして社会の課題を知ると役に立つかもしれません。経済や歴史、医学、政治、これらの勉強を通して社会の課題に思いを馳せることができるかもしれません。
今、社会で何が問題になっているのか、もっと身近な皆さんの家族や自分自身がどういう問題をもっているのか、そうしたものを考えてみると良いのではないでしょうか。
プログラミングを通じて、多くの人にものを生み出すことを体感してほしいです。
プログラミングは特別に難しい技能や多額の資金がなくてもものを生み出すことができます。大型の装置や、危険な道具、巨大な化学プラント、高価な材料や、道具を巧みに操る技術、こうしたものを必要としません。誰が計算させてもコンピュータの計算結果は同じです。
そこには、大人も子供もありません。学校での勉強は、受験のため、進学のため、と時として勉強のための勉強になりがちです。しかし、これらの知識はものを生み出すのに使えるものばかりなのです。
ものを作りたい、色んな人に使われるものを生み出したい、そういう人が一人でもたくさん増えると嬉しいなと思います。