Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
新しい職場の CI が 20 分かかっていたらあなたならどうする?
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kazuhiko Yamashita
June 18, 2025
1.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
新しい職場の CI が 20 分かかっていたらあなたならどうする?
golang.tokyo #39でお話してきました。
Kazuhiko Yamashita
June 18, 2025
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2.6k
継続的な負荷検証を目指して
pyama86
3
1.8k
成長期における、 ユーザー領域の複雑さと 整備の進め方
pyama86
1
790
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
6.7k
Managing Database Migrations in Go Backend Systems
pyama86
0
580
事業を差別化する技術を生み出す技術
pyama86
4
2.4k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
11k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
2.2k
Tuning GraphQL on Rails
pyama86
2
2.9k
Featured
See All Featured
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
4 Signs Your Business is Dying
shpigford
187
23k
Speed Design
sergeychernyshev
33
2.1k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Paper Plane
katiecoart
PRO
4
53k
Transcript
新しい職場の CI が 20 分かかっていたら あなたならどうする? 2025.01.26 P山@GO株式会社
© GO Inc. 文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください
© GO Inc. 3 GO株式会社 山下 和彦 所属 開発本部 ソフトウェア開発統括部
バックエンド開発部 バックエンド1グループ @pyama86
© GO Inc. 4 バックエンドAPIの概要 『GO』アプリのメイン処理を担当する巨大モノリス テストはhandlerパッケージとそれ以外で実行環境を分離 - handlerテストは4つのワーカで分割してそれぞれ20分 handler配下のファイル数は1500個程度
© GO Inc. 5 なぜテストが遅い? 1. ファイル数やコード数が単純に多い 2. handler配下がほぼ単一パッケージ 3.
go test -p 1がついてる a. こういうのがいっぱいあるから、並列でテストするとエラー test.CreateUser(User{ID: 1})
© GO Inc. 6 早くするには? 1. ファイル数やコード数が単純に多い → 減らす 2.
handler配下がほぼ単一パッケージ → 分割する 3. go test -p 1がついてる -> 並列で実行する
© GO Inc. 7 パッケージ 分割
© GO Inc. 8 パッケージの分割 パッケージ分割のメリット - ビルドキャッシュの再利用性が高まりビルドが早くなる - テストプロセスが分離する
- 並列性が上がり、テスト実行時間が短縮される - 環境変数の適用範囲が限定される(例えばDBの接続先とかプロセ スごとに分けられる) - でも1500ファイルある・・・
© GO Inc. 9 pachanger作った GoのCLIコマンド - pachangerの機能 1. パッケージのリネーム
a. foo.Hogeからfuga.Hogeのように書き換えて、利用箇所も全部 書き換える 2. シンボルのスコープの変更 a. パッケージのリネームに伴い、エクスポートが必要なシンボルは 小文字から大文字へ 3. 構造体のメンバーのスコープ変更 https://pyama.fun/archives/6463
© GO Inc. 10 パッケージのリネーム ファイル単位でパッケージをリネームする before/something.go after/something.go package before
func something() string { return Export() } func Export() { return “export” } package after func something() string { return before.Export() } func Export() { return “export” }
© GO Inc. 11 シンボルのスコープの変更 パッケージが変わると、プライベートな関数に アクセスできなくなる package after #
beforeからafterパッケージに書き換えられたファイル func something() { return before.hoge() }
© GO Inc. 12 gopls便利 renameサブコマンドを利用すると、呼び出し元含めて 書き換えてくれるのでsedより安全 # gopls [flags]
rename [rename-flags] <position> <name> $ gopls rename before.go:2:6 Hoge package before func hoge() { return “hoge” } package before func Hoge() { return “hoge” }
© GO Inc. 13 構造体のメンバーのスコープ変更 package after # # beforeからafterパッケージに書き換えられたファイル
bar = before.Bar { example: 1, } パッケージ分割後、異なるパッケージの構造体のメンバーに アクセスできない package before type Bar struct { example int }
© GO Inc. 14 構造体のメンバーのスコープ変更 package before type Bar struct
{ example int } type BarParamsForMigrate { Example int } func NewBarForMigrete(params *BarParamsForMigrate) * Bar { return &Bar{ example: params.Example } } こういうコードを自動生成する
© GO Inc. 15 構造体のメンバーのスコープ変更 package after bar = before.NewBarForMigrate(before.BarParamsForMigrate{
Example: 1, }) さらに呼び出し側も書き換える package after bar = before.Bar { example: 1, }
© GO Inc. 16 並列化
© GO Inc. 17 パッケージ分割で並列化したが DBを共有してるとレコードは重複する DB package before package
after Insert user id = 1 Insert user id = 1 Duplicate Entry
© GO Inc. 18 マネーフォワード、大好きです!!! https://tech.mfkessai.co.jp/2019/11/parallel-go-test/ DB1 package before DB2
DB3 try lock try lock try lock ロックを使って他のプロセスが使ってない DBを使う
© GO Inc. 19 DBを分離すると嬉しいこと 1. データが重複しなくなる 2. Truncate /
ALTER でのReset Auto Incrementの 待ち時間は馬鹿にならない
© GO Inc. 20 最後に 1. 現在は、20分→10分かかったりかからなかったり 2. パッケージを分割するとビルドもテストも早くなる 3.
既存の資産をある程度大胆に書き換えても、型があると 安心安全 4. 今日話してないことはGoConにCfP通ったら話す…
© GO Inc. モビリティまじで良くしたいと思ってます!! 21 私たちと一緒に 未来を作っていきませんか?