# チーム構成・規模
プロダクトマネージャー: 1名
フロントエンド: 3名
バックエンド: 2名
ProbWorksは転職と副業の二つの求人を掲載しているWebアプリです。
自分が所属している会社はスタートアップで人が全然いないので、仕様の確認や、デザイン、チームのタスク管理やコードレビューなどフロントに関わることは自分も関わっていました。
ProbWorksの開発で自分がこなした仕事の中で特に効果があったと考える仕事は以下の2つです。
- リポジトリの統合
- OpenAPIからの型の自動生成
# リポジトリの統合
## 課題点
自分がこのプロジェクトに参加した当時はフロントのコードがユーザーページと管理者ページでリポジトリが分かれており、ただ、コンポーネントは2つのリポジトリで同じコンポーネントを使用していました。
コンポーネント単位での変更があるたびに
1. コンポーネントの実装
2. もう一つのリポジトリでも同じ実装
という手順で開発をしており、2の作業がほぼコピペということもあり手間がかかる上に、2を忘れていてリポジトリによってコンポーネントに違いがでているという状況が頻発していました。
この状態を解決するために2つに別れていたリポジトリを統合しました。
## 課題解決の過程
具体的にはnpm workspaceを使用してadmin(管理者ページ), app(ユーザーページ), commonsという3つのプロジェクトを作成し、commonsの中にcomponentsを作ることで管理者ページでも、ユーザーページでも同じコンポーネントを使えるようにしました。
create-react-appで作られたプロジェクトだったので、webpackを結構いじる必要があり別プロジェクトのコンポーネントをimportして使えるようにしたり、管理者ページを開発している場合でもcommonsのコードが変わったらホットリオードをするようにする設定したりするなどをしました。
## 成果
リポジトリを統合した結果、コンポーネントの変更があった場合でもそのコンポーネントを実装すれば管理者ページでもユーザーページでもコンポーネントが変更され、上記であげた「2. もう一つのリポジトリでも同じ実装」の作業を完全になくすことができました。
「2. もう一つのリポジトリでも同じ実装」の作業がなくなったことで、プロジェクトによってコンポーネントに違いがでるという問題も解決することができました。
# OpenAPIからモデルの型・通信をする関数の自動生成
## 課題点
このプロジェクトでは先方から仕様の修正が入ることが多く、仕様書の変更が日常茶飯事でした。
*仕様書は[stoplight studio](https://stoplight.io/studio)を使用して管理していました。
フロントエンドは変更のたびに自分たちで確認し、Typescriptの型や、通信部分のコードを修正していました。
手動で修正をしていたためTypescriptの型が仕様書と違っていたり、通信のエンドポイントが仕様書の変更が反映されていないという確認の漏れが多く、その漏れにもなかなか気づきにくいという問題を抱えていました。
## 課題解決の過程
そこで、仕様書からTypescriptの型や、通信のエンドポイントを自動で生成するためのパッケージを作成することにしました。
はじめは[openapi2aspida](https://github.com/aspida/openapi2aspida)を使おうとしてみたのですが、自動生成されたコードと、既に開発しているコードとの差分がかなり大きく、今から導入するのは無理だと判断しました。
そこで、プロジェクト用に独自のカスタマイズをしたパッケージを作ることにしました。
cliに関してはopenapi2aspidaのコードを参考になるべく既存のファイル、コードに近いものを自動で生成するようにしました。
パッケージは[semantic-release](https://zenn.dev/articles/setup-semantic-release/edit)を使うことで自動化しました。
## 成果
仕様書からコードを自動生成できるようになったことで、かなり多くの利点がありました。
1. モデル毎に型を手動でつくる必要がなくなった
今までは新しいモデルが増えるたびに型を手動で作る必要があったのですが、自動化することでその作業が完全になくなりました。
2. 新しいエンドポイントができた場合も手動で作る必要がなくなった
モデルと同様に新しいエンドポイントが出来るたびに手動で通信部分を実装していたのですが、その実装も自動化することができました。
3. 仕様の変更によるビューの修正がかなりしやすくなった
今までは仕様が変わるたびに型を手動でやっていたため、手動で変更した箇所に関しては型エラーが出て、その型エラーを修正していたので仕様の変更と、実際のコードの変更にラグが発生していました。
しかし、自動生成にかえたことで、仕様が変更されてたらすぐに型エラーがでるようになったので、仕様とフロントエンドとのラグがなくなり、常に最新の状態であり続けることができるようになりました。