【RECRUIT Job for Student 2021 Summer】スタディサプリ ENGLISH を開発した話

自己紹介

こんにちは。京都大学大学院情報学研究科 修士 1 年生の有泉洵平です。

RECRUIT Job for Student 2021 Summer のエンジニアコースに 10/4 から 11/5 までの期間で参加し、English プロダクト開発部の English バックエンド開発 1 グループで開発を行なっていました。

English プロダクト開発部とは

English プロダクト開発部とは、英語のオンライン学習サービスである「スタディサプリ ENGLISH」を開発しているチームのことです。

スタディサプリENGLISHロゴ

その中の English バックエンド開発グループでは、スタディサプリ ENGLISH のバックエンドを開発しています。
主要言語としては Scala を採用していて、Extensible Effects という攻めた概念も導入しています。

また、English プロダクト開発部では、Android, iOS, Web, server, PM を 1~2 人ずつ集めたチームを作り、案件開発を行なっているため、各エンジニアはサーバサイドチームと〇〇チームというように 2 つのチームに所属することになります。基本的には案件ごとのチームで開発を進めていくため、機動性が高く、効率よく開発を進めることができています。

案件ごとのチームで毎日夕方に 10-15 分程度の時間をとり、進捗の共有や案件に関する相談などを行う Daily Scrum があったり、隔週で案件のインプットや KPT を行う定例があったりしました。

担当案件

背景

より良いアプリづくりのために、スコアに関するデータを取得することが求められていました。

また、より継続的にアプリを利用してもらうために、

  1. 目標を立てる(目標入力)
  2. 達成する(実績スコア入力)
  3. モチベーションアップ
  4. 1 へ戻る

というサイクルがプロダクト内で回るようにしたいと考えられていました。

実績スコアに関する部分の実装はすでに存在するため、目標に関する部分の実装をすることになりました。

開発内容

私は、以下の 4 つの API を作成しました。

  • TOEIC 目標スコア取得 API
  • TOEIC 目標スコア作成 API
  • TOEIC 目標スコア削除 API
  • TOEIC 目標アドバイス取得 API

各 API は以下のような流れで開発を進めました。

  1. Domain Model 設計
  2. Repository Interface 定義
  3. Database Schema 設計
  4. DAO 実装
  5. Usecase 実装
  6. API Interface 定義
  7. Repository 実装
  8. Controller 実装

また、今回は主に TOEIC 向けの機能開発でしたが、TOEIC 以外の試験に向けての開発も予想されるため、"外部試験"と抽象化して、後々使い回しがしやすいように実装しました。

技術的なこと

スタディサプリ ENGLISH のサーバサイドのレポジトリでは、Clean Architecture + Extensible Effects という構成になっています。

Clean Architecture

スタディサプリ ENGLISH におけるサーバサイドの package 構成を簡略化したものが以下の図になります。

Interface や Converter を用いることで、業務ロジックと技術的関心事をうまく分離しています。
例えば、Usecase は Repository Interface に依存していて、技術的なソースコードには依存しないようになっています。技術的な実装である RepositoryImpl は DI されます。
また、Usecase 内で Data Model を扱わないように、Data Model と Domain Model の Converter も用意されています。

Extensible Effects

Extensible Effects とは、Monad Transformer の上位互換にあたる概念で、簡単に説明すると、Monad Transformer の欠点である「Monad の合成が大変になる」という部分を改善したものになっています。

私は、関数型言語をこのアルバイトで初めて触ったため、そもそも Monad という概念自体を知らず、メンターの方々の助けを借りて一から勉強しました。
Monad, Monad Transformer, Extensible Effects について学んだことをまとめて別の記事として投稿したので、もし興味あれば読んでみてください。

はじめての Monad, Monad Transformer, Extensible Effects

開発以外のこと

よもやま

各週に 2 回程度、よもやまを行いました。よもやまとは、配属先以外の社員の方々と、就活に関する話題から技術的な話題、趣味の話題などをざっくばらんにお話できる場のことです。
RECRUIT が大規模な会社であるため、様々な考えを持った人がいて、良い刺激を受けました。

出社

十分に感染対策を行なった上で、数日間 oak meguro に出社しました。
オフィスには、パソコンやディスプレイなどがあるだけではなく、休憩スペースや卓球台、ビリヤード台、ボードゲームなどがあり、働きやすかったです。

また、今回のターム(10月後半~11月)のアルバイトルールに乗っ取り、十分に感染対策を行った上でメンターの方々とランチをしました。
個室で懐石料理をいただいたり、シュラスコの食べ放題を堪能したりと大満足でした。

まとめ

多くのことを学んだ 5 週間でした。
エンジニアとしての能力が高い人ばかりという環境に加えて、今までに経験したことがない関数型言語を使うということでやり切れるか心配でしたが、メンターの方々の助けがあってなんとかやり切ることができました。
人事の方々やメンターの方々など、本当にありがとうございました!
RECRUIT Job for Student に興味がある方は是非応募してみてください!

https://engineers.recruit-jinji.jp/event/