はじめに
初めまして!
2024年8月1日から 2024年10月31日の3ヶ月間、教材基盤開発セクションでインターンシップに参加していた市島功大です。
参加前のスキルレベルは以下のような状態でした。
- JavaScript を使ったバックエンド開発を主に行なっていた
- TypeScript はプリミティブな値・オブジェクトの型等の使いそうな型定義は分かるが、Omit や Partial 等の TypeScript 独自の型定義は分からない状態
- NestJS は学習経験があるが、何かしらアプリを作成する等の開発経験はない状態
参加をおすすめしたい人
- ドワンゴの教育事業に興味のある方
- 書いてきたのは JavaScript・TypeScript だけれどバックエンド開発がしたい方
- ZEN Study の教材入稿のような裏側のシステムに興味のある方
- 業務でのチーム開発がどのようなものか知りたい方
教材基盤開発セクションとは?
教材基盤開発セクションの前に教育事業について説明します。
ドワンゴの教育事業では、未来の「当たり前」の教育を作る というミッションのもと、ZEN Study をはじめとした様々な学習をサポートするサービスを N 高等学校・S 高等学校や近畿大学・茨城県などの教育機関・自治体へ提供しています。
また、月額 1100 円で一般ユーザーの方々にご利用いただけるサービスとしても提供しており、ネットで学ぶ時に「当たり前」とされるようなサービスの創造に取り組んでいます。
さらに、オンライン大学の ZEN 大学(仮称・設置認可申請中)について 2025 年 4 月開校を目指しており、そちらの各種システム開発も教育事業のエンジニアの方々が行なっています。
その中でも、教材基盤開発セクションでは ZEN Import と呼ばれるZEN Study の教材入稿システムの開発と教材・学習進捗を管理する教材基盤システムの開発を行なっており、私はその中でも教材入稿者の方々が利用する ZEN Import の開発に参加しました。
基本的に教育事業ではフロントエンドセクションの方がフロントエンドの実装し、バックエンドセクションの方がバックエンドの実装することで分業しているのですが、教材基盤開発セクションでは、同一セクション内でフロントエンドも実装します。
なぜそうなったのか等の経緯は以下の記事をご参照ください。 blog.nnn.dev
ZEN Import の技術スタック
ZEN Import で使用している技術スタックは以下の通りです。
- フロントエンド
- TypeScript
- React
- MUI
- Zod
- TanStack Router
- react-hook-form
- Vite
- バックエンド
- TypeScript
- NestJS
- TypeORM
- BullMQ
- Redis
- ツール
- Git/GitHub
- GitHub Actions
- Docker
教育事業のアプリケーション開発ではマイクロサービスアーキテクチャを採用しており、機能ごとに分割されたサービスが複数個存在することで、システム全体が成り立っています。
詳しい説明は以下の記事をご参照ください。
インターンシップのスケジュール
参加してから 2 週間程度で環境構築と教材・カリキュラムのインポートフロー・エクスポートフローのキャッチアップを行いました。
残りの 2 ヶ月半は、初めは軽いタスクを担当させていただき、自分が先週マージしたタスクの後続タスクや、少し重いタスク・フロントエンドのロジック部分のタスクなど徐々に難しいタスクを担当させていただく形で進行しました。
1日の流れ
時刻 | 仕事内容 |
---|---|
11:00~11:05 | メンターとの 1on1 の準備 |
11:05~12:00 | メンターとの 1on1 |
12:00~13:00 | 昼休憩 |
13:00~15:00 | コーディング |
15:00~15:30 | デイリーミーティング |
15:30~16:00 | 教材基盤開発セクション定例 (週 1 開催) |
16:00~19:00 | コーディング |
10 月 17 日(執筆当時)の 1 日はこのような流れでした。
この中でもメンターとの 1on1 とデイリーミーティングについて紹介します。
メンターとの 1on1
メンターとの 1on1 では前日の進捗を共有や、疑問点の解消・今日やることの整理などを行います。 Google Docs 上に全てメモしています。
デイリーミーティング
教材基盤開発セクションでは github の issue を使ったチケット管理を行なっており、そのチケットをカンバンボードとして表示したものをスクラムマスターの方が画面共有しながら進捗報告や疑問点を解消します。
業務内容
インターンシップの期間中、いろいろなタスクを担当させていただいたのですが、その中でも学びになったタスクを 1 つ紹介します。
このタスクでは、親子関係のある Entity を組み合わせて別のリソースに変換し、レスポンスとして返す API を実装するのですが、1 つのサービス層の中でそのドメインに属さない Entity の値も一緒に返すように実装したところ、"レスポンスファースト"にしないでほしいという指摘をいただきました。
最終的には、サービス層ではそのドメインに属する Entity を返すようにし、コントローラーでドメインに属さなかった Entity を取得するサービスを呼び出し、それらを組み合わせた別のリソースをレスポンスとして返すように実装しました。
趣味での開発ではサービスの規模が小さかったため、ファイルを分割する必要がなかったこともあり、あまり明確な基準を持ってファイルを分割してこなかったので、このような”設計”の大切さについて知る良い機会となりました。
このタスクの他にも実際の開発に携わり、最終的には34個の PR を出すことが出来ました。
参加して学んだこと
実践的な Git 運用
実務では PR をマージするために必ずレビューを経る必要があることから、PR ブランチからの派生ブランチの作成や、レビュー効率化のためにコミットを squash するなど、より実践的な Git の使い方を習得出来ました。
ソフトウェア設計の考え方
明確な基準に基づいたファイル構成にすることで、各層の役割が明確になり開発者間での認識が統一されるため、可読性が上がりチーム開発の効率が向上することを学びました。
テストの重要性
学生同士の開発では軽視されがちだったテストですが、自分の実装が正しいかを確認出来るだけではなく、バグ修正やリファクタリングを行う時に自分の変更箇所以外に影響を与えていないことが保証出来るとても重要な要素であることを学びました。
苦労したところ
既存のコードを読み解くのに時間がかかるところ
学生同士の開発では開発の初期段階から参加しているため、仕様を自分たちで決めながら開発を進められましたが、インターンシップでは進行中のプロジェクトに途中参加するため、既存コードの理解に苦労しました。
しかし、コードを読み解く過程で仕様や関連知識への理解が深まり、徐々に成長を実感できた点は良い経験となりました。
フルリモートでのコミュニケーション
ドワンゴのエンジニアの方々は基本的にフルリモートで勤務しているため、インターンシップ生として参加する自分もフルリモート勤務でした。
フルリモートでは相手の忙しさを把握して質問するタイミングを決めるのが難しく、私は当初問題が発生した際、どの程度自力で考えてから質問すべきなのかという判断基準が掴めずにいました。
その結果、必要以上に時間をかけて問題解決を試みるものの、結果として解決に至らないケースも多く、貴重な時間を無駄にしてしまったと実感しています。
現在では自身での解決が難しいと判断した時点で、躊躇なく質問するように心がけていますが、この経験から今後インターンシップに参加される方々には、より積極的な質問をお勧めしたいと思いました。
最後に
6 月に発生した大規模サイバー攻撃による影響が甚大な状況下にもかかわらず、教育事業ではインターンシップを実施してくださったことに、深く感謝申し上げます。
インターンシップを通じて、実務におけるバックエンド開発がどのようなものであるかを理解できただけでなく、自身の現在の課題も明確になりました。
さらにインターンシップでの成長を実感するとともに、バックエンドエンジニアとして成長するために在学中に習得すべき知識・技術も明確にすることが出来ました。
また、品質保証セクションの方々との定例や、設計検討の会議、勉強会など実際の開発組織のミーティングに参加させていただけることで、バックエンドエンジニアとして働くことへのイメージが格段に鮮明になりました。
3 ヶ月という短い期間ではありましたが、大幅な成長を感じることが出来ました。
教材基盤開発セクションの皆さんをはじめ、インターンシップでお世話になりました全ての方々に、心より感謝申し上げます。
We are hiring!
株式会社ドワンゴの教育事業では、一緒に未来の当たり前の教育をつくるメンバーを募集しています。 カジュアル面談も行っています。 お気軽にご連絡ください!
開発チームの取り組み、教育事業の今後については、他の記事や採用資料をご覧ください。