大学生のコミュニティ内ハッカソンで初心者が優勝できた話

# はじめに
こんにちは、Sekibuuunです。名前の由来は積分記号からです。
タイトルにもある通り、初心者の私がハッカソンで優勝できたので、

- プロダクト紹介
- 工夫したこと
- 苦労したこと
- 期間中、意識したこと
- ハッカソンに参加する上で、大事だと思ったこと

について書いていきたいと思います。拙著ではございますが、読んで頂ければ幸いです。

# プロダクト紹介
私たちのチームは、__LINEとNotionのデータベース（以下、Notion DB）を使用して、大学の課題を管理するLINE bot__ を作成しました。

## きっかけ
チームメンバーの1人（私含め3人チーム）が、大学の課題管理をNotion DBで行っていて、Notion DBに課題内容を追加する時に、

- 課題の科目名や内容などを、入力欄ごとに選択して入力しなければならない
- 提出期限の通知設定を手動で行わなければならない

という不便を感じており、「ユーザー数の多いLINEと、Notion DBを使用して大学の課題を管理できないか」と思ったからです。

## 使用言語、ツール

- Google Apps Script（以下、GAS）
- Googleスプレッドシート（以下、スプレッドシート）
- LINE
- LINE Messaging API
- Notion
    - Notion DB
    - Notion API
![スクリーンショット 2023-09-04 164659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549853/cacd859c-c213-bf78-7e8c-bd632b9243f3.png)
表1.使用言語、ツール
## 主な機能

- LINE botからNotion DBに課題を追加（1回きり）
    - 課題登録時、科目名・提出期限・内容・着手状態をLINE botに送信
- LINE botからNotion DBに毎週ある課題（以下、週次課題）を追加
    - 課題登録時、科目名・提出期限・内容・着手状態・曜日をLINE botに送信
- 週次課題を、自動でNotion DBに追加
- 提出期限になったら、LINE botから通知

### 課題の判断
1回だけの課題なのか、毎週ある課題なのかは、最初にbotに送るメッセージで判断します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549853/b51450ef-4d9f-1777-81db-6a3a1df38f99.jpeg" width="300">
　　　　　　表2. 課題の判断

### 課題を登録する仕組み
LINE botに入力した内容をスプレッドシートに保存し、保存した内容をNotion DBに入力します。
![スクリーンショット 2023-09-04 164340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549853/4c14e307-0c99-fc69-502f-45aff92f9073.png)
表3.動作イメージ

### 毎週ある課題を自動で追加
最初に週次課題の登録で設定した曜日になったら、GASのトリガー機能を利用して、Notion DBに課題を自動で追加する、という機能です。
GASのトリガー機能とは、ユーザーが設定した曜日や時間になったら、決められた関数が自動で実行される、という仕組みです。
（参考画像がなくてすいません）


### 提出期限になったら通知
提出期限になると、LINE botが通知してくれます。
課題内容ごとに、1つずつ通知するようになってます。
こちらも、GASのトリガー機能で動くようになってます。
![55D4B2C8-C94C-4491-A965-7D74717C6C24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549853/813928f5-4052-476f-f821-9c598b3793fa.jpeg)
表4.提出期限の通知

# 工夫したこと
当初はスプレッドシートの1枚のシートで、ユーザーが入力した内容を保存していましたが、そのシートを見返すととても汚かったので、ユーザーの入力した内容ごとにシートを分けました。
![スクリーンショット 2023-09-04 172203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549853/572d36bb-aec6-786b-c93a-9530c79814e8.png)
表5.スプレッドシートの中身

### シートの説明
- 登録
    - ユーザーID
    - 「課題を登録する」「週次課題を登録する」というメッセージ
- once
    - 1回だけの課題の内容を保存
- sunやmonなどの名前が曜日のシート
    - 毎週〇曜日に出される課題の内容を保存
- error
    - 登録できなかった課題の内容を保存

# 苦労したこと

### LINE botとの会話をどう成り立たせるか

開発開始時点では、スプレッドシートを使用せずにbotを作成しようとしており、ユーザーがbotに送信したメッセージを、どうbotに判断させようか悩みました。
「スプレッドシートにユーザーが入力したメッセージを、保存させれば良い」と思い、入力したメッセージをスプレッドシートに保存し、そのメッセージの内容でbotの返答内容を決める、というコードを書くと、うまくbotと会話できるようになりました。
「ユーザーが入力したメッセージをスプレッドシートに保存」という仕組みは、botが想定していないメッセージの判断にも、とても役立ちました。

### チームメンバーの各々書いたコードを1つにする

私たちのチームではGitやGitHubを使用しませんでした。
GitHubではコンフリクトが起こったら自動で判断してくれますが、GASではコンフリクトを判断する機能はないので、1つ1つコードを確認し、コンフリクトがないかチェックしていました。相当骨が折れました。
また、関数の返り値が別の関数の引数として機能するように、コードを整理することにも苦労しました。

# 期間中、意識したこと

### 報連相
一番意識しました。チームのチャットで細かく連絡をし合い、「今、誰が、どのタスクをしているか」を共有できるように心がけました。また、困ったことや変更点があれば、すぐにチームで共有しました。
突然ですが、皆さんに質問です。
__「ハッカソン中、なかなかミーティングの予定が決まらない...」__ ということはないでしょうか？
私たちのチームではそれを防ぐために、毎回のミーティングの最後に、必ず次のミーティングの予定を決めました。
こうすることで、チームメンバーとの連絡が途絶えることがなくなり、メンバー全員のハッカソンのモチベーションが0にはならないと考えています。
このように、私たちのチームはハッカソンに参加したチームの中で、ミーティング回数やチャットのやり取りが一番多いと思っています。

### タスクを均等にする
最初にタスクを決めて数日経過すると、チームメンバーそれぞれのタスクの量に、偏りができるようになってしまいました。
そこで私たちは、__メンバーの出来る範囲でタスクを振り直す__ ということをしました。それぞれの取り組むタスクの量を均等にすることで、「僕（私）しかタスクに取り組んでおらず、他のメンバーがやってくれない」などのようなワンマンが減ると思います。

# ハッカソンに参加する上で、大事だと思ったこと

### 報連相
先ほども述べましたが、報連相が上手くいかないと、開発が全然進まず、結局「何やってるんだっけ？」ということになりかねないと考えられます。
アイデア出しやコードを書くことも大事ですが、それ以上に大事だと思いました。

### MVP開発
これは同じコミュニティの人が教えてくれました。以下の記事を読むと、だいたいのイメージが湧くと思います。

参考記事1：https://uxmilk.jp/65654
（引用：UX MILK、MVP（Minimum Viable Product）とは？実践するメリットと検証方法）
参考記事2：https://monstar-lab.com/dx/about/about-mvp/
（引用：Monstarlab Blog、MVP（Minimum Viable Product）とは？ 意味や開発プロセスを解説）

私は、__とりあえず最小構成で作って、それからどんどん機能を追加していく__ ということだと解釈しています。この開発手法に基づくと、機能は少ないですが __完成__ するので、発表するときに「何もできませんでした」ということは無くなります。
以前に1回だけ出たハッカソンでは、MVP開発を心がけなかったので、完成せず発表することになり、悔しかったです。

### タスク管理
先ほどと少し内容が被ってしまいますが、私たちのチームでは、タスク管理をNotionで行い、Notion上で __チケット管理__ のようなものをしていました。
この方法も、MVP開発を教えてくれた人から教わりました。
チケット管理については、以下の記事をご覧ください。

参考記事3：https://www.chatdealer.jp/me/basic/ticketing-system.php
（引用：楽ラクス！Chat DealerAI、チケット管理とは？メリット・デメリット、管理のポイントを解説）

チケット=タスクに優先度をつけ、優先度の高いものからタスクを終えることで、機能が増える感じがして、嬉しかったです。また報連相の所でも書きましたが、「今、誰が、どのタスクをしているか」が一目で分かるようになることも、大きかったです。

# 最後に
長くなってしまいましたが、ハッカソンで感じたことをいろいろ書かせていただきました。このLINE botは、サービスとして使えるようにするため、継続開発をしていく予定です。ハッカソンの楽しさを知れたので、これからもハッカソンに積極的に参加していこうと思います。
チームメンバー、助けてもらった同じコミュニティ内のメンバー、ハッカソン運営の皆さんに感謝しつつ、この記事を終わります。