1. odrum428

    Posted

    odrum428
Changes in title
+Slackで動作するピアボーナス機能を3日で実装、導入した話
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,92 @@
+この投稿は[Lancers(ランサーズ) Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lancers)の6日目の記事です。
+
+昨日は[yKanazawa](https://qiita.com/yKanazawa)による[ランサーズ版SQLチューニングポリシー](https://engineer.blog.lancers.jp/2018/12/sql_tuning/)という記事でした。
+
+今日は、ランサーズ内にNas!というピアボーナスサービスを導入した話を書いていきます。
+
+## ピアボーナスとは?
+ピアボーナスとは「peer(仲間)」と「bonus(報酬)」が合わさった言葉で、従業員同士がお互いに報酬や感謝を贈り合うことができる仕組みのことをいいます。
+
+導入することで従業員同士のコミュニケーションが活発化したり、社内の良い出来事が見えやすくなるなどのメリットがあります。
+
+導入して数日ですが、以前に比べて積極的に褒め合う空気が生まれてきたかなと感じています。
+
+
+## 実装内容
+ランサーズではSlackをメインのチャットツールとして使用しているので、そこで動作するピアボーナス機能を実装しました。
+
+このサービスはNAS!という名前で、開発部のメンバーがつけてくれました。おそらくピアボーナスから連想してつけた名前ですが、しょうもなさが良くて、気に入っています。tipの単位もnasにしています。
+
+アイコンも社内の方に書いていただきました。かわいい。
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/65d664bc-7bdc-a199-760e-0e07870b8d04.png)
+
+
+### 導入した機能
+#### nasを送りたい時
+**メッセージをつけて送りたい時**
+`/コマンド @nasを送りたい相手 相手へのメッセージ`
+Slack ApiのSlash commandを用いています。相手へのメッセージは専用の部屋を作り、そこでメンションつきで返答されるような設計になっています。
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/e2c12fe0-45a5-1ace-6fc5-022c4efcefce.png)
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/f579056a-c5a9-5b0f-5e71-a0f4b2040407.png)
+
+
+**スタンプから送りたい時**
+相手のメッセージに対して:eggplant:スタンプを送ると、nasが送られます。 botや自分に対しては送っても反映されません。自分に押したときは自戒の念も込めて以下の内容を返しています。
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/520833e3-5d45-b4d8-1364-20d53895a011.png)
+
+#### 自分の残りnasを確認したいとき
+無制限にボーナスを送れるような設計では、ありがたみが薄れてしまうので制限を設けています。nasは一週間ごとにリセットされるようにしています。
+
+残りnasは自分にしか見えないので、どこで確認しても大丈夫です。
+現在はテスト期間なので、上限を1000に設定しています。
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/584e37c7-087e-ce2c-b799-e0104dc9c50d.png)
+
+
+#### その週のランキングを確認したいとき
+その週のnasを送られた数のランキングを確認することもできます。
+
+例によって、このコマンドも自分にしか見えないので、どの部屋に送っても大丈夫な設計にしています。またコマンドでの実行とは別にCloudWatch Eventを用いたcronを設定し、毎週金曜日に自動でその週のランキングを返してくれるようにしています。
+
+## 構成概要
+今回の実装はAWS Lambdaを用いて行いました。構成図は以下のようになります。
+![nas_architecture (1).png](https://qiita-image-store.s3.amazonaws.com/0/285875/45dd5b68-a5b3-03f9-a8bf-922983712ddb.png)
+
+Lambda+API Gateway+DynamoDBというよくある構成です。
+
+またCloudWatch Eventを用いたCron式を導入して、毎週金曜日にその週のランキングをSlackに返してくれるような機能も実装しています。
+
+管理画面のかわりとしてre:dashを採用しています。DynamoDBとre:dashの親和性が高く、DQLというDynamoDB用のSQL文で簡単にデータを抽出できるので、下手に管理画面を作るよりよっぽどいいものになります。
+
+ぶっちゃけ言えば、管理画面作るのがめんどくさかっただけですが、外部ツールを使用した方が保守性が高く、拡張性も広いのでアリだと思っています。
+
+###
+
+
+## 開発よもやま
+一番苦労したのはDBの設計でした。DynamoDBは、AWSでサーバレスなシステムを構築する際にデータベース層に採用されることが多いですが、DynamoDBはNoSQL型のDBなので、RDBMSのように必要に応じてデータモデルを拡張し対応することが難しいです。設計段階で適切なPrimaryKeyやSorted Keyを設定することが重要になると感じました。
+
+最終的な設計としては、PrimaryKeyがnasを送ったユーザのID, SortedKeyをnasが送られた時間のタイムスタンプにすることで要件を満たせるような設計にできました。この設計だとデータ量が増えても問題なくワークすると思います。
+
+またデータ抽出時の力技として、scanで全データを持ってきてから、条件の指定して目的のデータ群を抽出することもできます。
+
+今後、DynamoDBを設計するときは、最初に要件を洗い出して、丁寧に構成を検討してから実装した方が少ない工数で実装できると思います。(見えない要求、要件に対しても柔軟に対応できるような設計だとなお良しですが、かなりの修練が必要になると思います、、、)
+
+## 導入効果
+個々人の細かい動きが今までよりも可視化されたように感じます。
+
+メッセージ付きのnasを流している部屋のスクショ
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/285875/b9ced8a9-a584-17d3-b20b-7242bfa1f161.png)
+
+あとnasをもらえるとかなり嬉しいので、業務のモチベーションもアップするなぁと感じました。
+
+## 今後の展望
+社内の定例会でnasランキングに応じた褒賞を送る制度を本格的に導入していって、積極的に褒め合う文化が生まれていったらいいなと思います。
+
+また、今回実装したピアボーナス機能はオープンソース化させるかもしれないので、この記事を見ているみなさんにも使っていただけたら嬉しいとおもっています。
+
+## まとめ
+今回の実装はテスト段階の実装までをほぼ3日で完了させることができました。
+かなりのスピード感で実装できたと感じており、今後も継続させたいと思っています。
+
+以上、[Lancers(ランサーズ) Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lancers) 6日目の記事でした。
+明日は [yKanazawa](https://qiita.com/yKanazawa) さんの記事です。お楽しみに!