yigarashiのブログ

学んだことや考えていることを書きます

段取りとマイクロマネジメントとスクラム

仕事ができるエンジニアはだいたい段取りがうまい。達成したいゴールがあるときに、AとBとCをやる必要があって、Bはわからないことが多いから先にやろうとか、AとCは並行してできるからCを誰かにお願いしようとか、とにかく目標を達成するための道のりをうまく計画できる人が多い。こういう作業をそつなくこなせるかが、ジュニアと一人前を区別する重要な指標のひとつと言える。そしてこの段取りをうまくできない人に対して、細かい計画を立ててあげて指示をするのがマイクロマネジメントだと思う。

スクラムにおけるスプリントプランニングは、この段取りをチームでやると思うとよく腹落ちする。達成したいゴールとしていくつかのプロダクトバックログアイテムを置いて、その達成に必要な作業を半日から1日で終わるサイズのタスクにみんなで分解して、不明点を一緒に洗い出して、どういう順番でやっていくか計画を立てる。まさに段取りだ。これがスクラムがマイクロマネジメント手法だと言われがちな由縁だろう。自分で段取りができてしまうエンジニアからすると、わざわざチームで集まって細切れにしなくても、大きい単位で渡してくれたらいい感じにしまっせ、という気持ちになるのも理解できる。そうした方がリソース効率は上げやすいし自由な感じがする。

こうした方法を取るメリットは大きく2つあると思う。ひとつはマイクロマネジメントを形式的にできることだ。シニアメンバーも含めて一緒に詳細な計画を立てて回ることで、チームの総合的な段取り力を大きく、かつ確実に底上げできる。ジュニアメンバーが多いほど有効に機能するだろう。もうひとつのメリットはフロー効率の最適化をしやすいことだ。ある目的を達成するための作業を、一度バラしてチームのものとして一覧することで、多少コストがかさんでも最速で価値を届けるための方法を見つけやすくなる。

こういう特徴を考えると、急成長しているSaaSの開発なんかとスクラムは非常に相性が良さそうに見える。組織の拡大が早いのでシステムに詳しくないメンバーの割合が高いし、仮説検証による製品発見が重要になるのでフロー効率を上げる必要がある。反対に、一定のスコープを目指して作り切るような仕事をしているチームでは、スクラムによる恩恵は感じにくいかもしれない。インクリメンタルな結果を求められなければ、フロー効率を高める意味もイテレーティブにやる意味も主張しづらい(本来は不確実性を下げたりチームの学習を促すためにやるべきだとは思うが)。シニアメンバーだけでチームが構成されている場合も、スプリントプランニングを簡素化するといったチューニングは検討しても良いだろう。POが期待する成果が出ていれば、細かいやり方に口出しされる筋合いはない。

以上。エンジニアなら誰もがやる段取りという仕草とスクラムを結びつけて、スクラムの性質や向き不向きを議論してみた。

プロダクトの非機能的な改善の工数をどう確保するか

プロダクトの非機能的な改善をビジネスの中でどのように進めるかは、多くのチームが頭を悩ませる課題であると思います。本記事では私が最近考えていることをまとめてみようと思います。主に自社プロダクトの継続開発を想定した議論をします。

前提

まず非機能改善について議論する上で、重要な前提がふたつあると思っています。

ひとつは、我々は常に共通の目標を持っているということです。プロダクトのミッションや期の目標のことです。ビジネスサイドの人もエンジニアも、そうした目標を達成するためにそこにいることに違いはありません。機能開発も非機能的な改善も、見ている時間軸が多少違うことはあれど、この目標を達成するための手段です。それらが一見対立するように見えるのは影響を与える指標が違うからです。

もうひとつは、非機能改善に「やらない」という選択肢はないということです。システムにはデフォルトで滅びる方向に力が加わっています。変更を加えればそれだけ散らかるし、変更をしなくてもライブラリやミドルウェアが古びていきます。競合はより開発効率がよかったり、採用力のある形へとシステムを変えていきます。技術的に変化のないプロダクトからはエンジニアも離れていきます。それらを見過ごせばプロダクトはいつか必ず望まない形で滅びます。プロダクトに未来があるならば、なんらかの形で非機能改善に投資し続けるのが賢い選択です。僕のメンターはよく「税金みたいなもんです」と説明していて、これは僕もお気に入りです。

非機能改善の工数をどう確保するか

以上の前提を踏まえて、以下のようなルールを設けると上手くいくと考えます。

POと開発チームは機能開発の目標についてのみ詳細を約束する。非機能改善については工数の割合だけ合意して、詳細は開発チームに委ねる。

この立て付けに至る思考

私は機能開発と非機能改善の間で優先度を細かく議論することが不毛であると考えます。先に述べた通り、機能開発と非機能開発で影響を与える指標は違います。ユーザーを増やす機能開発のタスクと、変更のリードタイムを小さくする非機能改善のタスクを戦わせるにも、見ている指標が違うのだから判断のしようがありません。いや、正確には議論の余地はあって「変更のリードタイムがN%下がるなら、Mヶ月後にユーザー増加の損益分岐点がくるから今のうちにやりましょう」といったふうにつながることもあるのですが、そこまでやりたいですか?という話です。

にもかかわらず、非機能改善にやらないという選択肢はありません。であれば、それこそ税金を払うように、ソフトウェア開発というのはそういうものだと割り切って一定の工数を開発チームに渡してしまうのが賢いやり方だと考えます。全く違う視点からプロダクトを思っている二者がいるのであれば、素直に工数を分け合ったら良いのです。その取り分については事業のロードマップやシステムの状況をもとにチームで議論しましょう。そこで具体的な取り組み内容に踏み込むと泥沼に逆戻りするので、非機能改善をおおよそ10〜30%くらいの間で適当にキメをするのが良いとは思います。大きなプロジェクトで、見積やチームのベロシティがわかっていればこうした議論の助けになるでしょう。

この立て付けを機能させるポイント

上に述べた立て付けは、言ってしまえば「やることやったからあとは好きにするね?」ということです。開発チームが事業の重要な目標にコミットし、POが必要とする進捗を生み出し続けることが大前提としてあります。ろくに機能もできあがってこないのに非機能改善をやるといわれても、それを了解するのは難しいでしょう。逆に、POも開発チームがプロダクトを良くすることを信頼し、チームのキャパシティを使い切らないように計画を立てる必要があります。事業の目標を中心にして、POと開発チームが信頼関係を構築することが重要だと考えます。

そもそもこうした関係の構築をできないくらい事業上の要請が厳しかったり、チームが組成されていなかったり、システムがレガシー化しているケースも世の中には溢れているはずで、そういった場合はまずそこを改善しなければ議論は前に進まないでしょう。

また、この立て付けを機能させるには、短期的な小さい目標について約束するスタイルが不可欠です。「3年後に目標を達成できたら良いので工数は自由に使ってください」とだけ言われて、非機能改善の工数をコントロールするのは至難の業でしょう。もっとも典型的なソリューションはスクラムにおけるスプリントゴールで、1週間や2週間といった単位で機能開発に関する目標を設定し、残りのキャパシティを非機能改善に回す形を取るのが簡単でしょう。もちろん、こうしたことをやるための大前提として、全てのタスクに一貫した見積もりが入っていて、チームのベロシティが計測されていることが必要です。

この立て付けの欠点

上に述べた立て付けは、POと開発チームの間の摩擦が減り、開発チームが裁量を持てることから、割と良い形だとは思うのですが、欠点もあります。

それは開発チームの性善説に依ってしまう点です。それほど効果や学びのない非機能改善に時間を使い続けるようでは工数の無駄です。開発チームには、裁量と引き換えに、自分たちがやろうとしていることがプロダクトの成長に寄与するか熟慮する責任が生まれます。もし効果の高いタスクが見つからないのなら、進んで工数を戻して機能開発を前進させるようなフォロワーシップを発揮することも期待されます。こうした姿勢をチームとして維持することは簡単ではありません。

まとめ

ソフトウェアの非機能的な改善の工数をどういう立て付けで確保すると良いかについて書きました。私がいまのところ上手くいくと思っているのは、工数の割合だけ合意して、詳細を開発チームの裁量に委ねるやり方です。イテレーティブな開発プロセスの中でPOと開発チームが信頼関係を構築することが重要になるでしょう。「機能開発をすべきか非機能改善をすべきか」はとても難しい問いで、完璧なロジックを立てて采配するのは困難であると思っています。工数の割合という形で近似して素早くキメをして、集中できる環境を作れると良いのではないかというのが現状の見解です。

User Agent文字列を使ったブラウザ判定の事例 2022年版

やむを得ず、User Agent文字列を使って特定のブラウザ向けにJavaScriptの処理を分岐する必要が生まれてしまったので、調査・検討のログを記事にまとめます。

基本的にはバッドプラクティスである

ユーザーエージェント文字列を用いたブラウザーの判定 - HTTP | MDN

まずはMDNがドキュメントを公開しているので読みましょう。要点は以下です。

  • 基本的にUser Agent文字列に基づいて処理を出し分けるのはバッドプラクティス
  • 多くのケースではUser Agent文字列を使うよりも良い手段がある
    • 例えば特定の機能の実装状況に基づく分岐を行いたければそれを直接検出する
  • それでもやむを得ない場合、User Agent文字列からブラウザ名、レンダリングエンジン、バージョン、OS、端末といった情報を取得することができる
    • ただし各ブラウザのUser Agent文字列は嘘をついていることもあり安定した手法ではない

特にChromeではUser Agent文字列の削減を目指しており、User Agent Client Hintsへの移行を進めようとしているようです。

今回わたしが扱った事例では、これらのドキュメントを読んでなお、User Agent文字列を使ったブラウザの判定が(現状は)マシな手段であると考えられたので実装することにしました。

User Agent文字列の厄介な事情

まずはMDNの記事から嫌な文章を抜粋します。

例えば Chrome は、 ChromeSafari の両方の文字列を含みます。ですから Safari を判定するには、 Safari の文字列があって Chrome の文字列がないことを確認する必要がありますし、 Chromium は自分自身を Chrome と報告することがよくあり、 Seamonkey は自分自身を Firefox として報告することが時々あります。

どうしてこんなことになっているのか、わたしは詳しい事情を存じ上げませんが、User Agent文字列を使ったブラウザ判定が筋の悪い行いだという気持ちにはなってきます。特に今回はiOSSafariであることを判定する必要があったので、こうした事情を無視できません。

少し個別のUser Agent文字列を調査してみましょう。例えば、手元のmacOS版のChrome(バージョン102.0.5005.115)のUser Agentは以下のようになっています。確かにSafariという文字列が含まれています。

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36

iOS版のChromeUser Agent in Chrome for iOSによれば以下のようです。注目ポイントとしては、ChromeではなくCriOSとなっていますね。

Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1

Firefoxについても調べてみましょう。FirefoxFirefox ユーザーエージェント文字列リファレンス - HTTP | MDNにてさまざまな環境のUser Agent文字列を一覧しています。iOS版を抜粋してみます。やはりSafariという文字列が含まれています。また、FirefoxではなくFxiOSとなっています。

Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4

このあたりまで調べて、初心者が軽い気持ちで手を出して良い領域ではないと感じました。個別のUser Agentを観測してそれらを網羅するコードを書いたとしても、それに当てはまらないケースが次から次へとやってくる様子が目に浮かびます。

コミュニティに頼る

こうした厄介な問題についてはコミュニティの力を借りたいものです。"npm browser detection"などのキーワードでググっていくといくつかのライブラリを発見することができます。ダウンロード数やGitHubのスター数から以下の2つが特に有望に見えます。

bowserのほうがダウンロード数やスター数は多いですが、最終リリースが2年前(2022/6/26現在)で、issueやpull requestへの応答も滞っていそうなのが不安ポイントではあります。detect-browserのほうは最終リリースが7ヶ月前(2022/6/26現在)でアクティブ度合いはまだ高いかもしれませんが、開発状況は大差ないように見えます。実装やテストをちらっと眺めると、いずれのライブラリも先にChromeFirefoxにマッチするルールを適用して、それらをすり抜けた上でSafariのルールにマッチするならSafariであると判定しているようです。iOS版も考慮されており、わたしがちょっと調査して気になったようなポイントは網羅されているように見えました。

自分でやるよりはずっとマシに思われたので、実績を重視してbowserを利用することにしました。

まとめ

やむをえず行ったUser Agent文字列を使ったブラウザ判定の調査・検討のログをまとめました。User Agent文字列を使ったブラウザ判定は不安定な手法です。今回はOSSに頼るのが一番マシな解であると判断しそのように進めました。非常に嫌な気持ちにさせられる仕事だったので、プラットフォームやブラウザごとの差異がより減っていくこと、やむを得ない場合の標準的な手法が整備されることを願うばかりです。

Four Keysがなぜ重要なのか - 開発チームのパフォーマンスを改善する方法について

ソフトウェアエンジニアとして働き始めて以来、ずっとソフトウェアデリバリーのパフォーマンスに興味を持って、さまざまな改善活動をしてきた。当初はスクラムを中心としたプロセスの改善に注力したが、最近はチームの成熟に伴って技術的なプラクティスに興味が移りつつある。より広い視点からデリバリーについて考えるのは非常に楽しい仕事だ。

デリバリーのパフォーマンスを改善していくには、定量指標として確立されたFour Keysを計測し改善するのが業界標準となりつつある。恥ずかしながら、私はこれまでこのFour Keysが腹落ちせず、積極的に計測してこなかった。しかし、多方面に興味が向いて知識や経験が蓄積するにつれて、猛烈にFour Keysの重要性が腹落ちしてきた。この記事では、現時点における自分のFour Keysに関する理解と解釈を整理してみようと思う。

Four Keysとは

Four Keysとは、ソフトウェアデリバリーのパフォーマンスを示す以下の4つの指標のことである。

  • デプロイの頻度
    • 本番環境へのリリースの頻度
  • 変更のリードタイム
    • commitから本番環境稼働までの所要時間
    • 企画立案などを含む製品開発全体のプロセスに関するリードタイムではない
  • 変更失敗率(変更障害率)
    • これに関しては主要な文献でも定義にブレがある
      • LeanとDevOpsの科学では変更失敗率とし、変更起因による本番での障害に加えて、通常のフローによる追加の修正が必要だった場合などを含めている
      • 以下に記載するGoogle Cloudに投稿された概説では変更障害率とし、変更起因による本番での障害のみが対象のような書き方をしている
    • 本記事ではカバー範囲の広い前者の定義を採用する
  • 平均修復時間
    • 本番環境での障害から回復するまでの平均時間

5分でわかる解説としては以下の記事が鉄板となる。

エリート DevOps チームであることを Four Keys プロジェクトで確認する | Google Cloud Blog

より詳しく知りたい人は以下の書籍を読むと良い。Google Cloudの記事も以下の書籍も由来する研究プロジェクトは同一のものであるはずだ。

LeanとDevOpsの科学[Accelerate] テクノロジーの戦略的活用が組織変革を加速する - インプレスブックス

Four Keysの妥当性

LeanとDevOpsの科学には、Four Keysがなぜデリバリーのパフォーマンスを示す指標として妥当であるか書かれている。主な論旨は以下のようなものであると理解している。

  • Four Keys自体は、LeanとDevOpsの文脈で望ましいとされる像に基づいて、計測しやすい指標をキメ打ちしたものである
  • 4指標に関する回答をクラスタリングすることで、意味のある3つの集団(パフォーマンス高・中・低)に分類できた
  • 上記の3つの集団においてビジネス的な成功(収益やビジョンの実現)に優位な差が見られた

以上のロジックでFour Keysがソフトウェアデリバリーのパフォーマンスを表す意味のある指標であると読んだ(他にも統計学やアンケート調査の文脈で細かい話題はあるようだが、ここでは割愛する)。さらに、Four Keysの改善効果が高いことが確認された24のケイパビリティ(組織が保持する能力)が紹介されている。本書から何かしら示唆を得ようと考える時は、このケイパビリティの一覧から読み始め、関連する章へ進んでいくと上手く読めるのではないかと思う。

Four Keysを掘り下げる

まずはタイトルの問い「Four Keysはなぜ重要なのか」に簡潔に答えるところから始める。

ひとつには、上に述べた通りビジネス上の成功と関連の高い指標であるからだ。ここに疑いの余地はないだろう。

そしてもうひとつ、これは私の考えだが、現代のソフトウェア開発の様々なプラクティスに対して、広く反応しやすい成果指標であるからだ。ソフトウェア設計、アジャイル、DevOps……どの切り口からチームを改善しようと考えても有力な指標として採用できる。逆にFour Keysから始めることで、現代のソフトウェア開発の幅広いプラクティスに目を向けることもできる。まさに「LeanとDevOpsの科学」ということだ。書籍では統計的な有意性や研究としての成り立ちにフォーカスした議論が多く、最初は煙に巻かれてしまったのだが、Four Keysはこれまでソフトウェア開発を良くするとされてきた様々な議論をうまくまとめ上げているのだと思う。これは、LeanとDevOpsの科学で紹介された24ものケイパビリティがFour Keysをよく改善することからも頷ける。

ここからは、Four Keysの各指標について掘り下げつつ、指標を改善する時にどんな話題と関連するか書き下してみようと思う。自分のチームの課題意識に基づいて話題を列挙するので、ミドルパフォーマーとハイパフォーマーの間くらいの環境が対象になることに注意されたい。LeanとDevOpsの科学ではより一般的な内容がカバーされている。

デプロイ頻度

デプロイ頻度を改善していくためには、以下のような領域と向き合うことになるだろう。

  • アジャイル開発プロセス
    • 意味のあるデプロイ回数を増やそうと思うと、ユーザーストーリー単位でタスクを整理し、フロー効率を向上させることが妥当な戦略になる。これは現代的な開発プロセスのプラクティスに他ならない
  • デプロイフロー
    • デプロイ回数を増やすには、デプロイの負荷が小さいことが欠かせない。作業自体がシンプルで短時間で完了すること、またチームが自律的に実行できることが重要になる。技術と組織の両方を改善しなければいけない。この観点を広げてバリューストリーム全体を分析するのも有効だろう
  • フィーチャートグル
    • デプロイしたものが必ずユーザーに見えてしまう環境では、プロジェクトの進行やビジネス上の都合によってデプロイを止めざるを得ないケースが頻発する。スタッフフラグやフィーチャートグルを活用して、できたそばからデプロイして本番で確認できる環境になればデプロイ頻度は上昇していく。ビッグバンリリースを避けるインセンティブを与える点でも正しく機能している
  • スループット
    • デプロイ頻度を増やすためには、デプロイするものがなければどうしようもない。ユーザーストーリー指向で全体のフロー効率を上げていくとは言っても、最後はどれだけ早くコードを書けるかという話になる。以下のような話題が関連するだろう
      • 優れたソフトウェア設計
      • 障害物を排除しやすい環境
      • 各メンバーの成長支援

変更のリードタイム

これはcommitから本番環境稼働までの所要時間のことである。変更のリードタイムについて考えると、デプロイ頻度と似たようなキーワードが思い浮かぶ。先に述べた文献でも、デプロイ頻度と変更のリードタイムは「速さに関する指標」とグルーピングされており、似たようなプラクティスと関連することに違和感はないものの、変更のリードタイムのほうが多少ミクロな効率にフォーカスした概念には見える。特に効果の高いであろう話題としては以下のようなものがある。

  • プロセス面でのプラクティス
    • 作業の適切な分割
      • プルリクエストの単位が小さいければレビューもその修正も素早く完了することができる
    • ペア・モブプログラミング
      • 設計や実装方法について事前に十分な議論と合意があれば、レビューは格段に容易であるし修正作業も少なくなることが期待できる
    • レビューフローの整備
      • レビューを依頼してからレビューされるまでの時間が短ければ、当然リードタイムも短くなる
    • WIP制限
      • チームの全員が3つも4つもタスクを抱えて行き来するようではリードタイムは長くなる。マルチタスクを禁止することで変更のリードタイムは改善するだろう
  • CI/CDの高速化
    • 一回のテストに30分もかかるようでは修正のイテレーションに長い時間がかかってしまうし、デプロイに何時間もかかるようでは当然そのぶんリードタイムも伸びる。短縮した分がダイレクトにリードタイムに反映される

この指標を突き詰めていくと、コンパクトな変更をコミットしてレビュー依頼、その場でレビューが返ってきて修正してマージ、そのままボタンひとつでデプロイして、本番で動作確認をしてタスク完了!というテンポで仕事ができるようになっていくのだろう。

変更失敗率

このあたりからピンと来なくなる人が多いように思う。少なくとも私はそうだった。以下にLeanとDevOpsの科学から定義をそのまま引用する。

主要なアプリケーションやサービスに施した変更のうち、サービス低下を招いたケースや修正作業が必要となったケース(サービス機能の障害や稼働停止を招いてしまったケースや、ホットフィックス、ロールバック、フィックスフォワード[事態改善のために通常の手順を踏んだ修正])、パッチが必要となったケースの発生率

この定義を「意図通り動くコードを一発で書けてるか?」と言い換えても、概ね意図は取り違えていないと思う。このくらい噛み砕いてみると変更失敗率から以下のようなキーワードが思い浮かぶ。

  • ソフトウェア設計
    • 理解しやすく変更しやすいシステムであるほどバグを埋め込む可能性は減る。大きくは、クリーンアーキテクチャ、DDD、マイクロサービスアーキテクチャといったキーワードが想起される。この数行ではとても語りきれない広大な領域である
  • テスト
    • テストを適切に行えれば開発の段階でバグを発見できる可能性が高い
  • 各メンバーの成長支援
    • 使用している技術やドメインをよく理解していれば、実装とレビューの段階で正しいコードを生み出せる可能性が高い。広くはパフォーマンスやキャパシティプランニングといった話題もここに含まれるだろう。そうした観点を自律的に盛り込んでシステムを変更できるようになると変更は失敗しづらくなるはずだ

先に述べた文献では、変更失敗率は「安定性に関する指標」であるとされているが、個人的にはこれも「速さに関する指標」と捉えた方が腹落ちしやすいように感じている。例えば、変更のリードタイムがそのままでも、変更失敗率が下がれば価値提供のスピードは上がる。逆に、変更のリードタイムを上げるために適当な計画でコードを書き、変更失敗率が上がった場合、全体としては価値の提供速度が改善していない(なんなら悪化するかもしれない)。難しいことを考えずに、意図通り動くコードを、一発で、素早く書き上げるのが一番早いということだ。この主張は、Four Keysで分類した時のハイパフォーマーが、4つの指標全てにおいて抜きん出ているという事実とも整合するように思う。つまりFour Keysにトレードオフを見出すのではなく、黙って全部改善するという姿勢がハイパフォーマーへの道を切り開くということだ。

平均修復時間

これは本番環境での障害から回復するまでの時間のことである。障害からの回復では以下のようなキーワードを思いつく。他の3指標に比べてOps領域の話題が多い。

  • 障害対応の体制
    • チームとして障害対応の訓練がよく行われていれば、それだけうまく対応できる可能性は高まる
    • オンコール体制や深夜当番などが整備されていれば、早く障害から復旧できる可能性が高まる。一方でサービスに求められる信頼性によっては、こうした体勢まで整える必要はないかもしれない。このあたりを建設的に議論しようとするとSREingに話が広がっていくだろう
  • エンジニアリングプラクティス
    • Observability(可観測性)
      • システムのふるまいが外部から観測しやすいほど、障害の発見と原因の特定が素早く行える。ひとことで片付けてしまったが、ここを掘り下げると、ログ、メトリック、モニタリング、トレーシングといった広大な領域が広がっている
    • ロールバック
      • 変更に起因する障害であれば原因は明らかなので、ロールバック機構が成熟しているほど修復時間は短くなる。これは単純に可用性や信頼性に寄与する項目だ
    • 冪等性
      • 障害で処理が失敗した場合に、再送するだけで容易に復旧できるロジックになっていると修復時間は短くなる

変更失敗率と同様に、平均修復時間も「安定性に関する指標」とされているが、これも「速さに関する指標」と捉えた方が腹落ちしやすい印象がある。まず単純に、障害から早く復旧すればそれだけ早く普段の開発に戻ることができる。障害が起こるたびに全員で丸一日対処しているチームと、気づいた人が小一時間で直せるチームだったら、どう考えても後者の方が価値提供に時間を使える。また、これは実際に運用に携わる人なら納得してもらえると思うのだが、障害の復旧は難しいことが多い。直近の変更に起因しない障害は特にだ。そうした状況を素早く解決する能力は、間違いなく他の価値提供も加速する。例えばObservabilityは運用に限らず、日常的な開発におけるデバッグや動作確認においても極めて有用だ。また、そうした技術スキルの習熟が起こる組織文化は、他の指標を含めたデリバリーのパフォーマンス全体に良い影響を与えるだろう。

まとめ

本記事では、ソフトウェアデリバリーのパフォーマンスを表す指標であるFour Keysについて、その定義と重要性を掘り下げた。特に、Four Keysが現代のソフトウェア開発における様々なプラクティスに反応する優れた指標であるという気づきをベースに、各指標の掘り下げを行った。また、一見すると安定性に関する指標に見える「変更失敗率」と「平均修復時間」は、いずれも速度とも強い関連性を見出せる指標であることを議論した。LeanとDevOpsの科学に現れるハイパフォーマーがFour Keys全てで抜きん出ている事実を鑑みて、4つの指標の間にトレードオフを見出さず、全てを改善する姿勢がハイパフォーマーへの道となるだろう。

ここまで言語化をしたなら、あとは計測して改善するだけである。こうした指標を正確に計測するのは悩みの種となるが、幸いにもいくつか選択肢がある。まず冒頭に記載したGoogle Cloudの記事中では、Google Cloud上に構築する「Four Keysパイプライン」が紹介されている。自社で分析基盤をメンテナンスしていく体力があるのなら有力な選択肢となるだろう。また、GitHub等のデータを解析することでエンジニアリング組織の生産性を可視化するFindy Teamsでも、Four Keysへの対応が着実に進んでいる(弊チームでもかなりお世話になっているので宣伝です😉)。他にも、インターネット上には各社が独自に分析基盤を整えたレポートがいくつもあり、それらも参考になるだろう。

Four Keysを計測、改善して、最高のハイパフォーマンスチームを作っていこう。

スキルマップに採用する予定の技術も書いてみている

スキルマップとは

スキルマップは、チームで使っている技術を各メンバーがどのくらい習得しているかを集計したものです。スプレッドシートで表を書いてメンテナンスしているチームが多いのではないかと思います。このアクティビティのメリットは以下のようなものがあります。

  • チームで属人化している領域を可視化できる
  • チームが使っている技術を一覧する機会になる
  • 各メンバーの能力開発の資料になる

スキルマップはいまつかっている技術を一覧するのが一般的ですが、今回はそこに未来の話も混ぜてみているという話です。

問題意識

こうした発想に至る問題意識は大きく分けてふたつあります。

ひとつは、いま使っている技術だけを見ていると、メンバーのスキルビルドの道筋が難しいことが挙げられます。特に長く運用されているサービスでは、どうしても技術の新陳代謝のスピードに限界があり、スキルマップに一世代前の技術が並んでしまうことが多いと思います(わたしのチームではそうです)。そうした技術のみを対象にモチベーションを上げていくのは難しいですし、メンバーのキャリアの観点でも習得のメリットが小さいです。一方で、スキルマップを気にせず自分が好きな技術を勉強しようと言ってうまく進められる人もそれほど多くありません。仕事とキャリア観点でのスキルビルドのモチベーションを近づけていきたいものです。

もうひとつは、新しい技術を取り入れていくにしても、チームに詳しい人がいないと話が進まないということです。世間的なデファクトの変化や会社レベルでの標準化といった力によって、「〇〇を廃止してXXを導入するぞ!」という気運が生まれることはよくありますが、誰も新しいほうの技術のことを知らなければ、本当に導入できるのか、導入して効果があるのか判断することすら困難です。本気でやるならチームでしっかり学習の時間を取るのが正道とは思いますが、最初から詳しい人がいる方が当然スピードは出ます。

本題

こうした問題意識から、スキルマップに採用する予定の技術も書いてみることにしました。記述する項目は、会社全体の流れや世の中での普及具合を踏まえて確度の高い数個に絞りました。いまのところ、一度スキルマップを埋めてみて、未来のコーナーで×とか△ばっかりつくのを見てみんなでケラケラ笑ったくらいなので、明確な成果がある施策というわけではないのですが、自分のロールとして発すべきメッセージを伝える機会にはなったのでじわじわ効くと良いなと思っています。

メンターとしては、向上心だけがあって何をしたら良いかわからない時のネタを伝えることができました。意外とこういうところで苦しんで迷走する人はいる印象なので、何か助けになれば良いなと思います。

テックリードとしては、各項目の説明を通してシステムの未来像を語ったり、全社の戦略を代弁することができました。例えば、この技術はこういうもので〇〇のコンポーネントを置き換えると改善するはず……とか、いま全社横断でこういう取り組みが進んでいて、この技術を使うとそれに相乗りできてレバレッジが効くんですとか、そういった話です。こういう話をする場をわざわざ持つのは意外と難しいので、面白い機会だったと思います。そうした話をきっかけに中長期的に詳しい人が増えたら儲け物です(もちろん自分でも勉強しますが……)。

そんなにコストのかかる施策ではないですし、雑談のネタになって面白いと思うので良かったらお試しください。