プログラマーがコンパイルしているのはコードじゃなく人間
昨今、プログラミング教育が盛んに行われています。
義務教育にプログラミングが導入されたり、システム(ソフトウェア)エンジニアになるためのプログラミングスクールが乱立しています。
私自身はプログラミング教育には懐疑的な立場(というか、教育という概念自体が懐疑的)なんですが、その理屈を言語化できたので(というかタイトルが全てですが)、今回はその内容を綴っていきます。
学校やスクールで具体的にどのような教育を施しているのかは知りませんが、その目的は被教育者がプログラムを書けるようになることだと思います。
いや、義務教育においては論理的思考能力を養う云々だったような気がしますが、まぁ論理的思考能力とプログラミングは数学的には同じようなものなので、あまり気にしないことにします。
プログラムを扱えるようになったらどうなるのかというと、プログラマーになれます。
人や文脈によってはコーダーやらエンジニアやら色々呼び名はありますが、プログラムを取り扱うという意味でここではプログラマーと表現します。
プログラムができるようになってフリーランスのエンジニアとやらになれば年収一千万も夢じゃないらしいです。
私もそれぐらい欲しいですね。
それはさておき、部外者がプログラマーと聞いて思い浮かべる仕事内容はずばり、プログラムを書くことだと思います。
実際にプログラマーはプログラムを書きます。
それは間違いないです。
しかし、しかしです。
長年プログラムを書く仕事をやってきた自分としては、プログラミングの仕事の本質はプログラミングではなく、他人(もしくはチーム・組織、会社、社会)の脳内活動の統一化及び言語化にあるのではないかと考えています。
そもそもプログラミングなんてものはプログラムを書けばいいだけの話で、何も恐れずに言うのなら誰にでもできる作業なのです。(実際、小学生でも書こうと思えばそれなりに書けます)
私自身も、最近はプログラムを考えるのがめんどくさくて、すぐChatGPTにコーディングを丸投げしてしまいます。
しかしながら、仕事として行うプログラミングとなると、そうは問屋が卸しません。
今まで業界の中の様々な戦場を渡り歩いてきましたが、数多の挫折者を横目にしてきましたし、自分自身も何度も躓いて挫折しそうになりました。
そう、プログラムが書けるからといって、簡単にプログラマーとしてずっと働き続けられるわけではないのです。
では、プログラムが書けるのにプログラマーの仕事が難しい理由はどこにあるのか。
それが先ほど書いた通り、プログラマーがする本質的な仕事はプログラミングではなく、自分以外の脳みそから生成された思考や概念を現実のロジックに落とし込むことなのです。
答えが決まっている問題であれば、それをコードに落とし込むのは容易いでしょう。
また、自分一人で完結するならば自分の頭の中をコードに書き下すだけでいいのですから、まだ難易度は低い方です。
ですが、他人の脳みそから発生したものであれば、それを自分が解釈できるように翻訳しなければならないですし、それが本当に実現できるロジックなのか確認しないといけませんし、さらにそれが無理なら、できるように無理やり捻じ曲げなければなりません。
さらにさらに、他人一人だけではなく、それがチーム、組織、会社、と関わる人が増えれば増えるほど、全体として認識を統一しなければいけませんし、それを全て統合したものを現実のロジックに落とし込まなければなりません。
これが競技プログラミングと仕事で行うプログラミングが全然別物である理由でもあります。
昔、言語化は思考のコンパイルで書きましたが、自分自身の思考を言語化するのも意外と難易度の高い行為(先ほど難易度が低いと書いちゃいましたが)なのです。
自分自身だけでも難しいのに、それが他人になり、さらに複数人に及んでくると、その難易度は指数関数的に上がっていきます。
SEの人が病みやすかったり、たいていの大規模プロジェクトが炎上してしまうのもこのためです。
えてして人の発言は、主語が欠けていたり、コンテキストが考慮されていなかったり、そもそも適切に言語化されているかもあやふやなので、それを自分が解釈・実装できるようになるまで徹底的に言語化しないといけません。
言語化されていなければプログラムに落とし込むこともできません。
でも実際は、ほとんどの人は客観的な言語に落とし込む作業をサボり、オレオレ解釈を駆使して無理やりコードを仕上げます。
そして、いざ出来上がったプログラムを動かすと他の人から「自分が求めていたものと違う!」となりプロジェクトは無事炎上します。
他人の脳内、ひいては集団の脳内を適切な実行形式にコンパイル・リンクするのは至難の業なのです。
昔、初代PSのリッジレーサーのプログラマーの人がプログラムの息抜きに別のプログラムを書いていると聞いて「いや、他に息抜きの方法あるだろ」と思っていましたが、大人になった当の自分が全く同じことをしています。(このブログもそう)
一見、気狂いじみた行動と思えてしまいますが、ここまで説明したことを踏まえれば、それが息抜きになることは自明です。
仕事では自分の脳外の世界を、自分の脳外の世界の人たちが納得するようなコーディングをしないといけませんが、息抜きで書くコーディングは決められた問題を解くだけだったり、自分の脳内をコードに落とし込むだけで結果も問われないので、全く別行為となるのです。
ソースコードのコンパイルはコンパイラに任せて、仕事人としてのプログラマーは人間(たち)をコンパイル・リンクして仕事の成果をビルドする必要があります。
Ruby on Railsの作者であるDHHが「採用で悩んだら文章力が高い人間を雇え」といっている本質もここにあって、仕事においてプログラムがどれだけ書けるかはあまり重要ではなく、人間(たち)をコンパイル(適切に言語化)してリンク(認識を統一)してビルド(システムを構築)する能力が真にプログラマーに求められる能力なのです。
Tag: プログラミング