「動いているから大丈夫」の時代は終わった

制御ソフトウェアの開発では、まず動かしてみることが大切です。

考えているだけでは分からないことも多く、実際に動かすことで仕様の不足や技術的な課題が見えてきます。

先行開発やPoCでは、完成度よりも早く試すことが優先される場合もあります。

しかし、動いたソフトウェアに機能を継ぎ足し、改良を繰り返していけば、自然に良い製品になるとは限りません。

製品や装置が複雑になるほど、「動いている」というだけでは十分ではなくなっています。

ボトムアップだけでは限界がある

現場では、必要になった機能から順番に作り、既存のソフトウェアへ追加していくことがあります。

最初は小さなソフトウェアだったものが、仕様変更や派生開発によって徐々に大きくなっていきます。

このようなボトムアップ型の開発でも、規模が小さいうちは対応できます。

しかし、求められる品質や性能が高くなると、部分的な改善だけでは限界が見えてきます。

現在の製品や装置には、単に目的の動作をするだけでなく、さまざまな要求があります。

  • 必要な応答性能を満たす
  • 異常時に安全に停止する
  • 将来の機能追加に対応する
  • 派生機種へ展開できる
  • 他の装置やシステムと連携する
  • 不具合の原因を追跡できる
  • 長期間にわたって保守できる

これらを、機能を追加するたびに個別に対応していくと、ソフトウェア全体の整合性を保つことが難しくなります。

自分のソフトウェアだけ正しくても十分ではない

例えば、ある制御ソフトウェアが、受け取った入力信号に対して正しい演算を行い、仕様どおりの出力を返しているとします。

ソフトウェア単体では、正しく動いているように見えます。

しかし、その入力信号に遅れやノイズがあったらどうでしょうか。

センサの精度が足りない、通信周期が遅い、信号が更新されていない、

別のシステムが誤った値を出している、といった状態では、制御ソフトウェアだけが正しくても、

製品全体として正しい動作にはなりません。

反対に、ソフトウェアが要求する出力を出していても、モータや機械がその指令どおりに動けない可能性もあります。

このとき、

入力信号の問題なので、私たちのソフトウェアの問題ではありません

と切り離して考えるだけでは、製品全体の問題は解決しません。

もちろん、責任範囲を明確にすることは必要です。

しかし、製品や装置を完成させるためには、担当範囲を越えて、システム全体として成立しているかを見る必要があります。

作っているのはソフトウェアではなく、システムと捉える

制御ソフトウェアは、単独で価値を生むものではありません。

センサから情報を受け取り、状態を判断し、モータやアクチュエータへ指令を出し、

機械や装置を意図したとおりに動かすための一部です。

つまり、作っているのはソフトウェアだけではなく、ソフトウェアを含む一つのシステムです。

そのため、開発では最初に、

  • システム全体で何を実現するのか
  • どの程度の性能や信頼性が必要なのか
  • 各機器やソフトウェアが何を担当するのか
  • どのような入力を受け取り、何を出力するのか
  • 異常時にシステム全体がどう動くのか
  • 将来どのような変更や拡張が想定されるのか

を考える必要があります。

そのうえで、システムに求められる要求を、機械、電気、制御、ソフトウェアなどへ割り当てていきます。

「まず動かす」と「そのまま製品にする」は違う

まず動かしてみることは、今後も重要です。

問題なのは、試作として作ったものを、全体設計を見直さないまま機能追加し、製品へ成長させてしまうことです。

試作では、特定の条件で動けば十分だったかもしれません。

しかし、製品では、さまざまな条件や異常、長期間の使用、将来の変更まで考える必要があります。

そのため、PoCや試作から製品開発へ進む際には、一度立ち止まり、

  • この構造で要求性能を満たせるか
  • 機能の役割や責任が整理されているか
  • 入力信号の品質を含めて成立しているか
  • 異常時の動作が定義されているか
  • 今後の拡張や派生開発に耐えられるか

を確認することが重要です。

必要であれば、アーキテクチャを設計し直したり、機能を分割したり、インターフェースを整理したりします。

システム全体から考える開発へ

制御ソフトウェアの規模や役割が小さかった時代には、

担当者が自分の範囲を正しく作れば、製品全体もある程度成立していたかもしれません。

しかし、現在の製品や装置では、複数のソフトウェア、センサ、アクチュエータ、通信、機械が複雑に関係しています。

個々の担当者が自分の範囲だけを最適化しても、システム全体が最適になるとは限りません。

「動いたから大丈夫」ではなく、

システム全体として、要求された品質や性能を満たしているか

を確認する必要があります。

まず動かして学ぶ。その後、システム全体の要求から構造を見直し、設計・実装・検証を進める。

制御ソフトウェアが複雑になる時代には、この両方を使い分けることが重要ではないでしょうか