AMBLの日々

非金銭的インセンティブ制度を導入するために

*本記事は旧TechblogからCOLORSに統合した記事です。

ごあいさつ

はじめまして。

エンジニアリングソリューション事業部(以下、ES事業部)のY.Iです。
弊社、株式会社エム・フィールドでは社員の幸福を追求するため、事業部毎に様々な取り組みを行っております。
その中でも私の所属するES事業部では、試験的ではありますが非金銭的インセンティブ制度の導入を始めました。

非金銭的インセンティブ制度とは?

特定の行動をとった社員に対し直接的な金銭による還元を行うのではなく、

目に見える評価を行う、有用な権利を与える、表彰を行うなどで社員の幸福度を増長させること。  

どんなときにインセンティブが発生するのか

例えば、

・AさんからBさんにSlackまたはメールで「ありがとう」と感謝の意を伝えた

・社内イベントへの参加/企画

・会社で管理している本棚から本を借りた

etc…

こんな感じで社員が普段行っている、会社にとって良い行動(意図あるアクション)に対して、インセンティブ(弊社ではMポイントと銘打っています)を付与しています!

導入に至った経緯

もちろん弊社のみに関わらず、どの企業様でも同じことが言えると思いますが、

社員一人一人が会社のために様々な貢献をして、会社の利益を生み出していると思います。

しかし、その様々な貢献がすべて目に見えて評価されているのか、不安に思ったことはありませんか?

そこで我々は、社員が会社に向けて起こした良い行いをしっかりと社員に還元したいと思い、このような制度を設けることを決定いたしました。

どうやって導入したのか?

弊社では、コミュニケーションツールとして「Slack」を使用しており、

Slack APIとGoogle Apps Script(通称GAS)を組み合わせて実現していきます。

主に使用したプログラムやツール

・Python

・Google Apps Script(通称GAS)

・GASUnit(外部ライブラリ)

・Amazon EC2(AWS)

・Elastic Load Balancing(通称ELB)

・Slack API

具体的なポイントの流れ

例として、SlackでAさんからBさん宛てに「ありがとう」と伝えた時のポイントの流れを

簡単にではありますがご紹介させていただきます。

                                    <img width="640" height="242" src="https://colors.ambl.co.jp/wp-content/uploads/2020/09/ggg.png" alt="" />                                          
    <p>AさんがBさんに「ありがとう」とSlackを介して、伝えたとします。

BさんがAさんから「ありがとう」というメッセージを受け取ると同時に、

AWSサーバにSlack APIを介して情報が送られます。

その後、AWSサーバーにてPython処理が起動し、GASを起動。

GASは受け取った情報をもとにAさんにポイントを加算するといった仕組みです。

導入/開発にあたって気を付けた点

いくら社内向けのプログラムとはいえ、セキュリティが脆弱であったり、

運用開始直後からバグが多発してしまうようではいけません。

セキュリティにおいて気を付けた点と、バグを防ぐために行ったテスト方法をご紹介させていただければと思います。

セキュリティにおいて気を付けた点

サーバは、AWS EC2、GAS Webアプリケーションで構築しています。

【AWS EC2】
セキュリティグループを「SSH」と「HTTP」ポートのみ許容する設定にしています。
SSHは、「IPフィルタ」、「公開鍵認証」にてサーバ管理者のみアクセス、メンテナンス可能としています。
HTTPは、ユーザ(Slack)からのリクエストを、「ELB(Application Load Balancer)」で受信してサーバは、該当リクエストを「ELB」からのみ受け付ける設定としています。
受信したリクエストをサーバ側でチェックして、本制度に該当するイベントの場合、GAS側のWebアプリケーションサーバに転送します。

【GAS Webアプリケーション】
URLをユーザに公開せずAWS EC2から転送されたリクエストを処理するようにしています。
処理の際、対象のSlack APIからのリクエストか「検証トークン」、「認証アクセストークン」を確認して、正当なリクエストのみ処理するように設定しています。

                                    <img width="640" height="408" src="https://colors.ambl.co.jp/wp-content/uploads/2020/09/図4-1024x652.png" alt="" />                                          
    <p>また、利用状況や拡張要件等により、「ランニングコスト」の見直し、「スケールアップ」、「スケールアウト」も実施します。<br />下記は一例ですが、要件に合わせて様々な手法を検討しております。

ELB ⇒ Amazon CloudFrontへ変更
EC2パブリックサブネット ⇒ プライベートサブネット変更  +  踏み台サーバ(EC2)設置(作業以外はインスタンス停止)
EC2 ⇒ AWS Lambdaへ変更

バグを防ぐために行ったテスト方法

今回はGoogle Apps Script用のテストライブラリ「GASUnit」(https://github.com/gasunit/GASUnit)を使用し、
Slackから取得したイベントのバリエーションの確認を行いました。
GASはユニットテストのための機能が無く、本来ソースの動作確認は以下手順を踏む必要がありました。
1. GASのプロジェクトをウェブアプリケーションとして公開(デプロイ作業)
2. Slack側でイベントを実行
3. GASのプロジェクト側からStackdriverLoggingを確認
4. 不備があればまた1~3を繰り返す…
GASUnitを使用することで上記手順が不要となり、テストクラスの関数を実行するだけで成功/失敗が判断できるようになっています。

実際に作成したテストクラス

                                    <img width="640" height="466" src="https://colors.ambl.co.jp/wp-content/uploads/2020/09/図1-1024x745.png" alt="" />                                          
    <p>こちらが実際に作成したものです。<br />テスト対象のクラス・関数を指定して実行し、assertにてTRUE/FALSEを判定します。<br />今回行っている比較”assert(tgtCell.getValue() !== beforeVal);”は、テスト実施後にポイントが加算・減算していることを確認しています。<br />テスト用のデータは実際にSlackから連携されるリクエストをString型の変数に設定したものを使用しています。</p>       
                                    <img width="640" height="519" src="https://colors.ambl.co.jp/wp-content/uploads/2020/09/図2-1024x830.png" alt="" />                                          
    <p>↑こんな感じです。</p><h2>テスト実施結果</h2><p>作成したテストクラスの関数「test_checkEvent」を実行すると、各テストケースの結果がログに出力されます。</p>       
                                    <img width="640" height="524" src="https://colors.ambl.co.jp/wp-content/uploads/2020/09/3.png" alt="" />                                           
    <p>成功の場合は上記のようにチェックマークがつきます。失敗の場合はエラーログが表示されます。</p><h2>さいごに</h2><p>このコロナ禍で、コミュニケーションの取り方に変化が生まれ、

評価者や被評価者問わず戸惑っている方も多いかと思います。

この制度を活用し、新しいコミュニケーションツールとするもよし、

自身のポイントを得るためにさらに会社への貢献度を上げるもよし。

また、1年後に導入してどうだったのかというのもご報告いたしますね。

以上、閲覧ありがとうございました。Y.Iでした。