Facebook のリリースと文化
公開されたのはもう去年のはなしだけど、Facebook の リリースエンジニアリングの Tech Talk (予告編) は面白い。話している Chuck Rossi さんは Facebook のリリースエンジニアリングチームのリーダーだ。
彼は “The business requires change, but change is the root cause of most outages!” と話をはじめる。Facebook の規模で毎日変更をリリースするために、リリースのリスクをできるかぎり減らさなくてはいけない。そのために出てくるのが「文化」と「道具」だ。
文化
- 現在のソフトウェア開発では開発者と顧客 (your mom) の間に薄いレイヤーしかない: 昔は QA とかプロダクトマネジャーとかいろいろいたけど、いまは違う。
- ブランチとリリース: 開発者は trunk にコミットする。日曜日にその週のリリースブランチが切られて、火曜日にはそれが本番にリリースされる。水木金と次の月曜日は trunk からリリースブランチに、開発者がリクエストしたものが必要に応じて cherry-pick されて、火曜日にはまた新しいリリースブランチがリリースされる。
- テスト: 好むか否かに関わらず、社内では www.facebook.com は www.latest.facebook.com という本番 + リリースに含めるよう要求されている変更がふくまれた Facebook に飛ばされる。社員は全員バグを報告するし、Facebook の中に “Bugs Forum” という社員むけグループもある。
- Facebook.com はお前のサンドボックスじゃない: リリースは A1 (社内), A2 (一部のマシン), A3 (全体) の3段階をふんでいて、社員は www.inyour.facebook.com で A1 にいける。A2 で問題はおこすな。
- 世界はお前を見ている: なんかバカなことが起こったときに、それがどう広まるかお前は制御できない。TechCrunch とかのメディアはお前がやったどんな小さなミスも見ている。
- 各チーム (Feed, Search とか) には Oncall Engineer という (たぶん持ち回りの) 役割がある。なにかあったらリリースエンジニアリングチームはそこに連絡するので、彼らが緊急対応をして、必要な人に連絡して、といったことをしなくてはいけない。
道具
- IRC ボット: 自分のこのリビジョンが出るか、というのは request_bot に話しかけるとわかる。また、リリースする前には含まれているリビジョンの人達に request_bot から話しかけてきて、それに答えないとそのリビジョンはリリースに含まれない。
- Test Console: ブラウザを動かすようなテスト + 単体テストの結果が変更ごとに一覧できる (ブラウザまわりの話は Watir to WebDriver: Unit Test Frameworks も参考になる)
- Shadow Branch: リクエストされた変更をリリースに含めるときに、リリースブランチに変更を含めたものをテストして、大丈夫だったものだけが含まれる (という話をしている気がするけど自信が無い)
- Error Tracking: エラーや警告は Web から一覧が表示できて、個々のエラーに対して HTTP リクエストの情報や、PHP のスタックトレース、その行を変更したリビジョンや人、レビュアーなどがわかる。また特定のエラーの時間ごとのグラフや、どの Tier (API, Web, モバイルなど) で起きているかもわかる。
- Gatekeeper: 社員かどうか? 国は? どこのデータセンタか? ホワイトリストやブラックリストなど、さまざまな条件でコードを出し分けする。社員にだして、大丈夫だから全体の 1% に出して、また 0% にしてデータをみて、というふうにリリースが出来る。
- Push Karma: 開発者ごとにつく危険度。ほかにも差分のサイズや、コードレビューソフトウェア 上での議論の量などをみて、変更をリリースに含めるかを考える。
- Perflab: 本番と trunk とのパフォーマンスの差を可視化したグラフをつくっていて、なにが起こっているかわかるようにしている。(trunk と呼んでいるけど、前の話からすると素の trunk にはリクエストは来ない気がする)
- HipHop for PHP: 有名な PHP -> C++ 変換ソフトウェア、だけどいまは The HipHop Virtual Machine にあるように一回 C++ にしない方向で進んでいるはず。
- BitTorrent: リリースのためのファイルの転送には BitTorrent をつかっていて15分くらいで送りきれる。
最後に、話はこう締めくくられる。
Tools alone won't save you. You need the right people, the right culture and the right company.
Tech Talk については (“The Agile Samurai” の) Jonathan Rasmusson さんも How Facebook pushes new code live に要約を書いているので、そちらもどうぞ。
文化の善し悪し
Facebook の社内の道具はすごく洗練されている。Facebook Enginnering で様々なマネジメントの職についていたという Yishan Wong さんも Tools Are Top Priority と書いている。
Writing great tools and continuing to improve and replace them is more important than the next shiny feature.
それなのに、道具だけではうまくいかないのだ、という言葉はだいぶ重い。
一方の「文化」というのは、善し悪しというのをひとえには言いづらい。ある文化はある種の人々を許容しないし、ある文化はある種のワークライフバランスを保つことを許容できない。でも、それをもってその文化を「悪い」とは言えないと思う。
「良い会社」という文化と「良いソフトウェアを作る」という文化と「Facebook を作る」という文化は、重なるところもあるけど重ならないところもある。「Facebook を作る」文化の許容度というのは、とても狭いんじゃないだろうか。
ArsTechnica の Exclusive: a behind-the-scenes look at Facebook release engineering も同じくリリースエンジニアリングチームへの取材で、内容は Tech Talk とかぶるところも多いけど、文章なので読みやすい。 新キャンパスでチームは、部屋の区切りをうまいこと改造して “Hotfix Bar” と称している。バーだけあってお酒もあるんだけど、実はそれはお供え物だ。
Employees with low karma can regain their lost points over time by performing well—though some also try to help their odds by bringing Rossi goodies. Booze and cupcakes are Rossi's preferred currency of redemption; the release engineering team has an impressive supply of booze on hand, some of which was supplied by developers looking to restore their tarnished karma.
3ページ目 のこんな下りは、半分冗談もあるんだろうけど、ちょっと映画の “The Social Network” っぽいというか brogrammer じみていて引いてしまう。
Facebook はそれでも少しは楽しげで、Google 文化圏の、Web 系の新しい企業らしさがある。最近読んだ Adam Lashinsky の『インサイド アップル』なんかはだいぶ違っていた。
アップルで働くということが楽しいと言う人はほとんどいない。アップルは「楽しい」職場かと訊けば、答えは驚くほど一致している。
「みんな自分が手がけているすばらしいものに、信じられないほどの情熱を傾けているよ」。ある元社員はいった。「成功を認めあって祝う文化はない。大きな意味を持つのは仕事そのものだ」
別のひとりも次のように言った。
「もし筋金入りのアップル・ファンだったら、魔法のようにすばらしい職場だよ。でも同時に、本当に仕事がきつい職場でもある。製品を発案から発売まで持っていくわけだから、どれだけ残業しても足りないくらいだ」
3人目も同じように質問をはぐらかした。
「みんなアップルに情熱を燃やしているから、会社のミッションにぴたりと足並みがそろっている」
この文化と、例えば (なぜだか Apple 製品を使うひとが多い) Agile を喧伝する人の「いきいき」した文化とは大分開きがあるだろう。でもこれが Apple 製品を作るのには必要な文化の一部で、それで良い製品を作ることが出来て、なかで働く社員も納得しているのなら、なにかと比べて善し悪しをいうものではないと思う。