darts-clone の Java 移植
矢田さんのdarts-cloneをJavaに単純に移植したので、GitHubに上げました。
https://github.com/hiroshi-manabe/darts-clone-java
darts-clone については、矢田さんの日記に詳しい解説があります。
これを移植したときは、仕事で使えるかと思ってやってみたのですが、結局そのときは容量の小ささを重視して takawitter さんのtrie4jを改造して使うことになりました。
せっかくなので置いておきます。
これはいろいろな事情があり、かなり Java 的でないものになっています。
その背景には、上記の trie4j の存在もあります。
trie4j はダブル配列も含むため、通常であればそちらを使うのが簡単でいいと思いますが、darts-clone はいろいろと変態的な工夫(1ノードあたり 4 バイトしか消費しないとか、値が同じであれば DAWG という仕組みでかなり容量が節約できるとか)があるので、そういうのを求める場合に使うのがいいと思います。
darts-clone-java では、キーは byte で渡すようにしています。
移植元の darts-clone では、テンプレートでキーの文字型を指定できるようになっているのですが、あいにく Java のジェネリクスでは基本型は使えないので、byte か String(UTF-16)かを選ぶ必要がありました。
しかし、darts-clone を UTF-16 で使っても「辞書サイズは大きくなるし,構築時間は長くなるし,隙間だらけだしと良いところが見つかりません」ということになるので(矢田さんの日記より)、byte にしました。
最初、String のラッパーメソッドも用意して、内部で UTF-8 に変換して処理することを考えていたのですが、結局やめました。
それにはいくつか理由があります。
まず、ビルド時にはキーをソートして与える必要があるのですが、このソート順が String と byte では違うものになります。
Java の String をソートするとき、Unicode のコードポイント順ではなく、UTF-16 の符号単位ベースでソートしているので、UTF-8 に変換したときのソート順と変わってしまいます。
これはわかりにくいので、最初から String は渡せないようにしました。
また、共通接頭辞検索のひとつの典型的な使い方は、長い文字列に対して開始位置をずらしながら何度も呼ぶというものです。
String のメソッドを用意してしまうと、長い文字列が何度も何度も UTF-8 に変換されるという悲劇が起こりかねません。
そのため、byte[] と開始位置のオフセットで検索するようにしました。
そもそも、darts-clone をわざわざ Java に移植するようなことがなければいいのですが…。
どうも Java では、いろいろな事情から C++ のライブラリを使うということをあまりせず(JNI というものはあるのですが)、何でも Java で済ませるということが多いようです。
これには、Java のパフォーマンスの高さがあると思います。
C のように Java を書くと、C に近いパフォーマンスが得られるので、それなら Java で書いたほうが扱いやすいということでしょうか。
しかし、darts-clone を Java に移植するにあたって、ネイティブ型のみをメンバに持つオーバーヘッドのないクラスというものが作れないため、結構面倒なことになりました。
C++ から JVM バイトコードにコンパイルできたら、Java からも扱いやすくていいと思うのですが。
trie を使うとき、速さ重視ならダブル配列、容量重視なら LOUDS を使うのが定番です。
上で挙げた trie4j は LOUDS も含んでいます。
ただ、現在のバージョンではキーと値を関連付ける方法がありません。
仕事では、速度はボトルネックになっていなかったので、上で書いたように結局 darts-clone-java は使わず、trie4j を改造して、キーとユニークな id を関連付けられるようにして使いました。
欲を言えば、marisa-trie(同じく矢田さんによる、LOUDS とパトリシアトライを組み合わせた実装)も Java に移植できればいいのですが、あまりにも複雑すぎて、手が出ませんでした。
ちなみに、あまり情報はないのですが、pinarell...@gmail.com さんによる marisa-javaという Java バインディングはあるようです。
TeX の発音
今さら、TeX の発音が話題になっているようです。
もう何度目だというぐらい目にしている気がするのですが、この問題は本質的にややこしいのでどうしようもないですね。
この問題について書かれているページのひとつとして、以下のものがあります。
これは非常に詳しく書かれていて、付け加えることなんてないようにも思えますが、ほかの言語の事情も含めて書いてみます。
まず、クヌース自身の書いていることから。
上記のページにある通り、彼は「TeXを知っている人は、TeXのχをxとは発音せず、ギリシャ語のchiのように発音する」と明確に書いています。
発音記号では [tex](「テッフ」のような音)となります。
この [tex] を正式発音と考えると話は簡単です。
いくつかの言語では、この正式発音をもとにして、それぞれの言語流の発音をしています。
ロシア語では、[te] の部分が少しなまって [tjex](「チェフ」のように聞こえる)と発音します*1。
ドイツ語では、e の後ろで [x] が変化して [ç] という発音になり、[teç](「テヒ」のように聞こえる)となります*2。
どちらも、[tex] をベースに変化した音です。
つまり、日本語では [tex] の日本語流発音をすればいいということになります。
日本語には [x] の音はないのですが、「バッハ」「ゴッホ」などではハ行の音になっています。
そうなると、[tex]も同じように「テッフ」とするのが筋ということになります。
ここで、「じゃあなんでクヌース自身は『テック』と言っているんだ」という話があります。
でも、実は話は簡単です。
[tex] の英語流発音が [tek] だからです。
TeX に限らず、英語では原音が [max] の「マッハ」も「マーク」のように発音されます。
そう考えると、ロシア語やドイツ語の場合と同じように、英語でも [tex] という正式発音をその言語流に読んでいるだけということになります。
こんなややこしいことになったのは、クヌースが英語にない発音を正式名称とした ということが原因です。
でも、そういうことは固有名詞ではよくあることです。
言語を置き換えて考えてみます。
たとえば、日本語のアニメで「ヴィンセント」というキャラクターが出てきたとします。
そうすると、作品中ではこれは [binsento] のように読まれることになります。
でも、作者の頭の中では [vinsent] のような英語発音が想定されているはずです。
さて、この「ヴィンセント」を諸外国語に訳すときに、"binsento" をベースにするのがいいか、"vinsent" をベースにするのがいいか。
まあ、普通に考えたら後者ですよね。
「作者のその言語での発音」よりも、「作者の脳内発音」を重視するわけです。
TeX の場合は、作者自身が脳内発音を明確に書いているので、なおさらそちらを基準にするのがいいように思えます。
でも実際には、アメリカでみんな「テック」と言っているということには無視できないほどの影響力があります。
おアメリカ帰りの人たちなどは当然「テックが正しい」という意見にならざるを得ないわけです。
これは言ってみると、アメリカ人の日本アニメオタクが、「ヴィンセント」というキャラの発音について「Vincent じゃねーし! Binsento だし! 日本人みんな Binsento って言ってるし!」と言うようなものだと思うのですが。
さらにめんどくさいことを言うと、日本でよく聞く「テフ」という発音は全然 [tex] に近くない ということもあります。
「バッハ」や「ゴッホ」などのように語頭にアクセントがある場合はまだいいのですが、「テフ」の場合はいわゆる専門家アクセントで、「フ」のほうが高く読まれます。
そうすると、「フ」の母音がはっきり目立って、元の [tex] には似ても似つかない印象の音(少なくとも、私はそう感じます)になります。
原理主義的に考えると、「テッフ」(語頭にアクセント)と読むべきということになってしまいます。
結局、クヌースの脳内発音を重視するか、クヌースの実際の発音を重視するかという問題になるので、「これが正しい」という結論はありません。
・英語ではテックのように読まれる
・クヌースが意図した発音は [tex] で、それをもとにした発音をする言語は多くある(英語もそのひとつと解釈できる)
ということさえ押さえておけば、日本語では「テフ」と読んでも「テック」と読んでもいいんじゃないでしょうか。
何度も何度も繰り返されてきた話題なのでいい加減うんざりしている人も多いかもしれませんが、「テック派」へのカウンターとして一応書いてみました。
いい話(W社を辞めました)
(2015/09/01追記:この記事は私がW社に在籍した2013年4月から2014年4月までの間の個人的な経験に基づくものです。就職の参考にされる方は、その後W社の社風や開発者の扱いに変化があったかどうか等についてご自身で最新の情報を得ていただければと思います。)
(2019/08/17追記:社名を「W社」に置換しました。)
記事タイトルの通り、W社を退職したので、退職エントリを書く。
(最近雑文に対していろいろと予防線を張ることが流行っているらしいので、一応これもポエムだと書いておく。役に立つことは書いていない)
今日が最終出社日だった。
ちょうど 1 年ぐらい勤めたことになる。
2 社連続で 1 年で辞めたことで、自分が社会不適合者であることが誰の目にも明らかになってしまった。
これから先の人生の見通しは暗い。
その間に子供が生まれたのだが、不憫でたまらない。
いい話というのは、Google を辞めたりして調子に乗っていた*1ろくに技術力もない人間が、落ち着くべき末路に落ち着いたという意味でのこと。
(Googleに勤めていたことを書くと過去の栄光にすがる情けない人になるので普段は書かないが、今回は転落人生というコンテンツ性のために書く)
仕事
W社というのは、よく知られているウェブサービスの会社。
ぼくは就活力がゼロなので、ツイッターで募集しているのを見て、それで受けて決めてしまった。
W社では、いくつかのプロダクトに関わった。
どれも、それによって誰かの利便性を上げられると感じられるという意味でやりがいがあった。
少なくとも、自分の信条に反するものを作っているということはなかった。
W社に応募したときは、「自分には自然言語の関わる仕事しかできない」という思い込みがあったけど、結果的に自然言語処理とまったく無関係の仕事でそれなりに成果が出せたので、そういう意味では今後の就職活動で自信が持てるようになったと思う。
人間関係
ここからが本題。
W社の開発グループは数人しかいないのだが、先輩が「実質上司」としての役割を果たしていた。*2
実質上司のひとりは威圧的で、彼の好み(彼の中での宇宙の真理)に外れる書き方をすると、コードレビューで直すように言われた。
プログラマ以外にはわからないかもしれないが、屈辱だった。
たとえば、キャプチャしない正規表現について、(?:) ではなく () と書くように言われたことがある。
それは、ぼくにとって(数多くある)辞めた理由のひとつだ。
長いけれど、ぼくの日記から引用する。
ぼくは、キャプチャしない正規表現を (?:) でなくただの () で書くようレビューで高圧的に言われたとき、今の職場を辞めることを決意した。(まだ辞められていないのは純粋にぼくが無能なせいだ)
キャプチャしない正規表現を () で書くこと自体は、そこまでの悪じゃない。
ぼくも昔はそう書いていたし、(?:) を知ってからも使い続けていたし、今でもワンライナーならそう書くかもしれない。
しかし、そう書くことを強制されるというのは、まったくの別問題だ。
それは人間としての尊厳に関わることだ。
「() で書いたほうがシンプルで読みやすい」と言われたら、確かに理がないわけではない。
でも、そのトレードオフで、そのいわゆる「読みやすさ」を重視することを選ぶ根拠、それを押し付けられる根拠は何だ? ということを突き詰めたら、相手のほうが「偉い」という「権力」しかない。
権力で押さえつけられるというのは、奴隷の立場であるというのと同じことだ。
子供がいなかったら、その日のうちに辞めているところだ。
いくら貧乏で、辞めたら餓死する状況でも、隷属してまで生きる価値のある人生なんてあるものか。
(もちろん、正規表現の件はひとつの例にすぎない)
人間性もひどかった。
隣の席の同僚が実質上司のコードレビューをしたとき、少しプログラムの構造に関わることを指摘したといって、誰が見てもわかるぐらい感情的になって怒っていた。
普段、自分基準で異常に細かいコードレビューをしていることを完全に棚に上げて。
また、別の実質上司は、何よりも「100 % の安全」を重視する性格だった。
MIT ライセンスの JavaScript 外部ライブラリを使おうとすると、「使っても問題ないか調査してください」と言われ、またできれば外部のものは使わずに実装してほしいと言われた。
そんなよくわからないものを使って訴えられて大変なことになったらどうするんだ、という雰囲気だった。
そのときのツイートがこれ。
ところで、会社には実質上司よりも偉い創業メンバーたち(以下「偉い人」とする)がいる。
ライセンスの件は、偉い人が問題ないと決めてくれたおかげでなんとかなった。
何をするにも、実質上司たちの頭越しに偉い人たちと話をしないと、バランスの取れた行動ができない。
幸い、偉い人たちは話の通じる人たちだったので、その点ではよかったのだが。
一番クソだと思ったのは、偉い人たちからプロジェクトを引き継いだときのこと。
偉い人たちはベンチャー気質が残っているので、効率と安全というバランスはかなり効率寄りだった(要するに、多少いい加減だということ)。
で、引き継いだぼくが同じやり方でやろうとすると、実質上司たちにボロクソに叩かれる。
そこでぼくが思ったのは、次の二つ。
1. 偉い人たちがやっていたやり方が会社にとってよくないと思っていたんだったら、偉い人たちに対しても諫言するべきだったんじゃないのか?
2. バランスを効率側に倒して会社にとってよくないことになったとしても、その影響を一番受けるのは偉い人たちなのに、実質上司たちは何の権限があって彼らと違うバランス感覚で判断をしているんだ?
もちろん、わかってみると理由は簡単だ。
彼らにとって、意見を言うことは「逆らう」ことなので、彼らよりも「上位」の存在のやり方に意見を言うなんて論外だけど、自分よりも「下位」の存在に対しては自分たちが支配できるということだ。
長い間ヒトとして生きることができていたぼくは、すっかりそういうサル的行動については忘れていた。
まあ、ぼくがこれまで運がよかっただけなんだろう。
人間にそういう面があるということは、ぼくだって聞いて知っていた。
ただ、ぼくが最初に勤めた会社も、二番目に勤めた Google も、そんな権力関係みたいなものとは縁のない世界だったから、あまり実感がなかったというだけだ。
あまりにも保守的なため、新しいものが何も使えない。
雰囲気がギスギスしているので、改善の提案もなかなかできない。
間違えたら元に戻すのが大変だという理由で、プログラミングにもいろいろな制約があった。
息が詰まりそうだった。
もちろん、愚痴を言うだけではしかたがないので、ぼくもいろいろ行動した。
指さし確認的・精神論的な「安全性」から脱却するために、多少なりともテストの自動化をしたり、先進的なバージョン管理システムの導入を推進したりした。
最終的には、前よりもずっと変更を加えやすい状況にすることができた。
でも、それらはもちろん、偉い人や同僚の助けを借りてやらなければいけなかった。
健全さやバランスを志向する精神性が実質上司たちにはないので、ぼくひとりでは何もできない。
政治的にやることはできたし、実際に少しはやったわけだけど、空しかった。
何をどう変えようとしても、また変えても、根本的な「文化」が変わらない、また変えられそうな見込みもない。
人間関係について、飲み会で偉い人のひとりと話をしたこともある。
すると、「人が辞めることによって人間関係が変わることもあるし、固定的ではない」と。
冗談じゃない。
実質上司たちは、辞めるどころか周囲を辞めさせる側じゃないか。
W社にいたことで、ぼくはそれまでプログラマとして当たり前だと思っていたいろいろなことの大切さを再確認できた。
技術的な健全さを目指す長期的な方向性。
健全な方向性を実現するための好奇心・向上心。
好奇心・向上心を保証するための余裕。
人として対等な、信頼のある人間関係。
でも、実質上司たちが間違っているかというと、必ずしもそうではないのかもしれない。
W社のサービスはすでに完成されていて、何よりも大事なのは「今あるものを変えない」という銀行的発想なのかもしれない。
そう考えると、間違っていたのはマッチングということになる。
(実質上司たちとは面接で会わなかったので、マッチングに必要な情報を得ることができなかったのは今でも残念だ)
興味
偉い人との話では、技術力のある会社の話題になったこともある。
レシピサイトやイラストサイトなど。
そのとき、「じゃあ、そういう会社に行きたいと思う?」と聞かれた。
それに対してぼくは、「いや、料理もイラストも好きじゃないので」と答えた。
すると、大笑いされた。
そういうことじゃないだろう、と。
ぼくは、何が「そういうことじゃない」のかわからなかった。
料理にまったく興味のないぼくは、ネット上のレシピがすべて消え去ったとしても何とも思わない。
そんな人間が、レシピサイトで働けるというのか?
ぼくは、言語に興味があるから、少しでもそれに関わる仕事がしたいと思ってW社を選んだ。
でもそれは、工場で働くライン工が最終製品が何であるかを気にするような、馬鹿げたことだったんだろう。
最初、ぼくの問題はたまたま悪い実質上司に当たったというだけだと思っていた。
しかし、その後も偉い人との会話を続けることで、根本にある問題に気がついた。
偉い人レベルでの、従業員は使い捨て可能・交換可能な部品であるという見方。
(こういうことを書くと、シニカルな人は「会社とはそういうものだ」と言うだろうが、これまで勤めた2社ではそういうことはなかった)
努力
「お前がそんな境遇になったのは技術力がないからだろう」と言われるかもしれない。
確かに、努力でひどい環境から抜け出した人のサクセスストーリーはある。
ぼくが泥沼で苦しんだのは、実力不足という要因もあるだろう。
それでも、ぼくはマイペースに努力はしている。
能力の範囲内で成長はしているはずだ。
それはトップレベルの人から見たら、目に見えないぐらい微々たるものかもしれないけれど。
人生は長いから、限界以上に頑張ってもすぐに息切れしてしまう。
遠くを走っている人には、「俺は『走る』というすばらしいアイデアを思いついたのに、お前は何で歩いてるんだ?」と言われたりもするけれど、自分は自分のペースで歩き続けるしかない。
書くことについて
「プログラマは黙ってコード書けよ」みたいな考え方がある。
だが、ぼくはそういう言説とは全力で戦っていく。
確かに、努力をあきらめてのらりくらりと生きているようなプログラマもいるのかもしれないが、能力の範囲内で精一杯頑張って、それでももがいているプログラマも数え切れないほどいる。
人間の生まれ持った能力は違うし、抱えているハンディキャップも違う。
運良くパラメータと環境が揃った人間だけが勝ち組になれるなんて、いくらかっこつけたところで、原始時代と同じじゃないか。
プログラマがものを考えないでいると、ごく一部のトップ以外は、会社に交換可能な部品と見られて底辺を這いずることになる。
ぼくはそれをこの会社で実感した。
「もっとひどい環境で苦しんでいるプログラマはいくらでもいる」と思う人はいるだろうし、それは事実だと思う。
でも、そういう人たちは何かを書くエネルギーすらなかったり、会社のことがトラウマになって書けなかったりする。
だからこそ、まだ恵まれているほうのぼくが書いている。
下を見て安心したり、自分の環境を自虐ネタにしたり、そういうことはしたくない。
(ところで、この記事を見てW社の環境がいいと思った人はぜひ受けてほしい。正しいマッチングを促進することになると思う)
流動性
辞める理由は、ぼくが人格的にダメでストレス耐性が低いというのもあるけど、「流動性を高めたい」というのもある。
人材流動性が高まることで、それぞれの組織には適した人材が残るようになる。
「人間を部品として見ている」会社、「変化を嫌う」「好奇心がない」「製品に対する関心がない」といった文化がある環境では、それに合う人が残っていく。
もし、それらの特徴を備えた会社が生き残る方向に市場の力が働くなら、それはしょうがない。
でも、ぼくはソフトウェア開発というのはそういうものじゃないと思っている。
自分が機械にならなくても、好奇心を持って果敢にチャレンジすることで生産性や信頼性を上げることができるのが、プログラマという職業なんじゃないだろうか?
トップレベルの人材でない限り、健全さ・好奇心・向上心・余裕・人間としての尊厳といったものは贅沢品にすぎないんだろうか。
ぼくはそうは思わない。
現時点では、そういうものが持てる健全な会社はごく一部で、トップレベル人材の分の場所しかないかもしれない。
でも、その健全さは「頑張ったご褒美」として与えられているものではなく、それ自身が成長力につながっているはず。
だとしたら、そういう会社が勝つことによって、よりよい環境が増えていくんじゃないだろうか。
そのためには、プログラマの行動が必要だ。
プログラマが、人間として頭を使って考えること。
プログラマが、いる場所・いた場所の情報をオープンにしていくこと。
プログラマが、いるに値しない場所から勇気を持って去ること。
プログラマの環境を改善するには、これらが大事だと思っている。
少しずつでも下のレベルにまで健全さが波及するよう、市場の力が働いてほしい。
収入
収入について、在職中にプログラマの生産性と報酬という記事を書いたことがある。
そこに「年収 1000万円」という職場の例を出したけれど、それはただの仮想の話だ。
実際は普通レベルだった。
(正社員として普通に給料をもらえるという時点でものすごく贅沢なレベルの話なのはわかっているけれど、子供がいるのでしんどかった。今は、妻が働くために子供は妻の実家に預けている)
よかった探し
会社についてのいい面も書いておく。
何よりもよかったのは、社長の人間性。
常にポジティブで、明るく、エネルギーにあふれていて、ユーモアを忘れず、決断力もある。
まさに起業家に向いているタイプだった(ぼくとは正反対だ)。
また、同僚(×上司)にも恵まれた。
同僚は、わからないことを聞くと何でもすぐに教えてくれた。
「聞いたほうが早いことは聞く」という、合理的な文化があった。
そのほかによかったのは、定時退社と有給休暇取得が自由にできたということ。
毎日、18:00 の瞬間に帰っていたので、10分遅れると妻に心配されるほどだった。
(さすがにほかの人はそこまで早くはなかったが、それでも30分も残業しないぐらい)
さらに、会社には数多くの本があり、自由に借りることができたのも精神的によかった。
(金銭に換算すると大したことはないが、教養を重視しているという意味で)
それに、Java や Web プログラミングを取り巻くエコシステムについて、ある程度の知識を得られたのもよかった。
一年前のぼくは、Java にも詳しくなかったし、Java の周辺技術も何ひとつ知らなかった。
個別プログラミング言語の経験でなく、ポテンシャルによって採用してもらえたということではありがたく思っている。
また、会社の偉い人たちはすべてにわたって合理的で、話が通じやすくてよかった。
ぼくが Google を辞めたときのブログも読んでくれていて、そのうえで採用してくれた。
W社を辞めるときにブログを書くことも想定内で、そのうえでメリットのほうが大きいと判断してくれたんだと思う。
実際、それなりの成果は上げられたはずだと思っている。
この先
さて、最初に書いたように、今後の人生の見通しは暗い。
でも、転落人生というコンテンツとしてはいい感じだと思っている。
今後、もっと情けない境遇になることがあったら、それも報告したいと思う。
(万が一人生が好転した場合はコンテンツ性が低いので書かない)
以前 Google を辞めたことについては、今でも後悔していない。
というのは、ぼくはプログラマとして「再現性」を重視しているからだ。
もしぼくに実力があれば同じくらい環境のいいところにまた入れるだろうし、そうでなければ再現性のない幻にすぎない。
結果として後者だったわけだが、それならそんな幻にすがっていてもしかたがない。
この先、就職活動をするにあたって一番憂鬱なのが「権力」のことだ。
今後どこに行っても、権力という意味では常に一番下っぱになる。
これまで、そういうことを意識する環境にいたことがなかったので、そのことを気にしていなかった。
お気楽だったとしかいいようがない。
今後どこに行っても一番下っぱになるだろうし、権力闘争には向いていないのでそこから這い上がることもできないだろう。
そう考えると絶望的な気持ちになる。
Google を辞めたときは、開放感からケーキを買ってきてお祝いをしたぐらいだった。
でも、今回はとてもそんな気持ちにはなれなかった。
今日、家に帰って、晩ご飯を食べてから布団にもぐって、1時間以上ずっと泣いていた。
これまでのつらかった時間、失われた人生を思って、またこれからも底辺を這いずって生きることで失われる人生を思って。
希望
「ある場所でやっていけない人間は、ほかの場所でもやっていけない」というような話を好む人間もいる。
ぼくが学部で京都大学をやめて大阪外大に入ろうとしたとき、そういうことを言われた。
でも、実際に大阪外大に行ってみると人間も雰囲気も大違いで、ぼくはずっと幸せになることができた。
それ以来、そういう言説は信用していない。
人間の集まる場所は、一部の人が思うより、ずっと多様性に富んでいる。
ぼくも、一度だけそれなりに長く(5年)勤められた経験がある。
小さいところだったが、カリスマ的な社長がいて、思いついたアイデアをいつも開発室に話しに来ていた。
社長の人柄もよく、ひとりひとりの従業員と人間として接していた。
その職場では、「権力」という単語が頭をよぎったことは一度もなかった。
いい環境だった。
(残念ながら、そこは社長が亡くなって以来、帰りたいと思えるような場所ではなくなってしまった)
だから、自分に合った場所に出会える確率もゼロではないはず。
いつかまた、そういう場所が見つけられるよう、青い鳥ハンターになっている。
辞めることを決めた週末、結婚記念日のお祝いとして石油王的娯楽(映画鑑賞)をした。
そのときに見た映画「それでも夜は明ける」は、19世紀のアメリカを舞台としたもの。
自由黒人だった主人公が南部に拉致されて 12 年間奴隷として暮らしたという実話に基づく映画だった。
それを見ながら、思わず自分の境遇と引き比べていた。
そして、自分の幸せに気づくことができた。
映画の主人公は、奴隷主や奴隷使いの当たり外れで環境がよくなったり悪くなったりするが、彼は主人を選ぶことができない。
でも、ぼくは少なくとも奴隷主を選ぶことができる。
逃げても、逃走奴隷としてリンチされることもない。
職業選択の自由はすばらしい。
人類がこれまで積み上げてきた概念の大切さを思い知った。
これからしばらく、隷属から離れて、人間として生きることができる。
次の職場が見つかるかどうか、見つかっても人間として生きることができるかどうかは、まだわからないけれど。
上で引用した日記の続き。
いつか仕事が辞められたら、今の職場にいた時期のカレンダーを真っ黒に塗りつぶして、失われた日々を追悼したい。
ぼくは今後、この期間のことをずっと供養していきたいと思っている。
そのためには、今後の人生をこの時期よりもいいものにしないといけない。
頑張ろう。
マッチョとの戦い
今のネットは面白い。
ツイッターでは、毎日のようにエアリプ、つまり相手を書かないほのめかし合いがやりとりされている。
時には、ブログでも同じようなことが起こる。
ちょっとした愚痴を書いたつもりが、愚痴ってんじゃねーよ的な反応を呼んだりする。
面白い。
やってやろうじゃないか。
これは、空中から空中へ向けての戦争だ。
ぼくは、たとえばオープンソースへの貢献度から言ったら無名であるべきエンジニアだ。
くだらない記事をいくつか書いて、一部界隈で多少有名になったにすぎない。
じゃあ、なんでものを言うのか。
知ったことか。
ものを言うのに資格があるか。
多くの人間が、ものを言うのには資格があると思っていることは知っている。
しかし、実際にあるのはお前が読むのをやめる権利だけだ。
その権利は妨げないから、「資格」とか言わずに "shut the fuck up" とでもつぶやいて今すぐブラウザを閉じろ。
ぼくは、それが分不相応であろうと、与えられたチャンスを最大限に活用する。
ぼくはただ、「多くの人間の中で自分だけが、自分でものを書いて公開するという優れたアイデアを見つけ出した、オレは偉い」的なことを考えているように見えるやつがムカつくだけだ*1。
世の中にどれだけ、自分にできる限りのアウトプットをして、それでも泥沼から抜け出せない人がいると思っているのか。
もうひとつは、これが終わりのない競争、言葉を換えると自由時間のダンピングだということだ。
今は、大多数の人間がそのダンピング競争に乗ってきていないから、自分だけダンピングしたらチャンスがあるかもしれない。
十分な才能があって(ここは譲れないところだ)、十分な情熱と時間を注げば、スターエンジニアになれるかもしれない。
しかし、みんながその競争に乗ってきたらどうなる?
すべてのエンジニアが GitHub のリポジトリを持ち、仕事外の時間をすべてそこに注ぎ込む世界。
そこでは、最高に才能があって、最高に情熱があり、最大限に睡眠時間を削ったエンジニアしか浮上できないだろう。
尊重されたくて努力する 99 % のエンジニアは、いくら努力してもどうにもならない。
「ワークライフバランス」なんて言葉は前時代の遺物になるだろう。
そうなれば、ソフトウェア的には世界はものすごく豊かになる。
でも、みんなが自由な時間がなくて、向上を目指してひたすら努力しなければいけない世界にゲームや SNS やその他ツールがあったとして、それが何になるんだ?
もちろん、それを理由に仕事外で勉強しないというわけにはいかない。
そうすると負けるからだ。
だからぼくも、自分の興味と向き不向きと換金性のバランスを考えながら、勉強を続けている。
どちらにせよダンピング競争に参加するなら同じことだと思われるかもしれないが、ぼくはそれを肯定的にとらえて陶酔したくない。
お前は次に、「自分はそれが楽しいからやっているだけだ」と言う。
ならいい。
その代わり、毎日ソーシャルゲームで時間をつぶしている人間を見下すな。
お前と彼らの間に、どんな差があるというんだ?
何の実績もないぼくがここで何を言っても、「資格」主義者には負け犬の遠吠えにすぎない。
でも、届くかどうかわからないが、ぼくはゲリラ的にそいつらの頭にミームを撃ち込む。
「お前の今があるのは、どれだけが生まれ持っての才能で、どれだけが努力の成果なんだ?」と。
ぼくはオープンソースにはろくな貢献をしていない。
多少何かができたのはウェーブレット行列関係ぐらいだ(それも、wat-arrayというウェーブレット木のライブラリに乗っかったものだ)。
https://github.com/hiroshi-manabe/wavelet-matrix-cpp
ブログでは、中学生にもわかるウェーブレット行列のほかに簡潔データ構造 LOUDS の解説(全12回、練習問題付き)などを書いた。
ぼくの書いたものが、そちらの世界でどれだけの「偉さトークン」に換算されるのかは知らない。
知ったことか。
高額換算されたらケッと思うだけだし、低額換算されるならそうかいと思うだけだ(微妙な差だ)。
いくらに換算されるにせよ、ぼくがウェーブレット行列や LOUDS などを面白いと思えたのは、たまたまにすぎない。
ぼくの生まれ持った頭脳の巡り合わせによっては、同じ題材を見ても、簡単すぎてつまらないと思ったかもしれないし、難しくて手が出ないと思ったかもしれない。
別の世界線の自分は、ハノイの塔のプログラムを理解するのに精一杯だったかもしれない(バカバカしい仮定だと思うか? CS専攻の大学生一クラス全員をハノイの塔が書けるぐらいまで育ててみせろ)。
そっちの世界の自分が、頑張ってハノイの塔のプログラムや解説記事を書いていたとして、それがどれだけの偉さトークンに換算されたというんだろう?
それらは、The Internet の中では、今以上に誰にも顧みられなかったんじゃないだろうか?
人間には適性がある。
ぼくは、多少のプログラミング、少しの語学の適性がある。
(ここで言う「多少」というのは、100 人に 1 人*2ぐらいという、平凡な環境にいればなかなか自分以上が見つからないが、ネットでは何者にもなれないレベルという意味だ)
世の中の 49.99 % の人間と同じように、一時間で gem を 2 個書けるような人間と、頑張っても FizzBuzz も書けない人間との間のどこかにいる。(50.00% は FizzBuzz が書けないほうの部分だ。数字は適当だ。)
それでも浮き上がれなくて、泥沼から抜けようと、必死でもがいている。
しかし、それでもぼくは、多少のプログラミングの適性はあると思えている。
ぼくの持っている適性が、たとえば「編み物」だったらどうだっただろう?
現代で、編み物をたとえば平均の 3 倍の速度でできたからといって、それでどこかで浮上できるのか?
もちろん、その世界線の自分も、その持ち合わせた適性で、何とかやっていこうと頑張っていただろう。
その点では、この世界線の今の自分と同じだ。
それに、自分がどうやって生きるのがいいかを考えられるというのは、それだけでものすごく恵まれている。
ぼくが曲がりなりにも長期的な生存戦略を考えられるほど余裕が出てきたのは、けっこう最近のことだ。
昔の自分は、「どういう思考をすれば長期的に自分にとっていい結果になるか」という、いわゆる「メタ」な思考ができていなかった。
そのころの自分は、死の恐怖におびえながらハンドルのない車に乗っているようなもので、自分に何がコントロールできるのか、何ができないのかもわかっていなかった。
少しずつコントロールできるようになったのは、ハンドルのない車でいろいろぶつかっていてもとりあえずのところは死んでいないと心を落ち着け、いろいろな機械を触ってみて、アクセルを踏んだらなぜか進路が右にずれるとか、そういうレベルでかろうじて障害物をよけたりすることができるようになってからだ。
自分の人生がそうだったのは、生まれも育ちもあるけれど、決して 0 歳や 5 歳や 10 歳や 15 歳の自分が何かをサボったからではない。
「まっすぐ進んだらいい景色のところがあるのに、どうしてまっすぐ進まないの?」
大きなお世話だ。
そういう自分にとって、人間は「どうすることが自分にとって最善かを考えて生きている」というのと「それだけの余裕がない」というののどちらかしかないと思っている。
前者はもちろん、後者も軽蔑するようなものじゃない。
これはミームの戦いだ。
マッチョミームに対抗して、ぼくは「あなたは十分頑張っている」ミームを死ぬ気で戦わせる。
もちろんこちらの分は悪いが、ぼくにとってはこれはジャイアンにのび太が向かっていくような、勝ち負けにかかわらずしないといけない戦いだ。
努力しないやつを軽蔑するな。
「生まれつきの運の悪かったやつを軽蔑する」と言え。
それならぼくは、何も言わない。
おまけ。
関係ないけど、「エンジニア」という言葉で「IT 系エンジニア」のことを表すのは好きじゃない。ほかの分野の技術者に敬意を払っていないように感じる。歌手が自分たちのことを「アーティスト」と呼ぶのを聞いた時の違和感に似ている。
2014-02-25 16:27:27 via web
(すっかり慣れてしまった)
一般プログラマの妻がゲイツの子供を産めるシステムを作るべき
プログラマの生産性と報酬について考えてみたけど、どう考えても 1万人に 1人ぐらいのトッププログラマ以外には子供が持てる気がしない。
子育てをするうえで一番厳しいのは、その間労働力が半分になってしまって、世帯収入を支えられないということ。
それに、40代以降は老眼や気力体力の低下もあるだろう。
かろうじて育てたとしても、ろくな環境も用意してやれない。
いっぽう、WhatsApp の買収で話題になったように、成功したサービスを作った人は何千億円というお金を持っている。
現代では、数人〜数十人規模の会社が世界的サービスを作れるので、そのこと自体は作り出した価値への対価ということで当たり前だ。
でも、この仕組みだと社会が維持できない。
このままでは、特に日本のような国では、少子高齢化が進む一方だ。
ヨーロッパのようにシングルマザーを支える仕組みが一般的になればいいのかもしれないが、日本のような保守的な国では難しいだろう。
かといって、昔みたいな大家族にも戻れない。
そこで、いい方法を考えた。
それは、「子供を産ませる権利」を売れるようにするということ。
一般人の夫婦は、子供を産ませる権利を売りに出す。
そして、ビルゲイツのようなお金の使いどころに困るような大富豪がそれを買う。
すると、一般人夫婦の妻のほうはゲイツの精子を人工授精して子供を産む。
お金は 5000万円ぐらいを前払いで銀行に預けておいて、20年分割ぐらいで渡すようにする。
子供が死んだりしたら、残額は払い戻される。
授精は人工授精だけど、富豪側に時間があってそれを望めば、一般人妻と一夜を共にすることができるとする。
この仕組みはうまくいくんじゃないだろうか。
年に 250万円ぐらい余計にあれば、一般人夫の子供も持つ余裕もできるし、そうすると自然に 1組の夫婦が 2人の子供を産める。
もちろん、世の中の倫理も同時に書き換えて、それが当たり前のことであるようにする。
「うちは上の息子がゲイツの子なんですよ」「あら、うちは下の娘がザッカーバーグの子で」というのが日常になるように。
今の世の中では、起業することのリスクとリターンのバランスが取れていない。
成功して金持ちになるというリターンに対して、失敗して路頭に迷うリスクが大きすぎる。
この仕組みを採用したら、成功することへのインセンティブがかなり強くなるうえに、失敗することに対するセーフティネットにもなるので、起業ももっと盛んになって、世の中が活性化するんじゃないだろうか。
このシステムの中では、女性の富豪のことは考えていないけど。
どういうわけかわからないけど*1、現実世界での大富豪は多くが男性だし、それでだいたいの金銭的な面をカバーできるんじゃないだろうか。
今の核家族は、一般労働者が価値の創造の大きな部分を担っていた時代の名残で、ごく一部の天才がほとんどの価値を作り出す現代には向いていないから、遅かれ早かれこういう社会になってくれないかなぁと思う。
まあ、うちは手遅れだけど。
*1:生得的な違いもあるんじゃないだろうか?
プログラマの生産性と報酬
追記: 続編を書きました。マッチョとの戦い
最近、プログラマの生産性が話題です。
いろんな意見があるものの、個人的には 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万人にひとりレベルの人材でなければ、プログラマは子供を持ってはいけない」というのが、現状での自分の答えです。
でも、それでは社会が維持できないですよね。
そこで、一般プログラマの妻がゲイツの子供を産めるシステムを作るべきなんじゃないかと思うんですが、どうでしょうか。
「了解」は失礼か?
最近、「了解」は失礼だという説が出てきているようです。
どこの誰が言い出したのか知りませんが、ごく最近であることは確かです。
少し前のマナー本には、そんなことは書いてありません。
たとえば、2003年のこれだけは知っておきたい! 改訂版 ビジネス・マナーハンドブックには、次のようにあります。
しかしそうしたルールができていない社外の人からのメールを受信したときには、「メール、受けとりました」「その件、了解しました」など、簡単でよいからすぐに返信し、…
また、2005年の「こんなことも知らないの? 大人のマナー常識513」というマナー本には、次のような記述があります。
内容に疑問のあるときにはその点を記して送信しますが、そうでなければ「メール拝見しました。○○の件は了解しました」などと簡単な返信でかまいません。
しかし、2008年の「信頼される社会人へのパスポート敬語検定」*1には、次のようなものがあります。
最近、若い人の間で増えているのが「了解しました」「了解です」などという答え方です。しかし、「了解」の意味を辞書で調べてみると「事情を思いやって納得する、理解する」とあります。ですから、承諾するという意味で使うには、あまりふさわしいとはいえません。
ほかにもいろいろと見てみたのですが、「了解」失礼説が出てきたのは、どうもこの2008年あたりのようです。
さて、「了解」は失礼なのか。
これは答えが出る問題ではありません。
「了解」という単語はただの入れ物なので、それにどのような意味・ニュアンスを入れて使うかは使う人によるからです。
時代によって、そのニュアンスは移り変わることもあります。
有名な例としては、「貴様」があります。
辞書にもあるように、昔は「目上の相手に対して、尊敬の気持ちを含めて用いた語。貴殿。あなたさま。」という意味だったのですが、使われるうちに尊敬の意味が薄れて、ついに罵倒専用の表現になってしまいました*2。
「了解」の場合、「『了解』という言葉は失礼だ」という考えが、徐々に広がりつつあるようです。
この考え方に触れた人は、ある人は「そうだったのか」と了解=失礼説を受け入れ、ある人は「そう考える人もいるのか」と了解を使うことを控え、またある人は「そんなわけがない」と無視するなど、いろいろな反応がありえます。
この三通りの場合、前二者は積極・消極的にこの考えを支えることになるので、結果として広がっていくことになりがちです。
このように、人々の間でコピーされる情報の単位を、遺伝子になぞらえて「ミーム」ということがあります。
今回の「了解=失礼説」のような、「○○という言い方は失礼だ」というタイプのミームはコピーされやすく、増殖しやすいように思います。
過去に起こったこのような「○○失礼説」は、「ご苦労様」があります。
この言葉は、以前は誰から誰に対しても使えるものでした。
たとえば、青空文庫の「小説 圓朝」には、次のような箇所があります。
「ア、師匠御苦労さまで」
いままでシャーイシャーイと声を涸らしていた木戸の爺さんが肉づきのいい圓生の姿をみつけると、吃驚したようにこういった。
可愛い、可愛いお父様。その言葉が思わず途切れ途切れに私の唇からほとばしった。どうも御苦労様でした、そういう感動が私の体じゅうを震わすのであったが、物々しい儀式の空気に制せられてそれは表現されなかった。
どちらも、現代ではこう言わないところですね。
また、「お疲れ様(です)」というのは青空文庫ではあまり出てきません。
この「ご苦労様」については、お年を召した方の中には日本語のアップデートが遅れていて、どんな場面でも「ご苦労様」を使うという人がいます。
お年寄りは立場が上であることが多いので、それがあまり問題にならないのですが、時には次のようなすれ違いが起こることもあります。
派遣の警備員(60歳ぐらい)が派遣先の社長や社員に対して「ご苦労様」と言うことについて、このスレッドを立てた人は常識がないと怒っているのですが、その「常識」が変わったことになるので、気の毒な話です。
今の 40歳以下の世代なら、60歳で警備員になって派遣された先の社長が年下だったとしても、「ご苦労様です」とは言わない・言えないですよね。
今では、「ご苦労様」というとすっかり目下に対する言葉ということになってしまっています*3。
個人的には、人をねぎらう際にまで目上や目下など考えるのは卑しいことのように思えるので、色のついてしまった「ご苦労様」は使わず、「お疲れ様です」「ありがとうございます」のように言っています。
「了解」は今後どうなっていくのか、目下向け専用の表現として生き残るのか、それともフォーマルな場から姿を消すのか。
個人的には、「あんまり面倒なことを言い出さないでほしいなぁ」程度に思っています。
辞書の権威に頼るのは好きではないのですが、たとえばデジタル大辞泉の了解には、次のような解説があります。
「了解」には、相手の考えや事情をわかった上で、それを認める意がある。「暗黙の了解を得る」「お申し越しの件を了解しました」
今のところは、社内では同僚だけでなく上司に対しても「了解しました」「了解です」などを使っています。
どうも「承知」というのは使いにくいんですよね。
「承知しました」「承知いたしました」はまだしも、「承知です」とは言えないですし。
まあ、そう言っても「了解=失礼」ミームが広がってしまったらどうしようもないですね。
それでも、このミームがどうしようもなく広がるまでは、ささやかな抵抗として、できる限り「了解しました」等を使っていきたいと思っています。