アジリティと関係の深い品質特性とは何か
アジリティと関係の深い品質特性とは何か、ソフトウェア品質の国際規格であるSQuaREをもとに紐解いていきます。
ここまでの話の中であった「適応力の維持」、つまり変更容易性はSQuaREでは「保守性」のうちの「修正性」として定義されています。実は、DXではこの「変更容易性」がキーとなっていて、「変更容易性の高いソフトウェアによるアジリティの獲得」こそがやりたいことです。「けれども、それがソフトウェアエンジニア以外には伝わっていない」と、ところてんさんの言葉を引用しながら和田さんは語ります。
改めてSQuaRE品質モデルの保守性の項目を眺めると、「解析性」という項目があります。これは「理解容易性」と言い換えることができます。アジリティを支える品質副特性は、前述の変更容易性と、この理解容易性です。そして、この2つの品質副特性を阻害するのはComplexity(複雑さ)にほかなりません。このComplexityの兆候としては「高い認知負荷(High cognitive load)」、「変更の増幅(Change amplification)」、そして「未知の未知(Unknown unknown)」があります。
「クソコード」は「認知負荷の高いコード」
我々エンジニアは、理解し難かったり美しくなかったりするコードと出会ったときに、しばしば「クソコード」というあまり美しくない表現を使うことがあります。
「クソコードという言葉は、解像度が高くありません」。では、こういったコードを表現するにはどのような言葉が適切なのでしょうか。
「いわゆるクソコードの問題は、短期記憶に収まらないほど複雑であるということ。つまり、クソコードは『認知負荷の高いコード』と言い換えることができます」。ついつい使ってしまいがちなクソコードという言葉ですが、たしかに本質的な課題は認知負荷の高さであるといえます。
2つ目の兆候である変更の増幅(Change amplification)は、いわゆる「コピペコード」が引き起こします。似たような処理を行っているコードをコピペする。そのコードにバグが見つかり修正することになる。なんということだ、あちらこちらにコピペが広がっているではないか!!……という苦い経験は、エンジニアなら誰でもあるのではないでしょうか(余談ですが、私は新卒1年目の頃にコピペで数100件のテストケースを作成していたところ先輩からAPIの仕様変更を告げられ、泣きながら夜通しコードを修正する羽目になったことがあります)。
そして3つ目の兆候、「知らないことを知らない(Unknown unknown)」。無知の知にもたどり着いていない状態。和田さんが「これが最も手強い敵です」と語る通り、「わからない」ということがわかっていなければどのように行動するべきかさえわかりません。
この「知らないことを知らない」ことによる悲劇の一例が、図で紹介したNamingに起因する仕様誤認です。enabledだったらdisabledを返す、という仕様は「知って」いないとそうとは理解できないものでしょう。
変更容易性(Modifiability)を向上させる戦術
依存関係は変更の発散と認知負荷の上昇を、不透明さは未知の未知と認知負荷の上昇を引き起こし、複雑さを大きくしていきます。この複雑さを抑え、変更容易性を向上させるためにはどうしたらいいのか。
「変更容易性を向上させる戦術は、結合度と凝集度にあります」低い結合度と高い凝集度、良い設計であることを示す指標。この2つが、改めて変更容易性向上の要として浮かび上がってきました。