プログラマーがコンパイルしているのはコードじゃなく人間
昨今、プログラミング教育が盛んに行われています。
義務教育にプログラミングが導入されたり、システム(ソフトウェア)エンジニアになるためのプログラミングスクールが乱立しています。
私自身はプログラミング教育には懐疑的な立場(というか、教育という概念自体が懐疑的)なんですが、その理屈を言語化できたので(というかタイトルが全てですが)、今回はその内容を綴っていきます。
学校やスクールで具体的にどのような教育を施しているのかは知りませんが、その目的は被教育者がプログラムを書けるようになることだと思います。
いや、義務教育においては論理的思考能力を養う云々だったような気がしますが、まぁ論理的思考能力とプログラミングは数学的には同じようなものなので、あまり気にしないことにします。
プログラムを扱えるようになったらどうなるのかというと、プログラマーになれます。
人や文脈によってはコーダーやらエンジニアやら色々呼び名はありますが、プログラムを取り扱うという意味でここではプログラマーと表現します。
プログラムができるようになってフリーランスのエンジニアとやらになれば年収一千万も夢じゃないらしいです。
私もそれぐらい欲しいですね。
それはさておき、部外者がプログラマーと聞いて思い浮かべる仕事内容はずばり、プログラムを書くことだと思います。
実際にプログラマーはプログラムを書きます。
それは間違いないです。
しかし、しかしです。
長年プログラムを書く仕事をやってきた自分としては、プログラミングの仕事の本質はプログラミングではなく、他人(もしくはチーム・組織、会社、社会)の脳内活動の統一化及び言語化にあるのではないかと考えています。
そもそもプログラミングなんてものはプログラムを書けばいいだけの話で、何も恐れずに言うのなら誰にでもできる作業なのです。(実際、小学生でも書こうと思えばそれなりに書けます)
私自身も、最近はプログラムを考えるのがめんどくさくて、すぐChatGPTにコーディングを丸投げしてしまいます。
しかしながら、仕事として行うプログラミングとなると、そうは問屋が卸しません。
今まで業界の中の様々な戦場を渡り歩いてきましたが、数多の挫折者を横目にしてきましたし、自分自身も何度も躓いて挫折しそうになりました。
そう、プログラムが書けるからといって、簡単にプログラマーとしてずっと働き続けられるわけではないのです。
では、プログラムが書けるのにプログラマーの仕事が難しい理由はどこにあるのか。
それが先ほど書いた通り、プログラマーがする本質的な仕事はプログラミングではなく、自分以外の脳みそから生成された思考や概念を現実のロジックに落とし込むことなのです。
答えが決まっている問題であれば、それをコードに落とし込むのは容易いでしょう。
また、自分一人で完結するならば自分の頭の中をコードに書き下すだけでいいのですから、まだ難易度は低い方です。
ですが、他人の脳みそから発生したものであれば、それを自分が解釈できるように翻訳しなければならないですし、それが本当に実現できるロジックなのか確認しないといけませんし、さらにそれが無理なら、できるように無理やり捻じ曲げなければなりません。
さらにさらに、他人一人だけではなく、それがチーム、組織、会社、と関わる人が増えれば増えるほど、全体として認識を統一しなければいけませんし、それを全て統合したものを現実のロジックに落とし込まなければなりません。
これが競技プログラミングと仕事で行うプログラミングが全然別物である理由でもあります。
昔、言語化は思考のコンパイルで書きましたが、自分自身の思考を言語化するのも意外と難易度の高い行為(先ほど難易度が低いと書いちゃいましたが)なのです。
自分自身だけでも難しいのに、それが他人になり、さらに複数人に及んでくると、その難易度は指数関数的に上がっていきます。
SEの人が病みやすかったり、たいていの大規模プロジェクトが炎上してしまうのもこのためです。
えてして人の発言は、主語が欠けていたり、コンテキストが考慮されていなかったり、そもそも適切に言語化されているかもあやふやなので、それを自分が解釈・実装できるようになるまで徹底的に言語化しないといけません。
言語化されていなければプログラムに落とし込むこともできません。
でも実際は、ほとんどの人は客観的な言語に落とし込む作業をサボり、オレオレ解釈を駆使して無理やりコードを仕上げます。
そして、いざ出来上がったプログラムを動かすと他の人から「自分が求めていたものと違う!」となりプロジェクトは無事炎上します。
他人の脳内、ひいては集団の脳内を適切な実行形式にコンパイル・リンクするのは至難の業なのです。
昔、初代PSのリッジレーサーのプログラマーの人がプログラムの息抜きに別のプログラムを書いていると聞いて「いや、他に息抜きの方法あるだろ」と思っていましたが、大人になった当の自分が全く同じことをしています。(このブログもそう)
一見、気狂いじみた行動と思えてしまいますが、ここまで説明したことを踏まえれば、それが息抜きになることは自明です。
仕事では自分の脳外の世界を、自分の脳外の世界の人たちが納得するようなコーディングをしないといけませんが、息抜きで書くコーディングは決められた問題を解くだけだったり、自分の脳内をコードに落とし込むだけで結果も問われないので、全く別行為となるのです。
ソースコードのコンパイルはコンパイラに任せて、仕事人としてのプログラマーは人間(たち)をコンパイル・リンクして仕事の成果をビルドする必要があります。
Ruby on Railsの作者であるDHHが「採用で悩んだら文章力が高い人間を雇え」といっている本質もここにあって、仕事においてプログラムがどれだけ書けるかはあまり重要ではなく、人間(たち)をコンパイル(適切に言語化)してリンク(認識を統一)してビルド(システムを構築)する能力が真にプログラマーに求められる能力なのです。
Tag: プログラミング
疑問の言語化には前提知識が必要
「分からない事があったらなんでも聞いて下さい」や「他に何か質問はありますか?」と言われて、その場では特に聞く事が思い浮かばなくて「でも後で疑問が沸いた時に改めて聞くのめんどくさそう」と思った経験はないでしょうか?
今回は、語彙知識とそれにまつわる文脈(コンテキスト)が一定ラインまで消化吸収できていない人に分からないことを聞いてはいけないよ、という話をします。
そもそも本当に聞く必要があると思えば、相手から催促されなくても、その時点でこちらから質問を投げかけるはずです。
疑問が思い浮かばなかったということはすなわち疑問が思い浮かばなかったということなのです。(進次郎構文)
しかし、諸行は無常です。
人の持つ知識や情報は常にアップデートされ続けていくものです。
その過程で、ある情報とある情報がかけ合わさったタイミングで情報の齟齬や欠損を認識する事ができ、そこで初めて疑問が生まれるのです。
把握している情報量が少なすぎる時点では、大まかな全体像も分からなければ情報同士の関係性も分かりません。
自分が何も分からないことは分かりますが、それ以上のことは分かりません。
情報の齟齬や欠損を認識するのにも、ある一定量の前提知識が必要となるのです。
ですので、あらゆる知識の吸収や理解は、段階を踏んで徐々に徐々に行なっていくべきものなのです。
小一の子供にいきなり微分方程式を教えても、一部のギフテッドを除けば誰も理解できないことは皆さん想像できると思います。
足し算をやって、引き算をやって、九九を覚えて掛け算をやって、割り算をやって・・・・と段階的に知識を積み上げていった先に微分方程式があるのです。
100をまとめて伝えて、その100が丸ごとそのまま相手に理解されることはありません。
まず1から始まり、2、3、4・・・・と一つ一つ積み重ねていった先に100があるのです。
4の人にいきなり78を伝えても相手はそれを受け入れる土台がまだできていないのです。
算数の例えだけだとアレなので、国語と社会でも例えましょう。
言葉を覚え始めた幼児に対して「おお、うちの子が喋れるようになったぞ。じゃあ、パパはアメリカの政治思想に詳しいから、アメリカの政治思想で疑問があればなんでも聞いてごらん」と言ったとしましょう。
それを聞いた100人中1000人ぐらいの人が「このお父さんはバカなのかな?」と思うことでしょう。
「パパ・・ママ・・」ぐらいの発声ができ始めた子供は、言葉を喋ったとしても、その意味を理解するのはまだ先の話です。
さらに他の語彙を習得していくのはもっともっと先の話です。
なんだったらその辺の道に歩いている大人に「アメリカの政治思想で疑問があればなんでも聞いて下さい」とインタビューしたとしても、ほとんどの人は何も疑問や質問など思い浮かばないでしょう。(というかほとんどの人はそんなことに興味がないからどうでもいい)
なんとかそれっぽい質問をひねくり出せても「そもそも民主党と共和党は何が違うんですか?」ぐらいだと思います。
それですら、アメリカは2大政党制(two party system)であり、それぞれの政党が共和党と民主党である、と知っていなければいけません。
そもそもアメリカ政治思想にそれなりに詳しいレベルの人間であれば、疑問に思って知りたいと思ったことは自分で勝手に調べるはずです。
このように、相手から疑問や質問を引き出したいのであれば、相手にそれ相応の知識と関心が宿っている必要があるのです。
今回はさらに奮発して図画工作でも例えましょう。
次の図を見て下さい。
これは以前、無知の知を説明する時に使った図です。
知識が増えるほど、自分が分からない事を認識できる量が増えることが分かります。
ちなみに、知識量の少ない子供はなんでも疑問を口にして、知識量が多い大人はあまり疑問を口にしないので「逆なのでは?」と思うかもしれません。
これは、子供は大人よりも知識量が少ないので一つ一つ湧いて出てくる疑問を逐次解決しようとしていけますが、大人になると人間社会が抱えている情報量があまりにも多すぎることを認識するので、いちいちそれらに疑問を持って解決しようなどとは思えなくなるからです。
スマホでゲームが動いている仕組みを物理から通信まで全てを完璧に理解しようとするだけで人生が終わってしまいます。
そういった意味でも知識量が増えると分からない事を認識できる量は増えるのです。
それを踏まえて、次の図を見て下さい。
ベテランの人は仕事や業務について当然たくさんの知識を持っています。
入りたての人は担当する業務に対して知識を吸収していっている段階です。
この時点でベテランの人が「分からない事があったらなんでも聞いて下さい」と言ったところで新入りの人が疑問を認識できるのは青い点だけです。
赤い点に辿り着くためには、もっと前提知識を増やして円を大きくしないと、それについて質問することはできないのです。
先ほどの喋り始めの幼児の話で再度例えると、両親に対して「パパ?」「ママ?」と確認はできますが、そこからアメリカの政治思想に辿り着くためには、人間という概念を知り、国という概念を知り、政治という概念を知り、思想という概念を知り・・・・とさまざまな知識を知った上ではじめて「共和党とは何か?」と問えるのです。
マイクロマネジメントおじさん vs ドキュメントおじさんでも書きましたが「分からない事があったらなんでも聞いて下さい」という状況が発生している時点で、自分から非効率を認めているようなものです。
「分からない事があったらなんでも聞いて下さい」は優しさではなくただの怠慢です。
昨今流行りの心理的安全性では、気軽に誰にでもなんでも聞きやすい職場環境が理想となっていますが、自分はそれはちょっと違うと考えています。
今までで書いてきた通り、あるレベルの疑問を認識するにはそのレベルまで達する必要があります。
そして逐一湧いてくる疑問をいちいち人に聞かなければいけないということは、成長をフォローしてくれる受け入れ側の体制が整備されていないということなのです。
先ほどの図で、仮に新入りの人が赤い点の部分を全て人から聞いて吸収しないといけないのだとすれば、新入りの人は「結局全部人に聞いちゃったし、自分の理解力が低いのかな…」となってエンジニアあるあるの「みんなはすごいのになんで自分はダメなんだろう……」となってしまいます。
これが全て適切なオンボーディング環境やドキュメントでフォローできれば、新入りの人も知識の輪がベテランの人と同じ大きさになる頃には「自分もこの現場でやっていけそう」となるのです。
相手の質問をなんでも受け付ける懐の深さよりも、知識の輪を自然に拡張していける環境を整備する方が大事なのです。
物乞いと托鉢
皆さんは托鉢(たくはつ)という言葉をご存知でしょうか?
托鉢とは仏教における修行の一つで、出家者(修行僧)が在家(信者)から生活に必要な最低限の食糧などを乞い、信者に功徳を積ませる行為のことです。
かのお釈迦様も日常的に行っていました。
新宿駅の西口地下でよく見かけるお坊さんが行っているのがそれです。(偽物もいるらしいです)
また、そういった出家し修行を行うお坊さんを難しい言い方で比丘(びく)・比丘尼(びくに)と言います。
そして、托鉢とは別に乞食(こじき)という言葉もあります。
こちらは皆さんご存知だと思います。
乞食と聞くとホームレスやルンペンが道ゆく人たちに物乞いをしているイメージを抱くと思います。
そのイメージから、乞食に対してはかなりマイナスの印象を持っているのではないでしょうか。
乞食も托鉢も語源は同じらしく、どちらも表面上の行為に違いがないように見えます。
ですが、ただ単に物乞いをすることと托鉢は180度違った行為なのです。
何が違うのでしょうか?
物乞いの目的は相手の所有物の奪取ですが、托鉢の目的は相手を救済することなのです。
相手から施しを貰っておきながら何が救済じゃ、救済されとるのはお前やんけ、と思うことでしょう。
物乞いはただ物を乞うているだけなので、乞う対象は無分別です(厳密にはある程度「コイツだったらイケそう」みたいな判断はしていると思いますが)。
しかし、物乞いと違って托鉢は互いに同じ宗教観を所有しているという前提があります。
そもそも托鉢をしている時は自分から相手に何かを求めることはないですし、自分から乞いに行く時も相手は在家です。
施す方は施すことにより功徳を積めるし、リクエストをすれば比丘から説法を聴くこともできます。
比丘から在家に対する布教や説法の存在を前提とすれば、乞食と托鉢の違いは学生と教授で例える事ができます。
乞食は知識を求める学生のようなもので、生活(将来)のために知識(物乞い)を必要としています。
托鉢は教授に似ており、知識を共有すること(説法)で学生からの尊敬や支援(学費)を受けます。
このように托鉢は、在家側は在家側で功徳が積めるし、比丘(出家側)も必要最低限で生活を営むことができ、厭離(おんり/えんり)の実践が捗り、互いにWinWinな関係を築くことができます。
乞食はただの独りよがりな依存ですが、托鉢は共生を前提とした相互依存の関係なのです。
そんな托鉢ですが、実は同じような関係性を現代社会でもしばしば観測することができます。
その最たるものは推し活です。
ファンが自分の推しのグッズを揃えたり、スパチャで投げ銭する様は、まさに比丘の鉢に布施を与える信者と被ります。
推しはファンに支えられるし、ファンも推しを支えることで精神的に満たされます。
推しは「いつも応援ありがと」と言って多少のファンサはするものの、ほとんどは自分の仕事(クリエイティブ)に打ち込んでいるだけです。
推し活を行うファン個別に対して、何かをすることはほとんどありません。
それでも、ファン側は熱心に自発的に貢いでおり、傍から見ればただ喜捨(きしゃ)しているだけに映ります。
これはグッズやスパチャという施しを通して、徳の代わりに喜びを得ているのです。
野球やサッカー(これもある種の推し活)で選手の名前が入ったタオルを買い求め球場で掲げるのも、神(選手やチーム)との一体感を感じて気分を高揚する事ができるからです。
推し活は、推し毎に宗派と信仰が存在する、いわばマイクロ宗教的なものだと自分は捉えています。
托鉢も推し活も信仰対象が違うだけで、同じ宗教観上にいる者同士の相互依存という関係性においては同じだと思うのです。
そして、比丘や推しは存在しなくても生きていけますが、施した食料やお金は生きていくためには絶対に必要なものです。
その必須なものを人類は長い歴史の中でずっと宗教に捧げ続けています。
それだけ人類と宗教は切ってもきれない関係にあるのです。
全てのエンターテイメントは実は宗教のシノニムに過ぎないのかもしれません。
その場合、エンターテイメントを提供する側は托鉢を受ける側です。
もちろんエンタメ側は乞食のように一方的に金銭を巻き上げたりはしません。
同じ宗教観の人を捉えて、説法の代わりに人々に「人生の楽しみ」を布教しているのです。
そして我々現代人は世に溢れる様々なエンタメに惜しみなく賞賛と賽銭を投じています。
水道やガス、電気、道路、ロジスティクスなどのインフラ、日々の食料、国家運営など実際の人間の生活を支えているのはこちらの方なのに、人々がより感謝をしたり大事だと思ったり、お金を積極的に投じるのはエンタメ側です。
推しを尊いと思うことはあれど、蛇口から出てくる水に対して、コンビニにいつもの商品が並んでいる事実に対して、尊いと思うことはほとんどありません。
施すより施される方が何故か価値が高いし偉いのです。
こう考えていくと、実は托鉢がエンタメの礎を担っていたと言っても過言ではない気がします。
お釈迦様の時代にはエンタメなどは存在しなかったはずです。
その時代に自分の生活を支えているわけでもない比丘や比丘尼に施しを与えていた事実は、比丘や比丘尼が凡夫(ぼんぷ)の精神的な充足感を満たす、エンタメの始祖として存在していたからではないでしょうか。
そして、托鉢が成立していたのはお金の話と同じで、そこに信用があるから貢がれるし、その事実に価値があったからなのです。
Tag: 社会