ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

2023年前半に読んで特によかった本

今年の前半6か月で読んだ本のうち、お気に入りのものを紹介します。
読んだ後時間が経つとどんどん書く気がなくなるので、その時点でツイートに吐き出したものをまとめ直しております。

なお、前回分はこれ。 www.kzsuzuki.com

IT技術系

アジャイルメトリクス

開発方法論がウォーターフォールからアジャイルになったからといって、メトリクスが本質的に変わることなんてあるのだろうか?と思いながら読みました。
結果としては、たぶんYES。最近よく「ソフトウェアの品質とは何か」という哲学質問をTwitterで見かけますが、この本を通じて、自分なりの考えをだいぶ再定義できたように思います。それを吐き出したのが、この記事です。

www.kzsuzuki.com

またこの本は、単に「こんなメトリクスがあるよ」と列挙するものではなく、どのようなツールで計測を自動化し、その結果をどう生かすかということにもたくさんの紙面を割いています。
実はまだ、第8章『ソフトウェア品質を測定する』とその周辺しか読めていないので、下期ちゃんと読みます。。

ビジネス系

解像度を上げる

思考や情報を広げる・狭める・深堀りする・網羅する・・・
こういった「思考の構造化」をどのように行うのかを構造化して説明した本(メタ)。ロジカルシンキングもこの構造の一部として位置づけられるような気がしています。

実はまだ、さっと一読しかできていないのだけれど、何度も読み返して自分の思考の訓練に使えるようにしておきたいと感じました。若いうちに出会えたらもっとよかったなあ。

ビジネスの名著を読む〔マネジメント編〕

「ビジネスの名著を20冊、ぎゅっと1冊に濃縮しました!」というと、「はいはい、ファスト教養ファスト教養」って色眼鏡で見てしまうのですが、栄養もめちゃくちゃある本でした。
ビジネスにおいて誰でも聞いたことがあるようなコンセプト・フレームワークが当時どう語られ、今どのような意味をもつのかということを知ることができます。もちろん原著をしっかり読み込むのが一番なのかもしれませんが、概要+アルファを理解するのにありがたい選択肢です。

この本で扱っている本のうち、『小倉昌男 経営学』で言及されている論文の話が面白かった。
ロケットの打ち上げにおいて、成功と失敗の数が、新しい打ち上げの成功にどういう影響を与えるかを調べたものです。
結果は以下とのこと。

①成功体験も失敗体験も、その後の成功確率を上げる。経験はプラスに働くといえる。
②成功経験と失敗経験の効果の強さを調べると、その後の成功をより高めるのは、失敗経験の方である。
③失敗経験が乏しいまま、成功だけを重ねてしまうと、むしろその後は失敗確立の方が高まっていく。

「うまく失敗する」「小さく素早く失敗する」ことがいかに大事かという問いへの、強力な示唆だと思います。

『グローバル×AI翻訳時代の新・日本語練習帳』

「自分の日本語をAI翻訳で適切に翻訳してもらうには」という切り口で始まります。 PART1の最初で紹介される2つのtipsが「必ず主語を書く」「目的語をちゃんと書く」なんですよ。日本語どんだけ省略するのよっていう。

前半でこのような個別的なテクニックについて語り、後半は伝わりやすい文章構成、異文化コミュニケーションで注意すべき点などがまとまっています。「自分の意図を正しく伝えるには」ってのが本書のテーマで、その1つが「AIの翻訳に耐える文章」ということですね。

ノンフィクション・エッセイ

科学オモテウラ大事典

ポピュラーサイエンス好きにお勧めの一冊。1つのテーマをトピック2つセットで読むという面白い構成。
核分裂と原子爆弾、イオンとマイナスイオン、エジソンとテスラ、・・・みたいな、「科学の光と闇」「技術の裏にあるドロドロ人間模様」的オモテウラもあれば、使い捨てカイロと冷却パック、ミトコンドリア・イブとY染色体・アダム、みたいなオモテウラもあり、楽しく読めます。

気に入ったエピソードの1つが、アルキメデスのてこの話。
「棒と支点と足場を与えてくれれば、地球でも動かしてみせる」というエピソードだけれど、その3つがそろっていたとしても、1017 kmの長さを棒を使って地球を1mm動かすには19兆年かかるという計算なんだと。そういう計算をしてしまうのが好き。

フィクション

アーモンド

中二の長男に勧められて読んだ本。こども向けかな~と思いきや、いい意味で裏切られました。
喜怒哀楽を感じることのできない主人公が、自分に興味を抱く異性や、暴力でしか自分を表現することのできない少年と出会って、奇妙な関わり合いを過ごしていく話。説明しづらいのだけれど、とてもよかった。
情緒に特異性があるという点で、『アルジャーノンに花束を』を思い出した。本棚に眠っているな・・・。

漫画

中年どまんなかになってくると、「夢を持った若者の挑戦と挫折」にめっちゃ弱くなりますよね。
その中でも「舞台に立つ」系の作品は、ままならないもどかしさにこちらも泣けてきます。前回の記事で紹介した『ピアノの森』のサブ主人公の劣等感だったり、(アニメしか観ていませんが)『ぼっち・ざ・ろっく』の結束バンドによる超アウェイなライブだったり・・・。

べしゃり暮らし

「学園の爆笑王」を名乗り、誰よりも自分が面白いと思っている主人公が、漫才出身の転校生に出会って、漫才の道を進んでいく話。
森田先生の作品は『ろくでなしブルース』しか読んだことがなく(なので吉祥寺(ジョージ)は怖い街だと思っている)、何となく食わず嫌いだったのですが、『べしゃり暮らし』は素晴らしい作品でした。「人間模様」というと本当にありきたりな言葉なのですが、漫才に関わる登場人物たちの喜びと、野心・苦悩・葛藤が丁寧に描かれ、わたしたち中年こそが読む話、と感じました(少年ジャンプでの連載だけど。。)。

ランウェイで笑って

『ランウェイで笑って』も良かったですね。
幼い頃からパリコレモデルを夢見続けているが身長が足りない女子と、ファッションデザイナーを志すも家庭の経済状態に阻まれる男子が、お互い支え合ったりライバルになったりしながら成長していくお話です。

何だか著者の画力が急速に爆上がりしていって、見開きが映える映える。デザインした服やモデルのすごさの表現が、後半は能力者バトルみたいな描写になっていて最高でした。

あとい全然青春じゃないですが、『ジャンケットバンク』というギャンブルマンガが面白いです。

「銀行が賭場を仕切っていて、銀行を亡ぼすギャンブラーを討つ」みたいな設定がだいぶ荒唐無稽なのと、ギャンブラー同士だけでなく銀行員もバトルに巻き込まれていくところから、『嘘喰い』の亜種か?と思ったのですが、ギャンブルの内容と勝負が目新しく、今後が楽しみです。

・・・マンガは用法容量を守りましょう。

「追随」パラダイムにおける「テストの十分性」メトリクス #全力ポエム

不意にブログオラクルが降りてきたので、書き殴っておきます。

「距離」パラダイムと「追随」パラダイム

先日のブログ記事で、こんなことを書きました。

www.kzsuzuki.com

ユーザ要求の変化に追随する能力が、アジャイル開発における品質のメトリクスの1つとなる。

従来型の品質メトリクスって、「理想と現実がどれだけ離れているか」を測ろうとするものなんですよね。
たとえば「プログラムに含まれる欠陥の数は、ソースコード行数におおよそ比例する」というシンプルな仮定のもと、「欠陥密度」というメトリクスがある。その密度には一定の目指すべき値があって、その値を達成すれば十分な品質と見なすことができる、みたいな感じですね。

で、わたしもその「理想と現実の距離」パラダイムに浸かっているので、アジャイル開発における品質メトリクスに見られる「変化への追随」パラダイムに、最初はすごく違和感を覚えていました。

「テストの十分性」という難物

そんな時に、テスト業界三大難問の1つ・「テストの十分性」*1についても同じことが言えるのではないかと、ふと思いました。

「距離」パラダイムだと、ある時点において「テストが十分と言える値」があり、そこを目指そうということになります。
「テストケース密度」というメトリクスは、その代表です。プログラムの規模単位あたりのテストケース数で、十分性の代替指標としている。

では、「追随」パラダイムにおける「テストの十分性」メトリクスには、どんなものが考えられるでしょうか。
ぱっと思いつくものを、3つ書いてみます。

(1)リグレッションテストの自動化率

機能追加や仕様変更に伴ってテストケースが追加・修正されると、手動テストケース数が増え、自動化率を低下させることがあります。そのテストケースを迅速に自動化し、自動リグレッションテスト実行の仕組みに組み込み、安定的に流せるという能力は、「テストの十分性」の代替指標になりえます。

ただし、Garbage In, Garbage Outと呼ばれるように、元のテストケースの質が低ければ、自動化したところで質は低いままですが。

(2)「意図せず見つけた」欠陥の割合の減少

開発中に見つかる欠陥のすべてが、テストケースで意図して見つけようとしたものとは限りませんよね。全然違うテストの実行中だったり、なんならテスト環境構築中に見つかる欠陥だってあります。
もちろん、その手の欠陥を見つけられたのはラッキーだし、目ざとく拾ってくれたメンバーには感謝!なのですが、幸運だけに頼るのは心もとない。

その偶然見つけた欠陥が、自分たちの持っているテストセットでは検出できなかったとわかった場合は、どのようなテスト観点・テストケースが漏れていたのかを逆算し、必要に応じてテストセットに組み込んでいくのがよいでしょう。
これを繰り返していくと、「意図せず見つけた」欠陥の割合が安定して減っていくことが期待できます。この減少具合は、テストの十分性が改善できている指標と言えそうです。

もちろん、機能追加などに伴ってテスト対象が増えると、一時的に「意図せず見つけた」欠陥の割合は悪化する可能性があります。この推移を観察するのは、けっこう面白そうじゃないですか?*2

(3)リグレッションテストでの欠陥の流出率の改善

流出率はたとえば、 リグレッションテストで検出できた欠陥と、流出させてしまった欠陥の比率 のように算出するイメージ。
リグレッションテストで可能な限り(いわゆる)デグレを検出したいので、流出率が低くなっていくのは「十分性」が成長していると言える、気がする。

ただ、リグレッションテストは多ければ多いほど良いというわけでもないので、リグレッションテストが「必要十分」な数であることも把握できるといいですね。これはまた別のメトリクスになるでしょう。

いかがでしたか? いかがでしたか? いかがでしたか?

あまり深く考えずに書いている(言い訳が多い)ので、すでにバッドプラクティスだとわかっているようなことを主張していたら、教えてください。

「十分な数」のキャンディを数える少年と少女 generated by Midjourney

*1:あと2つは知りません。誰か提案してください。

*2:分析の手間だけでなく、バグチケット起票の際の手間という副作用があります。

「アジャイルテストの4象限」に対するアンチテーゼ・「The Agile Rapid Testing Ecosystem」

「アジャイルテストの4象限」についてのやりとりをTwitterでみていて、James Bach、Michael Boltonの両氏が何年か前に公開していた『The New Agile Testing Quadrants』という資料を読み直してみました。

www.slideshare.net

今Twitterで話題になっているのは全然違う文脈ですが、この記事では彼らの批判と提案について紹介します。

作者について

JamesとMichaelのお二人は、『Exploratory Testing 3.0』(探索的テスト3.0)という記事*1を書かれた方でもあります。
この記事では、「探索的テストと明文化されたテストがあるという区分け自体がおかしくて、テストというのは本質的に『探索的』なんだ」という主張をされています。

www.satisfice.com

また、Jamesが所属している「Context Driven Testing」というコミュニティ(?)では、ソフトウェアテストについての国際規格であるISO/IEC/IEEE 29119に対する抵抗運動をしていました*2。彼らの考えるテストと、「プロセスやドキュメントの規格化」はまったく相容れないということだと思います。

context-driven-testing.com

このように、このお二人は、テストやテストエンジニアの価値を正しく伝えようとする意志を感じさせる一方で、かなり先鋭的な立場を取る方々だと思います*3

『アジャイルテストの4象限』に対する批判

Brian Marick氏によるオリジナルの4象限と、それを改良したJanet Gregory、Lisa Crispin両氏の4象限(『実践アジャイルテスト』を通じてより知られている方)について、おおよそ以下のような批判をしています。

Agile Testing Quadrant (https://lisacrispin.com/2011/11/08/using-the-agile-testing-quadrants/)

  • 「批判(Critique)はプログラミングの支援(supporting)にはならない」ことを暗黙の前提にしている。
  • ビジネス(Business)と技術(Technology)を対置することで、両者に不要な緊張関係を持ち込んでいる。
  • チェック(これは完全に自動化できる)とテスト(これは完全には自動化できない)を混同している。テストはプログラミングと同じく、「ライブの思考プロセス」*4なのだ。
  • 「ツールを使うか使わないか」という意味のない区分をしている。テストにおいて、ツールは本質ではない。良いテスターであればどこででもツールを使う。
  • それぞれ技法を、一つの象限に固定している。どの技法であれ、どの象限とも関係がある。

うなずける部分もありますが、やや言いがかりのように感じるところもあります。

彼らの考えるフレームワーク

では彼ら自身は、どのようなフレームワークを提案しているのでしょうか。
この資料では、「4象限」への批判の後、彼らの考える軸や、アジャイル開発における流れなどいくつかのモデルが合成されていって、最終的に「The Agile Rapid Testing Ecosystem」というフレームワークを提案しています。

最終ページにそのv1.1があるのですが、これより新しいと思われる以下の絵が、ブログで公開されています。

The Agile Rapid Testing Ecosystem (https://developsense.com/rst-approach)

『アジャイルテストの4象限』の改良というよりは、まったく別モノですね。

構造としては、こんな感じです。

  1. 真ん中の部分には、アジャイル開発のコアとなる「価値観」が置かれている。
  2. グレーのラインは、「開発の活動」が時計回りサイクルで表現されている。
  3. 各頂点に、この活動を成功させるための「パターン」が置かれている。
  4. 各象限に、「価値観」と「パターン」に対応する「テストの活動」が書かれている。

「開発の活動」と「パターン」から見ていきましょう。

  • 上の活動: 作る価値のあるものを見つける。
    • 右上のパターン: 見つけながら設計を行う。
  • 右の活動: そのうちの一部を作る。
    • 右下のパターン: 作りはきれいに、シンプルにする。
  • 下の活動: 変化を心に留めながら作る。
    • 左下のパターン: 作りながら、テスタビリティも作り込んでいく。
  • 左の活動: 作ったものから学ぶ。
    • 左上のパターン: 学びながら、想像的・懐疑的に実験する。(上の活動に戻る)

次に、「テストの活動」に書かれた項目の例を挙げてみましょう。

  • 右上象限の活動: 豊富な例(examples)でプロダクトを明確にしていく、フィールドからのレポートをレビューする
  • 右下象限の活動: 低レベルのチェックを自動化する、保守性のためにリファクタリングする
  • 左下象限の活動: 内部のテスタビリティを設計する、コーディングと並行してテストを行う
  • 左上象限の活動: できあがったものを懐疑的に評価する、説得力のあるバグのストーリーを語る

ここから感じられるのは、実行するテストの種類をマッピングした「アジャイルテストの4象限」に対するアンチテーゼです。

  • テスト実行はテストの一部でしかない。その部分だけを分類して「アジャイルテスト」と呼ぶのはおかしい。
  • ツールや自動化は手段でしかない。それが本質であるかのように表現するのはおかしい。
  • チェックとテストは別モノである。
  • テストは継続的な活動である。それがまったく表現されていない。

という意志を表したものと言えると思います。

おわりに

この批判、ネガティブに捉えると、レストランに行って「サッカーボールが売っていないじゃないか」と言うようなイチャモンとも捉えられません。
一方で、「アジャイルテスト」を表現するものとして、確かに学ぶに値するものを含んでいるように思います。
みなさんはどのように感じられるでしょうか?

Created by Midjourney

*1:日本語翻訳版はコチラです。 www.kzsuzuki.com

*2:この件についての紹介記事は以下です。www.kzsuzuki.com

*3:海外のテストコミュニティの様子はよくわからないのですが、ちょいちょいイザコザのようなものが聞こえてきたりもします。わたしの見えている範囲では、日本のQAエンジニアのコミュニティは緩く広くつながっていて変な派閥もなく、幸せだなーと思ってます。

*4:live thought processを良い日本語に訳せなかった。「生放送」のliveと同じ意味なのだけれど、「生の」だとおかしいし、「生き生きとした」も何か変。

バグの原因と結果は1:1じゃない

miwaさんがJaSST東北から以下のツイートを送ってくれました。

バグの現象(見た目)だけで重篤度?を決めるのはホント危ないです。バグの原因とそこから想像する一番嫌なことで決まるので「軽微なバグだな」と思っても軽視しないようにって、いつも自分に言い聞かせてます。みんなも気をつけてね。#jassttohoku

こちらのツイートを見て、「なるほどその通りだ。そしてこれって、普段自分が考えていることとになるやつだ!」と思って、ワンページサマリーを作ったのでした*1

ワンページサマリー

テストで見つけたあるバグの現象は、そのバグの現象の一例でしかない

上のスクショの右のほうです。
見つけた現象E0は、その原因となった原因C0(ここではバグ)の本当の「重さ」を表すとは限りません。
E0からC0に行って、C0が起こしうるたくさんのEnを検討して、そのうち一番キツイEmaxから重要度を判断する必要があります。
イメージとしては、「正常運用中ならこれが起きても問題ないけど、系切替中に起こったら両系断にならない?」みたいな感じですね。

あるバグを見つけた手順は、そのバグを再現させる手順の一例でしかない

上のスクショの左のほうです。
現象E0を見つけた原因C0(ここでは再現手順*2)が、本当の「起こりやすさ」を表すとは限りません。
極端な話ですが、「1秒に100回連続クリックしたらクラッシュした」というバグレポートがあったとして、「100回連続クリックするやついないだろう、対処不要」とはなりません。1秒に2回連続クリックでも起きるかもしれません。もちろんテストする人は、その現象を起こすための「最少手」を特定しようとしますが、バグの原因がわからないことには、「本当の再現手順」を特定することは困難になります。

まとめ

絵に描いてみると当たり前なのですが、
「いや、そんな手順誰もやらないので発生頻度・低、対処不要」
「いや、大した事象じゃなく影響は小さいので重要度・低、対処不要」
って意外によくある風景なんじゃないですかね?

  • テストで見つけたあるバグの現象は、そのバグの現象の一例でしかない
  • あるバグを見つけた手順は、そのバグを再現させる手順の一例でしかない

ということを意識しておきたいものですね。

ご参考

miwaさんのツイートに関係するブログエントリーは、こちらです。
このような、技術とエッセイが同居したような文章を書けるようになるには、どういう練習をすればいいのでしょうね? 尊敬しています。

miwa719.hatenablog.com

バグの「発生頻度」については、これまで人によって考え方が違うので、こちらで整理しています。

www.kzsuzuki.com

そのバグは地球破壊爆弾になるかもしれない by Midjourney

*1:原因・手順・バグ、結果・現象など、言葉が揺らいでいるのを見逃していただきたい。

*2:ここで対称性の破れが起きていて、前のパラグラフでは原因とはバグそのものを意味していたのに対し、このパラグラフではそのバグを発現させるためのキッカケ・手順という意味で使っています。きれいに整理することができませんでした。誰も気にしないかもしれないけど。

従来とアジャイルで、品質メトリクスには本質的な違いがあるのではないか

ソフトウェア開発における品質のメトリクスについて、新旧2冊の本を比べてみました。

1冊は、『初めて学ぶソフトウェアメトリクス』
原著『Five Core Metrics: The Intelligence Behind Successful Software Management』(Lawrence H. Putnam、Ware Myers著)は、2003年に出版されています*1

もう1冊は、『アジャイルメトリクス』
原著『Agile Metrics in Action: How to measure and improve team performance』(Christopher W. H. Davis著)は、2015年に出版されています*2

後者はその名の通り、アジャイル開発にフォーカスしています。一方の前者は、ウォーターフォール開発に加えて、スパイラルモデル・反復型開発を意識した記述になっていますが、「アジャイル」という言葉は出てきません。

また、「新」側の理解を深めるために、『LeanとDevOpsの科学』にも少し目を通しています*3
こちらの原著『Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations』は、2018年の出版ですね*4

この記事の目的は「比較」であって、優劣について語るものではありません。
また「旧」「新」という呼び方は、「旧」にネガティブな印象があるので、以降は「従来型」「アジャイル」と呼ぶことにします。

品質メトリクスの本質的な違い

結論として、従来型とアジャイルの品質メトリクスは、根本から別モノだと感じます。
表大好きマンなので、わたしの理解を表にしてみます。当然ですが、「このようにカッチリ分かれる」ということではなく、「そのような傾向がある」というものです。

項目 従来 アジャイル
品質の位置づけ リリース物に欠陥が少ないこと ・リリース物がユーザの要求に近いこと
・近づける能力を組織が有すること
品質メトリクスの用途 ・計画のために見積もる
・開発中の品質状況を把握する
品質の継続的な改善につなげる
基本データの取得タイミング 主に開発中のデータ 開発中と運用中のデータの両方
基本データの源泉 ソースコード管理システム、チケット管理システム 左記+その他の開発基盤・本番環境

以下、一つずつ見ていきます。

品質の位置づけ

『アジャイルメトリクス』の「第8章 ソフトウェア品質を測定する」では、アジャイルの原則である「物事を素早く頻繁に変えていくことの重要性」について説明しています。品質のメトリクスも、この原則から導出されていきます。
ユーザの要求は継続的かつ頻繁に変化していくものであって、それに迅速に追随できる能力が、品質の代替指標になる」という考え方であると解釈しています。

一方『初めて学ぶソフトウェアメトリクス』の方は、要求の変化を強く意識してはいません。もちろん当時から、仕様についての認識齟齬やスコープクリープ*5の問題はあったと思いますが、「あるべき要求・仕様が一意に決まる」が暗黙の前提になっているように思います。
その「あるべき」をどれだけ満たしているかが、従来型の品質メトリクスであり、シンプルには「開発中の欠陥が少ないこと、収束していること」になります。

品質メトリクスの用途

『初めて学ぶソフトウェアメトリクス』には、以下のような記述があります。

メトリクスの効果があるのは、(中略) ソフトウェア開発プロセスの開発から終了までである。(中略) ソフトウェア開発作業は、メトリクスで計測し、評価し、必要があれば、計画を考え直さねばならない。

このあたりの記述を読む限りは、従来型のメトリクスの目的は、「開発の状況を把握・コントロールする」「計画のための見積もりに使う」ことでしょう。品質メトリクスも同様で、たとえば「計画した通りのバグ摘出にならないようであれば、テストを見直す」といったアクションを取ることになります。また管理者にとっては、「リリースするに足る品質か」を判断するための指標にもなるでしょう。

一方でアジャイルにおける品質メトリクスは、「自分たちの開発の仕組みやプロセスを継続的に改善していくために使う」ことが意識されています。
たとえば代表的なメトリクスであるMTTRは、ざっくりいうと「インシデントが発生してから、修正版がデプロイされるまでの時間の平均」ですが、その数字だけを計測してもあまり意味はありません。MTTRを「問題のトリアージ」「開発」「ビルド」「テスト」「デプロイ」というステップに分割して推移を調べることで、改善すべきステップを特定します。「手動リグレッションテストばかりで、テストに時間を食う」のであれば、自動化を検討する、といった具合です。

もちろんアジャイルにおける品質メトリクスも、計画の見積もりに使うことはできるでしょうが、メインの目的はあくまでも「自分たちの能力を知り、改善する」ことにあるようです。

基本データの源泉と取得タイミング

メトリクスの算出には基本データが必要です。
たとえば上述のMTTRを簡単に計測したければ、インシデントを記録したチケットのステータスから、発生によるオープンと、リリースに伴うクローズのデータを取得できるでしょう。この場合、源泉はチケット管理システムであり、タイミングは開発と運用の両方にまたがります。

従来型とアジャイルでは、この源泉とタイミングも異なる傾向があります。
従来型の品質メトリクスは主に欠陥に注目しているため、源泉はまず、チケット管理システムになるでしょう。あとは、コード行数などの把握のためにソースコード管理システムも源泉になります。取得のタイミングはいずれも、開発中が中心になります。

一方アジャイルにおける品質メトリクスの源泉は、上述の2つに加えて、CI/CD基盤、コード解析ツール、セキュリティスキャンツール、本番環境のモニタリングツールなどが加わってきます。取得タイミングは、開発と運用にまたがります(そもそもこの2つはずっと並行していることになる)。

もう少し大まかにいうと、従来型で見るのは主に開発中のソースコードとそれに付随するバグであるのに対し、アジャイルでは開発基盤から本番環境まで多くのところからデータを取得しています。
プロダクトそのものに注目するか、開発・運用プロセスも含めた全体に目を向けるかの違いといってもいいでしょう。

具体的な品質メトリクス

従来型のメトリクス

『初めて学ぶソフトウェアメトリクス』では、以下の5つを「中核メトリクス」(Core Metrics)と呼んでいます。以下、本書第2章から抜粋します。

  1. 機能量。最終的に、コンピュータで実行する機能の総量。通常、ソフトウェアの大きさ(サイズ)であり、ソースコード行数やファンクションポイント数で計測する。
  2. 生産性。投入した時間や工数あたりに開発した機能量で表現する。
  3. 時間。プロジェクト完成に要したカレンダーの月数。
  4. 工数。投入した作業量を人月で表わしたもの。
  5. 信頼性。欠陥率あるいは、バグ検出の間隔で表わしたもの。

品質メトリクスはこの5つ目で、具体的なメトリクスは「欠陥率」「バグ検出の間隔」です。ともに、開発中のメトリクスであることに注意してください。
「第8章 欠陥率による信頼性測定」では、運用に関連づいたメトリクスも含めて、4つが説明されています(表現は一部あらためています)。

  1. 総欠陥数: ソフトウェア製品の開発中に摘出した欠陥を累積した数。
  2. 残存欠陥数: リリース時に残っている欠陥の数。リリース時点では知りえない。
  3. 欠陥率: プロジェクト開発工程中の1週間、あるいは1か月あたりの発生欠陥数*6
    • この逆数がMTTD(Mean Time To Defect)。1つの欠陥数を見つけてから次を摘出するまでの平均時間。
  4. 障害率: MTTF(Mean Time To Failure、1つの障害から次の障害までの平均時間)の逆数。

4.の障害率が唯一、運用まで意識した品質メトリクスになっています。

アジャイルのメトリクス

『アジャイルメトリクス』では、品質特性をきわめて大まかに「保守性」「ユーザビリティ」に分けています*7

保守性のメトリクス

品質が高い ← 変化や問題に素早く追随できる ← 修正がしやすい ← コードの保守性が高い という理屈になります。
従来型では保守性は、品質特性の中でも「大事だけど地味」な印象(わたしだけ?)ですが、アジャイルにおいては本質的に重要な意味を持っていることになります。

「8.3 保守性の測定」で言及されているメトリクスは、以下の6つです。

  1. 平均修復時間(MTTR): インシデント発生から修正・デプロイまでの時間平均
  2. リードタイム: 新しい機能が定義されてからユーザに届くまでの時間平均
  3. コードカバレッジ: 単体テストでカバーされているコードの量
  4. コーディング規約ルール: 言語の規約の順守率
  5. コード変更量: 機能追加やバグフィックスのためにどのくらいコードを変更しなければならないか
  6. バグ率: 新機能の本番投入に伴って発生したバグの数

この中で特に重要視されているのが、MTTRリードタイムです。両者は計測開始の契機こそ異なりますが、要は「どれだけ迅速にモノが出せるか」であり、構成する要素はかなり近いです。

「バグ率」も軽視されているわけではないのですが、バグそのものを問題視するというよりは、バグが多い → 保守性が悪化しているので改善の必要がある、と判断するための指標と位置付けられています。

この他には、以下のようなメトリクスも説明されています。

  • FRP(Fix-Release Percentage): 総修正数 / 総リリース数。要は「1回のリリースにどれだけ修正を詰め込んでいるか」であり、この値が高ければ「低頻度でしかリリースできないので、いろんなものをまとめてリリースしようとしており、失敗のリスクが高い」ことを意味します。よって低い方がいいです。
  • 各種コードメトリクス: コード行数、重複(コードクローン)、複雑度などに言及があります。
  • 手戻り率: 開発者が実装したものをQAが却下する頻度が高ければ、MTTRやリードタイムに悪影響を与えます。
ユーザビリティのメトリクス

ユーザビリティもまた、(わたしの中では)「付加価値」的な品質特性でしたが、ここでは重要な特性として扱われています。
ユーザビリティは、可用性と信頼性セキュリティの2つに分けて、メトリクスが紹介されています。

可用性

  • アップタイム: アプリケーションが機能している時間の割合
  • ページ応答時間

信頼性

  • 平均故障間隔
  • 応答時間*8
  • エラー率: ログ上に記録されたエラーの割合

どれも、「ユーザが問題に直面する程度」の指標であることがわかります。
一方で、ISO/IEC 25010で言うところの「ユーザビリティ」とは異なることも明らかでしょう。『アジャイルメトリクス』でいう「ユーザビリティ」は、習得性・エラー防止性・アクセシビリティといった、「使いやすさ」とは別モノです。

セキュリティ

  • 静的コード解析
  • 動的コード解析

これらはそのまんまですね。手動テストが一切入っていないところも、隠れたポイントかもしれません。

Four Key Metrics

最近人気のFour Key Metricsは品質メトリクスというわけではなく、「ソフトウェアデリバリのパフォーマンスを測定する尺度」(『LeanとDevOpsの科学』 第2章)と位置付けられ、以下の4つを挙げています。

  • デプロイの頻度
  • 変更のリードタイム
  • MTTR
  • 変更失敗率

これらは概ね『アジャイルメトリクス』でいうメトリクスと重なっています。このことからも、アジャイルにおける品質とは「デリバリーのパフォーマンス」そのものであり、「ユーザの要求とその変化に、いかに素早く追随していけるか」という能力のことであると考えられます。

両者の類似点

「品質」の位置づけが違うことから、類似点はあまりないように思えます。同じ「品質メトリクス」であるにも関わらず、ここまで異なるものになるのは驚きです。

共通するものとしては、MTTF(平均故障間隔)があります。ただアジャイルメトリクスでは、「いかに壊れないか」のMTTFよりも、「いかに早く直すか」のMTTRを重視しています。

品質メトリクスについての(わたしの)課題

従来型の開発からアジャイル開発に移行してきた人にとって、「品質メトリクス」の大きな目的の1つは、「リリース可否判断」なのではないかと思います。というか、わたしの調査のモチベーションがそれでした。。
しかしながら、アジャイル系2冊の本で紹介されている品質メトリクスの主たる目的は、リリース可否判断ではありません。主たる目的は、自分たちの現状と改善ポイントを理解することです。よって、これらのメトリクスの値が改善していければ、従来型の品質も自然と満たされていく・・・めでたしめでたし

・・・いや、そうは言っても、そうは言っても~・・・

やっぱり、「開発物の品質を、リリース前に知りたい!」という思いは捨てられないですよねえ。

『アジャイルメトリクス』で紹介されているメトリクスは、開発基盤や本番環境からほぼ機械的に取得できるデータを加工し、保守性やユーザビリティを表現することで、間接的に*9品質を測定しています。
一方で、「このリリース物が十分な品質を持っているか」を知りたければ、「テストの十分性」というとっても難しい、主観的な響きを存分に持った属性に切り込んでいく必要があるのだと考えています。「アジャイルの品質ってそうじゃないんだよ」と言われるかもしれませんが、この点はすぐに放棄していい話じゃないなーと。

これが、わたしの今後の課題です。

補足

品質の位置づけの変化について

わたしの以下のつぶやきに対し、にしさんから以下のようなリプライをいただいたので、残しておきたいと思います。
ありがとうございます。

ある意味では「信頼性」になったのですよね

品質って、元々は出荷時の良さや悪さを指す概念なんです。もちろん狭義ですが。それに対して信頼性は出荷後の良さや悪さを指す概念なんです。こちらも狭義ですが。

いわゆるハードウェアの信頼性工学が保守の理論体系を作っていたりMTBFなどのメトリクスを数理的に解析しているところからも類似性は分かりますね。だからSREなのかもしれません。

QCDの三方よしについて

@t_wadaさんが講演でたびたび主張されている「品質とスピードは両立する」という命題について、文脈は若干違うながら、同じような話が『初めて学ぶソフトウェアメトリクス』にも出てきました。

第4章に出てくる表4-1を引用します。

要望 開発期間 工数 信頼度 大きさ 生産性
早い
良い
安い

この表によると、品質(良い)とスピード(早い)を両立する方法は2つあります。
1つは、工数をかけることです。「早い」を維持するためには、日数ではなく人数を増やすことになります。もちろんブルックスの法則*10を意識する必要はあるでしょうけれど。

もう1つは、生産性を上げることです。
@t_wadaさんのおっしゃる両立は、こちらに近いではないかと覆います。良いコード、保守性の高いコードは、生産性の向上につながります。

speakerdeck.com

参考

  • 「アジャイルSQC研究会」という研究会があります。
    その委員でもある荻野 恒太郎さんがよく品質メトリクスについての発表をされていたので、それにも言及したかったのですが、体力が尽きました。。 www.swtest.jp

  • 過去に調べたアジャイルのメトリクスは、こちらで記事を書いています。 www.kzsuzuki.com

  • MTTRについては、こちらで記事を書いています。 www.kzsuzuki.com

  • 『アジャイルメトリクス』の「拡張性」については、こちらで記事を書いています。 www.kzsuzuki.com

Bottle and metric measuring tape

*1:邦訳は2005年。

*2:邦訳は2022年なので、だいぶ間が空いている。

*3:というか、どの本も「少し目を通した」だけで、精読・精通できていません。といういつもの免責。。

*4:最初の本が「Five Core Metrics」を、最後の本が「Four Key Metrics」を謳っているのは、なかなか面白い対比だと思います。

*5:「プロジェクト管理において、プロジェクトが開始した後のどこかで起こるプロジェクトのスコープの変化、継続的または適切な管理無しでの増大を指す。」by Wikipedia

*6:欠陥率というと、「欠陥密度」、つまりソースコード行数あたりの欠陥数を連想するが、本書ではこのメトリクスには言及がないようだ。

*7:本章のこの章で使う言葉は、従来の用語より拡張されているため、誤解を招くことが多そうと感じる。たとえばこの章でいう「ユーザビリティ」には、セキュリティや信頼性が含まれる。また「信頼性」という言葉の中に、画面の応答時間という、従来は「性能」と呼んでいた属性を含めている。

*8:可用性の方に挙がっている「ページ応答時間」との違いは特に説明されていない。

*9:品質メトリクスはそもそもすべて、間接的な指標かもしれませんが。

*10:「遅れているソフトウェアプロジェクトへの要員追加は、プロジェクトをさらに遅らせるだけである」by Wikipedia