【m1nus】Qiita Hackathon参加レポート

## イベント概要
- **イベント名**: [Qiita Hackathon 2024](https://qiita.com/official-campaigns/hackathon/2024) 予選
- **開催期間**: 2024/9/21(土)-22(日)
- **開催場所**: オンライン
- **主催者**: Qiita
- **テーマ**: Open

## チーム紹介
- **チーム名**: m1nus
「プロダクト開発は引き算が大切」という思いからマイナス(minus)を文字って命名しました:upside_down:
- **メンバー構成**: 
私が研究室同期Iさんに声をかけ、Iさんがバイト先のエンジニアKさんとOさんに声をかけていただいて集まった4人のメンバーで開発しました。最高に楽しいチームメンバーでした！集まっていただいて感謝です！:bow:
    ```
    チームリーダー: 私
    フロントエンド: Iさん，Kさん，Oさんの3名
    バックエンド: Iさん，私の2名 
    デザイン: Iさん，Kさんの2名
    クラウドインフラ: 私
    ```

## 開発の進め方
### Day1
#### 10:00-13:00
まずはテーマの`Open`に対してそれぞれの考えをmiroにまとめてディスカッションする時間を設けました。各々がOpenに対して感じることを説明し、そこからさらに連想ゲームを進めるようにアイデアが拡張していきました。面白いアイデアばかりでどれか1つに絞るのに苦労しました。
![スクリーンショット 2024-09-25 18.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633700/6a55b419-cd20-6170-7fcc-603e08948be7.png)
このアイデアソンで自分がすごい良かったと感じたことは、チームとしてどのアイデアをプロダクトにするかを決める際に全員が納得するまで議論することができた点です。参考までに多数決でどのアイデアを実装したいかの集計はしましたが、1人でも違うものを作りたい状況では双方が納得するまで話し合うことができました。
結果として、自分のプライベートな空間である家をもっと`Open`にしようというアイデアで方向性を統一することができました。
![スクリーンショット 2024-09-25 19.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633700/5739a5fc-12c1-5a14-6bf7-992598eaf1bf.png)

#### 13:00-18:00
方向性が決まったため、具体的な要件をまとめていきました。特に大切にしたのはMVP（Minimum Viable Product）です。ハッカソンは時間との勝負の側面が大きいため、プロダクトを通して最小の価値を提供するためには何が「必須機能」で、何が「あれば良い機能」なのかをしっかり分類することに時間を割きました。
後の結果として最低限動くものをハッカソン期間内に構築することができたのは、ここにしっかり時間を割いて、何を作って何を作らないのかを明確化することができたからだと思います。
一方で、「あれば良い機能」にリストアップしていたものに面白い機能もいっぱいあったため、それらを実装するまでに至れなかった点は悔しいポイントですね。
![スクリーンショット 2024-09-25 19.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633700/660df138-7162-ac6d-5e6b-375fafd6c6e2.png)

#### 18:00-24:00
ここからは本格的にバックエンドとフロントエンドで別れて実装に移ったため、自分が担当したバックエンド側についての作業内容をまとめます。
とはいえ、必須要件に挙げたそれぞれの機能について
- 「ユーザー登録・ログイン」機能
フロントエンドとFirebase Authenticationを利用して実装
- 「ユーザーの家ステータス・位置情報」周りの機能
フロントエンドから直接Firesotreから取得して表示する

という方針になったため、基本的なユーザーのステータス取得APIと、「あれば良い機能」の1つであった、ステータスを公開するためのフレンド周りの登録・取得・削除APIの構築に取り掛かることとしました。

FastAPIを用いて構築し、API仕様書はSwaggerUIで表示し、フロントエンドと同期できるようドキュメント駆動で進めました。FastAPIをしっかり触るのは初めてだったのですが、FastAPI✖️SwaggerUIを利用して、ほぼ自動で仕様書が生成されるのと、仕様書画面内でAPIのテストを実行できる点が便利すぎて感動しました:star2:

### Day2
#### 0:00-9:00
基本的なAPI実装は完了したため、フロントエンド側でローカル環境構築する必要なくAPI使ってもらえるようデバッグ作業に移行しました。最初はVercelにデプロイする予定だったのですが、Firebaseとの環境変数を利用した連携がなぜかうまくいかず詰まってしまったため、Firebaseとの親和性が高いGCPへデプロイ方向に転換しました。
この決断が功を奏し、特にエラーに詰まることなくデプロイすることができました。FastAPIプロジェクトをDockerでコンテナ化し、DockerイメージをGCRへプッシュしました。Cloud Runからイメージをpullし、サーバーレスAPIをフロントエンドから呼び出します。フロントエンドチームから修正依頼があった際にも簡単にデプロイして反映することができたため、開発効率を上げられたのかなと感じてます。

#### 9:00-13:20(提出締め切り)
適宜APIの修正を行いつつ、軸足は発表準備に切り替え始めた時間です。フロントエンドチームがデザインも含め最後の最後まで追求していたため、自分は発表スライド作りに専念しました。ただ、ここまで一睡もしていなかったため話の構成をまとめようにもうまく頭が回らない状況でした:sweat_smile:
最終的にはみんなの協力もあり、提出締切5分前にスライドが完成し、急いで提出する羽目になりました。卒業論文を締切間近に提出している気分でした。

## 最終成果物
最終発表したプロダクトは以下の通りです。一睡もできませんでしたが、開発が楽しい気持ちが勝り、眠気が来なかったですね。
- **プロダクト名**: 俺ん家来ないか？
- **プレゼンテーション**:
[![thumbnail](https://files.speakerdeck.com/presentations/c63ea8008ca4426eb99c156e8e673407/slide_0.jpg)](https://speakerdeck.com/kokikazaore/wont-you-come-to-my-house)
- **使用した技術スタック**:
![2024-09-22_11.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633700/eb940395-e7ad-c369-ea0d-7b49eab61c88.png)



## 学び・反省点
### **良かった点**
チーム内の議論が活発だったことはめちゃくちゃ良かったことだったなと思っています。全てのconflictが意味あるものだったと感じますし、それができる雰囲気作りができたチームメンバーに感謝です。
休憩がてらに聞いていたフロントエンドチームの画面設計に関するコンフリクト・ディスカッションが特に面白かったです。
あとは、やっぱりハッカソンではツヨツヨエンジニアにいっぱい出会えることが良いですね。他のチームが使っている、自分が知らない技術をキャッチアップしてみたい欲がすごく高まりました。

### **反省点・学び**
コンフリクトの1つにNoSQLを利用するべきか、RDBを利用するべきかの議論がありました。構築する速さやとりあえず動くものを作りたいという観点からFirestoreのNoSQLを用いることとなりましたが、それぞれのメリットデメリットをもっと体系的に理解する必要があるなと感じました。