[Webアプリ] 初学者5人でのチーム開発を終えて


[アプレンティス](https://apprentice.jp/)で2回目のチーム開発を体験させていただきました。
期間中に私が考えていたことや、チームへ貢献したことについて書いていきます。

# 1.アプレンティス チーム開発について
本来であれば複数チームがアプリを開発し、プレゼンによって結果を競い合うハッカソン形式でしたが、受講生が減少したことから1チームのみが発表を行う形式となりました。

# 2.役割やメンバーについて
今回はチームを統合した結果5名での開発を行いました。

メンバーのほとんどはフルタイムで働いており、実装期間が1週間であることから、効率的に開発を進める必要がありました。

私は他のメンバーよりも学習が進んでいたことや、アプレンティスと並行して実務を経験していたことから<b><a href="https://en.m.wikipedia.org/wiki/Lead_programmer">テックリード</a></b>のような役割を務めさせていただきました。

主にコードの品質を高める実装方法の提唱や技術に関する相談に乗るなど、技術的な面でチームを率いることで開発を円滑に進められるよう貢献しました。

<br>

まずは制作したアプリについてご紹介します。

# 3.開発したアプリについて
## アプリの概要
画像生成AIを使用した4人同時対戦を行うゲームです。

指示されたお題に対して画像生成AIにプロンプトを入力し、
最もお題に近い画像を生成できた人が勝利するというものでした。

### 開発の背景
開発の背景ですが、近年は[プロンプトエンジニアリング](https://www.nri.com/jp/knowledge/glossary/prompt_engineering.html)という言葉が生まれるほどAIを活用する能力の価値が高まっています。

そこでプロンプト作成をゲーム化することで、遊びながらプロンプト作成の技術を磨けたら面白いのでは？
という考えから開発することに至りました。

### ゲームの流れ
流れとしては、はじめにニックネームを入力し、部屋を作成するか参加するかを選びます。

![ca068b34d8fff4d908aad23e338ea85a (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/0c696cd9-dfad-f712-29ea-1b4ab8936730.gif)

4人集まるとゲームが開始され、お題に対してプロンプトを考えて入力

![{F6BC4BC7-DF3B-4307-9345-D85D4165B48D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/65ed9a18-10ef-ddbb-5bf6-591e9dfe4f75.png)

すると画像が生成されるので、

![{3D841C9B-1E3F-45FD-B213-FA76D631F2F0}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/29f355db-ebbc-0ff5-dfda-d6b97ffccf30.png)

自分以外で最もお題に近いと感じる人へ投票し

![{34EC8286-FE42-442B-98A7-E6381BA56CD1}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/4c06b311-33a2-5833-9d7a-72d9491bb8c0.png)
最終的に票数の多かった人が勝利するというものでした。

<br>

## 使用技術
フレームワーク：NextJS
主要言語：TypeScript

フロントエンド
・React
・Jotai（状態管理）
・shadcn/ui（共通コンポーネント部）

バックエンド
・NextJS API Routes
・VercelKV (Redis uptrash）

サードパーティAPI
・OpenAI DALL-E（画像生成）
・DeepL （プロンプト英訳）


## 設計資料
### ワイヤーフレーム図(設計段階)

![{5CBD4136-A720-4EF5-91B0-5DBD02531310}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/de41257c-4efa-818c-979d-c3529714946d.png)

### Reactコンポーネント設計図
![APPRENTICE-TEAM-DEV2-Reactコンポーネント設計図.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/e38930d7-13e5-9517-ed6f-3250a76e22bb.png)

### ディレクトリ構造
![{4210EF1D-DC80-4B89-92A8-739F5978B159}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/7ea8d462-89c3-4192-4e16-e8d1b8f21cce.png)


<br>

続いて担当したタスクについて述べます。

# 4.開発期間に担当したこと
## 全体スケジュールの作成
![{A0576776-00ED-4E6B-A49F-123908C09C85}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/8b99dc38-95b5-8e95-e56e-08559ac0dbea.png)

全体の進捗を確認する必要があると考えたため、ガントチャートによる全体スケジュール作成を担当しました。

[一回目のチーム開発](https://qiita.com/SatouHa/items/acff13be74749f0d2956)ではアプレンティスの課題がある週は時間が確保できなかったため、今回は該当期間の進捗を低く見積もることで、前回よりも精度の高いスケジュール作成ができたと感じます。

## [CodeSandbox](https://codesandbox.io/)による検証環境の構築

![{AF6A0606-CE88-4807-B664-7FE77D015FE6}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/8de30d34-438c-5110-82b2-cd8630179d68.png)

画像生成に関しては懸念が多く存在したため、早い段階でデモ用のコードを実装してどのような挙動になるかを確認する必要がありました。（生成待ち時間や、思い通りの画像を出力できるかなど）

そこでCodeSandboxを使用して検証環境を構築し、OpenAIのAPIを使用した待ち時間やプロンプトによる挙動の変化などを事前に検証することで、設計段階で多くの懸念を取り除くことができました。

また、プロンプトが英語でないと精度が低いという情報を得られ、テキスト翻訳用APIが必要であると早期に気づくことができました。


## Reactコンポーネント設計図の作成
![APPRENTICE-TEAM-DEV2-Reactコンポーネント設計図.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/e38930d7-13e5-9517-ed6f-3250a76e22bb.png)

過去にReactのコンポーネントの全体設計を甘く見積もったことで[Prop Drilling](https://zenn.dev/matazou/articles/9728f26b15de68)によって苦労した経験があったので、Reactコンポーネントの関係性を記述した設計図を作成しました。

これにより全体の構図をメンバーに共有できたり、実装する前にコンポーネントを最適に分離できるなど、React部分の開発を進めるうえで役立ちました。

## ディレクトリ構造/ファイル命名規則の提案と整備

![{4210EF1D-DC80-4B89-92A8-739F5978B159}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/7ea8d462-89c3-4192-4e16-e8d1b8f21cce.png)

特にNextJSでは[ディレクトリでルーティング](https://nextjs.org/docs/pages/getting-started/project-structure)を行うため、該当のファイルには処理を記述しないように分離して設計しました。

また命名規則を作成することで命名に一貫性を持たせ、規則性のある構造を維持するよう心掛けました。
Gitのリポジトリに記述しておき、変更があった場合には修正を行い最新の状態を維持しました。

今回のアプリではやや過剰だったと感じましたが、メンバーがファイルの保存場所で迷うことなく円滑に進めることができたので、整備する価値があったと感じます。

## デバッグ環境構築とメンバーへの説明

![{426AAF12-941B-469C-B58F-253273CE199F}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/30c6a3bc-7224-6534-7757-4454adf537b2.png)


フロントとバック両方でデバッガーを動作できるように、[Next公式ドキュメント](https://nextjs.org/docs/app/building-your-application/configuring/debugging)を参考にデバッグ環境の構築し、メンバーへ使い方の説明を行いました。

今回はWindows,MacだけでなくUbuntuでアプレンティスに参加しているメンバーがおり、それらの端末でデバッガーを動作させる必要がありました。

しかしUbuntu環境で動作させることが難しく、断念してしまったことは悔いが残ります。


## フロント・バック 双方のサンプルコード作成
フロントエンドとバックエンドではファイルを細かく分割していたため、先にサンプルコードを実装しておくことで、メンバーが参考にしながら開発できるよう準備を行いました。

コード側でも解説が必要だと思っていましたが、ディレクトリ構造と合わせてメンバーが自力で理解してくれており、アプレンティスに参加しているメンバーのレベルの高さを改めて実感しました。



## git issues + milestoneによるタスク管理の提案と整備
![{99759271-C689-4651-9DFE-A7BC877F1B12}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/356a42c3-af34-ce4e-fd98-68577697faf8.png)

実装期間のタスク管理について、オープンソースソフトウェアのリポジトリをいくつか閲覧したうえで、タスクの管理方法を参考にしました。

Notionも選択肢の一つだったものの、Git上で管理したほうがコードに合わせて更新しやすく、メンバーから使ってみたいという意見があったことからGit上で管理する方法を選びました。

この提案はかなり成功したことの一つで、コードの状態と残りのタスクを把握するうえでとても役立ちました。





## Reactコンポーネントにおける[関心の分離](https://ja.wikipedia.org/wiki/%E9%96%A2%E5%BF%83%E3%81%AE%E5%88%86%E9%9B%A2)の提唱

関心の分離について、例として以下のようなコードがあります

![{37C99250-559A-4D7E-A626-E87BFF95E517}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/67197381-041c-0e8d-a030-1cdb7d923189.png)

ハイライトされている行で、別ファイルに定義した動作部分をインポートしています。
これにより今回のファイルでは主にreturnによる描画用のコードを記述していることが分かると思います。

メリットは主に2つあり、再利用が可能になること、ファイルが肥大化しないため読みやすくなることなどが挙げられます。

開発が終わるころに一部実践できていないコンポーネントが発生してしまったことは心残りですが、メンバー全員の技術力を高めることができたことは嬉しく思います。





## APIの設計/実装とエンドポイント作成
![{2A1C0FB4-CC0D-457B-B144-908A65F26A2B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/384dc729-18ca-8b82-efda-58ae121d18d0.png)

フロントを開発するメンバーの負担が最小になるように、フロント用のエンドポイント実装も含めてAPIの設計と実装を担当しました。

反省点として、コードだけでは伝えられる情報に限りがあるため、ドキュメントの作成も行うべきだったと感じます。


# 5.反省点
## 最悪の事態を想定すること
今回の開発を通じて最も反省したことは、最悪の事態を想定しておくべきだったということです。

発表の直前までは何度も正常に動作していましたが、本番になると最後の処理がエラーで動作せず、プレゼンで発表しきれなかったことは非常に悔しい経験となりました。

特に重要な場面で準備を怠らないことは、この出来事を教訓に心掛けていきたいと思いました。

## 負荷の分散
前提としてメンバーによってチーム開発に割ける時間にはばらつきがありました。

そこで進行に必要なタスクは担当できる人が可能な限り担当していましたが、これにより一部のメンバーに負荷が集中してしまったことは反省すべき点でした。

タスクを細かく分けて負荷分散を行うなど、チームとしての生産性を高めるためにまだまだ改善できる点があったと感じました。




# 6.まとめ
今回のチーム開発は前回よりも多くの失敗や学びがありました。

チーム開発は終わり、特に強制されていませんが一緒に開発をしてくれたメンバーとは今でも毎週集まっています。メンバーは全員思いやりがあって本当に居心地のいい場所です。

このような機会を作ってくれたアプレンティスと、一緒に開発を乗り切ってくれたチームメンバーには本当に感謝しかないです。

アプレンティスとしての残り時間はわずかですが、メンバーと一緒にベストを尽くしていきたいと思います。

ご一読いただきありがとうございました。