COOKPADセミナーに行ってきた

タイトル「524万人が利用する食のインフラ「クックパッド」のものづくり」
クックパッド CTO 橋本健太氏


KBMJの関連会社WebCareer主催のCOOKPADセミナーに行ってきた。
集まった参加者は150人以上、単一セミナーとしては大盛況。

クックパッドとは

  • ミッション「毎日の料理を楽しみにすることで心からの笑顔を増やす」
  • オープン:1998年
  • 月間ユーザ数524万人 (Railsサイト 世界第6位)
  • 20〜30代の女性中心
  • 30代女性の4人に一人が使っている
  • 月間2.8億PV(レシピサイト 世界一)
  • 16=18時がピーク
  • 1年間で1.6倍で会員数増加

524万人をささえるサーバ・ネットワーク

サーバ構成
  • webサーバ(Apache):8
  • APサーバ(Mongrel):44
  • DBサーバ(MySQL):13
    1. α(検索、バッチ....)

上記は論理的なもので、実際は仮想化している(?)

ソフトウェア構成
  • Web:Apache2.2.3
  • Ap:Rails2.0(もうすぐ2.1にする予定) + mongrel_cluster + mod_proxy_balancer
  • DB:MySQL(tritonn)
  • capistranoやgodを運用で使用。

パフォーマンス改善

キャッシュ、クエリチューニング、DB分割の三本柱

キャッシュ

Mongrelを介すとパフォーマンス低下→ページキャッシュ中心
ページキャッシュできないもの(ユーザごとの表示、アクセスログ、広告)はAjaxの1リクエストで取得している。

クエリチューニング

FiverRunsTuneUpを使用。

DB分割

初期構成(仮想サーバ上)
この構成では性能がでない。ヤバイ!

app 2G
app 2G
slaveDB 8G
検索DB 4G


検索とslaveを統合することに
OSのキャッシュもあり、I/Oが大幅に改善

app 2G
app 2G
検索+slaveDB 12G

Railsでの開発ノウハウ

開発環境
DBレプリケーション
  • マスタとスレーブの切り替えにはact_as_readonlyableを使用
全文検索
  • Tritonnを使用
  • MySQLを拡張しているので、テーブルをJoinできる
  • 2インデックスで検索可能
  • インデックスを張ったテーブルのファイルをそのままslaveに渡して他のバッチ処理を行っている
専用URL
  • 一部のユーザは自分専用のURLを持つ(ex:http://cookpad.com/ken)
  • routes.rbで調整→当てはまらない場合は専用コントローラに振り分ける
全ページのプレビュー機能

「○月○日○時〜○時の状態を見たい!」(TV連動)
→全てのページで任意の日付を指定してプレビュー
→Time.nowを置き換えて実現(※アクセス制限で一般ユーザには見られないようにしている)

COOKPADのものづくり

  • つくるものを決める
  • 計画
  • 設計
  • 開発
  • 質を高める
つくるものを決める

○Bestなことに集中する

  • Betterはやらない
  • Bestなものを見つけるために→3つの輪○
  • やりたい「情熱を持って取り組めること」
  • できる「世界で一番になれること」
  • やるべき「儲かること」

○ユーザの欲求にもdと付いたゴール設定
EOGS(EmotionOrientedGoalSetting)

  • そのサービスに関わるキャストをたて
  • キャストごとの疑いようのない欲求を洗い出し
  • 全ての欲求を満たす解決方法を模索
  • 個々の解決方法を満たす方法を模索
計画する

○スケジュール3分割の法則
「設計、開発、質を高める」全てに同じだけの時間をかける
→これを満たすために

  • 1週間の開発で出来るように設計
  • 不必要な機能は削り、Bestに集中する
  • 設計にも1週間をかける
  • 質を高める作業にも同様

クックパッドものづくり3原則
(1)無言実行

  • 公開前にサービスの説明をしない→リニューアルの日程を伝えなかった
  • 言葉ではつたわらない→変なイメージや不安感を持たれる
  • 公開前告知のメリットは無い

(2)無言語化

  • 機能を言葉で説明しない→一瞬で理解できるインターフェースじゃないと使われない。最大2秒
  • ヘルプやFAQを読ませるのはユーザの負担→そもそも、読まれない

(3)サービスには必ず値段をつける

  • どんなサービスでもいくらの価値があるか値段をつけて考える
  • 「無料だから大丈夫」というサービスは負ける→無料だというだけでは使われない→お金を払ってでも使いたいサービスが無料だと使われる
  • Web以外のサービスやモノには必ず値段がついている
  • クックパッドは当初は有料サイト

設計する

○サイトの設計の順番

  • 広域から詳細へ
  • 詳細から設計すると機能にとらわれてしまう

○設計に最低限必要なモノ

  • 遷移:どんなに良くできたページでも遷移がおかしいとユーザが目的の行動
  • ページ詳細:A4横、余白を左右に残す
  • サイトマップ:※規模が大きい場合
開発

○開発三原則

クックパッドの課題→あまりテスト書かれていない(functionalテスト中心?)
2006年にリニューアルしたコードは2年でメンテ不可だった

質を高める

ユーザビリティが最優先
○ユーザテスト

  • バグの発見よりもユーザに狙った価値を提供できているかを重視
  • ユーザ(役?有志?)にゴールを伝えて行動してもらう
  • 質問には答えない→質問が出る遷移、IFは失敗
  • ユーザに何を考えて行動するか聞く

○顔マーケティング

  • かうきの法則(顔、ウリ、効き)

エンジニア紹介

  • 根岸氏→広告関連のアドエンジニア:細胞の可視化プログラミングを
  • 須藤氏→ユーザ向けサービス担当→元プログラマ
  • 高田氏→インフラ担当→AwardOnRailsでhightime.jpで受賞。元Javaプログラマ
  • 山田氏→インフラ担当→コミュニティに多く参加。日本Linuxユーザ幹事...
  • 森田氏→今週入社→キャッシュ周り実装
  • 中村氏→スーパーインターン(現在修士)

COOKPADで働きたいエンジニアは是非来てください!

質疑応答

QAの両方を覚えているモノだけ。

Q.見てもらえない(PVがほとんど無い)ページってどのくらいあるの?

検索で偏らないようにはしている。結構まんべんなく見られてるよ!

Q.なぜRailsを採用したの?
  • 2006年リニューアルの開発(2005年)でRails(β)のことを知っていた。→使ってみたかったが過去事例とかもないし断念。
  • 2008年リニューアル開始の時にはRails事例も増えてきた。→GO

懇親会

この手のセミナーでありがちなグダグダな間の中、隣にいたid:raituと話す。

  • ふむふむ組み込みエンジニアなのね。
  • 組み込みなの開発なのにNUnitでテスト駆動か。凄い!
  • ・・・(自粛)何で君はこのセミナーに???

懇親会の終わりに橋本さんと少々会話。

  • やはりPassengerについて他の人からも聞かれることが多かった。
  • Mongrelはよく落ちるけど、godで自動再起動かけているんで運用的な負担はそこまで無いらしい。

まとめ

  • なによりユーザビリティを超重要視しているのが印象的。(使用するユーザ層が若い女性というのもあるんだろう)
  • 全体的に「自社サービス開発手法」の方に焦点があたっていたので、今度は技術よりの話を聞いてみたい
  • 現場レベルの空気をもう少し知りたかった(Tracの運用方法、開発現場写真、開発者間のやりとり方法...)
  • いつも思うのだが、懇親会でのあの微妙な空気を出さない方法は無いだろうか・・