# プロジェクトの概要
WEB上で完結できる引越し見積もりサービスを目標に立ち上げられたプロジェクト。
## 抱えていた課題
半年以内にリリースするという期限がありました。
## 課題に対するアプローチ
- 締め切りが近くかなりハイスピードな開発が必要であったため、要件を達成するために、フレームワークやツールの技術選定を慎重に行なった。
- 慣れていない技術に対して、チーム全体で成長するために勉強会を定期的に実施/参加しました
- Frontend Talks(フロントエンドに関して、発表/議論する会)
- コンポーネント設計について
- storybookの活用法について、など
- Backend Talks(バックエンドに関して、発表/議論する会)
- Golangでのテストの並列化について
## 使用技術について
### バックエンドの使用技術について
- Golang
- gin
- PostgreSQL
- GraphQL, Hasura
- Firebase
#### GraphQL、Hasuraの採用
バックエンドAPIの開発工数の削減のためにGraphQL、Hasuraを採用しました。
GraphQL、Hasuraを活用することで、基本的なCRUD処理に関しての開発をスキップできたことは、かなりメリットに感じました。
**GraphQLのよかったこと**
1つのリクエストで複数のリソースを取得できるため、通信回数を抑えることができた。
クエリで必要なデータだけを取得できる
データの型をschemaで定義しているため、クライアントとサーバーで型のズレが発生しにくい
**Hasuraのよかったこと**
- 低コストでGraphQLサーバを構築できる
- PostgreSQLサーバーさえあればすぐに使える
- GraphQLのN+1問題に標準で対応済み
- テーブルを作成すれば、SELECT, INSERT, UPDATE, DELETEなど基本的なAPIが自動生成される
- ページングや集計も行える
- フロントエンドの開発を始めることができる
- 認証・認可処理の実装の手間を省ける
- REST API も作成できる
- GraphQLのschemaをエクスポートできる
- フロントとのschemaの連携がしやすい
**失敗したこと、苦労したこと、挫折したこと**
ビジネスロジックが複雑な場合、Hasuraが自動生成したAPIが利用できないことが多い。
結局mutationを自作することになり、Hasuraによる工数削減のメリットを享受できない。
HasuraにはQuery Cachingをサポートしていたが、セッション変数を用いてクエリやユーザーの権限周りに処理を行っていたので、利用できなくなってしまった。
### 設計について
過去のリプレイスの時に採用していた、クリーンアーキテクチャをここでも採用しました。
### 開発体験の向上について
リプレイス時の反省を活かし、テストコードを書く文化を根付かせようとする動きを積極的に行ないました。
- テストコードのないコードをレビューで弾くことを徹底
- テストの書き方について勉強会を行った
- linterの導入(並列化されていないテストを弾く)
## フロントエンドについて
### フロントエンドの使用技術について
- Type Script, React, Next js
- Relay, GraphQL
#### React.js, Nextjsを採用
このプロジェクトより前のプロジェクトでも用いておりノウハウをそのまま活用できると判断し、React.js, Nextjsを採用しました
### 課題
当時、フロントエンドをメインで担当しているエンジニアの人数が少なかったことが課題でした
### 解決策
フロントエンド側の開発に自分も参加できないか提案したことをきっかけに少しずつフロントエンド側の開発にも携わるようになりました。また、React.jsに触れたことのないエンジニアもいたので、定期的な勉強会を実施していました。
積極的に手を上げ機会を掴んだ結果、TypeScriptやReact.jsなど現在では基本的なことは一通り理解できるようになりました。
加えて、バックエンドをやってきた知識を生かして、Hasuraからデータを取得、対象のコンポーネントまでにデータを渡したりAPIからのデータ取得、加工周りのロジック、一部コンポーネントの設計など活躍の機会が広がりました
## まとめ
これまで基本バックエンドの担当だったのですが、このプロジェクトからは人員の関係でフロントエンドのタスクにも携わるようになったことで、バックエンドとフロントエンド双方を考慮する視点を持つことができました。
また、フロントとバンクエンドともに自分にとっては新しく触れる技術ばかりだったので、学ぶことが多く大変でしたが、とても成長できたように感じます。