Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストコードすら書けなかったレガシーアプリがAIと上手に協働できるようになるまでの軌跡

 テストコードすら書けなかったレガシーアプリがAIと上手に協働できるようになるまでの軌跡

炎上の中リリースされ、
長い間メンテナンスされず、
当時の担当者もチームに不在。

アーキテクチャも成立しておらず、
ソースコードはスパゲッティ、
テストコードはもちろん書けない。

私は、そんなレガシーなアプリのリニューアルプロジェクトにアサインされたAndroidエンジニアです。
iOS未経験の立場でチームのリードとしてiOS版の技術的な意思決定にも関与することとなりました。

Androidエンジニアとしての知見をベースに
・リアーキテクト
・ユニットテストの整備
・SwiftUIの導入
・生成AIとの協働
をiOSアプリで実現するまでの取り組みをお話しする予定です。

少しイロモノなトピックかもしれませんが、レガシーから脱却するために効いた取り組みの事例が、皆さんのエンジニアリングの参考になればと思います。

iOSDC2025 スポンサーセッションの登壇資料です
https://fortee.jp/iosdc-japan-2025/proposal/dfea09ab-3ebf-4327-8c9f-c52f90db08ae

Avatar for ディップ株式会社

ディップ株式会社 PRO

September 20, 2025
Tweet

More Decks by ディップ株式会社

Other Decks in Technology

Transcript

  1. Copyright © DIP Corporation, All rights reserved. Agenda 1. ⾃⼰紹介

    2. 会社紹介 3. はじめに 4. アプリ改善の取り組み 5. さいごに
  2. 吉田 誠 Yoshida Makoto ディップ株式会社 ソリューション開発本部メディア開発統括部 Androidエンジニア • 人生初のiOSDCで、人生初の登壇 •

    カンファレンスネイルがアツい • ものすごく緊張しています • お手柔らかにお願いします
  3. 会社紹介:ディップ株式会社とは 7 ビジョン “Labor force solution company” ⼈材サービスとDXサービスの提供を通して、労働市場における諸課題を解決し、 誰もが働く喜びと幸せを感じられる社会の実現を⽬指します。 ×

    DX事業 Digital labor force solution バイトコミュニケーションアプリ『バイトルトーク』や、 機能を絞ったシンプルなSaaS型の『コボット』を通じて、 職場環境やコミュニケーション課題を解決 しています。 ⼈材サービス事業 Human work force solution ユーザーファーストな独自機能を搭載した、 求人情報・人材紹介サービスの提供を通じて、 ユーザーの就業課題 を解決しています。
  4. アプリ改善の取り組み: 抱えていた課題 当然、様々な問題を引き起こすリスクがあった 無秩序な コード テストコード 実装不可 認知負荷 増大 自動テスト

    整備不可 変更が困 難 計画通りに 進まない 見積もり 精度低下 • リリースの遅延 • 施策効果低下 • 開発組織の信頼低下 • チームの疲弊 • メンバー離職 など 止まらない コスト増
  5. アプリ改善の取り組み: リアーキテクト アーキテクチャーレイヤー以下は feature駆動パッケージングを意識した構成 data ├─ featureXX/ │ ├─ XXApi

    │ ├─ XXRepository │ └─ XXResponse ├─ featureYY/ │ ├─ YYApi │ ├─ YYRepository │ └─ YYResponse └─ featureZZ/ ├─ ZZDao ├─ ZZRecord └─ ZZRepository domain ├─ featureXX/ │ ├─ XXUseCase │ └─ XXDomainData ├─ featureYY/ │ ├─ YYUseCase │ └─ YYDomainData └─ featureZZ/ ├─ ZZUseCase └─ ZZDomainData
  6. アプリ改善の取り組み: リアーキテクト 機能という関⼼に基づいてクラスが集まり コードの読解がしやすくなった data ├─ featureXX/ │ ├─ XXApi

    │ ├─ XXRepository │ └─ XXResponse ├─ featureYY/ │ ├─ YYApi │ ├─ YYRepository │ └─ YYResponse └─ featureZZ/ ├─ ZZDao ├─ ZZRecord └─ ZZRepository domain ├─ featureXX/ │ ├─ XXUseCase │ └─ XXDomainData ├─ featureYY/ │ ├─ YYUseCase │ └─ YYDomainData └─ featureZZ/ ├─ ZZUseCase └─ ZZDomainData 読み書きしやすい!
  7. アプリ改善の取り組み: ユニットテスト 最低限意識するべきことに⽬星をつけた • テストの単位は⼀つの振る舞い ◦ 「仕事⼀覧を取得する」 ◦ 「古いものを削除する」 ◦

    「〜〜する」の命名を意識してみた • AAAパターンで記述 ◦ テストの流れの道標 ◦ 書き⽅を統⼀できる 著:Vladimir Khorikov 訳:須田智之 単体テストの考え方 /使い方 マイナビ出版(2022)
  8. アプリ改善の取り組み: ユニットテスト ユニットテストの効果を得るために... • とにかくテストが書ければ OK󰢏 • ただしDataSourceの差し替えのみで書く ◦ 外部依存は

    DataSourceに閉じていて、ここの差し替えでテストは 書ける ◦ DataSource以外の置き換えると、アーキテクチャ構造の無視が 可能になってしまう ◦ そうなると構造を維持する効果がなくなってしまう
  9. アプリ改善の取り組み: 宣⾔的UIの導⼊ ✅ UIファイルの肥⼤化解消 ✅ 実装タスクの細分化‧分担しやすくなっ た ✅ PRが⼩さくなりレビューしやすくなった presentation

    └─ screen/ ├─ component/ │ ├─ HogeComponent │ └─ FugaComponent ├─ section/ │ ├─ HogeSection │ └─ FugaSection └─ XXView
  10. Copyright © DIP Corporation, All rights reserved. まとめ 1. リアーキテクト

    2. ユニットテストの導⼊ 3. 宣⾔的UIの導⼊ 4. AIとの協働 Google推奨アーキテクチャとfeature駆動パッケージングの実践 読み書きに迷う時間が減り、テスタビリティも得られた 「とにかく書く」ために意識の低いスタンスを重視 結果、期待以上の恩恵を得られた Androidコミュニティの知⾒をベースに分割⽅針を決めた うまくワークし、保守性と開発効率が向上した アプリの構造が説明可能になり、効果的なルールを作れた 出⼒の精度が上がり、コーディングの6割ぐらいをAIに任せられた