プロダクトコードからライブラリの境界を見つける
by
elmetal
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
プロダクトコードから ライブラリの境界を見つける 「ほかでも使えそう」を、 公開できるSwift Packageへ再設計するまで elmetal Cybozu, Inc. iOSDC Japan 2026 2026-09-12 #iosdc #c 1
Slide 2
Slide 2 text
About me @el̲metal̲ iOS App Developer 複数チームの 技術支援 #iosdc #c 2 競馬 対戦ゲーム 育児
Slide 3
Slide 3 text
サイボウズについて #iosdc #c 3
Slide 4
Slide 4 text
チームワークあふれる 社会を創る #iosdc #c #チームワークあふれる社会を創る 4
Slide 5
Slide 5 text
サイボウズについて iOSアプリ kintone サイボウズ O ce Garoon サイボウズでは複数のプロダクトを開発しています #iosdc #c ffi 5
Slide 6
Slide 6 text
Intro #iosdc #c
Slide 7
Slide 7 text
🤔このコード他でも使えそう #iosdc #c 7
Slide 8
Slide 8 text
🤔ライブラリにできないか #iosdc #c 8
Slide 9
Slide 9 text
サイボウズでは色々ライブラリ作りました WebUI LicenseList #iosdc #c 9 認証(社内ライブラリ)
Slide 10
Slide 10 text
新規アプリの基盤構築を 4~5ヶ月から約2週間へ短縮 #iosdc #c 10
Slide 11
Slide 11 text
サイボウズではどのように ライブラリに再設計しているかお話しします #iosdc #c 11
Slide 12
Slide 12 text
ライブラリの境界を見つける #iosdc #c 12
Slide 13
Slide 13 text
「ほかでも使えそう」から始める • ライブラリの境界:ライブラリ側の責任と利用側の責任の線引き • 共通部分っぽいところを見つけて抜き出してみる • 基盤でも共通アルゴリズムでも、なんでもok • 共通部分を大きく取ろうとしない • 大きく取れるところは取ろうとしなくても自然と大きく取れる #iosdc #c 13
Slide 14
Slide 14 text
ライブラリ、リポジトリの名前を決める • 責務を表現する命名を試みる • 一言で表現するくらいの粒度で • 細部はまだ決めない • APIを作る時に自然と境界が決まっていく • 被りがないかGitHubで検索しておく #iosdc #c 14
Slide 15
Slide 15 text
ライブラリのための再設計をする #iosdc #c
Slide 16
Slide 16 text
責務を分析して境界を再設計する • コードを別のモジュールに移動してpublicにするだけでは機能するライブラリ にならない • 元のコードのスメルが残りがち • 移動元にあった固有の型に依存している • 特定の状態管理や画面構成が前提になっている • 内部実装の都合が反映された呼び出しになっている #iosdc #c 16
Slide 17
Slide 17 text
責務を分析して境界を再設計する • 疑似コードを使って複数の呼び出し案を考える • 実装が全くない状態で議論している • これらの選択肢を使って議論した上でADRに記録を残す #iosdc #c 17
Slide 18
Slide 18 text
責務を分析して境界を再設計する 擬似コードの例 WebUIで検討していた時の疑似コード struct ContentView: View { var body: some View { WebViewReader { proxy in VStack { Button("Go back") { proxy.goBack() } WebView(url: URL(...)) } } } } #iosdc #c 18
Slide 19
Slide 19 text
ライブラリが担う責務を決める • プログラム上の責務 • ライブラリ側と利用者側の責任分解点の線引き • 先に全部決めるのは難しい • 存在を認識した上で決めるのを後でやる部分があっても良い #iosdc #c 19
Slide 20
Slide 20 text
プロダクト固有の依存を探し出す コードレベル • プロダクト独自の型 • ViewModel/Store 基盤 暗黙の前提 • Navigation • デザインシステム • ログ・分析基盤 • 認証基盤 #iosdc #c 20 • 状態管理 • 画面構成
Slide 21
Slide 21 text
不要な依存を取り除く • そもそもライブラリ内に依存が必要かを考える • 積極的に利用側へ戻す • アプリごとに異なるものは利用側の責務とする • プロダクトの状態管理やデザインシステムとの接続はプロダクト側のAdapter が行う #iosdc #c 21
Slide 22
Slide 22 text
API設計 • 利用側の呼び出しを決める • API Documentを書く • この型が何か, メソッドの返り値が何か • この時点での実装可能性は考慮しない #iosdc #c 22
Slide 23
Slide 23 text
利用者のためのAPIを設計する • よくある用途が自然に書けるか • 高度な機能が段階的に使えるか • 内部の概念が漏洩していないか • 不正な組み合わせを型レベルで防げるか • Swift/SwiftUIの語彙に馴染んでいるか #iosdc #c 23
Slide 24
Slide 24 text
API設計Tips インターフェースに標準の型を使う • Swift標準ライブラリの型 • swift-lang・appleのライブラリの型 • 利用側に安定したインターフェースを提供できる #iosdc #c 24
Slide 25
Slide 25 text
API設計Tips ポリシーに従って決める • 何でも差し替え可能にしない • 提供するスコープを超えた拡張を考慮しない • 責務を超える要求を受け入れない #iosdc #c 25
Slide 26
Slide 26 text
呼び出し側から設計を精査する #iosdc #c
Slide 27
Slide 27 text
利用例で評価する • 抽象度が適切かどうか利用例を使って評価する • ドキュメント • テスト • サンプルアプリ • API設計の精度を高めていく • 線形のプロセスでなくてよい #iosdc #c
Slide 28
Slide 28 text
DocC • APIリファレンスはAPI設計時に書く • API Design Guidelines | swift.org • 設計がおかしいとドキュメントがうまく書けないので設計へのフィードバ ックになる • API以外にもライブラリのOverviewや基本概念、重要な制約について書く • Apple Developer Documentationのスタイルを踏襲する #iosdc #c 28
Slide 29
Slide 29 text
テスト • テストは最初の利用者 • コードレベルでAPIがおかしくないかフィードバックする • 公開APIの振る舞いを検証する • 入出力の契約 • エラーの挙動 • プラットフォーム差異 #iosdc #c 29
Slide 30
Slide 30 text
サンプルアプリ • サンプルアプリで統合する • 機能レベルだけでなくコードレベルでもうまく統合されているか確認する • アプリの利用例として機能させる • 実行可能なドキュメントとして扱う #iosdc #c 30
Slide 31
Slide 31 text
運用の設計 #iosdc #c
Slide 32
Slide 32 text
CIを動かす • ビルド・テスト • 複数プラットフォームでのビルド • サンプルアプリでのビルド • DocCのドキュメント生成とGitHub Pagesへのデプロイ #iosdc #c 32
Slide 33
Slide 33 text
公開後の運用ポイント • Issueはライブラリの責務範囲内か • どこまでをライブラリ側API追加で、どこまでを利用側で解決すると線引きするか • 破壊的変更を行う価値があるか • APIやサポート対象の廃止 • Deprecatedによる移行期間設定 • セマンティックバージョニング #iosdc #c 33
Slide 34
Slide 34 text
最近のサイボウズでは • 最近はいきなり別リポジトリを立てることが多い • 設計や責務のスコープを決めるのに慣れてきた • プロダクトコードの中で価値が出そうなところは大体やり切ってしまった • リポジトリ作成時点でOSSを射程に入れている • 社内ライブラリで開発開始しつつOSSにできそうか見てみる • 社内ライブラリのままでもOKのスタンス #iosdc #c 34
Slide 35
Slide 35 text
まとめ • 共通の責務を見つけ、抽象度を上げて、機能するライブラリに再設計する • APIドキュメント、テスト、サンプルアプリ、実アプリと段階の異なる利用者 でAPI設計を精査する • 公開するとライブラリの境界をメンテナンスすることになる #iosdc #c 35
Slide 36
Slide 36 text
ありがとうございました #iosdc #c