みなさん、はじめまして!プロダクトエンジニアのkitahiraです。 2022年12月にSmartHRに入社し、基本機能の開発を担当するDチームにジョインしたんですが、いつの間にか半年以上たっていました。早いものですね。
Dチームでは、Google Apps Script(以下GAS)を使った色々なツール達がチームのために仕事をしてくれています。この記事では、それらのツールに対していくつかの改修をして、業務体験がこんな風に良くなったよ〜という話をまとめてみました!
担当表
Dチームでは、スクラムイベントのファシリ・議事録や、その他の定例的な業務を当番制で回しており、その当番表をGoogleスプレッドシート(以下スプシ)で管理してます。
ローテーション表を参照して、GASが自動的に当番表の担当者を埋めてくれるスプシです。便利ですね。
さらに、弊社では全社的にSlackを使っており、その中にDチームのチャンネルがあるのですが、「峠の茶屋」というbotが当番表スプシを参照して、今日の当番を通知してくれます。
素晴らしい仕組みですね。前職ではこんな自動化やってませんでした。というか当番で回す業務があまり無かった気がする...もしかしたら、こういう仕組みが無いと当番業務の導入に心理的ハードルが生じるのかもしれませんね。
で、何が問題なの?
実は、メンテナンス性の面でちょっと問題を抱えていました。
- セルの位置情報がハードコーディングされている
- このスプシを参照するのは、「当番表に担当者を埋める処理」と「峠の茶屋の通知処理」なんですが、どの列にどのタスクの情報が書かれているのか、それぞれのGASのコードに書かれています。
- 実行周期がハードコーディングされている
- タスクごとの、毎日とか毎週水曜日といった実行周期の定義が、「当番表に担当者を埋める処理」のコードに書かれています。
このため、「新しく当番業務を追加したいけど、GASも直さなきゃかぁー・・・」って感じで腰が重くなりがちでした。
改善した!!
ローテーション表をガラッと変えました。
改善ポイントは以下の通りです。
- 担当業務は ◯ をつけるだけでOK
- 担当外す時も行を詰めたりしなくて良くなりました
- 業務を追加してもGASの修正は不要
- GAS側からうまい感じにスプシを探索して動作するように変えました
- 実行周期が単純なものはGASの修正は不要
- 毎日 or 曜日指定 であれば、スプシに書くだけでいい感じに動きます
- 特殊なやつ(チーム横断で当番が回るやつとか)は、引き続きGASで頑張ってます
- 通知の追加文もGASの修正は不要
- 担当業務のメモ的な文面とか、参考資料へのURLなんかを気軽に載せられるようになりました
嬉しい変化
- 新しい当番業務を導入するときの心理的ハードルがだいぶ下がった
- 「じゃあこれ当番で回しましょっか」って気軽に言えるようになりました
- エンジニア以外でもメンテできた
- GASの修正が基本的にいらないので、スプシさえ操作できればOKです
レビュワーの指名
コードレビューってやりますよね。そのレビュワーって、みなさんはどうやって指名しますか?
「レビュワーを自分で決める」というのは、つまり「相手を意図的に選んだ」という認識を相互に持った上でお仕事をお願いすることになるので、それなりに心理的ハードルが大きいと思うんですよね。これ、相互に認識を持っているというのがキモで、「なんで俺なの?って思われたら嫌だなぁ」とかちょっと考えちゃうんです。ありますよね?
で、その心理的ハードルを見事にぶち壊すソリューションが、「ランダムでの指名」です。
相互の認識がどうこうとか書きましたが、私がチームにジョインする前からこれが使われているので経緯を知っているわけでもなく、実はトンチンカンなこと言っているかもしれません。 でも私はこれを見て素晴らしいソリューションだと思ったんです!Slack上で完結しているので、決定プロセスの透明性が高いですね。もちろんお手軽なのも素晴らしい。
あと、発言者自身はリストから除外してくれるとか、指名人数を指定できるとか、地味に賢いです。 便利ですね。
で、何が問題なの?
誰かがお休みとか、あるいは仕事パツってるとか、そういった指名できない状況ってありますよね。
例えばこれは、チームのhoge
さん(仮)がお休みだったある日の出来事です。
レビュワーとして2人アサインするルールなので、お休みのhoge
さんと割当済みのpiyo
さん以外の誰かを引き当てようと奮闘するという不毛な事件が起きました。
私はこれを見てめっちゃ面白かったどうにかしなければと思ったのです。
改善した!!
おなじみ峠の茶屋botに、新たな機能を追加しました。
極めてシンプルな機能で、あらかじめ定義されているメンバー一覧を並び替えて出力するだけです。あとは左から順番にピックアップするなりよしなにどうぞ、という感じ。
おまけ機能として、引数で与えた任意の文字列群をシャッフルすることもできます。
嬉しい変化
- レビュワーの選出を何度もやり直して虚しい思いをする必要がなくなった
- 1回目は
レビュワー
を使って、ダメだったらシャッフル
という使い方が割と観測されてます レビュワー
はメンションも同時にしてくれるのが利点ですね
- 1回目は
- 打ち合わせで「これ、どっちがやる?」「どっちでもいいな...」ってときに、ぐだりそうになったらさっとシャッフル使う流れができた
- どっちでもいいことにお見合いになったりするのって割としんどいので、個人的にかなり嬉しいポイント
空き時間の算出
みなさんはスクラムやってますか?私はSmartHRに入って初めて体験しました。 前職の頃は知識として知っていたものの、1週間スプリントとかやばない?どうやってんの?というのが正直な感想でした。しかし、慣れてみると毎週ある振り返りが「息継ぎ」のように感じられ、いつの間にか安心感・安定感を覚えるようになって驚いたものです。
さて、そんなスクラムには「プランニング」というイベントがあります。次のスプリントの計画を立てるやつです。この際、次のスプリントにどれだけのPBIを投入するかを、全員の空き時間を見て判断するんですが、ここで便利なやつが登場します。
なんと、スプシに書かれたアカウントのGoogleカレンダーを参照して、自動的に「予定が入っていない時間」を集計してくれるんですね!コードレビューの時間や、カレンダー外の雑務時間なんかも入力するといい感じにしてくれます。 こうして算出された空き時間を見て、次のスプリントは何ポイント分やろうか、って話をするわけです。 ぷろぐらみんぐの ちからって すげー!
で、何が問題なの?
とても便利なツールなのですが、運用していく中で2つの問題を抱えていました。
勤務時間のズレ
弊社はフレックスタイム制を導入しているため、人によって勤務時間が異なります。 先述のスプシは、10:00〜19:00の範囲で予定を参照して処理するのですが、例えば私は育児の都合もあり、ジョイン直後から8:30〜17:30が基本的な勤務時間でした。 こうなると、算出結果に対する手直しが必要になります。
ブロック
弊社では、打ち合わせや面接の予定などが、Googleカレンダーの空き時間にヌルっと入れられることが珍しくありません。で、「作業に集中したいからこの時間帯は何も入れないで!」という目的で、「ブロック」と呼ばれる予定をGoogleカレンダーに入れることもあります。 このブロックの時間は、本来はスプリントの空き時間として計上したいのですが、残念ながらそうはなっておらず、こちらも算出後の手直しが必要でした。
改善した!!
以下の機能を追加しました。先述した問題を直接解決する形ですね。
- 勤務時間を指定できる
- デフォルトは10:00-19:00として、そうでないメンバーは個別に勤務時間を指定できます。
ブロック
やblock
の文字列を含む予定を無視する- これらは空き時間として計上されます。
嬉しい変化
- 算出結果とGoogleカレンダーを見比べたり手直しする手間がなくなった
- チームの空き時間の確定が、以前よりもシュッと終わるようになりました
- なんか算出処理が早くなった
- 今回は処理をイチから作り直したのですが、なぜか早くなりました。原因不明...
終わりに
前職はExcel文化であり、GASどころかGoogleスプレッドシートなんかも触る機会もほとんど無かったので、最初はかなり手探り状態で弄ってました。 ただ、こういうチーム内で使うツールとかちまちま作ったり改善したりするのは元々好きで、更にGASは個人的に好きな言語であるJavaScriptの互換言語なので、やっててめちゃ楽しかったです。ちゃんとデバッガもついててすごい。
これらの改修にあたっては、課題感や改善のアイデア考えたり、デプロイがうまくいかず途方にくれているところを助けてもらったりと、チームの皆さんに多くのサポートをいただきました!何より、私が今回やったのは既存のツールの改修であり、そもそも最初にこれらのツールを作って導入してくれた先達あってのことです。感謝ですね! あとChatGPT先生にも大変お世話になりました。こちら、今月のお布施でございます。
今回の記事は、GAS製ツールの改善を中心とした話でしたが、これを通してSmartHRでの開発の様子が少しでも垣間見れたりするといいなぁと思いながら書き綴ってみました。 SmartHRでは絶賛エンジニアを募集中です!カジュアル面談もやってますので、もし興味を持っていただけましたら、お気軽にどうぞ!