初段プログラマ 前編

教育のこと、天下これより偉なるはなし、一人の徳教、広く万人に加わり、一世の化育遠く百世に及ぶ”
嘉納治五郎(道館柔道の創始者)

武道で用いられる色付きの帯の歴史は比較的新しく、19世紀の後半に始まった伝統です。そもそも指導者(先生)が自分と生徒との差別化の為に、白い胴着の上に黒い細布を巻いた非公式な習慣が始まりでした。これが後に嘉納氏により、段位級として形式化されます。当初は黒い布(白帯で胴着を押さえた上に巻かれていた)だったものも黒帯に代わりました。初心者はまず、数字が小さくなっていく級位(もともとは6級から1級まで)を与えられます。上級者になると段位(1段から10段まで)が与えられます。段位を得た人には黒帯を締める権利が与えられ、これは世界中どこに行っても、その道での師であるという証しになります。しかし世間での見方とは違って、黒帯はその競技を完全に極めたという意味ではありません。例えば「初段」は、乱暴に言えば、「新米の達人」というような意味を持ちます。何年も修行し鍛錬することにより到達できるものですが、まだ学ぶべきことはたくさんあるのです。

そのうち白と黒の中間に色付きの帯が導入されるようになりました。黒帯レベルの熟達度に近づいたことを示す茶帯。そして緑帯は素晴らしい進歩を表します。時と共に、白帯の上位は黄帯、緑帯の上位は青または紫帯との認識が浸透してきました。標準とまでは言えませんが、大体のところ帯の色は一般に次のように理解されています。

  • 白帯:初心者。
  • 黄帯:初級者。
  • 緑帯:中級者の上位。
  • 紫帯:上級者
  • 茶帯: 上級者。「先輩」として認められる資質を持つ。
  • 黒帯: 熟達者。「(先生)」として認められる資質を持つ。

こういう色付きの帯による位の分けかたは武道にとっていいことなのか、多くの議論が交わされています。武道というのは本来「道」であるので、単に力の優位性というより、知識と熟練の完成度が真価として問われます。柔道8段が意味するのは、最も強い格闘家ということではないのです。大抵その域に達する頃には60代になっていますし、手強いとは言ってもオリンピックで勝てるということとは意味が違います。そこは重要なポイントではないのです。帯の色は格闘家としてだけではなく、指導者としての資質をも表します。そのレベルになると、知識やコミュニティへの貢献や尽力も昇段の基準として考慮されます。

さて、定期的にスケジュールされている私たちのプログラミングへと戻りましょう。(しゃれが入っています)

色付きの帯(純粋に概念として)はプログラム開発においても使えるでしょうか。このような思いつきは馬鹿げていますよね。でもソフトウェアエンジニア向けの段位級を定義するにはどうしたらいいでしょう。そうですね、私自身は自分のプログラム開発の能力レベルを、1.8くらいで1級(1級は茶帯)かな、と自負しています。一般的なペースでいくと1.8から2.0(初段)に到達するのには4年から6年くらいかかると思いますが、私はあと2、3年でそこまで到達できたらいいなと思っています。まあどうなるか分かりませんが。プログラマの経験則を評価するための、計測可能で普遍的に応用できる方法はあるのでしょうか。正直私にも分かりません。

プログラマを評価するのに私が開発した0.0から3.0の尺度を次にまとめ、重要な点を説明したいと思います。

  • レベル1は実際の業務に役立つ価値を生み出す、足し算的レベルで貢献する人です。レベル2になると掛け算的レベルかつ基盤的な能力を持ちます。レベル3となると世界規模での活躍、さらなる乗数効果を生み出します。例を挙げると、Lispは”凡人”プログラマにも掛け算的な能力を使えるよう設計されたような言語です。Lisp的な言語は過激にパワフルなので経営者に恐れられています。レベル2のプログラマはLispやHaskellのような言語が大好きですが、レベル3のプログラマになると、このような言語自体を開発してしまいます。

  • X.0は95%の完遂能力を表します(会社レベルで言うと、マネージャが心配しなくてもいいレベル)。言い換えると、1.0のプログラマは目の前の付加的仕事の要求の95%を満たすことができます。ここでの推定は信頼性がロジスティク関数の”S字型カーブ”になっているということです。つまり自分の能力より1.0高いレベルの仕事の場合は要求の5%しか満たせず、0.5上のレベルでは50%、同一のレベルでは95%という風になります。ですから私のような1.8レベルのエンジニアがレベル2の仕事をする場合、85%の要求を満たすと見るべきです。おそらく全体的にいい仕事はできるでしょうが、もしそれが社運を賭けた仕事ならば(デザインレビューや信頼度分析などの)指揮監督が多少は必要かもしれません。

  • 1.0は企業が採用する時の最低基準で、2.0は私たちが”10倍プログラマ”と呼ぶレベルです。実際は生産性の違いは非常に幅が広く、スクラッチからの開発においては20倍から100倍の開きがあり、Googleなどの柔軟な環境での仕事であれば3倍から5倍、そうでない環境ならほとんど違いはない場合もあります。

  • 自分でプロのソフトウェアエンジニアだと言う人のうち62%の人が1.0よりは上のレベルです。2.0を超えている人は全体の1パーセントに過ぎず、この域に達するのには10年から20年間の質の高い経験が必要になることが多いでしょう。平均は1.1に過ぎず、1.4のレベルはパーセンタイルで85(上位15%)になります。

  • 多くのソフトウェアエンジニアを二流にとどめている要因は、質の高い仕事に従事する経験が非常に少ないということです。1.5と1.9の間のエンジニアは、能力で言えばマネージャと同等であるはずです。2.0より上は幹部レベル(会社を設立したりつぶしたりできる)です。残念ながら私たちが乗算的な貢献をしようとすると、”実際の”マネージャとの対立をもたらすことがあります。マネージャはその能力が彼らの”専売特許”だと思っているからです。

技術や熟達度の評価にことのほか心を注ぐ武道や囲碁と同様に、プログラミングもスキルの幅が非常に広い分野です。2.0のレベルは明らかに初段1段)の候補です。初段とは何を意味するのでしょう? これは、あなたが優秀であり、かつ初心者であるということです。つまり優秀な初心者です。また大抵の場合、あなたは今、教育する側にいます。でもこれは学ぶことをもう止めてしまったという意味ではありません。実際、相手があなたから学ぶのと同じくらい、あなたが相手から学ぶことも多いでしょう。そう頻繁に公認することはできないでしょうけどね(相手がうぬぼれるといけないですから)。乗算的(レベル2)なプログラミングの貢献とは、基本的に教育に関わるものです。あなたがLispのマクロや、問題に対しての適切な(解決するための)考え方を人に教えるDSLを構築している時、あなたは教師なのです。もしこのように考えられないなら、プログラミングの本質を分かっていないということです。プログラミングは、システムがどのように機能するかを人に教えることであると同時に、コンピュータに指示を出すことでもあるのです。

実際に、0.0から3.0のプログラマの能力レベルと、それに見合った段/級のランクには、だいたい以下のような相関関係があると思います。

  • 0.0~0.4: 8級。始めたばかり。マイナーなコンパイルのエラーにもまだ助けを必要とします。誰かの監督無しではあまり多くのことはできません。
  • 0.5~0.7:7級。プログラミングの裏にある基本的な考え方は理解できていますが、それを実装するにはまだかなり時間がかかります。
  • 0.8~0.9:6級。”専門職レベル”に近づきつつある能力を持ち、誰かの監督下でかなり下級の役割であれば任せられる程度です。平均的なコンピュータサイエンスの学位取得者のレベルがここです。
  • 1.0~1.1:5級。正真正銘の”白帯”。プログラミング単体ではなくエンジニアリングを理解し始めているところです。生産安定性、メンテナンス、コードの質に関することを理解しています。指導がなくても500行以上のプログラムを書くことができます。
  • 1.2~1.3:4級。加算的なプログラミングの案件は常にうまくこなし、大抵の仕事に必要なことは何でも学習できますが、まだリーダーシップや設計のセンスは見られません。能力はありますが、優れたリーダーがいないと効率性に欠けることが多いです。
  • 1.4~1.5:3級。コンピュータサイエンス、美的感覚、プログラミングとエンジニアリングに関すること、そしてそれぞれに生じるトレードオフについて成熟した理解を築いている段階です。関数型プログラミングに入ったか入らないかというレベル(優秀さはドメインに依存し、高パフォーマンスのドメインではまだあまり実務を積んでいない)ですが、関数型プログラミングを用いるべき場面とそうでない場面を微妙な差異を汲んで判断できます。
  • 1.6~1.7:2級。矛盾のない技術的リーダーシップが見られます。管理される部分は少なく、失敗が許され、質の高い乗算的な貢献ができます。これはほぼ全てのエンジニアリング系組織に通用する強みです。ただし卓越した能力を抑えるような組織(例えば従属することを強要し、意図的にエンジニアを無力化させる階級文化の会社など)は例外です。
  • 1.8~1.9:1級。抜きん出た能力があります。ほとんどの時間を乗算型の貢献に費やし、うまくいっています。エンジニアリング部門で影響を持つ、責任者と同等の役割を任さることのあるレベルで、きちんとその役割を果たすことができるでしょう。
  • 2.0~2.1:初段。首尾一貫して質の高い資産を築き上げ、それをどう使うかを人に教えます。資産というのはトランスフォーマティブなソフトウェアエンジニアのことで、彼らは他のエンジニアをより生産的にする(単なる乗算主義)だけでなく、実際にその人たちをより良くする人物です。一人を雇い、自主性を与えて、結果的にその人が会社全体に”10倍”の価値をもたらします。CTO(最高技術責任者)と同等の役割を担うことができるレベルです。
  • 2.2~2.3以上:さらに上の段です。私がまだこのレベルに達していないので正しく言い表すことはできません。Rich Hickey氏は、Clojureの設計という点で少なくとも2.6以上のレベルにいると思います。彼は最高レベルの言語コミュニティを構築しましたし、醜いけれど重要で力強いエコシステム(Java)の上に美しい言語を作り上げていて、この製品のコードの質といったら驚くほど高いのですから(Clojureの中身を知ったら、Javaを嫌う気持ちが吹き飛びますよ。コードがどんなに良いものかが分かります)。しかしながら、彼ららを正確に定義したり、人物像をはっきり捉えるには、私は(現時点では)まだ程遠いレベルにあります。

プログラマとしての習熟度を、定められた級と帯の色で公式に認識する必要はあるでしょうか? いいアイデアだと思いますか? 誰かを”緑帯のエンジニア”だと純粋に評価するような基盤を確立し、その人が紫、茶、黒帯のレベルになるように指導するべきなのでしょうか? 以前の私は、これは良くないアイデアだと考えていました。率直に言ってしまうと、私は履歴書を重要視する文化が大嫌いなのです。それは、肩書きや出身校の名声、または信頼できる人々からの推薦かどうかを比較して判断するものだからです。それに入社や退社の日付など、分散した職場の社会的地位の生存権などありません。私は、自分の履歴書に嘘は書きません。30歳にして26歳あたりの経歴しかなくても(パニック障害やスタートアップ時の選択の失敗、Google時代のまったくもって悪質なマネージャなどの要因がありましたからね)、嘘をつけば得るものよりも失うものが多いように思います。だから嘘は書きません。しかし、このシステムを転覆させることに道徳的な呵責もありませんし、恐ろしい環境の中で、ためらいなく”創造的なキャリア修復”をするよう人々に勧めています。ところで、職業上の偽装(能力があるふりをすること)は受け入れられないもので、非倫理的で、一般的に違法(詐欺)とみなされます。それは違います。私が言っているのはそういうことではありません。社会的地位の誇張です。”日付をごまかして”失業歴を隠したり、肩書きを上げてみたり、経歴照会の間、友人にマネージャーのふりをさせるのですか? 正々堂々と勝負すべきです。基本的に、名声、肩書き、推薦状、日付などは、職場における分散した社会的地位を生み出してしまうと考えています。それは道徳的に間違っていて,法外に高くなり(そのせいでマネージャが部下の人生や、別れた後の人生も台無しにします)、実に邪悪なものです。それを転覆させ、信用性を薄め、徹底的に偽物を破壊するのです。いい表現が思いつきませんが、”サイコーにイケてる”ことです。

私は分散した社会的地位を作り上げてきたもの全てに対して、とてもばかばかしく思っています。このようなアイデアには、理屈抜きでうんざりするのです。プログラマをランク付けすること(私たちがどれだけ評価する力に長けていても、本質的には主観です)は、私には間違っているように思えるので、この概念に心の底から嫌悪を抱いています。また、私はそのような仕事をしたくはありません。それよりも、2.0以上のレベルのプログラミングのスキルを身に付けてから席を立って取り組み、スケーラブルで公正な方法によって個人を評価するやり方を見つけることに数年を費やしたいです。そうですね、機械学習の問題なんかも楽しめるでしょう。でも最終的には、その問題を解決するヒーローは、主に人々の素質に焦点をあてるのです。けれども、私は組織的で独立したソフトウェアエンジニアの階級システムを創造するほかにないと考え始めました。なぜでしょう?私たちが賢明な方法で私たち自身の位置付けをしなければ、バカみたいな企業が割り込んできて、とにかく私たちをランク付けしてしまいます。非常に不愉快な仕事です。私たちはこれが現実だということを知っています。否定できません。日常的に、階級的な仕事の中に見られるものです。

典型的なビジネスマンは、2.0レベルのエンジニアと、自分のアイデアを売るのが上手な1.2レベルのエンジニアとの違いを答えることはできないでしょう。私たちはこの事実についてマネージャによく腹を立てます。地球上において最も政治化されたプロフェッショナルな環境の一つとして、能力主義(やソフトウェア産業)がどうあるべきかという問題に対してもそうしがちです。しかし、私たちの仕事を理解できない無能さを中傷してしまうと、私たちもまぬけの仲間入りです。彼らが私達を管理し、評価するのは、私たちが自分自身を管理し、評価することができないからです。

これは我々で解決する必要がある問題でしょう。プログラミングの黒帯は、どうすれば取得できるのでしょうか? 最も専門的に認定される方法は、商品価値のあるものを次々に生産することです。しかし、最高の条件の下でも2.0以上のレベルの黒帯を取得するには10年ほどかかるので、この方法は使えません。才能を持ち合わせていない人もいます。非常に難しい問題なので、これから取り組んでいくとしましょう。