1.5年も紆余曲折したアクセス解析システムの作り直し。実現したこと、やめたこと。/ferretOne
by
tkhr
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
実現したこと、やめたこと。 株式会社ベーシック 唐澤 1.5年も紆余曲折した アクセス解析システムの作り直し。
Slide 2
Slide 2 text
今日は 僕の体験からの学びの共有と 現場のリアルを感じてもらえたら プロダクトの将来のためにエンジニアだからできること それを非エンジニアに理解してもらうこと 妥協せず理想のシステムを追うこと 目的の見極めが大事
Slide 3
Slide 3 text
題材 ferret One の レポート数値が合わない問題の解決
Slide 4
Slide 4 text
ferret One について
Slide 5
Slide 5 text
© 2022 Basic inc. BtoBマーケするなら ferret One とは 5 オールインワンマーケティングツールの提供と マーケティング実行支援サポートをセットで行っています 簡単に操作できる環境 運用サポート ツール ノウハウ
Slide 6
Slide 6 text
© 2022 Basic inc. BtoBマーケするなら ferret One = オールインワンマーケティングツール BtoBのリード獲得に必要な機能がそろった マーケティングツールです 6
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
© 2022 Basic inc. BtoBマーケするなら LPも作り放題 ferret Oneは記事コンテンツの更新だけでなく、LPも作成可能で す。複製も簡単なので、できあがったLPをベースに、ターゲット別・ キーワード別・ユースケース別など、様々なLPを展開し、どんどん テストも回すことができます。 フォーム・CTA設置 ブログ機能 資料ダウンロード機能 項目を選択するだけで、制作したページに簡単にフォーム やCTA(申込などのボタン)を設置できます。 コンテンツマーケティングに欠かせないブログ機能。 WordPressからのインポートも可能で、既存のコンテンツ記 事も有効活用できます。 アクセス解析はもちろん、SEO順位チェック機能やSNSとの 連携投稿もできます。 PDFファイルをアップロードすることで、ユーザーが資 料ダウンロードできるページも簡単に作成できます。 フォームと組み合わせることで、ホワイトペーパー施策 などのマーケティングに活用できます。 ダッシュボード お問い合わせ管理機能 ユーザー行動履歴 シンプルな画面でWebサイトの重要指標が一目で 確認できます。目標に対しての進捗を素早く把 握。わかりやすいUIでセールスチームや経営陣と もWebサイトの状況が共有しやすくなります。 コンバージョンしたユーザーのステータスがすぐに わかるボード型の管理画面で顧客の状態を一元 管理。対応状況をマーケター、CS担当、営業担 当、誰でも把握できます。 Web上でのユーザー行動が確認できます。 ユーザーが何を経由してこのページに辿りついたの か? どのページを見てコンバージョンしたのか?な どユーザーの思考を考察し、施策のヒントになりま す。 メールマーケ機能 SEO順位チェックツール セグメントメールで特定のユーザーにメールを送ったり、ス テップメールでタイムリーに配信することも可能。 HTMLメールも見たまま編集で作成できます。 ※ステップメールはスタンダードプラン 、 またはオプション機能となります ※カンバン形式からのメール配信機能は全プラン共通 一定期間のSEO順位の変化、 キーワードごとの順位、 前日からのアップ・ダウン、 直近の動きのグラフなども確認できます。 自動メモ機能 行った施策をメモできる機能はもちろん 新規ページを追加すると、その履歴が 自動で記録され、アクセスの変化と 付け合わせて考察することができます。 その他マーケティング機能(リード獲得〜育成まで) 8
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
16コの軸
Slide 13
Slide 13 text
問題 レポート数値が合わない
Slide 14
Slide 14 text
対応 アクセス解析システム & レポート の作り直し
Slide 15
Slide 15 text
CS の人 < お客様からお問い合わせが来てます < レポートの数値がおかしいそうで、こちらで再現できました 再現して確認しますねー > 僕が ferret One チームにアサインされたある日のこと ( ……確かにおかしい上にやばそうな臭いがプンプンするぜ 🙁)
Slide 16
Slide 16 text
何が起きていたのか
Slide 17
Slide 17 text
● 使われない機能がある ● なぜあるのかわからない機能がある ● レポートの数値が合わない 起きていたこと - プロダクト機能面
Slide 18
Slide 18 text
例1: レポート絞り込み ● なし PV: 5,000 ● あり PV: 5,200 条件をきつくしてるのに、数値が増える?! 数値が合わない
Slide 19
Slide 19 text
例2: レポート集計軸 ● デバイス別 PV: 5,000 ● 流入元別 PV: 5,200 同じ数字を見ているのに、集計軸によって数値が違う 数値が合わない
Slide 20
Slide 20 text
コンバージョン(CV) ● ユーザーが何かのアクションをすること ● サイトにおいて目標到達になる行動のこと 例: ● ECサイトの商品購入 ● メディアサイトのメルマガ登録 用語補足
Slide 21
Slide 21 text
例3: ● お問い合わせ数: 30 ● CV 数: 28 とか ● お問い合わせ数: 50 ● CV 数: 51 数値が合わない
Slide 22
Slide 22 text
● レガシーコード ● スパゲッティコード ● ふくざつなシステム 起きていたこと - 実装面
Slide 23
Slide 23 text
● レガシーコード ○ テストがない ● スパゲッティコード ○ 命名が統一されてない ○ 責務が適切じゃない ● ふくざつなシステム ○ クラスとクラスの関係がパッとわからない ○ AWS のいろんなサービスを使ってる 起きていたこと - 実装面
Slide 24
Slide 24 text
どうしてこうなったのか
Slide 25
Slide 25 text
当時の関係者じゃないので予想ですが... 1. 度重なるピボット とにかく PMF するぞ!!! 2. 機能追加して出すことが正義 営業が機能をアピールして契約を取る 3. 新卒&オフショアメインの開発体制 監督者、中堅以上エンジニアが不足していた
Slide 26
Slide 26 text
その後の組織改編で人・組織の問題は一定解決したが、、、 当時を知る人は減っていき ● ターゲットを見失った機能たち ● 技術的負債 が取り残された説 そして顕在化した問題の一つが・・・
Slide 27
Slide 27 text
レポート数値が合わない
Slide 28
Slide 28 text
そしてゴングが鳴らされる CTO < ぺっぱー、ferret One よろしく システムのリニューアルですね! 任せてください! > ということで...
Slide 29
Slide 29 text
「趣味リニューアル」と会社の飲み友達にいじられるほど ゼロから積み上げる経験をしてきた彼(僕)は その全てを携えて ferret One に立ち向かうことを決意しました これが 2019年11月の出来事
Slide 30
Slide 30 text
アクセス解析システム / レポート の組み直したこと
Slide 31
Slide 31 text
1. 機能の整理 2. システムの作り直し 組み直したこと
Slide 32
Slide 32 text
1. 機能の整理 a. 削除、適切な形に変える 2. システムの作り直し a. 既存のリプレイス 組み直したこと
Slide 33
Slide 33 text
機能の整理
Slide 34
Slide 34 text
詳細レポート - OSバージョン別レポート < OS のバージョンを気にしている人いるのかなぁ そうなんですか? GA にもありますし必要では? > < toB のマーケティングでどう役に立てるのかな? Windows 10 か 11 かでアプローチを変えることあるのか 確かに... > なんなら PC か SP かくらいでも十分そうですよね
Slide 35
Slide 35 text
CS チームにヒアリング、使用状況を確認する → 全然使われてないことがわかった → 削除 他の細かいレポートも同じく 5ページくらい削除 詳細レポート - OSバージョン別レポート
Slide 36
Slide 36 text
コンバージョン < 何それ?!お問い合わせ以外にあるの?! コンバージョンモデルに 4パターンのデータがあるんですけど、知って ました? > クリックと、重要ページと、外部フォームってのが あるみたいです > < それってコンバージョンって言えるの?
Slide 37
Slide 37 text
コンバージョン 1. お問い合わせ 2. クリックイベント 3. 重要ページビュー 4. 外部フォーム計測 2~4 ってコンバージョンなの? そもそも ferret One におけるコンバージョンって何?
Slide 38
Slide 38 text
コンバージョン is 何? fO は「見込み顧客を獲得するためのツール」なので 1. お問い合わせ 2. クリックイベント 3. 重要ページビュー 4. 外部フォーム計測 < だよね? そうですよね >
Slide 39
Slide 39 text
CS にヒアリング ● 使用状況 ● どんな使われ方をしているのか ● なくなる場合の影響 コンバージョン
Slide 40
Slide 40 text
1. お問い合わせ 2. クリックイベント → 切り出し 効果測定に使っている 3. 重要ページビュー → 削除 存在が不明。副作用を使う 4. 外部フォーム計測 → 別機能 fO に情報が残らない 使われている機能だったが、存在理由がわからない物たち 紐解いていくと「『コンバージョン』ではないね」 コンバージョン
Slide 41
Slide 41 text
システムの作り直し
Slide 42
Slide 42 text
元のシステム ストリームで解析して 指標ごとにインクリメント
Slide 43
Slide 43 text
ログを溜めてバッチで解析、 全体を集計する 新しいシステム
Slide 44
Slide 44 text
スッキリ & データがずれない
Slide 45
Slide 45 text
2021.07 リリース
Slide 46
Slide 46 text
その過程でのすったもんだ
Slide 47
Slide 47 text
1. リファクタリングの必要性 2. 機能を整える必要性 3. 目的を見極める 4. 実装を妥協しない 5. 開発体質の改善 過程の話
Slide 48
Slide 48 text
リファクタの必要性
Slide 49
Slide 49 text
エンジニアにしかシステムの状態はわからない このままだと老い先短い状態だと理解してもらう 「レポートがおかしい」に対して、リファクタ提案 ● その場しのぎでは無理 ● 状態の数字出し ● コードの状態を図示 ● 原因のプロット リファクタが必要だということ
Slide 50
Slide 50 text
数字を集めて突き合わせると... ● CV数が実 CV の 92% しかない ● アクセスログと集計データを突合すると 76% しか合わない 状態数字
Slide 51
Slide 51 text
クラスの依存関係を洗い出し 一目で悲惨な状態がわかる コードの状態
Slide 52
Slide 52 text
システムがこんな感じ こんな流れで、 要所要所でこんな問題がある 虫食い状態を可視化 原因のプロット
Slide 53
Slide 53 text
リファクタが必要だけども・・・ ● 正直、どのくらいかかるかも今の段階ではわからない ● 調査含め進めながらスケジュールを引いて行きたい 横暴・・・でも理解してもらえた 理解してもらうために
Slide 54
Slide 54 text
愚直にシステムの状態を理解して、わかりやすい形にしていく なんで俺が・・・ コードも書けずに・・・・と泣いた夜もありました(ない とにかく愚直にコードを読みました 理解してもらうために
Slide 55
Slide 55 text
こんな感じでシートに grep 結果を書き溜めてました ちなみに
Slide 56
Slide 56 text
機能を整えること
Slide 57
Slide 57 text
プロダクトへの思想がぶれていた。世界が崩壊してた ● ピボット前の機能が残ってカオス ○ 今のターゲットには不要 ○ 副作用だけ必要 ● 消せない理由 ○ 開発リソース ○ 解約リスク 数%のために大多数が幸せになれない → 緩やかな死 機能を整理してみてわかったこと
Slide 58
Slide 58 text
さっきの例は結構省略しましたがw めちゃめちゃ議論しました プロダクトを良くしたい気持ちはみんな同じはず PM, CS, エンジニアなど関係者の認識を合わせていく 他者のやりたくないことも理解して一緒に考える 作るだけじゃなくて消すことも大事 機能を整えること
Slide 59
Slide 59 text
目的を見極める
Slide 60
Slide 60 text
既存コードをリファクタしようとしていた 当初の計画
Slide 61
Slide 61 text
No content
Slide 62
Slide 62 text
● テストコードはないし ● 原因っぽいものはあるし ○ コンバージョンモデルへのクエリで条件が抜けてる...? ○ 到達するレコードが時系列で前後するとバグるっぽい ○ スレッドセーフじゃない...? ● スパゲッティだし 当初の計画
Slide 63
Slide 63 text
● テストコードはないし ● 原因っぽいものはあるし ○ コンバージョンモデルへのクエリで条件が抜けてる...? ○ 到達するレコードが時系列で前後するとバグるっぽい ○ スレッドセーフじゃない...? ● スパゲッティだし コードを整えないと理解が無理だ... 当初の計画
Slide 64
Slide 64 text
「ぺっぱー最近何やってるのー?」 「レポートの数値がおかしいのでリファクタやってて」 「かくかくしかじか」 「面白そうだねー。話聞かせてよ」 「そ、それは....正しくなるはずです...!!」 「そっかー。でもそれでレポートの数値は正しくなるのかい?」 「結局ぺっぱーの敵は誰なんだい?」 「本当かなー?」 「え、だから、スパゲッティをリファクタしたいんです!」 「そもそも何をやりたいんだっけ?リファクタするのが目的なんだっけ?」 「どうなったら『正しい』と言えるんだい?」 < > 「ぐぬぬ...」
Slide 65
Slide 65 text
「ぺっぱー最近何やってるのー?」 「レポートの数値がおかしいのでリファクタやってて」 「かくかくしかじか」 「面白そうだねー。話聞かせてよ」 「そ、それは....正しくなるはずです...!!」 「そっかー。でもそれでレポートの数値は正しくなるのかい?」 「結局ぺっぱーの敵は誰なんだい?」 「本当かなー?」 「え、だから、スパゲッティをリファクタしたいんです!」 「そもそも何をやりたいんだっけ?リファクタするのが目的なんだっけ?」 「どうなったら『正しい』と言えるんだい?」 < > 「ぐぬぬ...」 気づけば 手段が目的に...!
Slide 66
Slide 66 text
どんな状態が理想なのか、思いを馳せる ● レポートでは CV 数が正しいことが一番大事 → ユーザーの売上に直結する数字だから ● 「 ferret One における CV 」は何? → お問い合わせ 「お問い合わせ = CV 」の状況を作るべき 「 CV が 4種類」の仕様を変える → さっきの話 戦略を練り直す
Slide 67
Slide 67 text
それをやることで何を実現したいのかを考える 見切り発車しない 目的を見極める
Slide 68
Slide 68 text
実装を妥協しない
Slide 69
Slide 69 text
計画 v1 ● 既存のリファクタ ○ 解析・集計 ○ レポートクエリ ● マイクロサービス ● React & GraphQL 計画の変遷
Slide 70
Slide 70 text
計画 v1 ● 既存のリファクタ ● マイクロサービス ● React & GraphQL 計画の変遷
Slide 71
Slide 71 text
計画 v2 ● 追加リファクタ New ● DynamoDB の見直し New ● 既存のリファクタ ● マイクロサービス ● React & GraphQL 計画の変遷
Slide 72
Slide 72 text
お問い合わせを CV に変換してあげれば良い リファクタしてその変換処理を突っ込めばいい! > ここで「お問い合わせ = CV 」にする話
Slide 73
Slide 73 text
「今のストリームとバッチで回すのがベストな方法なんだっけ?」 「やっぱり集計スクリプトを直せばいいですよね?」 < > 「ビッグデータの一般的な手法を知りたいよね?」 うーん。。。(時間がない ... > 確かに。調べてみますね > < 違うとしても、それをわかった上で実装するのとまた違うよね
Slide 74
Slide 74 text
以前:完全増分アーキテクチャ → 実は一般的な問題がたくさんあった さらに一般的なプラクティスにも従えてない 保存場所:データレイク、DWH、データマート 保存方法:ファクトテーブル、スタースキーマ... バッドプラクティスの盛り合わせ → 待つのは緩やかな死 ベストの方法を探す旅 アーキテクチャから変えましょう >
Slide 75
Slide 75 text
計画 v3 ● 追加リファクタ ● DynamoDB の見直し ● 既存のリファクタ ● マイクロサービス ● 解析作り直し New ● DB クエリを SQL New ● React & GraphQL 計画の変遷
Slide 76
Slide 76 text
● ストリーム?バッチ? ● DWH のスキーマ ● バッチの管理は? ● マイクロサービス 今の仕様を再現しつつも、 最適解はなんなのか v3 の議論
Slide 77
Slide 77 text
喧々諤々
Slide 78
Slide 78 text
ひたすら議論してベストを突き詰められた 貴重な経験 ● スケジュールを気にして解決策を探しがち ● 立ち止まって周りを見回すと、結果早いこともある (元の計画だとスケジュール内に終わらなかったと思う) 実装を妥協しない
Slide 79
Slide 79 text
開発体質の改善
Slide 80
Slide 80 text
● PR の説明が真っ白 ● 1PR が巨大 ● 指摘・議論の形跡もない という状態なので ● ノールックでマージしてたんじゃ...? ● 経緯・背景がわからないので、資産になってない もともとの PR / コードレビュー
Slide 81
Slide 81 text
ひたすら Request Changes ● PR のテンプレ作って、必ず書きましょう ● PR は細かく分けましょう ● テストコード書きましょう ● Linter 入れたので従いましょう ● こっちの設計がいいと思う 全部の PR をレビューした 1ヶ月間 体質改善 > > > > >
Slide 82
Slide 82 text
時系列的には一番最初にやった取り組み 水際対策 自分のところが整っても、別ラインの開発で負債が作られる 体質改善
Slide 83
Slide 83 text
ということで
Slide 84
Slide 84 text
リニューアルに立ち向かった彼だった。放つパンチの感触は気のせいで、気づ けば目隠しでリングの外に立っていた。 しかし、仲間の助言でリングに戻り、 理解と協力でワンツーコンビネーションを決めたのでした。 めでたしめでたし...?
Slide 85
Slide 85 text
まとめ
Slide 86
Slide 86 text
● 良く見たらリニューアルじゃなかった ● ただ作り直す以上のやり方がある ● プロダクトの根幹から理解して向き合うの大事 ● 理解と協力してくれた仲間・会社に感謝 まとめ
Slide 87
Slide 87 text
ありがとうございました