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
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
TVer Inc.
PRO
November 17, 2025
Programming
2.8k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
JSConf JP 2025登壇資料
TVer Inc.
PRO
November 17, 2025
More Decks by TVer Inc.
See All by TVer Inc.
TVer Web-based TVのリアーキテクチャ
techtver
PRO
0
140
Pub/Sub で実装するワーカープールパターン - BigQuery リバースETLジョブの並行数制御-
techtver
PRO
0
130
株式会社TVer 会社紹介資料
techtver
PRO
9
120k
Feature Flagを定義から削除まで 安全に行うために考えたこと
techtver
PRO
0
3.6k
4100万ユーザーを支えるTVer iOSアプリ開発 〜0人から始まったチームのAI活用による挑戦〜
techtver
PRO
1
2.7k
TVer iOSチームの共通認識の作り方 - Findy Job LT iOSアプリ開発の裏側 開発組織が向き合う課題とこれから
techtver
PRO
0
1.3k
20240710_HR SUCCESS SUMMIT 2024_テーマセッション「エンジニア採用2.0」登壇資料(株式会社TVer_香坂)
techtver
PRO
0
160
採用応募者の個人情報保護の取扱いについて_株式会社TVer
techtver
PRO
0
820
月間4.5億回再生を超える大規模サービス TVer iOSアプリのリアーキテクチャ戦略 - iOSDC2024
techtver
PRO
2
16k
Other Decks in Programming
See All in Programming
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
CSC307 Lecture 17
javiergs
PRO
0
320
Vite+ Unified Toolchain for the Web
naokihaba
0
250
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.3k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
330
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Oxcを導入して開発体験が向上した話
yug1224
4
310
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
240
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
530
The NotImplementedError Problem in Ruby
koic
1
700
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Site-Speed That Sticks
csswizardry
13
1.2k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Thoughts on Productivity
jonyablonski
76
5.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
Optimising Largest Contentful Paint
csswizardry
37
3.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
How to train your dragon (web standard)
notwaldorf
97
6.7k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
Transcript
©2025 TVer INC. TVerのWeb内製化 - 開発スピードと 品質を両立させるまでの道のり JSConf
JP 2025 永井洸気 株式会社TVer サービスプロダクト本部 / フロントエンド開発部 ジュン・ユン・サング(ポール) Jeun Yun Tsang (Paul)
©2025 TVer INC. 2 自己紹介 永井 洸気 株式会社TVer サービスプロダクト本部 /
フロントエンド開発部 • 2024年3月にWebフロントエンジニアとしてTVerに入社 • tver.jp や、CTV(コネクテッドTV)の開発を行なっている • 趣味は、筋トレ、テニス、プロ野球(阪神タイガース) • X(@0906koki)
©2025 TVer INC. 3 自己紹介 ジュン・ユン・サング(ポール) Jeun Yun Tsang (Paul)
株式会社TVer サービスプロダクト本部 / フロントエンド開発部 • イギリス出身 • 2024年10月にWebフロントエンジニアとしてTVerに入社 • tver.jp のフロントエンド開発を行なっている • 趣味は、筋トレ、卓球
©2025 TVer INC. TVerの紹介 4
©2025 TVer INC. 5 TVerの紹介 01 02 03 見逃し配信だけでなく、地上波放送のリアルタイム配信も開始! 好きな環境で
楽しめる! 番組放送終了から 約7日間見放題! リアルタイム配信 パソコン スマートフォン アプリ テレビアプリ タブレットアプリ すべて 無料 ※番組終了から配信までは、時間がかかることがあります ログインすれば 追っかけ再生 も!
©2025 TVer INC. TVerの紹介 累計アプリダウンロード数、9,000万ダウンロード突破! スマートフォン・タブレット、コネクテッドTVを合わせ た累計のアプリダウンロード数が9,000万ダウンロード (以下、DL)を突破。 TVerアプリのDL数は、2025年4月に8,500万DLを記録して から、わずか6カ月で新たに500万DLを獲得。
6
©2025 TVer INC. tver.jp の技術スタック
8
©2025 TVer INC. tver.jp の技術スタック ・言語・FW:Next.js, React, TypeScript ・ライブラリ:CSS Modules,
SWR, Biome, OpenAPI ・テスト:Vitest, Playwright, Storybook ・ホスティング: Amazon S3, Amazon CloudFront ・開発管理ツール:Github, Github Project, Github Actions ・ドキュメント:Figma, Miro, Confluence, Google Docs ・コミュニケーション:Slack, Google Meet ・AIツール:Claude Code Max 20x, Gemini, GitHub Copilot • 技術スタックとしてはNext.jsやTypeScriptなどシ ンプルでモダンな技術を採用 • S3に静的アセットを配置して、CloudFrontで配 信。レンダリング方式はCSR • OVP(Online Video Platform)プレーヤーとして STREAKSを使用 9
©2025 TVer INC. TVerの開発組織
©2025 TVer INC. 11 TVerの開発組織
©2025 TVer INC. 12 TVerの開発組織 - Webフロントチーム • Webフロントチームは現在、正社員3名 +
業務委託5名 • 各ミッション軸のチームに正社員1名 + 業務委託数名が所属 ラインナップ アクセシビリティ セレンディピティ Webフロント iOS Android バックエンド デザイナー PdM
©2025 TVer INC. 実は1年前 13
©2025 TVer INC. Webフロントチーム 14
©2025 TVer INC. Webフロントチーム 1名だけだった👍 15
©2025 TVer INC. • TVerはバックエンドは内製化していたが、iOS、Android、Webフロントエンドを開発パー トナーへ開発を発注していた • PdMがプロダクトの仕様や施策を決め、PjMが開発パートナーにコミュニケーションを取 りながら開発管理を行う体制 16
©2025 TVer INC. より開発スピードと品質を高めてプロダクトの成長を 牽引するため、フロントエンド領域の内製化を決断 • TVerはバックエンドは内製化していたが、iOS、Android、Webフロントエンドを開発パー トナーへ開発を発注していた • PdMがプロダクトの仕様や施策を決め、PjMが開発パートナーにコミュニケーションを取
りながら開発管理を行う体制 17
©2025 TVer INC. 18 2023.08 QA内製チームの立ち上げ 2023.10 iOS内製開発チームの立ち上げ、 Android開発の完全内製化が完了 2024.03
Webフロントエンド内製開発チームの立ち上げ 2024.04 iOS開発の完全内製化が完了 2024.10 QA、Webフロントエンド 開発部の完全内製化が完了 フロントエンド開発部発足、 Android内製開発チームの立ち上げ 2023.04
https://findy-code.io/media/articles/tver-frontend 19
©2025 TVer INC. 内製化立ち上げで抱えていた課題
©2025 TVer INC. 21 ユーザーへもっと早く価値を 提供するために、開発スピー ドを上げたいが。。。 内製化立ち上げで抱えていた課題 ユーザーがもっと早く簡単に好きなコン テンツを発見できることが目標
©2025 TVer INC. 22 • 当初のコードは複雑性が高く、品質 があまり高くない状態 • コーディングルールも存在せず、人 によって実装がバラバラに。開発ス
ピードが出せない 内製化立ち上げで抱えていた課題
©2025 TVer INC. 23 品質を担保しながら、開発ス ピードを向上させていくため、 課題の洗い出しから着手 内製化立ち上げで抱えていた課題
©2025 TVer INC. そもそも開発スピードと品質は何?
©2025 TVer INC. 開発スピードの定義 25 そもそも開発スピードと品質は何? 要件・デザインの 理解 コードの理解 設計・実装
リリース テスト PRレビュー 監視・バグ対応 振り返り 仕様を読み解く時間からバグ対応までのスピードが大事
©2025 TVer INC. 品質の定義 26 そもそも開発スピードと品質は何? コードの 分かりやすさ バグ発生率 パフォーマンス
Web Vitals デザインの一貫性 アクセシビリティ SEO ユーザビリティ バグの発生率だけではなく全体的なユーザー体験とコードの質
©2025 TVer INC. 洗い出した課題がいっぱい。。。
©2025 TVer INC. デザインシステムがなく CSSも整理されていない • 個別にコンポーネントのCSSが設定されている • カラートークンはあるがちゃんと整理していない •
カラートークン以外の共通CSSが定義されていない • 汎用コンポーネントと個別コンポーネントが混在して いるケースがある • アクセシビリティを考慮していない これらの課題により、コンポーネントの仕様とデザインの 一貫性が低下し、結果的に全体的な品質が低下している 28 洗い出した課題がいっぱい。。。 シンプルなコンポーネントはずのにCSSが 多くて重複の定義も存在されている コンポーネントの例 適用されているCSS スペーシングがベタ打ち ボタンのカラートークンになっている
©2025 TVer INC. APIデータの定義がバラバラ • APIの型定義がなく、フロントエンドで定義されて いるAPIデータが実際のAPIと合っているかどうか が分かりにくい • APIデータを取得するためのfetch関数が別リポジ
トリで管理していてメインテナンスが大変 この結果、APIの仕様が分かりにくくなり、実装スピー ドの低下やメンテナンスの負担に繋がっている 29 洗い出した課題がいっぱい。。。 型定義がないAPIデータのfetch関数が別リポジトリで管理 されていて、同時にデプロイしないとアプリ側とずれる可 能性がある ↓
©2025 TVer INC. 自動テストと検証環境が整備されていない • デプロイできる環境が少ないため、共通開発環境へマージしないと検証できない • Storybookとそのホスティング環境がないため、コンポーネントのUI検証が手間 • コンポーネントテストとユニットテストが少ない
• UIとデータ取得のロジックが混在していてテストが難しい • モックデータを生成する仕組みがなく手書きで書いている • E2Eテストがなく、QAチームの手動テスト工数が高い ↓ 手動検証に手間がかかり、品質も保証できていない 30 洗い出した課題がいっぱい。。。
©2025 TVer INC. 課題が尽きない • 動画プレイヤーの改善 • ESLintとPrettierが設定されているがルールが整理されていない • コードのスタイルガイドがなくファイル毎に書き方が変わるため、理解に時間がかかる
• エラーログとパフォーマンスの監視(New Relic) • SEOがバックエンドで管理されていてカスタマイズが難しい • 画像が圧縮されていない • 内部リンクのhrefがベタ打ちになっている 31 洗い出した課題がいっぱい。。。 とりあえず解決策を見にいこう! これ以外にも課題がまだあるが。。。
©2025 TVer INC. デザインシステムとStorybookの導入
©2025 TVer INC. ヘッドレスUIライブラリの検討 汎用コンポーネントを改修する前に下記を検討した • TVerは自社製デザインになっているため、フル パッケージのUIフレームワークが合っていない • アクセシビリティを向上したいが実装に高い工
数が掛かるのを避けたい • 必要なコンポーネントが用意されていて、ド キュメントも分かりやすいこと 上記を踏まえてRadix Primitivesを選定 https://www.radix-ui.com/primitives 33 デザインシステムとStorybookの導入
©2025 TVer INC. デザイントークンとSassを利用する • デザインシステムで定義されたデザイントーク ン(例 : カラー、スペーシング、radius)を変 数化し、簡単に参照できるようにした
• ひとつの変数で表現できないCSSをmixinで定義 してセットとして設定する 34 デザインシステムとStorybookの導入 ブレイクポイントもセットとして 設定されているので使いやすい!
©2025 TVer INC. 汎用コンポーネントの改修 • デザインシステムで定義された汎用コンポーネント のバリエーションをpropsで表現 • ドメインロジックが必ず入らないことを意識 •
必要に応じてカスタマイズできるよう拡張性を担保 35 デザインシステムとStorybookの導入
©2025 TVer INC. StorybookとChromaticの導入 • アプリを起動しなくてもコンポーネント単位 で簡単にUIやインタラクションの検証が可能 • 状態とモックデータを自由に設定できるので エッジケースまで洗い出しが容易
• Chromaticへデプロイすることで、デザイ ナーによる確認が楽 36 デザインシステムとStorybookの導入
©2025 TVer INC. デザインシステムと汎用コンポーネン ト改修の結果 • 各画面のUIにおける一貫性を向上でき、品質が向上 • 汎用コンポーネントが使いやすくなって実装スピー ドが向上
• アクセシビリティの改善 37 デザインシステムとStorybookの導入
©2025 TVer INC. 生成ツールとAIの活用
©2025 TVer INC. 39 なるべく手動と単純な作 業を生成ツールとAIに任せ て自動化する文化を作る 生成ツールとAIの活用
©2025 TVer INC. 生成ツールの導入 • SVGRでSVGファイルからアイコンを簡単に Reactコンポーネントへ変換できるようにする https://react-svgr.com/ • pathpidaでNext.jsのpagesディレクトリからタ
イプセーフのURLを生成できるようにする https://github.com/aspida/pathpida • OpenAPI TypeScriptでデータスキーマ、fetchと SWRをアプリのリポジトリ内で生成する https://openapi-ts.dev/ 40 生成ツールとAIの活用 Pathpidaの例 データスキーマの例
©2025 TVer INC. AIでモックデータと MSWハンドラーの実装 • テスト環境を改善するためにMSW(Mock Service Worker)を導入 •
Claude CodeのCustom Slash Commandで、OpenAPI のスキーマからMSWのHandlerを自動生成 • Mockデータ生成の際のデータソースとして master.mdを用意し、実際に存在する開発環境の データを参照するように整備 41 生成ツールとAIの活用 Claude Codeのプロンプト 生成されたHandler
©2025 TVer INC. • 別リポジトリで管理しているOpenAPIスキーマを 取得し、GitHub Actionsで型の生成 + SWRを生成 する
• Claude Code ActionsでOpenAPIの型を参照し、 MSWのHandler生成と、型エラーの修正を自動化 • 最終的にPRが生成され、レビューを通して問題な ければマージ GitHubワークフローで 生成フローを完結させる 42 生成ツールとAIの活用 ワークフローを実行 する PRが作成される OpenAPIスキーマを 取得する AIによるMSWのハン ドラー生成 & 型修正
43 OpenAPIの型生成 Claude Code ActionによるMSW生成と型修正
©2025 TVer INC. AIで生成されたモックデータと MSWハンドラーの活用開始とその結果 • APIがまだ実装されていない状態でもMSWが返す モックデータを参照して実装を開始することがで き、開発スピードが向上 •
StorybookにAPI取得含めてストーリーの作成がで きるようになり、実際のユーザーに近い環境での 検証をコンポーネントに対して実施可能に • Storybookの生成に関しても、Claude Codeの Custom Slash Commandを使用し、標準化された Storyの生成を可能に 44 生成ツールとAIの活用
©2025 TVer INC. 動画プレーヤーの改善
©2025 TVer INC. 46 • VOD配信(見逃し配信)のOVPをSTREAKSに移行 ◦ 元々リアルタイム配信で使用していたPLAY社のSTREAKSをVODにも採用 ◦ VODとリアルタイム配信で同じOVPを使用することで、開発スピードが向上や管理コスト
が削減。移行時にシーク時のサムネイル機能や画質向上のなども追加 • 広告リクエストの単体テストの実施 ◦ 広告ターゲティングに必要な情報を広告サーバーに渡して、広告を再生するための VMAP/VASTを受け取るが、その際に渡すパラメーターにテストが書かれていなかった ◦ そのため、ヒューマンエラーが発生しうる可能性があったので、単体テストを実装し、未 然に不具合を防ぐ仕組みを構築 • プレーヤーに必要なアセットロードの並列化によるパフォーマンス改善 ◦ プレーヤーを再生するには、IMASDKやプレーヤーのSDK、その他様々なアセットが必要 だが、それらが直列で読み込まれていた ◦ 並列で読み込ませてプレーヤー構築までの速度を改善(約1s) 動画プレーヤーの改善
©2025 TVer INC. その他の解決策
©2025 TVer INC. • PR毎にプレビュー環境をデプロイする仕組みをS3 + CloudFrontで構築し、レビュー 時の検証を容易に • コードスタイルガイドを書いてルールを明確にしながらAI(Copilot,
Gemini Code Assist)に単純なレビューを任せる • QAエンジニアが、QA項目に沿ったテストケースを元にPlaywrightでE2Eテストを実装 • ESLintとPrettierをBiomeに統一し、実行速度の向上。pre-commit時に実行し、事前に 検証可能に • 画像サイズを圧縮できるCDNへ移行(ダウンロードサイズを50%以上削減) • Feature-Sliced DesignとPresentational・Containerコンポーネントのパターンにリ ファクタリングし、コードの責務を明確に 48 その他の解決策
©2025 TVer INC. 今まで導入した解決策の結果
©2025 TVer INC. • 画面の一貫性とバグの発生率の改善で品質を向上できた • コードがより疎結合で拡張性が高くなり、開発スピードを向上できた • 生成ツールとAIで手間な作業削減し、ユーザー価値に貢献する開発に集中可能に 50
今まで導入した解決策の結果 レビュー依頼から初レビューまでの平均時間 初コミットからPRオープンまでの平均時間 Findy Teamsで計測しているリードタイムが改善傾向に 🎉
©2025 TVer INC. 次に挑戦したいこと
©2025 TVer INC. • SSRを実現し、パフォーマンスとSEOを改善する • FigmaのCode ConnectとMCPの活用や、VRTの導入による デザイン面の強化 •
CTVにおける処理共通化の検討とUI/UXの改善 52 次に挑戦したいこと AIを活用しながらさらにTVerの 品質と開発スピードを向上して行きたい
ご清聴ありがとうございました! ©2025 TVer INC.
©2025 TVer INC. TVer Tech Blog 54 TVerのエンジニア活動をブログに掲載しています! https://techblog.tver.co.jp
None