次世代トップエンジニア創出インターンシップ ACE に参加してきた!
例によって、終了から記事公開まで、1ヶ月以上経過してしまいましたが、株式会社CyberAgentの次世代トップエンジニア創出インターンシップACEに参加してきました!
いつもたくさんの画像を入れて、長くなってしまいますが、今回は、文章のみ、コンパクトにしております!
日程と会場
開催期間は、9/6〜9/19。
9/6〜9/15はオンライン、9/17〜9/19はAbemaTowersで行われました。
チーム構成
このインターンシップは、3つのチームに分かれ、各チームは、クライアントサイドとサーバサイドから構成されます。
3チームのうち2つのチームはWebクライアント+サーバ、僕が所属していたチームは、iOSクライアント (2人) +Androidクライアント (2人) +サーバ (2人) です。
例によって、僕はiOS向けのアプリを開発します。
普段、サーバサイドまで自分で開発することが多いです。
同じチームで別の人がサーバサイドを担当して、自分はクライアントサイドに専念するということはほぼ初めての経験だったので、非常に楽しみにしていました。
お題
今回のお題は、サッカートーナメントの対戦表。
数日間にわたるサッカートーナメントで、日程、得点、対戦チームなどを表示するものです。
目標
今回のインターンシップでは、参加者1人に1人のメンターの方についていただきました。
前回参加したインターンシップでは、メンターの方を上手に頼ることができませんでした。
また、前回のインターンシップ以来、個人開発やiOSDCを通して、技術のインプットが非常に多く、そのアウトプットの機会としたいと考えていました。
そのため、今回は、以下の目標を立てました。
- 少しでも気になったことや調べてもすぐわからなかったことを、毎日設けられている質問タイムで質問する
- こまめにコードレビューをしてもらう
- メンターさんとのコミュニケーションを通して、技術力の差を知る、視点を上げる
- 他プラットフォームとの連携、密なコミュニケーションを意識する
- 今まで学んできた、新しい技術を使う
- テストを書く
前半: オンラインパート (9/6-9/15)
開始日以前に、お題とプロトタイプ、機能要件などが公開されていました。
9/5に顔合わせも含めて、技術選定のミーティングを行いました。
iOSチームのもう1人は、前回のインターンシップで仲良くなった @Kanta_Swift でした! (かんた違いです)
プロジェクトをSwift Package Managerを用いたマルチモジュール構成にして、機能ごとの開発をしやすいようにしました。
また、XcodeProjectの責務を最小限にし、SwiftPMにできる限り移譲することで、プロジェクトファイルのコンフリクトを減らすようにしました。
利用したライブラリは以下のとおりです。
- apollographql/apollo-ios
- firebase/firebase-ios-sdk
- kishikawakatsumi/KeychainAccess
- pointfreeco/swift-composable-architecture
- pointfreeco/swift-dependencies
- SwiftGen/SwiftGenPlugin
- realm/SwiftLint
- kean/Nuke
サーバサイドでGraphQLを採用したため、GraphQLのクライアントとして、Apolloを採用しました。
GraphQLの特徴として、エンドポイントが同じであるため、REST APIと比較してキャッシュしにくいという点があります。
この点を解消するために、Apolloを用いて、よしなにキャッシュしてくれるようにします。
Firebaseは、認証のために用います。
アーキテクチャにTCAを採用したため、ComposableArchitectureを使います。
SwiftGenPluginは、アセットの扱いを効率化するために用います。
Xcode 15から、Swift Package内でのAssetCatalogが扱いやすくなり、SwiftGenがなくても、SwiftGenでやりたかったことができるようになります。
このインターン期間の段階では、Xcode 15はベータ版であったため、Xcode 14を使いました。
GraphQLのスキーマをもとに、サーバサイドやAndroidチームとコミュニケーションをとりながら開発を進めていくことができました。
iOSに限ると、お互いに、TCAに関する基本的な知識があったことで、導入はスムーズに進みました。
ただ、規模がそれなりに大きいので、サーバとの通信のタイミングや画面遷移などで、かなり苦労しました。経験不足を実感...
後半: AbemaTowersパート (9/17-9/19)
今まで、オンラインで開発していたチームメンバーや、メンターの方とオフラインで会える喜びを噛み締め、開発スタート。
オンライン期間に比べて、進捗が非常に良い...
すぐにチームメンバーやメンターの方とコミュニケーションをとることができるのが、オフラインの1番の良さだと改めて実感しました。
前回のインターンは、2週間ほどオフラインでの活動だったため、もっと有効に時間を使えたのでは...という後悔もありつつ...
あっという間に、最終日を迎えました。
テストがかけていないことや、設計のミスなどによって、発表会直前になると、さまざまな問題が浮き彫りになっていました...
振り返りと感想
目標を10点満点で振り返ってみると...
- 少しでも気になったことや調べてもすぐわからなかったことを、毎日設けられている質問タイムで質問する: 8
- こまめにコードレビューをしてもらう: 6
- メンターさんとのコミュニケーションを通して、技術力の差を知る、視点を上げる: 8
- 他プラットフォームとの連携、密なコミュニケーションを意識する: 8
- 今まで学んできた、新しい技術を使う: 8
- テストを書く: 2
他にも、LiveActivitiesAPIをつかった機能やWidgetの開発も行いたかったのですが、間に合いませんでした。
サーバーと通信するタイミングや、ユーザへのフィードバックなどから、サクサクした使用感にはまだ程遠いものとなりました。
前回のインターンと比較して、できることが非常に増えた一方、できなかったこと、やるべきことが次々と見えてきて、受ける刺激や得る学びが多かったです。
毎度、このようなイベントの後は、色々なモチベーションが上がり、そこで得たいろいろな学びを自分のコードにアウトプットします。
そうなると、ブログどころではなくなり、いつも記事を書くのが遅くなってしまいます...