🚀

LayerXのサマーインターンに参加しました

2024/09/15に公開

はじめに

こんにちは、masaです。9/2〜9/13の2週間、LayerX初のサマーインターンという記念すべき回に参加してきました!!今回はその振り返りを書いていこうと思います。

LayerXのサマーインターンの概要

最初の3日間は講義があり、それ以降はチーム開発という流れでした。どのパートもLayerXが掲げる爆速開発のエッセンスが詰まっており、とても濃密な時間を過ごすことができました!
LayerXについては以下の記事をご覧いただけるとよいかと思います!
https://tech.layerx.co.jp/entry/2024/05/09/182525

講義パート

講義パートでは主にハンズオン形式でフルスタック開発を行いました。使用技術はNext.jsとGoで、GraphQLでAPIを実装し、通信を行います。

バックエンド

RESTばかり触っていたので、GraphQLについてピンときていませんでしたが、

  • オーバーフェッチ、アンダーフェッチを防げる(必要なもののみリクエストできる)
  • 単一エンドポイントで柔軟なクエリ
  • gqlgenによるスキーマ駆動開発
  • DataLoaderによるN+1の解決

などを学びました。実際に与えられたアプリケーションで機能追加を通して開発を行い、GraphQLのメリットを肌で感じることができました。講義を受け終わる頃には「RESTじゃなくて全部GraphQLでよくね?」と思ってました笑(もちろんRESTにもメリットがあります)
また、与えられたアプリケーションはGraphQL、DDLからのコード自動生成やレイヤーごとの依存関係が整備されて設計されており、コードリーディングだけでもかなり勉強になりました...!

フロントエンド

普段はバックエンドばかり開発してるので、個人的にフロントエンドの講義はかなり勉強になりました。
フロントエンドもGraphQLから自動生成でスキーマ駆動を行います。

  • ディレクトリ構造と設計思想
  • Suspenseと部分ローディング
  • Apollo Clientとキャッシュ管理
  • エラーハンドリング
  • 自動テスト

など、さまざまな内容の講義を受け、フロントエンドへの知見を深めることができました!ありがとうございます!

その他

講義パートでは、フルスタック開発の他にもCTOのymatsuさんやCEOのfukkyyさんの講話を聞く機会があり、エンジニアリングだけでなく、自分のキャリアを考える良い機会となりました!!

チーム開発パート

チーム開発パートでは、4人1チームとなり、法人ビジネスカードを題材とした実装を行いました。余談ですが、チームにサウナ好きが多いという理由で、チーム名は「SaunerX」にしました。サウナ→水風呂→整う、にちなんで熱意→休息→優勝という意味も込められています(?)

基本的には、架空の企業さんからの要望一覧が与えられるので、その中で優先度をつけて実装し、最終日にプレゼンを行うという流れでした。ただ単に機能を実装すれば良いのではなく、定期的に行われるヒアリングを通してユースケースを理解し、UXを意識する開発が求められました。
また、毎日デモ会という、チームメンターに1日で作ったものを実際に動かしてデモをする時間が設けられていました。毎日必ず進捗を生まないといけないという思いから、爆速で開発を進めることができました!

やったこと

チームでは機能ごとにタスクを分担し、それぞれがフルスタックで開発することにしました。これによりバックエンド・フロントエンドの要件の食い違いが起きづらく、効率的に開発を進めることができます。
自分は主にカスタム権限周りの実装を行いました。具体的には、アプリケーションを使う人を管理したいというユースケースに答えるために、ユーザーにロールを与え、1つのロールに具体的な操作権限を与えることができるようにしました。アイデア自体はAWSのIAMのロール・ポリシーを参考にしました!

バックエンド

データベースにrolesとpoliciesテーブルを追加し、中間テーブルを持たせることで多対多でデータを持たせました。

ユーザーに紐づくポリシーはDataloaderを活用することでN+1問題を解消して効率的なデータフェッチを実現しています。
フロントエンド側からのリクエスト内容から、必要なポリシーが含まれているかを判別することで権限制御を行います。

フロントエンド

今回のアプリケーションではログイン処理までは実装しなかったので、session情報から権限を取得するなどはできなかったのですが、モックでログインユーザーを選択し、バックエンドからそのユーザーのロール・ポリシー情報を取得する様にしました。
このポリシー情報をもとに、カード発行権限がないユーザーはカード発行ボタンが表示されないようにしたり、閲覧権限がないユーザーはurlを指定してもNot Foundを返す様にフロント側でも制御しました。

実際の画面

実際の画面がこちらになります!(ポリシーという名前はわかりづらいという意見があったのでアクションとして表示してます笑)

アクションはこの画面外にもたくさんあり、ロールに紐づくアクションをカスタマイズすることで、さまざまな企業のニーズに合った設定を行うことができます。
フロントエンド初心者ながらUIもそこそこ良い出来だと思ってます...!!

最終プレゼンテーション

最終プレゼンテーションで実際にデモをしながら発表しました。チームとして最優秀賞を取ることはできず悔しい結果になってしまったものの、毎日議論を重ね、お互いに助け合って走り切った結果、自分たちのチームが作ったプロダクトにメンバー全員が自信を持って発表を迎えることができたと思います!!
メンターからのフィードバックでもチームワークではNo.1と評価していただきとても嬉しかったです!

おわりに

総じてとても濃密で楽しい2週間でした!
素敵なノベルティや、パートの各所に散りばめられたLayerXの開発エッセンスを肌で感じることができました。
来年以降も本当にお勧めできるインターンなので、参加を検討してみてください!
https://x.com/ms_eng__/status/1834243693479674254
https://x.com/ms_eng__/status/1834590019912425715

Discussion