Slide 1

Slide 1 text

AI時代における iOS設計の守り⽅と⼈間の役割 遠藤 拓弥 @entaku_0818 株式会社TVer iOSDC Japan 2026 / 2026.09.12 © 2026 TVer INC.

Slide 2

Slide 2 text

⾃⼰紹介 遠藤 拓弥 株式会社TVer iOSアプリエンジニア 趣味は海外サッカー観戦、⾳楽フェス © 2026 TVer INC.

Slide 3

Slide 3 text

⾃⼰紹介 Swift愛好会やDroidKaigiのスタッフなどやってます © 2026 TVer INC.

Slide 4

Slide 4 text

00 TVerのこれまで © 2026 TVer INC.

Slide 5

Slide 5 text

About TVer TVerとは ⺠放テレビ局がひとつになった テレビの新しい プラットフォーム ⾒放題 0 ¥ ドラマ バラエティ アニメ/ヒーロー 報道/ ドキュメンタリー スポーツ その他 © 2025 TVer Inc. | Recruiting Deck 5

Slide 6

Slide 6 text

Data サービス規模 現在、常時約800番組をすべて無料で パソコン‧スマートフォン‧タブレット‧テレビに配信 アプリダウンロード数 MUB (TVer単体‧訪問ベース) 9,000 万 4,460 万 ※MUB=⽉間ユニークブラウザ数 © 2025 TVer Inc. | Recruiting Deck (2025年11⽉時点) (2025年12月時点) 再⽣数 (TVer単体) 認知率 (15〜69歳/男⼥) 6.5 億回 73.3 % (2025年12⽉時点∕TVer DATA MARKETING調べ) (2024年11⽉時点∕株式会社マクロミル調べ) 6

Slide 7

Slide 7 text

去年までのおさらい TVerは去年⼀昨年とスポンサーセッションで登壇 © 2026 TVer INC. https://speakerdeck.com/techtver/20240826-iosdc-japan-2024 https://speakerdeck.com/techtver/iosdc-2025-slide

Slide 8

Slide 8 text

去年までのおさらい 2024年正社員⼀⼈でチーム体制も組めなかった © 2026 TVer INC. https://speakerdeck.com/techtver/20240826-iosdc-japan-2024

Slide 9

Slide 9 text

去年までのおさらい チーム開発が始まりAIを活⽤する⽂化を促進した © 2026 TVer INC. https://speakerdeck.com/techtver/iosdc-2025-slide

Slide 10

Slide 10 text

去年までのおさらい ⼈が増えAI導⼊が始まり AIに渡す前提を、順番に作ってきた AI関与するコミットPR iOSエンジニア2⼈⼊社 2023/09 が⽉の半分に 2025/07 2025/01 初めてのiOSエンジニア ⼊社 2025/12 Claude Code 導⼊ ここから2年かけて⼈を増やし 初のAIコミットが 7/02。 た この⽉はまだ6本 © 2026 TVer INC. 2026/03 4⼈⽬の iOSエンジニア⼊社

Slide 11

Slide 11 text

01 AI導⼊から約1年どう変わったか? © 2026 TVer INC.

Slide 12

Slide 12 text

AI導⼊から約1年 AIに渡す内容を作ってきました 2025-07 初めてAIが関わったコミット。CLAUDE.md を置く 2025-12 レビュー⽤などサブエージェントの構築 2026-03 rules/ を作る。AIが⾃分でブランチを切ってPRを出し始める 2026-04 AI⾃⾝に振り返らせて、ルールを改善させるループを⼊れる 2026-05 アーキテクチャガイドを書く 2026-06 仕様を機械可読な契約に落とす。依存⽅向 lint を導⼊ 2026-08 CI上でAIがバグを修正してDraft PRまで作るようになる © 2026 TVer INC. 12

Slide 13

Slide 13 text

AI導⼊から約1年 AIが関わったコミットの割合 0% → 73% TVer iOSリポジトリ / 2025-06 → 2026-08 の実測 claude/ ブランチからのPRは累計516本、多い⽇は1⽇25本マージ © 2026 TVer INC.

Slide 14

Slide 14 text

AI導⼊から約1年 量が増えて、触る⼈も増えた マージされたPR コミット ⽉あたりのコミットメンバー 3.4倍 3.4倍 1.5倍 1,619 → 5,435 5,999 → 20,443 10.7⼈ → 16.2⼈ © 2026 TVer INC.

Slide 15

Slide 15 text

AI導⼊から約1年 リリースの回数と内容が増加 この1年で 43本リリースした。⽉あたり 3.6本。 リリース回数(⽉あたり) 2.6本 → 3.6本 約1.5倍 1リリースに⼊るPR 66本 → 126本 約2倍 1リリースに⼊るコミット 249 → 475 約2倍 1回のリリースで動くコードの量が、2倍近くになった。 © 2026 TVer INC.

Slide 16

Slide 16 text

AI導⼊から約1年 増えていくコミット、リリースに対して何をしたか? © 2026 TVer INC.

Slide 17

Slide 17 text

AI導⼊から約1年 アーキテクチャガイドラインの設定 ● 迷わない ○ ● 持続可能 ○ ● 品質を継続的に担保できる構造 安全に変更できる ○ © 2026 TVer INC. 負債がたまらない。10年後も健全であり続ける テスタブル ○ ● 誰でも、AI でも統⼀した実装ができる 意図しない副作⽤が⽣まれにくい。テストされている

Slide 18

Slide 18 text

AI導⼊から約1年 機能ごとにPackageを切る 22 → 204 © 2026 TVer INC.

Slide 19

Slide 19 text

AI導⼊から約1年 22 → 204 約1年間でモジュール数は約10倍 TVerApp / App TVerLibrary LegacyAppFeature 109 94 1 Domain ∕ 画⾯Feature 共有インフラ 114,234⾏の 単⼀ターゲット 境界をはっきりさせて、ビルド時にアーキテクチャの違反を静的に検出できる © 2026 TVer INC.

Slide 20

Slide 20 text

AI導⼊から約1年 Packageの切り⽅と、依存の向き AppFeature 画⾯Feature 画⾯Feature 画⾯Feature Domain DesignSystem 共通UI Client - / ClientLive それぞれの画⾯ごとにUIとDomainのパッケージを分ける デザインは共通化されたものを利⽤する © 2026 TVer INC.

Slide 21

Slide 21 text

AI導⼊から約1年 Packageの切り⽅と、依存の向き AppFeature 画⾯Feature 逆流 禁⽌ × 画⾯Feature 画⾯Feature × Domain DesignSystem Client / ClientLive 依存の⽅向性をlintで制限し、CIで確認する © 2026 TVer INC. × 共通UI

Slide 22

Slide 22 text

AI導⼊から約1年 書く対象が、コードから仕様に移りました 925⾏ → 25,401⾏ リポジトリ内の Markdown 総⾏数 / 14ヶ⽉で27倍 コードを書く時間が減った分、仕様を書く時間が増えた © 2026 TVer INC.

Slide 23

Slide 23 text

AI導⼊から約1年 テストファイル 23 → 1,094 CI実⾏時間も⽇々増加 © 2026 TVer INC.

Slide 24

Slide 24 text

AI導⼊から約1年 AI導⼊から1年経って.... 1. コミット数とPR数が3.4倍、リリース数も⽐例して上昇 2. アーキテクチャのガイドラインやlintなどでAIで増加す るコミットに対応 3. テストファイルや仕様の記述も増えてきたが適切な量な のかはまだわからない © 2026 TVer INC.

Slide 25

Slide 25 text

02 AIは速い。でも、任せきれない © 2026 TVer INC.

Slide 26

Slide 26 text

AIは速い。でも、任せきれない バグがあれば、そのバグが仕様として書かれる ローカルの仕様ドキュメントはソースコードからリバースエンジニアリング で作成されたものであり、ソースコードにバグがあれば、そのバグが仕様と して記載されている可能性がある。 .claude/agents/ios-spec-reviewer.md AIでコードから動作を⾔語化できる。でも、それが仕様かバグかは判別できない。 © 2026 TVer INC.

Slide 27

Slide 27 text

AIは速い。でも、任せきれない AIは全体像ではなく、近くのコードを手本にする /// メニュー「シェア」で共有する URL。 /// /// 同じ組み立てが `EnderListPage` と `HomePage.shareURL(for:contentID:)` にもある。 /// 暫定なので、BE 供給が入ったら各所をまとめて応答の値へ差し替える。 func shareURL(contentID: String) -> URL? { ... } 13 モジュール・ 15 箇所に散っていた組み立てを集約した。各画面の実装は互いにコピーで、 同じ FIXME コメントも 15 箇所に重複 していた。空 contentID のガードは従来 3 画面にしか 無かった 。 © 2026 TVer INC.

Slide 28

Slide 28 text

AIは速い。でも、任せきれない 嘘が、仕様になってしまう // 上限エラーを返すのも series(70003)のみ // (`FavoriteCategory.init(contentType:)` の doc 参照)。 事実は対象エラーコードは対象種別によらず 4008。70003 は legacy API 由来で、この説明は最初から誤り。 ad863ac684 LiveDetailPage に混入 Claude Fable 5 f0083452e2 SpecialDetailPage へコピー — 参照先を FavoriteLimitModal に差し替えて Claude Sonnet 5 36ec01ec80 RealtimeLivePage へコピー、テストのコメントにも波及 Claude Opus 5 106a4a711f 17 日後、8 ファイルを一括修正 FavoriteLimitModal と FavoriteRepositoryLive が互いを出典として参照し合う循環をやめる。 →本番にリリースする前に気づくことはできた © 2026 TVer INC.

Slide 29

Slide 29 text

AIは速い。でも、任せきれない 仕組み化するのが難しい問題 SwiftUIか?UIKitか? © 2026 TVer INC.

Slide 30

Slide 30 text

AIは速い。でも、任せきれない UIKit は 34 箇所。それぞれ理由がある SDK‧OS標準がUIKitでしか来ない。選べない 13箇所 SwiftUI にその機能が存在しない 9箇所 特定のOSバージョンでSwiftUIが動かない 3箇所 ⾒た⽬はSwiftUI、挙動だけUIKitで直す 5箇所 UIの都合ではない 4箇所 © 2026 TVer INC.

Slide 31

Slide 31 text

AIは速い。でも、任せきれない SDK‧OS標準がUIKitしかない。選べない SDK が UIKit の部品として配っている。包む以外にやることがない private struct Representable: UIViewRepresentable { func makeUIView(context _: Context) -> TapReportingCastButton { let button = TapReportingCastButton(frame: .zero) // 純正ボタンは渡したアイコンを tintColor で塗る。 button.tintColor = UIColor(tintColor) // a11y ラベルは SDK が cast state ごとのローカライズ済み文言を // 既定で設定するため、こちらでは触らない。 button.onTap = onTap return button } } © 2026 TVer INC.

Slide 32

Slide 32 text

AIは速い。でも、任せきれない 特定のOSバージョンでSwiftUIが期待通りに動かない SwiftUI では、特定のOSバージョンで動かない private func attach() { var view: UIView? = superview while let c = view, !(c is UIScrollView) { view = c.superview } guard let sv = view as? UIScrollView else { return } // iOS 17 では onScrollPhaseChangeはないので、UIScrollViewで実装 offsetObs = sv.observe(\.contentOffset, options: [.initial, .new]) { [weak self] _, _ in self?.scheduleEmit() } // 慣性中を掴んで離す操作は offset が動かないので pan からも拾う sv.panGestureRecognizer.addTarget(self, action: #selector(panStateChanged)) } © 2026 TVer INC.

Slide 33

Slide 33 text

AIは速い。でも、任せきれない SwiftUI にその機能が存在しない SwiftUI の Menu には開いているか閉じているかを表す情報を返せない private func deferredRowElement( resolve: @escaping @MainActor @Sendable () async -> [MenuAction], onSelect: @escaping @MainActor (MenuAction) -> Void, ) -> UIDeferredMenuElement { UIDeferredMenuElement.uncached { completion in Task { @MainActor in completion(await resolve().map { $0.uiAction(onSelect: onSelect) }) } } } © 2026 TVer INC.

Slide 34

Slide 34 text

AIは速い。でも、任せきれない AIは速い。でも、任せきれない ● AIでコードから動作を⾔語化できる。でも、それが 仕様かバグかは判別できない。 ● 特にUIの技術的決定でUIKitがいいのかSwiftUIがいい のか?を判断するのは難しい © 2026 TVer INC.

Slide 35

Slide 35 text

03 決めるのは⼈間。 © 2026 TVer INC.

Slide 36

Slide 36 text

決めるのは⼈間 指摘は、決定じゃない AIがやったこと AIが⾔わなかったこと 重複を15箇所にコピーする → 「集約しましょう」とは⾔わない 嘘の出典を循環させる → 「⼀次情報を⾒に⾏きましょう」とは⾔わない バグを仕様として書く → 「これバグじゃないですか」とは聞かない © 2026 TVer INC.

Slide 37

Slide 37 text

決めるのは⼈間 AIの失敗は、決定の不在だった 02章で⾒た失敗と、そこで⼈間が決めていなかったこと。 AIがやったこと(02章) ⼈間が決めること 近くのコードを⼿本にする → 嘘の仕様が正しくなる → バグが、バグのまま仕様になる → UIKitがいいのか? SwiftUIがいいのか? → © 2026 TVer INC. ① 構造を決める 境界を切り、参照すべき場所を作る ② 正の在り処を決める どこを信じるかを指定する ③ 仕様の中⾝を決めて返す 外から正を持ってくる ④ 実機で動作を⾒てUI を承認する

Slide 38

Slide 38 text

決めるのは⼈間 何を失うかを決める // SwiftUI Text には無い指定 let style = NSMutableParagraphStyle() style.lineBreakMode = .byCharWrapping // 代償: byCharWrapping を選ぶと // © 2026 TVer INC. UILabel は末尾省略(…)を描かない。

Slide 39

Slide 39 text

決めるのは⼈間 仕様の中⾝を決めて返す PdM が決めきれないことを、動くものにして返す。 これスクロール追従とか、どうしたら違和感な さっき話した内容⼀旦プロトタイプ作ってみま いとか想像しながらPdMが規定するの難しい と思うので、僕らでできる「良い感じ」を作っ した!これベースに時間とって、どんな動作に するか相談させてください て提案する形がスムーズかなと思います! iOSエンジニア / 2026-08-24 2026-06-24 「PRDに書いてある」から、仕様を書き⾜す側へ。 AIに決めさせられないことは、AIの外で決めて、持ち込む。 © 2026 TVer INC.

Slide 40

Slide 40 text

決めるのは⼈間 決めたら、仕組み化するまでが決定 決めたこと 置き直した先 次からどうなるか アーキテクチャ モジュール + 依存⽅向 lint 違反すると CI で PR が⽌まる 正しさの根拠 .claude/agents/ rules/ Confluence / Figma 同じ仕様から実装される 実機で動作を⾒てUI を 承認する UI パッケージで共通化する 同じUIパーツを利⽤すれば問題は今 後起こらない © 2026 TVer INC.

Slide 41

Slide 41 text

決めるのは⼈間 決めるのは⼤変 技術的に⼤変 ● 正解が事前に分からない。試さないと決まらない ● どの選択肢にも代償がある。何かを捨てることになる 精神的に⼤変 ● 決めた後も、合っているか分からない ● 前の⾃分の判断を、⾃分で取り下げることになる AIで早くなっても決める⼤変さは変わらない © 2026 TVer INC.

Slide 42

Slide 42 text

まとめ AI時代における iOS設計の守り⽅と、⼈間の役割 ● AIによってコミット数/PR数/リリース数が増えた ● Lintやテストなどで設計を守る仕組みを構築していく ● 仕組みにないものは⼈間が決める必要がある ● ⼈間が決めた内容を再度仕組み化する 決めることは⼤変。決められるだけの技術⼒が必要 © 2026 TVer INC.

Slide 43

Slide 43 text

ご清聴ありがとうございました © 2026 TVer INC.