見出し画像

CYCOMPE(iOS)に参加して学んだこと #CAインターン


CYCOMPEとは

CYCOMPEは架空のアプリケーションのチューニングコンペティションです。サイバーエージェントが開発において大切にしている意図やポイントを落とし込んだ開発現場目線の問題にチャレンジできる2日間のインターンです。2024年8月25日(日)~26日(月)に開催されました。私はネイティブアプリ(iOS)コースに参加させていただきました。

参加してみた感想

ベストプラクティスではなく、パフォーマンスの低いコードで構成されているコードを様々な観点からアプリのパフォーマンスを改善し、高いスコアを目指すという内容でした。
私はiOSのインターン自体が初めてだったのとコードのパフォーマンスについて今まであまり考えたことがなかったので、難しく感じました。現時点でできないことやわからないことがとても悔しかったのですが、何が自分にできていないのか、できるようになるためには何をすれば良いのかがわかったので、しっかりと向き合うことで成長に繋げたいと思いました。難しかったですが、今まで見たことのない実務に近いコードを読むことができてとてもワクワクしました。
CYCOMPEに参加して復習することでたくさんの学びを得ることができたので、どのようなことを学んだかについて焦点を当てて記事を書きます。

CYCOMPE参加で学んだこと

私は異業種で働きながらiOSエンジニアを目指しているため、現職の都合で2024年8月25日(日)の1日の参加だけとなってしまうため、順位や賞は関係なく少しでも学びを得たいと思い、相談したところ社員の方々が様々な質問や親身になって相談に乗ってくださり、その中でたくさんの学びを得ることができました。動いたら良いだけじゃない。コードの書き方は複数通りあって、複数の書き方を比較し、パフォーマンスの良いコードを検討する必要があるということを学びました。

不要な変数を使用しない

不要な変数を使用しないことによって得られるパフォーマンス向上としてはメモリ使用量の削減やCPUの負荷を軽減することができます。
メモリ使用量の削減
不必要な変数を宣言すると、その変数のためにメモリ領域が割り当てられます。不要な変数を削除することで、メモリの使用量が抑えられ、アプリケーション全体のメモリ消費を削減することができます。
 CPUの負荷軽減
不要な変数を削除することで、不要な計算やメモリ割り当て・解放が省かれるため、CPU負荷が軽減され、アプリケーションのレスポンスが向上します。

具体と抽象

パフォーマンスの改善を考える時は具体と抽象両方の観点を持つことが重要であると学びました。個人開発で私が作ったSNSアプリを例として具体と抽象について考えてみましょう。
下記のComentsViewの画面でデータ容量が大きいのはどこでしょう?と質問されたらどう答えますか?
具体の考え方としての回答として、上部の投稿機能部分と下部のコメント機能部分として見ることができ、上部の投稿機能部分と私は最初答えました。
抽象的に考えてみようとアドバイスをいただいた時、具体の考え方から抽象の考え方のに切り替えるのが難しかったです。抽象の考え方としての回答としては画面に画像と文字があると考えることができます。画像と文字どちらがデータ容量が大きいか大きいかと言われたら、画像ですよね!そのように抽象的に考えることができたら、画像のデータ容量が適切か?画像のサイズが大きすぎないかを調べ、表示が崩れない程度に小さくするという考え方ができるようになります。

例: ComentsView(個人開発で作ったSNSアプリ)

CYCOMPE終了後の復習で学んだこと

現時点で知らなかったことやできなかったことをどのようにできるようにするかが大切だと思うので、CYCOMPE終了後の復習に力を入れて取り組みました。社員の方々がとても丁寧なCYCOMPEの内容の解説スライドを作成してくださっていたのでそれを元に復習しました。また、CAインターンで仲良くなった学生のTaiChoneとオンラインで一緒に復習したりしました。

ビルド時間短縮

⚫︎コンパイル(型推論)が遅い部分を修正する
不要なmapの削除。(不要なループがなくなり短くなる。)
クロージャの引数の型を明示する。(整数の場合、Int or Float or Doubleかコンパイラがわからないため、型を明示することでコンパイル時間が短くなる。)
上記の箇所を修正すると、下記のようにビルド時間が大幅に短縮されました。
ビルド時間: 19.139 s → ビルド時間: 17.026 s

⚫︎アクセス修飾子を修正する
アクセス修飾子について昔調べて記事にしたことはあったが、今回アクセス修飾子の復習をしました。モジュール(TARGETS)は一つであったのにも関わらず、publicのアクセス修飾子が使用されていたので、デフォルトのinternalにすることで下記のようにビルド時間が短縮されました。
ビルド時間: 17.026 s → ビルド時間: 16.565 s

⚫︎画像の容量を小さくする
上記の具体と抽象の話にも出てきたように画像はデータ容量が大きいため、大きすぎる場合は適切な画像の容量にリサイズする。
ビルド時間: 16.565 s → ビルド時間:
16.153s
メモリ使用量を小さくすることで画面描画のパフォーマンスを向上

上記以外にもたくさんのパフォーマンスの改善方法が解説されており、とても勉強になりました。

その後

CYCOMPEで教えていただいたBuildTimeAnalyzer-for-Xcode等を使用し、個人開発のアプリでキャッシュを導入する際にパフォーマンスを比較してみました。パフォーマンスについて考えたり、計測することが少しおもしろいなと感じました。

おわりに

今回iOSのインターンに初めて参加し、個人開発だけでは得ることができなかったたくさんの学びを得ることができました。現時点で知らなかったことやできなかったこととどう向き合うかを考える良いきっかけになりました。悔しさをバネに復習することで今まで知らなかったことやできなかったことができるようになることで成長を感じられてとても楽しいなと思いました。
1日だけの参加でしたが社員の方々や学生の方々のおかげで学びの多い充実した1日になりました。本当にありがとうございました。


この記事が気に入ったらサポートをしてみませんか?