2012-07-22

マイクロソフトのインターンシップ体験談

Erik McClure: Microsoft Internship

俺にとって、この5年間のMicrosoftというのは、電車に乗って、次の駅で降りたら、5分後に電車が爆発したようなものだ。というのも、俺は2008年の夏、高校二年になる直前、高校生のインターンをやっていた。そこで俺が体験したことは、生涯忘れられないだろうし、ソフトウェア開発会社の反面教師として生涯記憶に残るだろう。俺はワシントンはレドモンドにあるMicrosoft社から10分しか離れていないところに住んでいて、プログラミングを学んでからというもの、ずっとあそこで働きたいと思っていた。実際に働くまでは。

Bloatware

俺は不当に過小評価されて、テストチームに配属された。仕事というのは、自動化されたテストを書き、またある製品のテストに関連した仕事を行うことであった。この製品とやらは、当時、最大最凶のデカブツであった。最適化を一切かけないデバッグビルドの初回実行は、平均して、20分間、起動にかかった。俺はどうやったらそんなことが可能なのか試したことがある(というのも、俺のコンピューターでは18分しかかからなかったからだ)。一体何をやっているのか不明だが、まあ、恐ろしいシロモノだ。

連中はなんとかこれを、3分台にまで縮めることに成功した。本来やるべきではないへんてこなDLL binding技法を使ってだが。最適化を有効にしたリリースモードでコンパイルしたものは、ギリギリで1分を切ることができた。わけがわからん。そりゃ、20分間もへんてこなデータをクソみたいな理由でロードするのは分かる。だが、20分間も、DLLやコードのロードだけで、かかるか普通? まあ、この製品のためだけに専用の言語を二つもわけのわからない理由で発明するぐらいだから、この程度は必然とも言えるだろう。

この製品が五つもの異なる言語で書かれているってことはもう言ったっけ? そのうち二つは、この製品のためだけに作られたものであることは言ったっけ? もちろん、全部マネージドだが、だからといってメモリーを耳から垂れ流すみたいにリークするのを防げたわけじゃない。俺がやって来た時、ウインドウを動かすだけでめちゃくちゃなメモリーリークが発生した。連中はどうにかこうにか、メモリーリークの量を抑えることに成功したらしく、たったの4MB/時ほどに抑えられた。メモリーリークの修正なんてことは忘れろよ。マネージド言語を使う際のお約束は、肩から背後に投げ捨てるメモリーを減らすことだ。言い表し得ないほどクソだ。

会議

Microsoftはアホみたいな会議で悪名高いが、それも当然だ。2日に一回は会議があった。チームリーダーは、もっとコーディングしたいとこぼしていたが、彼の時間のほとんどは会議に費やされていた。会議の日程や準備のためだけに、Outlookの使い方を学ばなければならなかった。時には、いつ会議をするべきかを決める会議まであった。会議は常に、凄まじいほど退屈だった。ある会議は、あらゆる会議をブッチぎりで退屈だった。

ある不幸な日の会議では、TODOリストにある議論の主題が、50文字以上ある関数名というものであった。いや、嘘じゃない。連中はまず、「やれやれ、この名前長すぎる? 50文字って長すぎる? このままでいい? まず名前を変えてみるべきかな?」などと議論し、そして10分間ほどこのアホくさい関数をどのように改名すべきかどうか議論していた。俺は座ってその光景を眺めながら、自分の会社を立ち上げるべきだと真剣に考えていた。というのも、俺がいかにがんばろうと、ここまでのクソな会社には陥らないだろうから。

もちろん、俺は常に、単なる週末の会議だけではなく、更に上層部の会議にまで協力しなければならなかった。俺の上司の上司が、そのまた上司と話し合うのだ。連中は、誰が誰に問題を報告するべきかという問題を解決するための仕組みを持っているってことは話したっけ? これはまだビル・ゲイツがピラミッド階級の頂点に君臨していた頃の話で、ビル・ゲイツに報告するのは、スティーブ・バルマーの役目だ。当時アホくさく思えたのだが、今、スティーブ・バルマーがマイクロソフトを崖から転がり落としているのを見ると、おそらく、バルマーがゲイツに報告するという仕組みには、相当な理由があったものと見える。

この仕組みによって自然に発生するものとして、誰かが病欠した時には、誰に問題報告を上げるべきかという仕組みがあった。俺のチームリーダーが居ないとすれば、チームリーダーの下に属する者は、チームリーダーの上司に直接報告するのであり、もしそいつすら居ないとなれば、さらにひとつ上の奴に報告、更に上へと、そういう仕組みだった。ある週のこと、チームリーダーもその上司も同時に居なかったことがあった。そのため、俺は実際に上司の上司の上司に報告していた。この時、俺は部門長とその他の重役との会議に出席していた。この上司の上司の上司とやらが、そうするのは面白そうだと考えたためにだ。(全く異なる理由によって、面白いことではあったが)。しかし、この週、三時間ほど、上司の上司の上司すら居なくなる事案が発生した。俺らは一体どうすればいいのかわからなかった。なぜならば、仕組み上、俺はあらゆる問題を部門長、すなわち上司の上司の上司の上司に報告しなければならないはずであったからだ。

その3時間、俺は何も壊さないように必死だった。

マネージド教

俺の書いたコードのレビューでは、ほとんどすべてに対し、連中は俺のコードは良いと評価した。ただし、あまりに賢すぎるか、あるいはエレガントすぎる(いやマジで)と言われた。そのため、俺はコードを書き直さなければならなかった。これは、もし俺が交通事故にあって、マヌケが俺のプログラムの保守担当になった場合を想定してのことであるとのこと。俺はそう言い聞かされるたびに、そもそも、なんでマヌケを雇うんだという疑問を抱かずにはいられなかった。俺はC#の面白い機能を利用して、エレガントでロックソリッドに問題解決をすることはできなかった。俺は常に、面倒でアホくさい方法を強いられた。

皮肉なことに、俺の働いていたプロジェクトは、C#を本来想定していない目的に使っていた。すなわち、低レベルなWindowsの解析用のAPIを使う必要がある作業なのだ。幸い、誰かがまとめてくれた実際のAPIのインターフェースがあり、自然と結果は巨大なハックだらけだった。プログラムの半分は、PInvokeと狂ったようなアライメントハックによりunionを模倣した構造体を作るものであった。あるときは、マーシャリングのドキュメントが間違っていた。あるときは、ネイティブAPIの機能説明が間違っていた。俺の担当したある例では、関数はドキュメントが言っているような挙動をしなかった。

そのため、プロジェクトは巨大なハックの山であった。コードレビューにより、俺は簡単なコード方法を使わなければならなかった。もちろん、その当時、俺はC++を数ヶ月学んでいたが、C++のイディオムが頭に浮かぶたびに、俺は「C++は悪い言語だ」と思い直さなければならなかった。連中はMicrosoftとWindowsの外の世界に構築された安全な遊び場を見ようともしない。明らかに、C++は悪い言語である。だからといって、C#が本来利用を想定してもいないようなことにC#を持ち込むべき理由はない。

インターンシップの末期の頃、俺はさらに深い解析方法を求めて調査を進めていて、とうとう、連中が俺に命じた仕事をこなすのは不可能であることに気がついた。ある解析のための重要なAPIが、非ネイティブコードからはどうやってもアクセスできないのだ。PInvokeもない。API呼び出しもない。workaroundもなし。何もなし。という訳で、傑作だった解決方法としては、チームはプロジェクトをC++で書きなおすしかないと気がついたことであった。

おおっと。

2009

高校を卒業して、奇跡的にワシントン大学に受かった俺は、またインターンシップに応募した。俺は何か、DirectXとかグラフィックとか高パフォーマンス演算の分野に配属されることを希望した。しかし、俺はOffice部門で働くことになるのだと聞かされた。あんなにクソみたいなコーディング能力とは全く関係ない質問に何とか答えたというのに、もう興味はわかなかった。このめちゃくちゃ退屈な、給料払いだけはいい仕事は、本当に俺のやりたいことなのか?

これが、俺のMicrosoftでのキャリアの終わりだ。俺は心中喜び、馬鹿げた2Dグラフィックエンジンに精を出すことにした。大学のインターンシップの終わりに、俺は普通のプログラミングの仕事は、全く俺に合っていないと気がついた。数年後、どうやら俺は悲惨な列車事故をかろうじて逃れたらしいことに気がつく。

で、俺はワシントン大学のコンピューターサイエンス科からも蹴られるわけだが、まあ、それは、別の話だ。

No comments: