はじめに
私は金沢工業大学工学部情報工学科3年の松村拓洋です。
2024年9月、サイバーエージェントの就業型インターンシップ「CA Tech Job」に参加しました。普段は大学のKIT Happy Robotプロジェクトでリーダーを務め、生活支援ロボットの開発に携わっています。
このインターンシップへの参加目的は、ユーザー志向のAndroidアプリ開発スキルを磨くことでした。個人開発の経験はありましたが、プロフェッショナルな環境でのチーム開発を通じて、技術力と開発プロセスの理解を深めたいと考えました。
私は今回、AmebaのAndroidチームに所属して約1ヶ月リアーキテクチャを中心に様々な開発にチャレンジしました。
伝えたいこと
本記事では大きく4つお伝えします。
- 個人開発での考え方はチーム開発でも通用する
- 自分が感じたなぜ?を大切にする
- プロフェッショナルから得た知見
- 開発の目安をたてることの大切さ
この記事の対象者
- 個人開発の経験はあるものの、業務レベルの開発に不安を感じている学生の方々
個人開発での考え方はチーム開発でも通用する
私は個人開発ではAndroid Javaの頃から今まで様々なオリジナルアプリを開発してアプリ開発を楽しんできました。特に、最近学んでいるJetpackComposeでは実際にAIを処理しながら画面にテキストや解析結果を表示させる際にフレーム落ちを防ぐような開発にも取り組んでいます。
私は個人開発でプロダクトを作る際に、リリースすることを前提としてアプリを開発していたため、どんな処理をしてもアプリが安定して動くことを考えながら開発することが多かったです。この記事を読んでいる方々も、何かに着目して開発することが多いと思います。私は今まで個人開発で意識をしてきたパフォーマンスに関する考え方は業務でも生きてくるという事を知りました。
特に今回の業務で学んだ重要なキーワードは「Androidのライフサイクル」「非同期処理の効率化」です。
私が受け持ったタスクの一つに画面上にサーバーから受け取った文字を表示するというものがありました。その際に、Androidのライフサイクルを考慮して、処理を実装しているクラスと、それに対応する適当な非同期処理のプログラムを書く必要があります。
Androidのライフサイクルは、アプリの画面(Activity or Fragment)の状態変化を管理する仕組みです。
私の担当画面では、表示中のデータ取得と、非表示時の処理停止を適切に制御する必要がありました。
最初は`lifecycleScope`(Coroutineの実行範囲を定義する機能)を使用していましたが、画面が非表示になっても処理が継続する問題がありました。`viewLifecycleOwner.lifecycleScope`を使用することで、画面のライフサイクルに正確に連動した処理が可能になりました。これにより、リソースの効率的な管理とメモリリークの防止が実現できました。
私は今まで独学で勉強したことがある知識だからこそ、実務で新しいことを吸収できたのではないかと思います。単語は知っているけどそれをどう使えば良いのかわからないということが個人開発ではよく起こっていたのですが、実際に業務になると他の凄腕社員の方がそのことについてすでにコードを書いていたり学ぶことが多いので良い勉強になったと思います。
自分が感じたなぜ?を大切にする
トレーナーへの質問
業務中の疑問点は、すぐにトレーナーに質問して解決しました。質問の質を高めるため、理解できている部分と不明点を明確に区別し、的確に伝えるよう心がけました。
こういった質問の仕方は時間の節約と効率化でとても良い方法だと感じました。この質問方法はトレーナーと私の認識違いが生まれにくくなります。トレーナーに丁寧に説明する事で今置かれている状況が自分の中で明確になると同時に、トレーナーは私と同じ目線にたつことができます。その中でトレーナーさんなりの解決方法の提案を受けてスムーズに次のアクションをとることができます。自分がトレーナーさんに質問する前に少しの知識があった状態で質問することは、トレーナーさんとの話をする中で「なぜ?」と思うことが生まれ、解決策の議論をし結論の比較を行うことができます。私は今回の質問の仕方でトレーナーさんに質問したこととそれに関連したキーワードや概念について説明を受けることができ、インターンシップの学びとしてとても良い体験をしました。
プログラムを見てもらう人へのなぜ?
私はいつもプログラムを書く時に、今後誰かが改修を行う際に読みやすいコードであるかどうかを考えていました。
今回のインターンでコードについてレビューをしてもらう場面がインターンシップの中で多々ありました。
ただ、そのレビューの中で社員の方々に「〜した方が良い」「なんでこのように実装したの?」のようなコメントをいただくことが多かったです。
私はこの軸を意識しながら考えてコードを書いていたため、社員さんのレビューでは、ただ言われるままにコードを書き換えるということはなくむしろ自分の考えと照らし合わせることができたためレビューに対する疑問や納得ができ感動しました。
私は業務でViewModelとUIのコーディング規約に則ったリファクタリングの開発に取り組んでいたのですが、私はViewModelが完成しないとUIも完成しないと開発時は思い込んでいました。ViewModelからUIにデータを渡す際にポップアップメッセージなどを出す通知とイベントという二つのデータの受け渡しをします。この二つのデータを正しくUI側で受け取れるようにViewModel側で調整しなければならないと感じていました。しかし、この疑問を定例ミーティングで質問をする事で、コーディング規約が存在する事の意義そして、自分の思考では保守管理がしにくいコードを自分が作り出していたことについて気づくことができました。
プロフェッショナルから得た知見
インターンシップで様々なエンジニアやエンジニア以外の部署の方々とお話する機会をいただき多くの憧れの人ができました。その共通点は「深い知識量」だと私は思います。
社員の方々は技術に関する豊富な知識をもち、記事や公式ドキュメントを丁寧に読む力があります。多くの問題解決の引き出しが多く、自分の考えていることの提案や議論をしている姿がとても魅力的でした。
例えば、Kotlinについての話題が上がった時に「他の言語や写像などの数学的概念を取り入れているから他のプログラミング言語や数学的知識も役に立つ」という話を聞いてとても感銘を受けました。
そのほかにも、技術以外で趣味の歴史や私の知らない領域についてワクワクと話をしている方が多く毎日がとても新鮮でした。
サイバーエージェントで働いている社員の方々は、好きなことに対する探求心が強く、それが業務にも反映されているのだなと感じました。
開発の目安を立てることの重要さ
私はインターンシップでは、限られた時間の間でタスクを完了させることは難しいことだということ感じました。個人開発では時間をかけて取り組むことができましたが、実務ではミーティングや面談などコードを書く以外の時間も必要になることが多かったです。
効率よく業務時間に取り組むために以下の方法を実践していました。
- 毎日、朝夕でトレーナーさんと一緒に進捗の振り返りを行なった
- 日報を書く
このように毎日振り返りを行なっていると、気づくことがあります。長い間開発し続けているタスクがあると、早くタスクを完成させなければならないという意識が高まり、タスク管理の効率化と優先順位を明らかにすることができます。
たまに、初めて業務で使う Hilt と AndroidのTestの書き方の概念やその他多くの事を調べることもあり時間設定が定めにくい場合もあり、タスク完了まで時間がかかることがありました。時間の目安を立てることは経験値によって変わってくるのだなと思いました。
完成させる目安ということを念頭におきながら進めることで次の効果的な解決策を考えることができるので自分でマネジメントするということは業務に置いて大切なことなのだと実感しました。
まとめ
私はCA Tech Jobを通じて、個人開発とチーム開発の違いを実践的に学びました。
- 個人開発で培った基礎スキルは必ずチーム開発でも活かせる
- 個人開発は自分の中で全てが決まるが、チーム開発は意思決定が難しい
- 業務経験は必ず自分の能力を向上させてくれる
私は本インターンシップを経験して、開発技術だけでなく自分の良い成長の方法を模索したり、人とのコミニュケーションを通じて認識を擦り合わせることの大切さなどを学びました。
さいごに、初めての業務インターンと初めて自分のコードを人に読んでもらいましたがサイバーエージェントのエンジニアの方々は一つコードを書く時でもパフォーマンスやコードの読みやすさや例外処理など様々なパターンに対応するコードを一度に考えられていて自分もその世界に早く辿り着きたいです。
以上です。
お読みいただきありがとうございました。