# プロジェクトの背景や目的
学習塾のクライアントはサービスができる前は、生徒35,000名の進路指導の情報をエクセルで管理し、生徒が実際に進んだ進路は電話を用いて情報を集めていた。進路の情報の管理自体が大変であることと、生徒がどこに進学したのかのデータが正しいデータではないことが課題にあった。そこで塾の講師がこのサービスを用い生徒とともに志望校を管理し、35,000名の合格実績を確実なデータにすることを目的にこのサービスは作られた。
# プロダクト機能概要
- 認証/認可機能
- 大学検索機能
- 大学情報詳細表示機能
- マイリスト機能
- 志望校の大学登録/編集/削除機能
- 志望校の入試日程のカレンダー表示機能
# 使用技術
| 項目 | 技術|
| -----| -----|
| フロントエンド | TypeScript,React,Jest |
| バックエンド | Kotlin, SpringBoot, Kotest |
| DB | MySQL|
| インフラストラクチャ| Docker, AWS(RDS, S3, Lamda, DynamoDB, EC2, ECR, Cloud Watch)
# チーム規模
10名(フロントエンド: 4名、バックエンド: 3名、インフラ: 2名、PM: 1名)
役割: 開発メンバー
# 担当領域
- 1年目: フロントエンド担当
- コンポーネントの作成
- マイリストの登録機能の作成
- 詳細画面の絞り込み機能の作成
- カレンダーのライブラリの選定
- Jestでの単体,結合テストの作成
- テストの速度改善
- 2年目: フロントエンド/バックエンド担当
- 既存の機能の不具合修正
- 詳細検索機能の検索条件の追加
- 詳細画面の情報追加(2ヵ年表示など)
- Kotestでの単体,結合テストの作成
- Jestでの単体,結合テストの作成
# プロジェクト課題
クライアントがサービスを作成したことがない方々のため、要求されている事項が詳細まで決められていない中で大きな課題が2つ存在しました。
1. **詳細が詰められていない中での開発**
- サービスで用いるデータ自体は別クライアントが蓄積しているデータであったため、弊社のエンジニアが実データとクライアントの要求を照らし合わせて、実現可能性や仕様に抜け漏れがないかを考えながら開発を行う必要があった
- UI/UXを考えながら開発を行い、ユーザー(生徒)にとって使いやすいものになるように提案を行いながら開発をする必要があった
2. **提供データの複雑性**
- データの中には、提供先が提示しているデータの説明と違うものが存在したり、イレギュラーなデータが存在したため、データに合わせた対応が必要であった
- 提供されているデータは常に最新データのみで、クライアントは過去の入試結果を蓄積して出したいという要望があったため、本サービスでデータを蓄積するようにする必要があった。
- データの更新時期なども項目によって時期が違うため、更新時期に対応してデータの取得方法を工夫する必要があった
# 担当内容
## マイリストの登録機能の実装
### 課題
1. **大学に対して学部~コースまでが膨大なツリー構造になっている**
- 1つの大学に対して、複数の学部、学科、専攻、コースがあり、さらに同じコースでも複数の試験があるため、編集時のマイリストの取得を実現するには工夫する必要がある
2. **生徒が進学した後はマイリストを修正しない要望**
- マイリストの生徒の進学した先を後から修正できないようにしなくてはいけない
3. **クライアント側の詳細な要望がない**
- マイリストの編集時の制御についての要望がないが、ユーザー(生徒)の使いやすさを考えて工夫する必要がある
## 解決策・工夫点
1. **APIの設計**
- 編集時に選択項目のプルダウンを選択する度に、APIを叩くことにした
- マイリストの編集APIで各項目の返却値が以下のようにした
- 配列の中身が複数の場合は選択できる項目としてプルダウンで表示
- 配列の中身が単数の場合は、すでに保存されている項目のため、そのまま取得した値をテキストとして表示
- 配列の中身がない場合は非活性の未選択のプルダウンを表示
- **工夫点**
- 膨大なツリー構造になっているため、選択肢を選択するたびにAPIを呼ぶようにした。
- 一度保存した内容は再度編集できないようにしたいという要望があったため、編集時に保存されている内容かどうかを判断できる設計にした。
2. **編集時の制御の提案**
- マイリストの出願ステータスをユーザー(生徒)が選択し、保存した場合は、そのデータだけ削除できないように制御した
- 編集中に試験名を選んだ際に保存されているマイリストの重複制御,編集中のデータ内での重複制御を行う
- 編集時に親の要素を変更した場合は、選んでいた全ての子の要素は「未選択」にする
- 編集した要素があるのに、他のページやブラウザを閉じようとした際にアラートを出す
- **工夫点**
- 編集時の制御についてクライアントからの要望が無かったが、ユーザー(生徒)が使いやすいマイリストにするために上記の重複・削除制御や挙動を行うように提案した
- 提案内容を受け、必要であることを理解していただき、実装を行った
# 成果
本サービスの開発を通して、以下の4つの成果を得た。
1.**正確な進路のデータの蓄積**
- 生徒**35,000名**の進路を正確なデータとして蓄積。
2. **安定したリリース**
- ユーザー(生徒)が使いやすいものを追求して開発をしていたため、2年間でユーザー(生徒)からの問い合わせが1~2件しかない。
3. **売上1億円達成**
- 2年間で大きなリリースは3回終わり、**9,000万の売上**を出すことができた。クライアント満足度が高いことによって、**現在も約1,000万の追加発注**を受けている。
4. **開発だけでなく要件定義から関われるようなメンバーになる**
- 本サービスに0→1の段階から現在までと長く関わることで、立場が少しずつ変わっていくことができた。当初は1メンバーとして関わっていたが、要件定義や詳細設計に携わっていくことができるようになった。