こんにちは、あなたが働いているのは組み込み業界ですか?
私は今組み込み業界でソフトエンジニアとして働いています。
この組み込み業界というのはいわゆるものづくりの世界。
1からものを作って、実際に作った製品を動かして確認し、最後に完成した時の喜びはとっても大きいものがあります。
そんな組み込み業界ですが、良い面だけでは当然ありません。
ツラい面もたくさーんあるんですよね。
今回はそんな組み込み業界の現場で実際に痛感したツラいことベスト5をお送りします。
Contents
そもそも組み込みシステムとは?
まずはあなたがもしかしたら組み込みシステムとは何かあまり知らないかもしれないので、最初に少し説明しておきますね。
組み込みシステムとは、簡単に言うと機械や家電の中に組み込まれるコンピュータのことです。
- 自動車
- 冷蔵庫
- 電子レンジ
このような製品の中は多くの組み込みシステムで構成されていて、複数のコンピュータが中で連動して動くことで製品を動かしています。
ただ製品の中にコンピュータがあるといってもスマホやパソコンのようなものが中にたくさん入っている訳ではありません。
このようなマイコン(マイクロコンピューター)と言われるもので中は構成されています。

引用:https://ja.wikipedia.org/wiki/Raspberry_Pi
マイコンは手のひらサイズの比較的大き目のものから、数センチ四方の小さいものまで様々。
このマイコンに対して、回路をいじったりしたりだとか、中のプログラムを変更したりすることで製品が作られていきます。
製品を作るにはたくさんのマイコンを組み合わせなければいけません。

多くのマイコンが組み合わさって組み込みシステムができあがり、最終的に製品が完成します。
ここがツラいよベスト5
では、組み込みシステムがなんとなくイメージ付いたところで、組み込み業界でソフトエンジニアとして働く私の視点でツラいことランキングを発表しますね。
※ソフトエンジニア視点なので、ハードエンジニアは適当に流して見てくださいね。
1.ソフトを簡単に動かせない
組み込み系のツラさはソフトを簡単に動かせないというところにあります。
例えば、ロケットの組み込みシステムをあなたが作っていたとしましょう。完成して実際動かすにはどうしたらいいでしょうか?
ロケットを打ち上げて動作を見るというのが一番確実ですよね。
でも、そんなロケットの打ち上げを毎回やっていたら時間もコストもとんでもなくかかり、会社はすぐに倒産します。

これが組み込みで簡単にソフトを動かせないことの難しさです。
ではどうやって作ったソフトを確認しているのかというと、マイコンの入出力の仕様からシミュレーションするための環境を作り確認を行います。

この環境を作るだけでも結構しんどいです。まぁロケットみたいな実物を毎回動かすよりははるかにマシですけどね。
分かりましたか?このように、Web系みたいに作ったJavascriptをブラウザで動かしてチェックしてみたいなお手軽感に動かせたりは全くできません。
2.バグを入れると実機が壊れる場合も
ソフトウェアを作っているならバグを入れたことが無いという人はゼロでしょう。
バグを入れて起きた悲惨な事故はたくさんあります。
1962年7月22日――火星探査機『マリナー1号』:マリナー1号は打ち上げ時に予定のコースを外れたが、これは飛行ソフトウェアのバグが原因だった。地上の管制センターは大西洋上でロケットを破壊した。
製品にバグが混入してしまうとこんな大惨事になってしまう可能性があり、取り返しが付きません。
実際の現場ではシミュレーション用の機材でやるのでを使ってここまでは大変ではありませんが、それでもシミュレーション環境を壊してしまったりということはあるでしょう。
- プラス(+)とマイナス(-)の一文字を書き間違えた
- 10回だけやるべき処理を100回やってしまっていた
- 10秒以内に処理しなきゃいけないのに、処理を忘れていた
こんな間違いが1つでもあればボカン

かもしれません。
仕様通りあなたのソフトを正確に作らなければいけません。
もし間違ってしまうとマイコンや機材・環境を壊す可能性があり、製品によっては人の命に関わることもあります。
組み込みのバグは恐ろしい。
3.プログラミングは9割がC言語
組み込み系ソフトエンジニアのプログラミング言語といったら、ほぼC言語オンリーと言っていいでしょう。
C言語の特徴と言えば
- ハードと親和性が高い
- ポインタが使える
- 処理が高速
このような特徴があり、組み込みのソフト開発でこれらよりも優位性があるプログラミング言語は他にありません。
JavaScriptやPHP、SwiftのようなWeb系で多く使われる言語は当然使えない。
組み込みのソフトウェアの開発環境もC言語だけサポートしているところがほとんどという状況です。

C言語は1970年代に作られた言語です。
そんなプログラミング言語を未だに使わないといけないなんて、正直プログラミング言語を学ぶ意欲はあまり沸きませんね。
JavascriptやPHP、C#とかいう進化し続けるプログラミング言語を学べるWeb系エンジニアがうらやましい。
4.デバッグがしんどすぎる
プログラミングをした後に確認する際、ソフトエンジニアはデバッグという作業を行います。
いわゆるプログラムの問題点を動かし見つけるバグ出しという作業ですね。
その際、デバッグを支援するためのツールがデバッガです。デバッガがあることで効率的にソフトのデバッグを進めることができます。
デバッガにも様々な種類があり、様々な機能があります。よくある機能としては、
- メモリの値がモニタできる
- 指定した箇所で処理を止めれる
- ステップ実行できる
いろんな機能があるので、使えるデバッガに当たるとラクーに開発が進めれます。
しかし大抵の組み込みソフトの開発現場はまともなデバッガがありません。
予算の関係や開発環境自体がヒドいということが多いのですが、とにかくヒドいです。
以下のように、RAMの状態をモニタするだけでも一苦労です。
↓
バグがありそうな箇所にモニタできるRAMが無い
↓
モニタ用のRAMを追加
↓
再コンパイルしてソフトを作り直す
↓
実機にソフトを焼き直す
↓
デバッグ
このように少しのデバッグにもとんでもない手間と時間がかかります。
つらいっすよ組み込みソフトウェアのデバッグは。
5.ビルドに時間がかかりすぎる
プログラムを作った後、実際の動かすソフトを作るのにはビルド作業が必要です。

ビルド作業には小さい組み込みソフトならあまり気にならないかもしれませんが、大規模な組み込みソフトの場合だととんでもない時間がかかります。
Web系のソフトのように5分でビルド完了みたいなお手軽感は全くありません。
大規模な組み込みソフトだと半日や長いと丸1日ビルドしっぱなしとかもあり得ます。
しかもひどいことに、それでビルド成功していたらまだマシですが、失敗することも。
ビルドして1日待ってみたらビルド失敗していたなんてことがあると、原因調査→再ビルドとまた1日かかります。

地獄の無限ループに陥ることも。
こうやっているとあっという間に時間が過ぎてしまい、しまいには残業地獄が待つのみ。
ビルド開始時はいつも祈ってます。
まとめ
いかがでしたでしょうか?
組み込み系ソフトエンジニアの実態が少しはイメージできましたか?
まとめておくと、組み込み系ソフトエンジニアのツラいことは
- ソフトを簡単に動かせない
- バグを入れると実機が壊れる場合も
- プログラミングは9割がC言語
- デバッグがしんどすぎる
- ビルドに時間がかかりすぎる
あなたがWeb系から組み込み系に転職を考えているソフトエンジニアなら覚悟してきてね。