【初めてのチーム開発】バランスの良いチームに出会えました

<br>
こんにちは、Reikaです。<br>私は現在、アプレンティスの5期生として日々勉強に励んでいます。<br>

https://apprentice.jp/lp

突然ですが！<br>私はエンジニアになる目標として「人々の可能性を広げる仕事をしたい」という目標があります。<br>得意なことや好きなこと、必要なことに集中できるように無駄な時間を省き、エンジニアリングを通じてその可能性を広げていきたいです。<br>
今回作成したプロダクトにも、チームに相談し、この想いをチラリと込めさせてもらいました。<br>この経験の振り返りを記述していきます。<br>

# プロダクト概要
まず初めに、完成したアプリをご紹介します。<br>開発したのは、 **毎日の日報投稿をカレンダー形式で表示し、過去と現在を簡単に振り返られるアプリ、「overGrown」です。** 
デザインや機能にはまだ改良の余地がありますが、プロジェクトが完成した今、<font color="Red">欲しかった機能がすべて実現できたことに感慨深くなりました。<br>

![2024-06-1418.03.04-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/04dd508f-7abd-786e-7ef7-a27b875d6a5e.gif)


それでは早速、一連の開発過程を振り返っていきます！<br>

# 今回の開発スケジュール
| 期間 | 内容 |
|:-:|:-:|
|  4/8(月) - 4/21(日)| アイデア決め|
|  4/22(月) - 5/5(日) | スライド作成、要件定義|
|  5/6(月) - 5/19(日) | 設計、タスク出し|
|  5/20(月) - 6/2(日) | 環境構築|
|  6/3(月) - 6/9(日) | 実装、プレゼン準備|
|  6/9(日) | プレゼン|

# 1.テーマ
今回のチーム開発は、アプレンティスの課題として経験させていただきました。<br>そのため、テーマも提示していただき、そのテーマが
**『自分たちの役に立つものを開発せよ』**
 でした。<br>
 チームメンバーは私を含めて4人。全員学習してまだ半年ほどで、チーム開発の経験もありません。<br>あ、趣味は多種多様です。（笑）

# 2.アイデア決め
次に、アイデア決めです。<br>ここで転けたら終わり。クオリティの大半はアイデアで決まります。<br>
アイデア決めの秘話を **なぜこのアプリを作ったのか・どんな課題解決をしたいのか** に分けて記載していきます。

## 2-1.なぜこのアプリを作ったのか(開発背景)
私たち4人は「エンジニアになるために毎日成長したい」という共通の思いがあります。<br>成長するためには、日々の行動を振り返り、記録し、新しい目標を設定することが重要です。

現在、私たちは毎日、Discordというコミュニケーションアプリに日報を投稿していますが、複数人が同じチャンネルに投稿するため、振り返りや自己評価に十分活用できていません。
<font color="DarkGray">（以下の投稿が複数個、縦に並んでいるイメージです）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/73bc9aae-b055-e420-dcc5-c19615095b75.png" width=50%>

「1ヶ月前の自分、何で悩んでたっけな〜、どんな目標があったっけな〜」と振り返りたくても、大きくスクロールすることが手間になっていたのです。

そこで、現在の日報投稿をうまく活用し、 **振り返りの価値を高めるアプリ** を開発することにしました！

## 2-2.どんな課題解決をしたいのか（課題定義）
日報を投稿する上で解決したい課題は次の通りです。<br>
* 過去の日報を確認するのに手間がかかる
  **→カレンダー表示で特定の日報を迅速に確認できるようにする！** <br>
* 文字ばかりで読みづらい
  **→色やデータなど、視覚的にわかりやすい形式で表示する！** <br>
* もっと効率的なデータを管理をしたい
 **→勉強時間を集計し、自己評価を色分けする！** <br>
* 目標を立て、効率よく毎日を過ごしたい
 **→月の目標を設定でき、アプリを開くたびに目につくようにする！** 

これらの課題を定義し、<br> **とにかく過去を振り返りやすくし、視覚的に認識しやすくすること** にこだわりました。

# 4.スライド作成
次に、この段階でプレゼン用のスライドを作成しました。<br>チーム内で課題とコンセプトにズレが出ないようにするためです。<br>最初に発表をイメージしておくことで、作成を進める途中で「このプロダクト、いけてない」とつまづかないようにしました。<br>
スライドの構成は、 **背景→課題→プロダクトの説明→まとめ** という流れで作成しました。

<font color="DarkGray">（スライド作成に使用したメモ）
![スクリーンショット 2024-06-11 20.53.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/be8a733f-2a95-3e21-f811-505362dc89e0.png)

# 5.使用技術
今回の開発に使用した言語・ツールは次の通りです。
* フロントエンド：HTML / CSS / Bootstrap5.3 / JavaScript 
* バックエンド：PHP
* データベース：MySQL
* ソース管理：Git / GitHub

また、生の言語の学びを深めるために、フレームワークは使用しませんでした。

チーム内のやり取りはDiscordの他に、Figmaを使用しました。
<font color="DarkGray">（実際の私たちのFigmaです）
![スクリーンショット 2024-06-10 19.31.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/cf30b579-1c54-9e75-e09f-243b7ed8ca77.png)


# 6.要件定義
続いて、システムとして必要な要件をまとめる、要件定義を行いました。<br>カレンダーのある **一覧画面** と、日報を登録する **登録画面** の２つに分けて、要件定義を行いました。

- 一覧画面
    - モーダルウィンドウで該当日の日報を表示
    - 月毎に画面遷移
    - 目標を保存、表示
    - 過去の日報を編集
    - 学習時間の統計（月単位、週単位）
    - 今日の日付の色を変える
    - 自己評価で枠内を色分け
    - 学習内容のタグを表示
- 登録画面
    - 日報の登録
    - 一覧画面へ画面遷移
    - 今日の日付を表示
    - 古いタグの削除（登録済みの日報からは消さない）

# 7.設計
次に、全体像の整理のため、 **行動フロー、WF(ワイヤーフレーム）、タスクばらし、テーブル定義書** を作成しました。<br>いよいよ形になってきいきます。
## 7-1.行動フロー
２画面のみの構成のため、行動フローはとてもシンプルですが、一覧画面ではさまざまなことができます。<br>簡単に振り返りができるよう、 **前の月への画面遷移、目標の保存、日報の閲覧のモーダルウィンドウは、全てワンクリック** で行えるように計画しました。<br>登録画面では、新規の登録のほかに、誤字や記載漏れの際に便利な編集機能も計画しました。
<font color="DarkGray">一覧画面がグレー、登録画面がブルーです。
![Untitled Workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/4faa234b-0347-5619-938e-fae9a2976821.png)

## 7-2.WF(ワイヤーフレーム)
さらにイメージを統一させるため、WFを作成しました。<br>どこに何を表示させるかの認識が揃い、このWFをもとに作成を円滑に進めることができました。
<font color="DarkGray">一覧画面
![スクリーンショット 2024-06-12 13.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/c0afdba6-09d3-a036-e272-ac5a83a6269d.png)
<font color="DarkGray">登録画面
![スクリーンショット 2024-06-12 13.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/00fd637d-2682-8ef4-3032-6baa9dfde95b.png)

## 7-3.タスクばらし
次にタスクの分担です。これには悩みました。<br>平等に技術を習得したいという思いはありましたが、日中に働いているメンバーもいるため、完成させることを優先し、以下の4つに担当を割り当てました。

* データベースの設計
* 登録画面のフロント作成
* 一覧画面のフロント作成
* 細かなJavaScript

私たちのチームにはこれが最適な分担だと考えています。<br>各メンバーは自分の担当箇所を制作しましたが、最終的には全員でチェックし、修正が必要な場合はしっかり指摘し合う形で作業を進めました。<br>

## 7-4.テーブル定義書
テーブルは4つ作成しました。<br>ポイントは、削除されたタグを保存しておくtagShadowテーブルです。<br>
学習が進むと、学習内容タグも段々と増えていきます。<br>そんな中、過去に学んだことで、「もう最近は勉強しないかな？」と思う時に削除できるよう、tagShadowテーブルを作成しました。<br>削除すると、タグ選択幅がスッキリして操作しやすくなります。<br>

また、これはtag **Shadow** ですので完全に削除することはありません。<br>このテーブルは、タグを削除する前に関連するデータを一時的に保存するために使用されます。

| テーブル名 | 説明 |
|:-:|:-:|
|  reports| 日報に関する情報を管理|
|  tags | 日報内の学習タグを管理|
|  report_tag | レポートとタグの関連性を管理|
|  tagShadow | 削除されたタグに関連付けられていたレポートの情報を保持|

<font color="DarkGray">ER図
![スクリーンショット 2024-06-12 17.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/c240ef13-fac2-b2cd-b0e8-681381fef25c.png)

# 8.実装
お待たせしました！<br>アイデア出しから始まり約2ヶ月。たくさん準備を重ねてきました。<br>いよいよ実装です！<br>
こちらでは、実装中に苦労したこと、こだわったポイントを記載します。
## 8-1.苦労したこと
### Git、GitHubの使い方
まず最初に苦労したのはGit、GitHubの使い方でした。<br>これまで全員、自分のリポジトリにプッシュすることしか経験がなかったため、手探りで開発を進め、思いの外時間がかかってしまいました。<br>しかし、使っていくうちに次第に慣れていき、今では仕組みを理解しスムーズに操作できるようになりました。<br>次回のチーム開発では、コードの共有で苦労することはなさそうです！

ちなみに、チーム開発が始まる前にメンバーの1人がテストリポジトリを作成し、練習する機会を設けてくれました。<br>こちらのおかげで、実際の開発が少しスムーズに進みました。これがなかったら、結構大変だったともいます。笑<br>

### 要件定義の不足
[6.要件定義](#6-要件定義)で記載したものは最終的なもので、予め行った要件定義はもっと不足していました。<br>ユーザーの立場に立ち、ストレスなく操作できるための要件が足りておらず、開発中に「この要件があったほうが良いんじゃない？」と、何度もコミュニケーションを取り、追加していました。<br>
追加する際には、他の機能に影響を与えないように注意し、エラーが発生しないように慎重に進めました。<br>これを通じて、 **最初の土台（アイデア出しと要件定義）がいかに重要か** を実感しました。

## 8-2. こだわったポイント
### チーム会の頻度を上げた
開発期間の１週間は、リモートのチーム会を３回行いました。<br>顔を合わせて直接意見を交換し、抱えている課題や提案事項を共有しました。

### 全員が対話を重視した大人なコミュニケーションを心がけた
このポイントについては、私自身や他のメンバーも、特別に意識して行っていたわけではありませんが、自然とそうなっていました。<br>各自の意見に対して、まずは他のメンバーの意見をしっかり聞く姿勢がありました。<br>そのため、喋りたい人が重なった際もすぐに譲り合い、「あ、すみません(笑)どうぞ」と、聞き込むことができていました。<br>

### 開発期間に切羽詰まらないよう、事前準備を意識した
アプレンティスには同時進行で行う別の課題もあるため、各タームには２週間の期間が与えられていました。<br>そんな中、２週間以内に終わるタームもありました。
| 期間 | 内容 |
|:-:|:-:|
|  4/8(月) - 4/21(日)| アイデア決め|
|  4/22(月) - 5/5(日) | スライド作成、要件定義|
|  5/6(月) - 5/19(日) | 設計、タスク出し|
|  5/20(月) - 6/2(日) | 環境構築|
|  <font color="Red">6/3(月) - 6/9(日) | <font color="Red">実装、プレゼン準備|
|  6/9(日) | プレゼン|


そのため、常に「<font color="Red">１週間</font>という開発期間は短い、余裕を持ちたい」という意識のもと、早め早めで行動していました。<br>例えば、環境構築が早く終わったため、登録画面のタグの追加方法について問題点を見つけることができました。

# 9.プレゼン
さーいよいよプレゼンの日！<br>
プレゼンは私が担当させていただきました。<br>普段から喋るのが好きで、思いを口で伝えることも好きなため、「私やりたいです！」と立候補しました。<br>チームメンバーも「やりたい方がやるのが一番良い」と言ってくださり、私に決まりました。優しいですね。笑<br>その後、スライドの最終作成も担当し、４人の思いや、頑張って加えた機能をくまなく無駄なく伝えることを心がけました。<br>

チームメンバーはプレゼン練習にもたくさん付き合ってくれて、そのおかげで自信を持って本番に臨むことができました。<br>

また、スライド作成、発表の方法は、アプレンティスの先輩であるTEAM Dodoさんの発表を参考にさせていただきました。↓

https://youtu.be/zYsWHGXje0o?start=2529



# 10.今後の課題
プレゼンも時間内できっちり終わり、一安心。<br>さて、忘れないうちに振り返りタイムです。<br>
今後の課題は、「課題しかない」という具合にたくさんあります。笑<br>個人においてもチームにおいても、伸び代をしっかり感じ、第二回のチーム開発が、楽しみで仕方がないです。<br>
たくさんある課題中で、3つを列挙させていただきます。<br>

+ **要件定義とタスクばらしは細かく行う！**
  ここをどれだけ詰められるか、のちの自分達を助けてくれると痛感しました。<br>次回のWFは、ユーザーの動きも確認できるものを使って実際に動かしてみようと思います。<br><br>
  
+ **開発期間はボイスチャットを使う！**
  開発期間の１週間、社会人のメンバーもいるため、常に日中はDiscordでやりとりをしていました。<br>ですが、デザインの話をしたり、機能の話をしたり、 いろんなことを同時に話し合ってしまい、スレッドがスッキリしていませんでした。<br>日中に聞きたいことをまとめて、朝や夜などみんなが集まれる時間帯に常時繋いで開発したほうが効率が良かったのではと思いました。<br><br>

+ **UIは他プロダクトを参考にする！**
  見た目のこなれ感を出したくとも、どうしたらそのこなれ感とやらがでるのか、力が尽きていました。<br>すでに世にあるプロダクトを複数参考にし、ぱっと見でも楽しめるプロダクトにアップデートします。


# 11.感想
初めてのチーム開発。お疲れ様でした！<br>まずは、チームメンバーと協力してプロジェクトを進めることの魅力を実感しました。<br>率直に、４つの脳みそがあるって凄いなと思いました。笑<br>
以前までは一人で学習を進め、ポートフォリオのアイデアを考えることに悩んでいましたが、チームでの作業はアイデアの多様性と開発速度の向上をもたらしてくれました。<br> **アイデアの数と開発速度が、4倍、いや10倍にもなっていました。** <br>

特に、それぞれ異なる性格やコミュニケーションスタイルを持ちながらも、お互いを尊重し合い、必要な時には率直に意見を交換することで、バランスの取れたチームに出会えたと気づきました。<br>終わった今、全員「みんな個性的でバラバラだけど、バランスがすごく良いチームだ」と、口を揃えて言っています。<br>

そんなチームメンバーに囲まれ、私は、
スライドの骨組みから作成まで、ワイヤーフレームの設計、タスク振り、登録画面の実装、プレゼンテーションを担当しました。<br>大枠や形を考えることに楽しさを感じ、積極的にアイデアを提案し、修正を重ねる中でプロジェクトを完成させることができました。<br>

このプロジェクトでは、 **単なるチームメンバーではなく、共に目標に向かい、共に成長する仲間として、日々のコミュニケーションを大切にしました。** <br>例えば、日報でのプライベートな内容の共有や、ビデオ会議でのチーム会の提案など、チームの結束を固めるための努力も惜しみませんでした。<br>これは２回目のチーム開発でも、所属が変わって新しい仲間に出会っても、必ず行っていきたい行動です。

これらの経験を通じて、技術的なスキルだけでなく、チームワークやコミュニケーション能力の重要性を再認識しました。<br> **良好なチーム関係が開発者のモチベーションを維持し、プロダクトのクオリティを向上させます。** <br>
これからも、自分の成長とチームの成功に貢献できるよう努力していきます。