なんてことはない備忘録なのですが、受講生(元・プログラミング未経験者)の方と真剣に議論したので置いておきます。
本稿の目的(プログラマー/エンジニアを目指す全ての方へ)
- to 学童: 学校の教育が全てではないよ
- to 学生: 本気でやりたいなら今すぐプログラミングを覚えるより、数学(アルゴリズム)と英語(公式ドキュメントを読む)と統計学(データ分析)をやろう。
- 勉強が嫌いなら(だと思うので)、「アルテリオス計算式」を採用したRPGゲームを1本でいいからガッツリやりこんで欲しい
- to 社会人: プログラミング言語は人間がシステム開発をしやすいようにシステム側から人間に歩み寄っているものだが、人間側がシステムに歩み寄らなくてよいという事ではない(特にAIを使ってプロンプトエンジニアリングする時)
一人でも多くの人がプログラマーとしてご活躍できることをお祈りしています。
一緒にお仕事できることを楽しみにしています。
本題
問題のコード(コメントアウト記号は#
だったり//
しますが、ここではpythonを使用)
きっと、違和感を持たない人も多いであろうよくあるコードです。
a = 10
a = a + 1 # ← なんで?
print(a) # 11
IT講師は違和感を忘れないで欲しい(違和感を持つ必要はない)
何が言いたいか、結論
- 数学のイコールは比較。プログラミング世界のイコールは代入
- 数学のイコールに相当するものは、プログラミング世界では==という
- 実行順は=の右側の処理が最初に実施され、右側の処理の答えを=の左側で指定した変数などに代入する
配列編もあるんですが、これはいったん置いておきます。
将来の自分に跳ね返ってくる危険な魔法の言葉「数学のルールとプログラミングのルールは違う」
だいぶ端折るので本筋が分かりにくいかもですが、以下のようなやり取りがありました。
- 最初
- 私「数学では、(=)イコールは同じものか比較しますが、プログラミングの世界では=(イコール)は右にあるものを左に写す事を意味します」
- 私「たとえば、
a = a + 1
は、aの要素に1を追加して、aの値を更新すると読みます」 - 私「直前でaの値を10に更新するという処理をやってます」
- 受講生さん「はえー」
- 機械学習の単元にて
- 私「これからは数学的な考え方(よくあるのが離散・線形)をやっていきます」
- 受講生「先日教えていただいた(
a = a + 1
)はどうなりますか?」 - 私「そこはプログラミングの考え方で良いですよ」
- 受講生「それだと、数学の考え方とは何を指しますか」
- 私「コード上はプログラミングの世界です。これから機械学習用を学ぶにあたって、どのようなアルゴリズムがあって処理されるか、という事で〜(これが専門用語の羅列っぽく聞こえた可能性あり)」
〜
受講生「プログラミングに数学は必要ですね!」
(この後も色々ありましたが、最終的には納得と理解をされています。本題ではないので割愛)
〜
※注
よく気付ける方なので将来にとても期待しています。
が、当時の私の説明の仕方がよくなく、行き着くとプログラミングの世界でも数学の考え方(ただし、数学的な概念ではない)は必要だよ、という話をしていなかったなと思いました。
どうすれば良かったか?
コードの書き方やコードの組み立て方はプログラミング思考アルゴリズムが必要で、機械学習のライブラリを学習するときは数学的思考アルゴリズムが必要
まとめて「アルゴリズム」という表現をしてしまったので、これがややこしいのだろうと考えます。
プログラミング的、数学的思考アリゴリズムとは
おそらく色々なところで議題に上がっている事だとは思いますが、私のイメージレベルの意訳です。
- 数学的: 問題を分析し、仮説を立てる
- エラーメッセージなどを読み、問題点を探す。解決方法を模索する
- プログラミング的: 目的を達成する手段を考える
- 仮説に基づき実装する
と、あえて分類します。
プログラミングに注力するだけでも数学的アルゴリズムの考え方は必要だし、機械学習などで言えば理論や仮説を立てた後にプログラミング的アルゴリズムによる実装方法への変換が求められる、という図です。
なかなか説明が難しいのですが、ここでいうアルゴリズムとは、「その場その場で解決アプローチを考え、道筋を立てる事」という目標を立てて、そのために必要な考え方の種類が色々あるよ、という事でまずは定義を置きます。
※学者・専門家ではないので表現が正しくない可能性が高いです
※想定するペルソナは数学者でもプログラマーでもない方です。60代文系の方にプログラミングを教えるというのが目的です
コラム: 高齢者がプログラミングを始めるのは遅いのか?
そんなことはない。
たまたま私が担当した受講生の方だけにとどまらないです。
たとえば、若宮正子さんの例や、私の身近でもすごい例で鈴木 富司氏(トミ爺さん)の例もあります。
なんなら、もう20年も昔の話ですが、私の祖父も現役引退後に学生であった私といっしょにWebサイト作成を勉強して一緒に作ったぐらいでした。
今は故人になってしまっていますが、生きていればChatGPTも使っていただろうな、と思ってます。
仮説「1 = 2の証明」のように見える?
a = 1
a = a(1) + 1
↑これが「1 = 2」
より 1 = 2
になってしまっているように見える事が混乱の一つで、数学世界の「=」をプログラミング世界では「==」と表記するというルールを一緒に説明しないと混乱の元になる可能性がありそうです。
同様に、if文の式の説明時にはTrue(言語に依存するが数値で0ではないもの。基本的に1)/False(0)で判断していることもポイントだと考えます。
今回の例で言うとif(a)
とif(a==1)
の違いとも言えます。あわせてif(a=1)
についても解説しておくと良さそうです。
shell scriptで言えばa=1
の結果$?
が正常終了になります。
こういった言語依存の挙動についても理解が必要になってくるため、数学的にプログラミング世界を見つめようとすると色々と齟齬が発生してしまう事を認識してもらう必要があります。
「プログラミングの世界では数学の考え方は適用されない」と「プログラミング(アルゴリズム)には数学的知識や応用が必要」は別である
「全員にこの方針をもって指導すべきである」という話ではなく、数学に強い人にとってプログラミングの世界と数学の世界の違いを分かりやすく説明する必要がある場合に、どのように指導方針を立てるのか一つの参考にすると良いかもしれない方法として意識してもらうのが良いです。
前者については分かりやすいですが、後者を教えるのが難しくなってくる事が多いと思われますので、大枠の方針として採用して個別具体の対応を検討していく必要はありそうです。