Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

Advent Calendarを25日分続ける技術、あるいは物を発明し素早く作る技術

このエントリははてなエンジニアAdvent Calendar 2023の2024年1月8日の記事です。

昨日はid:handatさんのGitHubでパブリックリポジトリへの誤投稿を防ぐ拡張機能「GitHub Public Repo Alert」の紹介 - handatのdatファイルでした。


id:arthur-1はサーバー監視サービスMackerelの開発チームでアプリケーションエンジニアをしております。

昨年末に開催したMackerel Advent Calendar 2023において、「arthur-1 Mackerel Advent Calendar 2023 マラソン」と称し、一人で25日分記事を投稿することができました。Mackerel開発の裏話を放出したり、ちょっとした便利ツールや実装例を作ってリリースしたり、将来の夢を語ったりしました。

このエントリでは「Advent Calendarを25日分続ける技術、あるいは物を発明し素早く作る技術」と題して、25日分の投稿を実現させた様々な技術についてご紹介します。

周囲を見渡してネタ帳を書く

Advent Calendarを25日分書くにあたって最初の関門が25日分のネタを探すところにあります。私はAdvent Calendarに限らずアウトプットできそうなことが思いついたら手元のネタ帳に書き留めるようにしています。

  • 世の中にまだないけど作れそうなもの
  • プロダクトを良くするためのアイデア
  • 具体的な仕事から得た一般化できそうな知見
  • 技術的に試行錯誤してみた記録

上記に限りませんが、思いついたことは忘れないうちにどこかに記録しておきます。思いついた段階ですでにストーリーがある程度浮かんでいる場合には早速ブログ記事を書いたり、社内のグループウェアでラフな感じに書いたりすることもあります。

自分の仕事の責任範囲が広がると勝手に見える景色も変わってくるし、そこまでしなくても周りの仕事にちょっと首を突っ込んで観察するだけでもネタ探しに役立ちます。また、いろんな意味でオープンな環境で仕事をすることで、自分で捻り出さなくてもネタが見つかると思います。はてなのオープンネスを重視した環境(例えば他のチームのSlackの様子も見られる)がまさに絶好の場です。

論理的思考からアイデアを生む

自分は何かを体系的に学ぶより、モノづくりの過程で学んだことをアウトプットすることが多いです。実際、今回のMackerel Advent Calendarでもさまざまなソフトウェアを作りました。そして、モノづくりにはアイデアが必要不可欠です。

アイデアマンでいるために重要なのが論理的思考(とりわけゼロベース思考)とドメインへの理解だと思っています。

「誰のどのような問題を解決したいのか」という本質だけを固定して思考実験すると、世界には無数の択があることがわかります。すると、固定観念や既存のプロダクトの仕様に引きずられずにアイデアを得ることができるでしょう。そしてそれがまだ世の中(あるいはもう少し狭くして現在のプロダクト)に存在しないものだからこそ、ユニークな情報としてブログのネタにすることができます。

ここで攻めた思考をする際に道を踏み外さないために、ドメインへの十分な理解というガードレールが役に立つと考えています。ユーザーが本当に求めているのは何か、これを解像度高く理解していなければ、本当に突拍子もなく役に立たないアイデアに走ってしまう可能性があります。ドメインへの理解が十分だからこそ、道を離れる(≠踏み外す)ことができるのです。

新しい技術に触れる

枯れた技術に関する情報はネットを検索すると先駆者がいて出てくることが多いです。Advent Calendarで二番煎じなネタに走らないためにも、日頃から新しい技術に触れておくのは大事なことです。

私は仕事以外でも精力的に個人開発をしていますが、そこは自分の庭のようなもので金銭面以外での制約がほとんどないため、積極的に新しい技術を取り入れるようにしています。その結果得た知識をブログなどにアウトプットしています。例えばこのブログでは、Next.js App RouterでのStatic Exportsに疲弊している記事のアクセス数が比較的多いですね。

2023年に自分が新たに触れたのは以下のような技術で、普段のブログやAdvent Calendarではこれらと絡めた投稿を多めにしていました:

  • GraphQL
  • Kubernetes
  • GitOps
  • Next.js App Router
  • OpenTelemetry
  • Slack次世代プラットフォーム

開発からリリースの広い範囲において、自分の鉄板技術を持つ

思いついたアイデアを形にするためのモノづくりに時間がかかっていると、Advent Calendarのスピード感に追いつけません。

私はアプリケーションエンジニアとして仕事をしていますが、アプリケーションを作る(サーバーサイド・フロントエンド)、そしてそれをリリースするまでの一連の技術を一通り触れるようにしています。また、典型的なアプリケーションを作るならこの技術をこのようにして使うというテンプレートを自分の中に持つようにしています。

最近自分がWebアプリケーションを作るとしたら選択する鉄板スタックは以下の通りです:

  • サーバー: Go・go-chi
  • フロント: TypeScript・React
  • CI: GitHub Actions
  • インフラ*1: Terraform・AWS Lambda・API Gateway・Cloudflare Pages

Advent Calendarのために何らかの物を作る際も、新しい挑戦以外の部分では自分の手に馴染む技術をこれまでと同じように利用する(=だいたいコピペでOK)ことで高速に開発・リリースできるようにしています。

隙間家具コーディネート職人になる

これも素早く物を作るためのテクニックなのですが、できる限り自分で手作りしすぎないようにしています。ではどうするかというと、すでに世の中に存在するライブラリや隙間家具OSS*2をうまく繋ぎ合わせて実現できないかをまず考えるようにしています。

例えば以下の記事では、Mackerelでシナリオ監視ができるツールを、runnというシナリオテストツールを組み込むことによって開発しました。本来であればシナリオの記述やテストの実行ロジックをまるまる作らなければならなかったところを、runnのソースコードで公開されている関数をimportすることでサクッと実装することができました。

blog.arthur1.dev

汎用的なライブラリを作ってくださっている人たちのおかげで、自分がアイデアの実現に集中してクリエイティブに活動できるのは本当にありがたいことです。

仕事でも良い文章をたくさん書く

いくらアイデアや制作物があっても、Advent Calendarとしては他者が読む文章にしなくてはなりません。読者に伝わる良い文章を書くために、普段の仕事の経験も活かすことができます。

エンジニアとして自分が良く書いている文章はArchitecture Decision Record(ADR)です。ADRとは、アーキテクチャの決定やその背景・理由などを記録する文書です。Mackerel開発チームでは技術的な決定を行う際にADRを書き、テックリードの確認を受けることになっています。

自分がADRを書く際には、一目読んだだけで何に関するどのような決定かが分かるようなタイトルをつけたり、決定の合理性が他者に伝わるよう簡潔に論理的に記述したりすることを心がけています。

他にも、Mackerelのブログで公開されているリリース告知に対して開発者としてレビューする機会があります。

ここでは、一文が長くなり過ぎないように区切るなど、読みやすい日本語にするための指摘を気付きベースで行っています。また、新機能のターゲットとなるユーザー像を思い浮かべ、その機能で何が嬉しいのかがより伝わりやすいように具体例を提示するといった助言もするようにしています。

こういった業務での経験が、頭の中の思考をAdvent Calendarの記事として書き起こす際にも非常に役立っていると感じます。


雑多に色々書き綴ってしまったのでまとめます。Advent Calendarマラソンのために特化した技術はそこまで必要ではなくて、モノづくりができる人であり続ければその延長線として実現できることなのだと思っています。

これを読んだ皆さんも今年のMackerel……に限らず何かのAdvent Calendarを一人で完走してみませんか?

*1:個人開発なので安さ重視の選定になっています。マネージドRDBはどうするの問題は未解決です

*2:cf.) https://speakerdeck.com/fujiwara3/xi-jian-jia-ju-ossfalsesusume

Recap 2023

もう2024年だよ。

技術

新しく触ったのはこの辺:

  • Prometheus, PromQL
  • OpenTelemetry
  • GraphQL Server
  • Kubernetes

あとはGo言語とかなりお友達になったりAWS SAA認定取ったり。

仕事

グレードが2つ上がった。さよなら新卒ラベル。

エンジニアリングだけではなく物理イベントのお世話もした。イベントオーガナイザーであることもあり音響の技術者であることもありタレントであることもありなので立ち振舞いがむずい。3役はさすがにできない。

ディスカバリーにも関与し始めたところ完全に脳のキャパシティを超えてショートしかかっている状態。瞬発より安定が欲しい。

技術イベント

  • 【オンライン登壇】Hatena Engineer Seminar #23「チームとプロダクトを育てる Mackerel 開発合宿」
  • 【オフライン登壇】YAPC::Kyoto 2023 前日祭 ネコトーストラボ杯争奪東西対抗LTマッチ「新卒エンジニアが1年間で顔を売るために取った行動100連発」
  • 【オンライン登壇】個人開発祭り #2「孤独な個人開発からの脱却: バトグラ技術部への憧憬」
  • 【オンライン登壇】第2回 Slack 活用アワード 決勝プレゼン大会「はてなピアスターで生まれるコミュニケーション」
  • 【司会】Mackerel Meetup #14 Tokyo
  • 【オフライン登壇】Mackerel 徹底使いこなし術 - Mackerel Drink Up #11 Tokyo「仮説検証サイクルでユーザーの声を高速に叶える『キカク組』の取り組み」
  • 【当日スタッフ】SRE NEXT 2023
  • 【オフライン登壇】PHP Conference Japan 2023「学園祭Web開発の現場とPHPのこれまでとこれから──技術選定と教育から語る」
  • 【オフライン登壇】Scalaわいわい勉強会「Scala の好きなところ 難しいところ」
  • 【ブース出展】技術書典 15
  • 【オフライン登壇】Salesforce World Tour Tokyo「感謝を伝え合う社内Slackアプリ『はてなピアスター』の取り組み」
  • 【司会】Mackerel Meetup #15 Tokyo

各詳細は僕がまとめたものより以下の記事に詳しい:

developer.hatenastaff.com

ほか、Mackerel Drink Upにはほぼ顔を出していたし、OpenTelemetry MeetupやPepabo Tech Conferenceなど参加者として行ったイベントもいくつか。ISUCONにも出た。

旅行

京都に6回、大阪に3回行ったらしい。

あとはポケモン世界大会関連で横浜市街に出かけたけど、僕自身横浜市民なので旅行と呼んでいいのか。

ファッション

7年ぶりに金髪に戻った。

ネイルサロンにも行き始めた。指を使う仕事なのでテンション上がるオススメです。

服は下着以外ほぼ買ってない。コスプレも今年はやらなかった。

買い物

blog.arthur1.dev

住居

変化なし。

満員電車が苦痛なので2024年は山手線の内側に引っ越すかもしれない。でも今の家コスパ半端ないので引っ越さないかもしれない。

テーブルゲーム

新規開拓した中重量級ゲームはこの辺り:

  • ブラス・バーミンガム
  • アーク・ノヴァ

ポケモンカードはついにPTCGO・PTCGLではなくリアルでやるようになった。これが2023年の自分の変化で一番デカいまである。

音楽制作

個人名義では全くしなかった。アレンジは少々。

恋愛

void。27歳になったらアイドル辞められると思ってた。

音楽鑑賞

これはまたどこかでブログを書く予定。取り急ぎ、個人的に今年1番だと思う楽曲はこれでした:

www.youtube.com

以下思い出アルバムコーナー

WCS Yokohama、街としての盛り上がり最高でしたね

yakudoかぜよみ

最後?の工大祭

リアルイベントでたくさんお話しました

買ってよかったもの2023

2023年もけっこういい買い物したな〜の記録

マイク SHURE SM7B

買ってよかった: ★★★★☆ (4/5)

今年はトータル8件も登壇していて、うちリモート開催のものもいくつかありました。良い声で聞いてもらえるように良いマイクを買いました。満足はしているんですがちょっと控えめな点数なのは、SM7dBというプリアンプ内蔵の後継機種が今年登場してしまったからですね。どうせ買うならこっちがよかった。

マイクアーム Logicool Blue Compass

買ってよかった: ★★★☆☆ (3/5)

SM7Bを支えるためのマイクアームです。普通に使えるので3点はあるけど気になりポイントがいくつか:

  • しっかりしすぎていて見た目がごつい
  • 設置方向によってBlueというあんまりかっこよくないロゴがデカデカとWebカメラに映り込んでしまう
  • 自分の机が大きすぎるからかアームを最大限伸ばす必要があり、するとSM7Bの重さに耐えきれずマイクが下がり気味になる
  • キャノンケーブルのコネクタとマイクアームの丸い出っ張りが干渉する

オーディオインタフェース YAMAHA AG08

買ってよかった: ★★★★☆ (4/5)

まさにこういう(PCに複数の音声デバイスとして登録され、アプリごと物理フェーダーを割り当てられる)デバイスが欲しいとずっと前から言い続けてきたので本当に嬉しいです!!!めちゃくちゃ便利なのでストリーマーの皆さんぜひ買いましょう。

星5ではない理由は、macOSのドライバが不安定で僕の環境ではよくOSがpanicを起こすこと、そして最新のmacOS Sonomaにまだ対応していないことです。Windowsで使う分には特に困ってません。音仕事はmacですることが多いのでレコーディングに使うにはpanicちょっと怖いかなあ。

スマートフォン Google Pixel 7a

買ってよかった: ★★★★☆ (4/5)

AirDrop便利そうだな〜と横目に見つつ頑なにAndroidを使っています。不満点は電池の持ちがそこまでよくないことぐらい。特に感動体験もないけど安くて動作が安定しているだけで日用道具としては十分でしょう。

store.google.com

キーボード Logicool KX850FT MX MECHANICAL

買ってよかった: ★★★★☆ (4/5)

MXシリーズ待望のメカニカルキーボードです!自分はこれのUS配列バージョンを海外から輸入して使っています。US配列のものも日本のLogicoolブランドで扱ってくれれば良いのですが。これまでのMXシリーズよりゲームでも使いやすくなって最高です。

macOSでもWindowsでも使えるのも魅力なのですが、結局macOSでクラムシェルする際にはTouch IDが使えるMagic Keyboard一択だなと思っており、そこまで重要視しなくてもいいかなと考えつつあります。

なぜかキーキャップが1つすぐ壊れてしまった(かつ破片が穴に詰まったままでキャップ交換も不可)ので星4です。あんまり使わないキーだったから耐えてます。

Webカメラ Logicool Brio C1000s

買ってよかった: ★★★★★ (5/5)

Windows Helloで顔認証でPC開けるの超便利ですね。これだけで価値があります。認証の精度も悪くないと思います。macOSでも顔認証できたらわざわざMagic Keyboard買わなくて済むのですが……これはOSの問題なので仕方なし。

4K撮影もできるのですが、ビデオチャットツールの限界が大体1080pなのと、USB2.0の速度までしか出ないハブ経由で使っているので帯域が足りず試していません。だったら顔認証対応してるWebカメラがELECOMからもっと安く出ているのでそれでよかったのでは?でも4Kはロマン。

寝袋 Bears Rock ねぶくろん

買ってよかった: ★★★★★ (5/5)

これまで友達が泊まりにきた時にペラッペラの寝袋を貸していたのですが、流石にかわいそうになってきたのでいいやつを買いました。自分でも試しに使ってみたのですが、あったかいし寝心地が良いです。

Mackerelのカスタムダッシュボードにグラフアノテーションを表示する機能は如何にして生まれたか

arthur-1 Mackerel Advent Calendar 2023ラソン25日目の記事です。いよいよラストのエントリとなりましたが、特別なことは書かずにこれまでと同じ調子で書きます。

カスタムダッシュボードにグラフアノテーションを表示できるようになりました!

blog.arthur1.dev

上記エントリで頭だしはしていたのですが、カスタムダッシュボードにグラフアノテーションを表示する機能がリリースされました。(Mackerel公式の告知は追ってされると思います。フライングしてすみません。)

今回はMackerelの仮説検証アジャイル開発のMVP(Minimum Viable Product)として実装したこの機能について、どのような思考を経て生まれたのかをご紹介します。

いくつかの機能パターン

Mackerelにはグラフアノテーションという機能があるのですが、これはサービス・ロールグラフの全画面表示やサービス詳細ページでのみ表示・編集ができるものの、カスタムダッシュボードでは表示すらできない状態でした。素早く価値を届けてユーザーの反応を伺うために、編集のことを考えつつもまずは表示だけできる状態でリリースすることを決めました。

表示だけとはいえ、いくつかの機能パターンが考えられます。

  • 全てのグラフウィジェットに対応させるorサービス・ロールグラフだけ対応させる
  • カスタムダッシュボード全体に設定を持つorウィジェットごと設定を持つ
  • 1つのサービス・ロールを指定できるor複数のサービス・ロールを指定できる
  • 設定を永続化するor設定を永続化しない

今回MVPとして以下のような仕様でリリースしました

  • 全てのグラフウィジェットに対応させるorサービス・ロールグラフだけ対応させる
  • カスタムダッシュボード全体に設定を持つorウィジェットごと設定を持つ
  • 1つのサービス・ロールを指定できるor複数のサービス・ロールを指定できる
  • 設定を永続化するor設定を永続化しない

全てのグラフウィジェットに対応する理由

MVPとして、サービスやロールグラフのグラフウィジェットにのみ、それぞれ対応するアノテーションを表示すれば良いという考えもありましたが、棄却しました。これは単純に、ホストグラフや式グラフ・としてラベル対応メトリックのPromQLグラフでグラフアノテーションを表示できないのは不便だと考えたからです。未来のMackerelを想像したときに、新機能であるPromQLグラフのことは見据えておきたいです。

サービス・ロールグラフ以外はサービス・ロールに紐づけるための情報がないため、ユーザーがどのサービス・ロールのグラフアノテーションを表示するかを設定する必要があります。サービス・ロールグラフ以外のウィジェットだけそのように外から指定できるようにしても良いのですが、機能が複雑になると感じました。そこで、全てのグラフウィジェットの種類で統一で、グラフアノテーションを表示したいならサービスやロールを指定する必要があるというインタフェースにしました。

1つだけしかサービス・ロールだけを指定できない理由

将来的にカスタムダッシュボードの画面上からもグラフアノテーションを追加したり編集できたりするようにしたいです。ところが、Mackerelの既存のUIではサービスやロールが1つに定まっていることが前提のデザインになっています。

サービスやロールは選択できず、サービスとロールどちらに紐づけるかのトグルスイッチのみ

新しいUIを作らなければ追加や編集の機能提供ができず時間を要すること、また、仮にたくさんのサービスやロールに紐づくグラフアノテーションを表示したとしても、色分けなどで区別できるようにしたいなど表示においてもデザイン上の懸念があることから、単一のサービス・ロールのみを指定してグラフアノテーションを表示する機能としました。

カスタムダッシュボード全体に設定を持つ理由&設定を永続化しない理由

どのサービス・ロールのグラフアノテーションを表示するかという設定をグラフウィジェットごと個別に持つ方法で提供したいと最初は考えていました。なぜなら、同じダッシュボード上に複数のサービスやロールのグラフを表示するユースケースは多く存在するからです。その場合、ウィジェットの定義に含めることになるので自然と設定が永続化されます。

しかし、1つだけしかサービス・ロールだけを指定できない仕様との相性が悪いと考えました。サービス同士に依存関係がある場合があるため、複数のサービス・ロールを指定したり、あるいは1つしか指定できなくても切り替えたりできるようにしたいです。しかし、前述した通り複数のサービス・ロールを指定しない機能とすることに決めたので、表示する対象のサービス・ロールをスムーズに切り替えられるようにする必要があります。

ウィジェットごと設定を持ってしまうと切り替えが困難になるため、ダッシュボード全体に設定を持ち、これをダッシュボードのヘッダーから簡単に切り替えられるようにしました。

また、デフォルトで特定のサービス・ロールのグラフアノテーションが表示されている状態でダッシュボードを開くことができるよう、この状態をURLのクエリパラメータに持つようにしました。

まとめ

Mackerelの仮説検証アジャイル開発は素早くユーザーに価値ある機能を提供することを目指しています。今回の機能は「素早く」と「価値ある」の両立ができるように、さらにOpenTelemetry(ラベル対応メトリック)が中心となる世界でも通用する機能となるように熟考して作られました。

今後はユーザーの皆さまの反応を見ながらさらに1ステップ進めていくことになります。このUXの延長で編集する機能を追加するかもしれないし、やっぱりウィジェットの設定としてどのサービス・ロールのアノテーションを表示するかを持つ機能にシフトチェンジするかもしれません。また、サービス・ロールを選択するときに、そこにすでにグラフアノテーションが投稿されているかが分かると嬉しいというアイデアもあります。

ぜひMackerelのイベントやSNSなどで本機能について意見をお寄せください!

Mackerel Slackアプリを雑に作ってみる: unfurl編

arthur-1 Mackerel Advent Calendar 2023ラソン24日目・およびSlack Japan Champions Network (JCN) アドベントカレンダー 2023 24日目の記事です。

MackerelとSlackのインテグレーション

Mackerelの通知チャンネルとして、Slackを選択することができます。これはIncoming WebhookのURLを設定する方式になっており、Mackerelでアラート発報などのイベントが起こるとSlackのWebhookにリクエストを送り、結果としてメッセージが投稿されます。

これでも十分便利なのですが、Slackアプリとして提供するともっと良い体験ができるはずだと思っています。例えば、

  • *Mackerelのリンクが貼られたらその情報を展開する
  • Slack上でアラートを閉じられる
  • アラートの状況が変化したらSlackの投稿も変化する
  • 同じアラートに関する通知が1つのスレッドにまとまる

などのことができるようになるでしょう。

今回はお試しとして、「*Mackerelのリンクが貼られたらその情報を展開する」が実現できるSlackアプリを作っていきましょう。

リンクの展開

SlackにURLが貼られたとき、その下にサイトの情報が表示されることがあります。これをリンクの展開(unfurling)と呼びます。

基本はSlackのクローラーかアプリがリクエストを投げて取ってくるのでパブリックなサイトでしか表示できないのですが、Slackアプリを使うとプライベートなサイトのリンクに対しても展開することができるようになります。

api.slack.com

この機能を用いて、Mackerelのアラートのリンクが貼られた時にその情報を展開するようなSlackアプリを作ります。

できたもの

Mackerelのアラートリンクを貼ると展開してくれるSlackアプリが以下のようにできました。

ソースコードGitHubの以下のリポジトリに掲載しています。

github.com

コードの解説

Slackアプリが簡単に作れるBolt for Javascriptフレームワークを用いています。Slackにリンクが貼られたときのイベントをハンドリングするには以下のような関数を作ります。

app.event("link_shared", async ({ event, client, logger }) => {
  // ここにリンクが貼られたときの処理を書く
})

event.linksの中にURLの情報が入っているので、これをパースしてMackerelのアラートのURLかを判定します。MackerelのアラートURLであればURLの最後のパスはアラートIDなので、これを取り出してMackerelのAPIのアラート取得エンドポイントにリクエストを投げます。

const url = new URL(link.url);
const paths = url.pathname.split("/");
const res = await fetch(
  `https://api.mackerelio.com/api/v0/alerts/${paths[4]}`,
  {
    headers: {
      "X-Api-Key": process.env.MACKEREL_API_KEY ?? "",
    },
  }
);
const alert = await res.json();

あとはSlackのchat.unfurl APIにリクエストするclient methhodを呼び出し、先ほど取得したアラート情報から組み立てたLinkUnfurlsというオブジェクトや、情報を付与したい投稿のID(ts: タイムスタンプ)やチャンネルIDを渡します。

const unfurls: LinkUnfurls = {
  [link.url]: {
    blocks: [
      {
        type: "section",
        text: {
          type: "mrkdwn",
          text: alert.status,
        },
      },
    ],
  },
};
client.chat.unfurl({
  ts: event.message_ts,
  channel: event.channel,
  unfurls: unfurls,
});

これでアプリケーションとしては完成ですが、Slack Appとして動かすにはSlack側での設定も必要です。Slackアプリのmanifestファイルを以下に掲載しておきます。

display_information:
  name: Mackerel
features:
  bot_user:
    display_name: Mackerel
    always_online: false
  unfurl_domains:
    - mackerel.io
oauth_config:
  scopes:
    bot:
      - links:read
      - links:write
settings:
  event_subscriptions:
    request_url: ***your_request_url***
    bot_events:
      - link_shared
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false

ポイントはlink_sharedイベントを購読する際にはunfurl_domainsの指定が必要なことです。今回はMackerelのドメインだけを引っ掛けてイベントを送信するようにmackerel.ioと指定しました。

最後に

このようにSlackアプリは簡単に作ることができます。このソースコードを育てて機能を増やすとともに、最終的には認証認可周りも頑張って、ユーザーが各自のワークスペースにインストールするものとして仕上げられたら良いなと思っています。

仮説検証サイクルでユーザーの声を高速に叶える「キカク組」の取り組み

arthur-1 Mackerel Advent Calendar 2023ラソン23日目の記事です。

「キカク組」の取り組みをMackerel Drink Upでお話ししました

2023年9月26日に行われたMackerel Drink Up #11で、私 id:arthur-1 が本エントリタイトルと同じ「仮説検証サイクルでユーザーの声を高速に叶える『キカク組』の取り組み」という題で発表させていただきました。

speakerdeck.com

本エントリはこの発表を少しアップデートした上でブログにまとめたものになります。

Mackerel開発の課題

現在、MackerelチームではOpenTelemetry対応とSAML対応という2本の大きな開発を進めています。チーム内の多くのエンジニアがこちらの大型開発に携わっています。そのため、ユーザーの要望やdogfoodingから生まれた既存の他の課題を解決するためのリソースが限られてしまっている状況です。

エンジニアリソースが限られているからといって、Mackerelの小さな進化を停滞させることはできません。この状況では、様々な課題に対してどの優先順位で取り組み何を作るのかという判断がよりシビアになってきます。やれることが限られているからこそ、何をするかが大事になってくるということです。

これまでMackerelチームにはどんな施策を優先すべきかという数値指標がなく、プロダクトオーナーの判断やそれをサポートするメンバーの助言によって優先順位が決められていました。プロダクトオーナーが単一障害点になる(視座が固定され得る)ことが、何をするかという選択がより重要となる状況において問題になりました。

また、課題を解決するためにとても大きなものを作ろうとするとリリースが停滞してしまいます。開発サイクルでエンジニアが自信を持ってモノづくりに集中できるよう、ディスカバリーの時点で小さく作れる確度の高いネタになっていて欲しいです。

キカク組の始動

ユーザーに価値ある機能を素早く届けることを目指したユニットとして「キカク組」が発足しました。これはエンジニアだけでなくディレクター・プランナー・CRE・セールスなども所属する職種混合ユニットです。仮説検証型アジャイル開発という手法を取り、価値探索とアジャイル開発のサイクルを回し続けています。

価値探索のサイクルでは、要望やすでにリリースした施策の検証結果などをもとにまず仮説を立てます。その仮説の論理的整合性や実現手段の妥当性などを検証・評価して、MVP(Minimal Viable Product)というニーズを満たす最小のプロダクトを特定します。

1つ仮説検証をするにも時間がかかりますから、どのネタから手をつけ始めるかという優先順位としてRICEという指標を導入しました。

www.intercom.com

開発のサイクルでは小さく回しMVPを素早くリリースしてユーザーの反応を伺い、その後の検証に利用します。また、ユーザーの利用状況を検証の材料とすることがよくあるので、利用状況が観測可能な状態にすることも開発の完了条件の1つに盛り込んでいます。

キカク組のエンジニアは何をするのか

キカク組のエンジニアは仮説検証とアジャイル開発両方のサイクルに深く関与しています。

仮説検証のサイクルでは、エンジニア自身もMackerelの利用者であるという目線を活かし、1ユーザーとして企画を持ち込んだり、立案されたソリューションが本当に課題を解決するのか、あるいはMVPとして過大ではないかなどを検査したりしています。

アジャイル開発のサイクルでは、あらゆる技術領域に触れて実際にアイデアをカタチにしています。また、エンジニアでないと設計できないAPIのインタフェースを考えたり、ドキュメントを書いたりしています。さらに、リリースしたモノの利用状況を観測可能にするための実装やデータ基盤への改修も行っています。最近は手戻りを少なくするためにモブプログラミングもはじめました。

半年の振り返り

私はおよそ半年間キカク組エンジニアとして走り続けてきました。率直に言ってとても大変でした。自分がエンジニアとして開発するのはもちろん、ディスカバリーにおいても既存の枠組みから外れて突拍子もないアイデアを考えるのが得意なので、常に両方のサイクルのために頭をフル回転させている状態でした。議論においても「本当にこれでいいんですか?」と声を上げるのは自分が多かった気がします。

開発において検証に使うデータを収集する実装の整備を行ったり、開発を効率化させるためにCIを整えたりしたのは今後にも繋がる良い投資ができたと思っています。ディスカバリーの方でも継続してサイクルを回せるようにしていきたく、例えば特定の個人に依存しないようスキルやナレッジを継承していきたいものです。

来年以降も私はキカク組エンジニアでい続けることになると思います。ユーザーのみなさまにはMackerelのイベント・SNS・CREとのコミュニケーションなどでぜひフィードバックをお寄せくださいますようお願いいたします。私個人に伝えてくださっても構いません。仮説検証においてユーザーの声をとても参考にしています。来年はユーザーの皆さまとのミーティングにも我々キカク組開発エンジニアが同席してお話しできたらと考えています。

25日目のエントリとして、キカク組がMVPとして作りリリースしたとある機能に関する記事を書こうと思います。こちらもお楽しみに。