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
アプリケーションの拡大に伴う開発者体験の悪化をなんとかする
Search
Tetsuya Fukuda
November 22, 2025
Programming
65
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
3k
Other Decks in Programming
See All in Programming
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
120
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.5k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
180
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
770
1B+ /day規模のログを管理する技術
broadleaf
0
120
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
310
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
270
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
スマートグラスで並列バイブコーディング
hyshu
0
270
Creating Composable Callables in Contemporary C++
rollbear
0
180
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
210
Featured
See All Featured
Statistics for Hackers
jakevdp
799
230k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Producing Creativity
orderedlist
PRO
348
40k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
210
So, you think you're a good person
axbom
PRO
2
2.1k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
190
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
From π to Pie charts
rasagy
0
220
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
It's Worth the Effort
3n
188
29k
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も計測しよう!