正しいだけでは足りない: 型安全と狩野モデルが示す品質の二重構造
Hatched by naoya
Aug 20, 2026
1 min read
1 views
88%
「アプリが正しく動く」とは、いったい何を意味するのでしょうか。
画面が落ちないこと。計算結果が間違っていないこと。コンパイラがエラーを出さないこと。どれも品質の一部ですが、それだけでは、ユーザーが「このアプリは信頼できる」と感じる理由を説明できません。逆に、見た目が洗練され、便利な機能が多くても、基本的な操作で誤解や不具合が起きれば、品質は一気に崩れます。
ここには、ソフトウェア開発でしばしば混同される二つの問題があります。ひとつは、システムが意味を取り違えず、仕様どおりに動くかという問題です。もうひとつは、その正しさがユーザーにとって価値として感じられるかという問題です。
この二つをつなぐ鍵になるのが、型安全の考え方と、品質を複数の種類に分けて捉える狩野モデルです。両者を組み合わせると、品質とは単なる不具合の少なさではなく、次のように定義できます。
品質とは、守るべき期待を壊さず、さらに期待されていなかった価値まで届ける設計能力である。
この視点に立つと、型やテストや機能優先順位の意味が変わって見えてきます。
品質の最初の敵は「間違った種類の正しさ」
プログラム上の値は、しばしば見た目よりも多くの意味を持っています。整数は整数でも、それが価格なのか、画面の識別子なのか、文字列リソースの識別子なのかによって、役割はまったく異なります。
たとえば、Androidの文字列リソースは、内部的には整数で参照されます。すると、整数を受け取る関数に、誤って文字列リソースではない値を渡せてしまう可能性があります。コンピュータから見れば、どちらも整数です。しかし人間の設計意図から見れば、両者は別の種類です。
この問題は、単純な入力ミスに見えるかもしれません。けれども本質は、値そのものではなく、値の意味が失われていることにあります。
文字列を表示する処理が、文字列そのものではなく文字列リソースの識別子を必要としているなら、その要求を型や注釈で明示できます。@StringResのような注釈は、渡される整数が単なる数値ではなく、values/strings.xmlに定義された文字列リソースであることを示します。これにより、開発者の頭の中にしかなかった制約を、ツールが検査できる情報へ変換できます。
ここで重要なのは、注釈が新しい機能を追加しているわけではないことです。画面を美しくするわけでも、処理を高速にするわけでもありません。それでも品質を高めます。なぜなら、曖昧な境界を明確にし、間違いを早い段階で発見できるようにするからです。
これはソフトウェア以外にも当てはまります。薬の容器に似たラベルが付いていれば、取り違えが起きます。倉庫の箱がすべて同じ大きさでも、内容物の分類が曖昧なら事故につながります。型安全とは、プログラムの中に意味の異なるものを混ぜないための、精密なラベル付けです。
しかし、コンパイラは「うれしさ」を検査できない
ここで別の問題が現れます。型安全によって、誤ったリソースを渡すことは防げるかもしれません。しかし、それだけでユーザーが満足するでしょうか。
あるチップ計算アプリを考えてみます。請求額を入力し、チップの割合を選び、合計金額を表示する。計算式は正確で、リソースの指定にも誤りがなく、アプリは一度もクラッシュしない。それでも、ユーザーが毎回同じ割合を手入力しなければならず、端数処理の理由も分からず、結果を友人と簡単に共有できないなら、そのアプリは「品質が高い」と感じられるでしょうか。
ここで、品質の種類を区別する必要があります。顧客満足と機能の関係は、すべて同じではありません。狩野モデルの考え方では、少なくとも次のように分類できます。
- 当たり前品質: なくなると強い不満が生じるが、備わっていても大きな感動にはなりにくいもの
- 一元的品質: 充実するほど満足が高まり、不足するほど不満が増えるもの
- 魅力的品質: なくても不満にはならないが、あると大きな満足や驚きを生むもの
- 無関心品質: 力を入れても、ユーザーの評価にほとんど影響しないもの
チップ計算アプリでいえば、計算が合っていることや入力が失われないことは当たり前品質です。チップの割合を柔軟に設定できることや、操作が速いことは一元的品質に近いでしょう。地域ごとの慣習に応じた提案や、割り勘の状況を自然に処理する機能は、魅力的品質になり得ます。
この分類が示すのは、正しさは満足の土台だが、満足の全体ではないという事実です。型安全は土台を守ります。しかし土台を守るだけでは、建物が魅力的になるとは限りません。
型安全と狩野モデルをつなぐ「期待の階層」
この二つの考え方を組み合わせるために、品質を三つの階層に分けてみましょう。
第一層: 意味の正しさ
これは、値や操作が本来の種類として扱われることです。文字列リソースを要求する場所に、ただの整数を渡さない。金額を文字列として計算しない。認証済みのユーザーと未認証のユーザーを同じ状態として扱わない。
この層で必要なのは、型、注釈、制約、テスト、静的解析です。目的は、見えにくい取り違えを早く発見することです。
第二層: 期待の正しさ
これは、ユーザーが当然だと思っている振る舞いが守られることです。保存した設定が次回も残る。入力エラーの理由が分かる。ボタンを押した結果が予測できる。処理中に画面が無反応にならない。
この層は、単なる型検査では扱えません。ユーザーシナリオ、アクセシビリティ、エラー設計、実機検証が必要です。ここでの失敗は、コードの文法エラーではなく、人間の期待との不一致として現れます。
第三層: 期待を超える価値
これは、ユーザーがまだ明確に要求していないが、体験を大きく改善するものです。入力の手間を減らす。状況に応じて自然な選択肢を提示する。失敗を責めるのではなく、次の行動を案内する。データを単に表示するのではなく、判断しやすい形に変換する。
この層が魅力的品質です。ただし、第一層と第二層が壊れている状態で第三層に進むと、派手だが信頼できない製品になります。
この三層は、ピラミッドのようなものです。下から上へ、意味の正しさ、期待の正しさ、期待を超える価値が積み上がります。上層のアイデアがどれほど魅力的でも、下層が不安定なら、ユーザーはその価値を受け取る前に離れてしまいます。
魅力は品質の代替ではない。信頼の上に初めて成立する、品質の上層である。
「品質を上げる」のではなく、品質の種類を選ぶ
開発現場では、「品質を高めよう」という言葉があまりにも抽象的に使われます。その結果、レビューを増やす、テストを増やす、機能を増やすといった行動が、目的なしに積み重なりがちです。
しかし、品質には種類があります。今起きている問題が当たり前品質の欠損なのか、使い勝手の不足なのか、魅力的品質の不足なのかを見極めなければ、努力の方向を誤ります。
たとえば、アプリが入力途中で落ちる状態で、アニメーションを追加するのは適切でしょうか。おそらく違います。まずデータの保持とエラー処理を直すべきです。一方で、競合製品がすでに安定して動き、基本機能が満たされているなら、次の差別化は当たり前品質の改善ではなく、魅力的品質の設計になるかもしれません。
実務では、次のような問いを機能ごとに投げかけるとよいでしょう。
- これが壊れたとき、ユーザーは強い不満を感じるか
- これを改善すれば、満足度は段階的に上がるか
- なくても困らないが、あれば記憶に残るか
- そもそもユーザーは、この機能の存在を認識するか
- その機能を作る前に、意味の取り違えや基本的な失敗を防げているか
この最後の問いが、型安全と狩野モデルの接点です。開発者はしばしば、ユーザーが見える機能だけを品質と考えます。しかし、ユーザーから見えない制約設計こそ、当たり前品質を守っています。
たとえば、文字列リソースの指定を型安全にする仕組みは、ユーザーからは見えません。画面に「ようこそ」と表示されても、ユーザーはその背後の注釈を知りません。それでも、表示されるべき文言が壊れず、多言語化の際にも管理しやすくなるなら、見えない設計が見える体験を支えています。
品質を「制約」と「余白」の両方として設計する
ここから、より実践的な原則を導けます。高品質なソフトウェアには、壊してはいけない制約と、価値を試すための余白の両方が必要です。
制約とは、型、入力範囲、権限、状態遷移、リソースの種類などです。これは自由を奪うためではありません。誤った組み合わせを排除し、チームが安心して変更できる範囲を広げるためです。
一方、余白とは、改善や実験の余地です。ユーザーがどの割合を選びやすいかを試す。結果の表示方法を変える。地域ごとの習慣に応じた提案を検証する。魅力的品質は、最初から完全に正解を定義できないため、観察と実験を必要とします。
この二つは対立しません。むしろ、強い制約があるほど、創造的な余白を安全に使えます。橋の構造計算ができているから、建築家は形状や空間の設計に集中できます。同じように、値の意味が保証されているから、開発者はユーザー体験の改善に集中できます。
開発プロセスを次の順序で設計すると、この関係が明確になります。
- まず、取り違えてはいけないものを特定する
- 次に、それを型や注釈や検査で機械的に守る
- そのうえで、ユーザーの当たり前の期待をシナリオとして検証する
- 最後に、期待を超える価値を小さく試し、反応を観察する
ここでのポイントは、魅力的な機能を後回しにすることではありません。魅力的な機能を、信頼を損なわない順序で育てることです。
Key Takeaways
- 値ではなく意味を設計する: 整数、文字列、識別子、金額など、同じ表現でも役割が違うものを型や注釈で区別する。
- 品質を一語で扱わない: 当たり前品質、一元的品質、魅力的品質、無関心品質に分け、問題の種類に合った施策を選ぶ。
- 見えない仕組みを軽視しない: 静的解析や型安全は、ユーザーに直接見えなくても、信頼できる体験を支える。
- 機能追加の前に期待を確認する: 保存、エラー表示、応答性、アクセシビリティなど、失われると強い不満になる要素を先に守る。
- 実験できる余白を残す: 基本的な意味と期待を制約で守ったうえで、魅力的品質は小さく試し、実際の反応から育てる。
品質とは、間違えないことから始まるが、そこで終わらない
ソフトウェアの品質を、バグの数や機能の多さだけで測るのは不十分です。品質の本質は、何を間違えてはいけないかを見抜き、それを仕組みで守り、守られた信頼の上に新しい価値を積み上げることにあります。
型安全は、コンピュータに「これはただの整数ではなく、特定の意味を持つ値だ」と教えます。狩野モデルは、製品に「すべての機能が同じ種類の満足を生むわけではない」と教えます。この二つを合わせると、開発者は品質を二つの質問に分けて考えられます。
私たちは、何を取り違えないようにしているのか。取り違えないことによって、どんな価値を届けられるのか。
優れた製品は、ユーザーに「型安全です」と語りません。代わりに、入力が自然に受け付けられ、表示が崩れず、失敗しても立て直せて、操作の先回りまでしてくれるという感覚を与えます。
つまり、最高の品質は、見える機能と見えない制約のどちらか一方ではありません。見えない正しさが、見える価値へ変換される瞬間にあります。開発者が設計すべきなのは、単に動くソフトウェアではなく、正しさがユーザーの安心と驚きに変わる道筋なのです。
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣