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
アプリケーションの拡大に伴う開発者体験の悪化をなんとかする
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Tetsuya Fukuda
November 22, 2025
Programming
79
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アプリケーションの拡大に伴う開発者体験の悪化をなんとかする
Tetsuya Fukuda
November 22, 2025
More Decks by Tetsuya Fukuda
See All by Tetsuya Fukuda
blitz_test_speed.pdf
ghken
0
150
辛くない受託開発
ghken
0
3.1k
Other Decks in Programming
See All in Programming
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
0
100
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
800
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
33k
APNsからLive Activityを開始する話
yumnumm
0
170
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
450
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
190
Performance Optimization With LLMs
xleitix
0
140
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
600
How to train your dragon (web standard)
notwaldorf
96
6.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Between Models and Reality
mayunak
4
500
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Odyssey Design
rkendrick25
PRO
2
880
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
540
Building an army of robots
kneath
307
47k
Navigating Weather and Climate Data
rabernat
0
560
Transcript
TSKaigi Hokuriku 2025 アプリケーションの拡大に伴う 開発者体験の悪化を なんとかする 福田哲也(@gendaihyousyou) @2025-11-22
自己紹介 福田 哲也 (@gendaihyousyou) 株式会社 RIT CTO/CHRO
京都在住 Web技術と入力デバイスが好きです
背景:規模の大きな業務アプリのリプレース 100+テーブル の大規模アプリケーション Hono + Drizzle ORM +
zod の技術スタック エンドツーエンドの型安全を実現
問題の顕在化(DX悪化) エディタ補完が秒〜10秒超で遅延 TypeScriptサーバーが頻繁にクラッシュ CI/CDのビルド時間増加 テスト実行がテスト数に比例して遅延 →
生産性低下
課題1: 型推論による補完の遅延 型推論の処理フロー 1 ルート定義の収集 2 zodスキーマから入力型を推論 3 Drizzleクエリから返り値型を推論 4
エンドポイント数 × リレーション数 で負荷増大
検証1: 型定義の事前生成
対応方針 型定義を動的に推論させるのではなく、 型定義ファイルを先に生成してそれを クライアントの型定義に使う
ベンチマーク結果 前提条件 同一コミット・同一tsconfigで計測 キャッシュクリア後に3回実行の平均値 対象プロジェクト: Hono +
Drizzle ORM + zod、100+テーブルの大 規模アプリ 結果(ビルド/型チェック時間) 動的型推論: 2.37秒 事前生成: 0.45秒 約5.3倍高速化
採用しなかった理由 型定義の再生成が必要 コードが変更されるたびに .d.ts ファイルの再生成が必要になり、運用コ ストが高い 既存ワークフローへの影響大 開発・ビルド・デプロイプロセスの変更が必要になり、チーム全体の生
産性に影響
検証2: tsgoを使ってみる
対応方針 TypeScript 5.9.3の代わりにtsgoを使用して型チェックを高速化す る
ベンチマーク結果 前提条件 同一コミット・同一tsconfigで計測 キャッシュクリア後に3回実行の平均値 対象プロジェクト: Hono +
Drizzle ORM + zod、100+テーブルの大 規模アプリ 結果(ビルド/型チェック時間) 動的型推論: 2.37秒 tsgo: 0.92秒 約2.6倍高速化
採用理由とVS Codeでの導入 採用理由 既存ワークフローの変更が不要 エディタ補完が体感で高速化 開発者が意識せずに恩恵を受けられる VS
Codeでの導入 settings.json: "typescript.experimental.useTsgo": true
課題2: テスト実行速度の低下 テスト件数に比例して実行時間が増加 100+テーブルの全クリアが毎回実行 テスト間のTRUNCATE&シードが重い beforeEach(async ()
=> { // 外部キー無効化 await db.execute(...); // 100+テーブル全クリア for (... i <= 100; ...) { await db.execute(`TRUNCATE ...`); } });
改善1: TRUNCATE → DELETE + tmpfs DELETE への変更 テーブル全体のリセットではなく行単位の削除で効率化 tmpfs
導入 ディスクI/OをメモリアクセスOに置換えて高速化 結果(50テストケース) 通常DELETE: 7.84秒 tmpfs: 3.00秒 約2.6倍高速化
改善2: トランザクションのロールバック Railsから学んだ手法: テスト実行→自動ロールバック ヘルパー関数でラップしてfinallyで例外をthrow 劇的な高速化 3.00秒
→ 0.12秒(25倍) 詳しい実装はHonoの例で解説します
Honoのテストで使うなら ハンドラ内で context からDBを取得する実装パターン withTransaction ヘルパーでテストをラップ testFailure変数 でテスト失敗を保存し、例外を適切に再 スロー
tx.rollback() を明示的に呼び出して確実にロールバ ック // withTransactionヘルパー関数 function withTransaction(fn) { return async () => { let testFailure; try { await db.transaction(async (tx) => { const request = async (path, init) => { return await app.request(path, init, { db: tx }); }; try { await fn(tx, request); } catch (e) { testFailure = e; } // 明示的にロールバック tx.rollback(); }); } catch (e) { if (testFailure) throw testFailure; if (e instanceof DrizzleError) { return; } throw e;
パフォーマンス比較まとめ 2つの主要課題に対する解決策の実測パフォーマンス改善率 型補完・ビルド 動的型推論: 2.37秒 tsgo: 0.92秒 事前生成: 0.45秒 tsgo:約2.6倍高速化
事前生成:約5.3倍高速化 テスト(50ケース) DELETE: 3.00秒 トランザクショ ン: 0.12秒 約25倍高速化
おわりに アプリだけでなく DXも計測しよう!