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
密結合なバックエンドから TypeScript のコードを生成する
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kemuridama
May 22, 2026
Programming
1.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
270
freee Tech Night がもうすぐ 5 周年を迎える話 / freee Tech Night will soon be 5th anniversary
kemuridama
0
340
会計フロントエンドの 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
スマート反転とウェブアクセシビリティ
camiha
0
180
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
ALB ログから Trace を気合で繋げる技術
fohte
7
880
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.7k
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
700
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
520
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
120
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
3
510
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
7
3.5k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
699
190k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
210
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
Technical Leadership for Architectural Decision Making
baasie
3
560
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The browser strikes back
jonoalderson
0
1.7k
Making Projects Easy
brettharned
120
6.7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Paper Plane
katiecoart
PRO
3
53k
Ruling the World: When Life Gets Gamed
codingconduct
0
330
The Curious Case for Waylosing
cassininazir
1
500
The SEO Collaboration Effect
kristinabergwall1
1
550
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 さんとアフターイベントやります! 告知
スモールビジネスを、世界の主役に。