私は、20年近く、組込みソフトウェア開発という業務を行っています。
組込みソフトウェア開発って何でしょうか。
そもそも、組込み?ソフトウェア開発?
通常のソフトウェア開発であれば、PC上で開発を行って、PC上で動作させるソフトウェアということになります。PC上で動作するソフトウェアといっても様々なものがあります。それに対して、組込みソフトウェアは、開発する環境(PC)とターゲットとなるハードウェアが異なります。
携帯電話、スマートフォンを動かすためのソフトウェア以外にも、カーナビゲーションシステム、電子レンジ、エアコン、冷蔵庫、プリンター、デジカメ等など、たくさんの電化製品の中にソフトウェアが存在していて、それらを組込みソフトウェアと呼ばれます。英語では、Embeded Softwareと言います。
昨今のスマートフォンのiOSやAndroid上で動作するアプリケーションも、上の定義上では、組込みソフトウェアということになります。しかし、これらは、ハードウェアに依存しないソフトウェアのため、いわゆるEmbeded Softwareとは分野が異なってきます。組込みソフトウェアとアプリケーションエンジニアは、ソフトウェアを作るうえで必要な知識領域がことなるため、区別されることが一般的です。通常Embeded Softwareというと、ハードウェアを制御するための知識を必要とするソフトウェアの領域を指します。
ソフトウェア開発って何?
ソフトウェア開発というと、パソコンに向かってプログラムの元となるソースコードをエディタで作成するコーディングという作業があって、コンパイル、リンク、実行して、テストして、できあがり。というイメージだと思います。作成するソフトウェアによっては、コンパイル、リンクという作業もいらなかったりする場合もあります。
ソースコードというのもいろいろな種類があります。Java、C、C++、Python、Perl、
BASIC、COBOL、・・・。
利用する言語はさておき、 ソフトウェア開発といったときに、コーディングをすることだけではありません。
組込みソフトウェア開発に必要な知識
私の場合、ソフトウェア開発に従事していると言いながら、コーディングをほとんどしません。それでもソフトウェア開発しています。
CPUやRAMの仕組みを理解して、どのようなソフトウェアが必要なのかを知っています。SDカードやHDD、eMMCにアクセスするために必要なソフトウェアの知識があります。スピーカーから音を出したい、マイクから音をとりたいといった場合に、どのようなソフトウェアを開発しなければいけないかを知っています。
絵を表示するために、液晶パネルのdevice仕様書を読み込んで、電源の入れ方、リセットのタイミング、CPUとのIFの繋ぎ方を理解し、ソフトウェアとして何をしなければいけないかを調査することができます。液晶パネルに対して、表示したい絵を作るためにソフトウェアとしてどのような手段があるかを知っています。
Bluetoothの仕組み、WiFiの仕組み、USBがどのような制御によって動作しているのか、SD CARDが何故動作するのかを知っています。
組込みソフトウェア開発を行う場合には、ソフトウェアの知識だけでなく、いろいろなハードウェアの知識が必要になります。
もちろん、新しい規格や、デバイス等も日々生まれてきますので、都度勉強しながら身に着けていく必要があります。
いろいろな知識を業務をしながら身に着けることができるのです。
組込みソフトウェア開発の特徴
組込みソフトウェア開発という仕事の場合、たくさんのハードウェアを制御するためにどのようなソフトウェアを作成するべきかを調査、整理する仕事がとても多いです。
また、組込みソフトウェアは、一般のパソコンと異なっていて、処理性能が悪いからと簡単にCPUを変更できません。メモリーが不足するからと言って、メモリーを簡単に増設したりもできません。
一度作ったソフトウェアをハードウェアに組込みして出荷すると、簡単に書き換えはできませんし、常に正しく動作しなければなりません。
作成したソフトウェアが組み込まれたハードウェアは、数十万から百万の単位で製造されます。
ソフトウェアの都合で、ハードウェアを変更するとなった場合に、部品のコストが10円上昇すると、百万個製造する場合には、一千万のコスト差が発生します。
そうすると、売上を増やすために、安い部品を選びがちになります。安い部品になると、ソフトウェアが制御してあげる内容が増えがちです。
ハードウェアに依存しているソフトウェアの開発の課題
性能の良くないCPUやdeviceで、沢山のリアルタイム処理を遅延無く動作させるためには、設計が重要になってきます。無駄なソフトウェア動作があれば破綻してしまいます。効率良いソフトウェア動作をさせるための設計を必死に検討しなければなりません。
ハードウェアはぎりぎりで売り上げ見込みが達成できるコストで計画されているため、あとからソフトウェア作ってみて、ダメでした。というのは許されない世界です。場合によっては、回路設計担当の方に、相談して回路を変更してもらうことはありますが、既に製造してしまったものを変更するとなると、とても大ごとです。部品の再手配の依頼、製造工程の調整、コストの再計算、いろいろなところに影響を与えます。
常に正しく動作するソフトウェアの確保の大変さ
作成したソフトウェアは、常に正しく動作しなければなりません。
そのためには、もちろん、ソフトウェアが正しく作られていなければなりません。千回に一回、百万回に一回、処理を間違ってしまうソフトウェアを作ることは許されません。
組込みソフトウェアの経験が無い方は、そんなソフトウェアを作る方が大変だと思うかもしれませんが、実際にいろいろなケースでこういった不具合を引き起こせます。そういう事象をプログラムの作成段階で潰しこみしなければならないのです。そのために設計工程が必須です。テストが必要です。レビューも重要です。なんとかして不具合の発生しないソフトウェアとするために、できる限りのことを必死に考えて作業するのです。
組込みソフトウェアを作るということは、不具合の無いソフトウェアを作れることが必須になります。そのための知識を身に着けることができます。
コーディングをしないソフトウェア開発者が必要な訳
組込みソフトウェアの開発は、単純にソースコードのコーディングをする仕事で無いことが伝わりましたでしょうか?
限られたハードウェアの中で、要求された機能動作をすべて成立させて、安定したシステムとして成立させるというのは、とても大変なことです。ソースコードを書く仕事よりも大変です。
そのためには、いろいろなハードウェアの知識や、ソフトウェアの知識、品質確保するための手法、プロセスを理解して適応していかなければなりません。
製品の開発に関連するので、日程もあります。限られた日程と予算の範囲の中で、この無理難題をこなしていく仕事になります。
なので、私は日々、ソースコードエディタよりも、WORD、EXCEL、POWERPOINT等を使った仕事ばかりをしているのです。
組込みソフトウェア開発という現場の雰囲気が少しでも伝われば良いなと思います。
最近の組込みソフトウェアの特徴
組込みソフトウェアというと、RTOS(リアルタイムOS)という、一般的なパソコンの世界とは違うOS上で動かすことがほとんどでした。リアルタイムOSを利用すると、ハードウェアからの信号に対して、数nsecの単位で応答して処理を行うことができるというメリットがあります。しかし、RTOSでは複雑な処理をするためには、RTOS上で一から作成しなければならないので、ソフトウェアの開発工数が莫大になってしまいます。それを改善するために、組込み用のLinux等を利用するケースが増えてきています。
リアルタイムに処理を行わなければならないところだけをRTOSで処理し、その他全般をLinuxで開発するということをします。
Linuxなので、パソコンでテストdebugしたソフトウェアをコンパイルしなおすだけで組み込みハードウェア上でも実行できるようになります。
組込みソフトウェア開発の現場では、RTOSの知識も、Linuxの知識も必須になってきている状況です。Linuxの知識といってもServer管理業務をしている人の知識とは全然違ってきます。Linuxがどのように動いているのか、どのようにメモリーやプロセスを管理しているのか、Kernel Driverの作り方等、特殊な知識、経験が身に付きます。
Linux勉強しておいて損は無いですが、開発現場でないと味わえない領域の知識です。知識よりも、興味とやる気さえあればなんとかなります。
おわり
「あの人、ソフトウェアエンジニアなのに、コーディングしてない」とか思っている人がいるなら、ソフトウェア開発がコーディングだけじゃないことを知ってください。
また、パソコンは毎日触っているけれど、パソコンがどうして動いているのか知りたい、興味があるという方は、ぜひ組込みソフトウェアの業界を味わってみてください。たくさんの知識が学べます。
組込みソフトウェアの業界に興味が湧いた方がいれば、ぜひ目指してみて欲しいです。
人手が足りないのです(泣
組み込みソフトウェア業界は、若いやる気のある方を募集中です!