Slide 1

Slide 1 text

水産業ドメイン可視化と実装のコツ 〜釣って捌いて食べてみる〜 株式会社ウーオ PM 三京俊雄

Slide 2

Slide 2 text

自己紹介 三京俊雄(さんきょう としお)/ 3to_day 2020年にウーオに2人目のエンジニアとして入社 現在はPM兼エンジニア (PM:8割, エンジニアリング:2割) UUUOで魚の捌き方習得中 最近はサワラにハマっている

Slide 3

Slide 3 text

本日お話しすること 水産業の流通を変えるスタートアップとして、 未知の業務(ドメイン)を理解し、一つの共通理解として抽象化したモデルを作 り、プロダクト内に実装し、運用してきました。 その中で見えてきたコツ、考え方を共有できればと思います。

Slide 4

Slide 4 text

アジェンダ ● UUUOとは(何をしているか) ● UUUOのプロダクトチームの特徴 ● 水産業ドメインの一例 ● ドメイン可視化と実装のコツ 1. ドメインをモデルにするときのポイント(釣りにでかける) 2. モデルを実装にするポイント(さばく) 3. 作ったモデルをワークさせる(食べてみる) ● まとめとこれから

Slide 5

Slide 5 text

UUUOとは(何をしているか)

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

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

UUUOプロダクトチームの特徴

Slide 13

Slide 13 text

● バックエンド、フロントエンド、インフラの境界が薄い ○ インフラはほぼバックエンドで兼任 ● ユーザーヒアリングを重視して検証サイクルを素早く回す ● 施策ごとにオーナーを立てて推進 UUUOプロダクトチームの特徴 FrontEnd BackEnd UUUO Infra atohama 海外 飲食店 買付依頼 決済 全体最適 ログイン 産地

Slide 14

Slide 14 text

● バックエンド ○ Ruby on Rails ○ Heroku ○ Postgres ○ Firebase ○ GCP ○ Sentry ○ Terraform ● フロントエンド ○ Flutter Mobile ○ Flutter Web ○ React 環境周りなど

Slide 15

Slide 15 text

水産業のドメインの一例 水産物流の例

Slide 16

Slide 16 text

A: 市場間を定期で運行している市場便で輸送され、その後スーパーに配送されます ○ 卸売市場間をつなぐ物流網のこと ○ 大ロット一括輸送のためコストが抑えられる ○ 穴あき発泡(氷が溶けて水びだしにならないよう)を積載可能 水産業のドメインの一例 水産物流の例 Q: 産地から食卓に並ぶまでどうやって輸送されている?

Slide 17

Slide 17 text

一般的な個人配送型物流の場合 水産業のドメインの一例 水産物流の例 1000円 A地点 B地点 配送センター 運送会社は同じ

Slide 18

Slide 18 text

市場便の場合 水産業のドメインの一例 水産物流の例 380円 産地 宇都宮市場 豊洲市場 350円 A運送会社 B or C or D運送会社 宛先市場によっては運送会社が 変わる 豊洲の中では3社 => ウーオで請求と管理を巻き取りたい 足立市場 大宮市場

Slide 19

Slide 19 text

Before 産地-取引先間で送料を持つ ● 取引先増えるごとに送料設定をする 必要があり手間 ● 産地、取引先増えるたびにレコード爆増 ● 宛先データを送料内で管理 ● 一方、物流のステータスは個別で管理する 必要もあり、小回りは効く 水産業のドメインの一例 水産物流の例 送料データ

Slide 20

Slide 20 text

After 産地-市場間で送料を持つ + 組織間物流関係の定義 ● 取引先が増えるごとに送料設定をする 必要がなくなる ● 組織間物流関係でブラックリスト方式 ホワイトリスト方式を実現 ● 宛先データの自動作成 水産業のドメインの一例 水産物流の例 ホワイトリスト&ブラックリストの管理

Slide 21

Slide 21 text

ドメイン可視化と実装のコツ

Slide 22

Slide 22 text

ドメイン可視化と実装のコツ〜釣って捌いて食べてみる〜 1. ドメインを理解する (釣りにでかける)

Slide 23

Slide 23 text

● ドメインエキスパートを見つける。(社内にいる) ○ スプレッドシートで管理されていることが多い ● 解像度をあげる/絵を描けるぐらいになる 1. ドメインを理解する (釣りにでかける)

Slide 24

Slide 24 text

ドメインエキスパートを見つける。(社内にいると良い。いるはず) ● スプレッドシートで管理されていることが多い ● ひたすらヒアリングして、管理されている内容を叩き込む ● 場合によってはスプレッドシートの運用のままの方が、いいこともある ○ 変更頻度が多い、ルールが定まっていないケースなど 1. ドメインを理解する (釣りにでかける)

Slide 25

Slide 25 text

解像度をあげる ● 現地に行く(or 行ってもらって話を聞く) 1. ドメインを理解する (釣りにでかける)

Slide 26

Slide 26 text

絵を描けるぐらいになる ● 関係者とタイムスケジュールまで イメージを持てるように 理解する 1. ドメインを理解する (釣りにでかける)

Slide 27

Slide 27 text

ドメイン可視化と実装のコツ 2. ドメインをモデル&実装にする (さばく)

Slide 28

Slide 28 text

● 言語化していく(ユビキタス言語) ● 既存の運用を考慮して落とし所を探る 2. ドメインをモデルに落とし込む (さばく)

Slide 29

Slide 29 text

言語化していく(ユビキタス言語) 2. ドメインをモデルに落とし込む (さばく) 380円 産地 宇都宮市場 豊洲市場 350円 A運送 B or C or D運送会社 直便 中継便 気付会社

Slide 30

Slide 30 text

言語化していく(ユビキタス言語) ● 「〇〇が ~~を△△する」という定義を作って、ドメインエキスパート、関係者に合意をとる ● 例外パターンが結構出てくるので、実際の事例を交えてイレギュラーケースがないかをしっかり確認 ○ リアルな名称で聞くことが大事 2. ドメインをモデルに落とし込む (さばく) モデルとして定義できそうなものを抽出

Slide 31

Slide 31 text

言語化していく(ユビキタス言語化) ● ja.ymlにユビキタス言語を定義(rspecで必須化して定義漏れ防止) 2. ドメインをモデルに落とし込む (さばく)

Slide 32

Slide 32 text

既存の運用を考慮して落とし所を探る ● セールス/CSのリソースを考慮する ○ 一括移行できるのか、少しずつ移行するのか ● 無理ない設計にして最初から作りすぎない ● UXも考慮する ○ 継続的に管理できるように 2. ドメインをモデルに落とし込む (さばく) デザイナー/CSと話して管理画面の運用を決める

Slide 33

Slide 33 text

ドメイン可視化と実装のコツ 3. 実際に運用して改善する(食べてみる)

Slide 34

Slide 34 text

3. 実際に運用して改善する(食べてみる) ● 本当にやりたかったことができているかを確認 ● 入力されたデータを活用していくことを考慮していく ● UXをヒアリングし、改善する(味付けを改善) 定義されたモデルを活用していく (宛先印刷の例) Before After

Slide 35

Slide 35 text

まとめとこれから

Slide 36

Slide 36 text

ドメイン可視化と実装のコツ ● ドメインを理解する(釣りにでかける) ○ ドメインエキスパートを見つける。(社内にいる) ○ 解像度をあげる/絵を描く ● ドメインをモデルに落とし込む(さばく) ○ 言語化していく(ユビキタス言語) ○ 既存の運用を考慮して落とし所を探る ● 実際に運用して改善する(食べてみる) ○ 本当にやりたかったことができているかを確認 まとめとこれから

Slide 37

Slide 37 text

課題 ● Active Recordにドメインロジック書きがち ● Fat Modelになりがち ありがち? まずはPORO(Plain Old Ruby Object)で切り出していきたい まとめとこれから 購入 出品 価格計算 ロジック 価格計算 ロジック 類似ロジック

Slide 38

Slide 38 text

ギョ清聴ありがとうございました!! 水産業の裏側をともにハックしていきたい メンバーを募集しております!