どうもこたにんです。
ちょっとしたslackアプリ作ったときの思考回路垂れ流し
ちょっと前の話になるのですが、ちょっとしたslackアプリを作ったのです。
お仕事で作ったといえば半分ホントで半分冗談なんだけど。
そのときの完成までの思考回路と完成までの道のりを、書き残してみる。
イメージのじかん
まず何を作りたいのかを思い描くことが大事です。
今回は「誕生日を祝うbot」を作りたくなりました。
作りたい理由は詳細割愛しますが、slackに活気が出ると良いなと思った。
作りたいものの完成図を考える
完成図のイメージとしてはシンプル。
「誕生日が来たらbotが勝手に祝ってくれる」
それだけ。
作るにあたって、もう少し具体的なイメージをします。
- 誕生日と名前の組み合わせをデータで持たせたい
- 毎日決まった時間に1回起動して誕生日の人がいたらつぶやくようにしたい
- 誕生日は簡単に登録できるようにしたい
これらがあれば、誕生日を祝うbotは実現できそうです。
イメージおわり。
何で作るかを考える
Google大好きなのでGCPメインで考える。
データはDataStoreで持たせればいいね。
決まった時間の起動はCloud Schedulerでいいね。
誕生日の登録はslash commandでいいね。
botの本体はCloud Functionsでいいね。
言語はJSでいいね。
何で作るかおわり。
開発のじかん
どういうものを何で作るかはイメージができました。
あとは開発するだけです。
このときに大事なのは「小さく作っていくこと」です。
ちょっとずつ作って動きを見て、いい感じだったら機能を付け足していく。
アジャイルですね。
ということで、アジャイルな感じで開発をしていきます。
メッセージを返すだけのCloud Functionsをデプロイしてbot化
まずは一番大事な「メッセージを送信する」部分です。
これがなければ何もできません、ので作ります。
slack appsページでbot立ててトークン取って、jsでpost記述してCloud Functionsにデプロイして公開して、botにCloud FunctionsのURLを設定。
公開用URL叩いたらslackチャネルにメッセージが飛んだ、OK。
これで、メッセージを返すCloud Functionsができました。
Cloud Schedulerで自動発火
次に「メッセージ送信を勝手にしてもらう」部分です。
最終的に1日1回実行されるようにしたいので、Cloud SchedulerとCloud Functionsを連携します。
さっき作ったCloud FunctionsをCloud Schedulerと紐付けて、時間を指定して、勝手に実行された、OK。
これで、スケジュールで勝手にメッセージが送信されるようになりました。
誕生日だけメッセージが送信されるようにする
毎日メッセージが送信されるだけでは意味がないので、誕生日のときだけメッセージが送信されるようにしたいです。
なので前準備としてスクリプトの中で、日付判定を入れました。
固定の日付とDate.now()で判定して、メッセージ送信を制御できた、OK。
これで、実行された日と、固定の日付を判定してメッセージが送信されるようになりました。
Data Storeのデータを取得して実行
今は固定の日付で判定していますので、ちゃんと誰かの誕生日で判定したいです。
データはData Storeに入れました。
いくつかダミーで名前と日付を入れました。
これをスクリプト内でSelectします、Date.now()でwhereしてあげれば今日誕生日のデータが取得できますね。
Select結果があればメッセージを飛ばす、OK。
これで、実行された日が誕生日の人がいたらメッセージが送信されるようになりました。
誕生日を登録できるようにする
slack側でslack appに対してデータを渡すことでData StoreにUpsertされるようにしたいです。
が、これは正直、メインとなる機能ではないです。
言い方を変えると「運用でカバー」ができそうですね。
わたしが周囲の人たちの誕生日を聞いて、手動でData Storeに入れれば解決しそうです。
なのでこれは作らないようにしました。
さくっと完成したぞ
というわけで「誕生日を祝うbot」がさくっと完成した。
どういう機能が必要かを考えて、動きにブレがない(完成のイメージと乖離しない)ように少しずつ作って動かしていく。
そうすることで、うまく動かないときの分解点も明確になるし、小さく進めることで理解しながら作ることができます。
アジャイルですね。
普段の業務でコーディングすることのなくなったエンジニアリングマネージャーは、こうやってなんとなくslack appsを量産するマンになってしまったのである。