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
KAKEHASHI
PRO
July 14, 2025
Technology
3
290
安定した基盤システムのためのライブラリ選定
実践!バックエンドTypeScript〜現場から学ぶtsの可能性〜
https://findy.connpass.com/event/360678/
での登壇資料です
KAKEHASHI
PRO
July 14, 2025
Tweet
Share
More Decks by KAKEHASHI
See All by KAKEHASHI
生成AI時代に必要な価値ある意思決定を育てる「開発プロセス定義」を用いた中期戦略
kakehashi
PRO
1
340
プロダクトの成長に合わせたアーキテクチャの段階的進化と成長痛、そして、ユニットエコノミクスの最適化
kakehashi
PRO
1
150
ユーザー課題を愛し抜く――AI時代のPdM価値
kakehashi
PRO
1
240
「AIと一緒にやる」が当たり前になるまでの奮闘記
kakehashi
PRO
3
270
みんなのSRE 〜チーム全員でのSRE活動にするための4つの取り組み〜
kakehashi
PRO
2
220
医療系のプロダクト開発における生産性向上と高信頼性を両立させる生成AI活用
kakehashi
PRO
1
170
完璧を目指さない小さく始める信頼性向上
kakehashi
PRO
0
270
ユーザー理解の爆速化とPdMの価値
kakehashi
PRO
1
230
スプリントゴール未達症候群に送る処方箋
kakehashi
PRO
2
890
Other Decks in Technology
See All in Technology
DDD集約とサービスコンテキスト境界との関係性
pandayumi
3
280
AWSを利用する上で知っておきたい名前解決のはなし(10分版)
nagisa53
10
3.1k
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
110
Platform開発が先行する Platform Engineeringの違和感
kintotechdev
4
560
CDK CLIで使ってたあの機能、CDK Toolkit Libraryではどうやるの?
smt7174
4
160
S3アクセス制御の設計ポイント
tommy0124
3
200
2つのフロントエンドと状態管理
mixi_engineers
PRO
3
100
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
220
オブザーバビリティが広げる AIOps の世界 / The World of AIOps Expanded by Observability
aoto
PRO
0
370
生成AIでセキュリティ運用を効率化する話
sakaitakeshi
0
660
Webアプリケーションにオブザーバビリティを実装するRust入門ガイド
nwiizo
7
800
品質視点から考える組織デザイン/Organizational Design from Quality
mii3king
0
200
Featured
See All Featured
Fireside Chat
paigeccino
39
3.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Optimizing for Happiness
mojombo
379
70k
Agile that works and the tools we love
rasmusluckow
330
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
GitHub's CSS Performance
jonrohan
1032
460k
Facilitating Awesome Meetings
lara
55
6.5k
Scaling GitHub
holman
463
140k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Faster Mobile Websites
deanohume
309
31k
A better future with KSS
kneath
239
17k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
Transcript
©KAKEHASHI inc. 安定した基盤システムのための ライブラリ選定 2025/07/15 実践!バックエンドTypeScript〜現場から学ぶTSの可能性〜 株式会社カケハシ 岩佐 幸翠 (@kosui_me)
©KAKEHASHI inc. カケハシについて
©KAKEHASHI inc. #1 医療プロダクトを支える 基盤システム
©KAKEHASHI inc. 機能要求 #1 医療プロダクトを支える基盤システム • 認証・認可 複雑な状態遷移を伴う • ディレクトリサービス
ユーザー・店舗・テナント・グループ・組織階層... 複雑なリレーションシップが絡み合う • ライセンス 契約とコンプライアンスに直結する
©KAKEHASHI inc. 非機能要求 #1 医療プロダクトを支える基盤システム • セキュリティ 患者の薬歴などの要配慮個人情報を取り扱う • 可用性
医療の現場の業務を止めてはいけない • 移植性 基盤システムとして永く運用し続ける必要がある • 性能・拡張性 日本の薬局は約60,000店舗 薬局は常に一定の時間に開局・閉局する データ量やトラフィックはある程度上限が推定できる
©KAKEHASHI inc. #2 TypeScriptで 基盤システムを構築する
©KAKEHASHI inc. 基盤システムを構築するなら #2 TypeScriptで基盤システムを構築する 静的型付け言語で堅牢かつ効率的な基盤システムを構築したいなら 選択肢は数多くある • Java パターンマッチ・仮想スレッド・レコードパターン...
今なお進化し続ける言語 • Go ゴルーチンで高パフォーマンスなアプリケーションを容易に構築できる • Rust メモリ安全で表現力の高い言語
©KAKEHASHI inc. なぜTypeScript? #2 TypeScriptで基盤システムを構築する 基盤システムでは複雑な機能要件を表現したい 認証・認可、ディレクトリサービス、ライセンスなど 複雑な状態遷移とリレーションシップがコード上で表現されてほしい TypeScriptの型の表現力でモデリングする 値やエンティティ、そして状態を型で表現する
コードや仕様の誤りを型検査時に発見できる • 「関数型ドメインモデリング」 (アスキードワンゴ社) • TypeScript 関数型スタイルでバックエンド開発のリアル - Speaker Deck • TypeScript開発にRailway Orientedを持ち込み、より型安全なエラーハンドリングへ - Sansan Tech Blog
©KAKEHASHI inc. 例) ディレクトリサービス #2 TypeScriptで基盤システムを構築する OrgRoot OrgGroup OrgGroup OrgGroup
OrgStore OrgGroup OrgGroup OrgStore OrgStore 店舗の親は グループのみ グループの親は グループかルート ルートは親を 持たない 親子関係の正確な表現
©KAKEHASHI inc. 例) ディレクトリサービス #2 TypeScriptで基盤システムを構築する OrgRoot OrgGroup OrgGroup OrgGroup
OrgStore OrgGroup OrgGroup OrgStore OrgStore シグニチャを 見れば発生する エラーがわかる 振る舞いの事後条件を型で示す
©KAKEHASHI inc. TypeScriptを採用する場合の注意点 #2 TypeScriptで基盤システムを構築する • クラスや例外機構における型推論 😭 過去のJavaScriptコードへ漸近的に型付けできるように クラスに対する型推論はゆるめなことも多い
例) メソッド記法は双変になってしまう 😭 try-catch文ではすべての例外がunknown型になるため ランタイムでの型の検証が必須 • CPU boundな処理が苦手 Node.jsはシングルスレッド ✅ I/O boundな処理 (非同期処理) をイベントループで高速に捌ける ❌ CPU boundな処理 (同期処理) を掴まされると他イベントの処理が詰まる
©KAKEHASHI inc. 指針 #2 TypeScriptで基盤システムを構築する 設計方針 • 型とスキーマを活用し、自己文書化されたコードを目指す • 移植性を高く保つ
• クラスや例外機構に頼らない ライブラリ選定方針 • スキーマ駆動である • 標準に基づいている • クラスや例外機構への依存度が低い
©KAKEHASHI inc. #3 型とスキーマを活用した 基盤システム
©KAKEHASHI inc. スキーマ検証ライブラリ #3 型とスキーマを活用した基盤システム TypeScriptにおけるスキーマ検証ライブラリは 単なる外界とのI/Fの文書化以上の意味を持つ 例: 値オブジェクトの定義 UserId型は必ずzodによる
UUID v4の検証を通してのみ インスタンス化される badUserIdは 型検査でエラーとなる
©KAKEHASHI inc. スキーマ検証ライブラリの選び方 #3 型とスキーマを活用した基盤システム - JSON Schemaベース Ajvなど 移植性を重視した選択肢
- Standard Schema準拠 Zod、Valibot、Arktype、Effect Schemaなど 多くのスキーマ検証ライブラリがサポートする標準インタフェース エンティティ、値オブジェクト、状態などの定義にもスキーマ検証ライブラリを使うなら TypeScriptでスキーマを定義できるZodがおすすめ ただしメールアドレスの検証ルールはライブラリによって細かく異なる場合がある 既存データを弾いてしまう / 不正データを許してしまうことがないようによく検証する
©KAKEHASHI inc. Webフレームワーク #3 型とスキーマを活用した基盤システム Hono 段階的に採用を進行中 • 様々なJSランタイムで実行可能 •
Web標準に基づいたデザイン fetch、Requests、Responses、URL、URLSearchParamなど • Standard Schemaをサポート リクエストやレスポンスをStandard Schemaで検証できる NestJS 新規では採用しない予定 Spring BootのようなリッチなDIコンテナを提供する • 型検査時ではなくランタイム時まで依存性の検証ができない • 明らかに型と一致しないサービスを注入できてしまう
©KAKEHASHI inc. データベースとの接続 #3 型とスキーマを活用した基盤システム Kysely 継続利用中 事前に用意した型定義に従ってクエリ結果に型を付けてくれるクエリビルダー Drizzle 注視
同じくクエリ結果に型を付けてくれるクエリビルダー Kyselyよりもリッチなマイグレーション機能を有する Prisma ORM 弊チームでは撤退済み (2023年頃) 様々なデータベースをサポートするType-safeを謳うORM 発行されるクエリが予想しづらく断念 • Prisma ORMを2年運用して培ったノウハウを共有する - Speaker Deck
©KAKEHASHI inc. #4 TypeScriptの 注意点を乗り越える
©KAKEHASHI inc. CPU boundな処理との向き合い方 #4 TypeScriptの注意点を乗り越える コンピューティングリソースを分離する 最もシンプルな解決策 • 他のAWS
ECSサービス/Cloud Runへ • 他のAWS Lambda/Cloud Run functionsへ Worker threadsを利用する CPU Boundな処理を他のスレッドへ逃がす方法 適切にWorker threadをハンドリングする能力と気合が必要
©KAKEHASHI inc. 仲間を探しています 数多くの医療プロダクトを支えるプラットフォームシステムを作るのは楽しい - 難易度の高い非機能要求を達成する - 複雑な医療業界をモデリングしてシステムに落とし込む - システムの正しさを仕組みで担保する
型システム、関数型ドメインモデリング、Effect System... テナント分離、Row Level Security... https://recruit.kakehashi.life/ お待ちしております!