524万人が利用する食のインフラ 「クックパッド」のものづくり セミナー

日本一のRailsでの大規模サイトである「クックパッド」のお話を聞きに,WebCareer主催のセミナーに参加してきました.

クックパッドとは

  • ミッション:毎日の料理を楽しみにすることで,心からの笑顔を増やす
  • 1998年オープン
  • 料理のレシピを
    • 公開する
    • 探す
      • 作者に報告することもできる
        • 写真付きで
  • 45万品のレシピがある
  • 524万人/月
    • 四国の人口よりも多い
  • 月間 2.8 億 PV
トラフィック
  • 16〜18 時がピーク
  • 秋からバレンタインにかけてトラフィックが伸びる

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

サーバ構成
  • apache x 8
  • app x 44
  • master x 1
  • log master 1
  • slave x 13
  • Apache 2.2.3 / Rails 2.0 / Tritton
運用
  • capistrano
  • god
  • nagios
  • munin(モニタリング)
  • FiveRuns Manage(モニタリング)
パフォーマンス
  • キャッシュ
    • Mongrel を通るだけで 10ms は空
    • なので,ページキャッシュをメインに実装中
    • ページキャッシュできない3つのもの
      • ユーザ毎に異なる表示のもの
      • アクセスログ
      • 広告
      • これらは Ajax の1リクエストに埋め込んでいる
        • ページキャッシュから Ajax を使ってリクエストする
  • クエリチューニング
    • FiveRuns TuneUp
    • スロークエリログ
  • DB 分割
    • リニューアル前
      • app(2GB) x 2 + slave(8GB) + 検索 db(4GB) on 1 VM
    • リニューアル後
      • app(2GB) x 2 + slave(12GB) on 1 VM
    • OSのキャッシュにのるかが重要
    • アクセス数よりもデータ数の方が負荷には重要な要素となる

Railsでの開発ノウハウ

開発環境
DBのレプリケーション
  • acts_as_readonlyable を使用
    • ただしデータ更新後の SELECT は master から行うように変更
レシピの全文検索
  • Tritton を使用
    • 2インデックスを使って検索できる
    • バッチ計算サーバでインデックスを張って,それをそのまま scp で slave へ転送したりしている
専用 URL
  • routes.rb で解決
    • 既存コントローラの一覧を持っていて,存在しないコントローラの場合は専用のコントローラに渡して処理する感じ
全ページのプレビュー機能
  • MM/DD HH 〜 HH のみ表示
    • すべてのページで任意の時間を指定してプレビューできるようにしている
      • Time.now を書き換えている
      • スタッフのみにはしている

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

方法
  • つくるものを決める
  • 計画
  • 設計
  • 開発
  • 質を高める
作るものを決める
  • Best なことに集中する
    • Betterなこと,やった方がいいことは やらない!
    • Best なことを見つけるための3つの輪
      • やりたいことかどうか
        • 情熱を持って取り組めること
      • できる
        • 世界で一番になれること
      • やるべき
        • 儲かること
      • この3つの輪が重なることだけをやる
        • 非常にわかりやすく理想的な形ではないでしょうか
ユーザの欲求に基づいたゴール設定
  • EOGS(Emotion Oriented Goal Setting)
    • ユーザ層を決める
    • ユーザの欲求を理解する
    • 解決法を探し
    • それを実行する
  • ゴール設定をするなかで,チーム内で意見を自然に集約されていく.
スケジュールの3分割
  • サービス完成までにやるべきこと
    • 設計
    • 開発
    • 質を高める
      • これら3つについて,同じだけ時間をかける
  • 3週間後にサービスインするならば,すべて1週間ずつ
    • 1週間で開発できないことは設計しない
    • 設計にも1週間使う
    • 質を高めるのに1週間を使うのは,非常にいい体制
ものづくりの3原則
  • 無言実行
    • 公開前にサービスについての説明しない
    • サービスを言葉で説明できない
      • ユーザに変な不安を与えないため
    • 公開前に告知するメリットはない
  • 言語化
    • 機能を言葉で説明しない
    • 一瞬で理解できるインターフェイスじゃないと,使われない.最大2秒
      • 2秒で説明できるように作る
    • ヘルプやFAQを読ませるのはユーザに負担
      • そもそも,読まれない
  • サービスに値段をつける
    • どんなサービスでも,どれだけ価値があるか値段をつける
      • 「無料だから大丈夫」という考えでは負ける
      • お金を払ってでも使いたいサービスが無料だと使われる
    • ウェブ以外のサービスやモノは価値に対して値段がついている
      • そこと勝負するためには,作るモノに値段をつけて価値を与えないといけないのかな.
    • クックパッドは当初は有料サイト
設計する
  • サイト設計の順番
    • 広域から詳細へ
    • ユーザに届けるべきものは,「機能」ではなく「価値」
  • 設計に最低限必要なもの
    • アジャイル宣言の一説
      • 「包括的なドキュメントよりも動くソフトウェアを重視する」
        • これは「ドキュメントがない方がいい,なくてもいい」わけではない
    • 最低限必要なドキュメント
      • ユーザの遷移について
        • ユーザの理解できる遷移でなければならない
          • ページ詳細までは考えない,大枠の遷移
      • ページ詳細
      • DB 構造
      • サイトマップ(規模の大きな開発の場合)
開発する
  • Railに乗る
    • Railを外れると
      • 明日の自分は他人と考える.コードが読みにくくならないように.
      • Railsのバージョンアップへの対応が困難になる
    • Railを外れそうになったら
      • Railsでできないか調べ,
      • Railsで代替案を探す
  • リファクタリングし続けられる状態を保つ
    • アジャイル開発のもっとも大切な概念
    • テスト駆動による開発
    • 2006年にリニューアルしたコードでは,2年で拡張が不可能に
  • DRY
    • やり過ぎると YAGNI(You Are not Going Need It) = いずれ必要でなくなる
質を高める
  • ユーザテスト
    • バグの発見よりも,ユーザにねらった価値を提供できているかが重要
    • ユーザにゴールを伝えて行動してもらう
    • ユーザに何を考えているかを話しながら操作してもらう
  • マーケティング
    • 「かうき」の法則
      • 売りを伝える「顔」
      • ライバルに勝てる「売り」
      • 売りが実感できる「効き」

エンジニア紹介

  • 紹介が続く

エンジニア募集

  • 募集中

感想とまとめなど

ユーザ本意でありながら,会社の利益も重視する方法論は非常に共感できる,いい考え方だと思いました.
その上で思想を持った開発体制を敷いているようなので,今後の展開に期待と言うところでしょうか.

あと Mac + Emacs で開発環境を統一しているのはいい感じですね,Emacs 使いとしてはw