Skip to content

Instantly share code, notes, and snippets.

@yuskesuzki
Created July 30, 2011 06:35
Show Gist options
  • Save yuskesuzki/1115268 to your computer and use it in GitHub Desktop.
Save yuskesuzki/1115268 to your computer and use it in GitHub Desktop.
で、これらのより詳しい所については、「ウェブオペレーション」っていう、弊社の濱
崎というのが、「日本の料理のインフラ」という事で、インフラ寄りの細かい事を書い
てるので、外のジュンク堂で売ってるので、ぜひ皆さん、興味があったらご購入くださ
い。
それでは、続きましてCOOKPADの開発についての話です。
で、COOKPADはエンジニアがこれだけいて。
今は30人以上のエンジニアがRailsアプリの開発などに日々とりくんでいます。
ちなみに、この内8人が外国のエンジニアで、だいたい3割ぐらいが今は外国のエンジ
ニアみたいになっていますね。
そうすると、Railsのアプリっていうのを、1人2人とかじゃなくて、ホントに30人と
かで、多人数で開発することになってる…なっちゃうんですよ。
で、やっぱり多人数で開発すると、それぞれ、速度の面で、1個の…ってか、複数のア
プリをいじるっていうのが、すごいデメリットになってしまうんで、みんながみんな開
発して、その開発スピードをいかに落とさないで、どんどんどんどん開発サイクルを回
していくかっていうのが鍵になります。
で、Webの開発には、僕はすごいWebの開発のサイクルがあるなぁと思っていて。
で、どんなものなのかっていうと、開発…一番上の「開発・Dev」って書いてあるのは、
開発や実装を行って、なんか機能をつけるっていうフェーズと…。
続いて「デプロイ」っていって…ステージングサーバーとかプロダクションにリリース
をして、実際にユーザにあてるって所と…。
実際にデプロイした機能を「フィードバック」、ユーザさんがどれだけ使ってくれたか、
どれだけ有効に活用されてるのか…っていうフィードバックを受けて、また開発のフェー
ズに行って、開発の所でまた開発をして…っていう、こういうグルグルグルグル輪っか
があると思っていて、この輪っかをどれだけ早く回せるかっていうのが、Webの開発に
おいて…ユーザさんから受ける開発において、すごい重要になってくるかなぁ、と思っ
てます。
で、まずは「開発」の話なんですけど、まあ皆さんご存知の通り、複数人同時開発だと、
もうテストを書かないと、やってられないような感じになります。
で、テストを書いて、もちろんCOOKPADもテストを書いてテストを回しているんですけど、
テストの中では…実行ではRSpecの、いまRailsの2.3系なので、RSpecの1.x系を使ってい
ます。
で、普通にUnitテストや、Functionalテストや、Integrationテストを書いています。
で、これらのUnit Funcional Integrationなんですけど、ちょっとCOOKPADも、一昔前は、
フォントの大きさで表現してるんですけど、だいたい、こんな感じの比率で、Unitが3
割、Functionalが6割、残りちょっとがIntegration、みたいな感じの比率で書いていま
した。
ただ最近は、ここらへんの割合がけっこう変わってきたかなぁと思っていて、Unitテス
トとIntegrationテストをだいぶ書くようになってきました。
もうここの部分って、入口と出口の部分なので、最近はここを重点的に書いています。
で、特に、Web開発でIntegrationテストっていうのは、より最近重要になってきていて、
なぜならば、僕らの開発にかかせないファクターとして、一個、JavaScriptを使った実
装という所がかえってきます。
で、僕らはやっぱりユーザさんに機能を作って、JSを使った込みの機能っていうのも、
書いたりするんですけど、その部分でJavaScriptのテストも込みで書けないと、けっこ
うツラくなってくるので、JavaScriptのテスト込みで書けるIntegrationテストを採用し
ています。
で、最近ですと、capybara-webkitっていうソリューションが出てきていて、capybaraっ
ていうIntegrationの、Integrationテストを行うためのツール…ライブラリがあるんで
すけど、それらは、まあ、Seleniumドライバーとか、いろいろなJavaScriptの実行エン
ジンをサポートしているんですけど、そこに最近は、webkitが入ってきて、webkitの裏っ
かわを利用して、テストを行うようなことが可能になりました。
で、これは非常に最近のWeb開発と相性がよくって。
スマートフォンのWeb、要するに、iPhoneとかAndroidのブラウザーとかって、けっこう
やっぱりJavaScriptを対応するようになってきてるんですよ。
で、これらって、ブラウザの実行エンジンはwebkitなんで、capybara-webkitでJS込みの
Integrationテストを書けるって事が非常に開発サイクルで回していく上で、一番出口の
部分の重要な部分をギュって押さえられるのかなぁと思っていて、その部分をけっこう
最近は割と重点的に書くようになってきました。
で、また、テストなんですけど、30人以上エンジニアがやっぱりいると、どんどんど
んどん自分の機能を担当している所で、Specが増えてくるんですよ。
で、これがCIの、テストの実行処理速度なんですけど、どんどん右肩上がりになっていっ
ちゃって、で、こうなるとけっこうエンジニアが「わー!!おせぇー!!!」…みたい
な感じになって、なんかもう、開発がうまくできない感じになってしまいます。
で、一時期遅いときとか、エンジニアがローカルのマシンで動かすと、20分以上テス
トがかかって、それだとやっぱり、pushする前に20分かかるってなると、なんか軽い
ティーブレイクみたいになっちゃって、だいぶ開発が遅くなってしまっていました。
で、COOKPADでそのうちとったソリューションの解決方法なんですけど、テストをリモー
ト上で実行するという解決方法で解決を行っていて。
remote specって社内で使っているライブラリがありまして、で、これは、テスト用の
サーバを用意して、テスト用のサーバに、一気に自分のローカルのソースコードをrsync
で同期して、テストの…test sshd allを走らせて、結果をマージして、テストを実行す
るみたいな感じのコマンドになっていて、普通にrake cookpad:spec:remoteとかってや
ると、全部のテストをリモートのサーバーで走らせることができます。
で、現状は4個のサーバ…8コアの4個のサーバを利用して、32並列実行でテストを
行うことによってテストスピードがだいぶあがって、だいたい最終的に19.2倍ぐら
いの早さになって、50秒ぐらいでテストが全部終わるようになりました。
で、これらのすごい細かい事については、「大江戸Ruby会議」の01で、「高速なテス
トサイクルを回すには」ってことで話したので、ぜひ、テストの高速化に興味がある人
は、この辺を読んでみてください。
@yuskesuzki
Copy link
Author

99行目、「test sshd all」という所が怪しげなので、どなたかご指摘願います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment