クックパッドの裏側お見せしますを見てきた

秋葉原UDXで開催されていたWebディベロッパの祭典@東京に行ってきました。

毎回、会場がどんなところか楽しみなのですが、今回のセミナーがあったB会場は通路に無理やり作りました
みたいな場所にあったので、びっくり。。。。

とりあえず、聞いてきた話をメモしておきます。


今回の話とは違いますが、カカクコム&クックパッド共催・勉強会の際の資料がslideshareで公開されていますでの、
見ると雰囲気が伝わるかもしれません。

クックパッドのRailsリニューアル

クックパッドとは

  • 「毎日の料理を楽しみにすることで心からの笑顔を増やす」を目標
  • 1998年にオープン
  • 2008/7にRuby on Railsでリニューアル
  • おいしいものができたとき「レシピをのせる」
    • 料理レシピを作って整理
    • みんなに公開
  • おいしいものを食べたいとき「レシピを探す」
    • 47万品のレシピから今日食べたいものを探す
    • 作った写真をレシピの作者さんに報告することも

サイト規模

  • 月間ユーザ数547万人
  • 月間2.8億PV
    • Railsサイト中 世界3位
  • 生活に密着したサイトなので16時〜18時が負荷のピーク
  • 秋からバレンタインにかけてトラフィックが伸びる

547万人を支えるサーバ/ネットワーク

パフォーマンスについて

  • キャッシュ
    • ページキャッシュはNFSにストアして直接Apacheから返す
      • mongrelを通すだけで10msぐらい掛かるらしい
    • 更新処理などのあるページはフラグメントキャッシュでmemcachedを使用
    • ページキャッシュできないユーザ毎に異なる部分、アクセスログ、広告はAjaxで1つのリクエストで。
  • クエリチューニング
    • FiveRuns TuneUpを活用
    • MySQLのスロークエリログ
  • DBとメモリ
    • アクセス数よりもデータ量がパフォーマンスを低下させる
    • OSのキャッシュにデータファイルが乗り切るかが重要
      • リニューアル直後にOSのキャッシュに乗り切らないデータ量があり、パフォーマンスが出なかった

Railsでの開発ノウハウ

  • プログラマは全員Macを使用
  • Emacs + rails.elで開発
  • バージョン管理はSubversiontrac
  • Shinjikoでコードレビュー
  • DBのmaster、slaveの切り替えにacts_as_readonlyableを使用
  • レシピ等の全文検索Tritonnを使用
    • MySQLを拡張しているので、テーブルをジョインできる
    • 2インデックス(1つのテーブルに対して、2つのインデックスを使用可)
    • インデックスを貼ったテーブルのファイルをそのままコピーできる(作成時間が減少+更新ロック対策?)
  • 一部のユーザは自分専用のURLを持っている
    • routes.rbですべてのコントローラ名を検索し一致しない場合に専用のコントローラに渡している(最初の1回だけ実行される)
  • 全ページプレビュー機能
    • すべてのページで、任意の日時を指定してプレビューできる
    • Time.nowを上書きで実装
    • アクセス制限あり

クックパッドのものづくり

  • 作るものを決める
    • Bestなことに集中する
    • Betterなこと、やった方がいいことはやらない
    • やりたい(情熱を持って取り組める)、できる(世界で一番になれる)、やべるき(儲かること)、この3つを満たすことのみをやる
  • ユーザの欲求に基づいたゴール設計
    • EOGS(Emotion Oriented Goal Setting)
      • そのサービスに関わるキャストを立てる
      • キャスト毎の疑いようのない欲求を理解する
      • 疑いようのない欲求、何をすれば手に入るか、How to do?、成功のイメージ、指針
  • 計画する
    • 設計、開発、質を高めるの3つ工程に分け、それぞれに同じ時間を掛ける
      • 3週間後にサービスインする場合は、1週間で開発が終わるような設計にする(不必要なものは削り、Bestに)
  • クックパッドもの作り3原則
    • 無言実行
      • 公開前にサービスについての説明はしない
      • 公開前に告知すメリットは無い
    • 言語化
      • 機能を言葉で説明しない
      • 2秒でわかるインターフェイス
      • ヘルプやFAQを読ませるのは負担(そもそも読まれない)
    • サービスに値段をつける
      • どんなサービスでも幾らの価値があるか値段をつけて考える
      • お金を払ってでも使いたいサービスが無料だと使われる(無料だからという考えでは負け)
      • Web以外のサービスやモノは価値に対して値段がついている
      • サービスを言葉で説明することはできない(ユーザに不要な不安感を抱かしてしまうかも)
  • 設計する
    • 広域な設計から詳細へ
      • 詳細から設計すると機能にとらわれる(ユーザに届けるべきものは機能ではなく価値)
    • 設計に最低限必要なもの
      • アジャイル宣言の一節「包括的なドキュメントよりも動くソフトウェアを重視する」
      • 画面遷移、ページ詳細、DB構造、サイトマップが最低限必要なドキュメント
  • 開発する
    • Railに乗る
      • 外れると早いRailsのバージョンアップへの対応が困難
      • 外れないようにRailの機能でできないか、外れない代替案がないかを探す
    • リファクタリングしつづけられる状態を保つ
      • テスト駆動により可能(現在はあまり実践できてない)
    • DRY(Don’t repeat yourself)
      • 同じことを2度しない
      • YAGNI(You Aren’t Going to Need It)に注意
  • 質を高める
    • ユーザテスト
      • バグの発見よりもユーザに狙った価値を提供できているか
    • ユーザにゴールを伝えて行動してもらう
      • 質問などには答えない、質問が出るような遷移、インターフェースは失敗
    • マーケティング
      • ウリを伝える「顔」
      • ライバルに勝てる「ウリ」
      • ウリが実感できる「効き」

感想とか

クックパッドのもの作りの姿勢は非常に良いですね。学ぶべきところが沢山あります。
アジャイル云々言い出すと、エンジニアの自己満足に結びつくケースもあったりするのですが、
きっちりとユーザに対して正面を向いて、ユーザにとっての「価値」を追求している。見事です。
このような技術的な話ではなく、サービスを作る上での心構えや姿勢などは、エンジニアの方だけではなく
企画職の方にも聞いて頂きたい内容だと思います。(特に私の会社では!!)


今回のセミナーでは、これ以外にもいくつか聞いてきたのですがこれを書いていたら長くなったので、割愛いたします。。。
気力があれば、書くかもしれません。

その他

今回から対勉強会用汎用決戦兵器としてpomeraを導入しました。
普通にノートにメモを取るより早くていいですね。単4電池2本で20時間持つので、バッテリーの心配も少ない。

今回のB会場では、テーブルが無かったのですが、それでも打ちにくいとはあんまり思いませんでした。
キーが打ちやすい云々は人の好みによるところが大きいのですが、雑食な私には無問題。慣れの問題です。

会場の照明が落とされたときには、バックライトがないのでオワタ\(^o^)/と思いましたが、
後ろからちょっとだけ漏れている照明の明かりをうまく拾ってなんとか凌ぎました。

普通にノートPCでメモ取っている人はそこそこ居ましたが、pomeraを使っている人は見かけませんでした。
一部で話題にはなったけど、まだまだ普及しているとは言えないということでしょうか。