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を届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.6k
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
210
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.7k
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
140
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
はてなアカウント基盤 State of the Union
cockscomb
1
1.2k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
330
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
620
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
810
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
180
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
240
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
The Cost Of JavaScript in 2023
addyosmani
55
10k
How to train your dragon (web standard)
notwaldorf
97
6.7k
From π to Pie charts
rasagy
0
220
Accessibility Awareness
sabderemane
1
150
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
WCS-LA-2024
lcolladotor
0
670
Mobile First: as difficult as doing things right
swwweet
225
10k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Ethics towards AI in product and experience design
skipperchong
2
320
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
210
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も計測しよう!