バイセル Tech Blog

バイセル Tech Blogは株式会社BuySellTechnologiesのエンジニア達が知見・発見を共有する技術ブログです。

リモート環境下でのチームビルディング ~デイリースクラム用 Slack Botを紹介します~

テクノロジー戦略本部の村上です。弊社のテックチームは、withコロナのため現在ほとんどリモート勤務となっています。 もともと週1回のリモート勤務が実施されていたこともあり、特に大きな問題も無く移行出来ました。 ただ、完全リモートですとコミュニケーションが対面より難しい部分がありますよね。 そこで今回は、KPTの場で出たコミュニケーションのPを解決した、半年前に導入したデイリースクラム用のSlack Botを紹介したいと思います。

f:id:nmu0:20201130160813p:plain

背景

CASHの弊社での運用が4月に始まったので、このチームのスクラムは最初からリモートでの開催で始まりました。 ですのでデイリースクラムの進め方もまだ定まっていなく、ある日レトロスペクティブでこんなPが出ました。

f:id:nmu0:20201130160402p:plain

ここに書いてあることを補足すると、

  1. 進捗が遅れている場合だけ報告する場になってしまっている
  2. 内容が内容なので雰囲気がやや暗い
  3. 何となく進んでファシリテーションになっていない

という状況でした。 また、たまにデイリーで雑談をすることがあったのですが、 そのようなときだけ盛り上がっていたので雑談も重要だよねという話も出ました。 実は、以前に1日1時間ほどZoomでの雑談時間を設けるというのも試していたのですが、こちらは数週間で廃れていきました。 CASHチームはマイペースの人が多いためか、雑談のためだけにZoomに集まるというのが合わなかったようです。 (別のチームでは続いているみたいです)

そこでTryとして、以下が出ました。

f:id:nmu0:20201130160437p:plain

そして何か良い感じのBotを作っといて、と私に白羽の矢が立ったのです。

機能

あまり時間を掛けるものでもないので、機能は以下の4つに絞りました。

  1. ランダムにファシリテーターを選ぶ
  2. ランダムに意気込みを話す人を数人選ぶ
  3. ファシリテーターを再選出来るようにする
  4. 祝日はBotが飛ばないようにする

3と4が唯一工夫した点です。ファシリテーターがお休みの場合がありますし、 祝日にメンション付きでメッセージが飛んできると鬱陶しいので対応しました。

実装

以前作ったBotをほぼ流用したのですが、技術的には以下のものを使用しました。

python-slack-events-apiがSlackのイベントをBotが受け取って処理するのに必要で、 python-slack-sdkはBotがメッセージを送るのに必要となります。

注意点としては、python-slack-events-apiがFlaskを使うことを想定しているため、LambdaとAPI Gateway環境下でもFlaskアプリケーションの形式のまま動作させる必要があります。 そこで、serverless-wsgiを使うことでFlaskアプリケーションを対応させました。serverless-wsgiの公式に書かれているようにAPI Gatewayのintegrationの設定をserverless.yml に記すだけで、あとはSlackEventAdapterを初期化して、API用の関数にdecoratorを付与するだけで済みます。

以下はメンションイベントに対応したファシリテーター再選のためのAPIとなります。

slack_events_adapter = SlackEventAdapter(slack_signing_secret, '/slack/events', app)

@slack_events_adapter.on("app_mention")
def retry(event_data):
    member = random.choice(members)
    reply = f'<@{member}> さんが代打ファシリテーターです :bow:'
    slack_client.api_call(api_method="chat.postMessage", json={ 'channel': channel, 'text': reply})

Lambdaで定期実行するイベントに関しては、jpholidayで祝日かの判定をしてメッセージを送信するだけです。

def specify_speakers(event, context):
    if jpholiday.is_holiday(date.today()):
        return
    chosen_members = random.sample(members, 2)
    mention_marks = [ f'<@{member}>' for member in chosen_members]
    reply = f'今日の意気込み担当者は、 {" ".join(mention_marks)} のお二方です :loudspeaker:'
    slack_client.api_call(api_method="chat.postMessage", json={ 'channel': channel, 'text': reply})

以前勉強のためにGolangでSlack Botを作りブログでも紹介させて頂きましたが、やはりこういうのはPythonの方が楽だと実感しました。

tech.buysell-technologies.com

Bot導入の効果

Botを導入して概ね好評でしたし、実際に半年間続いています。 導入した次の回のレトロスペクティブのKにも、たくさん出現しました。

f:id:nmu0:20201130160502p:plain

ここにも書かれているように、雰囲気が和やかになったのが良かったですし、 意気込み担当の効果が大きいと個人的に思います。 意気込みと言っていますが大抵は最近の出来事や購入したもの等を話すので、チームメンバーについて知ることにも役立ちました。 例えば、最近見たおすすめの映画やコミックについて話したり、Appleの新製品が出たときはどの種類が良いかなどで盛り上がったりしています。 私もApple Watchを買うときに常時点灯があった方が良いというアドバイスを聞いてseries 6を買い、常時点灯の効果を実感しています。

ちなみに、よくある不満として、選ばれ方に偏りがあるというのが冗談混じりに出てきます。 確かに連続で当たるときは3回くらい当たるときもあります。 その場合は、クラスター錯覚 というのがあるんだよと伝えて上げてください。 実際に、2ヶ月くらい経過してから1人のメンバーが集計してくださったのですが、ほぼ全員同じ回数となっていました。

まとめ

導入後2回目のレトロスペクティブのKには、さらにこんなことが書かれていました。

f:id:nmu0:20201130160521p:plain

どれだけ人間味が無かったのかwと思うかもしれませんが、意外に色々な組織で今似たようなことが起こっているのではと思います。 良さそう、試してみたいと思って頂けたら幸いです。