Diplomatic Coding

政治的ということばは曖昧すぎるので嫌いだが、外交的なコードってあるよな。WebKit の仕事をしていたころは毎日そんなのばかりだった。また最近書く羽目になってうんざり。

外交的なコードとは他人の主張にあわせて書くコードのことである。他人のコードにあわせる、では無い点に注意。他人の書いたダサい API に自分にコードを合わせるのは、ここでは外交的に数えない。それを言い出すと一人で閉じないすべてのコードが外交的になってしまう。コードレベルの enforcement ではなく、ミーティングとかで書くことが決まってしまった望ましくないコードを指すことにしておく。

外交的なコードにはいくつかの段階がある。

一番ダメージが少ない外交的コーディングは他人のために自分がコードを書いてあげる、仕事をひきとるケース。仕事は増えるが後腐れはない。

一番ダメージがでかいのは他人の意見によってソフトウェアのデザインが歪められるケース。なおここでいう他人は該当ソフトウェアを書いているチームの外の人という意味で、チームメイトは含まない。チームメイトとデザインの方針が合わず好みのコードを書けないこともあるが、外交よりチームワークの範疇。

他人の「都合」によってコードがダサくなるのは外交的な問題か?他人の都合、たとえばレガシーコードとのつなぎ込み、は解くべき問題の一部だと思うので、外交には数えたくない。外交的コードとは、よりよい解決策があると自分は考えているのに、相手の顔をたてるなどソフトウェアの外の事情で自分のアイデアをひっこめて他人の主張を受け入れるもの。

この間くらいにあるのが、相手の意見によって優先度が変わるケース。それ次のリリースでいいじゃんという作業を、いや早くやるべきなぜなら俺がそう思うから、みたいに押し付けられる。締め切りまで時間がないので corner cutting がおこり、デザインが歪む。


外交的コーディングの必要性は外交それ自体とおなじくはっきりしない: 外交というものの必要性は認めるが、個々の外交的アクションを評価するのは難しい。

外交的コーディングには仕事が増える以外に固有の問題がある。

まずソフトウェアデザインの autonomy が奪われる。Autonomy は人々の労働意欲の核の一つである(って Daniel Pink が言ってた・・・と書くと急に説得力なくなる。)要するに仕事のやり方を指図されるのはムカつく。デザイン全体の integrity も損なわれる。

つぎ。外交的コーディングは rationale を記録するのが難しい。「あのめんどくさい人のいうことに従ったのだよ」なんて design doc や commit log  に書けないじゃん。結果として説得力のないデザインだけが残り、後世の人々は puzzled する。そして書いた人を blame する。俺のせいじゃねえーーと言い返したいが証拠がない。

外交的介入をうけたのがデザインそのものではなく優先度だと事態は殊更不透明になる。たしかにそのデザインを考えたのは我々だが締め切りが無茶だったのだよ・・・みたいな主張は、外交的に作られた一時的で人工的な締め切りの存在を明らかにしてしまうので大っぴらに語りにくく、風化しがち。俺のせいじゃねえーーー!

同様の理由により、外交的コーディングは議論するのも難しい。外交的妥協をしたマネージャはしばしば下々のプログラマから意思決定に噛みつかれる。「偉い人を宥めるためなのだよ」と開き直れるかはマネージャの性格次第でもあるが、外交の性質上単純な honesty が望ましいとも限らない。無理に取り繕って株を下げがち。外交に負けて株が下がるのは仕方ないとして、「外交に弱い」ではなく「話がわからん」とラベルをつけられてしまうマネージャは気の毒。

外交的譲歩は良くないことに思えてくるが、ならばとタカ派になるとそれはそれでどこかの大統領みたいになってしまう。よりよい提案は: きわどい外交的立場にならないよう普段から気をつけましょう。より長期的には外交的露出の少ない立場につきましょう。