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
密結合なバックエンドから TypeScript のコードを生成する
Search
kemuridama
May 22, 2026
Programming
1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
May 22, 2026
More Decks by kemuridama
See All by kemuridama
freeeのエンジニアとReactチュートリアルを学ぼう
kemuridama
0
260
freee Tech Night がもうすぐ 5 周年を迎える話 / freee Tech Night will soon be 5th anniversary
kemuridama
0
330
会計フロントエンドの TypeScript 化 / Migrating frontend of freee Accounting to TypeScript
kemuridama
0
24k
会計freee が yarn から npm に出戻った本当の理由
kemuridama
12
22k
Other Decks in Programming
See All in Programming
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
650
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
Foundation Models frameworkで画像分析
ryodeveloper
1
130
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
Claude Team Plan導入・ガイド
tk3fftk
0
220
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
520
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
act1-costs.pdf
sumedhbala
0
250
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
My Coaching Mixtape
mlcsv
0
170
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
Between Models and Reality
mayunak
4
380
Embracing the Ebb and Flow
colly
88
5.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
WENDY [Excerpt]
tessaabrams
11
38k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Are puppies a ranking factor?
jonoalderson
1
3.7k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Transcript
密結合なバックエンドから TypeScript のコードを生成する
2 メイン - 2018 年新卒で freee 入社 - freee会計の開発 -
主にフロントエンド基盤 その他 - Dev Branding / Dev Relationship - freee Tech Night - freee 技術の日 - 全社イベント運営 - TSKaigi コアスタッフ SNS - X: @_kemuridama - GitHub: @kemuridama フリー株式会社 / エンジニア & DevRel kemuridama Ryo Ochiai
だれもが⾃由に経営できる 統合型経営プラットフォーム。 だれもが⾃由に⾃然体で経営できる環境をつくるために、「統合型経営プラットフォーム」を開発‧提供します。 バックオフィス業務を統合することで、⾃動化と業務全体の効率化。さらに経営全体を可視化することで、 これまでにないスマートかつ最適なアクションまで実⾏できるプラットフォームへと進化させていきます。 また外部サービスとも連携したオープンプラットフォームとして、多様なビジネスニーズに対応。 ユーザーネットワークの中における相互取引の活性化も強化していきます。 プラットフォームの提供のみならず、スモールビジネスに携わる⼈の環境そのものを より良くしていく取り組みを⾏うことで、世の中の変化を促します。
Vision
電⼦稟議 経費精算 債権債務 管理 ⼈事労務 電⼦契約 固定資産 請求管理 会計
⼯数管理 販売管理 会計‧⼈事労務‧販売管理を核とした 統合型経営プラットフォーム
5 スモールビジネスの ⼈事管理市場において 売上⾦額シェアNo.1(3) スモールビジネス向けに統合型クラウド(1)ERPを提供 注: 1. クラウドサービス:ソフトウェアやハードウェアを所有することなく、ユーザーがインターネットを経由してITシステムにアクセスを行えるサービス 2. リードプラス「キーワードからひも解く業界分析シリーズ:クラウド会計ソフト編」(2022年8月)
3. 「freee人事労務」はITRが今年調査発行した「ITR MARKET VIEW:人事・給与・就業管理市場2022」の人事管理市場において、従業員100人未満および従業員100~300人未満の企業で売上金額シェアNo.1(2020年度)を獲得しています。 統合型クラウド会計ソフト 統合型クラウド⼈事労務ソフト その他サービス 2013年3⽉〜 請求書 経費精算 決算書 予実管理 ワークフロー 内部統制 勤怠管理 ⼊退社管理 給与計算 年末調整 マイナンバー 管理 2014年10⽉〜 2022年11⽉〜 ⽇本のクラウド 会計ソフト市場 シェアNo.1(2) 統合型クラウド販売管理ソフト 【国内初】 クラウド会計ソフトと ⼀体型で使える 販売管理サービス ⽀出管理 ⼈事労務 ⼯数管理‧労務費管理 社宅制度の導⼊ 申告書作成 ⾒積‧発注‧請求 法⼈⼿続き クレジットカード 開業⼿続き 電⼦契約
6 スモールビジネスの ⼈事管理市場において 売上⾦額シェアNo.1(3) スモールビジネス向けに統合型クラウド(1)ERPを提供 注: 1. クラウドサービス:ソフトウェアやハードウェアを所有することなく、ユーザーがインターネットを経由してITシステムにアクセスを行えるサービス 2. リードプラス「キーワードからひも解く業界分析シリーズ:クラウド会計ソフト編」(2022年8月)
3. 「freee人事労務」はITRが今年調査発行した「ITR MARKET VIEW:人事・給与・就業管理市場2022」の人事管理市場において、従業員100人未満および従業員100~300人未満の企業で売上金額シェアNo.1(2020年度)を獲得しています。 統合型クラウド会計ソフト 統合型クラウド⼈事労務ソフト その他サービス 2013年3⽉〜 請求書 経費精算 決算書 予実管理 ワークフロー 内部統制 勤怠管理 ⼊退社管理 給与計算 年末調整 マイナンバー 管理 2014年10⽉〜 2022年11⽉〜 ⽇本のクラウド 会計ソフト市場 シェアNo.1(2) 統合型クラウド販売管理ソフト 【国内初】 クラウド会計ソフトと ⼀体型で使える 販売管理サービス ⽀出管理 ⼈事労務 ⼯数管理‧労務費管理 社宅制度の導⼊ 申告書作成 ⾒積‧発注‧請求 法⼈⼿続き クレジットカード 開業⼿続き 電⼦契約
7 - 2013 年 3 月リリース - 2012 年度の確定申告の直後にリリース -
すでにリリースから 13 年が経過 - 巨大なモノリス - freee 社内でも最も大きなコードベース - バックエンド: Ruby + Ruby on Rails - フロントエンド: TypeScript + React - 一部 erb + Backbone.js freee会計
バックエンドとフロントエンドは疎結 合であるべきですよね? でも、現実はどうですか?
9 • バックエンドとフロントエンドで言語が異なる ◦ 基本的にはバックエンドの変更にフロントエンドが引っ張られる 状態 ◦ Ruby (Sorbet) と
TypeScript の型をそれぞれ管理する必要がある • 一般的な解決方法: OpenAPI Schema からのコード生成 ◦ 取り組んでいるが、コードベースが大きすぎてなかなか進まない のが現状 ◦ API 経由だけではなく erb に直接値を埋め込んでいる箇所が存在する freee会計における課題
10 • バックエンドとフロントエンドで言語が異なる ◦ 基本的にはバックエンドの変更にフロントエンドが引っ張られる 状態 ◦ Ruby (Sorbet) と
TypeScript の型をそれぞれ管理する必要がある • 一般的な解決方法: OpenAPI Schema からのコード生成 ◦ 取り組んでいるが、コードベースが大きすぎてなかなか進まない のが現状 ◦ API 経由だけではなく erb に直接値を埋め込んでいる箇所が存在する freee会計における課題 Ruby (バックエンド) の実装を SSoT (Single Source of Truth) として TypeScript (フロントエンド) のコードを生成するのはどうだろう
11 • バックエンドの変更が即座にフロントエンドに反映される状態 を作る ◦ 無理に疎結合を作り出すのではなく良い密結合を達成する ◦ フロントエンドは TypeScript なので影響がある場合は型エラーとして検出できる
▪ 特に field/value の削除や rename はこれまでもバグの温床となっていた 目指すべき姿
どうやって実現する?
13 • バックエンド解析 ◦ Prism ▪ Ruby の新しい標準パーサー ▪ Web
Assembly が提供されていて Node.js から利用可能 ▪ https://www.npmjs.com/package/@ruby/prism • フロントエンドのコード生成 ◦ TypeScript Compiler API ▪ 依存を増やしたくなかったので ts-morph や Alloy の採用は見送った 実現方法
14 • Prism を使って Ruby のコードから AST (抽象構文木) を抽出 •
Ruby AST から TypeScript Compiler API で TypeScript のコード生成 ◦ 型・定数・それらに関連する utility method を生成 • この仕組みを使って約 1,000 ファイルのコードが作成されている 実現方法 module FlagHelper def flags { flag_1: hogehoge_method, flag_2: hogehoge_method, flag_3: hogehoge_method } end end type Flags = { flag_1: boolean, flag_2: boolean, flag_3: boolean } const defaultFlags: Flags = { flag_1: false, flag_2: false, flag_3: false }
15 • 複雑な型の生成 ◦ Ruby は型がない ◦ インターフェースを整理して型を自明にすることでマッピングを楽にしている ▪ 基本的にすべてのフィールドが
1 つの primitive 型になるように ◦ 変換ロジックが肥大化して今後のメンテナンスが困難になることを避けた やらなかったこと
16 • Sorbet の型アノテーションを元にした TypeScript の型のマッピング ◦ 複雑な型の生成はやっぱり欲しくなる ◦ Sorbet
の公式サイトに TypeScript と Sorbet の変換表がある 今後の展望
まとめ
18 • バックエンドの実装を SSoT としてフロントエンドのコードを生成した • バックエンドとフロントエンドの両方の型をメンテナンスする必要がなくなった ◦ ある程度の変更漏れを TypeScript
の型エラーで検出可能 ◦ 変更漏れが起因となっていたバグを減らすことができた • Prism/TypeScript Compiler API を使って Ruby AST を TypeScript AST に変換した ◦ 飛び道具感はあるが言語の壁を超えて現時点での依存の最適化ができた まとめ
19 6/9 (火) に M3 さんとアフターイベントやります! 告知
スモールビジネスを、世界の主役に。