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
10年物のRailsアプリにキャッチアップ! 〜コードを読まずに理解したかった〜 STORES Tech Conf 2024 "New Engineering" 2024-09-25 Mari Imaizumi @ima1zumi
Slide 2
Slide 2 text
自己紹介 2 - Mari Imaizumi @ima1zumi - 2024/04入社 - STORES 予約 の開発をしている - ruby/irb, ruby/relineのコミッタ
Slide 3
Slide 3 text
STORES 予約 とは 3 予約、決済、顧客管理ができるシステム
Slide 4
Slide 4 text
STORES 予約 とは 4 - バックエンドはRuby on Rails - First commitから11年目 - コアな開発者約13人
Slide 5
Slide 5 text
STORES 予約 - 予約者画面 5
Slide 6
Slide 6 text
STORES 予約 - 予約者画面 6
Slide 7
Slide 7 text
STORES 予約 - 予約者画面 7
Slide 8
Slide 8 text
STORES 予約 - 予約者画面 8
Slide 9
Slide 9 text
STORES 予約 - 事業者側 9
Slide 10
Slide 10 text
STORES 予約 にジョインする前に思っていたこと 10 - 予約サービス、想像つきそう - Railsは経験ある - Newなプロジェクトでも何とかなるのでは
Slide 11
Slide 11 text
予約サービスは想像できるしいけるでしょう! 11
Slide 12
Slide 12 text
触り始めて分かった STORES 予約 の難しさ 12 - 多機能さ - 例: 月謝・回数券ごとに有効期限や予約可能回数 - 他サービス連携 - 移行過程の複雑さ - 例: 店舗アカウントが三世代存在 - ロジックの難しさ - 例: 予約可否の計算
Slide 13
Slide 13 text
PR: 予約枠計算の複雑さを体感するならこれ! 13
Slide 14
Slide 14 text
触り始めて分かった STORES 予約 の難しさ:11年分のコード 14 - 47万行 - Code 14万 - Test 23万 - 1087 Models - 705 Controllers
Slide 15
Slide 15 text
触り始めて分かった STORES 予約 の難しさ 15 思ってたより 難しい
Slide 16
Slide 16 text
それでも仲良くなりたい 16 1日の大半を共に過ごすアプリのことは知っておきたい いいところも悪いところも知って仲良くなりたい 健康でいてほしい
Slide 17
Slide 17 text
どうやったら予約のことを知れる? 17 コードを読めば分かる?
Slide 18
Slide 18 text
どうやったら予約のことを知れる? 18 プログラマの三大美徳 - 🦥 怠惰 - Laziness - 😡 短気 - Impatience - 👺 傲慢 - Hubris
Slide 19
Slide 19 text
どうやったら予約のことを知れる? 19 プログラマの三大美徳 - 🦥 怠惰 - Laziness - 知らないコードを読みとくのは面倒 - 😡 短気 - Impatience - コードを読むのは時間がかかる - 👺 傲慢 - Hubris - コードを読まなくてもきっと理解できる
Slide 20
Slide 20 text
どうやったら予約のことを知れる? 20 コードを読まずに STORES 予約 を 理解したい!
Slide 21
Slide 21 text
コードを読まずに STORES 予約 を理解したい 21 なるべくコードを読まずに理解するにはどうしたらいいか 自分がやったことや予約チームの知見を話す
Slide 22
Slide 22 text
コードを読まずに STORES 予約 を理解したい 22 - STORES 予約 ブートキャンプ - ER図 - ドキュメントを読む - 教えてもらう
Slide 23
Slide 23 text
コードを読まずに STORES 予約 を理解したい 23 - STORES 予約 ブートキャンプ - ER図 - ドキュメントを読む - 教えてもらう
Slide 24
Slide 24 text
STORES 予約 ブートキャンプ 24 - アプリの操作に慣れるためのクイズ集 - 初級・中級・上級・超上級
Slide 25
Slide 25 text
STORES 予約 ブートキャンプ 25 - 機能に触りながら慣れる - 自分の欲しいデータを作る方法がわかる - ニッチな機能をカバーできるように作られている
Slide 26
Slide 26 text
コードを読まずに STORES 予約 を理解したい 26 - STORES 予約 ブートキャンプ - ER図 - ドキュメントを読む - 教えてもらう
Slide 27
Slide 27 text
ER図 27 概要のER図と全てを網羅したER図がある
Slide 28
Slide 28 text
概要のER図 28 - 主要13モデルに絞ったER図 - 最も重要なモデルと関係がわかる - コード上で出会った時に気をつけるべきモデルがわかる
Slide 29
Slide 29 text
すべてを網羅したER図 29 - rails-mermaid_erd - Mermaid記法でER図を自動生成するgem - https://github.com/koedame/rails-mermaid_erd
Slide 30
Slide 30 text
すべてを網羅したER図 30 - モデル数が約1000個あるので必要なモデルに絞ってリ レーションを確認
Slide 31
Slide 31 text
すべてを網羅したER図 31 - GitHub ActionsでS3に自動デプロイしている - 社内認証を通して閲覧可能 - 手元でビルドしなくても常に最新版が引けて快適
Slide 32
Slide 32 text
コードを読まずに STORES 予約 を理解したい 32 - STORES 予約 ブートキャンプ - ER図 - ドキュメントを読む - 教えてもらう
Slide 33
Slide 33 text
ドキュメントを読む 33 - STORES 予約 のドキュメントは大きく3箇所にある - esa, Cosense, GitHub
Slide 34
Slide 34 text
ドキュメントを読む 34 - esa - 全社共通 - 現在15万件ほどの記事があり日々増加中 - STORES 予約 開発チームでは開発ドキュメントは Cosenseに置かれる事が多い - PRD、日報などはesa
Slide 35
Slide 35 text
35 - Cosense (旧Scrapbox) - STORES 予約 開発チームが最もよく使う - 開発に関わることなんでも書くページ - フロー情報もストック情報もある - チームのふりかえりからDesign Docまで - 現在約3000ページ ドキュメントを読む
Slide 36
Slide 36 text
ドキュメントを読む 36 - GitHub - ドキュメント用のリポジトリを切っている - ADRや意思決定の絡むドキュメントを共有 - Cosenseのコンテンツをエクスポート - Copilot Chat, ドキュメント検索botの参照先 - 詳しくはポスター発表「LLMを活用したくなったので過去 の類似Issuesを調べてくれる君を作った話」を参照
Slide 37
Slide 37 text
ドキュメントを読む: やっていること 37 - 知らないことがあったらまずCosenseを調べる - モデル名、Job名、知らない概念 - ヒットしなければCosenseにその名前でページを作る - Relineという単語がわからなければ、「Reline」 「Pure Ruby で書かれたGNU Readline互換のライン エディタ。IRBやDebugで使われている」
Slide 38
Slide 38 text
ドキュメントを読む: やっていること 38 - 一言でも書いておくことが重要 - 名前を付けることで育つ - Ref: https://scrapbox.io/support-doc-jp/必ずCosenseで探す
Slide 39
Slide 39 text
コードを読まずに STORES 予約 を理解したい 39 - STORES 予約 ブートキャンプ - ER図 - ドキュメントを読む - 教えてもらう
Slide 40
Slide 40 text
教えてもらう 40 - 知っている人がいるならこれが最も手っ取り早く正確 - 1on1で教えてもらった場合はドキュメントに残す - 知識を広げるため - 話しながら書くとその場でレビューもされて便利
Slide 41
Slide 41 text
教えてもらう 41 - LTしてもらう - STORES 予約 開発チームには毎週LTの場がある - 知りたい概念を知ってそうな人にLTしてもらう - 体系的にわかる - わかる人が増える
Slide 42
Slide 42 text
コードを読まずに理解したかった 42 - コードを読まずに分かったこと - 機能の概要 - 主要モデル・モデル間の関係 - ドキュメントにあること
Slide 43
Slide 43 text
触り始めて分かった STORES 予約 の難しさ 43 - 多機能さ - ドキュメントである程度カバー - 移行過程の複雑さ - 詳細を知っている人に聞く - ロジックの難しさ - ドキュメントになっていない箇所 - 🤔
Slide 44
Slide 44 text
44 ここまでではまだ知り合い、友達の友達
Slide 45
Slide 45 text
45 ここまでではまだ知り合い、友達の友達 少し混みいった話になると...
Slide 46
Slide 46 text
46 コードを読まずに理解したかった - 例: CSV出力内容の変更 - 「複数CSVをまとめたCSVの右端に出力しているカ ラムを左端にして、CSVをまとめない場合も左端に 出力してほしい」 - 修正した結果がどこに影響するのか分からない - ドキュメントなし
Slide 47
Slide 47 text
47 コードを読まずに理解したかった
Slide 48
Slide 48 text
コードを読まずに理解したかった 48 - コードを読まないと分からないこと - ドキュメントになっていないこと - 細かいふるまい - 変更を加えたいときにどうすればいいのか
Slide 49
Slide 49 text
49 仲良くなるためにはもう一歩踏み込まなければ
Slide 50
Slide 50 text
50 読むか...
Slide 51
Slide 51 text
51 どうやってコードを読むか
Slide 52
Slide 52 text
どうやってコードを読むか 52 - 解きたいことを明らかにする - 何を解決したくてコードを読むのか - ex: 引数に何を渡しているのか分からない - コードの中で迷子になる - 関連情報がないか探す - Git blameから実装時のPRを見て実装時のドキュメ ントや設計を探す
Slide 53
Slide 53 text
どうやってコードを読むか 53 - ざっと処理の流れを追うとき - クラスやメソッド名に着目 - 詳細に知りたいとき - プリントデバッグ - 値がどう渡ってどう変化していくのかを目的地まで 見る
Slide 54
Slide 54 text
読んでみよう 54 - 実際に知らない機能を調べてみよう - 問い合わせ例:STORES 予約 と連携しているGoogleカ レンダーに予約が連携されない - 予約番号: 0の予約がGoogleカレンダー側に連携さ れていない
Slide 55
Slide 55 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 55 こたえ: Google カレンダーの権限が読み取りのみになって いた
Slide 56
Slide 56 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 56 - まずは機能の概要をCosenseで把握する
Slide 57
Slide 57 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 57 - まずは機能の概要をCosenseで把握する STORES 予約 の Google カレンダー 連携は2種類ある
Slide 58
Slide 58 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 58 - 問題の切り分け - Googleカレンダー連携されているか - Cosenseからどのモデルで管理しているか探す Shop GoogleCalendar
Slide 59
Slide 59 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 59 - どこまでは成功しているんだろう? - リクエスト・レスポンスログの探し方が分からない - ログ出してるところ追ってみよう
Slide 60
Slide 60 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 60 - どこからリクエストしてるのかわからない... - calendar_idが何らかの形でログに出ているのでは
Slide 61
Slide 61 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 61 - ログからcalendar_idで検索してそれらしきログを発見 - Job名が判明して出力内容もわかる
Slide 62
Slide 62 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 62 連携成功したログしか残ってない
Slide 63
Slide 63 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 63 - 該当の予約に対してGoogle カレンダーへの連携状態が どうなってるかみてみよう - 連携状態をどこで管理しているかCosenseで探す Reservation GoogleCalendarEvent
Slide 64
Slide 64 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 64 - schema.rbを見てそのモデルがどんな情報を持っている か確認 Reservation GoogleCalendarEvent
Slide 65
Slide 65 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 65 - event_idがnilだった - おや?
Slide 66
Slide 66 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 66 - どんなときにevent_idがnilになるのか
Slide 67
Slide 67 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 67 - event_idの更新箇所や使われ方をgrepして探す - insert_to_google_calendar!の条件にnilがあるという ことは連携前ステータスを表現している可能性が高そう
Slide 68
Slide 68 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 68 - 同期失敗してる可能性がある?
Slide 69
Slide 69 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 69 - 同期失敗してる可能性が高い
Slide 70
Slide 70 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 70 - 同期失敗してる可能性が高い - レコードを見るとsuspended? == true
Slide 71
Slide 71 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 71 - suspended? == true になる条件は? - Cosenseにあった - 連携失敗するパターンがいろいろあり見落としていた
Slide 72
Slide 72 text
コードを読む 72 仮説を立てる、コードを見る、コードを書き換える、コー ドを実行する、結果を見る、のループ
Slide 73
Slide 73 text
コードを読む 73 これはお仕事以外でやったことがある! OSSのコードリーディングと同じ
Slide 74
Slide 74 text
コードを読む 74 - OSSでのコードリーディング - 作者不在だったり気軽に聞けないこともある - ドメイン知識がない - わかるまで分解するために大量にコメントした - インプットとして何を入れたら何が起こるのかを見た - お仕事のコードリーディングも同じ
Slide 75
Slide 75 text
コードを読む 75 - 読んで触ると理解が進む - コードベースのクセに慣れる - でもコードを読まずに分かることもたくさんある - アプリの挙動を知っていればコードをみたときに挙 動から何をしているのか想像がつく - 事前情報によってコードの可能性が狭まる
Slide 76
Slide 76 text
コードを読む 76 - 概要はコードを読まずに理解! - 詳細はコードを読んで理解! - コードを読んだら次は読まなくて良いようにドキュメン トを残したりリファクタリングしたりしよう
Slide 77
Slide 77 text
コードを読む 77 基本に忠実であることが New Engineering に繋がる
Slide 78
Slide 78 text
デバッグ 78 - binding.irb - 対話環境を起動 - RSpec経由で実行することが多い - Debugにシームレスに移行することもできる - grep - LSP - Solargraph
Slide 79
Slide 79 text
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 79 - 問題の切り分け - 連携日時前の予約に関する問い合わせではないか - STORES 予約 の仕様上連携日時開始前の予約は 連携されない - 連携日時開始前ではない