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

ウォンテッドリーにおけるモバイルアプリ開発 / iOSDC Japan 2024 Sponso...

ウォンテッドリーにおけるモバイルアプリ開発 / iOSDC Japan 2024 Sponsor Session

Masatoshi Kubode

August 23, 2024
Tweet

More Decks by Masatoshi Kubode

Other Decks in Programming

Transcript

  1. © 2024 Wantedly, Inc. Introduction ▍会社概要 ウォンテッドリー株式会社 仲 暁子 2010年5月

    104人 究極の適材適所により、シゴトでココロオドルひとをふやす 東京都港区白金台 5-12-7 MG白金台ビル4F CEO 設立 ミッション 社員数 本社住所
  2. © 2024 Wantedly, Inc. “シゴトでココロオドル”とは? 私たちは“シゴトでココロオドル ”人を増やし(プロダクト)、 私たち自身も“シゴトでココロオドル ”状態で あり続けることを目指します。

    没頭することで成果を出し、成果によって成長を実感すること ミッションやカルチャーなどに共感できる組織 の、自律的に意思決定できる環境で、簡単す ぎず、難しすぎない適度な挑戦によりフロー状 態となり、仕事に没頭できている状態 没頭した結果、 新しい価値といった成果を生み出す 一定の成果をあげられたことに対して、 成長を実感できる About Wantedly シゴトでココロオドル状態とは? 没頭 1 成果 2 成長実感 3
  3. © 2024 Wantedly, Inc. 人々が仕事に夢中になるためのユニークな価値を提供 Business サービス提供価値 Wantedlyの提供価値 Employee Engagement

    Recruiting Recruitment Marketing 認知形成・興味喚起・応募 定着・活躍 Blog、SNS、動画、PR 詳細情報提供、イベント コミュニケーション、 チームマネジメント、福利厚生 選考・内定・承諾 日程調整、候補者管理、 進捗把握、データ分析 
  4. © 2024 Wantedly, Inc. モバイルチーム 開発メンバー 久保出 Tech Lead 林 iOSリード

    エンジニア 原田 iOS エンジニア 業務委託メンバー iOS エンジニア Android エンジニア
  5. © 2024 Wantedly, Inc. スクラム開発 • 1週間単位のスプリント 金曜日 • デイリースクラム

    • 開発 • スプリントレビュー • レトロスペクティブ 月曜日 • プランニング • 開発 火曜日〜木曜日 • デイリースクラム • 開発
  6. © 2024 Wantedly, Inc. グロースサイクル 2. 施策アイディア 発見した課題の施策アイディアを考え る 1.

    課題発見 プロダクトの改善や成長に つながる課題を見つける 3. 実装 施策アイディアを基に 新機能の実装や修正を行う 5. 分析 施策で狙った目的が達成で きたかを検証する 4. リリース
  7. © 2024 Wantedly, Inc. 技術軸での取り組み • モバイルお茶会 ◦ 毎週30分の勉強会 •

    負債返済日 ◦ 月に丸一日使って負債返済 https://docs.wantedly.dev/fields/dev-process/fusai-hensai-bi
  8. © 2024 Wantedly, Inc. KMPの実例 Reactor class OnboardingLocationEditReactor internal constructor(

    private val updateLocationUseCase: UpdateLocationUseCase, ) : BaseReactor<Action, Mutation, State, Unit>(State()) { data class State( val location: String = "", val submissionStatus: SubmissionStatus = SubmissionStatus.Pending, ) sealed class Action { data class UpdateLocation(val location: String) : Action() data object Submit : Action() } } • 居住地入力のロジックを担う
  9. © 2024 Wantedly, Inc. SwiftUIとKMPの連携 public struct OnboardingLocationView: View {

    public typealias Reactor = AnySwiftUIReactor< OnboardingLocationEditReactor.Action, OnboardingLocationEditReactor.State, KotlinUnit > @EnvironmentObject private var reactor: Reactor private var locationText: Binding<String> { Binding(    get: { reactor.state.location }, set: { newValue in reactor.send(OnboardingLocationEditReactor.ActionUpdateLocation(location: newValue)) }) } public var body: some View { VStack { /* UIのコード */ Button { reactor.send(OnboardingLocationEditReactor.ActionSubmit()) } label: { ... } } } }
  10. © 2024 Wantedly, Inc. SwiftUIとKMPの連携 Binding( get: { reactor.state.location },

    set: { newValue in reactor.send(OnboardingLocationEditReactor.ActionUpdateLocation(location: newValue)) }) Button { reactor.send(OnboardingLocationEditReactor.ActionSubmit()) } label: { ... }
  11. © 2024 Wantedly, Inc. 良い点 • ビジネスロジックの共有ができ、仕様が統一される ◦ プレゼンテーションロジック(ReactorやViewModel) ◦

    ネットワークレイヤー ◦ エラーハンドリング • モバイルプラットフォーム全体で考えたときの開発生産性向上 ◦ 1つのコードベースでiOS / Android へ同じ体験を提供できる
  12. © 2024 Wantedly, Inc. KMPの変更をiOS側に取り込む手順 2. KMPの実装を取り込むまでに時間がかかる Kotlin Multiplatform 1.

    PR作成し、CIを実施 2. PRをマージ 3. KMPの変更を含んだ PRが作成される 4. PRをマージ Repo: Visit App Shared Repo: Visit iOS Swift Package Manager XCFramework
  13. © 2024 Wantedly, Inc. 3. Kotlin → Swiftへの変換に慣れる必要がある Sealed Classをenum

    へ変換する例 sealed class SubmissionStatus { data object Pending : SubmissionStatus() data object Submitting : SubmissionStatus() data object Succeeded : SubmissionStatus() data class Failed(val error: Exception) : SubmissionStatus() } ネットワークリクエストの状態を表す
  14. © 2024 Wantedly, Inc. extension OnboardingLocationEditReactor.SubmissionStatus { public enum Pattern

    { case pending   // 一部省略 case failed(error: KotlinException) } public func asSwiftEnum() -> Pattern? { switch self { case self as OnboardingLocationEditReactor.SubmissionStatusPending: return .pending // 一部省略 case let failed as OnboardingLocationEditReactor.SubmissionStatusFailed: return .failed(error: failed.error) default: assertionFailure("not supported") return nil } } } 3. Kotlin → Swiftへの変換に慣れる必要がある
  15. © 2024 Wantedly, Inc. 改善案と展望 KMPを触るiOSエンジニアの 開発者体験向上 https://touchlab.co/kmp-teams-use-source 1. コードの定義元に直接飛べない

    ◦ Xcode-Kotlin Pluginの導入 2. KMPの実装を取り込むまでに時間がかかる ◦ GitPortalの導入 3. Kotlin → Swiftへの変換に慣れる必要がある ◦ SKIEの導入