インターンで大事にしたこと - CA Tech Dojo - 1week Android向け育成型インターンシップ 参加レポート

# 初めに
この記事は、株式会社サイバーエージェントの育成型インターンシップ、「CA Tech Dojo - 1week Android向け育成型インターンシップ」への参加レポートになります。
今後CA Tech Dojoを初めとする、インターンへの挑戦をされる方にとって、役に立つものとなれば幸いです。

:::note warn
参加レポートは取り扱った技術の話をするのが一般的な気がしますが、技術面では初めての物が多く、学びが多すぎたので、この記事ではインターンに対する取り組み方についての学びを中心に共有します。
技術面に関しては更に学習を重ねて、また記事にできたらと思います。
:::

## CA Tech Dojo って何？
「CA Tech Dojo」は育成型インターンシップで、今回の「CA Tech Dojo -Android 編-」では、プログラミング経験のある学生を対象に、約1週間でAndroidアプリの開発の基礎スキルを身につけるインターンシップでした。このインターンシップの全体を通してのゴールは「1人でアプリを開発しリリースできるようになる」という物でした。

https://www.cyberagent.co.jp/careers/students/event/detail/id=30934

# このインターンでの自身の目標
このインターンは全体の目標とは別に、個人の目標も設定します。
私はこのインターンでの目標として、「実際の開発現場でのベストプラクティスや、Android開発業務における基礎を固めること」を設定しました。

## 参加前の現状
このインターンに参加する前の開発経験は、個人開発のものが多く、作りたいものに合わせて知識を集めて開発をするという物がほとんどでした。
ただ、この開発経験は、幅広い開発経験を得ることができるものの、専門的な知識を身につけるという意味ではあまり良いものではなく、更には実際の開発現場で行われているベストプラクティスなどは知ることができない状態でした。
また、様々なフレームワークやプラットフォームに頼ってしまっていることにより、基礎が疎かになってしまっている点も懸念点でした。

そこでこのインターンを通して、Androidアプリ開発の基礎や、エンジニアの方に質問をすることで、開発現場のベストプラクティス等を学んでいこうと考えました。

# 開発したアプリ
GoogleのAIであるGeminiを使用した、AIチャットアプリの開発を行いました。
実装した機能はこんな感じです。
- Geminiとメッセージのやり取りを行う
- Geminiに画像を送信する機能
- GeminiのAPIキーの設定・保存機能
- チャット履歴の保存
- 日本語/英語対応

開発の進め方としては、最初の2日間で、重要な機能の開発を行い、
そこから開発した機能の改善や、より良いプログラムを目指したリファクタリングを行い、
終盤は残り時間で取り組めそうな、小さな機能追加や問題解決等を行うようにしていました。


# このインターンで大切にしたこと
このインターンで大切にしたことはたくさんありましたが、重要なのはこの2つだと思います。

- 目標と振り返り
- 言語化

細かくしていくと長くなりますが、セクションごとに分けて共有します。
## 目標と振り返り
### 常に目標を意識する
このインターンでは、対面での開発期間の前に、オンラインでメンターの方と目標設定を行いました。
そこで、メンターの方が仰っていたのは、「開始地点とゴール地点を意識すること」そして、「どんな所が成長したのかを意識すること」でした。
このインターンでは毎日、日報という形で振り返りを行いましたが、その時、大事にしていたのが、目標を軸に考えることでした。
私の場合は、実際の開発現場と開発業務の基礎を固めることだったので、その話を軸に、取り組めた・取り組めなかったことを明確にすることを意識しました。

※目標以外の点からも振り返りをするのも大切です。(進捗を出せたとか、新しい知識をたくさん身につけたとか)

### 進捗を出すこと(要件を達成すること)だけが成果ではない
このインターンでは、個人開発がベースとなっていたので、1人で黙々と作業をしがちでした。
ただ、1人で黙々と作業をして、ひたすら進捗を出し続けることが正解とは限りません。
他の参加者やメンターの方と積極的にコミュニケーションを取ることも大切です。
他の参加者がどんな工夫をしているのか、実際の開発現場だと、どのようなことに注意しているのかなど、インターンでしか得られないことがたくさんあると思います。
実際に私も、他の参加者が工夫している点を見たり、開発現場の話を伺ったりして、とても良い刺激を受けることができたと感じています。

また、目標を意識して、要件を達成していくだけではなく、目標を達成するための取り組みに挑戦することも大事です。私はこのインターンの最初の方に、ひたすら要件を達成することに集中していました。
もちろん、要件を達成できることは、良いことではあるのですが、それに対して、夢中になりすぎるのもよくありません。
私はある程度折り返しに差し掛かった時点で、自身の目標の振り返りを行い、自分の今の立ち位置から目標を達成するためには何をするのが効果的かを考え、要件を達成する方針から、ここまでに作ったプログラムをメンターの方からアドバイスを頂きながら、より良いアーキテクチャに改良していくことに決めました。
当然、改良作業中は要件達成がなかったですが、自分の目標へと向かうことは、自分にとって重要な進捗だったと思います。

## 言語化
### 振り返りで、小さなことでも言語化する
前のセクションでもありましたが、このインターンでは毎日、日報という形で振り返りを行いました。
そこで大事にしていたことが、小さなことでも言語化することでした。
言語化するようなことはこんなことでも良いと思います。

- 1日集中して取り組むことができた
- 他のメンバーとコミュニケーションを取ることができた
- メンターの方にたくさん質問をすることができた
- 〇〇の要件を達成することができた
- プロジェクトの準備ができた
- 〇〇の学びがあった
- (カフェの美味しい飲み物を開拓した)

今挙げたのはポジティブな話ですが、ネガティブな話だとこんな感じだと思います。

- 〇〇の要件に挑戦したが、できなかった
- プログラムへコメントをつけることができていなかった
- メンバーとのコミュニケーションをあまりすることができなかった
- 質問をあまりすることができなかった
- 集中が切れてしまうことが多かった

本当に一例ですが、こんな感じです。小さなことでも言語化して、考えを整理することは非常に大事だと思います。
言語化をする際に、真面目に考え続けると大変なので、時には気分転換の項目を入れたのも、個人的には良かったと思っています。(開発とはあまり関係がないけど、インターンの中で知ったこととか)

### 言語化する際に過程も大事にする
言語化をする際、よく結果だけを挙げてしまいがちですが、このような育成型インターンの場合は家庭も大事だと思います。前の「小さなことでも言語化」するでは、結果だけを挙げていました。今度はこれに過程を加えてみます。

- 適度に休憩や気分転換を挟むことで、1日集中して取り組むことができた
- 開発の合間に意識的に、他のメンバーとコミュニケーションを取ることができた
- 〇〇の要件を、知っていた知識の組み合わせで実装することができた
- 〇〇の要件をChatGPTに質問しながら、知らなかった知識を補いつつ、実装することができた

すぐに加えられそうなのはこんな感じです。ネガティブな方でも、「できなかった」で終わらせるのではなく、どのように取り組んだ結果、なぜできなかったのかを言語化することが大事だと思います。また、次はできるようにどのようにするかも書くと完璧だと思います。

- 〇〇の要件に△△の手法を用いて、実装することに挑戦したが、使い方が複雑だったため、できなかった
    - 次はメンターや他の参加者の方に質問をしたり、別の手法についても調査をして実装したい
- プログラムへコメントをつけることができていなかったので、次は意識的にコメントを付けるようにしていきたい

### 質問の質を高める
もう1つこのインターンで意識したことは、質問の質を高めることです。
質問の質を高めるために意識したことは次の2点です。
- 前提と現状を言語化する
- 回答を得たときも言語化する

#### 前提と現状を言語化する
質問をする際に、メンターの方に状況を正しく理解していただくことが重要だと考えました。
そこで、次のような内容を説明するようにしていました。
- どんな物を作っていた？
- どのように作ろうとした？
- どんなデータのやり取りをしている？
- 扱っているデータの型はどんなもの？
- 自分で作ったもの/外部のライブラリのものは何？
- 何をしようとしたときに問題が起きた？
- どんな問題だった？
- 原因の予想は？

このような内容を説明することで、メンターの方にも質問したいことが理解しやすくなっていたと思います。

#### 回答を得たときも言語化する
もう1つ意識していたこととして、回答をしていただいた時にも言語化をすることでした。
質問の回答をただ聞くだけでなく、教えていただいたことを自分なりの言葉に直す言語化をすることで、
メンターの方に自分がどこまで理解をすることができているのかを伝えることができますし、
もし理解に誤りがあれば、そこで修正を入れていただくことができます。

# 参加して得たもの
## Android + Kotlin + Jetpack Compose でのアプリ開発経験
このインターンではKotlinとJetpack Composeを使って、Androidアプリの開発をしました。
メンターの方から教えていただいたチュートリアルを事前に取り組んだり、
今まで学んでいた技術知識の組み合わせで、理解を進めることができました。
FlowやRoomなどの知識を初めとして、新しく触れるものが多く、とても学びが多かったです。
この辺もいつか体系的にまとめて記事にしたいとは思っています。

## 実務の開発を意識した開発経験
私のこのインターンの目標であったところです。アプリのアーキテクチャを意識したり、
GitHubのIssueやPull Requestを積極的に活用しながら開発を進めたり、
メンターの方に積極的に質問をして、様々なアドバイスをいただくことで、
実務の開発を意識した開発経験を得ることができました。

## 他のインターン生とのコミュニケーション
他のインターン生が開発しているコードも見て、良いアーキテクチャについての議論を行ったり、
それぞれで工夫して開発している点を共有できたのは、とても良い刺激になりました。

## 言語化をする経験
日々の振り返りやメンターの方への質問、他のインターン生とのコミュニケーションを通して、
たくさん言語化をする経験をすることができました。
言語化をしていく中で、意識すると良いことなどにも気づくことができ、それ自体も良い学びでした。

# 感想
アプリを開発することだけでなく、他のインターン生と交流したり、メンターの方から様々なお話を伺ったり、ランチでもエンジニアの方から様々なお話を伺うことができたので、とても充実した学びのあるインターンでした。
自分で決めた目標に向けて、一歩踏み出すことができる良いインターンにできると思います！
初めてインターンに挑戦してみたいと思っている方には、おすすめなインターンでした！