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

ありがとうございました