プログラマの生産性と報酬

追記: 続編を書きました。マッチョとの戦い


最近、プログラマの生産性が話題です。

いろんな意見があるものの、個人的には 10〜100倍の生産性の違いはあると思います。


いや、それは違う、生産性の高いエンジニアは生産性の低いエンジニアに作れないものが作れるのだからそういう話ではない、という意見もあります。

しかし、実際には生産性の低いエンジニアができもしないことをしようとして結局できないで終わるということがあったりしつつも、何らかの貢献をするというのが普通だと思いますので*1、最終的には 10〜100倍の違いといった形に落とし込めると思います。


で、この生産性の違いはどこから来るのか。

個人的には才能だと思っています。


ぼく自身は、自分のことを中間レベルのエンジニアだと認識しています。

平均の 3〜10 倍できて、トップより 3〜10 倍できないくらい。

でも、自分が平均から抜け出るために何かをした覚えもないし、トップになれないのが努力が足りないからだとも思いません。

だいたい、トップの人たちをツイッターで見ても、艦こればっかりやってたりするんですよね。

まあこれは、才能の違いじゃないかと。

構成比で言ったら、中間レベルが 100人に 1人ぐらいで、トップが 1万人に 1人ぐらいといったところじゃないでしょうか。


ところで、プログラマ業界にはひとつの謎があります。

プログラマの生産性と待遇が比例していない」ということです。


これは自分に限らず、ネットですごい人を見ていても思います。

明らかに自分よりすごい人でも、一般と大差ないレベルで働いていたりする。

これはどうしてでしょうか。

普通、3 倍の性能のものは 3 倍の価格がつくのが当たり前なのに、そうなっていないというのは、何かがおかしいはずです。

原因は、主に 3 つがあると思っています。

  • 雇う側がプログラマの能力を判断できない
  • 雇う側に技術的負債という概念がない
  • プログラマは環境を重視する

それぞれについて、以下で述べます。

雇う側がプログラマの能力を判断できない

そもそも、雇う側がプログラミングに詳しくなくて、プログラマに生産性の違いがあるということすら知らない、あるいは知っていても測る能力がないというような場合です。

これが全体の 9割ぐらいを占めるでしょうね。

雇う側に技術的負債という概念がない

よく言われるように、技術的負債というものは長期的な生産性に影響します。

変化を恐れてチャレンジをせず、リファクタリングなんて論外、古いコードに残ったフラグを除去することすらしないようなプログラマはだんだんと負債を蓄積していくのに、その行為の影響はコードベース全体なので、汚染後は全員の生産性が下がることになり、当人ひとりの生産性の低さとして表れにくい、という現象です。

プログラマは環境を重視する

次のような二つの職場があったとしたら、優秀なプログラマの大部分は前者を選ぶのではないでしょうか。


1. テスト・CI をきちんとやっていて、ソースコード管理は Git & GitHub、もちろんデプロイもほぼ自動化されていて、過去のバージョンに戻すことも簡単にできるため実験がやりやすい。リファクタリングの価値が認識されている。タスク管理ツールや連絡ツールも新しいものを積極的に採用している。権威的な人間がおらず、設計やコードの良し悪しを率直に話し合える。年収 400万。

2. テストもろくにない Java のコードを手元の Eclipseコンパイルして、その .class ファイルを WinSCP でコピーしてデプロイしている。バージョン管理システムはろくに活用されておらず、間違えたらおしまいなので PukiWiki の手順書に「〜を厳守する」という心構えが出てくる。ファイルを zip で固めて IP メッセンジャーで送って「コードレビュー」をしている。先輩・後輩の序列がはっきりしていて、偉い人のコードレビューはすぐ通るのに新入りは重箱の隅をつつかれる。リファクタリングは危険なので論外で、jQuery 1.4 などの古いライブラリを使っている(「jQuery のバージョンを上げたらよくわからないエラーが出た」という伝説があって、それ以降バージョンを上げることがタブーになっていたりする)。もちろんコスト感もないので、拡張forは当然禁止で、偉い先輩がそのことを偉そうに教えてくる。年収 1000万。


ちょっと例が抽象的すぎるかもしれませんが、これで後者を選ぶ優秀な人というのはまずいないでしょうね。

(実際には後者のような環境で年収も低いのに我慢しているような人もいますが、よっぽど人間的にゴミなのでしょう)




ここまでの話でわかるように、プログラマの生産性を判断する能力があり、技術的負債という概念を理解していて、プログラマが気持ちよく働ける環境さえ整えられたら、たいしてお金を出さないでも優秀なプログラマを集められるわけです。*2

会社のほうに、1万人にひとりのトップ層をある程度まとめて確保したいという動機でもあれば、金銭的にもかなり恵まれた条件を用意するかもしれませんが、そうでなければそうする理由はありません。


ここで問題になるのが、プログラマ結婚・子育てです。

プログラマには年功序列なんてなく実力社会なので、子持ちプログラマも独身プログラマと同じ土俵で戦う必要があります。

1万人にひとりのトップ層以外が「子供がいて生活費がかかるから給料を多めにほしい」と言っても、目端の利く会社であれば、労働環境を整えることで簡単に 100人に 1人の独身プログラマを集め放題だということがわかっているので、独身プログラマ以上の給与水準にする理由がありません。

そういうわけで、一般プログラマの給料は独身プログラマが普通に生活できるレベルに貼りついてしまい、それ以上なかなか上がりません。


じゃあどうするか。

「1万人にひとりレベルの人材でなければ、プログラマは子供を持ってはいけない」というのが、現状での自分の答えです。

でも、それでは社会が維持できないですよね。

そこで、一般プログラマの妻がゲイツの子供を産めるシステムを作るべきなんじゃないかと思うんですが、どうでしょうか。

*1:もちろん、技術的負債のほうが大きくて生産性がマイナスということもあると思いますが、そこまで考えると複雑になるので省きます。

*2:プログラマが気持ちよく働ける環境のバリエーションとしては、在宅勤務というものもあります。