川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

ソフトウェア品質と工程自動化

まえおき

2001年のアジャイルソフトウェア開発宣言からもう少しで20年です。

最近のソフトウェア開発界隈を見ていると、なんとなくアジャイルの思想がアジャイルという言葉から離れて独り立ちできるようになってきているのを感じます。

特にその最たる例として、継続的インテグレーションや継続的デプロイといったアジャイルのサブセットとも言える思想がそれ単体で開発現場で使われつつある点について喜ばしく思っています。

とは言いつつも、未だそれらの思想が浸透しづらい現場で、思想を説明するのに難儀することも多いのもまた現状です。今回はこの思想のうち、工程自動化に関する思想について書きます。

注:記述全ては私の思想であり、実証されたものではありません。

ソフトウェア開発における工程自動化の意味

工程自動化がもたらす心理的安全性

今回は工程自動化をソフトウェア開発の文脈で使用します。

たとえば、

  • ビルド手順の自動化
    ソフトウェアのコンパイル手順をなるべく手間のかからないものにすること。
  • テストの自動化
    ソフトウェアのテスト手順、テスト結果の集計、検証をなるべく手間のかからないものにすること。
  • ビルド・テスト環境の構築の自動化
    ソフトウェアのコンパイルやテストを行う環境を、なるべく手間を掛けずに構築できるようにすること。
  • その他、開発に関わるすべての業務を自動化すること。

などのことです。

これらの自動化がもたらす最大のメリットは開発者の心理的安全性と考えます。

本能的に人間は面倒なことはやりたくない生き物で、ビルドに手間がかかるのであればビルドをやりたくなくなります。テストに手間がかかるならテストしたくなくなります。*1

この心理的障壁を取り払い、開発における心理的安全性を確保することが工程自動化の目的とするところです。

心理的安全性とソフトウェア品質

料理をするときのことを考えてみましょう。料理を作るのは割と好きだけれども、作った後の洗い物はあまり好きではない方は多いのではないでしょうか。*2

ソフトウェアの開発も似たようなもので、大抵の人は設計は楽しめたり、実装は楽しめたりすると思います。 一方で、現実の仕事ではこれらの設計や実装以外に膨大な雑務が発生してしまいます。この雑務があまりに膨大となると、雑務から逃れるためにリリースサイクルを遅らせたり、なるべく雑務をサボる言い訳を考えたりするようになります。*3

料理でいうと、数日分の食器が洗い場に溜まったままになってしまうようなものですね。非常に衛生的ではないですし、料理もしにくいです。これでは心理的安全性が保証されていないと言えます。

一方、食器洗い機を導入した場合、どうなるでしょうか。

人間は割と好きな料理だけを頑張って、洗い物は食洗機に放り込んでボタンを押すだけです。洗い場に食器が溜まることを恐れずに料理を出来るのではないでしょうか。こうなると心理的安全性が保証されていると言えます。

ちょっと手の込んだ料理もやってみようと思えますし、休日に新しいレシピを試してみる心理的ハードルも下がります。結果的に料理の腕も上がるのではないでしょうか。

ソフトウェアも全く同じです。雑務は自動化しましょう。

特に、ソフトウェアの世界では品質を上げるために雑務の量を増やす動きが見られるケースがあります。これは料理で例えると「肉と野菜はまな板をわけましょう」のようなもので、たしかに分けることで食中毒のリスクを下げることが出来ます。一方で、洗い物という雑務は増えてしまいます。他にも、保存食に触れる箸はわけましょう、などもありますし、衛生に気を使うと洗い物の量は爆発的に増加します。

繰り返しになりますが、ソフトウェア開発では雑務が増えたなら増えた分以上を自動化で減らしましょう。

まさかそんなことをやる人はいないと信じていますが、自動化出来ずにたらい回しにした挙げ句、若手に押し付けるような行為はエンジニアとして恥じるべき行いです。

工程自動化で大事なこと

自明かもしれませんが、工程自動化で大事なことは以下。

  • 問題に気づくこと(問題提起)
  • 解決するための手段を用意すること(知識集積)...インプット
  • 問題を解決しようと動くこと(問題解決)...アウトプット

これら3点は相補的な関係にあり、

  • 問題に気づけば手段を身につけようとできる。手段が身につけば問題に気づける。
  • 問題に気づけば問題を解決する機会は増える。問題を解決しようと動けば他の問題に気づける。
  • 問題を解決しようと動けば手段が身につく。手段が身につけば動きやすくなる。

というようなものです。

これらのうち、どれが得意かは人それぞれだと思います。私は気づけないし手段も豊富ではない上に手段を揃える勉強は好きではないので、とりあえず動くというスタイルです。手段を揃えるのが好きな人の中には書籍を色々読んで身につける人も居るみたいですし、おそらく気づくのが上手い人の中には問題点に気づくところから入る人も居るでしょう。
入り方は人それぞれだと思いますが、大事なのは3点を意識してそれら全てをバランス良く向上させていくことだと考えています。

工程自動化でやってはいけないこと

章立てを作ってから気づきましたが、工程自動化のアンチパターンはあまり思いつきません。

強いて言うなら、工程自動化そのものが目的になってしまうと意味がないと思います。

*1:理性でこれらの本能を抑えて、確度の高い業務を出来る人を見かけます。本当にすごいことだと思いますが、私は理性で本能を抑えるコストが高い人間なので、このコストは必要なときだけに支払うべきだと考えています。

*2:脱線しますが、私は台所が狭いアパートで炊飯器ではなく食洗機を置くことを選ぶぐらいには洗い物が嫌いです…。最近の食洗機は小さいのだと電子レンジぐらいのサイズですし、工夫すれば水回りも常設する必要はないです。炊飯は鍋でやるのに慣れてしまいました…。

*3:家事に置き換えて想像すると非常に耳の痛い話です