astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

プロジェクトにBIツール「metabase」を導入したらいい感じになった話。

f:id:astamuse:20190719202102j:plain

こんにちは、アスタミューゼでデザイナーをしている@YojiShirakiです。

最近、新規プロジェクトでBIツール(metabase)導入していい感じに機能しつつあるので、どのように導入したかその変化をご紹介したいと思います。

BI導入の背景

BIの導入は次のような理由で早い段階で導入しようと考えていました。

  1. プロジェクトが横断的で共通認識とコンセンサスの土台が必要であること
  2. Webサービスではあるがキャッシュポイントが契約(オフライン)にあること
  3. 初期の機能実装が最低限で、リリースした後の機能実装ニーズが継続的に相当量見込めること

2番目の「キャッシュポイントがオフラインにある」点は特に注意が必要です。というのも、キャッシュポイントが近いところの意見はどうしても強くなりがちで、「お客様の声」事案は優先順位が高めに設定されやすくなるためです。

「お客様の声」はとても重要です。しかし、現状クリアすべき事業課題・サービス課題 とお客様の声は必ずしも同次元ではありませんから、そこを無自覚に「お客様の声」を優先し続けてしまうと、本質的な事業課題への対処が遅れ、プロジェクトが遅延するリスクが高まります。

そうならないように、プロジェクトの初期段階で基本的な数値基盤を構築し、ユーザーシナリオやそれに付帯するKPIと照らし合わせながら課題解決をしていく目線醸成が重要になるわけですね。

「お客様の声」で明らかに改善すべき箇所は継続的に改善しつつ、一方で、数値によって明らかにされるマクロなサービス課題への対応をロスを少なく実行していく、そのための数値整備というイメージです。

なお、余談ですが優先順位判断のメソッドについては様々なものがあるので調べてみてください。

例)プロダクト開発における意思決定のための「ユーザーストーリーの優先順位付け手法」まとめ

機能は計測可能に設計しておくこと

BIは数字を可視化するツールですから、数字が取れることが前提です。そのために比較的早い段階から計測を意識した機能実装の意識醸成に配慮します。

具体的には、企画時にその成果をどのように計測するのかを議論できるように企画書のフォーマット作りを行います。企画書の骨子として以下のようなフォーマットを定義し行動を強制するようにします。

  1. 企画意図・目的
  2. 期待する効果
  3. その計測方法
  4. 具体的な実装内容

計測方法が定義されていない企画書はフォーマット違反なので、別途議論するというふうになります。

計測方法はGAでも良いですし、ログでもいいと思います。ただログデータの収集機構を構築するのはそれなりにコストがかかるので、手っ取り早く履歴テーブルなどを新たに整備してしまうのも良いかと思います。何れにせよ行動が記録に残るように企画段階で方針を固めておきます。

試験導入(とツールの選定ミス)

ある程度状況が整ってきたら試験導入です。今回は以下の5つを検討しました。無料ツールではメジャーな選択肢だと思います。

上記のうち re:dash, superset, PowerBI は既に触ったことがあり感触はわかっていたので、今回は(あまり時間も割けなかったということもあり)インストール不要で、且つ、アカウント管理が容易な Google Data Studio を選択しました。

なお最初に作ったダッシュボードはこんな感じです。

f:id:astamuse:20190719201143j:plain

ぼかしが多くて解りにくいですが営業活動向けダッシュボードを作りました。まず最初に営業に役立つものを作ることで、営業・企画メンバーに対して数値化メリットを感じてもらいたいと考えたためです。思った以上に好評だったのでこの意図は奏功したと思っています。

metabase への乗り換え

ただ一方で以下のような誤算もありました。

  1. 思った以上にもっと数値を見たいという要望が挙がってきた
  2. Google Data Studio の画面レイアウト思ったよりもが使いにくい・面倒
  3. Google Data Studio のDBとのコネクション設定動作が安定しない
  4. Google Data Studio のグラフ表現力が弱い・設定が難しい

1 はともかく、2,3,4 についてはかなり辛いものがありまして、早々に Google Data Studio に見切りをつけ別のツールの検討を始めます。

結果的には、この時、たまたまプライベートで試していて頗る感触の良かった metabase への乗り換えを決めます。

圧倒的な metabase の使いやすさ

metabase の選定は良かったと思います。インストールが簡単で DB の設定も容易です。他にも

  1. Googleの oauth が使えるためアカウント制御が容易(Gsuiteとの相性が良い)
  2. GAとの連携が可能で他のデータと重ね合わせて見せることができる
  3. データの抽出が超簡単
  4. ダッシュボードレイアウトがしやすい
  5. デザインがきれい

など。特に、3, 4, 5 は日々の利用が楽しくなるレベルで洗練されています(なお、1, 2 は re:dash でも可能です)。

デザインとUI/UX が優れているのが最もポイント高かったです。

とは言え、なかなか伝わらないと思うので YouTube にあがっている Demo が参考になるので貼っておきます。

作ったダッシュボード

さて、ではその metabase でどんなダッシュボードを作ったかと言うと下記のようなものです(数字はいじってあります)。デイリーで追うべき数字とその推移をメインに置いたもので、一つのダッシュボードの情報量は少なくして、見るべき数字に集中できるように心がけて作っています(そのかわりダッシュボードの数はやや多め)。

f:id:astamuse:20190719193838j:plain
※数字はダミーです

f:id:astamuse:20190719194435p:plain
※数字はダミーです

最近ではもっと込み入った情報などの可視化も行っていて、あるデータ母集団と別のデータ母集団のマッチング判定データなども可視化しています。

だがしかし…メンバーからのフィードバックが思ったより薄かった

ただ意外なことに作ったダッシュボードについては、あまり大きなフィードバックを得られませんでした。 Google Data Studio でダッシュボードを作っていたからか、「あ、こういう数字見れるのね、ふーん」くらいです。悲熊・・。

そこでもっとアピールするために企画の MTG の時に metabase を映し出して必要な数字やグラフを即時に出すことを何度か行いました。

これが結構刺さりまして「おお、凄い」とか「あ、これいいですね」など言われるようになり「数字が即座に見られる」「色々な数字が手軽に見られる」という感覚が広まりました。ライブ感って大事ですね、いい勉強になりました。

加えてやはり metabase が気軽に数字を引っ張ってこれる様になっているので、人によっては「あ、それ自分も使いたい」となったと思います。

議論と企画の質の変化

こんなゲリラをしばらく繰り返していった結果徐々にチーム内で以下のような変化が生まれました。

  1. 課題がどこにあるのか数字も交えて議論するようになった
  2. 何かをやる時に事前に軽く調べてみるという理解が進んだ

1 については、例えば「●●機能は面白いけど、今はその手前の数値が悪くてボトルネックだから、まずはそこを改善するのが先じゃない?」とか「そこって数値どうなってんだっけ?効果でる?」などの発言が増えていくような変化でした。

2 については、「面白そうな機能を考えてみたものの今のデータ数だと有効にワークしないので一旦置いておこう」や、逆に「数値見たら●●に課題はあるけど、そこを改善すればワークする可能性が高いからやってみよう」とういケースも出てきました。

何れにせよ、数値をもって一定の客観性と共通認識を確立したことで「思いついたら実装する」から脱却し徐々に良い方向に向かようになりました。

とは言えデータドリブンの限界は認識しておくべき

とは言え私たちのチームメンバーはデータが全てとは思っていません。データと同じくらい発想・インスピレーションも大事に考えています(そもそもこの2つは相反するものではなく補完関係です)し、またデータによって明らかにできない課題(というよりも付加価値の可能性)があることも承知しています。

大事なことは、そういったマインドも持ちつつも定量的アプローチでシャープに課題認識と優先順位判断を行い、より良いサービスを作っていく姿勢を全員が持つことだと思っています。

まとめ

ということで、今回は BIツール導入の流れと、どのように変化したかをメモがてらまとめてみました。

長々書きましたが、こういう取り組みは、プロダクトマネジメントがしっかりしている企業から見ると、至極普通なことだと思っています。ですので、私たちももっとレベルアップしていかないとなぁ、と日々日々感じる次第です。

もし本稿について何かご質問等あれば@YojiShirakiにDM頂ければと思います。本文では触れませんでしたが metabase のインストール方法などはそれなりにしっかり検証したのでお役に立てると思います。

では、本日も最後までお読みいただきありがとうございました。

例によって当社では一緒にサービス開発してくれるエンジニア・デザイナー・ディレクターを超絶賛募集しております。

カジュアル面談も随時行っておりますので、「ちょっと話聞きたい」という方は、このブログのサイドバー下にあるアドレスか@YojiShirakiにDMいただければと思います。いつでもウェルカムです。採用サイトもありますので下の水色のバナーから是非どうぞ!ではまた:- )

@YojiShirakiの過去記事)

SPTAGを触ってみた

ご挨拶

どうもお久しぶりです、gucciです。
入社して1年半経ちまして、なんともう3回目のブログのターンが回ってきました。

パソコンを一日ずっと同じような姿勢で叩いていると、肩甲骨周りの筋肉が凝り固まってきて、しまいには肩こりからくる吐き気やストレスに襲われて日常生活に支障をきたしてしまいます。
そうなってしまっては生産性も上がらず、作業時間は伸びてしまいさらに肩が凝ってしまいます。
なんという悪循環でしょう。

そんな時にオススメなのが、ストレッチポールです。
ストレッチポールに乗ることで肩甲骨周りの筋肉をほぐすことができ、また背骨のS字を正しくもどしてあげることで腰痛も軽減されるという良いこと尽くし。
みなさんも是非ストレッチポールをお試しあれ。

最近やっていること

さて、
私がこの会社に入社してからここまで、様々なことに挑戦する機会をいただいてきました。
入社前のプログラミングスクールではRubyを3ヶ月ほど学んでいたのですが、入社後はJavaを半年ほど学び、
その後はアプリケーション開発で半年ほどScalaに触れ、その後データチームに移ってからはSparkを用いた大規模データ処理などを学び、
ここ最近はPythonを使ってバッチやアプリケーションを組んでおります。
使うライブラリやミドルウェアに合わせて選択したり、好きなものや興味があることを自ら選択することができるのでとてもやりがいを感じております。

f:id:astamuse:20190710024218j:plain
space
ここ最近は、
高次元ベクトルデータ検索を行うべくNGTというライブラリを用いてあれこれやっております。
まさか私がベクトルデータを扱うだなんて。いや、むしろベクトルデータって何それ?!と少し前の私ならなっておりました。
(いや、今でも正直あまりわかっておりませんが)

NGTって何?ベクトルデータって何?というのは、我がぶちょー・弊社並河の個人ブログにとてもわかりやすいエントリーがありますので、是非そちらを参考にしてみてください。
NGTがYahoo!の公開しているOSSに対して、
Microsoftが公開している近傍検索を行えるライブラリであるSPTAG (Space Partition Tree And Graph)という存在を同僚のaranが教えてくれたので、
このブログではそちらのSPTAGを実際にお試しで触ってみた内容をご紹介しようと思います。

SPTAGをインストールしてみよう

github.com

NGTのGithubには日本語の説明があるのに対して、SPTAGは英語オンリーの模様ですね。
この時点で難易度の高さが伺えます。
必要項目を見てみると、

swig >= 3.0
cmake >= 3.12.0
boost >= 1.67.0
tbb >= 4.2

とありますので、順々にインストールしていきましょう。
当方の環境は Ubuntu 18.04.2 LTSを使っております。
それでは必要ライブラリのインストールからレッツゴー。

Swigのインストール

必要ver : swig >= 3.0

swingはパッケージがあるのであっという間に入れられます。

$ apt list swig
Listing... Done
swig/bionic,now 3.0.12-1 amd64 [installed]

よしよし。

$ sudo apt install swig

これでばっちりです。

cmakeのインストール

必要ver : cmake >= 3.12.0

cmakeなんてもちろんすぐ入れられるよ、むしろ入ってるんじゃないかな、
と思ったらなんと残念。

$ cmake --version
cmake version 3.10.2

versionが古いではないか・・・

$ apt list cmake
Listing... Done
cmake/bionic 3.10.2-1ubuntu2 amd64

なるほど。パッケージにあるのがそれなのですね。
自分の手で最新版にしてあげましょう。

$ wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh  
$ chmod +x cmake-3.14.5-Linux-x86_64.sh
$ sudo ./cmake-3.14.5-Linux-x86_64.sh
$ sudo mv cmake-3.14.5-Linux-x86_64 /opt
$ sudo ln -s /opt/cmake-3.14.5-Linux-x86_64/bin/* /usr/bin
$ cmake --version
cmake version 3.14.5

成功です。

boostのインストール

必要ver : boost >= 1.67.0

続いてboost。
恐る恐るパッケージを見てみると・・・

$ apt list libboost-dev
Listing... Done
libboost-dev/bionic 1.65.1.0ubuntu1 amd64

ブーストよ、お前もか。
これも経験、レッツトライ。

$ wget https://dl.bintray.com/boostorg/release/1.68.0/source/boost_1_68_0.tar.bz2
$ tar --bzip2 -xf boost_1_68_0.tar.bz2
$ cd boost_1_68_0/
$ ./bootstrap.sh
$ sudo ./b2 install
〜少し時間がかかります〜

無事に終わりましたね。お疲れ様です。

tbbのインストール

必要ver : tbb >= 4.2

最後にtbbのインストールです。

$ apt list libtbb-dev
Listing... Done
libtbb-dev/bionic 2017~U7-8 amd64

お、ありますね。

$ sudo apt install libtbb-dev

さあ準備は整いました。いよいよSPTAGをインストールしてみましょう。

SPTAGをインストール

$ git clone https://github.com/microsoft/SPTAG.git

クローンしてあげたら、後はREADMEにあるとおりに実行すれば・・・

$ cd SPTAG
$ mkdir build
$ cd build && cmake .. && make

最後にインストールです!

$ sudo make install
・・・
CMake Error at Wrappers/cmake_install.cmake:87 (file):
  file INSTALL cannot find "/home/develop/SPTAG/Wrappers/src/SPTAG.py".
Call Stack (most recent call first):
  cmake_install.cmake:43 (include)

こけました!!
なんということでしょう。
ログをみるとふむふむ、SPTAG.pyというファイルが見つからないと、って怒っていますね。
探して見ましょう。

$ cd ..
$ find . -name SPTAG.py
./Wrappers/inc/SPTAG.py
./Release/SPTAG.py

いたぁあああああああああ!
どちらが正しいのか・・・
diffをとってみると同じでした。

$ cp ./Wrappers/inc/SPTAG.py ./Wrappers/src/

コピーしてきて、再実行!お願い!

$ cd build/
$ sudo make install

エラー起きず!やりました! READMEには「テストやってみてね」と書いてあるのでやりましょう。

$ cd ../Release/
$ ./test
Load Data From delindices/vectors.bin
Load Data (97, 10) Finish!
Load BKT From delindices/tree.bin
Load BKT (1,98) Finish!
Load Graph From delindices/graph.bin
Load Graph (97,32) Finish!
10@(1,1) 90@(3,3) 250@(5,5) 

*** No errors detected

やりました。我々はついにたどり着いたのです。

GettingStartに詳しい使い方があるので、さっそく試してみましょう。
上記ページには大文字で記載されていますが、indexbuilderの小文字でパスが通っていて、Usageが出るのでそれを見てみましょう。

$ indexbuilder
Required option not set:
  -d, --dimension <value>       Dimension of vector.
Required option not set:
  -v, --vectortype <value>      Input vector data type. Default is float.
Required option not set:
  -i, --input <value>           Input raw data.
Required option not set:
  -o, --outputfolder <value>    Output folder.
Required option not set:
  -a, --algo <value>            Index Algorithm type.

Usage: 
  -t, --thread <value>          Thread Number.
  --delimiter <value>           Vector delimiter.
  -d, --dimension <value>       Dimension of vector.
  -v, --vectortype <value>      Input vector data type. Default is float.
  -i, --input <value>           Input raw data.
  -o, --outputfolder <value>    Output folder.
  -a, --algo <value>            Index Algorithm type.
  -c, --config <value>          Config file for builder.

ふむふむ。なるほど。上の5つは必要なオプションなのですね。

そしてInputのformatは、

<metadata1>\t<v11>|<v12>|<v13>|
<metadata2>\t<v21>|<v22>|<v23>|

であると。なるほど。 手元に実況パワフルプロ野球2018年の開幕版データがたまたまあるので、それを使ってやってみましょう。
少しデータが古いのはご了承ください。
こんなデータがインプットになっております。

山田哲人        50|73|81|65|77|62|
大引啓次        36|53|67|60|58|73|
西浦直亨        25|51|60|51|50|48|
川端慎吾        56|51|65|58|56|50|
武内晋一        30|46|48|46|71|65|
荒木貴裕        33|54|60|62|51|53|
畠山和洋        32|61|29|54|65|61|
・
・
・

6次元のベクトルで、

<選手名>        ミート力 |パワー|走力|肩力|守備|捕球|

といったステータスになっております。
本来パワプロはこれらのデータに加えて特殊能力があり、それによるプラスマイナスが大きいのですが、今回はお試しということでご了承くださいませ。
それでは作って見ましょう。

インデックスの作成

$ indexbuilder -d 6 -i ./input_yasyu_list_sptag.tsv -o ./powerpro2018_SPTAG -v Int8 -a KDT
Setting NumberOfThreads with value 32
・
・
・
Start to build KDTree 1
1 KDTree built, 394 396
build RNG graph!
Refine 1 0%Refine RNG, graph acc:0.992813
Refine 2 0%Refine RNG, graph acc:0.997813
Build RNG Graph end!
Save Data To ./powerpro2018_SPTAG/vectors.bin
Save Data (396, 6) Finish!
Save KDT to ./powerpro2018_SPTAG/tree.bin
Save KDT (1,396) Finish!
Save Graph To ./powerpro2018_SPTAG/graph.bin
Save Graph (396,32) Finish!

やりました。成功です!

インデックスの検索

続いて検索を行ってみましょう!

適当に検索クエリ用のファイルを作成します。

パワー100       0|100|0|0|0|0|

これを使って検索を投げてみます。

$ indexsearcher ./powerpro2018_SPTAG Index.QueryFile=./testSPTAG_Query.tsv Index.ResultFile=./testSPTAG_Result.tsv Index.K=10
・
・
・
Load Data From ./powerpro2018_SPTAG/vectors.bin
Load Data (396, 6) Finish!
Load KDT From ./powerpro2018_SPTAG/tree.bin
Load KDT (1,396) Finish!
Load Graph From ./powerpro2018_SPTAG/graph.bin
Load Graph (396,32) Finish!
Set []/powerpro2018_SPTAG = ./powerpro2018_SPTAG
Set [Index]QueryFile = ./testSPTAG_Query.tsv
Set [Index]ResultFile = ./testSPTAG_Result2.tsv
Set [Index]K = 10
Load data: (1, 6)
        [avg]       [99%]   [95%]   [recall]    [mem]
Setting MaxCheck with value 2048
2048    0.000129    0.0001  0.0001  0.0000      0GB
Output results finish!

やりました。成功です! 結果のファイルを見てみると・・・

パワー100:0.307@アマダー|0.362@G後藤武敏|0.370@マレーロ|0.370@山川穂高|0.378@阿部慎之助|0.386@黒瀬健太|0.394@園部聡|0.394@デスパイネ|0.402@バティスタ|0.402@メヒア|

実データで並べてみると・・・

アマダー 37|80|18|52|30|38|
G後藤武敏 25|61|31|39|35|30|
マレーロ    57|85|42|56|37|36|
山川穂高    51|86|41|53|46|40|
阿部慎之助 46|69|15|51|27|41|
黒瀬健太    19|51|21|51|24|15|
園部聡   18|60|42|56|21|19|
デスパイネ 45|84|52|66|36|40|
バティスタ 46|81|53|69|35|29|
メヒア   42|80|42|60|44|47|

おぉぉ、力自慢の男たちがずらりとでてきましたね。
ふむ。なるほどなるほど。

NGTでやってみる

同じ元データで作ったインデックスに対して、同様のクエリを投げる作業をNGTでもやってみました。

Query No.1
Rank    ID  Distance
1   316 81.2711
2   84  82.1766
3   280 84.5044
4   217 87.327
5   42  91.1757
6   375 91.4549
7   385 91.4549
8   286 95.3625
9   31  96.566
10  186 98.3972
Query Time= 0.000167582 (sec), 0.167582 (msec)
Average Query Time= 0.000167582 (sec), 0.167582 (msec), (0.000167582/1)

こちらを実データで並べてみると・・・

19   51  21  51  24  15  黒瀬健太    316
25  61  31  39  35  30  G後藤武敏 84
37  80  18  52  30  38  アマダー    280
18  60  42  56  21  19  園部聡   217
46  69  15  51  27  41  阿部慎之助 42
41  62  45  33  30  35  清宮幸太郎 375
41  62  45  33  30  35  今井順之助 385
27  60  56  42  29  32  岩見雅紀    286
26  60  46  46  39  36  鵜久森淳志 31
24  51  44  63  20  20  青木陸   186

ほほお・・・SPTAGとは異なる結果になりました。
実に興味深いですね。 このあたりは実際のアルゴリズムを理解していかないと真相に辿りつけなさそうですね。
オプションの付け方などでもインデックスの作成や検索は微妙に変わりそうなので、
精度や速度比較など、まだまだ調べられることはたくさんありそうです。
インストールのしやすさや、Outputの見やすさはNGTの方に分がありそうですね。

おわりに

いかがだったでしょうか。
SPTAGとNGTの比較検証をもっとやろうかと思っていたのですが、SPTAGのインストール自体で思いの外知見がたまったので、そちらをメインにアウトプットさせて頂きました。
文書や画像などをベクトル化し、そのベクトルの距離が近いものでサーチする近傍検索。実に面白いですね。
いつの日か、人間の遺伝子をベクトル化することで、その人間がどんな特徴を持つのかなどがわかってしまう日が来るのかもしれないし、来ないのかもしれない・・・。

ということで! アスタミューゼは常に新しいものや面白いものに挑戦しています!
エンジニア・デザイナーを絶賛募集中です! 是非一緒に面白いことをやっていきましょう!ご応募お待ちしております!

スクラムはじめました

こんにちは。アプリケーションエンジニアの池田 (@yukung) です。

今年の NBA Finals 🏀は Toronto Raptors の優勝で幕を閉じましたね! Golden State Warriors の 3 peat (3連覇) への挑戦も夢には届かず… Warriors ファンにとっては怪我人が多発して不運な形で終わってしまい残念な結果になってしまいましたが、カナダに初めてのチャンピオンリングがもたらされたことからも、ここ数年のウォリアーズの黄金時代から NBA の時代が変わろうとしていることに未だ興奮冷めやらない池田が、今回のブログ記事をお届け致します!

さて、今回は私が関わっているあるプロダクトにおける開発フローについてご紹介したいと思います。

アスタミューゼにおける開発フロー

アスタミューゼには、既に運用に入ってるもの、新規構築中のものを含めて複数のプロダクトがありますが、どういった開発フローを採用するかについては、プロダクトごとに判断は委ねられており、採用されている開発フローは様々です。Redmine や GitLab の issue/ticket ベースで進めているものもあれば、カンバン方式で進めているものもあります。

そんな中で、私が現在関わっているプロダクトではスクラムを採用して開発を進めています。具体的な開発フローをご紹介する前に、なぜスクラムを採用しているのか、という点についてご説明したいと思います。

(チーム加入当初)私が感じていた課題感

私が現在関わっているプロダクトでは、元々ある特定の決まった開発フローは採用されておらず、要件から洗い出された機能ベースのタスクが人にアサインされている状態で開発が進められていました。また、抱えているアプリケーションも複数存在しており、それぞれ必要とされる機能が各アプリケーションで実装されている状況でした。

その後、私が入社してしばらく経った頃、開発の推進主体が私に引き継がれる形となりました。

推進主体が引き継がれるまで、私は入社してしばらく開発の進む様子を眺めながら作業を続ける中で、次第に以下の課題感を感じるようになりました

  • 機能ベースで洗い出されたタスクごとに、人にアサインされ、またそれらが複数のアプリケーションで実装されている形のため、自身が担当しているものとは別の機能や他のアプリケーションの仕様が存在・発生している経緯が分からない
    • 経緯が分からないので使うユーザーの状況が想定できず、その必要性や仕様の良し悪しが判断できない
  • 各人が機能ベースで関連するタスクを集中的に行っていたため、チームメンバーが得意な領域がアプリケーションごとに分断され、それぞれ他の領域のことについては全く関与できていない
    • ドメイン知識が各個人の中で閉じ込められてしまい、チームとして知見が溜まっていかない
    • 誰が今何をやっているのかよく分からない
  • 開発を進めるに当たって議論して結論を出した際に判断基準となったものや議論の経過など判断の根拠となった情報を文章やメモとして残す習慣が根付いておらず、どうしてそうなっているのかについて社内のドキュメントを検索しても見つからず、人に聞かないと分からない
    • 非同期的にではなく同期的にしか情報を得ることができないため、確認を取るために設計・実装作業が都度スタックしてしまい、進めるスピードが上がっていかない

もちろん上記にはその当時のいろいろな制約があり、物事を前に進めるためにある程度妥協しながら進めていた結果であり、それ自体は尊重すべきことです。しかしながら我々はベンチャーで、これからどんどん仕掛けていかなければならない挑戦者の立場でもあります。今後開発の速度や生産性を非連続な形で促進していかなければ、今関わっているプロダクトの成功確率を上昇することは難しいのではないか、という危機感がありました。

ではそれを達成するには何が必要だろうと考えると、少なくとも上記の課題意識は解消していくべき課題だろうと捉えていました。

チームメンバーの課題感

推進主体が私に切り替わったタイミングで、開発を進めるにあたっての課題意識を共有する場を開き、チームメンバーにヒアリングを行ってみました。すると、以下のような課題意識があることがわかりました。

  • 関わっているアプリケーション以外不明な部分が多い
  • デプロイフローがよく分からない
    • いつ何がどの環境に上がっているのかが聞かないと分からない
  • 特定の人が大変そう
  • タスクの優先度・アサイン先・タスクの状態がチーム全体で共有・可視化できていない
  • フロントエンド - サーバサイド - インフラという分かれ方ではなく、アプリケーション A / アプリケーション B / アプリケーション C といった分かれ方になっていて、ロールではなくシステムでチームが分かれている
  • ドメイン知識が各人に偏りがち
  • タスクが専任制
  • 誰が何やっているのかはわかるが、どうしてそうなっているのかが不明なので、引き継げない
  • 他の人の持っているタスクの優先順位がわからないのでいつのタイミングで頼めば良いのか分からない
  • DB のどれが何なのかが分からない、合間に入った改修で何が変わったのか把握していない
  • 仕様変更やコード修正後のフローを決めて品質安定(デグレ避け)に努めた方がいいと思う
  • 仕様がふわふわしている
  • 指示系統や開発を行う上でフローが確立されていないので混乱が生じる場面があった

上記の項目は複数のチームメンバーにヒアリングをした結果、挙げられた意見ほぼそのままの引用です。いずれも以下のような要因に起因する課題のように見受けられました。

  • コミュニケーション・情報の流れの不透明さ
  • 開発フローの不透明さ
  • 現状の可視化の不足
  • 知識・ノウハウの偏り

また、上記から私がプロダクトチームに加入した際に感じた課題感と、チームメンバーの課題感が大きくズレがないことも感触として得ることができました

私は前職以前で経験したプロダクトにおいて、スクラム開発の経験があったためスクラムがチーム開発においてどういった効果をもたらすものかを体感として理解していました。

またスクラムの3本柱として透明性・検査・適応という概念がありますが、上記の課題を解決するためにスクラムの透明性という概念がチームが抱える課題の解決に寄与するのではないか、という感触を私が持ったため、開発フローとしてスクラムの導入をチームに提案1し、スクラムの採用が決まりました。

私のスクラムの始め方

現チームメンバーは 1 人スクラム開発の経験者が居ましたが、チーム全体としてスクラムの経験値が高かったわけではなくほぼみなが初心者という状況でした。そのためスクラムって何?というところからのスタートです。当然プロダクトオーナーやスクラムマスターといったスクラムの登場人物(ロール)、各種スクラムセレモニーの種類やその意義、概念、用語なども知らない状態です。

そういったところからスクラムを始めると決めた当初、私が気をつけたことは、教科書的にスクラムというフレームワークの概念やプラクティスを勉強会などで伝えるのではなく、日々の作業を通して体感しながら理解してもらえるようなアプローチを取りました。具体的には、導入提案時にはスクラムの登場人物・役割の説明と、スクラムイベントの種類と概要説明、プロダクトバックログ・スプリントバックログの運用方法の説明に留めました。(これだけでも結構説明項目は多いんですけどね…スクラムガイドにも習得は困難と予め記載されているのはスクラムガイドを一度でも読んだことがある方ならばご存知の通りです)

その後粗い Done の定義と、 PO に 0 スプリント目のプロダクトバックログ優先順位付けをお願いし、1 スプリントの周期をどの程度にするか(結果的には 2 週間を 1 スプリントと定めました)をチームメンバーで議論して決めて、後はえいやでスタートしました。

このアプローチはある意味邪道かもしれません。これは過去のスクラム導入2の経験において、理念や概念を大上段から話をしてスクラムを進めた結果、各人がイメージした効果や結果の通りにならずにスクラムに対して幻滅・期待値の齟齬といったことが原因で途中でスクラムを辞めてしまったチームを見た経験を持っていたことによります。スクラムに対して前提知識のないチームメンバーに対して、スクラムがなんだか凄いもの・怖いもの・大変なもの、というイメージを持ってほしくなく、チームメンバーの納得感を大事にしたかったのです。(なので上手く行かないと思ったらそこで止めてもいいよ、ということもメンバーにはその時伝えました)

私にとってラッキーだったのは、同時期に入社した Product Manager の Gyopi もスクラム開発の経験者であったことです。 PO に対してスクラムの概念や用語について事前にインプットすることなしに、ある程度の暗黙の了解でスクラムを開始することができたことは大きい要素でした。

スクラム開始後

スクラム開始後は、まずはやってみせ、言って聞かせて、させてみせ、の精神で私自身がスクラムマスター兼開発者兼スクラムセレモニーの MC を兼任する形で進めていきました。3その中で徐々にプランニングポーカーによる見積もりやプロダクトバックログリファインメントでの次スプリントへ ready にするための調整、スプリントごとの振り返りの実施、など徐々に取り入れていくようにしました。

現在 8 スプリントを終了した状況で、取り入れられていないプラクティスもまだまだたくさんありますが、チームメンバーとの対話や振り返りの中で必要と決めたものを徐々に取り入れられればと考えています。4

以降、具体的にスクラムをどう運営しているのかについて、いくつか実例を交えながらご紹介したいと思います。

プロダクトバックログ/スプリントバックログの管理

私個人は以前スクラム開発では JIRA を利用していましたが、現在のプロジェクトはまだ立ち上がったばかりで潤沢な予算があるわけではないため、 JIRA が現実的な選択肢ではありませんでした。そのためいくつかのツールを検討した結果、現在 Asana で管理しています。

プロダクトバックログ

f:id:astamuse:20190626052052p:plain
プロダクトバックログの例

スプリントボード

f:id:astamuse:20190626052208p:plain
スプリントボードの例

Asana はリスト形式とボード形式をプロジェクトごとに使い分けることができ、またタスクを複数のプロジェクトに紐付けることができます。そのため、現在アクティブなスプリント内のタスクをボード形式のプロジェクトにも紐づけてあげることによって、プロダクトバックログ/スプリントバックログはリスト形式で管理しつつ、進捗状況をボード形式で管理する、ということができます。これによって JIRA でできていたことがある程度同じようにできるだろう、という算段が立ったため、 Asana を使うことに決めました。5

現在では、私が関わっているプロダクトだけではなく社内の他のプロダクトでも Asana が浸透しつつあります。また、振り返りの実施時にも、 Asana のボードを使って振り返りを行っています。

ストーリーポイント見積もり

アスタミューゼでは、お子さんをお持ちの開発者の方もたくさん在籍しています。そのためご家庭の事情であったりなどで状況に応じてリモートワークで勤務されている方もいらっしゃいます。そんな中でスクラムを円滑に進めていくには、リモートワークで働いている人を基準にして情報のやり取りのスムーズさや透明度を高めていく必要がありました。

社内コミュニケーションは主に Slack を利用していますが、適宜チャットや音声通話、ビデオ通話を利用しながらなるべくリモートワークの方に不便な状況が生まれないように配慮しつつ開発を進めるようにしています。

同様に、プロダクトバックログアイテムのストーリーポイントを見積もる際、リモートワークの方も同じように議論に参加できる必要がありました。ストーリーポイントの見積もりにはプランニングポーカーを用いるのが定番の方法だと思いますが、リモートワークの方に物理的なポーカーを送付して使っていただくのも大変です。

そのような課題を解決するため、私はリモートからでも仮想的にプランニングポーカーを実施できるようなアプリを実装して運用しています。

プランニングポーカーアプリ

f:id:astamuse:20190626052245g:plain
プランニングポーカーアプリ

(GIF アニメがやや雑でわかりずらくごめんなさい 🙇‍♀️)スクラムマスターが場を設定(画面左側)し、その場に対して開発メンバーがスマホのブラウザ(画面右側)から WebSocket で接続してリアルタイムにカードを選択しながら議論ができるようにするようなアプリです。6

本音のところは単に私が仕事に追われずに息抜き的にコードを書きたかった、というのもあるのですが 😜 、このアプリを Play Framework と Akka Streams で実装したものを、実際のプランニング時に利用しています。データベースやファイルなども使っていないので情報は何も保存していないため、パブリックな場所にデプロイしてあっても支障はないだろうと判断し Heroku にデプロイしています。

これによってリモートワークのメンバーでもオフィスに居るメンバーと同じようにプランニングポーカーを実施することが現在できています。

モブプログラミング

あるスプリントの振り返りを分析しているうち、チーム内で設計やクラス分割、コードのイディオムなどについて共通理解がまだあまり醸成できていない状態があることが浮き彫りになりました。

また、弊社は主に Scala で開発を行っていますが、チームメンバーの中にはまだ Scala に充分に習熟できていない人ももちろん居るため、チーム内で Scala のノウハウの共有に課題感を持っていました。

そこで、あるスプリントのプロダクトバックログアイテムとして比較的小規模なリファクタリングのタスクがあったため、それを題材にチームメンバー全員でモブプログラミングに取り組んでみました。

f:id:astamuse:20190626052348j:plain
モブプログラミングの風景

この取組みは非常に好評で、学びが多かった、楽しかった、もう一回やりたい、などポジティブなフィードバックをたくさんいただきました。以下モブプログラミングを実施したスプリントの振り返りで挙がった項目の一部をご紹介します。

  • 【まとめ】きっつい!!!!(のでたのしい
  • scala力に差がありすぎて突っ込めないのが申し訳ない
  • ツッコミがあってんのかどうか全くわからないのでまさかりがほしい

  • 自分だけ(?)windowsなので、ドライバーになったときが不安

  • flatMapの連続しているコードがfor-yieldで書ける事に気づかなかった(書いていなので身についていない
  • 最後の方にでたn+1問題、ormが上手いこと解消しているものだと思いこんでいた(以前現場で使っていたものだと気にしなくてよかったような・・・
  • 他の人の設計や実装についての考え方が聞けてよかった
  • モブプロ2回目があると嬉しいです!

  • Scalaで覚えたことの復習になって良かった&また新たな学びがあった!

  • 結構うるさかったんじゃないかと心配してる
  • リモートのみなさんのプログラミングも見たい
  • 構成についていろいろな考え方があると知れた
  • 構成についてどういうのが最適なのか皆さんの意見をもっと聞きたい
  • アーキテクチャの話とか共通化の話とかみんな意見があって長く話せそうなので別の機会に話したい

  • 他のプロダクトの話をきけるのがよかった

  • Scalaの勉強になったようなので役に立ててよかった

モブプログラミングの取り組みはまだ頻繁にできるほどチーム内で浸透できていないので、やり方やテーマの選定など、今後もっと頻繁に取り組めるように前向きに取り組もうとしているところです。

まとめ

ここまで、主に私が関わっているプロダクトにおける開発フローやその取組みについてご紹介させていただきました。

アスタミューゼには、こういった開発を進めるための取り組みも開発者が気軽に提案してメンバーで自由に議論しながらみんなで開発を進めていく雰囲気があります。

チームメンバーと議論を深め合いながら成長していきたいエンジニア、デザイナー、PM の方を絶賛大募集中です! ご興味のある方は下記バナーの採用サイトからご応募いただくか、カジュアルにランチなどでお話させていただくこともできますので、お気軽に @yukung までご連絡いただければ嬉しいです。お待ちしています。


  1. 余談ですが、この時の提案資料についてはチームメンバー全員がアクセスできる wiki のプロジェクトトップページから「スクラムで運用することになった経緯について」という内容でいつでも参照できるようになっており、後から加入したメンバーに向けても経緯が把握できるようになっています。

  2. 当時のチームでスクラムを導入したのは私主導ではなく、当時のスクラムマスターで、私の役割はいち開発メンバーでした。

  3. これはこれで超大変だったのは言うまでもありません。現在では、チームメンバーの chotaro が MC を巻き取ってくれて、スクラムマスター業に専念することができ超助かっています!ありがとう! 🙏

  4. バーンダウンチャートやインセプションデッキ、ユーザーストーリーマッピング、スキルマップなどなど。インセプションデッキなどはむしろ本当は終わらせておかないといけないはずで、ここはただただ私の力不足…。

  5. stormcat24 さんのブログ記事を参考にさせていただきました。感謝 🙇‍♀️ https://blog.stormcat.io/post/entry/asana-sprint-board/

  6. カードアイコンは redbooth/scrum-poker-cards を利用させていただきました。ありがとうございます。

Copyright © astamuse company, ltd. all rights reserved.