組み込み開発に携わっていると、どこかで「状態遷移」という言葉を必ず耳にすることになると思います。
私自身、組み込み開発を約10年間経験しましたが、その中で感じたのは、状態遷移設計は組み込み開発で避けては通らない、開発の基本的な考え方だということです。
C言語を初めて勉強したとき、コマンドプロンプト上で◼️を使った三角形を表示する演習をしていたのですが、そこから組み込み開発に結び付かず、
「状態って何?」
「状態遷移ってどういうこと?」
「プログラムを書けばいいんじゃないの?」
と思っていました。
この記事では、組み込み開発初心者の方に向けて、状態遷移設計とは何なのか、なぜ重要なのかをできるだけ分かりやすく解説します。
状態遷移設計とは?
まず、「状態」と「遷移」という言葉を分けて考えてみましょう。
▪️状態とは?
状態とは、簡単に言えば、
「今、システムがどのような状態になっているか」
ということです。
例えば、車のヘッドランプを考えてみます。
ヘッドランプには、
- 消灯している
- 点灯している
という状態があります。
さらに細かく考えると、
- スモールランプ点灯
- ロービーム点灯
- ハイビーム点灯
など、さまざまな状態を考えることができます。
このように、システムが現在どのような状況なのかを表したものが「状態」です。
▪️遷移とは?
次に「遷移」です。
遷移とは、
「ある状態から別の状態へ変化すること」
です。
例えば、ヘッドランプが消灯している状態で、運転者がライトのスイッチを操作したとします。
すると、
「消灯」→「点灯」
という変化が起こります。
これが状態の「遷移」です。
つまり、
状態:今どうなっているか
遷移:そこからどう変化するか
と考えると分かりやすいと思います。
状態遷移設計とは何をするのか?
では、「状態遷移設計」とは何でしょうか。
簡単に言うと、
「システムがどのような状態を持ち、どんな条件で、どの状態へ変化するのかを整理して設計すること」
です。
例えばヘッドランプであれば、
「今は消灯している」
↓
「ライトスイッチがONになった」
↓
「ヘッドランプを点灯する」
↓
「点灯状態になる」
というように、システムの動きを整理します。
実際の組み込み開発では、もっと多くの状態や条件が存在します。
そのため、プログラムを書く前に、
「どんな状態があるのか」
「どんな条件で状態が変わるのか」
を整理しておくことが重要になります。
状態遷移図で考える
状態遷移を整理するときによく使われるのが、状態遷移図です。
例えば、スイッチ操作でLEDを点灯・消灯させるようなシステムだと、下図のように表現できます。

実際のシステムでは、もっと複雑になります。
例えば、
- スイッチがどの位置なのか
- 複数の電源が入力される場合、どの電源状態なのか
- 他のECUと連携する場合、どんな信号を受け取っているのか
- 故障が発生しているか
など、さまざまな条件を考える必要があります。
そのため、状態遷移図を使ってシステムの動きを見えるようにすることが大切だと考えています。
(状態遷移表も大切なのですが、別の機会にご紹介します。)
なぜ状態遷移設計が重要なのか?
私が10年間組み込み開発を経験してきて感じるのは、状態遷移設計は組み込み開発の基本となる考え方になるということです。その理由を3つご紹介します。
① システムの動きを整理できる
組み込みシステムは、単純に「入力されたら出力する」だけではありません。
現在の状態によって、同じ入力でも動作が変わることがあります。
例えば、
「スイッチON」
という同じ操作でも、
- システムが通常状態なのか
- 故障状態なのか
- 特定のモードになっているのか
によって、処理が変わるケースがいくつもあります。
例えば、路線バスの降車押しボタンを例に考えると、最初にボタンを押すと「次、停まります」とアナウンスが流れますが、バス停に着くまでにもう一度ボタンを押してもアナウンスは流れません。
これは、特定の状態では、スイッチ入力を受け付けないよう設計されているからです。
状態を意識して設計することで、こうした複雑な動きを整理できます。
② 想定漏れを見つけやすい
①で挙げたバスの例にも関連しますが、状態遷移設計をしていると、
「この状態のときに、この入力が来たらどうする?」
ということを考えることになりますが、これが重要になります。
例えば、
「点灯中にスイッチOFFが来たら?」
「消灯中にスイッチOFFが来たら?」
「点灯中に故障が発生したら?」
というように、一つ一つのパターンを考えることができます。
状態遷移を整理することで、設計段階で考慮漏れを発見しやすくなるのです。
③ プログラムを書く前に設計を整理できる
組み込み開発に関わらず、開発者はまず
「C言語でどう書こう?」
と考えてしまうことがあると思います。
しかし、個人的にはその前に、
「そもそもシステムはどう動くべきなのか?」
を考えることが重要だと思っています。
状態遷移設計を行うことで、
- システムが持つ状態を考える
- 状態が変化する条件を考える
- それぞれの状態で何をするのか考える
- その設計をプログラムに落とし込む
という順番で考えることができます。
私はプログラミングが苦手で、周りの人よりも演習に時間がかかっていましたが、原因を振り返ってみると設計を固める前にいきなりプログラムを書こうとしていたことが原因だったと思います。
状態遷移設計だけではありませんが、設計を固めてからプログラムを書くことだ大切だと痛感しました。
状態遷移遷移設計をしないとどうなる?
状態遷移を意識せずにプログラムを作ったらどうなるでしょうか。
最初は簡単に作れるかもしれません。
しかし、機能が増えてくると、
if (…){
if (…){
if (…){
…
}
}
}
のように、条件分岐がどんどん増していきます。
もちろん、実際は上記よりも条件分岐が多いシステムは数多く存在しますが、問題なのは
「なぜこの条件が必要なのか」
「この条件のとき、システムはどの状態なのか」
が分からなくなってしまうことです。
そうなると、プログラムの可読性が悪かったり、メンテナンス性の悪かったりすることで、後から仕様変更が発生したときに「この条件を追加してもいいのか?」を検証しづらくしてしまいます。
状態を意識して設計しておけば、システム全体の動きを整理しやすくなります。
状態遷移設計は「人に説明する」ときにも役立つ
状態遷移設計のもう一つのメリットは、人に説明しやすくなることです。
組み込み開発では、一人だけで開発することは少なく、設計した内容を他のエンジニアや関係者(工場の方やお客様)に説明する場面があります。
そのときに、
「この条件のときはこうなって、さらにこの条件になるとこうなります」
と文章だけで説明すると、複雑になってしまいます。
一方で、状態遷移図にすると、
「今はこの状態です。この入力が入ると、こちらの状態に変わります」
と視覚的にもわかりやすく説明できます。
設計者自身が理解しやすいだけでなく、他の人に理解してもらうためのツールとしても状態遷移図は役立つのです。
まとめ
今回は、状態遷移設計について簡単に解説しました。
状態遷移設計とは、
「システムがどのような状態を持ち、どんな条件で、どの状態へ変化するのかを整理して設計すること」
です。
組み込み開発では、システムが複雑になるほど、状態を意識して設計することが重要になります。
特に、
- システムの動きを整理する
- 想定漏れを見つける
- プログラムを書く前に設計を整理する
- 他の人に設計内容を説明する
といった場面で役立ちます。
私自身も10年間の組み込み開発を経験する中で、状態遷移設計は基本的な考え方でありながら、非常に重要なものだと感じています。
これから組み込み開発を始める方は、ぜひ「コードをどう書くか」だけではなく、「システムがどう動くべきなのか」を考えることを意識してみてください。