新サービス立ち上げ時の重要指標のデザイン

こんにちは、株式会社ビットジャーニーに出向中の出口 (@dex1t) です。ビットジャーニーでは、社内情報共有ツール Kibela*1のサービス設計やプロダクトマネジメントに責任を持ちつつ、エンジニアとして開発全般に携わっています。

今回は、新サービスの立ち上げ時にどのような考えで重要指標*2を設計し、それを実際の開発のなかでどう使っていくかという話をします。

なぜ検証をするのか

そもそもなぜ新サービス立ち上げ時に、重要指標や検証といった考えが必要になるのでしょうか。それを考えるにあたって、クックパッド的なサービス開発の流れを改めて整理してみます。

企画と検証は表裏一体

サービス開発といえば、企画・開発・検証をぐるぐる回すというのが一般的だと思います。指標は検証段階で活用する道具です。企画で考えたことを確かめるのが検証段階であり、企画と検証は表裏一体です。 したがって、指標の設計をするにあたっては、その前段階である企画段階について抑えておくのが重要です。

サービス企画には様々な方法論があると思いますが、「何を作るべきか定義する」ことは、どんな方法にも共通しているのではないでしょうか。クックパッド内でもやり方は様々ですが、私の場合は次のような流れで定義しています。

  1. 思想を定める
    • サービス価値、目指す世界観を定義する
  2. 体験を定める
    • サービス価値を実現するためにどんな体験が必要を定義する
  3. 機能を定める
    • 体験を提供するためにどんな機能が必要か逆算する

これらをフォーマット化したものが、この開発者ブログでも何度か紹介されている、アプリケーション定義ステートメントシートEOGSです。上記3点を抑えられれば、フォーマット自体は自分の慣れたものを使うのが一番だと思います。

思い込みを確かめる

ここで大切なのは、企画はあくまで開発者の思い込みであり、企画を具現化した後にはそれを確かめる必要があることです。先に挙げた3点で言えば、次のような確かめどころがあります。

  1. 提供している「体験」が、「思想/価値」を実現できているか
    • 例) 「今晩の献立がすぐに決まる」体験は、「毎日の料理を楽しみにする」という価値に繋がっているか
  2. 提供している「機能」が、「体験」に寄与しているのか
    • 例) 「人気順検索」機能は、「今晩の献立がすぐに決まる」体験に寄与しているのか
  3. 提供している「機能」は、意図通り「機能」しているのか
    • 例) 「人気順検索」機能は、どんな人にどれぐらい利用されているか

1.を定量的に正しく検証するのは難しく、定性的手法での検証が向いていると思います。本エントリは指標を使った定量的な検証の話なので、2.と3.について考えます。

指標をみる2大シーン

先の2.と3.の言い換えになりますが、指標をみる2大シーンとして次が挙げられます。

  • 機能が定めた体験に寄与しているか (線の検証)
  • 機能 (feature) が機能 (work) しているか (点の検証)

クックパッドにおけるレシピを探す体験を例にすると、次のようなイメージです。

f:id:dex1t:20160830043356p:plain

一般的に「検証」というと、CTRなどの比較によるA/Bテストを思い浮かべるのではないでしょうか。それはあくまで「点の検証」であり、ある機能の最適化はできても、その機能が体験全体にとって必要かどうかは判断が難しいところです。

サービスの立ち上げ時は、ある一点の機能だけを磨きこむことに集中するよりも、定めた体験がそもそも正しいのかをまずは確かめるべきだと私は考えています。これは、ほとんどの新サービスの場合、一機能の良し悪し以前に、定めた体験がユーザーの欲求に合致していないことが多いからです。そのため、サービスの立ち上げ時こそ、「線の検証」を重視すべきだと考えています。

何を測るのか

それでは先に挙げた、体験 (線) の検証をするためには、具体的に何をすればいいのでしょうか。

体験の定義としてのユーザーストーリー

体験 (線) を検証するためには、まずはその体験の定義が必要です。定義の表現方法には様々な手法があるかと思いますが、私のプロジェクトでは、複数のシナリオから成るユーザーストーリーを書いています。ユーザーストーリーとは、ざっくり言えば、開発者が頭のなかに描く「サービス上でユーザーはこう考えて、こう行動する」という妄想を文章にしたものです。

敢えて妄想と書いたのは、サービス開発初期はユーザー理解がまだ浅いことが多く、ストーリー自体の妥当性は低いと考えられるからです。あくまで妄想ですが、文書化やそのレビューを通して、ユーザーに期待する行動についての認識が、チーム内で統一される効果は得られます。チーム内での認識のブレは、新規サービス立ち上げ時に立ち向かうべき問題の1つです。これを解消できるのは大きな効果です。

ユーザーストーリーの構成

サービス開発初期のユーザーストーリーは、未検証であることは自体は仕方がありませんが、それでもあまりに現実味が無さすぎると使い物になりません。そのため、書き方には注意が必要です。ユーザーストーリーを構成するシナリオは、次の2つを分けて書くようにしています。

  • アクティビティシナリオ
    • ユーザーの心情と行動にフォーカスして書いたシナリオ
    • クックパッドではセリフ調で書くことが多いです
    • 例) (仕事帰りに) 今日の晩ごはんどうしよう。たしか冷蔵庫に茄子があったから消費したいな。へー茄子のチーズ焼きか。簡単そうだし美味しそう!帰ったら作ってみよう。
  • インタラクションシナリオ
    • 目的を達成するための、サービス上での具体的な操作を書いたシナリオ
    • 例) クックパッドiOSを開く、検索ボックスをタップ。茄子と入力し検索する。人気順検索の1位になっていた茄子のチーズ焼きのレシピをタップ。材料欄と手順欄をスクロールして確認し、MYフォルダに保存。

アクティビティシナリオを書く上での注意点は、具体的な操作名や機能名を出さないことです。つい「この導線をクリックする」のような表現を使いがちですが、普段の生活の中で導線やクリックといった言葉は使いません。結構書くのがしんどいのですが、ここでのシナリオに現実味が感じられない場合は、おそらく実装しても同じことが起きるでしょう。

このようにユーザーストーリーを書く上では、アクティビティとインタラクションを区別すること、そして何より、開発を進める中で深まったユーザー理解を随時ストーリーに反映し、妥当性を高めていくことが重要です。

どのストーリーを検証すべきか

ストーリーといっても、多くの場合サービス上には無数のストーリーが考えられます。サービス上の登場人物 (キャスト) が多ければ多いほど、ストーリーも増えていきます。例えば、私が今携わっている社内情報共有ツール Kibelaでは、社内ツールという性質上、「記事を閲覧する人」「記事を投稿する人」だけでなく、「Kibelaを社内で管理する人」といった、多様なキャストが存在し、そのそれぞれに提供すべき体験 (ストーリー) があります。

サービス立ち上げ初期は、全てのストーリーを網羅して検証することは難しいですし、検証だけに時間をかけることになると本末転倒です。そのため、このストーリーが欠けたらサービスが成り立たない、という一点にまずは集中して検証すべきです。

Kibelaの場合は、「記事を投稿する人」のストーリーにまずはフォーカスしています。情報共有ツールである以上、記事の投稿による情報共有が成立しないと元も子もないからです。このような考え方は、書籍『Lean Analytics』においてOMTM (One Metric That Matters) として紹介されています。書籍のなかでは、様々なサービスのOMTMが紹介されているので、指標を設計する上ではぜひ一読をオススメします。

どうやって測るのか

ここまでは設計の話でしたが、次は目指すべき体験 (ストーリー) に対する現状の達成度をどうやって測るかについてです。

これは、定めたインタラクションシナリオから、ユーザーの行動を抜き出し、それらを行動トラッキングツールで測ることで実現できます。クックパッドではそのツールとして、Mixpanelを使うことが多いです。具体的な方法については、データドリブンでユーザー体験を改善する試みのなかでご紹介していますので、よろしければご覧ください。

f:id:dex1t:20160830043937p:plain

重要指標を活用する

ここまでで体験を定め、ストーリーを通して指標化し、実際に数値として計測することができました。ここからは実際のサービス開発の中で、定めた指標をどう活用していくかについてお話します。

ダッシュボードでモニタリングする

サービス開発初期は、大胆なサービス設計の変更や、ユーザー層の変化など、指標に影響を与える要因が多く存在します。そのため、一度定めた重要指標は継続的にモニタリングしていくことが重要です。また、モニタリングする指標はダッシュボードとして、一箇所にまとめています。見るべき指標が色んなツール上にバラバラしていてアクセスし辛い状況だと、見ること自体が億劫になり、設計した指標も無意味になります。

Kibelaでは行動トラッキングツールとしてMixpanelを使っているため、ダッシュボードもMixpanel上に作りました。Mixpanelには、Platform機能というものがあり、これを使うとMixpanel APIを使って、Mixpanel上の値をよしなに操作した上で可視化しダッシュボード化できます。これがベストとは言えませんが、Kibelaでは見るべき指標をMixpanelに集約しているため、今のところ必要十分でした。

f:id:dex1t:20160830044006p:plain

意識せずに重要指標を見てしまう状況をつくる

詳しくは後述しますが、ここで定めた重要指標はチームの共通理解であるべきです。そのため、ダッシュボードを活用するのがチーム内でひとりだけだと不十分です。チームメンバーの日常の導線の中にダッシュボードを置き、意識せずに重要指標を見てしまう状況を作ることも大切です。

私のチームでは自分たちのサービスであるKibelaをドッグフーディングしているため、メンバーは常日頃Kibelaを見ています。手前味噌になりますが、Kibelaは社内ポータル的な使い方ができ、iframeで上記のダッシュボードをKibela内に埋め込んでいます。これで、毎日Kibelaを開く度に重要指標のグラフが目に飛び込んできます。

f:id:dex1t:20160830044019p:plain

また関連して、Statsbotを使って、重要指標のサマリーをSlackに定期的に流すといったこともしています。

f:id:dex1t:20160830054851p:plain

このようにして、サービスの健康状態をチーム全員が無理せず把握できるような状況を作っています。

毎週定例で分析し共有する

ここまで述べてきたような「体験 (線) 」は、「機能 (点) 」への変更の積み重ねによって変化が起きるものです。そのため、サービスのアップデート起因とは別に、定点観測的に分析をおこなっています。

Kibelaの場合は、毎週月曜日に定点観測しています。結果はドキュメントとしてまとめてチームメンバーに共有します。繰り返しになりますが、これも重要指標の理解を個人に留めずチームの共通理解にするための試みです。

f:id:dex1t:20160830044051p:plain

重要指標を軸にコミュニケーションする

基本的にサービス開発は、正解がない中での細かい意思決定の連続だと思います。そのため、チーム内で何らかの基準を持った上で、議論するのが大切だと考えています。ここで定めた重要指標はその際にも有用です。

タスクの優先順位付けや、製品仕様の決定、デザインの方向性の決定、カスタマーサポートの方針、などサービスに関係するあらゆることは常に重要指標を軸にして判断するようにしています。こうすることで、議論の方向性がブレず、意思決定の速度が上がると考えています。

まとめ

本エントリでは、新サービス立ち上げ時の指標設計とその活用方法についてご紹介しました。指標というテーマだったため、インタビューに代表される定性的な検証手法には触れませんでしたが、決して蔑ろにしているわけではありません。実際Kibelaでも、オンライン・オフライン問わずインタビューによる生の声は非常に重要視しています。定量と定性の両方の良さを組み合わせつつ、サービスの検証を進めていくことが重要だと考えています。

最後になりますが、クックパッドはもちろんビットジャーニーでも、デザイナー・エンジニアを募集しています。このようなサービス開発にご興味あるかたは、@dex1t までお気軽にお声がけください!

*1:8/1にティザーサイト https://kibe.la/ を公開したばかりのサービスです。現在、先行登録いただいた方にベータ版へのご招待を順次進めています。

*2:KPIやKGIといった用語とほぼ同義です

画像の認識・理解シンポジウムMIRU2016に参加してきました

こんにちは。人事部の小久保です。

8月1日(月)〜4日(木)の4日間、画像の認識・理解シンポジウムMIRUに研究開発部のメンバーと参加してきました。今回は、MIRUの内容やなぜ参加してきたのかについてご紹介したいと思います。

MIRUとは

今回で19回目を迎える画像の認識・理解シンポジウムで、画像の認識と理解技術に関する国内最大の会議です。

具体的には、研究者や技術者、学生が基礎から応用までさまざまな最新の研究発表をし、討論をする場となっています。今回は静岡の浜松で開催されました。

各自の発表内容は1枚のポスターにまとめられたものが展示されており、それぞれポスターの前で紹介する形になっています。発表やデモセッションに加えて、特別講演も別会場で行われました。

f:id:bonami:20160822155720j:plain

クックパッドの取り組み

クックパッドは今回初めてMIRUに参加したのですが、企業展示という形でブースで発表をしました。

f:id:bonami:20160822155746j:plain:w500

毎日午前中には、スポットライトセッションという形で、ブースで紹介している内容を30秒間宣伝できる時間もありました。

f:id:bonami:20160822155757j:plain:w500

なぜクックパッドが学会に参加するのか?

以前からクックパッドには研究開発グループという形で、研究を専門に担当しているチームがありましたが、7月から研究開発部という組織に変わり研究開発により力を入れていくことになりました。具体的には、画像や言語を中心とした機械学習や料理に関する研究を行っています。

そこで、研究開発をすることはもちろんなのですが、学会での活動も積極的に実施をしていくため、今回MIRUに参加をしました。

各研究室の取り組み

クックパッド以外にも多くの研究室が料理に関する研究を発表していましたので、いくつかご紹介します。

・東京大学 相澤研究室
東京大学の相澤研究室では食事記録アプリのログを分析するため、料理名を一般 化する研究を発表していました(例えば、「シュリンプエッグサンド」を「サンドイッチ」にする)。また、画像認識の精度を上げるため、個々人にパーソナライズした認識エンジンを作る研究も発表していました。

・電気通信大学 柳井研究室
電気通信大学の柳井研究室では、画像認識・画像変換をモバイルで実行するための研究をしていました。機械学習のモデルからC言語のコードを自動で作って、これを高速に動かすために行列の計算を並列化していました。また、Twitterの画像つき投稿を使って、「博多ラーメン」などの細かいカテゴリに画像を分類したデータセットを紹介していました。

・名古屋大学 村瀬・井手研究室
名古屋大学の村瀬・井手研究室では料理の撮影をサポートするため、料理の写真の魅力度を測る研究をしていました。料理を様々な角度から撮った画像のデータセットを作って、どのような特徴がその魅力度に関わるのかを発表していました。

・京都大学 美濃研究室
京都大学の美濃研究室ではレシピナビゲーションシステムを研究していました。カメラで現在の調理行動を認識し、次の手順をナビゲーションしてくれるものでした。発表では実際にトマトやアボカドを調理することで、ナビゲーションの様子を見ることができました。

・大阪府立大学 吉岡・井上研究室
大阪府立大学の吉岡・井上研究室ではレシピ動画を自動要約するシステムを研究していました。ヘッドマウントカメラを使って調理中の手元の動きを撮影し、画像から抽出した手の領域から現在の調理行動を識別する実験をしていました。

どれも非常に高度な内容で、私達も大変勉強になりました。

まとめ

今回MIRUに参加されてる方々とお話する中で、クックパッドって機械学習の取り組みしてたの?!と驚かれることが多くあったのでもっと認知されるような活動が必要だなと実感しました。

ただ、参加をしたことで新たに一緒に共同研究をやりたい、クックパッドのデータを使いたいと言ってくれる研究室もあったので参加してよかったなと思っています。

なお、できたてほやほやの研究開発部へJOINしていただけるメンバーも絶賛募集中です!!今なら研究開発部の立ち上げから経験することができます。ご興味がある方はぜひご応募ください。お待ちしております。

「プログラミングElixir」から分散系の世界へ踏み込もう

テストエンジニアしてます、技術部の松尾(@Kazu_cocoa)です。

今回は、2016年8月19日に発売されますプログラミング言語であるElixirの入門書、プログラミングElixir(以下、本書)に関して少し書こうと思います。

プログラミングElixir

プログラミングElixir

私はここ1年以上、Erlang/Elixirを学びながら業務/私事で使っていました。

業務では主にAndroid(Java)/iOS(Objectvie-C/Swift)/Rubyを使っています。その傍、 社内向けWebアプリケーションをElixir x Phoenixフレームワーク を使い構築したり、HTTPリクエストをrecord/play/proxyするテストツールとしてhttp_proxyを実装していたりしました。

f:id:kazucocoa:20160819101724p:plain (社内向けWebアプリケーションのコード分布)

そんな折、翻訳者の笹田さんから恵贈いただきましたので、簡単ですがElixirについてここで書いてみます。

私がElixirを学びはじめたわけ:分散と並行処理

私は、大学の頃にソフトウェアの信頼性や、分散系の問題であるThe Byzantine Generals Problemをかじっていました。そのため、分散系や複雑系に対して技術的な興味を持っていました。また、私は数年前に負荷ツールとしてTsung、XMPP Serverとしてejabberdに出会っていました。(当時はErlangをしっかり使ったわけではありませんが。)

また、数年前からマイクロサービスのような系をサービス開発においても考える必要が出てきました。マイクロサービス時代を乗り越えるために、Rack::VCRでらくらくアプリケーション間テストサービス分割時の複雑性に対処する: テスト戦略の話クックパッドにおける最近のMicroservices事例にあるようなところです。このため、今後何らかのサービス開発するにあたり分散系を対象としたシステムに触れる可能性が高まるであろうと感じていました。

そんな時、分散系や並行処理、信頼性に関する知見をElixir/Erlangから学べそうだと感じたため学んでみることにした、というのがきっかけです。

私のElixir学習の入り口: Programming Elixir

海外ではProgramming Elixirの第1版が2014年10月15日に発売され、その後Elixirのバージョンアップとともに内容に変更が加えられてきました。そして、Elixir1.2をベースにしたものが約2年の時を経て翻訳され、プログラミングElixirとなって世に出てきたことになります。

私の学び始めも、このProgramming Elixirや幾つかの書籍、exercism.ioから始まりました。私は原書を1.0の頃に購入したきりだったので、Elixir1.2で新たに追加された with 構文など、私が読んだことのない内容までが書籍として収まっている状態を見て新鮮さも感じました。

ところで、Elixirは2016年8月19日現在、すでに1.3.2がリリースされ、masterブランチでは1.4系に向けて開発が進んでいます。そのため、幾つかの関数単位では変わっている箇所も見られますが、多くの内容は本書においては問題にならないはずです。

プログラミングElixirについて

本書について

Elixirを学ぶにあたり、基本的な構文の話は当然ながら、Erlang/OTPやマクロ、その周辺のエコシステムの話は避けては通れません。

この書籍は、Elixirの基本的な構文から入り、プロジェクトを作りながらそのエコシステムを学び、OTPとしてGenServerなどの代表的な作り、さらにはマクロまで、ちょうど良い具合に内容が発展しながら話が進んでいきます。

第1部では、変数の束縛の話から始まり、1.2から導入された with 構文に関するまでの構文や構造に関して網羅しています。その中で無名関数や高級関数などの話もされます。再帰表現による繰り返し処理やパターンマッチ、制御フローのような基本的なことがらから、末尾最適化などの話もかじることができます。

第2部では、周辺のエコシステムの話が主になります。mixと呼ばれるビルドツール、ExUnitと呼ばれるテストフレームワークやテストコードがドキュメントになるDocTestsなどです。Elixir1.3からはテストコードに構造を持ち込むためのExUnit.Case.describe/2なんかも加わっているのですが、Elixir1.2では扱われません。このようなところは、若干の差があります。

また、Elixirを用いて mix を使った簡単なプロジェクトを作りながら、Erlang/OTPの資産を学ぶこともできます。その中から、GenServerやTask、Agentはもちろんのこと、スーパーバイザやその木を構成するといった、プロセスの監視/再起動戦略や分散系の構築などの入り口に触れることができます。:observer といった標準のモニタリングツールの話もあります。(ここでいう プロセス は、 ErlangVMにおけるプロセス を意味します。)

ここまで読み進めるとざっとElixirのエコシステム含む全体がどんなものか学ぶことができると思います。また、簡単なライブラリであれば自身で作成し、hex.pmにアップロード・公開することができます。

第3部ではマクロの話やプロトコルによる機能拡張の話など、少し踏み込んだ話になってきます。Lispを学んだことがある人であれば、Elixirのマクロのとある側面では構文に親しみを覚えるかもしれません。私もex_parameterizedという、パラメータ化テストを支援するようなマクロを実装してみました。

このように、本書は大きく3部に分かれています。

こういう人におすすめ

私は英語で学んでいたのですが、本書を読むとやはり日本語訳されているだけあってElixirを理解することに集中することができると感じました。もとの書籍の完成度もさることながら、それが母国語で読めるというのはやはり新しいものを理解する第一歩の手助けとしてとても大きいものがあります。

本書はElixirに興味はあるけれど入り口をどこにおこうか悩んでいる方、Web上で少し学んだけれど理解を整理して腹に落とし込みたい人におすすめします。一方で、この書籍を全くプログラミングに触れたことがない状態で読むには少し難しいかもしれません。

関数型プログラミングを全く知らない状態で読む場合も、少し読み進めるにあたり負荷がかかる場面があるかもしれません。ただ、新しい考え方を学ぶきっかけになるかもしれませんので、読んで損はないかと思います。

Elixirに対してさらに興味を持った人へ

Erlang/Elixirに触れると、"Let it crash"という言葉をよく目にします。これは、処理がクラッシュしたらそのままにしておけ、という意味です。ただ、これは好き勝手にクラッシュさせて良いということではありません。実際は例外をちゃんと考える必要もありますし、プロセスのモニタリングも頭に入れながらプログラムを組む必要があります。また、例外発生時の影響を局所的にするために、スーパーバイザなどを使ったプロセスの設計も考慮する必要があります。

この書籍をざっと学んだ後に、そのようなより発展したことを書籍を使い学びたい場合、以下を参考にすると良いと思います。プロセス間の参照渡しや値のコピー、性能に関すること、Erlang/OTPとの付き合い方などを少し詳しく学ぶことができます。

最後に

簡単ですが、本書の概要や学ぶことができること、さらに学びを深めるために、という形で話をまとめてみました。

初めに書きました私のきっかけであった分散、並行処理への理解は、学び始めの狙い通り深めるきっかけになりました。例えば、並行プロセスとメッセージパッシングによる分散系の構築とそれらを使った処理を実現できること、それらの耐障害性を高めるための仕組みなど。ナインナインの稼働率を実現する、培われたErlangVMとそれらをWebアプリケーションでも活用するElixirの工夫と言ったところです。私個人は、Elixirから入りErlangを学んだことは、プログラミング言語の構文を単に学ぶというよりは、分散系に対する設計レベルで考え方を学ぶことができました。

Elixirは言語としても、そのような分散系の構築や非同期処理を少ない実装で実現できる面白さも経験することができます。本書も日本語で手に取りやすい形になったので是非とも手にとって、案外、分散系も手軽に扱えるものだと体験してみてください。

最後になりますが、本書を翻訳されました笹田さん、鳥井さんには重ねてお礼申し上げます。

プログラミングElixir

プログラミングElixir