📱

3年連続DroidKaigiにコントリビュートした内容をまとめてみた

2022/12/22に公開

始めに

この記事はSwift/Kotlin愛好会 Advent Calendar 2022の22日目の記事です。

この記事では、自分が今年でDroidKaigiのOSSアプリにコントリビュートして3年弱が経つのと現在大学の学部4年生という区切りもあり、これまでDroidKaigiで取り組んだ内容を振り返ろうと思います。あまり技術的な知見はなく、個人の感想に近いので事前にご了承ください🙇‍♂️

対象読者

  • iOS/Androidのアプリ開発に興味がある人
  • 学生や新卒エンジニアなどあまり実務の経験がない人
  • 新しい技術に興味がある人
  • DroidKaigiのようなOSS貢献に興味がある人

自己紹介

自分は現在B4の大学生です。普段はiOSアプリ開発の情報をインターンや個人開発・SNSでキャッチアップしています。他にも大学一年生の頃からアプリ開発のメンターをしたりメンター同士のコミュニティに入ってiOSアプリ開発の勉強を進めてきました。特に3年前はエンジニアの専門的なスキルに関して未熟なところが多く、当時DroidKaigiにコントリビュートしようと思った要因の一つに、実際のエンジニアから自分のコードをレビューしてもらえる点があります。実際にレビューや共同開発の体験ができたことは今でも良い経験だったと感じています。

記事を書くモチベーション

一番はDroidKaigiのIssueを解決する中で自分の出来ることが可視化されてきたからです。また、DroidKaigiのような規模の大きいOSSで初心者のコントリビュートを歓迎しているのは凄いことだと思い、もっと経験の浅いエンジニアの人にとって参考になれば良いと思っています。

これは僕の主観ですがOSS開発はPRを出してもリポジトリによってはレビューされないこともあるので、OSSの中でもDroidKaigiのように沢山のエンジニアが絡んで一緒にアプリを作っていくという体験は経験の浅かった当時の僕にとってとても魅力的な環境でした。最初の年はレビュワーの方々に負担をかけたことも感じていますが、特に最初の年は当時入門したばかりのRxSwift/RxCocoaを用いた機能を実装体験できたので本当に良い経験になりました。

また、DroidKaigiは年に一回開催されるカンファレンスなので毎年貢献することで成長が確かに可視化されたことも後から振り返ってみて面白い点だと感じています。

貢献内容

Droidkaigi 2020

2020年が初めてDroidKaigiにコントリビュートした年です。

https://github.com/DroidKaigi/conference-app-2020

[iOS] make top-left cornerRadius on SessionPageViewController #664

概要: UIViewの左上のみを角丸にする

https://github.com/DroidKaigi/conference-app-2020/pull/664

Before After

引用: https://github.com/DroidKaigi/conference-app-2020/pull/664

必要だった知識

  • KMMのプロジェクトのビルド方法
  • iOSアプリのアーキテクチャ・画面構成の理解

修正自体はcornerRadiusmaskedCornersを調整するだけなので難しくないですが、プロジェクトのコードからどこを修正する必要があるのかを把握することが大変でした。
また、KMMをビルドする際にAndroid Studio Previewを使う必要がある点も詰まりポイントでした。

[iOS] favorite(bookmark) scene #668

概要: お気に入り機能を実装する

https://github.com/DroidKaigi/conference-app-2020/pull/668

Before After

引用: https://github.com/DroidKaigi/conference-app-2020/pull/668

必要だった知識

  • RxSwift/RxCocoa
  • Rx系のオペレータの仕様
  • ドメインモデルとDBエンティティの違い
  • Realm
  • Kotlinで書かれたAPI Client
  • etc

当PRではお気に入り機能を実装しました。要件としてローカルにお気に入り情報は保存したいというのがあり、Realmを使うことにしました。

難しかったところ

KMMを使用していた関係でSession(カンファレンスのセッション)を表現するデータモデルがKotlinで書かれていたり, APIClientがKotlinで書かれていたりで本来の仕様を把握するのが大変で、PR内で質問をしながら理解していきました。

他にもKotlinとドメインの実装をなるべく共通化してKMMの恩恵を受けたいという意思もあってRealmのデータクラスを一度Kotlin側で定義されたモデルに変換する必要があったり、細かいRxの書き方を指摘されたりなど沢山あります。

また、PRを見てもらうと分かるのですが、このPRは正直なところ当時の自分の技術力に見合った機能の実装ではなく、最終的にはバグやコードに問題がある状態でマージされました。あまり良い例ではないですが、来年以降またコントリビュートしようと思うきっかけになりました。

DroidKaigi 2021

https://github.com/DroidKaigi/conference-app-2021

2021年も2020年の経験を元にコントリビュートしました。やはり2021年もKMMを使っていました。更にUIKitからSwiftUIにUIフレームワークを変更したのも大きな魅力ポイントでした。

この段階で自分は一度エンジニアインターンを経験していたこともあり去年よりはスムーズに取り組むことができました。

Rename FeedItemViewModelTest -> FeedViewModelTest #330

概要: 既存クラス名をリファクタリングするタスク

https://github.com/DroidKaigi/conference-app-2021/pull/330

必要だった知識

  • プロジェクトのビルド方法

2021年の始めのIssueはwelcome_contributeが貼られたラベルにしました。去年背伸びして難しいタスクをやったので怖気付いていた気持ちがありましたが、一発でApproveされたので安心していました。

Add padding to image when FeedList is in filter-state on Home Tab. #421

概要: フィルタが行われてる状態のレイアウト調整

https://github.com/DroidKaigi/conference-app-2021/pull/421

Before After

引用: https://github.com/DroidKaigi/conference-app-2021/pull/421

必要だった知識

  • Kotlinのリーディング力

Androidアプリ側の貢献を初めてしました。Jetpack Composeはあまり経験がなかったのですが既に書かれたコードがあったのでそれと同じようにUIを書いたりプレビュー作成したりしました。

既に「フィルタが行われている状態を表す変数」は実装されていたのでUI側だけの実装というタスクだったので詰まりポイントは殆どなかったです。

[iOS] Create setting screen #463

概要: iOSアプリの設定画面を実装

https://github.com/DroidKaigi/conference-app-2021/pull/463

Before After

引用: https://github.com/DroidKaigi/conference-app-2021/pull/463

必要だった知識

  • SwiftPMを用いたマルチモジュール構成
  • SwiftUI

2021年からiOS側のアーキテクチャがSwiftPMでのマルチモジュール構成になっていました。しかも当時SwiftPMでのマルチモジュール構成は新しい技術だった記憶があり、SwiftUIの導入と合わせて新しい技術に触れれらたという印象が深いです。

僕自身は個人でSwiftUIの勉強はしていましたが、実際にプロダクトレベルで読んだのは今回が初めてでした。

DroidKaigi 2022

https://github.com/DroidKaigi/conference-app-2022

今年の内容です

そろそろFlutterになるかもと不安になっていましたがDroidKaigiということもあるのか(主観です)、KMMとJetpack Compose / SwiftUIという構成でした。

ただ、今年からライブラリのTCAを導入してReduxライクにコードが書かれていました。他にもasync/awaitでAPIClientのインターフェースが提供されていたり、新しい技術を積極的に使用していて面白かったです。

[iOS] Add Caching support to network image #609

概要: 画像データのダウンロードをキャッシュする

https://github.com/DroidKaigi/conference-app-2022/pull/609

必要だった知識

  • Swift package manager
  • SwiftUI
  • Kingfisher

Screenshot 2022-12-21 at 20.09.13.png

あまり詰まる点もなく実装でき成長を感じたPRでした :+1:

また、Xcode Previewsのプログラムを#if DEBUGで囲っている点も小規模なアプリだと気にしない点だったので参考になりました。

https://github.com/DroidKaigi/conference-app-2022/blob/c93babf6788fc828f9d5a988cd5c9697fe144275/app-ios/Sources/CommonComponents/NetworkImage.swift#L60-L92

[iOS] Implement Announcement Feature #681

概要: 通知(アナウンスメント)一覧画面のUI実装

https://github.com/DroidKaigi/conference-app-2022/pull/681

Before After

引用: https://github.com/DroidKaigi/conference-app-2022/pull/681

必要だった知識

  • SwiftPMのパッケージの新規作成
  • TCAの知識
  • async/await

2年前と比べると殆ど分からないところもなく、むしろバックエンドのAPIがおかしい・ドメインの命名がKotlin側とSwift側でずれているなど自分の方から積極的に修正点を発見することが出来たと感じています。

また、去年と似たようなプロジェクト構成で管理されていたので連続でコントリビュートすることでオンボーディングがスムーズに終わるという恩恵も感じました。

まとめ

冒頭にも書いた通りOSS貢献はPRを出してもマージされないことや返信が来ないことがあるので(メンテナスコストの観点からそれ自体は悪いことだと思っていませんが)、DroidKaigiのようなOSS貢献を歓迎しているリポジトリは、最初のOSS貢献に適した場所だと思っています。
また、来年以降は分からないですが新しい技術を積極的にこれまで採用していたOSSなのでKMMを始めとした技術に触れる貴重な機会になりました。

最後まで読んでいただきありがとうございました!来年もモバイルアプリ開発やっていくのでよろしくお願いします!

Discussion