KPT法で振り返る 2ヶ月間の技術研修(Rails × Docker × React × TypeScript × GraphQL)

# はじめに

株式会社mofmof エンジニアの[koma](https://qiita.com/kmkkiii)です:turtle:

今年の10月に中途入社してから2ヶ月にわたって技術研修を進めてきました。
こちらはそのKPT法による振り返り記事となります
(KPT法については[こちら](https://www.mof-mof.co.jp/blog/column/kpt)を参照)

完成したアプリはこんな感じです↓
Renderへデプロイしましたが、90日後に期限切れとなるPostgreSQL DBを使っているためキャプチャだけ載せておきます。
![スクリーンショット 2022-11-30 9.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317957/3db2b1ac-2804-7e24-d17e-78b7550d1e5a.png)


# 研修でやったこと
研修では以下の技術を使って、スクラムでタスク管理アプリを開発しました。

#### 使用した技術
- Docker
- Ruby
- Ruby on Rails
    - ~~esbuild~~ Vite
- GraphQL
    - Apollo Client
- React
- TypeScript
- TailwindCSS
- Gmail SMTPサーバ
- Sidekiq
- Render

また、プロジェクト管理には実案件でも使用しているPivotal Trackerをプロダクトバックログとして使い、PO（プロダクトオーナー)と２人でストーリーの機能について話し合いながら実装を進めていきました。

https://www.mof-mof.co.jp/blog/column/pivotal-tracker-with-mogile

#### 実装したストーリー
<details><summary>タスク管理 基本(CRUD)機能</summary>

- 利用者はタスクを一覧で確認できる
- 利用者はタスクの詳細を確認できる
- 利用者はタスクを登録できる
- 利用者はタスクを更新できる
- 利用者はタスクの一覧を作成日時の昇順に並んでいる状態で確認できる
- 利用者はタスクを削除できる
</details>

<details><summary>認証機能</summary>

- サービス運営者はログインしていない利用者にサービスを利用させたくない
- 利用者は自分が登録したタスクだけを確認したい
</details>

<details><summary>タスク管理 オブション機能</summary>

- 利用者はタスクの期限を設定できる
- 利用者は終了間近や期限の過ぎたタスクがある場合、わかりやすく表示してほしい
- 利用者はタスクの一覧を期限の昇順に並んでいる状態で確認できる
- 利用者はタスクにステータス(未着手・着手中・完了)を設定できる
- サービス運営者は利用者を一覧で確認できる
</details>

<details><summary>バックグラウンド処理系</summary>

- 利用者は複数タスクをエクスポートできる
- 利用者は複数タスクをインポートできる
- 利用者は終了間近のタスクがある場合、メール通知で知らせてほしい
- 利用者はメール通知の有効/無効を選択したい
</details>

<details><summary>ページネーション</summary>

- 利用者はタスク一覧表示が長くなっても見やすいようにしたい
</details>

<details><summary>検索機能</summary>

- 利用者はタスク一覧を期限でフィルタリングできる
- 利用者はタスク一覧をタイトルで検索できる
</details>

<details><summary>チーム作成機能</summary>

- チームを作成できる
- チームのタスクを作成できる
- チームにユーザーを招待できる
- チームのタスクと個人のタスクを分けて管理できる
- チームのタスクに利用者をアサインできる
- 利用者は自分がアサインされているチームタスクのみ表示できる
</details>

他にもRSpecで`graphql-ruby`のテストを書いてみたり、TailwindCSSでデザインを反映したり、
細かいストーリーもありましたが割愛します。これらの実装を通して一通りの技術を触って作ることができました。

# 良くなかったこと（Problem）
PRに別ストーリーの実装が混在してしまうことで、レビュワーに負担をかけてしまった。
今後自分もレビューすることになるため、レビュワー視点に立った運用を心がけるようにしたいです。

# 分かったこと や 良かったこと（Keep）

## mofmofでよく使われている技術について理解を深めるができた
Railsはアプリを作った経験はあったものの、
DockerやReact、TypeScript、GraphQLなどと組み合わせることで導入に手こずった部分が多かったように思います。
2ヶ月という長めの期間を与えられたことでトライアンドエラーを繰り返すことができたので、技術の理解が深まりました。

## スクラム開発が経験できた
前職はウォーターフォール開発を採用していたため、実案件に入る前にスクラム開発の経験ができて良かったです！
(ビデオによる座学研修だけでなくて実践できた)

## 社内のSlackチャンネルにてmofmofメンバーと交流が深められた
手探りで実装を進めていく中で、みんなはどうしているのか気になった部分がありました。
そんな時には、Slackチャンネルでメンバーに意見を聞いてみることを促してもらったり、
週１で行っている技術に関するトークでテーマとして挙げてもらったりと
mofmofメンバーとの交流を深められる機会が生まれてうれしかったです。
(今は地方からフルリモート勤務しているので)

## 自分事として捉えられないと要件の合意には至らない
ユーザーストーリーの実装を進めている中で、
POが求めているストーリーの機能と実装を進めている内容の間に認識の齟齬が生まれていました。
スプリント外で相談の時間を頂き軌道修正することができましたが、最悪の場合手戻り等が発生し、
POとの信頼関係が崩れてしまうため、こちらも研修の過程で経験することができて本当に良かったです。。。

# もう1ヶ月あったらやりたいこと(Try)

- CIの導入
- N+1問題の対応
- Dockerの理解を深める
- 追加機能
    - タスクの承認機能とか

技術的な理解度を深めることはもちろん、ストーリーの機能について正確な定義ができるようにPOと話し合いながら追加の機能も実装したいと思いました。
そのほか振り返りのTryでは、今後の技術研修ではこういう風にしても良さそう！といった改善につながる話もできました。
# 最後に

あっという間の2ヶ月間に感じましたが、
充実した技術研修期間を過ごすことができました！研修に携わった方々に感謝です。

実は実案件で使うのは今回研修で使った技術スタックではなかったりするのですが(笑)、
個人開発アワードやハッカソン、アドベントカレンダーなど楽しいイベントも待ち構えているので、
個人開発やブログ投稿などアウトプットドリブンで成長していきたいと思います！