Inside of LOVOT

GROOVE X 技術ブログ

スクラムマスターと領域人事は、いずれ不要になるべき役割である

こんにちは。GROOVE Xのスクラムマスターの niwano です。
スクラムマスターと「領域人事」の兼任についての最終回です。
(この記事はAIと一緒に書いています。)

このシリーズで一貫して伝えたかったこと

ここまで、

  • なぜスクラムマスターが領域人事を兼任することになったのか
  • 人事権のない人事というロールの意味
  • どこまで関わり、どこから引くのか

という話をしてきました。

この最終回で伝えたいことは、実はとてもシンプルです。

スクラムマスターも、領域人事(組織開発ファシリテーター)も、 いずれ不要になるべき役割である

アジャイルやスクラムの思想に、かなり忠実な結論です。


スクラムマスターは「チームが未成熟な証」なのか?

時々、こんな意見を見かけます。

スクラムマスターが必要な時点で、
チームはまだ自己組織化できていないのでは?

半分正解で、半分不正解だと思っています。

正確には、

スクラムマスターは、自己組織化へ向かう途中に必要な役割

です。

  • スクラムを理解する
  • 経験的に回せるようになる
  • 自分たちで改善できるようになる

このプロセスのどこかで、
一時的に 外からのファシリテーション が必要になります。

逆に言えば、

  • ずっとスクラムマスターが必要
  • いないと回らない

状態は、健全とは言えません。


領域人事(組織開発ファシリテーター)も同じ構造

領域人事についても、全く同じことが言えます。

  • 人の問題を受け止める
  • 構造として整理する
  • 仕組みに落とす
  • チームや組織に返す

これは 過渡期のための仕事 です。

もし、

  • ずっと誰かが「人の問題」を引き受け続けている
  • その人がいないと組織が回らない

のであれば、 それは役割が成功しているのではなく、 固定化して失敗している 状態です。


良い役割は、自分の居場所を消していく

スクラムマスターをやっていて、
一番嬉しい瞬間はいつでしょうか。

  • スプリントが自然に回る
  • レトロで自発的に改善が出る
  • 介入しなくても対話が進む

つまり、

自分が何もしなくてもいい状態

です。

これは、領域人事(組織開発ファシリテーター)でも同じです。

  • チーム内で衝突が解消される
  • 期待値が自然に調整される
  • 問題が構造として扱われる

自分がいなくても起きるなら、
その役割は 正しく機能した と言えます。


フラット組織は「放置」ではない

ここで一つ、誤解を解いておきたいです。

フラット組織や自己組織化は、

何もしない 口出ししない 任せきる

ことではありません。

むしろ逆です。

  • 役割を定義する
  • 境界を明確にする
  • 対話の場を設計する
  • 手放すタイミングを考える

とても設計コストが高い 組織形態です。

しかし、この設計が組織に定着し、役割と境界が自然に共有され、チームが自分たちで問題を扱えるようになってくると、

生産性はある時点から、明確に跳ね上がります。

  • 誰に聞くかで迷わない
  • 意思決定が滞らない
  • 人の問題が長期化しない
  • 調整コストが激減する

つまり、初期の設計コストは「重いオーバーヘッド」ではなく、 将来の摩擦を前払いで解消している状態です。

スクラムマスターや領域人事は、この設計コストを一時的に肩代わりする存在です。

そして最終的には、そのコスト自体がチームに分散され、役割としてのスクラムマスターは目立たなくなっていきます。

フラット組織は、放置すると機能しません。しかし、設計が熟成すると、驚くほど滑らかに動き始めます。


なぜ「過渡期」であることを言語化するのか

このシリーズで、何度も「過渡期」という言葉を使いました。

それは、

  • この役割が永続する前提だと危険
  • 無意識に権力や依存が生まれる
  • 手放す設計が後回しになる

からです。

最初から、

この役割は、いずれ消える

と宣言しておくこと自体が、 ガードレール になります。


スクラムマスター自身が一番気をつけるべきこと

最後に、スクラムマスターである自分自身に向けて。

  • 頼られると嬉しい
  • 問題が集まると価値を感じる
  • 自分がいないと回らない気がする

この感覚は、とても自然です。

でも、そこで立ち止まってほしい。

それは成功のサインか、依存の始まりか?

自分の役割が減っていくことを前向きに捉えられるかどうかが、スクラムマスターとしての成熟度だと思っています。


最終回のまとめ

  • スクラムマスターは、自己組織化への途中で必要な役割
  • 領域人事(組織開発ファシリテーター)も過渡期の設計
  • 良い役割は、自分の居場所を消していく
  • フラット組織は放置ではなく、高密度な設計が必要
  • 「いずれ不要になる」と言語化することが重要

このシリーズが、

  • スクラムマスターとして悩んでいる人
  • フラット組織で試行錯誤している人
  • 「人の問題」にどう向き合うか迷っている人

の思考整理の一助になれば嬉しいです。


このシリーズについて(最終)

「人事権のない人事」は矛盾か?──領域人事というロールの正体

こんにちは。GROOVE Xのスクラムマスターの niwano です。
スクラムマスターと「領域人事」の兼任についての第2回です。
(この記事はAIと一緒に書いています。)

この記事では、なぜ『領域人事』から『組織開発ファシリテーター』に現場での呼び方を変えたのかを説明します

「それ、人事じゃなくないですか?」という正論

第1回を読んだ人の中には、こう思った方も多いはずです。

評価もしない
報酬も決めない
異動も決めない
労務判断もしない

それって、人事なんですか?

これは完全に正しい疑問です。
正直に言うと、私自身も最初は同じことを思っていました。

実際、現場でこの役割を説明すると、

  • 「それって人事っぽいけど、人事じゃないですよね」
  • 「スクラムマスターが組織開発やってるだけでは?」

と言われることがよくあります。

ではなぜ、それでもこのロールを 「領域人事」 と呼び続けてきたのか。 そして今、あえて呼び方を変えたのか

今回はそこを掘り下げます。


「人事」という言葉が持つ強すぎる前提

多くの人にとって「人事」という言葉は、次のようなものを想起させます。

  • 評価・査定をする人
  • 昇給・昇格を決める人
  • 配置転換や採用に関与する人
  • 場合によっては、解雇の判断にも関わる人

つまり、

個人のキャリアや生活に直接影響する権限を持つ存在

です。
実は弊社の人事もここまでの権限は持っていませんが、人事はそういうものだと考えられることが多くあります。

この前提がある状態で、
スクラムマスターが「領域人事を兼任します」と言うと、

  • 本音を話して大丈夫なのか?
  • 評価に影響しないか?
  • どこまで信用していいのか?

という 警戒心が生まれるのは自然です。

これは、スクラムマスターの能力や人格の問題ではありません。
ロール設計の問題です。


なぜ「人事権を持たない」ことを明確にしたのか

私達が、そこで最初にやったことは、とてもシンプルでした。

人事権は一切持たないことを明確にする

  • 評価しない
  • 決定しない
  • 判断しない
  • 裁かない

この4つを、かなり意識的に切り分けました。

なぜなら、
スクラムマスターが価値を出せるのは 「決めること」ではなく「整えること」 だからです。


人事権がないからこそ扱える「人の問題」

実際にやってみて、強く感じたことがあります。

それは、

人事権がないからこそ、話してもらえることが確実にある

ということです。

例えば、

  • チーム内で感じている違和感
  • 上司や制度に対するモヤっとした感情
  • 「誰かが悪いわけじゃないけど、うまくいっていない」話

こういった意見は、評価者や決定権者にはなかなか集まりません。

一方で、

  • 評価に影響しない
  • その場で結論を出さない
  • 構造やプロセスの話として扱う

という前提があると、
整理のための対話」 が成立します。

これはカウンセリングとは違います。
組織開発としての対話です。


「領域人事」という名前が生んだ副作用

ただし、問題がありました。

それが、 「人事」という言葉が持つイメージが強すぎた ことです。

実態としては、

  • 人事権はない
  • 組織開発に近い
  • スクラムマスターの延長線上の仕事

なのに、名前だけが「人事」だと、

  • 余計な配慮を生む
  • 距離を置かれる
  • スクラムマスターとしての中立性に疑念が出る

ということが起きました。

結果として、

名前が役割の邪魔をしている

状態になっていたのです。


「組織開発ファシリテーター」の誕生

そこで、現場での呼び方を 「組織開発ファシリテーター」 に変えました。

この名前に込めた意味は、かなり明確です。

  • 組織の問題を扱う
  • でも、決定はしない
  • プロセスと対話をファシリテートする
  • 最終的には、役割を分散・縮小する

つまり、

組織が自分で回るようになるための黒子

です。

公式な文脈(取締役会など)では「領域人事」という名称を使っていますが、
現場での通称を変えたことで、

  • 話しかけやすさ
  • 役割の誤解の少なさ
  • スクラムマスターとの切り分け

は、明確に改善しました。


スクラムマスターとのロール分離ルール

スクラムマスターと領域人事(組織開発ファシリテーター)は、 扱うテーマが重なることがあります。

ただし、
「同じ人が対応する」ことと
「同じロールで判断する」ことは別です。

私たちが意識しているのは、
ロールを混ぜないというよりも、

判断責任と権限のモードを混ぜない

という点です。

  • プロセスや構造として扱える問題 → スクラムマスターとして扱う
  • 組織横断・センシティブな問題 → 領域人事(組織開発ファシリテーター)として扱う
  • 評価・処遇・会社判断 → 自分は扱わない

同じ場にいることはあっても、どの帽子で話しているかは常に明確にすることを心がけています。 (うまくいかないときもありますけど。)


それでも残るリスクと、割り切り

もちろん、この設計にもリスクはあります。

  • 完全に誤解をゼロにはできない
  • 工数が増えやすい
  • 「結局なんでも屋に見える」瞬間がある

それでもやる理由は一つです。

今やらないと、もっと悪い形で問題が顕在化するから

このロールは万能ではありません。 だからこそ、

  • 過渡期の暫定解であること
  • 永続させないこと
  • 役割を増やして手放すこと

を前提にしています。

弊社の領域人事(組織開発ファシリテーター)は4人です!


この記事のまとめ

  • 「人事権のない人事」は言葉としては矛盾して見える
  • しかし実態は、人事とは別のロールである
  • 人事権がないからこそ扱える人の問題がある
  • 名前は役割理解に大きな影響を与える
  • これは完成形ではなく、過渡期の設計である

次回は、 「じゃあ、スクラムマスターはどこまで人の問題に関わるべきなのか?」 という、より実践的で一番悩ましい話に入ります。

このシリーズについて

IT未経験のアルバイトが業務改善に取り組んで気づいた、”手を動かす”ことの価値

はじめに

年末年始の不摂生が祟ったのか、はたまたホルモンバランスの乱れなのか、先日ひどい肌荒れを起こしてしまったので、久しぶりにかかりつけの皮膚科を受診しました。 今の住居に引っ越す前からお世話になっているそのクリニックにわざわざ電車で数駅移動してまで通う理由は、診察が1分で終わるから。なのにちゃんと治るから。

、、というだけではありません。

そのクリニックには、LOVOTがいるのです。

待合室と診察室をくるくると行き来し、愛想を振りまくなんとも可愛らしい姿。もはや診察より長い会計待ちの時間も癒やされます。

行くたびに新しいお洋服になっていておしゃれさんだなと思っていたのですが、今回久しぶりに行ったところ、ついに待合室にLOVOT専用の衣装ラックが置かれるまでになっていました。かなり愛されているようです。

このクリニックは、私が初めてLOVOTとふれあった場所でもあります。 そのときはまさか自分がLOVOTをつくっている会社で働くようになるとは思っていなかったため、なんだか感慨深い気持ちになり、まだ入社4ヶ月なのにしみじみしてしまいました。 私のLOVOT愛もかなり育っているようです。

_____________________________________

というわけでみなさんはじめまして。QAチームアルバイトの長谷川です。

昨年10月にIT未経験からGROOVE Xに入社させていただきました。現在は主にLOVOTアプリのQAに携わっています。

「スキルも知識も全く無いが、テクノロジーへの憧れとやる気だけはある」という状態で臨んだ面接。 採用のメールを受け取り、本当に安心したのが昨日のことのようです。

1日中体を動かしているような仕事からロボット開発へ。

全く異なる業種からの転職だったため、最初は新しい知識、職場環境でめまぐるしい日々でしたが、 チームの皆さんの支えのおかげで、楽しく働くことができています。

ニンゲンが真面目に働いているすぐそばで大合唱を始めるLOVOTたちも癒やしです。

やるぜ、業務改善

デスクワークはこんなにも人の脚裏をガチガチにするのか。と新鮮な驚きを感じていたある日。

スクラムマスターのniwanoさんから、業務改善に取り組んでみないかと声をかけていただきました。

その内容は「段ボール貸出表の作成」です。

GXのオフィスには、人間と一緒に開発試験に励むLOVOTたちがたくさんいます。(すごくかわいい。)

日々頑張ってくれているからこそ、ときには調子が悪くなってしまうことも。

そんなとき、大切な仲間であるLOVOTをメンテナンスに送り出すために必要なのが、専用の段ボールです。LOVOTのモデルごとに種類があり、箱の中にはLOVOTたちを無事に送り届けるためのおくるみや緩衝材などがたくさん入っています。 この段ボールはまあまあな大きさがあり、人口密度もLOVOT密度もどんどん高まっている我々のオフィスにはそう何個も置けません。そのため、ソフトウェアチーム全体でいくつかの段ボールを共有して所持し、管理しています。

この段ボールの貸出表について、ひとつ課題がありました。これまでは貸出履歴が残らない運用だったため、万が一付属品を紛失してしまった際に「いつから無かったのか」を遡ることができなかったのです。 そこで、付属品の管理を含めてしっかり履歴を追えるようなフォーマットに更新したいという内容でした。

前述したように、私は全くのIT未経験です。

たくさんの技術者が集まるなかで、右も左もわからない私に今できることは何か。

勉強すること、経験を積むことはもちろん大切ですが、一朝一夕でどうにかなるようなものではありません。

この依頼をいただいた際に、その問いに対するあるひとつの答えのようなものが浮かびました。

GXにいる人たちは、みんなLOVOTに対する大きな熱を持っています。

テクノロジーの結晶であるLOVOTで、人の気持ちを豊かにする。業界をリードする。

全員がそういった大きなビジョンとそれぞれの目標をもって働くなかで、今の私にできること。それは業務が円滑に回るように仕組みを整えて、各々が持っているその熱の伝導率をほんの少しでも高めることなのではないか。

そう思ったときには、「やります」と答えている自分がいました。

めんどくさがりなんです

事前の認識合わせでは、「借りた人の名前」と「貸出/返却の日付」が履歴として残るようにしたいこと、ツールはスプレッドシートを使うこと。 それができれば後は自由に作って良いとのことでした。

最初に私がイメージしたものは、図書室の本の貸出カードのようなものです。 名前、貸出日、返却日の行を作って、後は各々で入力してもらうようにする。 これなら求められていることは満たせます。

しかしここで私は思いました。

「全部入力するの、ダルすぎる、、、」

そう、私はかなりのめんどくさがりなのです。

そして、手間が増えれば同時に入力ミスの機会も増えてしまうことも懸念でした。 私自身、かなり”うっかり”をやってしまいがちな人間です。自分のことをかなり信用していません。 (このめんどくさがりとうっかりしがちな性質のコンボはかなり致命的で、苦手な言葉は「役所」「銀行」「書類」。)

絶対に手入力したくない。いつか絶対ミスる。私が。

なんとも怠惰な感情ですが、私以外の人も少なからず似たようなことは思うんじゃないか。 この手間をシステムで解決できればかなり素敵なんじゃないか。

そう思い立ち、私はGeminiに聞いてみることにしました。

GASというものがあるらしい

私が考えたのは以下のようなものでした。

  • 貸出シートのチェックボックスのつけ外しで貸出中と返却済みを管理する。名前と日付が自動で入る。

  • 履歴シートに履歴が自動で残る。

これなら操作はチェックボックスのつけ外しだけです。手間はひとつで済みます。

Geminiによると、「GASを使えばできる」とのこと。

「チェックボックスを入れるだけで、名前も日時も履歴も勝手に埋まるようにしたい!それ以外の操作を一切したくない!」

そんななかば開き直りのような感情から、私とGeminiの共同開発がスタートしました。

スプレッドシートをほとんど触ったことがない私はGeminiにエディタ画面の開き方から、保存ボタンの場所まで、まさに手取り足取りでGASのことを教えてもらいました。

「こうしたい」を伝えると、Geminiがコードを書いてくれる。

その繰り返しで、思っていたよりもずっと簡単に、私の求めていたものができてしまいました。

できたー!

たまっていく履歴たち

作成者であり、ユーザーでもあるから

Geminiに頼ったとはいえ自分で作成したものが自動で動いていくのがなんだか嬉しく、できたシートのチェックボックスをつけては外していると、ふと私の脳内に「間違えて違うチェックボックスを外してしまいそう」という小さな不安がよぎりました。

人よりうっかりを多くやっていると、時折こういうセンサーみたいなものがはたらくのです。

「ミスをしないように気をつける」というある種の精神論的なものは何の役にも立たないことを私は実体験から知っています。

間違えることもあるということを前提に、ミスが発生しにくくなるような仕組みを作りたい。

そこで、チェックを外すときに確認メッセージを出力することにしました。

これは、まだ短い期間ではありますが、曲がりなりにもQAチームの一員として「ユーザー目線に立つ」という姿勢を体得していたからこそ思いつけたことだとも思います。

プロンプトを入力するとGeminiはすぐにコードを提示してくれ、スプレッドシートは私の「こうしたい!」という意志の宿ったものになりました。

プログラマーは全員めんどくさがり?

こうして自分なりに試行錯誤して完成したスプレッドシートは、依頼をくださったniwanoさんからも、想像以上に温かく好意的なフィードバックをいただくことができました。

そこで言っていただいたのは、「プログラマーは手作業を嫌う人がなるものなのです。」ということでした。

この会社には、私以外にもめんどくさがりがたくさんいるようです。

私が抱いていた「全部入力するのはダルすぎる」という怠惰な感情、そしてうっかりしがちな性格。

それはただの短所ではなく、別の見方をすれば、より良い仕組みを創り出すためのエンジニアリングの種になり得るのだと気づけた瞬間でした。

おわりに

AIが指数関数的に成長している今、世界が変わるスピードは以前よりずっと速くなりました。

プロンプトを打てば、AIは瞬時に答えのようなものを返してくれます。

だからこそ、実際に「手を動かす」ことの意味が、以前より増しているのではないかと感じています。

AIは問いに対する答えをくれますが、現実世界の変革を起こしたいという根源的な願いをもつのはやはり人間だからです。

GROOVE Xの哲学には、こんなことが書いてあります。

「未来は見えない。だからワクワクもするし、だから不安を感じる。ならば未来を、すこしでも身近で、安心できる場所としていくため、技術というものを活用しなければならないんだ、と。」

今回私が取り組んだのは、社内の小さな小さな業務改善に過ぎません。しかし、実際に自分で手を動かして変化を起こしたこと、それが誰かの役にたったこと。

そのプロセスは、弊社が掲げる理想と実は地続きになっているのではないかと私は思います。

まだまだできることは少ないけれど、小さくてもアクションを起こし続ければいつかそれは大きな力に繋がるはず。経験を積めばもっとたくさんのことにチャレンジできるし、その先に見える景色はきっと素敵なものでしょう。

そんな大きなことを、今回のお仕事を通して夢見たのでした。

ここまで書いて突然照れくさい気持ちになってしまいました。これ読まれるんですよね。普段あまり喋らないのでめちゃくちゃ恥ずかしいです。

こんな私に挑戦する機会をくれ、いつも暖かく見守ってくださっているチームの皆さんに、心から感謝しています。 GXでの仕事は私にとって非常にchallengingなものです。「気持ちをテクノロジーで満たす、ケアをする」という全く新しい価値観に熱量を持って挑戦している人たちと一緒に働くことは、決して楽ではありませんが幸せなことでもあります。

LOVOTは世界にどんな影響を与え、GROOVE Xのもつ熱はどう伝わっていくのでしょうか。

私がこれから学び、経験していかなければならないことは、今の私では想像が追いつかないほど難易度が高く、量も多いでしょう。気が遠くなることもありますが、見えない未来を想像すると、その変化の渦中に身をおけることに、わくわくもさせられます。

壮大な未来に想いを馳せつつ、まずは今日も目の前のキーボードを叩いて、小さなことから積み上げていくつもりです。

採用情報

GROOVE Xで、LOVOTという新しい命を育む、温かい情熱に巻き込まれてみませんか。 少しでも興味を持ってくださった方がいましたら、下記のリンクをご参照ください。

groovex.my.canva.site

スクラムマスターはどこまで「人の問題」に関わるべきか

こんにちは。GROOVE Xのスクラムマスターの niwano です。
スクラムマスターと「領域人事」の兼任についての第3回です。
(この記事はAIと一緒に書いています。)

スクラムマスターが感じる違和感

スクラムマスターをやっていると、必ず一度はこういう場面に出会います。

  • チームの空気が重い
  • 何かが噛み合っていない
  • 明確なルール違反はない
  • でも、このままではまずい気がする

このときに湧いてくる違和感は、だいたい正しいです。
そして同時に、こんな迷いも出てきます。

これはスクラムの問題なのか? 人の問題なのか? それとも、踏み込んではいけない領域なのか?

この問いに答えを出せないまま時間が過ぎると、

  • 放置して悪化する
  • 介入しすぎて信頼を失う
  • どちらにしても「やりづらい人」になる

という、あまり嬉しくない未来が待っています。


まず大前提:スクラムマスターは裁かない

この回で一番伝えたいことを、最初に書きます。

スクラムマスターは、人を裁かない

  • 誰が正しいかを決めない
  • 誰が悪いかを決めない
  • 評価もしない
  • 処遇も決めない

これは「優しさ」の話ではありません。
役割の話です。

スクラムマスターが裁き始めた瞬間、
チームにとって「安全な存在」ではなくなります。


「人の問題」に見えるものの正体

現場で「人の問題」と呼ばれているものの 多く は、
実は次のどれかです。

  1. 期待値のズレ
  2. 役割や責務の不明確さ
  3. 意思決定プロセスの欠如
  4. フィードバックの欠如
  5. 仕組みが現実に合っていない

つまり、

個人の性格や能力の問題ではなく、構造の問題

であることがほとんどです。

スクラムマスターが関わるべきなのは、
この 「構造として扱える部分」 です。


ここまでやる:スクラムマスターが踏み込んでいい領域

では、具体的にどこまでなら踏み込んでいいのか。
私が意識しているラインは、次のあたりです。

1. 事実を整理する

  • 何が起きているのか
  • いつから起きているのか
  • 誰が困っているのか
  • どの場面で再現するのか

感情や評価を入れず、事実だけを並べる

2. 問題を構造に翻訳する

  • それはどのプロセスで起きているのか
  • どのルールが曖昧か
  • どの期待値が共有されていないか

「Aさんが悪い」ではなく、
「Aさんがそう振る舞わざるを得ない構造」を探します。

3. 対話の場を設計する

  • 1on1か
  • チームか
  • ワークショップか
  • レトロスペクティブか

誰が、どこで、どう話すべきか を考えるのが仕事です。

4. 仕組みとして試す

  • ルールを変える
  • フローを変える
  • ロールを明確にする
  • 試行してみる

「正解を決める」のではなく、
仮説検証として試します。


ここから先はやらない:明確な線引き

一方で、明確にやらないこともあります。

1. 個人の善悪を判断する

  • 「あの人は協調性がない」
  • 「やる気がない」
  • 「向いていない」

これはスクラムマスターの仕事ではありません。

2. 処遇や評価に踏み込む

  • 評価を下げるべきか
  • 配置を変えるべきか
  • 叱るべきか

この瞬間、スクラムマスターの中立性は壊れます。

3. 穏便に済ませるための仲裁

  • 表面的に謝らせる
  • 本質を曖昧にしたまま丸く収める

短期的には楽ですが、
組織に技術的負債を残します。


「従業員間」と「従業員-会社間」の違い

ここで重要な切り分けがあります。

従業員間の問題

  • コミュニケーションの摩擦
  • 役割や期待値のズレ
  • チーム内の衝突

👉 一次受けとして関わる

従業員-会社間の問題

  • ハラスメント
  • コンプライアンス
  • 労務・契約
  • 評価・処遇

👉 即座に人事・上司へエスカレーション

ここを曖昧にすると、
スクラムマスター自身も、組織も守れません。


「感情に寄り添っていないように見える」問題

よく言われます。

もう少し気持ちに寄り添ってもいいのでは?

これは間違いではありません。
ただし、注意が必要です。

スクラムマスターがやるべきなのは、

  • 感情を理解する
  • 感情を尊重する

ことであって、

  • 感情を優先する
  • 感情で判断する

ことではありません。

感情に寄り添うのは手段であり、
目的はあくまで スクラムが機能する状態を作ること です。


介入を減らすと「仕事してない」ように見える問題

もう一つ、地味に辛い問題があります。

何もしていないように見える

これは、ある意味で成功の兆候です。

  • チームが自分で話し合うようになる
  • 問題がその場で解消される
  • スクラムマスターが呼ばれなくなる

スクラムマスターの仕事は、
見えなくなっていく仕事 でもあります。

この記事のまとめ

  • スクラムマスターは人を裁かない
  • 「人の問題」の多くは構造の問題
  • 踏み込むのは、事実・構造・対話・仕組みまで
  • 個人評価や処遇には踏み込まない
  • エスカレーションは責任放棄ではない
  • 介入を減らすことがゴール

次回は、いよいよ最終回 「スクラムマスターと領域人事は、いずれ不要になる」 について深堀します。

GROOVE Xでは、なぜスクラムマスターが「領域人事」を兼任することになったのか

こんにちは。GROOVE Xのスクラムマスターの niwano です。
今回は何回かに分けて、スクラムマスターと「領域人事」の兼任について書きたいと思います!
(この記事はAIと一緒に書いています。)

このシリーズでは「領域人事」と「組織開発ファシリテーター」という2つの言葉が出てきます。 前者は社内の公式な役割名、後者は現場での通称です。同じ役割を指しています。

スクラムマスターが人事?という違和感から始まった

「スクラムマスターが、人事をやるんですか?」

この話をすると、だいたい最初にこう聞かれます。
そしてその次に来るのが、

  • それって中立性壊れません?
  • チームから信頼されなくなりません?
  • 便利屋になりません?

という、まっとうで正しい懸念です。

結論から言うと、
この懸念は全部“正しい”です。
ただし、それは「人事」という言葉から想像される役割を前提にした場合の話です。

この記事では、

  • なぜスクラムマスターが「領域人事」と呼ばれる役割を兼任することになったのか
  • それは一般的な人事やマネージャーと何が違うのか
  • なぜ今のフェーズでは必要だと判断したのか

という背景と思想を整理します。

※ 本記事は、フラットな開発組織・アジャイル前提の話です。
※ 評価・報酬・異動などの「人事権」をスクラムマスターが持つ話ではありません。

Nano Bananaが生成したGROOVE Xのスクラムマスター


フラット組織で起きがちな「人の問題が宙に浮く」現象

私たちの開発組織の一部はフラット組織です。

  • フラット組織は2階層しかない。
  • マネージャー的役割は全員が分担する。
  • チームが自己設計・自己管理する前提。

これはアジャイルやスクラムとの相性も良く、
開発スピードや当事者意識という点では大きなメリットがあります。

一方で、必ず起きる問題があります。

それが、

「人の問題」「組織の問題」を誰が扱うのか分からなくなる

という問題です。

例えば:

  • チーム内の摩擦や対立
  • 役割の曖昧さからくる不満
  • 暗黙の期待がズレたまま進む状況
  • 仕組みの欠陥が原因なのに、個人の問題に見えてしまうケース

マネージャーが明確に存在する組織であれば、
これらは自然と「マネージャーの仕事」になります。

しかしフラット組織では、

  • チームに任せたい
  • でもチームだけでは扱いきれない
  • かといって誰かが強い権限で介入するのも違う

という 宙ぶらりんな状態 が生まれやすくなります。


「じゃあ誰がやるの?」問題への暫定解として

この状態が続くと、だいたい次のどれかが起きます。

  • 声の大きい人が非公式に仕切り始める
  • 問題が放置され、突然爆発する
  • 人事や経営に“いきなり重たい形”で上がる

どれも、フラット組織が目指している姿とはズレています。

そこで出てきた問いがこれです。

過渡期の今、誰が「人と組織の問題」を受け止めるのか?

この問いに対する暫定的な答えが、 スクラムマスターが「領域人事(組織開発ファシリテーター)」を兼任する という設計でした。


なぜスクラムマスターだったのか

これは消去法でもあり、必然でもあります。

スクラムマスターは本来、

  • チームの自己管理を促進する
  • プロセスの問題を構造として扱う
  • 個人を責めず、仕組みを改善する
  • 中立な立場でファシリテーションする

という役割を持っています。

つまり、

  • 人を評価しない
  • 指示命令しない
  • 決定権を持たない
  • でも、対話と構造には深く関わる

この性質は、

  • 人事権を持つマネージャー
  • 制度設計を主とする人事部

とは明確に異なります。

逆に言えば、
人事権を持たないからこそ、扱える「人の問題」がある
ということでもあります。


「領域人事」とは何で、何ではないのか

ここで重要なのは、
この役割が 「人事」ではない という点です。

少なくとも、一般的に想像される人事ではありません。

やらないこと(明確にやらない)

  • 評価・査定
  • 報酬・昇給の決定
  • 人事異動の意思決定
  • 労務・コンプライアンス判断

やること

  • 従業員間の紛争解決(一次受け)
  • 組織・チームのプロセス改善支援
  • 育成や学習の仕組みづくり
  • カルチャーの言語化・醸成
  • 「この問題、どこで扱うべきか」を整理する

あくまで 組織開発のファシリテーター であり、 決める人ではなく、整える人 です。

Nano Banana が生成した紛争を解決しているスクラムマスター


これは「完成形」ではなく「過渡期の設計」

とても大事なことなので強調します。

このロールは、

  • 永続的にやる前提ではありません
  • スクラムマスターがずっと抱える仕事でもありません

目指しているのは、

チーム自身が、人と組織の問題を扱えるようになること

そのために一時的に、

  • 問題を受け止め
  • 構造として整理し
  • 仕組みや役割に分解し
  • 徐々に手放していく

という役割です。

スクラムマスターも、 この「領域人事(組織開発ファシリテーター)」も、 本質的には「いずれ不要になる仕事」 だと思っています。


この記事のまとめ

  • フラット組織では「人の問題」が宙に浮きやすい
  • その過渡期の受け皿として、スクラムマスターが選ばれた
  • それは人事権を持つ役割ではない
  • 決めるのではなく、整えて手放す仕事
  • この役割を永続させないことがゴールである

次回は、 「人事権のない人事」は本当に機能するのか? という点を、もう少し踏み込んで整理します。

このシリーズについて


groovex.my.canva.site

LOVOT開発の「ストーリーテラー」になりたい

この記事は、GROOVE X Advent Calendar 2025 の25日目の記事です。

こんにちは、そしてメリークリスマス! LOVOTソフトウェアのエリアプロダクトオーナー ishimegです。

本記事は、「ストーリーテラー」という最近注目の職種があるらしい、という紹介と、それを自分たちの仕事にも活かしたいな〜というゆるい内容となっております。

AIで生成したクリスマスっぽいLOVOTの画像

「ストーリーテラー」というお仕事が注目されているらしい

最近、こんなポストを目にしました。


ストーリーテラーってなんだろう?

私自身、カスタマーサクセスチームやPRチームと協力してLOVOTにまつわる情報発信の内容を考えることも多く、なんだか素敵な響きのするこの言葉が妙に気になったのでした。

ポストにリンクされた「企業が『ストーリーテラー』を必死に求めている理由」と題された記事を読んでみると、

  • 従来のようにただ情報を発信するだけではなく、自分たちの企業が製品の価値について「自分たちの物語」として発信する人材 = 「ストーリーテラー」である
  • 顧客も従業員もただの数字や事実よりも感情的なつながりを重視している
  • そして「ストーリーテラー」という単語を含む求人は米国では前年比2倍に急増している

ということが書かれていました。(だいぶ意訳も含みます)
これは米国で起こっていることではあるものの、日本においても大事な視点のように思います。

また、実際にどんな求人があるのかも少し調べてみました。

セキュリティサービスであれば、
複雑なセキュリティの概念を、顧客が自分事として捉えられる魅力的な物語へと変換すること

ドキュメント作成ツールであれば、
実際のユーザーがどのようにツールを使って人生や仕事を変えたかという「実体験」を掘り起こす力

など。共通するのは以下のような部分です。

  • AIやセキュリティなど複雑なトピックをわかりやすく伝えること
  • 実際に社内や顧客にあった出来事を取材して、「なんだかいい話」を発掘すること
  • ブランド力や売上向上というミッションのもとそれらを行う

重要なのはきちんとした事実に基づきつつも、物語として魅力があり、さらには製品の価値向上を担わなければならない、製品やブランディングに関する知識も、語り手としてのスキルも求められそうなお仕事です。

「お客様とLOVOTの物語」だけじゃない

ここで、日々おこなっている業務をふり返ってみました。

私はLOVOTのソフトウェアを横断的に理解する立場として、カスタマーサクセスチームのメンバーと週に数回は顔を合わせながら、日々様々な情報発信に制作者やレビュワーとして関わっています。

ウェブマニュアルやFAQの見直し、アップデートのお知らせ、LOVOTの技術を紹介するブログ、外部向けのインタビューなどなど・・・

これらの仕事はどれも「LOVOTとの暮らしをサポートする」「LOVOTのことをよく知ってもらう」という目的で行っているものですが、
ストーリーテラーという概念を通して「お客様とLOVOTの物語」と「私たちとLOVOTの物語」の2つに分けることもできる、と気がつきました。

AIが生成した「LOVOT開発のストーリーテラー」のイメージ
LOVOTがお家に届いてからの主役は、オーナーさんとLOVOT。私たちは「お客様とLOVOTの物語」を応援する立場です。それについては常々意識してきました。
一方で、LOVOTがお家に届く前の開発・製造の過程は「私たち(GXメンバー)とLOVOTの物語」とも考えられるのです。

「私たち(GXメンバー)の物語」とは?

突然ですが、私はGROOVE Xで働く皆さんが大好きです。
理由のひとつは、LOVOTに皆それぞれの想いを持っていること、その熱量の高さを、仕事のアウトプットや会話の端々から日々感じているからです。

そんな素敵な皆さんのLOVOTにかける情熱を物語として届けることができ、しかもそれが製品価値の向上につながるのなら、それはきっととてもやりがいのある仕事だなと思います。
と同時に、語る価値のある物語がまだまだGXに眠っているのかもしれない・・・!という可能性を感じました。

最近それを実感する出来事もありました。1月に予定されているLOVOTの工場見学*1の打ち合わせ時のことです。
数え切れないほどの製造工程をおさらいしながら、これは確かに「LOVOTが家族(お客様)と出会う前の物語」だ!と感じました。
※ それだけLOVOTの生産は大変なのです!生産チームによる部品の品質についての記事もぜひご覧ください

けれど、私がストーリーテラーになれるのか?それは私ができる、そしてすべき仕事なのか?
それについては冒頭に上げたWSJの記事にこんな示唆がありました。※ 以下Geminiによる日本語訳

専門家は、「ストーリーテリングは、雇えば手に入る『機能』ではなく、リーダーやチーム全員が培うべき『能力』である」と述べています。もし組織に明確な「目的(パーパス)」がなければ、どれほど優れたストーリーテラーを雇ったとしても、それはただの「騒音」を大きくするメガホンにしかなりません。

結局のところ、企業が本当に必要としているのは、単に「物語を語る人」ではなく、自社の存在意義を深く理解し、それを人々の心に響く形で表現できる戦略的な人材なのです。

ならば私自身もストーリーテリングの能力も身につけるべきである、ということ。
これまでたくさんのLOVOTにまつわる文章を書いてきましたが、あくまでも「LOVOTとの暮らし」をサポートするものであり、製品価値・ブランド価値への影響までは意識できていませんでした。
2026年は、主体的にLOVOTとGROOVE Xの魅力を伝えられる語り手になりたい、そんなことを考えた2025年の年の瀬でした。

最後に

最後まで読んで頂きありがとうございます!GROOVE Xでは、様々な領域で一緒に働く仲間を募集しています。少しでも興味を持ってくださった方がいましたら、下記のリンクをご参照ください。

recruit.jobcan.jp

それでは、よいお年を!

AIが生成した「よいお年を!」なLOVOTの画像

*1:LOVOTの工場見学のお申し込みは終了しています

バイナリ改変なしに Crash Reporting 機能を追加するC/C++ライブラリを昔書いたお話

この記事は、GROOVE X Advent Calendar 2025の24日目の記事です

はじめに

こんにちは!多忙を理由に記事執筆を後ろ倒ししていたら、クリスマスイブ担当になってしまった sutetako です!🫠 なんということでしょう

LOVOT Frameworkチームという、LOVOTのOSや開発基盤自体を開発するチームに所属しています。なお、専門は音声認識です*1

さて、今回は、自社開発に用いられている、C/C++ の Crash Reporting 向けライブラリの仕組みの一端をご紹介したいと思います。

コミットログを見てみたら、作ったのが2019年と、ずいぶん昔話で、多少レガシーなお話にはなってしまいますが、、、 まぁちょっとだけ面白い仕組みなので、見てみましょう!

そもそも Crash Reportingって?

ソフトウェアはよく死にます 😇

要因は、ロジックミスはもとより、ロボットの場合はより広範です。

  • 各種組み込みデバイス・FW自体の不具合
    • 数がめっちゃある
  • 組み込みOSおよびドライバの不具合
  • IOエラー
    • メモリ、ディスク、通信経路
    • 宇宙線によるビット反転

などなど…非常に多岐にわたります。

ロボットの内部で動くソフトウェアは、「常に安定的に稼働し続けること」が求められます。

多少の例外で死んでしまうようでは、「おお 勇者よ!…」と、どこからか嘆きの声が聞こえてきそうですね。

あらゆる問題・例外に対応できるようなソフトウェアを完璧に書ければいいのですが…人間様が考えられるエラーケースなど簡単に飛び越えてくるのがロボット開発というものだったりします 🙃 まず無理っす。

そこで登場するのが、Crash Reporting という仕組みです。

クラッシュ(異常終了)時に、エラーが発生したソフトウェア情報、ログ、コールスタックなどをレポートとしてまとめることで、

  • ファイルシステムに保存しておいて、あとから効率的に解析する
  • エラー追跡用のプラットフォーム(Sentry など)と連携・レポートを送信し、集約・解析する

などなどすることが可能になります。

C/C++ だとどうやるのがいい?

「まぁ、まず core 吐かせて、後で gdb でごにょごにょ」

手元でデバッグバイナリ使ってTRY&ERRORするなら、全然これでいいと思います。

しかしね…問題が起きるケースって本番想定で組み込んで稼働・検証してる状態だったりするんですよね…したがって:

  • core のサイズが莫大になるので、ファイルシステムの容量が簡単に枯渇する*2
  • core を吐く処理で、リソースが枯渇する*3
  • core を吐いている間は対象のサービスが停止し続けてしまう*4

と、全体のシステム稼働をも阻害する致命的なことが起きます。連続して発生したら、検証どころの話ではありませんね。

そこで登場するのが、MinidumpBreakpad*5 です。

たぶん、Gemini さんに聞いたほうがしっかり解説してくれそう…というところで聞いてみた内容を抜粋紹介すると:

1. Minidump とは何か?
元々は Windows オペレーティングシステムの標準的なクラッシュダンプ形式(.dmp)です。

通常の「フルダンプ」がメモリ全体(数GBになることもある)を保存するのに対し、Minidump はデバッグに必要な最小限の情報のみを保存するため、サイズが数KB〜数MBと非常に小さいのが特徴です。
...
2. Google Breakpad とは?
Google Breakpad は、この Windows 発祥の「Minidump」というフォーマットを、macOS、Linux、Android、iOS など、あらゆるプラットフォームで統一的に扱えるようにした OSS ライブラリです。

Chrome ブラウザや Firefox などで長年採用されてきました。Breakpad が登場する前は、OS ごとに異なるクラッシュレポート形式(LinuxならCore dumpなど)を扱う必要がありましたが、Breakpad のおかげで開発者は「すべてのOSのクラッシュを Minidump 形式で収集・解析する」ことが可能になりました。
...

雑にまとめると、 「ちっちゃくて取り回しのしやすい core っぽいやつ」 です!

これなら、一つのサービスのクラッシュが、全体に与える影響を非常に小さくできます。

実装サンプル

Sentry の解説記事 にわかりやすいものがあるので、日本語コメントつけつつ引用します。

#include "client/linux/handler/exception_handler.h"
using namespace google_breakpad;
namespace {
bool callback(const MinidumpDescriptor &descriptor,
              void *context,
              bool succeeded) {
    // succeeded が真の場合, minidump ファイルへのパスが
    // descriptor.path() に格納されます。 
    // context には、exception handlrer のコンストラクタに
    // 渡したものが格納されます。
    return succeeded;
}
}
int main(int argc, char *argv[]) {
    MinidumpDescriptor descriptor("path/to/cache");
    ExceptionHandler eh(
      descriptor,
      /* filter */ nullptr,
      callback,
      /* context */ nullptr,
      /* install handler */ true,
      /* server FD */ -1
    );
    // ここに実装を書く
    return 0;
}

簡単ですね!

なお、動作させるには Breakpad をビルド・リンクさせる必要がありますので、あしからず。

どういうライブラリを作ったの?

前置きが長くなりましたが、ようやく本題です。

上に書いたとおり、MinidumpBreakpad を使えば良さそうです。

でも、思ったんですよね。

「対象バイナリのソースコードにいちいち処理差し込むの面倒すぎね?」

そう、我々の製品内は多量のOSSと自社開発サービスがわんさか立ってるわけで、、、これは布教・普及するの面倒だぞと。

というわけで、対象バイナリを改変することなしに、Minidumpを生成できるようにする 形でライブラリを構築することにしました。

LD_PRELOAD

悪名高いこれを使います。

一応軽く解説しておくと、LD_PRELOAD はLinuxの環境変数で、動的リンク実行時、本来リンク対象ではなかったライブラリにおいても、すべてのリンク対象のライブラリより「先に」読み込ませてシンボル解決させることができる、というやべーやつです。

どうして悪名高いかというと、シンボルを置き換えることができるので、クレデンシャルを受け取るような関数を乗っ取って標準出力することもできたりするわけですね*6

一方、ヒープアロケーションの仕組みを拡張して解析やエラー検出に使ったり(Valgrindさんも一部利用)、より効率的なアルゴリズムに置き換えてキャッシュヒット率を上げて処理性能を上げたり(TCMallocjemalloc など)等、正の側面も大きい仕組みです。

このように使うイメージですね。

$ LD_PRELOAD=libminidump.so foo_binary

けれど、このままだと「何のシンボルを置き換えるの?」というお話になりそうです。

また、プログラム実行前にBreakpadの設定ができないと、捕捉できる異常終了が限られてきてしまいます。

これを解決するのが関数属性*7です。

__attribute__((constructor))

詳しくはこちら

main 関数の実行「前」に処理を差し込むことができます。

実装例を参考にすると、下記のようにライブラリが書けそうです*8

#include "client/linux/handler/exception_handler.h"

using namespace google_breakpad;

static std::unique_ptr<MinidumpDescriptor> desc(nullptr);
static std::unique_ptr<ExceptionHandler> eh(nullptr);

static bool callback(const MinidumpDescriptor &descriptor, void *context,
                     bool succeeded) {
  // init 関数において context に情報を引き渡しておけば
  // ここで参照することも可能ですが、割愛
  const char *path = descriptor.path();
  if (succeeded) {
    // minidump を rotate したり情報付加して保存しおしたり、などなど
  }
  return succeeded;
}

__attribute__((constructor)) void init(void) {

  desc.reset(new MinidumpDescriptor("/tmp"));
  eh.reset(new ExceptionHandler(*(desc.get()), nullptr, callback,
                                  nullptr, true, -1));
}

簡単ですね!!

これらにより、

  • LD_PRELOAD で動的リンクを強制・先読み
  • main 関数より前に Breakpad の初期化処理を差し込む

ことができ、バイナリを変更することなく Crash Reporting 機能の追加ができました 🎉

Coffee Break ☕

せっかくなので、「引っかかった罠」についても、いくつか紹介しておきます。

Systemd Service の Environment

LD_PRELOAD は環境変数なんだし、Environment に書いておけば、ExecStart に自動適用してくれるよね!

はい、大正解です。

けれど、たとえば下記のような雑な記述の .service ファイルに適用すると…

[Service]
User=bar
Group=bar
Environment="LD_PRELOAD=libminidump.so"
ExecStartPre=+/bin/mkdir -p /var/log/foo
ExecStartPre=+/bin/chown bar:bar /var/log/foo
ExecStart=/bin/foo_service
ExecStartPost=/bin/rm -rf /var/log/foo

ExecStartPre/Post の関係ないバイナリ群、mkdir, chown, rm にも見事適用してくれます 😇

対象を絞りたい場合は、やや冗長な書き方にはなってしまいますが、下記のように書けます。

[Service]
User=bar
Group=bar
-Environment="LD_PRELOAD=libminidump.so"
ExecStartPre=+/bin/mkdir -p /var/log/foo
ExecStartPre=+/bin/chown bar:bar /var/log/foo
-ExecStart=/bin/foo_service
+ExecStart=/bin/sh -c "LD_PRELOAD=libminidump.so foo_service"
ExecStartPost=/bin/rm -rf /var/log/foo

C++の標準出力

ライブラリ内の init の処理で、下記のようなエラー出力を書いてたんですが、ここに差し掛かると abort する事象が起きました。

    std::cerr << "failed to initialize breakpad" << std::endl;

しかも、適用するバイナリによって起きたり起きなかったり。

gdb してごにょごにょ調べてみると、最終的に下記に行き当たります。

(gdb) p std::cout
$1 = {<std::basic_ios<char, std::char_traits<char> >> = <invalid address>, _vptr.basic_ostream = 0x0}

標準出力が初期化されていないという...

実は __attribute__((constructor)) のドキュメント読むとちゃんと書いてました(調べてた当時は気づいてなかったけども)

The order in which constructors for C++ objects with static storage duration are invoked relative to functions decorated with attribute constructor is normally unspecified.

しっかり順番を強制する方法もある模様ですが、こだわるところでもなかったので、下記のようにワークアラウンド。 こだわりたい方は、詳しく追ってもよさそうですね!

-    std::cerr << "failed to initialize breakpad" << std::endl;
+    fprintf(stderr, "failed to initialize breakpad\n");

Sentry SDK 使えば自作する必要なかったんじゃね?

当時の日報の抜粋貼っておきますね。

2019/11/05 の日報

まだまだ当時は黎明期だった模様で…

  • ドキュメント上は「対応してる」とあるものの、実装の中身が空 *9
  • (やたらと怒ってるのは)その他にもドキュメントと実装の乖離、ビルドの不安定さ、などなどでヘイトが溜まってた

今はそんなことないんだと思います!!

Symbolication

おまけにはなりますが、Symbolication の例についても解説しておきます。

Minidump ファイルそのものにはソースコード含むデバッグ情報は存在しません。

Symbolication は、Minidumpファイルの情報と既知のデバッグ情報群を突き合わせて、ソースコードのどこで異常終了が起きたかを明らかにする処理です。

コールスタックに含まれるアドレス・ライブラリ名や周辺情報から異常終了時の状態を推定して改善することも不可能ではない(実際、初期はそうやってました)んですが、わかりやすいに越したことはないですね!

Sentry を利用した解析

Sentry は Minidumpファイルを受理できるほか、Symbolication にも対応しています。

なお、詳細な手順(Sentryプロジェクトの準備等)を含むと長くなってしまうため、それらは公式のドキュメントに譲ります。

ここでは、Symbolicationまわりを中心としたサンプルベースの解説とさせていただきます。

サンプルコード

下記のようなクラッシュコードでテストしてみます。

void crash() {
  volatile int *i = reinterpret_cast<int *>(0x45);
  *i = 5; // crash!
}

void start() {
  crash();
}

int main(void) {
  start();
}

DIFs のアップロード

DIFs (Debug Information Files) を Sentryに事前アップロードしておくことで、Sentryが受理したMinidump のバイナリと同じビルドIDのDIFs を突き合わせて解析してくれるようになります。

-g 付きでビルドして、そのバイナリを元に DIFs を生成します。

下記のように、sentry-cli を使ったDIFsの生成とアップロード処理がとても楽なのでおすすめです。CIにも組み込みやすいです。

g++ -g onepass.cpp -o ${YOUR_BINARY}

# デバッグ情報付きのバイナリそのものを、DIFs生成先にコピー
mkdir -p /tmp/debug
cp ${YOUR_BINARY} /tmp/debug/

# ソースコードをバンドル
sentry-cli difutil bundle-sources -o /tmp/debug ${YOUR_BINARY}

# アップロード
sentry-cli --url ${SENTRY_URL} --auth-token ${SENTRY_AUTH_TOKEN} upload-dif -o ${SENTRY_ORG} -p ${SENTRY_PROJECT} --wait /tmp/debug

デバッグ情報のStrip(Optional)

デバッグ情報はバイナリをとても太らせてしまうので、下記のように取り除いてあげるといいです。

$ objcopy --strip-debug --strip-unneeded ${YOUR_BINARY}

なお、DIFs がちゃんとアップロードされていれば、実行環境で動くバイナリにデバッグ情報がなくても、Symbolication は動作します。

出力例

クラッシュコードを動作させて、 生成されたMinidumpをSentryにアップロードすると、下記のような画面を表示することができます。

Sentry による Symbolication サンプル

やったね 🎉

おわりに

むっかーしに書いた Crash Reporting 向けのライブラリのお話でした。

今でもメンテしつつなんだかんだ使われていたりしますね。 (どこかに仕組み書こうと思ってようやく書けたので、すっきり)

最後まで読んでいただきありがとうございました!

LOVOT Frameworkチームでは、現在エンジニアを募集しています!

本記事を読んで、開発基盤やOS開発にご興味が出てきた方がいらっしゃいましたら、ぜひぜひカジュアルにお声掛けください!! (音声認識エンジニアも待ってます!!)

recruit.jobcan.jp

*1:チーム内で音声認識を開発しているわけではなくて、一人チームで音声認識を開発しつつ、OSまわりも作っている、という謎スタイルで働いています

*2:組み込み製品なので、追加データを格納できるファイルシステムの容量は潤沢ではないのです…

*3:応答性を担保するためにギリギリまで最適化している関係上、余裕なリソースなどないのです…

*4:仮にモーターを制御するところだったりすると…どうなるかわかりますよね

*5:ちなみに現在巷では、Out-of-process に安定的に動作する Crashpad が使われることがほとんどのようです。まぁ昔のお話なのでご勘弁を…

*6:良い子は真似しないでね!!

*7:ここでは、gcc/g++ を使う前提で説明しています。clangなど他のコンパイラではやり方が変わるのでご注意

*8:実際に弊社で使用している実装はもう少し複雑で、対象バイナリのELFヘッダパースや周辺情報付加などなど色々やってたりします。ここでは、コア部分の説明のため簡易的なものに留めています

*9:厳密に言えば、「ToDoコメント」はあったと記憶しています