2023年5月5日金曜日

ソフトウェア開発における品質に対する態度の違いは顧客のニーズにあるのだろうと思った

 日本のソフトウェアを作る企業や企業内のソフトウェアを開発する部署に所属した経験から、品質に対する態度の違いみたいなものがあり、それがどうして生まれるのかについて思うところがあったので、記録しておく。

ここでの品質と言っているのはいわゆる品質保証でQAなどと呼ばれる部分だ。ソフトウェアの読みやすさとかそういった観点での品質もあるとは思うが、最終的な製品の品質の部分に対して考えてみる

開発手法自体は、大きく分けると2通りの開発手法があると思う。リーンソフトウェア開発とウォーターフォール開発だ。開発手法が違えば品質に対する考え方も取り組みも違ってくる。

ウォーターフォール開発の品質への取り組み

ウォーターフォール開発の場合は、計画重視の開発サイクルが特徴だと思う。プロジェクトの初期段階で厳密な要件定義と設計を行い、段階的に開発を進める。品質保証は、各フェーズの終了時に行われることが一般的であり、その過程で問題が見つかった場合は、適切な修正が行われる。
この各フェーズでの品質の保証というのが特徴的だと思う。製造業と同じように各工程で完璧なものを作れば、最終的に完璧なものができると言う考え方だ。
当たり前だが、完璧なものを作るのは無理なので、当然不具合がある。不具合があれば、工程を遡ってやり直せば良いのだが、そうはならない。
なぜ、そうはならないかというと、企業がなぜウォーターフォール開発を選択しているかに関係すると思う。ウォーターフォール開発を選択する企業はスケジュールを非常に重視する。理由はハードウェアのリリースだったり、ユーザー企業の都合だったりとさまざまだと思うが、スケジュールは死守されるものだ。そのためスケジュールが立てられるように見えるウォーターフォール開発を選択するのだと思う。これは、ソフトウェア開発を必要としている顧客からのニーズである。

リーンソフトウェア開発の品質への取り組み

リーンソフトウェア開発では、顧客価値の最適化を重視し、継続的な改善とフィードバックの活用が特徴だと思う。開発チーム全体で品質保証の役割を分散し、短いサイクルでリリースと検証を行う。これにより、顧客とのコミュニケーションを重視し、適応的な開発を実現する。
リリースサイクルは毎日で、検証を毎日行う。テストの自動化もマニュアルのテストもするが、リリースサイクルを短くすることで、最終的にユーザーが利用する物が高品質になることを目指している。
短いサイクルで品質を保証していくというのが特徴的だと思う。毎日リリースするので、細かい不具合は出るが、大きい不具合は見つかったらすぐに修正(リバート)される。品質が保証されずに安定しているとは言えないとも思う。場合によってはユーザーの活動が丸一日止まるようなこともある。そのため、ほとんどの場合、コンシューマー向け製品で採用されている方法だと思う。企業相手では、丸一日サービスが停止するような状況は到底受け入れられないサービスレベルだと思う。

両方を経験しての比較として

両者を経験したことがあるが、顧客のニーズが違うというのが最も大きな違いだったと思う。
ウォーターフォール開発の場合は、ハードウェアを作っている製品開発者などが顧客であり、ハードウェアが関係するので、リリース時期が動かせないのだ。
リーンソフトウェア開発は、いわゆるWeb系企業で、これらの企業の顧客は一般人で、リリースしたものが直接顧客に届くのが一般的だと思う。そして一般の人にはリリース時期を確約することはほぼないと思う。これは、どんな製品でもそうだが、ソフトウェア開発が直接的に製品になっている場合もリリース時期を確約をすることはまずない。

開発現場からするとどちらの方が働きやすいかと言ったら当然リーンソフトウェア開発なのである。
どんな開発者でも品質の保証など出来ないし、努力はするが保障というのは難しいのである。
リーンソフトウェア開発でも毎日完璧を求められることもあるとは思うが、ほとんどの場合は、一般のユーザーがほとんど無料で利用しているので、不具合が発生することはある程度織り込まれている。顧客との期待値の調整がすでに行われていて、結果として毎日のリリースなどが可能になっていると思う。
ウォーターフォール開発の最も深刻な問題は、保証できないものを保証しようとしているところだと思う。企業のニーズ(スケジュール死守)があるとはいえ、出来ないことを約束している点に問題があると思う。製造業においても不具合というのはあると思う。だが、製造ラインを動かす前に仮組みをして問題が発生すすれば、何処かの工程からやりなおすはずだ。
設計に問題があっても、必ずしも設計からはやり直さず、製造工程でなんとかすることもあるとは思う。
だが、ソフトウェアの不具合を製造工程で吸収するというのは、不可能だろうと思う。逆はあったとしても。そのため完璧なものが求められるが、最終的な製品になっていない状況で完璧はあり得ないと思う。

日本のSIerは多重下請けとかの問題もあるし、最近では給料もWeb系の方が高くなっていると思う。メーカーのソフトウェア開発も似たような状況だと思う。顧客からのニーズに応えているだけといえば、そうであるが、結果として産業全体で不可能なことを実現するために多くのリソースを割いているようにしか見えない。

ソフトウェアをハードウェアの部品のように扱うのではなく、ソフトウェアとして利用するようにユーザー企業が変わっていかない限りはこういった状況は変わらないのだろうなと思う。