MySQL では unique key が NULL を無視する

MySQL では unique key を指定していても NULL があると無視されるようだ。

たとえば次のテーブルでは、name と deleted_at の組に unique key を指定している。

create table test1(
  id         integer        primary key auto_increment,
  name       varchar(100)   not null,
  deleted_at datetime,
  unique key (name, deleted_at)
);

なのに、同じ値の組み合わせを入れてもエラーにならない。

mysql> insert into test1 values(null, 'aaa', null);
mysql> insert into test1 values(null, 'aaa', null);
mysql> insert into test1 values(null, 'aaa', null);
mysql> select * from test1;
+----+------+------------+
| id | name | deleted_at |
+----+------+------------+
|  1 | aaa  | NULL       | 
|  2 | aaa  | NULL       | 
|  3 | aaa  | NULL       | 
+----+------+------------+

まじっすかー。勘弁してくださいよ MySQL さん。unique key の意味ないじゃん。
#これって標準的なSQLの仕様なんかな。

従来のソフトウェア工学が決定的に間違っている点

従来のソフトウェア工学は、属人性を排除して開発者の能力を均一化しようとしている。この点に置いて、従来のソフトウェア工学は決定的に間違っている。

ソフトウェア開発では、個人の生産性は上と下とで 30 倍違うと言われる。これが本当だと仮定したら、これだけ差がでるものを均一化なんてできるわけない (したところで間違った結論しかでない) んだから、属人性を排除することは大きな誤りである。

仕事が高度になればなるほど、属人性は排除できないし、人材の替えはきかない。問題を解決できない人間を100人集めても、問題は解決できない。問題を解決できるのは、問題を解決できる能力を持った人間だけ。頭の悪い大人100人より、すごく頭のいい小学生1人のほうが、成果物が出る。ソフトウェア開発はそういう類いの仕事。

よく、ソフトウェア開発を工場での作業に例える人がいるけど、これも「属人性を排除できる」という勘違いからもたらされているのではないだろうか。属人性を排除して能力を均一化できると考えているから、工場での作業に例えてしまうのだろう。そうではなく、属人性は排除できないという立場に立てば、もっと違ったモデルに例えるべきだとわかる。

たとえば水泳の「チーム北島」に例えるのはどうか。チーム北島では、北島選手のためだけにコーチや栄養士など何人ものスタッフがチームとしてサポートしている。あるいは売れっ子マンガ家とそのアシスタントでもいい。どちらも、たった一人の秀でた才能のためだけに何人ものスタッフがサポートしている。

ソフトウェア開発も同じような体制にしたほうがいいのではないか。生産性が 30 倍違うのであれば、バカプログラマー 30 人を雇うより、スーパープログラマー 1 人にサポートスタッフ 5 人つけたほうが安くていいものができるだろう。Ruby の開発でいえば、まつもとさんやささだ先生にサポートスタッフ (あるいは秘書とか内弟子とか) をつけて、極力彼らが雑用をせずに Ruby 開発に専念できるような環境を整えるべきではなかったか。少なくとも、大きなリリースを控えている忙しいはずの時に、主要開発者の方たちが壊れた Visor の替えを買いに走ったりとか、「雑用が多すぎて…」と愚痴ってるような状況は間違いだといえる。

属人性が重要だとすると、ソフトウェア開発が個人に依存することになるのでそれはよくないと考える人がいるかもしれないが、そもそも高度な仕事というのは個人に依存するしかなのだ。なぜなら、個人に依存せずにできるような仕事は高度でないからだ。特にソフトウェア開発では高度でない仕事は自動化しやすいので、自動化できないような高度な仕事しか残りにくい。

別にソフトウェア開発に限らず、どの分野でも高度な仕事は個人に大きく依存する。経営だってそうだろ? Steve Jobs がいなくなれば Apple は緩やかに衰退していくだろう。実際、井深氏と盛田氏が亡くなったあとのソニーは緩やかに衰退していき、今の惨状はみなさんご存知の通りだ。今は絶好調の任天堂だって、もし宮本茂氏や岩田聡社長がいなくなることになればどうなるかわからない。個人に強く依存するリスクを嫌うなら、属人性を排除するのではなく別の方法、たとえば同じような個人を育てたり見つけ出すことを考えるべきであるが、それは長くなるのでまた別の機会にしたい。

最後にもう一度。高度な仕事になるほど個人に依存するのは避けられないし、属人性を排除すべきではない。属人性を排除して各人の能力を均一化して扱おうとしたソフトウェア工学は根本的に間違っている。