ブログ

  • 状態遷移設計とは?組み込み開発で重要な理由を初心者向けに解説

    組み込み開発に携わっていると、どこかで「状態遷移」という言葉を必ず耳にすることになると思います。

    私自身、組み込み開発を約10年間経験しましたが、その中で感じたのは、状態遷移設計は組み込み開発で避けては通らない、開発の基本的な考え方だということです。

    C言語を初めて勉強したとき、コマンドプロンプト上で◼️を使った三角形を表示する演習をしていたのですが、そこから組み込み開発に結び付かず、

    「状態って何?」

    「状態遷移ってどういうこと?」

    「プログラムを書けばいいんじゃないの?」

    と思っていました。

    この記事では、組み込み開発初心者の方に向けて、状態遷移設計とは何なのか、なぜ重要なのかをできるだけ分かりやすく解説します。

    状態遷移設計とは?


    まず、「状態」と「遷移」という言葉を分けて考えてみましょう。

    ▪️状態とは?

    状態とは、簡単に言えば、

    「今、システムがどのような状態になっているか」

    ということです。

    例えば、車のヘッドランプを考えてみます。

    ヘッドランプには、

    • 消灯している
    • 点灯している

    という状態があります。

    さらに細かく考えると、

    • スモールランプ点灯
    • ロービーム点灯
    • ハイビーム点灯

    など、さまざまな状態を考えることができます。

    このように、システムが現在どのような状況なのかを表したものが「状態」です。

    ▪️遷移とは?

    次に「遷移」です。

    遷移とは、

    「ある状態から別の状態へ変化すること」

    です。

    例えば、ヘッドランプが消灯している状態で、運転者がライトのスイッチを操作したとします。

    すると、

    「消灯」→「点灯」

    という変化が起こります。

    これが状態の「遷移」です。

    つまり、

    状態:今どうなっているか

    遷移:そこからどう変化するか

    と考えると分かりやすいと思います。

    状態遷移設計とは何をするのか?

    では、「状態遷移設計」とは何でしょうか。

    簡単に言うと、

    「システムがどのような状態を持ち、どんな条件で、どの状態へ変化するのかを整理して設計すること」

    です。

    例えばヘッドランプであれば、

    「今は消灯している」

    「ライトスイッチがONになった」

    「ヘッドランプを点灯する」

    「点灯状態になる」

    というように、システムの動きを整理します。

    実際の組み込み開発では、もっと多くの状態や条件が存在します。

    そのため、プログラムを書く前に、

    「どんな状態があるのか」

    「どんな条件で状態が変わるのか」

    を整理しておくことが重要になります。

    状態遷移図で考える

    状態遷移を整理するときによく使われるのが、状態遷移図です。

    例えば、スイッチ操作でLEDを点灯・消灯させるようなシステムだと、下図のように表現できます。

    実際のシステムでは、もっと複雑になります。

    例えば、

    • スイッチがどの位置なのか
    • 複数の電源が入力される場合、どの電源状態なのか
    • 他のECUと連携する場合、どんな信号を受け取っているのか
    • 故障が発生しているか

    など、さまざまな条件を考える必要があります。

    そのため、状態遷移図を使ってシステムの動きを見えるようにすることが大切だと考えています。

    (状態遷移表も大切なのですが、別の機会にご紹介します。)

    なぜ状態遷移設計が重要なのか?

    私が10年間組み込み開発を経験してきて感じるのは、状態遷移設計は組み込み開発の基本となる考え方になるということです。その理由を3つご紹介します。

    ① システムの動きを整理できる

    組み込みシステムは、単純に「入力されたら出力する」だけではありません。

    現在の状態によって、同じ入力でも動作が変わることがあります。

    例えば、

    「スイッチON」

    という同じ操作でも、

    • システムが通常状態なのか
    • 故障状態なのか
    • 特定のモードになっているのか

    によって、処理が変わるケースがいくつもあります。

    例えば、路線バスの降車押しボタンを例に考えると、最初にボタンを押すと「次、停まります」とアナウンスが流れますが、バス停に着くまでにもう一度ボタンを押してもアナウンスは流れません。

    これは、特定の状態では、スイッチ入力を受け付けないよう設計されているからです。

    状態を意識して設計することで、こうした複雑な動きを整理できます。

    ② 想定漏れを見つけやすい

    ①で挙げたバスの例にも関連しますが、状態遷移設計をしていると、

    「この状態のときに、この入力が来たらどうする?」

    ということを考えることになりますが、これが重要になります。

    例えば、

    「点灯中にスイッチOFFが来たら?」

    「消灯中にスイッチOFFが来たら?」

    「点灯中に故障が発生したら?」

    というように、一つ一つのパターンを考えることができます。

    状態遷移を整理することで、設計段階で考慮漏れを発見しやすくなるのです。

    ③ プログラムを書く前に設計を整理できる

    組み込み開発に関わらず、開発者はまず

    「C言語でどう書こう?」

    と考えてしまうことがあると思います。

    しかし、個人的にはその前に、

    「そもそもシステムはどう動くべきなのか?」

    を考えることが重要だと思っています。

    状態遷移設計を行うことで、

    1. システムが持つ状態を考える
    2. 状態が変化する条件を考える
    3. それぞれの状態で何をするのか考える
    4. その設計をプログラムに落とし込む

    という順番で考えることができます。

    私はプログラミングが苦手で、周りの人よりも演習に時間がかかっていましたが、原因を振り返ってみると設計を固める前にいきなりプログラムを書こうとしていたことが原因だったと思います。

    状態遷移設計だけではありませんが、設計を固めてからプログラムを書くことだ大切だと痛感しました。

    状態遷移遷移設計をしないとどうなる?

    状態遷移を意識せずにプログラムを作ったらどうなるでしょうか。

    最初は簡単に作れるかもしれません。

    しかし、機能が増えてくると、

    if (…){
     if (…){
      if (…){
       …
       }
      }
     }

    のように、条件分岐がどんどん増していきます。

    もちろん、実際は上記よりも条件分岐が多いシステムは数多く存在しますが、問題なのは

    「なぜこの条件が必要なのか」

    「この条件のとき、システムはどの状態なのか」

    が分からなくなってしまうことです。

    そうなると、プログラムの可読性が悪かったり、メンテナンス性の悪かったりすることで、後から仕様変更が発生したときに「この条件を追加してもいいのか?」を検証しづらくしてしまいます。

    状態を意識して設計しておけば、システム全体の動きを整理しやすくなります。

    状態遷移設計は「人に説明する」ときにも役立つ

    状態遷移設計のもう一つのメリットは、人に説明しやすくなることです。

    組み込み開発では、一人だけで開発することは少なく、設計した内容を他のエンジニアや関係者(工場の方やお客様)に説明する場面があります。

    そのときに、

    「この条件のときはこうなって、さらにこの条件になるとこうなります」

    と文章だけで説明すると、複雑になってしまいます。

    一方で、状態遷移図にすると、

    「今はこの状態です。この入力が入ると、こちらの状態に変わります」

    と視覚的にもわかりやすく説明できます。

    設計者自身が理解しやすいだけでなく、他の人に理解してもらうためのツールとしても状態遷移図は役立つのです。

    まとめ

    今回は、状態遷移設計について簡単に解説しました。

    状態遷移設計とは、

    「システムがどのような状態を持ち、どんな条件で、どの状態へ変化するのかを整理して設計すること」

    です。

    組み込み開発では、システムが複雑になるほど、状態を意識して設計することが重要になります。

    特に、

    • システムの動きを整理する
    • 想定漏れを見つける
    • プログラムを書く前に設計を整理する
    • 他の人に設計内容を説明する

    といった場面で役立ちます。

    私自身も10年間の組み込み開発を経験する中で、状態遷移設計は基本的な考え方でありながら、非常に重要なものだと感じています。

    これから組み込み開発を始める方は、ぜひ「コードをどう書くか」だけではなく、「システムがどう動くべきなのか」を考えることを意識してみてください。

  • 組み込みエンジニアとは?仕事内容と10年の経験から学んだ大切なこと

    はじめに

    「組み込みエンジニアって、具体的に何をしているの?」

    「C言語を使ってプログラムを書く仕事なの?」

    組み込みエンジニアを目指している方の中には、このような疑問を持っている方も多いのではないでしょうか。

    私はこれまで10年間、車載の組み込み開発に携わってきました。

    C言語を使ったソフトウェア開発を経験し、現在は自動車メーカーで電子制御の設計を担当しています。

    この記事では、私自身の経験をもとに、組み込みエンジニアの仕事内容や必要なスキル、そして10年間仕事をしてきて感じた「本当に大切なこと」について紹介します。

    組み込みエンジニアとは?

    組み込みエンジニアとは、自動車や家電、産業機器などの製品に組み込まれるソフトウェアや制御システムを設計・開発するエンジニアです。

    スマートフォンのアプリやWebサービスとは違い、組み込みソフトウェアは、実際の機械や電子部品を動かすために使われます。

    例えば自動車であれば、

    • ランプを点灯・消灯させる
    • エンジンやモーターを制御する
    • センサーから情報を取得する
    • スイッチの入力を判断する
    • 車両の状態に応じて制御を切り替える

    といった処理を行っています。

    そのため、プログラムを書くことだけではなく、「製品をどう動かすのか」を考えて設計することが重要になります。

    組み込みエンジニアの仕事内容

    組み込み開発では、単純にプログラムを書くだけではありません。

    大まかには、

    1. 要求・仕様を確認する
    2. システムを設計する
    3. ソフトウェアを設計する
    4. プログラムを実装する
    5. テストする
    6. 不具合を修正する

    という流れで開発を進めます。

    特に重要なのが、プログラムを書く前の設計です。

    私が感じた「組み込みエンジニアのやりがい」

    私が特にやりがいを感じたのは、ヘッドランプのECUを設計していたときです。

    スイッチから入力された信号をもとに、ランプが意図した通りに点灯・消灯したとき、

    「自分が設計したものによって、自動車の動きが決まっている」

    ということを実感しました。

    もちろん、実際の製品は多くの人が関わって作り上げるものです。

    それでも、自分が考えて設計した制御が実際の自動車の動作として現れることには、組み込み開発ならではの面白さがあります。

    自分が書いたコードが画面に表示されるのとは違い、実際の製品が自分の設計通りに動く。

    そこに組み込みエンジニアの大きな魅力があると感じています。

    組み込みエンジニアに必要なのは「プログラミング能力」だけではない

    組み込みエンジニアというと、

    「C言語を覚えないといけない」

    「プログラムをたくさん書けないといけない」

    というイメージを持つ人もいるかもしれません。

    もちろん、プログラミング能力は重要です。

    しかし、10年間組み込み開発を経験してきた私が感じるのは、コードを書く能力だけではなく、考えて設計する能力や、人に説明する能力が非常に重要だということです。

    重要なのは「考え抜いて設計する力」

    組み込み開発では、プログラムを書く前に、

    「この条件ではどう動くのか?」

    「この状態でスイッチが押されたらどうするのか?」

    「異常が発生した場合はどうするのか?」

    「別の機能と同時に動いた場合はどうするのか?」

    といったことを考える必要があります。

    つまり、

    「どうコードを書くか」よりも、「そもそも製品をどう動かすべきか」を考えることが重要です。

    状態遷移設計は組み込み開発の基本

    私が組み込み開発を経験してきて、特に重要だと感じているのが状態遷移設計です。

    製品は常に同じ状態にいるわけではありません。

    例えば、

    • OFF
    • ON
    • 待機
    • 異常
    • 復帰

    など、さまざまな状態を持っています。

    そして、

    「現在どの状態なのか」

    「どんな入力があったのか」

    「その場合、次にどの状態へ移るのか」

    を整理して考える必要があります。

    状態遷移をきちんと設計できるようになると、複雑な制御でも整理して考えやすくなります。

    これは私自身、10年間の組み込み開発を通して身につけた重要な考え方の一つです。

    現在、自動車メーカーで電子制御の設計を担当するようになってからも、この考え方は非常に役立っています。

    人に理解してもらうための「説明する力」も重要

    もう一つ、組み込みエンジニアとして重要だと感じているのが、自分の設計を人に説明する能力です。

    組み込み開発では、一人ですべてを完結させることはほとんどありません。

    設計した内容について、

    • なぜこのような設計にしたのか
    • どのような条件で動作するのか
    • 異常時にはどうするのか
    • 他の機能との関係はどうなっているのか

    などを、他のエンジニアや関係者に説明する必要があります。

    どれだけ良い設計をしていても、相手に理解してもらえなければ、開発をスムーズに進めることはできません。

    そのため、組み込みエンジニアには技術力だけでなく、コミュニケーション能力も重要だと感じています。

    まとめ

    組み込みエンジニアは、単にC言語でプログラムを書く仕事ではありません。

    製品がどのように動くべきなのかを考え、それを設計し、実際の製品として動かす仕事です。

    私自身、10年間組み込み開発を経験してきて、

    「コードを書く力」だけではなく、

    • 物事を深く考えて設計する力
    • 状態遷移を整理して考える力
    • 自分の設計を人に説明する力

    が非常に重要だと感じています。

    特に状態遷移設計は、組み込み開発を理解するうえで基本となる考え方です。

    これから組み込みエンジニアを目指す方は、C言語の勉強だけではなく、「製品をどう動かすのかを考える」という視点もぜひ身につけてみてください。