EJPスタッフブログ

ソフトウェアやボードゲームの開発を行うEJP株式会社のスタッフブログです。

【WEB系プログラマへ】組み込み系、ネットワークプログラマの悩み

こんにちは。Tetoatomです。

組み込み系、ネットワーク関連プロトコルの開発にたずさわってきましたが、悩みがあります。

まあ、そこまで悩んでないですけど。。

まずは、組み込み、ネットワーク関連とは。

組み込み、制御系について

[caption id="attachment_1954" align="aligncenter" width="500"] By: Mozilla in Europe[/caption]

組み込みとは

ソフトウェア業界における組み込み系とは、制御系とも呼ばれますが、主にハードウェアの制御などが必要なソフトウェア実装をしめします。

汎用的なパソコンなどとは事なり、ある装置などにソフトウェアを組み込むロジックが必要になります。

例えば、多くの家電製品ではソフトウェアのプログラムが実装されています。 電子レンジ、冷蔵庫、テレビやスマートフォンもハードウェアに加えてソフトウェアで制御されています。

スマートフォンや携帯電話で言えば、タッチパネルやキーボードの画面をタッチしたことをハードウェアが検知して、その信号をソフトウェアに伝達します。 それによって、タッチされたものがアプリのアイコンだったらアプリを起動する処理を制御したりします。

また、スマートフォンの設定画面などからWiFiをON/OFFしたりすることがあるかと思います。 その場合は、OFFボタンが押されたらハードウェアに指示をかけてWiFiの電波を検知しないようにしたりします。

ハードウェアとソフトウェア

ハードウェアの処理速度はソフトウェアに比べて高速です。(CPUの進化によりソフトウェアもかなり高速になってきましたが) その為、コアなことはハードウェアで実施しソフトウェアはハードウェアからの情報をうまく使って応用的に処理を組み立てていきます。

その際、「ソフトウェアは遅いから」という理由で処理に遅延が発生することは許されない状況もあります。

その場合は最適なロジックを考えて無駄のないよう、シビアに速度を意識します。 多くの場合、コンパイラの最適化によって、解決されます。 C言語で言えばfor分よりwhile分の方がアセンブラになった時にステップ数が少ないからfor分は使わないとか、そこまでは考えません。 (その処理が何度も繰り返される場合は検討することもあるかもしれませんが、ほぼ意識しません。)

また、ハードウェアでは単純なことしかできない場合が多いです。 というか、ハードウェアではそこまでしないという理由をつけられ、ソフトウェアが肩代わりをする場合が多いです。

ハードウェアのイメージとは、基盤があって、一度製造したら変更にはコストがかかると思うかもしれません。 しかし、最近ではFPGAなどのブログラマブルなハードウェアも存在してソフトウェアの様に論理的に改変が可能になっています。

その為、ハードウェアに問題があった場合はFPGAを改変すればよいのですが、多くの場合、ソフトウェアが尻拭いする羽目になります。

組み込み系のハードル

組み込みは多くの場合、C言語で実装しますが、C言語にはフレームワークの様な物はありません。 しかし、ある意味ハードウェアというフレームワークを使用しているイメージかもしれません。 そのフレームワークの中でしかソフトウェアは動けないので、フレームワークの悪い部分などは実装でカバーすることになるし、ハードウェアが変われば、また違う実装をする必要があります。

このイメージはPHPJavaなどでも、フレームワークによっていろいろとしがらみがあると思いますので、WEB系プログラマーもイメージしていただけるのではないでしょうか。。 (すみません、この辺はあまりわかっていませんが。。)

まあ、この辺りは悩んでいないです。 このハードルが面白いし、解決するところに達成感があります。

派生プロジェクトであってもハードウェアのアップデートはよくあります。 その際には、母体プロジェクトと同じ機能が必要でも、スクラッチで実装なんてよくあります。 (そっちの方がコストが低い場合もあるのです。) ただ、概念は踏襲できるので、より最適なコードを作ることができます。

作ったコードを壊して、作り直してリファクタリングすることが、一番技術者を成長させると思っています。

ちょっと、脱線しましたが、組み込みとはこんな感じです。

ネットワーク関連について

[caption id="attachment_1955" align="aligncenter" width="500"] By: Karin Dalziel[/caption]

ネットワーク・プロトコルとは

私が経験したネットワーク関連とはサーバー構築とか、WEBとかそういうことではありません。 プロトコルそのものの開発です。

例えば、HTMLとかPHPとかで、WEBページを作成してもHTTPというプロトコルがなければ、クライアントは画面を閲覧することはできません。

また、ネットワークにはレイヤがあります。HTTPはアプリケーション層というレイヤに位置します。

HTTPだけでは、実際のデータを転送することはできません。 トランスポート層に位置するTCPネットワーク層に位置するIPなどが必要になります。

また、クライアントに限らずサーバー管理者にとって、サーバーのリソース管理が用意にできるSNMPというプロトコルもあります。 「[SNMP]サーバー管理者に絶対必要なプロトコル

このように特に意識はしていないと思いますが、一般的なクライアントはプロトコルを意識せずにアプリケーションを使用するでしょう。 しかし、だれかがこのプロトコルを作っています。 だれかが作っているおかげで、WEBプログラマやアプリケーションプログラマは比較的上位のレイヤの意識だけに専念できるのです。

さらに、上記したプロトコルLinuxなどのオープンの環境では、用意にソースコードを見ることができると思います。 その為、細かな実装をソースコードを追うことで知ることができるかもしれません。

しかし、私はさらにレイヤの深いところも経験しました。 レイヤ3のネットワーク層よりもさらに下のレイヤです。

たとえば、レイヤ2ではイーサネットの世界です。 IPアドレスは登場しません。すべてMACアドレスで制御します。 このレイヤを使用した製品はレイヤ2スイッチなどと呼びますが、多くの場合、ソフトウェアのみの実装というのはありません。 ここでも組み込みの要素があります。 ハードウェアでコアな部分は制御してソフトウェアはその情報から応用的に処理していきます。

まずは、このレイヤの仕組みをソースコードなどから知ることは難しいでしょう。 実際の実装は、実装した人しか知り得ないと思います。もちろん、情報セキュリティ的にも外部へもらすことはないでしょう。

実装について

プロトコルの実装はRFCIEEEITU-Tといった標準化された勧告から読み解きます。 この勧告は頭のいい大勢の方々が集まって考えに、考えられた仕様です。 勧告はネット上で公開されている場合もありますので、読むことはできますが、実装例などはなく、文章で示されています。 また、有名なプロトコルは翻訳されていますが、プロバイダーの様なバックボーンで使用するプロトコルについては英語のドキュメントしか存在しないことも多くあります。

まずは、英語の壁を超えなければなりません。 ネイティブでなければ、翻訳しながら様々なニュアンスを理解し、経験から想像してイメージを作らなければなりません。 状態遷移、シーケンス、実際のデータが乗るフレームについての記載は重点的にされている場合もありますが、多くの場合、大雑把です。。 その為、装置固有の使用環境などイメージして、フェールセーフなどの考慮も考えなければなりません。

WEB系プログラマからすると、組み込み開発者は、まだ、C言語なんか使ってるし、メモリ管理も自分でやらなければならないし。。 地味で泥臭いプログラミングかと思うかもしれません。 しかし、ハードウェアの制限や英語の仕様書から読み解いて、いろいろな使用条件から想像して最適な処理を考えることはやはり、同じソフトウェア開発です。 このあたりは非常にクリエイティブです。

開発モデルについて

[caption id="attachment_1950" align="aligncenter" width="500"] By: Riley Porter[/caption]

これらのプロジェクトで使用される開発モデルについてですが、主に「ウォーターフォール」になります。 よくこのことをWEB系の方に話すと、「まだ、ウォーターフォールモデルなの?そんなプロジェクトあるんだ」なんて言われることもあります。 WEB系やアプリケーション開発では、プロトタイプ型やスパイラル型、チケット駆動型などが今は主流のプロジェクトも有るでしょう。

厳密に言うと、状況に応じてすべてを組み合わせています。 とにかく、多くの場合、非常に巨大なプロジェクトになります。その為、基本的な開発はウォーターフォール型でなければ制御出来ません。 行ったり来たりしてるとあっという間にリソースを使い果たします。 基本的にはウォーターフォールで駆動し、問題点は次のステップとしてデファードします。 という風にスパイラルに開発していきます。

WEB系の方の話をよくよく聞いたことが無いのですが、このあたりはどうなのでしょう。。 アジャイル開発などもありますよね。 是非とも実際の話しが知りたいですね。。経験者がまわりにいませんが。。

で、悩みについて

ソフトウェア開発者、IT業界などというと、一般のかたは私のような開発を全くイメージしていただけません。 もう、しょうがないので「インターネットできるのは私のおかげだよ」なんて言っちゃったりします。(はい、言い過ぎです)

だいたいの方が、「じゃあ、ホームページとか作ってよ」とか、「面白いiPhoneアプリ作ってよ」なんてすぐに言ってきます。 私はiPhoneアプリも作ってますし、このブログのアクセス数も伸びてきてアプリケーションレイヤに慣れて来ましたが、まだまだこの分野においてはプロフェッショナルではありません。 先日も、Wordpressのデフォルト管理者ユーザーを標的にした攻撃にまんまと攻撃されて、自分自身では対処できませんでした。 「WordPressのadmin攻撃を受けました。。」 幸運にもこの分野に詳しい方にアドバイスを頂き、なんとか復旧することができました。 マジで泣きそうになった。。

しかし、この一件もあり、組み込み、ネットワーク関連に限らず、アプリケーションレイヤの知識も増やしたいと考える様になりました。

一般の方には私の仕事を理解してもらえず、悩みでしたが、それがバネとなりさらなる知識の向上に結びつきました。 今では、WEB系のプロジェクトにも興味が湧いてきています。

しかし、PHPなどは専門としている会社もあり、なかなか参入が難しいと来ます。 もちろん、私の様な未熟者は戦力にならないでしょうが、最近どうしてもWEB系プロジェクトをやってみたい!!と思って来ました。 まずは、何をやればよいのだろう、何がひつようなのだろう。。 それが解決した時、是非、、どなたか案件をください。。。

てなわけで、特に落ちはありませんでしたが、悶々としてたので、書くだけ書いてみました。。。。 少しでも組み込みの素晴らしさをわかって頂ければ。。