この記事では
- よく言う「ITエンジニア」というもの
- ものづくりの一分野としての「ソフトウェアエンジニア(組み込みソフトウェア)」
の2つの違いについてお話してみます。
「エンジニア」という言葉が持つ意味はそのときどきで本当に変化しますし、かなり文脈で判断しないといけません。
それは
- プログラム
- ソフトウェア
などIT系の技術界隈では最も顕著だと個人的に思っていて、なんとなくそれの整理も兼ねてまとめてみたい感じです。
つまり僕の主観が多分に入っていますし、あくまでも業界に関わりのない方に向けたエントリーです!
「なんとなくプログラミングに興味があるけど仕事のイメージはどんな感じ?」という方にも参考にしてもらえるような記事になれたらなと!
IT系技術職の世界をちょっとだけ覗いてみてください。
ITエンジニアの種類にはどんなものがある?
比較してみる前に「ITエンジニア」系の中にはどんな職種があるかだけ先に確認しておきましょう。
この分類は何かの定義に則っているものではなくて、僕が分けたものです。イメージしやすいカテゴライズにしてみたつもりです。
- アプリケーションエンジニア
(デスクトップアプリケーション、スマホアプリ、フロントエンド系など) - インフラエンジニア
(ネットワーク、DB、サーバ、バックエンド系など) - ゲームプログラマー
(ゲームは成果物として特徴が際立っているので分けてみた) - データサイエンティスト/データアナリスト
(動くものを作るだけがプログラミングではありません、とても大切なスキル) - 社内SE
(特にITがメインじゃない会社(メーカーなど)では貴重な存在なので取り上げてみた) - 組み込みソフトウェアエンジニア
(今回の比較対象となるもの。唯一"モノ"というハードウェアが関わる職種です)
この6つ!
なかなか見たことのない並びですが、初めてITエンジニアというものに触れる方にはかなり良いバランスで説明できているかと思います。
上記のような「ITエンジニアの仕事の種類」について詳しくは の記事がおすすめです。本記事では詳しい説明はしません。
で、今回の記事は
ものづくり内でのプログラマー「組み込みソフトウェアエンジニア」は他の「ITエンジニア」とどう違う?
というお題なわけですね。
そもそも「組み込みソフトウェア開発」ってなんなのよ!
僕なりの「組み込みソフトウェア開発」の説明をしています。
「知ってるよ!」という方は読み飛ばしてどうぞ。
「組み込みソフトウェア」とは、ハード自体(モノのこと)にプログラムを入れ込むこと、もしくは入っているプログラムのこと、を言います。
なんのこっちゃって感じですね。順番に行きましょう。
まずはじめ。
ここにスマホがあります。
スマホにはみなさんご存知の
- iOS
- Android
といった「OS」が入っています。これは「色んなアプリケーションを動かせるようにしてくれるもの」と思ってください。
もっと言うと「ルールに則って作ったアプリケーションならどんなものでも動かせる」状態です。
この場合のルールとは
- プログラミング言語
- インストール方法/インストール場所
- 使用するフレームワークなどなど…
といった感じ。
App StoreやGoogle Play Storeにある、誰が作ったどんなアプリでもダウンロードして使えるのはOSが居てくれるから、と理解しましょう。
ふむふむ。OSがいるからなんでもできると。
あれ、じゃあスマホ自体はどうやって動いてるの…?
ここで初めて登場するのが組み込みソフトウェア開発。
「OSなどのソフトウェア上で動くプログラム」ではなく、「ハードウェアに直接プログラムを組み込んで動かすプログラム」が組み込みソフトウェアです。
ハードウェアとは電気部品のことで、「IC」とか「マイコン」とか呼ばれるやつのことを言いますね。「半導体部品」とも。
スマホ上で「インストール」というボタンを押せば好きなプログラムを動かせますが、組み込みソフトウェア開発ではそうはいきません。
半導体部品の知識はもちろん、コンピュータシステムの深いところまで専門的な知識が要求されます。しかも使われる部品も毎回違います。
対比の都合上スマホで説明してしまいましたが、組み込みソフトウェア開発の一般的な説明は「家電製品」も理解しやすいです。
たとえば炊飯器。
- タイマーをセットして指定した時刻にご飯を炊く
- ご飯を炊くモードを選択する
など、プログラム的な機能はたしかにありますけど、これのためにOSを用意してインストール…?
しないですよね。
分かりやすいディスプレイ(UI)などを持たず単一の機能を提供する電気製品はほとんど組み込みソフトウェア開発によって作られている、と言っていいでしょう。
おそらく身の回りにある電気製品はほとんど該当するはず。あとは「ゲーム機本体」も組み込みソフトウェア開発が強く関係していますねー!
最近流行りの「IoT家電」とかは話が別です。多機能なものはOSを必要とするので、Androidとかが入っていることも多いですね!
というわけで「この2つのエンジニアには仕事上どういう違いがあるか?」、さらには「これからプログラミングをやっていきたい人はどう選択すべきか?」へ行ってみましょう。
「組み込みソフトウェアエンジニア」が他の「ITエンジニア」と大きく違う点3つ
3つ書いてみました。
1.コンピュータシステムやハードウェアへの深い理解が必要
ここまででも何度か説明していますが、組み込みソフトウェアは電子部品へダイレクトにインストールされ、かつその働きはそのまま電気的な処理へと繋がっていきます。
つまりソフトウェアだけで完結しないんですね。
これは超大きな違いです。
例えばプログラミングを始める第一歩で毎度見かける「Hello, World!」ですが、これは「"Hello, World!"と表示した結果」をすぐに確認できます。
しかし組み込みソフトウェアでこういう例はなかなかありません。
- Aボタンを押されたらマイコンの○ピンの電圧を変えろ
- ユーザーの操作が3分間なかったら電流を止めろ
- センサから取得した値に応じて常に変数の値を制御し続けろ
だいたい命令はこんなイメージになります。
どれも目に見えた結果として分かりにくく、自分が作った部分だけのプログラムですぐに成果を確認できないのが分かります??
「組み込みソフトウェア開発はハードウェアと深い関連がある」どころか、実際にはコンピュータ全体に関して熟知していないと仕事にならないと言った方がいいくらいな気さえします。
ただし全員が全員そうである必要はなくて、実際はチームに数人「コンピュータシステムに詳しい専門の人」がいるような感じだと思います。彼らを「下回り」と呼ぶことも(悪いニュアンスは一切入ってないですよ)。
コンピュータの基本概念にこういう図があります。
一番下へ行くほど"モノ"、つまりはハードウェアに近くなり、上へ行くほど"アプリケーション"、つまりソフトウェアに近くなっていくということを表した図です。
これで言うと
- 一般的な他の「ITエンジニア」
→上の方 - 「組み込みソフトウェアエンジニア」
→下の方
という棲み分けになってくるわけですね。
中でもさっき言ったような「下回り」と呼ばれる人は最も下に位置する部分で仕事をすることになり、より専門的な知識が必要になります。
コンピュータの基本原理って「物理」なので、ハードに近くなるほどちょっとずつ分野も変わってくる、みたいなイメージですね。
より「こういう地味で単調な世界観に近づく」とも言えるかも。笑
これが最も分かりやすい「違い」でしたが、ちょっとは具体的なイメージがつきました?
2.「ソフトウェアが主体ではなくハードウェア制御のためにあるプログラム」という考え方
2つめ。
これは「プログラミングの概念、考え方の違い」です。
さっきの「Hello, World!」の例をもう一回取り上げましょう。
この「Hello, World!」が表示されるためには、例えば以下のようなソースコードが必要とされます。
print ("Hello, World!")
つまり「ソフトウェア的な結果を受け取るためにプログラミングをしている」ということなんですね。
「"Hello, World!"と表示される結果を得たいからソフトウェアを作る」という流れです。
これは
- 綺麗なWebサイトを作りたい、サーバーで配信したい
- メモ帳の機能を持ったアプリを作りたい
- シューティングができるゲームを作りたい
どれにも言えますよね。「欲しい最終結果がソフトウェア上で実現されるもの」とも言えそう。
では組み込みソフトウェア開発ではどうでしょう。
1つめのところでも言ったように「ソフトウェアだけで完結しない」という性質がある以上、そもそもソフトウェアの存在意義は第一優先ではないという考え方があります。
感覚的に理解するのは難しいかもしれませんが、電気製品ではハードウェア的な仕様を満たしたり機能を実現したりするためにソフトウェアとしてのプログラムが必要になるという位置づけが一般的です。
しかしこれは「劣っている」ことを説明しているわけではありません。
単なる「違い」であって、この性質の差を楽しいと思うかつまらないと思うかは人によって変わるでしょう。
ちなみに僕はめっちゃ好きです!電子工作とかハマるとやめられなくなりますよ。気になる方は「Arduino」とググるといいかも。
実際のものづくりの現場では、大きく3つの専門分野に分かれた技術者がいます。
ここにある「ソフト」というのが今回で言う「組み込みソフトウェア開発」のことを指していると思ってください。
だいたいプロジェクトは電気チームが主導で行われることが多く(製品によるけど)、ソフト屋さんは決められた仕様を実現するようなプログラムの設計を受け取ります。
このように「全く異なる他分野のエンジニアと共同作業をしながらプログラミングの仕事をしていく」という経験が可能なのが組み込みソフトウェアエンジニアの醍醐味でしょう。
僕もこれまでたっくさんの組み込みエンジニアと話してきましたが、
「Web系とかゲームづくりは別に興味ないかな~」
と言う人が本当に多くていつも驚いてました。まさにこの仕事の特異性を楽しんでいるような印象を受けます。
これは最終的に「プログラミングへの考え方」も違った醸成へと進んでいくと思いますが、みなさんは何を選びますか?
3.より厳密で正確な設計/プログラミングが求められる(傾向がある)
最後、3つめ。
「プログラミング自体の特性の違い」です。
この内容はあくまで「こういう傾向が強い」ということ言いたいだけで、決めつける気は全くありません。また「両者に優劣がある」などと言うつもりも毛頭ございません。念のため。
最近はあらゆる技術が進歩してきたので、技術者が使える「リソース」も潤沢です。
ここで言うリソースとは「コンピュータ資源(CPU、メモリ、記憶領域など)」のこと。
ドラクエ1ではカタカナを20文字しか収録できなかったのに、今では映画顔負けのグラフィックでゲームを楽しめますよね。
一般的なプログラミング業界ではこうした進化によってエンジニア側は確実にできることの幅が増えています。悪く言うと「ラクできる」も近いかも。
対して組み込みソフトウェアはというと、実はそんなに状況が変わっていません。
「小さい製品に収まるように、かつ様々な制限下で機能を実現するようなソフトウェアを作らなければいけない」という条件が常につきまといます。
またOSなどの優秀なソフトウェアが存在していないため、
- 少ないメモリをいかに有効活用し続けるか
- 少しでも速い処理にするためにどういうコードを書けばいいか
などの繊細な技術も要求されます。
難しいですね…!
これらがうまくいかないと、例えばICチップなどの部品代が上昇してしまい製品全体のコストが上がってしまうみたいな問題も起き得ます。
もちろん「組み込み以外の一般的なITエンジニアは適当にコードを書いていい」なんてことは断じてありません。が、その重要性や傾向はより顕著だな、と実際の開発現場を見ていて常々思います。
コスト観点で必要な機能をグレードダウンさせるようなシーンは何度も見てきました…。
しかしこれはIT系エンジニアとしてのスキルは人一倍磨かれる環境であると言ってもいいですよね。
ここでプログラミングを勉強できたら間違いなく他の職種としてのITエンジニアでも超戦力になれるのは間違いないです。
「他のITエンジニア→組み込みソフトウェア」は少なくとも僕の周りではあまり聞かないですが、「組み込みソフトウェア→他業種のITエンジニア」はめっちゃいます。転職的にはかなりメリットがあるでしょう!
プログラムやIT系のスキル以外にも色々学べる組み込みソフトウェア開発、あなたもぜひいかが?
おわりに
IT系のエンジニアについて、ものづくりの中で仕事をするプログラマーはどう違うのか?を3つに分けて話してみました。
けっこう業界の実際のイメージが湧くような紹介にできたかと思っているんですが、もし「今までよく知らなかった」という方に読んでもらえて満足いただけていたらとても嬉しい。
これからの時代プログラミングのスキルは100%間違いなく武器になるので、同時にものづくりにも関われてしまう組み込みソフトウェアエンジニアはかなりおすすめです。
メーカーは「SE土方」になってしまう可能性も(一般的なSE会社やSIerよりは)少ないので、待遇的にも僕はおすすめできるかなと!
プログラミングは個人での学習も比較的カンタンなので、会社に入ってからスキルを付けていく、という方が実践的で僕は良いと思います!
あなたはどんなプログラミングスキルを身に付けますか?
組み込みソフトウェアとは何ぞや?と検索したらこちらの記事が出てきました!
読みやすい文章と説明で、ど素人の私にも理解しやすかったです★
記事全体の柔らかな雰囲気もいいと思います~!
ありがとうございます~!
実際に業界の外の方に読んでいただけることを意図して書いたものなので、お役に立てたようで書いてよかったなと思えました :)