プログラマーというスキル

(追記)
小飼弾さんも微妙に似たようなこと書いてました。

昔私も書いてました。


いささか旧聞に属することを聞いてしまったので。誰が書いたか、何を書いたかなどということはリンクしません。明らかな間違いを拡散させたくないし。


プログラマーに高学歴エリートが少ないのは理由がいくつかあります。


まず、高学歴エリートの大半は文系です。高学歴エリートになりたがるような要領のいい人はそもそも理系目指しません。理系は「高学歴」とか「エリート」とかに興味がある人が来てメリットのある方面ではありませんから。この時点で、高学歴文系エリートはプログラマーとは縁遠いです。
受験勉強の有無ではありませんし、そこで得た知識とも無関係です。高校までの算数程度の知識で社会で専門家面する人がどこにいますか? あくまで受験勉強は素養のためのものですし、もっと言うと大学の授業レベルでも素養の域を出ません。これが大学院だから、とか、学会だから、とかレベルを上げても状況は変化しません。専門的知識は、それを生かす場がなければ習得できませんし、そもそも習得したかどうか測定することが出来ません。
大学に受かったから習得できたと測定できる? 公務員試験に受かったから測定できる? 就職できたから測定できる?
そんなわけありません。測定は、どうやっても出来ません。出来ないということを認めなければなりません。
そこを認められない人は高学歴エリートになれます。逆に、測定できないことに気づいてしまった人は高学歴エリートという道は選ばないでしょう。というか、「高学歴エリート」の無意味さに気づきながら生き続けるのはよっぽどの馬鹿か、世界に絶望しているのかのどっちかでしょう。馬鹿であることは咎めるべきではありませんし、絶望するのも個人的な行為ですので外からとやかく言うことではありません。


ですが、これだけは言えます。
プログラマーというスキルを持っている人間の大半は、少なくとも馬鹿ではありません。
プログラマーが職業だと思っている時点ですでにおかしいです。プログラマーは職業ではありません。プログラムを組む人間は皆等しくプログラマーです。プログラムを組む能力でお金を稼いでいようと、別の職でお金を稼ぎ、そのためにプログラムを組む能力を応用しようと、能力を使っている限りプログラマーです。SEが、とか、コーダーが、とかSI系の業務をしている人たちの分業区分はこの場合関係ありません。脳内の何か思考形態を記号化することが出来るスキルを持っている人間はプログラマーです。例えそれがコンピュータ相手じゃなくても。
プログラマーには少なくとも「問題領域」と「解決方法」に対する意識があります。この二つを結びつけることが出来る限り、少なくとも馬鹿ではありません。その「解決方法」が妥当なものだとしても、そうじゃないとしても。妥当かどうかは検証すればすぐ判ることなので、妥当じゃなければ別の方法を考えるだけです。


さらに行きましょう。
脳内の思考形態を記号化することに限って言うと、情報工学の世界では可能な限り個人差が出ないように心がけています。この意味では、記憶することによって同じ答えが出るとは言えます。まだ完全には実現されてはいませんが、Pythonなどはこのコンセプトをかなり強く押し進めています(誰が作っても、問題領域が同じなら同じプログラムになるよう細工してある)し、Smalltalkなどのオブジェクト指向言語においては同じ問題領域を「パターン」という形で共有することで思考形態の粒度を大きく、なおかつ個人間の差異が出づらいようにしています。
では、プログラミング言語の文法、パターンを全て記憶し、なおかつそれを正確に使うことが出来るのであれば、答えは一つになるのでしょうか。
答えはYesです。「問題領域」が固定されている限り、一つになります。
では、さらに行きましょう。もしプログラマーに「世界の全人類が領土や貧富の差が無く幸せに暮らせる解決方法を提示しろ」と指示したとします。その場合の答えはどうなるのでしょうか。
当然です。一つに求まります。
プログラマーの人間には理解できないかもしれません。一つに求まるんです。「問題領域」が固定されている限り。例え実現の方法がいくつかあったとしても、それは互換性があります。つまり、書き方はいろいろあったとしてもあるレベルまで抽象化を推し進めると同じ物と見なせる瞬間が来ます。
ではなぜプログラマーは世界平和を実現できないのかと問われるかもしれません。
理由は簡単です。誰も「問題領域」を固定できないからです。問題領域が揺らいでいる限り「解決方法」は複数取り得ます。完全に固定された「問題領域」での「解決方法」であれば記述できます。記述するのは私たちプログラマーにとっては息をするようなものです。いちいち頭を使うようなものではありません。ここを捉えてかつて森昭雄は「プログラマーは思考をしていない」と大変的外れな指摘しました。当たり前です。息をするのにいちいち思考する生物なんかいません。息をするのに思考しなければならないのは、まだまだプログラマーとしてのスキルが足りてないからです。
プログラマーは記述の方法なんかいちいち考えません。記述の方法は武器ですから常に研いでいます。ですが、そこは本質ではありません。記述よりもっと手前「問題領域」をどのように認識して、「解決方法」を提示するのかということにプログラマーは思考を働かせています。「問題領域」は多くの場合一つに求まりません。どんなに厳密に書いたつもりでいたとしてもその解釈が一つに求まることはまずありません。なので、無い部分を補った上で思考をする必要があります。
どこがないのかを検証する方法は残念ながらありません。「ある」ことは証明できますが「ない」ことを証明するのは本質的に不可能だからです。なので、「起こりうるだろう」という想定をした上で思考を進めます。この想定が全ての人間で共通になることは稀です。というか、ほとんどないと言ってもいいでしょう。
なので、プログラマーは考えています。「問題領域」とは何か、それに対する「解決方法」は何か。その上で、最後の最後で記述するところだけは工学的手段で一つに求めることが出来ますが、「問題領域」が異なる以上「解決方法」が同じであるとは限りません。
プログラマーは、考えているのです。記述がプログラムなのではありません。記述はそのための最終手順のうちのさらに一部です。


もう十分説明したのでこれ以上付け加えることはないのですが、反論が来る前に。
「上流工程の人以外は考えなくていい」そんなことはありません。上流工程の人が考えている想定を完全に共有する方法がない以上、「問題領域」は揺らぎます。工学的には「問題領域」を可能な限り固定する方法を模索していますし、実際にその方向で様々な試みが行われていますが、完全にはならないでしょう。
「そんなことを考えているのは一握り」いいえ、違います。思考形態を記述するプログラマーなら全て考えています。考えないでいるように見えるのは考えていることですらも意識していないだけです。記述をするためにはなぜそれをしなければならないのかという部分は最低限考える必要があります。例え定型処理であったとしても。
「じゃあなぜプログラマーは世を席巻してないの?」さあ? そういう世界に誰かがしたいからじゃないんですか? 少なくとも、現在の日本においてプログラマーは使い捨てられ、プログラマーというスキルを持っている人間がそれを直接職として使える人生での時期はごく限られています。偉くなるとプログラマーじゃなくなるなんて話はごろごろしてます。当人が望んでいるようには見えない以上、それ以外の誰かがそういう世界にしたいんじゃないんですか? それを考えるのはそれこそ「高学歴文系エリート」さんの仕事なんじゃないんですか? 「高学歴文系エリート」さんは既得権益のために自分と同属性の人間だけが住みやすい世界に変えるなんてことはもちろんしませんよね?