2024年9月19日
この記事の目的は?
→単純にプログラミングの素晴らしさを私視点で伝えたい、整理したいと思ったので。
とにかく、一番伝えたいのは「プログラミングに理解できない魔法は無い」ということ。
プログラミングに理解できない魔法は無いということ
いや、確かにプログラミングでも深層学習されたAIモデルとかはその出力までのプロセスがブラックボックス化されるので理解できないみたいな異論はあると思う。でも、そういうことじゃない。
魔法
よくアニメやゲームでファイアボールの魔法を使うシーンがある。
ああいうのって理解せず、というより理解できず「そういうもの」として私たちは処理する。
プログラミングにも同じく魔法みたいなものが多々出現する。
例えば、Pythonというプログラミング言語のprint関数。
print("hello world")
とやればコンソールにhello worldが出てくるやつ。
こういうのも最初は「そういうもの」として私たちは処理する。
プログラミングに魔法は無い
先のprint関数、これは魔法みたいだけど、魔法じゃない。
Pythonという言語自体が実装されているソースコードを見てほしい。
python/cpython/blob/main/Python/bltinmodule.c
の中にbuiltin_print_impl
という関数があると思う。
builtin(組み込み関数)、impl(implementation=実装)、なのでこれがprintの実装部分になる。
つまり、PythonはそもそもC言語で書かれていて、魔法みたいなprint関数も内部に生々しく実装されていることがわかった。
このCの実装も更に奥深くを見ていくと更に生々しい実装があって、最終的にはバイナリデータに行きつくはず。
こんな感じでプログラミングは「魔法みたいだけど、実は論理的に動いている」みたいなことが連続している。
プログラミングに理解できない魔法は無い
私は、全ての事象には原因があるという因果律を信じている。
全ての事象には原因があるので、先のprint関数に限らず、飛行機が空を飛ぶのも、全身麻酔が効くのも、音楽で感動するのにも、全てには理由があると思っている。
しかし、因果律がもし事実だったとしても、上に挙げた通り理解が難しく、完全には未解明の物も多い。
それに比べてプログラミングはどうだろうか。
プログラミングは人間がルールを作り、文字で記述するものだ。
つまり、全てのプログラミングルールは人間が理解できる「原因と結果」で書かれていて、文字という残りやすく扱いやすい媒体で作られている。
何が素晴らしいか
プログラミングのルールは人間が作っているので、人間が確実に理解できる。
そして、文字という分かりやすい媒体で残されている。
つまり、頑張ればプログラミングに「分からない」は無い。
これは途轍もなく素晴らしいことだと私は思う。
私は自分が感動する音楽を作りたいと目標を掲げているが、この作曲は「わからない」が多い。
それは音という媒体もそうだし、こうすればこうなるという音楽のルールが明確に定められていないからだとも思う。
※音楽理論というルールは一応あるが、ルールベースのプログラミングと違い、音楽ベースの音楽理論なので、カバーしきれていないところが多い……と私は思っている。
これに比べ、頑張れば確実に分かる保証があるプログラミングは素晴らしい。
もちろん、分からないことが多い音楽だからこそ、惹かれる部分があるのだとも思う。
頑張っても確実には分からないものもある
プログラミングにはそんな素晴らしさがあるわけだけど、一応例外もある。
私の思う例外は2つで、
-
規模がでかすぎる/複雑すぎる物
-
設計
の2つ。
規模のでかすぎるもの/複雑すぎる物はそのままの意味で、私たちの時間は有限だよというだけ。
さっきのPythonのソースコードとか、私はとても全てを理解できない。したくない。
2つ目の設計というのは、プログラミングで制作するツールなどの設計、コンピューターが無くても作れる部分。
例えば「国民全員を管理するマイナンバー的なシステムを作ってくれ」と言われた時、その設計にただ1つの正解は無い。
でも、プログラミングをやってるとこういう正解のない設計をすることが多い。というより、それが求められてたりする。
こういう設計にはベストプラクティスは基本無く、日々良いものを目指して改善が求められる。
でも、そこまで特異なものでなければ大体先人がいるし、その内容を残してくれている人も多い。
これは、文字で残せるプログラミングだからこその利点だし、作曲にはない羨ましいところでもある。
他の素晴らしいところ
とにかく、一番言いたいことは言えたので他のプログラミングの素晴らしいところを挙げて終わる。
一人で学べるということ
プログラミングは一人で学ぶことができる。
もちろん人に教えてもらう方が上達は早いかもだけど、マイペースにいつでももくもくと進められるのは大きなメリットである。
分からないことがあっても大体誰かが記事にしているし、公式のドキュメントがあるし、ソースコードもある。
最近はChatGPTとかのAIも発達してきて、趣味なら本当に大体一人で完結する。
もちろん、二次情報やAI情報は信頼と分かりやすさのトレードオフ関係にあるので注意。
どっちにしろ素晴らしいね。
底が見えないこと
私の友達はゲームに飽きるとき「底が見えた」とよく口にする。
何かに飽きる、興味がなくなる時は「底が見えた」時だ。
でも、プログラミング、作曲、絵描きなどの何かを作る系は底が見えにくい。
底が見えなさ過ぎて辛いときもあるけど、プログラミングとかは底が見えなくても小さい目標の旗やそこまでの道は見える事が多いのでよい。
作曲はそこまでの道や目標の旗さえ見えないことが多いので辛い。
誰かの役に立つ可能性があること
こんな素晴らしいプログラミング。
なんと、誰かの役に立つ可能性がある。
知らない人の役に立つかもしれないし、私自身の可能性だってある。
そして、誰かの助けになるということは仕事になるかもしれないということ。
Win-Winというやつ。
改めて、プログラミングは素晴らしいと思う。