😀

次世代トップエンジニア創出インターンシップ ACEに参加しました

2023/09/23に公開

はじめに

次世代トップエンジニア創出インターンシップ ACEに参加してきました!!
参加した感想を延べていきたいと思います。

概要

次世代トップエンジニア創出インターンシップ ACEは株式会社CyberAgentが主催するハッカソン型のインターンシップで、事前に与えられている開発テーマに基づいてサーバーサイドとクライアントサイドでチームを組み開発を行います。また、参加者1人に対してメンターが1人ついてくれます。現場で活躍するサイバーエージェントのエンジニアから、コードレビューや実践的なアドバイスを受けることができるのでレベルの高い開発に挑戦できます!

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

日程

9月6日(水)~9月16(土):オンライン
9月17日(日)~9月19日(火):【東京】サイバーエージェント東京オフィス Abema Towers

チーム

チームはA~Cの3チームありました。私はAチームのサーバーサイドとして参加しました。
Aチームのチーム構成は以下のようになります。

人数
サーバー (Go) 2人
クライアント (kotlin) 2人
クライアント (swift) 2人

私たちのチームはクライアントがAndroidとiosとなっており、その他のB,CチームのクライアントがWebになっていました。

事前目標

aceでは、開発が始まる前に、このインターンを通して達成したい目標と現状をまとめ、メンターの方と1on1で目標をブラッシュアップするという時間が設けられていました。私は以下のような目標を掲げました。いくつかあげます。

  • 運用を見据えた技術選定を行える
  • 適切なDB設計
  • カバレッジの高いテストを書く

などなど

9月6日(水)~9月16(土):オンライン

この日程では開発はオンラインです。
Zoomを使用してチームで分かれて開発を行います。

事前に与えられた開発テーマと仕様に基づいて、技術選定&設計を行っていきます。

サーバーサイドでは開発言語としてGoを採用しました。
サーバーサイドのチームメイトの人がGoを書いたことがなかったため、最初は一緒にペアプロ形式で開発を進めていきました。気になった部分や気がかりな点をすぐ質問してくれてとてもやりやすかったです。インターンを進めていく中でGoが好きになったと言ってくれてとてもうれしかったです。

また1人、世界にGopherが増えました

夕方に毎日質問タイムが設けられており、開発で悩んでいる部分や懸念している部分をメンターの方に質問することができます。

9月17日(日)~9月19日(火):オフライン

この日程では東京の本社にてオフラインで開発を行います。

オンラインで作ってきたプロダクトにより磨きをかけていきます。

チームメンバーやメンターの方が近くにいるので、コミュニケーションがとりやすく開発がものすごいスピードで進みます。

やっぱり、ハッカソンはオフラインに限りますね!

9月19(火)の15時にコードフリーズで、そこから資料作成->発表といった流れでインターン終了です。

技術的な話

ここからは、技術的な話をします。

今回、私たちのチームは、クライアントが4人でandroidとiosという構成になっていたので、クライアントとサーバー間で円滑に開発を進めるために、スキーマ駆動開発を取り入れました。そこで採用したのがGraphQLです。GraphQLでスキーマを定義してコード生成を行うことでスムーズに開発を進めることができます。

使用技術

  • gqlgen (graphqlサーバー)
  • ent (orm)
  • golangci-lint(linter)
  • フォーマッタやテストツールはGo標準のものを使用しています
  • aurora (mysql)
  • k6 (負荷試験)

https://gqlgen.com/

https://entgo.io/

https://golangci-lint.run/

https://k6.io/

アーキテクチャ

アーキテクチャとしてクリーンアーキテクチャを導入しました。
クリーンアーキテクチャのメリット・デメリットは以下のようなものが考えられます。

メリット

  • テストが書きやすい
  • 変更可用性

デメリット

  • コードが冗長
  • 開発に時間がかかる

目標でも挙げたように、今回はカバレッジの高いテストを実現したかったので、責務を分離して依存関係を持たせるクリーンアーキテクチャを導入し、テストの書きやすいコードを実現しました。

負荷試験

k6というツールを使用して負荷試験を行いました。
k6の選定理由として以下のようなものがあります。

  • ossである
  • ドキュメントが充実している
  • graphqlやgrpc等のプロトコルにも対応
  • jsで簡単にシナリオが書ける

いくつかのシナリオをかいて、テストしてみると、、、

遅いw
平均レイテンシが440msくらいになってますし、P(95)も610msほどかかってしまっています。
ボトルネック探しの始まり始まり

ボトルネック

結局、ormのentがボトルネックとなっていました。
というのも、entは各テーブル間のリレーションをEdgesというグラフ構造で解決します。その解決には自動生成されるWithXXXメソッドを使用するのですが、このWithXXXメソッドは後ろで多くのクエリが発行されており、レスポンスが遅い原因となっていました。

ボトルネックは分かったものの、entで複雑なクエリを実行するにはカスタム述語というものを定義する必要がありました。entの理解が乏しく時間内にボトルネックを解消することができませんでした。
懺悔です懺悔

反省点

インターンを通して、多くの反省点や課題点が得られたのでまとめます。

  • graphqlの理解が甘かった
    • dataloaderを使用した(N+1問題の解消)
    • キャッシュ戦略(APQ, CDNなど)
    • セキュリティ(ネスト制限)
  • 技術選定の際にその技術のメリデメを考えて選定することができたが、他の技術との比較検討ができていなかった
    • ADR(Architecture Decision Records)をまとめているチームがあった
  • DDDの理解が足りなかった
  • ドキュメントのまとめ方
    • 他のチームのドキュメント管理が素晴らしかったので参考にさせてもらいます
  • 質問の仕方
    • 質問の粒度が大きすぎて、たびたびメンターの方に質問の意図が伝わっていないことがあった。
    • 質問を細分化して伝える力を身に着けていきたい
  • チーム間でのコミュニケーション
    • iosの人とだけandroidの人とだけでスキーマを決定してしまう場面があった
    • 両OSの人と一緒に話を進めるべきだった

多くの課題が見つかり、自分が次にとるべきネクストアクションがはっきりしました!
技術的な部分もですが、コミュニケーションやドキュメント等は普段からより一層、意識していないと力がつかないと思います。ハッカソンなどの小規模のチーム開発であってもコミュニケーションやドキュメントを意識した開発を行っていきたいです。

感想

会社の印象として若い人が多く、みんな技術が大好きであるという印象でした。
技術の話になると皆楽しそうに話しているのがとても印象に残っています。
技術的な収穫だけでなく、こういった会社の雰囲気を感じられるのはインターンの良いところだと思います。
メンターの方も自分の些細な質問に対して真剣に答えてくれました。本当に感謝しかありません。
また、参加者学生のレベルが高く、刺激を受けることができますし、自分の知らない知識や技術を学び、切磋琢磨できる最高の環境です。

飯がうめぇです。インターン中に何度かご飯に連れて行ってもらいましたが、どこの店も美味しかったです。特にkintanというサイバーのエンジニア御用達の焼肉のお店が美味しかったです。

来年参加しようと思っている人、このインターンを知らなかった人、絶対参加しましょう!
圧倒的な成長が待っています。これは技術的な面ももちろんですし、チームビルディングなどエンジニアとして働いていくうえで必要な力を磨くことができると思っています。

最後に

ここまで、読んでいただきありがとうございます。
ここに書いたことはほんの一部で実際にはもっと楽しいと思うので、是非来年参加してみてください!!

Discussion