Slide 1

Slide 1 text

Session Title Merpay iOSにおける Swift Concurrency対応の 挫折と今後 Takeshi Sato Merpay iOS Team

Slide 2

Slide 2 text

Takeshi Sato / 2019年にメルペイに入社し、支払いタブ画面、 E2E テストの整備、eKYC(本人確認)画面の開発を担 当。 今はTnS(Trust and Safty)という不正対策チーム でメルカリアプリの安全を守っている。 近著「一冊でマスター!Swift Concurrency入 門」。 株式会社メルペイ iOS Team @takeshi_sato_5203

Slide 3

Slide 3 text

目次 Swift Concurrency対応プロジェクト 01 ロードマップの方向転換 02 メルペイコードのGitリポジトリ統合 (monorepo)の影響 03 プロジェクト中断と学び 04

Slide 4

Slide 4 text

Swift Concurrencyとは? - Swift 5.5から登場した言語レベルの並行処理機能 - 並行処理を簡潔に記述でき、Data raceを防げる - コンパイル時にチェック - async/await/Task/actor/@MainActor/Sendable

Slide 5

Slide 5 text

Swift 6とConcurrency - Swift 6はSendableのチェックが厳密になる。適応していないコード はコンパイルエラーになる - 段階的な適応のためにSwift 5系でも使えるコンパイルオプション が提供されている https://forums.swift.org/t/concurrency-in-swift-5-and-6/49337

Slide 6

Slide 6 text

コンパイルオプション - Swift 5.6まで - OTHER_SWIFT_FLAGS = -Xfrontend -warn-concurrency -Xfrontend -enable-actor-data-race-checks - Swift 5.7から - SWIFT_STRICT_CONCURRENCY = {minimal|targeted|complete} - OTHER_SWIFT_FLAGS = -Xfrontend -enable-actor-data-race-checks https://forums.swift.org/t/concurrency-in-swift-5-and-6/49337

Slide 7

Slide 7 text

Swift Concurrency対応プロジェクト - Merpay iOSコードにSwift Concurrencyのビルドオプションを追加 - Swift 6で必須になるConcurrency対応の事前準備 - Sendableエラーが出ないようにする - コンパイルチェックで並行処理関連の不具合を減らす

Slide 8

Slide 8 text

メルペイコードのモジュール構成

Slide 9

Slide 9 text

当初のロードマップ - それぞれのFeatureモジュール対応 - 各モジュールにビルドオプション渡す - 全部で20以上のモジュール - ビルドエラーを直す - Concurrency起因のワーニングをなるべく修正 - 対応終わったモジュールからリリース - その後Coreモジュールを対応

Slide 10

Slide 10 text

コンパイルエラーの修正

Slide 11

Slide 11 text

コンパイルワーニングの修正

Slide 12

Slide 12 text

@MainActorの追加 - メルペイではMVVMアーキテクチャで画面を実装 - ViewModelに@MainActorを追加

Slide 13

Slide 13 text

Swift ConcurrencyとProtocol

Slide 14

Slide 14 text

メルペイコードの影響

Slide 15

Slide 15 text

ロードマップの方向転換 - それぞれのFeatureモジュール対応 - その後Coreモジュールを対応 - 全てのモジュール対応が終わったらリリース

Slide 16

Slide 16 text

ロードマップの方向転換

Slide 17

Slide 17 text

Gitリポジトリ統合 (monorepo)の影響 - メルペイのリポジトリをGU Appに一本化 - メルペイ画面をSwiftUIとGUアーキテクチャに書き換えるプロジェク トが発足 merpay-ios-sdk - メルペイコード mercari-groundup-ios mercari-groundup-ios - メルペイコード

Slide 18

Slide 18 text

タイムライン

Slide 19

Slide 19 text

メルペイ画面をSwiftUIに書き換え - Gitリポジトリ統合の後メルペイ画面をSwiftUIとGround UP App アーキテクチャに書き換えるプロジェクトが発足 - 今までの画面はレガシーコードとして保守することになった - Swift Concurrency対応はレガシーコードを対象 レガシーコード - UIKit - MVVMアーキテクチャ - なるべく更新しない方針 Ground UP App アーキテクチャ - SwiftUI - CombineによるGround UP App アーキテクチャ - 新規画面はこちらで実装

Slide 20

Slide 20 text

Swift Concurrencyの実装完了 - 一気に書き換えたので更新規模が膨大になる - 少し動作確認したところ動作が不安定な挙動が頻発した - メインスレッドで動作すべき処理が別スレッドで動作 - 別スレッドで動作すべき処理がメインスレッドで動作 - レガシーコードは保守運用という方針と矛盾

Slide 21

Slide 21 text

Swift 6リリースのスケジュール - Swift 6のリリーススケジュールはまだ発表されていない - 2023年はConcurrencyの他にオーナーシップなどに取り組む予定 - https://www.swift.org/blog/focus-areas-2023/ - 2023年中にSwift 6がリリースされることはなさそう swift-evolution

Slide 22

Slide 22 text

チームとしての判断 - レガシーコードの積極的な更新はするべきではない - Swift Concurrency対応コードに不具合が多く見つかっている - Swift 6がリリースされてもしばらくはSwift 5モードでコンパイルする 手段が提供される見込み - もちろんSwift 6のどこかのバージョンでこの機能がなくなる可 能性あり - Xcode 14.1, Swift 5.7ではWKNavigationDelegate, AVFoundationなどConcurrency未対応のクラスやフレームワーク 多い - SwiftUI書き換えプロジェクトの後でよい https://forums.swift.org/t/concurrency-in-swift-5-and-6/49337

Slide 23

Slide 23 text

ロードマップの引き直し

Slide 24

Slide 24 text

プロジェクト中断と学び - コードを一気に書き換えるという方針転換とチームとしてコードベー スが変わる影響でプロジェクトは中断 - 一気に変えると影響範囲が見えにくくなり、QAが長引く原因になる - ただSwift Concurrencyは一気に書き換えないとワーニングが増え てしまう機能だった - 書き換えのベネフィットとチーム状況を見つつ進める必要があった - とはいえ細かくリリースして早くコードに反映したほうがいい

Slide 25

Slide 25 text

大きな機能も 細かな リリーススケジュールを 立てよう!

Slide 26

Slide 26 text

No content