WirelessWire News Technology to implement the future

by Category

なぜ、プログラミングは役に立つのか

2023.12.15

Updated by Atsushi SHIBATA on December 15, 2023, 10:55 am JST

今回紹介する書籍:『Pythonで学ぶ はじめてのプログラミング入門教室』柴田 淳SBクリエイティブ、2023)

前回の微積分の話をたくさんの人に読んでいただけたことに気を良くして、というわけでもあるのですが、今回は連載の趣旨に合わせながら、最近私が書いたPythonの入門書について紹介します。プログラミングとは何か、どう学べば良いのかについても、私なりの考えを書いてみたいと思います。

ところでみなさんは、「2」という数を見て何を思い浮かべるでしょうか。「2月」「2番手」「2メートル」「2進法」など、数を見るとたちまち頭の中にいろいろなイメージが想起されるはずです。

「2という数」自体には、実はたいした意味はありません。なのに、単位を伴った数量や、順序を持った離散的な概念など、私たちは数を使っていろいろなものごとを「表現」することに慣れています。

人間は、想像力を使って抽象的な数と具体を結び付けることができます。この能力は、実は数学や物理、プログラミングと大きく関係しています。

「数による表現」という発明

現代人なら誰でも使う「数による表現」の歴史は、実は意外に浅いのです。歴史に残るような数学者だって、つい数百年前までは数を自由に使いこなせてはいませんでした。

数を使わないでどうやっていたのか、それは「作図」です。角の二等分線や、正三角形や正六角形を描く方法を小学校で習いますね。目盛りのない定規とコンパスを使った有限回の手順で図を描くことが、数学をすることだった時期があるのです。

そんな時代にデカルトが微分を発見したのも、数による表現の発見が大きなきっかけだったといわれています。彼は単位を導入することで直線を数に見立てる方法を考え付きました。ある単位の長さを持つ線分を「a」とすると、2倍の長さの線分は「2a」と表現できます。横の長さと、縦の長さの「2つの数」を使うと、線の傾きを表現することができます。「横に1、縦に1」よりも「横に1、縦に2」の方がより傾きの大きな直線を表現できます。

では、横の数を同じだけ、縦の数は増やし方を増やしながら、直線をつなげて描いていったらどうなるでしょうか。傾きが右肩上がりに増えて行くはずです。一つひとつの直線の長さを「無限に」短くして行くと、右肩上がりの滑らかな「曲線」になります。こうしてデカルトは「微分法」を発見しました。

デカルト座標の発見によって、定規とコンパスを使った「作図の手順」から「数を使った表現」へと人間の世界認識がアップデートされたのです。やがて、いろいろな物理現象や社会現象が数によって表現され、解析されるようになります。数と数の関係はやがて文字式になって、沢山の方程式が生まれます。前回の微積分の話を思い出したなら、あなたは優秀な読者です。

分析的視点や科学的視点は、「数による表現」を起点にして生まれたのです。近代に入ると数学は純粋な「数の学問」となって行くのですが、科学との親密な関係を続けていられるのは「数による表現」というインタフェースがあるおかげです。

計算しかしないコンピュータを使って様々な課題解決が行えるのも、現実の問題を数に置き換えることができるからです。「数による表現」を学ぶことは、プログラミングでもとても重要なことです。数にすると見えてくることは、本当に沢山あります。

ノウアスフィアの開墾

最も初期のコンピュータは、科学技術計算をするために作られました。当初プログラミングは専門家のためのもので、方程式を計算するプログラムが主に作られました。

民生用コンピュータが登場すると、身近にあるいろいろな「ものごと」が「数による表現」に置き換えられるようになります。私がベーマガというコンピュータ雑誌で原稿を書いていた中学生の頃は、画面上にラムちゃんやミンキーモモの絵を描きながら、デカルト座標上の点を結ぶことでコンピュータで画像を表現できることを学びました。しばらく前に復刊で話題になったOh!Xという雑誌に記事を書くようになると、コンピュータが直接扱う数について触れるようになり、計算手順そのものも数で表現できることを知りました。

研究者や専門家でない人々がコンピュータを使うようになり、数による表現のカンブリア爆発が起こったのです。プログラムを読んだり書いたりすることで、新しく産み出された表現手法をオンタイムで学ぶことができた、とても良い時代だったと思います。リアルタイムで「ノウアスフィアの開墾」を体験できたと感じられます。私が今持っているコンピュータサイエンスにつながるような知見は、ほとんどその頃に学んだものです。

時代は進み、かつてオフィスにあった紙や帳簿はコンピュータの画面上に表示され、編集されるようになりました。データをいったん「数による表現」に変換して、計算で処理し「操作」した後、逆の手順でデータに戻して表示する、という手法は、方程式と並んでプログラムでよく使われます。文字、音声や画像、動画のようなデータはすべて同じような手順でコンピュータで処理されます。

方程式と操作の手順を組み合わせると、プログラムでいろいろなことを自動化できるようになります。以前は百葉箱から人力で集められていた気象データは、今では街中や山林などに設置されたセンサーで数に変えられ、モバイルネットワークを通じて自動的に収集されます。集められた大量のデータは方程式にかけられ、出てきた数が分かりやすく整形されて天気予報になります。私たちはそれを見て行動を決めます。

はたまた、問題のあるウイルスが蔓延すると、次世代シーケンサと呼ばれる機械でウイルスの遺伝子が離散数に変換されます。そうして集められたデータは比較されたり、統計的手法を使ってプログラムで処理されます。出てきた数は感染情報となって、私たちの行動を変化させます。

かくして様々な「数による表現」が世の中に溢れ、ありとあらゆる「ものごと」がプログラムで処理される時代となりました。ノウアスフィアの開墾は続いています。そう意識しているかどうかにかかわらず、私たちはプログラムが出力した数を見て世界を知り、行動を決めています。コンピュータによって社会実装が行われる現代で、プログラムが重要で役に立つというのは、もはや自明なことなのです。

プログラミングはどう学べば良いのか

そして自ずとプログラ「ム」を作るプログラ「ミング」が注目されます。国家はプログラ「マー」人口の増大に乗り出します。キッズは半ばゲームと混同しながらプログラミングに興味を持ちますし、高校の教科書にPythonプログラミングが載ったり、大学入試にも出そうかという話になってきます。

私がプログラミングを学んだウン十年前と今との決定的な違いは、「数による表現」の種類が圧倒的に多いことです。あの現象を表現するにはこの方法、というようなデファクトの表現手法がたくさんあり、それを操るアルゴリズムも豊富にあります。これが、プログラミングの有用さを下支えしている事実です。

プログラミング上達に当たってすべきことは、まず表現手法について学ぶことです。でも、現代のプログラミングで使われる「数による表現」は、数が多すぎる上に多数のドメインによって分断されているので、どれから学べば良いのか分かりません。

そこで、抽象化した状態のプログラミングを教えよう、ということになります。「x」とか「a」といった変数に「2」とか「100」という数を代入して、というような教え方です。これで「機能」については伝わるのですが、まるで「応用」はできません。

これは、実際にいろいろな人に教えた結果分かったことです。G検定を持っているような才女や、算数の偏差値がお化けな息子のサピ友に教えてもまるで伝わりません。論理的思考能力や抽象的思考能力などの不足が障害になっているのでないことは確かです。

抽象的な機能を教える代わりに、「width = 100」というようなコードを見せて、「長さが100です、という意味を込めて書いたプログラムです」というように、意味を教えると、ちゃんと伝わるのです。「りんご = 2」とすると小二の娘にも伝わります。変数名というコンテクストを使って、課題となるものごとを数として表現する。これがプログラムの入口です。

意味を添えた方が伝わりやすいのは計算も同じです。「width × height」の結果は「面積」です。「りんごの個数 + ぶどうの個数」は「くだものの個数」です。計算にもコンテクストがあるのです。「x = x+1」を京大生が見ると方程式に見えるらしいですが、「age = age+1 #年を取った」というプログラムだったとしたら、見え方は変わってくるはずです。

学び始めに触れるプログラムこそ、分かりやすい意味を持った「リーダブル」なコードであるべきです。読みやすいプログラムを読んでいるうちに、だんだんとプログラムで使われる「数による表現」について理解を深め、応用ができるようになって行きます。

人々がプログラミングをどう学ぶかについては分からないことの方が多いようですが、一つだけ確かなことは、人は「自分が学んだ過程を忘れてしまう」ということです。プログラムが分かる人が見ているのは、かなり抽象度の高い世界です。それをそのまま提示すれば初心者にも意味が通じるのなら、NAND回路だけ教えればプログラミングなんて完全理解できるはずなのです。でも、現実はそうではありません。

分かっている人にとっては自明なことも、一つひとつ解きほぐして、意味を添えながら教えると、とてもよく伝わります。そうすると、プログラムが「読める」ようになるわけです。「読める」の先には「書ける」が待っています。プログラムは「ことば」だからです。

手順のコンテクスト

プログラミングの入門書では、たいてい「変数は箱」と教えますが、これもずいぶん抽象的な説明です。数による表現の「定義」になる変数もあれば、計算結果や計算の途中経過を保存する変数もあります。変数の「使われ方」は、場面ごとに異なった意味を持っています。

変数は、プログラムが動いている間はメモリ上に永続的に保存されます。この性質を使って「状態」を表現するために使われます。このようなことも大抵は「変数は箱」で「教えたこと」にされてしまいます。

状態について理解した後「条件分岐」を教えると、わりとすんなりと理解してもらえます。「順番」という名の「数による表現」を使って複数の数を表現する「リスト」のような手法について教えると、ループについて理解してもらえます。

「手順」にも意味があるのです。Pythonのfor文がリストのようなシーケンシャルなデータを添えるようになっているのは、なかなか素晴らしい「手順の抽象」だと思います。ループカウンタを使ったループよりも格段に覚えやすいようです。理解に必要なコンテクストが少なくて済み、認知的負荷が低いからでしょう。


これは書籍に掲載したサンプルプログラムなのですが、人間が目で探そうとするとなかなか「末(すえ)」が見つかりません。Pythonの文字列は離散数を順番に並べた「数による表現」であることを知っていると、ループを使えば良いことに気付きます。ループによって取り出される個々の文字も数にマッピングされるので、数と同様に「比較」ができることに気付きます。文字列検索の基礎ですね。

ループを使って数を数えると、42(番目の文字)という答えが出力されます。文字は10個ずつ並んでいますので、4列目の2行目を探しますが「末(すえ)」は見つかりません。10の位は0から始まります。プログラムを見ると変数が0に初期化されており、1の位も0から始まっていることに気付くとやっと見付かります。このように「数による表現」を理解してプログラムを動かしてみると、Pythonのリストなどのインデックスが0から始まる理由を、体験を通して理解できます。

構造と行列

変数をいくつか組み合わせて使うことで、より複雑な「ものごと」を数による表現に変換できます。ゲームのキャラクターの状態を表現するのに使われる「hp(体力)」「mp(魔法力)」「exp(経験値)」などが分かり易い例だと思います。

これを「データ構造」といいます。プログラミングでものごとを表現するときによく使われるもので、とても沢山の種類があります。音を秒間4万回くらいの細かい間隔で区切って、強さを数として並べると音を数の表現に変換できます。これは音のデータ構造です。

データ構造の作り方にはパターンがあります。ここでは、異なる種類の「数による表現」を並べて作るパターンA(ゲームのキャラ)と、同じ種類の数を並べて作るパターンB(音)の2種類を紹介しました。さらに、このデータ構造から名前を取り除くと「行列を使った数の表現」へと変換することができます。

違うものは縦に並べ,同じものは横に並べる,というのが変換の基本です。パターンAは縦行列になり、パターンBは横行列になります。同じパターンAを複数並べると二次元の行列になります。例えば,3つの変数で構成されるデータ型を2つ並べると,縦3×横2の二次元行列になります。エクセルでは縦行列を横に並べることが多いので,取り込み時にピボットするわけです。

これを「テンソル」と呼びます。理解が難しいのは、名前が奪われ数だけを露わにするという抽象化が施されているからでしょう。

行列演算を使うと、四則演算から微積分まであらゆる計算手順を実行できます。答えを得るための計算も、形を変えるための計算手順もどちらも実行できます。ディープラーニングやLLMでは「行列」という数による表現でものごとが表記され、「行列演算」でアルゴリズムが実行されています。行列演算の得意なGPUが多用されるのはそういうわけです。

変数や条件分岐のような機能だけ覚えてプログラミングを学ぶと、オブジェクト指向が分からない人になりがちです。そんな人には、たいていデータ構造をまず教えます。ネコちゃんを動かしながらとか、最初からオブジェクトを軸にした学び方をした人にも、同じような「躓き」が見られることがあります。内部にある表現形式が想像できないのでしょう。

数による表現を軸にして学ぶことで、とても汎用性の高いプログラミングの知識を身に付けることができるのです。

万人向けのプログラミング

最近の関数電卓ではPythonが動きます。カシオの開発者にインタビューしたことがあるのですが、フランスの義務教育向けに追加された機能だと聞いて驚きました。フランスでは、中学校からPythonを学ぶのです。学校で習う数学との接続性が良いし、世界で流行っているし、プログラミング教育にPythonか選ばれるのは当然かもしれません。

この話を聞き、「算数の知識だけを使ってPythonを教える本ができないだろうか」と考え始めたのが今回の書籍の出発点でした。算数の範囲に越えないように、私が教えながら学んだ躓きやすいポイントを押さえつつPythonを学ぶ入門書です。ストーリーに沿って現実と数による表現を繋げる想像力を広げて行けば、Pythonだけではないプログラミングの初歩的な要素を多くの人が学べるはずです。

査読には大人だけでなく、小学校6年の子にも入ってもらいました。最初は父親と読んでいたそうですが、やがて独学を始め、一人で読み切ってくれたそうなので、大人はもちろん、中学生や高校生にも読んでもらえそうです(nが小さい統計ではありますが)。世の中には書いてあることを恣意的に受け取ってしまう人がいて、そういう人はこの本を楽しむことはできるはずですが、書いてある内容は完全には伝わらないと思います。銀の弾丸が存在しないことはよく知っているつもりです。

先にも書きましたが、私が学んだ時代と今のプログラミングとの決定的な差は、「数による表現」と、それを処理して答えを出す「アルゴリズム」の種類が圧倒的に多い、ということです。Pythonの基本的なデータ型やデータ構造の考え方、操作方法を覚えさえすれば、AIのような「大きなアルゴリズム」をプログラムから簡単に活用することができます。そうすると、AIを道具として使いこなせるようになります。単に恐れたり避けたりするのではなく、です。

大きなアルゴリズムが答えとして返してくるのもまた、数による表現としてのデータ構造です。出力は別のアルゴリズムの入力として利用することができます。「英語音声」「音声認識」「翻訳」「LLMによる要約」「音声合成」のように出力と入力を繋げて行くことで、より高度なプログラムを作ることができます。これが今風の、みんなに役立つプログラミングです。

コンピュータサイエンスや機械学習のベースとなる数学理論など、より深い学びがあるのは知っています。私はその手の「そもそも論」が大好きです。だけど、プログラムが言葉だとするのなら、多くの人は普通の言葉を使うはずです。小説家のように言葉をより深く知りたい人だけが、言葉についてより深く学ぶのです。

Pythonは今や、プログラミングの世界への入口で、プログラミングの裾野を広げています。裾野という変数を増やせば、ピラミッドの面積が増えてより高くそびえます。そして、そこそこ上まで登って行けた人は、別の言語を使うようになるのかも知れません。もちろん、Pythonを使い続けるのが一番楽しいに決まっていますけど。

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

柴田 淳(しばた あつし)

株式会社マインドインフォ 代表取締役。東進デジタルユニバーシティ講師。著書に『Pythonで学ぶはじめてのプログラミング入門教室』『みんなのPython』『TurboGears×Python』など。理系の文系の間を揺れ動くヘテロパラダイムなエンジニア。今回の連載では、生成AI時代を生き抜くために必要なリテラシーは数学、という基本的な考え方をベースにお勧めの書籍を紹介します。