エンジニアも採用者も文化の棲み分けを意識すべき

## 告知

冬コミ(C91) 2016/12/29 (1日目) 西め18b
東京ラビットハウス
第7開発セクションに居候

車の燃費改善＆70万円のオーディオを1000万円クラスに音質改善＆プロジェクターの映像改善の本出します！！！！！

## 本題

[退職と雇用先の募集について \| fukamachi](http://8arrow.org/job.html)というブログ記事で賛否が巻き起こっている。[はてブ](http://b.hatena.ne.jp/entry/8arrow.org/job.html)を見る限りはPHPを嫌うことに対する嫌悪感が見受けられる。だが、僕はこの人のように自分の好き嫌いをはっきり表明した上で転職活動をするというスタイルを全面的に支持したい。これが標準的になってほしいのだ。

そこで、今回は言語の好き嫌いを初めとしたプログラミングに対する考え方でゾーニングを推奨する記事を書いてみた。

## 好き嫌いというもの

この世には万人に好かれる、嫌われない物というのはどれくらいあるのだろうか？関わる人が増えれば増えるほど、好き嫌いが生じる可能性は増えているはずで、たとえば利用者の多い製品などであれば嫌いな人がいないというのはまず存在しない。誰かに好かれるというのは裏で誰かに嫌われるという事がほとんどだ。プログラミング言語もひとそれぞれ好き嫌いというのはある。

僕はとある言語がとても嫌いだ。僕にそれを語らせたら千の言葉を尽くしてそれへの憎しみをまき散らすことになる (実際にまき散らしてきた)。だが、もちろんこの記事ではその言語にヘイトをまき散らすのが目的ではないのでその言語名は伏せておく。できれば僕を知る人もその言語名については一端忘れてほしい。

さて、好き嫌いというのがあるという事を受け入れた上で考えみてほしい。嫌いな人同士をくっつける事は果たして良いことなのだろうか？好き嫌い、相性、確かにそういうものはあるはずで、言語を嫌いな人に無理強いをするのが果たして良いことなのか？

### あなたがHogeという言語を嫌いだった場合を想像してほしい

たとえば、あなたがHogeという言語を嫌いだったとする。ところがたまたま入った会社ではHogeという言語が使われていた。その時にできる事は果たして何なのだろうか？愛想笑いをして本心でもないのに「Hogeいい言語ですよねー、私もHoge好きです」と言い続けるべきなのだろうか？もし嘘を言い続けても心の平穏がビクともしない人なら、それはきっとあなたはHogeを嫌いでもなんでもないのだろう。「Hogeを嫌いだ」という人はおそらく嘘を突き続ける事でストレスをためてしまうタイプの人だ。皆に当たり前のように使われてるHogeという言語を仕方なく触っていても、あなたはとてもストレスフルなのだ。

それでは心の平穏を守るために「私はHogeは嫌いだ」とヘイトをまき散らすべきなのだろうか？それとも「Hogeを嫌いだが、仕事なので仕方なく触っている」と正直に語るべきなのだろうか？あるいは何も語らず「仕事ですから」とだけ語るクールなのがあなたなのか？

Hogeという言語を嫌いだと思っていても、Hogeが蔓延している職場において心の平穏を保てるかは、周りの人の態度や自分の心のありようによるだろう。だが、あなたがもし嫌いな言語を使っている職場で苦痛を感じそうだ、と思うのであれば、最初からその会社には行くべきではないのではないか。ゾーニングする方がお互いの幸せなのではないのだろうか。

実際に僕が経験したとある職場においては、Hogeはdisられるけど使われるという環境だった。だが、それは皆の心を少しずつでもむしばんでいたのではないだろうか？少なくとも僕の心はがりがりと削られていたし、死にたくなる位その言語が嫌いだったのだ (僕の死にたみについては本論ではないので深くは触れないが、少なくとも通院が必要な鬱という心の病を生じていた)。

### 言語と文化、文化圏

さて、Hogeという言語を嫌いだったとして、それはどういう部分への好き嫌いなのだろうか？細かい部分が嫌いなのだろうか？それとももっと大きな部分なのだろうか？

* 細かい言語仕様の違い (コロンがある無しとか･･･)
* 根本的なプログラミングパラダイムの違い、たとえばOOPと関数型言語。(Scalaのようなハイブリッドもあるが)
* その言語やライブラリを構成する哲学の違い
* その言語の代表的なユーザーに対する好き嫌い

好き嫌いというのはどうしてもあるし、たいていの場合は無理に止めることができるたぐいのモノではないと思っている。たとえば、Python やCoffeeScriptのオフサイドルールなんかは人の好みが極端に出るタイプのものだ。あれを悪と見なす人もいれば、あれがない言語ではコーディングする気になれない人もいる。あるいは、あなたがもしFuncHogeという関数型言語の信者でそれ以外の言語を触りたくないと思っていたとする。もちろんリアルなあなたが関数型言語の信者である必要はない。ここではちょっと想像力を働かしてほしいだけなのだ。副作用が大嫌いで憎しみの対象であるというあなたを想像してみてほしい。

オフサイドルールや副作用についての善し悪しを語る事はしないが、少なくとも人によって意見の分かれるものであるという認識はあなたと僕の共通見解として持っておきたい。異論があるなら是非コメントなどを頂きたい。

あるいは、オフサイドルールの好き嫌いよりも関数型プログラミングへの好き嫌いの方がよりシリアスなはずだ。そういったシリアスな言語特性の違いは、コーディングを完全に別物にしてしまうだろう。FuncHogeを使っている職場のコードレビューであれば副作用のあるコードをコミットしたりすればたちまちコメントがつく。

ここでは実名を挙げて比較していくのだが、ディスる意図は無いことを先に言っておくのだが、たとえばPHPという言語では標準関数において引数の順番には必ずしも統一性が無い。これを嫌う人はとにかく嫌うし、どっちでもいいやんと考える人もいる。くどいようだが、その是非について語るつもりはないのだが、このようにPHPでは言語仕様のレベル、たとえば数字にまつわる型のでたらめさが一番わかりやすいだろうか、テキトウに扱ってテキトウに動く (実際には正しく厳密な動作をするためには並々ならぬ努力が必要だ)。PHP文化圏は「簡単に動く」「初心者にとって簡単な言語である」というような要素を売りとしている。PHPの神であるところのラスマスの考えはPHPの他の部分にも影響は大きい。PHPは極力縛りを与えないし、統一感を重視されにくい。厳密な物を求める人に向いてないライブラリやツールがあふれている。

僕が出会った人の中には「Rubyユーザーが嫌いだから俺はRubyが嫌いなので一切Rubyの話をするな」と言ってる人もいた。プログラミング言語コミュニティに価値を感じている人なんかはとくにそうだろうが、コミュニティに属する人に対する好き嫌いという要素も決して馬鹿にはできない。

僕は、個人の好き嫌いや偏見が寄り集まったものを文化と見なしている。PHPにはPHPの文化があるように思えるし、JavaにはJavaの文化があるように見える。Javaで言えば、Oracleを中心とした強いガバナンスがあるし、ユーザーもエンタープライズ方面が多いという特徴はあるだろう。それは文化を構成している大きな要素だと僕は思っている。他にも、Rubyには昔からRuby-wayという概念がある。日本語で言うなら「Ruby流」とでも言うのだろうか。Rubyっぽいコーディングのやり方がRubyでは推奨されている。GolangはJavaとは正反対のような割り切りによって言語も多くのライブラリも構成されている。

CommonLispを愛する人がPHPを嫌いだったりするのも実によくある話だ。あなた自身がいかなる言語を好きだったり嫌いだったりしても、世の中ではよくある当たり前の話なのだ。

もちろん、PHP文化圏、Java文化圏、Ruby文化圏というのがそれぞれ一枚板なわけではない。PHPのユーザーの中にもさらに細かい文化圏が行くともあるはずだ。ある言語において複数のコーディングスタンダードがあることも珍しくはない。(Golangのようなコードフォーマットが言語レベルで制定されてる事例は例外的だろうか?)

### 嫌いを超えて押しつけるべきなのか？

たとえばある言語、Hogeが当たり前のように使われているとして、その言語を強要することは正しいことなのか？状況によってはそれが正しいこともある。たとえば、こだわりを発揮するべき状況ではない時に一端その言語を使ってもらう、などだ。よくあるのはHogeという言語で書かれたシステムを引き継ぐ必要があるときだ。得てして、それは引き継いだ人のストレスがマッハになるものなのだが、それでも誰かがそのシステムを引き継がなくてはならない。

僕はどうしようもない事情が無い限りは、極力その人が嫌いな言語を押しつけるべきではないと思っている。混ぜるな危険という言葉がある。Hogeを好きな人と嫌いな人を混ぜた場合、全体の仕事効率を下げるし、おそらくムードを悪くするだろうし、押しつけた人が転職して逃げていくリスクが高まるのだ。実際何らかの言語が嫌いで嫌いでしかなくて転職する事例を僕はいくつも聞いている。

長々と書いたが、嫌いなら嫌い、好きなら好きで、それを考慮した上でゾーニングをするというのが全員が幸せになる方法なのだと思っている。たとえばCommonLispが大好きでPHPやJavaが嫌いな人なら、おそらく[さくらインターネットにはいくべきではない](https://twitter.com/kunihirotanaka/status/805940060746981376)し、JavaやPHPをメインで使っている他社にもいくべきではない。当人があらかじめPHPやJavaを嫌いだと言ってるのだから、彼に対してPHPやJavaの人が近づく理由は一つも無いのだ。縁が無かったね、で終わらせるべき話だと僕は思っている。そこにさらにヘイトを重ねてまき散らす行為は問題が多い。

### 属する文化の違い

たとえばSIerとウェブ系では考え方が色々異なる。一部の人たちはそうでもない(混ざり合ってたり別の方の文化を持ち込んだりしている)が、基本的には異なる。SIerで重視するものとウェブ系で重視するものは異なる。

文化の違いを乗り越えられる人とそうじゃない人がいる。かたくなに拒絶する人もいれば、簡単に手のひら返しできる人もいるのだ。だが、言語にまつわるそれと同じように、自分が所属しているコミュニティの考えに縛られる人は多い。

たとえば貴方の職場が文化の違いを許容できる人の集まりなのであれば、きっと言語選択、技術選定、そういったものではきっと苦労しないだろう。ところがたいていの職場は文化の違いを許容できない人が一定数いるものだ。そういう人たちによって混ぜるな危険問題が生じるのだ。

ならば、最初から場を壊す人を入れない方が良いのではないだろうか？もちろん意図的に状況を壊すてリビルドなりスクラップなりしたいという思惑があるのであれば話は違うのだろうけど、そういうのを望まない人を踏みにじるべきなのか？

### 会社の文化を作ると言うこと

プロダクト、チーム、部署、あるいは会社全体にはある程度文化というものがある。細かいルールがあったりなかったり。Hogeを使うことを強要する、しない、コーディングスタンダードをどうするか、コードレビューの有無ややり方、ユニットテストに対する考え方など、決めるべき事は多い。決めないというのもよく取られる戦術だが、すべからく文化を規定すべきだ。

もちろん現場を知らない人の押しつけはやるべきではない。上位層がプログラミングを知らないのであればより現場の人に委譲をするべきだ。「私はプログラミングについてはわからないが、当社やプロダクトの目的を果たす上でベストな文化を構築してほしい」という風に委譲をしてほしい。

スピードを重視するのか、安定性を重視するのか、状況への対応力を重視するのか、人の集めやすさを重視するのか、それらに対してちゃんと考えた上で文化を構築するべきだ。マッチングの外れた人が入る不幸な事例が極力無くなるべきだと考えている。

## 振り返る

どうしようもない好き嫌いがあるというのを説明してきた。なので僕はゾーニングすべきだと提唱する。PHPが嫌いな人はPHPの職場には近寄るべきではない。Javaが嫌いな人はJavaの職場には近寄るべきではない。また採用側も採用すべきではないのだ。「好きじゃないけど触っても大丈夫な人」の扱いは勝手にすればいい。僕の知ったことではない。そういう人はおそらく問題を起こさないだろう。

本当にやりたいことは何なのか、そこに対して嘘をつくというのは、僕のような心の弱い人間にとってはあまりにも耐えがたい苦痛なのだ。あなたにとってもそういう嘘をつかなくてすむようになってもらいたい。皆が幸せになるためにも、文化圏ごとのゾーニングというのは意識するべきだ。やりたいこと、やりたくないこと、それらに嘘をつかなくてもすむように棲み分けをするべきだ。

すべての経営者、マネージャー、エンジニアにとって幸せな開発現場が増える事を僕は願う。

## 告知

冬コミ(C91) 2016/12/29 (1日目) 西め18b
東京ラビットハウス
第7開発セクションに居候

車の燃費改善＆70万円のオーディオを1000万円クラスに音質改善＆プロジェクターの映像改善の本出します！！！！！

あと、会社辞めました。