Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
10年物のRailsアプリにキャッチアップ!〜コードを読まずに理解したかった〜
Search
ima1zumi
October 15, 2024
0
61
10年物のRailsアプリにキャッチアップ!〜コードを読まずに理解したかった〜
https://storesinc.tech/conf/2024
ima1zumi
October 15, 2024
Tweet
Share
More Decks by ima1zumi
See All by ima1zumi
Exploring Reline: Enhancing Command Line Usability
ima1zumi
0
46
RubyKaigiの登壇者一覧ページを作った
ima1zumi
0
250
Relineのその後の生活
ima1zumi
0
190
IRB and Reline Kaigi 2024
ima1zumi
0
7
Exploring Reline: Enhancing Command Line Usability
ima1zumi
3
14k
Reline 1分 Cooking
ima1zumi
0
24
続・mruby/cにUTF-8 を実装する
ima1zumi
1
22
UTF-8 is coming to mruby/c
ima1zumi
4
5.2k
たのしいString
ima1zumi
1
550
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
870
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.4k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
A Tale of Four Properties
chriscoyier
157
23k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
YesSQL, Process and Tooling at Scale
rocio
170
14k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Why Our Code Smells
bkeepers
PRO
335
57k
Scaling GitHub
holman
459
140k
Making Projects Easy
brettharned
116
6k
Transcript
10年物のRailsアプリにキャッチアップ! 〜コードを読まずに理解したかった〜 STORES Tech Conf 2024 "New Engineering" 2024-09-25 Mari
Imaizumi @ima1zumi
自己紹介 2 - Mari Imaizumi @ima1zumi - 2024/04入社 - STORES
予約 の開発をしている - ruby/irb, ruby/relineのコミッタ
STORES 予約 とは 3 予約、決済、顧客管理ができるシステム
STORES 予約 とは 4 - バックエンドはRuby on Rails - First
commitから11年目 - コアな開発者約13人
STORES 予約 - 予約者画面 5
STORES 予約 - 予約者画面 6
STORES 予約 - 予約者画面 7
STORES 予約 - 予約者画面 8
STORES 予約 - 事業者側 9
STORES 予約 にジョインする前に思っていたこと 10 - 予約サービス、想像つきそう - Railsは経験ある - Newなプロジェクトでも何とかなるのでは
予約サービスは想像できるしいけるでしょう! 11
触り始めて分かった STORES 予約 の難しさ 12 - 多機能さ - 例: 月謝・回数券ごとに有効期限や予約可能回数
- 他サービス連携 - 移行過程の複雑さ - 例: 店舗アカウントが三世代存在 - ロジックの難しさ - 例: 予約可否の計算
PR: 予約枠計算の複雑さを体感するならこれ! 13
触り始めて分かった STORES 予約 の難しさ:11年分のコード 14 - 47万行 - Code 14万
- Test 23万 - 1087 Models - 705 Controllers
触り始めて分かった STORES 予約 の難しさ 15 思ってたより 難しい
それでも仲良くなりたい 16 1日の大半を共に過ごすアプリのことは知っておきたい いいところも悪いところも知って仲良くなりたい 健康でいてほしい
どうやったら予約のことを知れる? 17 コードを読めば分かる?
どうやったら予約のことを知れる? 18 プログラマの三大美徳 - 🦥 怠惰 - Laziness - 😡
短気 - Impatience - 👺 傲慢 - Hubris
どうやったら予約のことを知れる? 19 プログラマの三大美徳 - 🦥 怠惰 - Laziness - 知らないコードを読みとくのは面倒
- 😡 短気 - Impatience - コードを読むのは時間がかかる - 👺 傲慢 - Hubris - コードを読まなくてもきっと理解できる
どうやったら予約のことを知れる? 20 コードを読まずに STORES 予約 を 理解したい!
コードを読まずに STORES 予約 を理解したい 21 なるべくコードを読まずに理解するにはどうしたらいいか 自分がやったことや予約チームの知見を話す
コードを読まずに STORES 予約 を理解したい 22 - STORES 予約 ブートキャンプ -
ER図 - ドキュメントを読む - 教えてもらう
コードを読まずに STORES 予約 を理解したい 23 - STORES 予約 ブートキャンプ -
ER図 - ドキュメントを読む - 教えてもらう
STORES 予約 ブートキャンプ 24 - アプリの操作に慣れるためのクイズ集 - 初級・中級・上級・超上級
STORES 予約 ブートキャンプ 25 - 機能に触りながら慣れる - 自分の欲しいデータを作る方法がわかる - ニッチな機能をカバーできるように作られている
コードを読まずに STORES 予約 を理解したい 26 - STORES 予約 ブートキャンプ -
ER図 - ドキュメントを読む - 教えてもらう
ER図 27 概要のER図と全てを網羅したER図がある
概要のER図 28 - 主要13モデルに絞ったER図 - 最も重要なモデルと関係がわかる - コード上で出会った時に気をつけるべきモデルがわかる
すべてを網羅したER図 29 - rails-mermaid_erd - Mermaid記法でER図を自動生成するgem - https://github.com/koedame/rails-mermaid_erd
すべてを網羅したER図 30 - モデル数が約1000個あるので必要なモデルに絞ってリ レーションを確認
すべてを網羅したER図 31 - GitHub ActionsでS3に自動デプロイしている - 社内認証を通して閲覧可能 - 手元でビルドしなくても常に最新版が引けて快適
コードを読まずに STORES 予約 を理解したい 32 - STORES 予約 ブートキャンプ -
ER図 - ドキュメントを読む - 教えてもらう
ドキュメントを読む 33 - STORES 予約 のドキュメントは大きく3箇所にある - esa, Cosense, GitHub
ドキュメントを読む 34 - esa - 全社共通 - 現在15万件ほどの記事があり日々増加中 - STORES
予約 開発チームでは開発ドキュメントは Cosenseに置かれる事が多い - PRD、日報などはesa
35 - Cosense (旧Scrapbox) - STORES 予約 開発チームが最もよく使う - 開発に関わることなんでも書くページ
- フロー情報もストック情報もある - チームのふりかえりからDesign Docまで - 現在約3000ページ ドキュメントを読む
ドキュメントを読む 36 - GitHub - ドキュメント用のリポジトリを切っている - ADRや意思決定の絡むドキュメントを共有 - Cosenseのコンテンツをエクスポート
- Copilot Chat, ドキュメント検索botの参照先 - 詳しくはポスター発表「LLMを活用したくなったので過去 の類似Issuesを調べてくれる君を作った話」を参照
ドキュメントを読む: やっていること 37 - 知らないことがあったらまずCosenseを調べる - モデル名、Job名、知らない概念 - ヒットしなければCosenseにその名前でページを作る -
Relineという単語がわからなければ、「Reline」 「Pure Ruby で書かれたGNU Readline互換のライン エディタ。IRBやDebugで使われている」
ドキュメントを読む: やっていること 38 - 一言でも書いておくことが重要 - 名前を付けることで育つ - Ref: https://scrapbox.io/support-doc-jp/必ずCosenseで探す
コードを読まずに STORES 予約 を理解したい 39 - STORES 予約 ブートキャンプ -
ER図 - ドキュメントを読む - 教えてもらう
教えてもらう 40 - 知っている人がいるならこれが最も手っ取り早く正確 - 1on1で教えてもらった場合はドキュメントに残す - 知識を広げるため - 話しながら書くとその場でレビューもされて便利
教えてもらう 41 - LTしてもらう - STORES 予約 開発チームには毎週LTの場がある - 知りたい概念を知ってそうな人にLTしてもらう
- 体系的にわかる - わかる人が増える
コードを読まずに理解したかった 42 - コードを読まずに分かったこと - 機能の概要 - 主要モデル・モデル間の関係 - ドキュメントにあること
触り始めて分かった STORES 予約 の難しさ 43 - 多機能さ - ドキュメントである程度カバー -
移行過程の複雑さ - 詳細を知っている人に聞く - ロジックの難しさ - ドキュメントになっていない箇所 - 🤔
44 ここまでではまだ知り合い、友達の友達
45 ここまでではまだ知り合い、友達の友達 少し混みいった話になると...
46 コードを読まずに理解したかった - 例: CSV出力内容の変更 - 「複数CSVをまとめたCSVの右端に出力しているカ ラムを左端にして、CSVをまとめない場合も左端に 出力してほしい」 -
修正した結果がどこに影響するのか分からない - ドキュメントなし
47 コードを読まずに理解したかった
コードを読まずに理解したかった 48 - コードを読まないと分からないこと - ドキュメントになっていないこと - 細かいふるまい - 変更を加えたいときにどうすればいいのか
49 仲良くなるためにはもう一歩踏み込まなければ
50 読むか...
51 どうやってコードを読むか
どうやってコードを読むか 52 - 解きたいことを明らかにする - 何を解決したくてコードを読むのか - ex: 引数に何を渡しているのか分からない -
コードの中で迷子になる - 関連情報がないか探す - Git blameから実装時のPRを見て実装時のドキュメ ントや設計を探す
どうやってコードを読むか 53 - ざっと処理の流れを追うとき - クラスやメソッド名に着目 - 詳細に知りたいとき - プリントデバッグ
- 値がどう渡ってどう変化していくのかを目的地まで 見る
読んでみよう 54 - 実際に知らない機能を調べてみよう - 問い合わせ例:STORES 予約 と連携しているGoogleカ レンダーに予約が連携されない -
予約番号: 0の予約がGoogleカレンダー側に連携さ れていない
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 55 こたえ: Google カレンダーの権限が読み取りのみになって いた
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 56 - まずは機能の概要をCosenseで把握する
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 57 - まずは機能の概要をCosenseで把握する STORES 予約 の Google
カレンダー 連携は2種類ある
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 58 - 問題の切り分け - Googleカレンダー連携されているか - Cosenseからどのモデルで管理しているか探す
Shop GoogleCalendar
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 59 - どこまでは成功しているんだろう? - リクエスト・レスポンスログの探し方が分からない - ログ出してるところ追ってみよう
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 60 - どこからリクエストしてるのかわからない... - calendar_idが何らかの形でログに出ているのでは
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 61 - ログからcalendar_idで検索してそれらしきログを発見 - Job名が判明して出力内容もわかる
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 62 連携成功したログしか残ってない
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 63 - 該当の予約に対してGoogle カレンダーへの連携状態が どうなってるかみてみよう - 連携状態をどこで管理しているかCosenseで探す
Reservation GoogleCalendarEvent
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 64 - schema.rbを見てそのモデルがどんな情報を持っている か確認 Reservation GoogleCalendarEvent
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 65 - event_idがnilだった - おや?
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 66 - どんなときにevent_idがnilになるのか
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 67 - event_idの更新箇所や使われ方をgrepして探す - insert_to_google_calendar!の条件にnilがあるという ことは連携前ステータスを表現している可能性が高そう
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 68 - 同期失敗してる可能性がある?
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 69 - 同期失敗してる可能性が高い
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 70 - 同期失敗してる可能性が高い - レコードを見るとsuspended? == true
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 71 - suspended? == true になる条件は? -
Cosenseにあった - 連携失敗するパターンがいろいろあり見落としていた
コードを読む 72 仮説を立てる、コードを見る、コードを書き換える、コー ドを実行する、結果を見る、のループ
コードを読む 73 これはお仕事以外でやったことがある! OSSのコードリーディングと同じ
コードを読む 74 - OSSでのコードリーディング - 作者不在だったり気軽に聞けないこともある - ドメイン知識がない - わかるまで分解するために大量にコメントした
- インプットとして何を入れたら何が起こるのかを見た - お仕事のコードリーディングも同じ
コードを読む 75 - 読んで触ると理解が進む - コードベースのクセに慣れる - でもコードを読まずに分かることもたくさんある - アプリの挙動を知っていればコードをみたときに挙
動から何をしているのか想像がつく - 事前情報によってコードの可能性が狭まる
コードを読む 76 - 概要はコードを読まずに理解! - 詳細はコードを読んで理解! - コードを読んだら次は読まなくて良いようにドキュメン トを残したりリファクタリングしたりしよう
コードを読む 77 基本に忠実であることが New Engineering に繋がる
デバッグ 78 - binding.irb - 対話環境を起動 - RSpec経由で実行することが多い - Debugにシームレスに移行することもできる
- grep - LSP - Solargraph
読んでみよう:STORES 予約 と連携しているGoogleカレンダーに予約が連携されない 79 - 問題の切り分け - 連携日時前の予約に関する問い合わせではないか - STORES
予約 の仕様上連携日時開始前の予約は 連携されない - 連携日時開始前ではない