はじめに
こんにちは、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
主な機能
- LINE botからNotion DBに課題を追加(1回きり)
- 課題登録時、科目名・提出期限・内容・着手状態をLINE botに送信
- LINE botからNotion DBに毎週ある課題(以下、週次課題)を追加
- 課題登録時、科目名・提出期限・内容・着手状態・曜日をLINE botに送信
- 週次課題を、自動でNotion DBに追加
- 提出期限になったら、LINE botから通知
課題の判断
1回だけの課題なのか、毎週ある課題なのかは、最初にbotに送るメッセージで判断します。
表2. 課題の判断
課題を登録する仕組み
LINE botに入力した内容をスプレッドシートに保存し、保存した内容をNotion DBに入力します。
表3.動作イメージ
毎週ある課題を自動で追加
最初に週次課題の登録で設定した曜日になったら、GASのトリガー機能を利用して、Notion DBに課題を自動で追加する、という機能です。
GASのトリガー機能とは、ユーザーが設定した曜日や時間になったら、決められた関数が自動で実行される、という仕組みです。
(参考画像がなくてすいません)
提出期限になったら通知
提出期限になると、LINE botが通知してくれます。
課題内容ごとに、1つずつ通知するようになってます。
こちらも、GASのトリガー機能で動くようになってます。
表4.提出期限の通知
工夫したこと
当初はスプレッドシートの1枚のシートで、ユーザーが入力した内容を保存していましたが、そのシートを見返すととても汚かったので、ユーザーの入力した内容ごとにシートを分けました。
表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は、サービスとして使えるようにするため、継続開発をしていく予定です。ハッカソンの楽しさを知れたので、これからもハッカソンに積極的に参加していこうと思います。
チームメンバー、助けてもらった同じコミュニティ内のメンバー、ハッカソン運営の皆さんに感謝しつつ、この記事を終わります。