私がLinuxと出会ったのは、約20年前に大学の研究室のOS入れ替えとして、
そして、就職後、一度転職してからLinux・Android関連の仕事を15年間やりました。
その間、アプリケーションやミドルウェア、デバイスドライバ、一通りやりましたが、
私が一番辛い状況でも楽しかったのは、組み込み系のデバイスドライバ開発をやっているときでした。
やっぱり辛くても楽しいと思える仕事が、自分に合っている仕事だと思います。
Linux・Androidの仕事内容は、アプリケーションからミドルウェア、デバイスドライバなど様々です。
単にLinuxの仕事に転職したいだけでは、入ってから後悔しかねません。
どのような仕事があるのかをわかった上で、自分のやりたいことを見つけて転職して欲しいと思っています。
そして最近では、LinuxというよりAndroidの方がよく聞くと思います。
昔は、ガラケーにLinuxが搭載されていたものもありましたが、
今のスマートフォンは、AndroidやiOSがほとんどです。
iOSはまた別の機会に紹介するとして、Androidは、Linuxとは全く別物ではなく、
ユーザー層の構造に違いがあるぐらいでカーネルは同じものを使っています。
それでは、Linux・Androidの仕事には、どのようなものがあるのか、
レイヤー別に解説したいと思います。
1.Linux・Androidシステムの全体像
Linuxの仕事をするためには、まずLinux・Androidそれぞれのシステムがどういう構造になっているかを理解しておく必要があります。
とはいっても、全部を理解する必要は無く、まずは大体こんな感じかなというぐらいの理解度で大丈夫です。
そして、LinuxとAndroidの違いもおおざっぱに言うとフレームワークが違うだけです。
各レイヤーの概略説明と仕事内容、仕事に必要な基礎技術を次項より解説していきます。
2.アプリケーションの仕事
アプリケーションとは、ゲームやホームページ、ニュースアプリなど、
人がインターフェースとして、見たり触ったりしているソフトウェアのことなので、
これらを企画、設計、開発、システムサポートすることが仕事になります。
この仕事のやりがいは、自分でプログラムしたものが実際に動きとして画面に見えるところにあります。
どういう仕事があるかというと、こんな仕事が多いです。
スマホアプリ開発:GooglePlayストアで配信されているアプリのようなアプリ開発
スマホゲーム開発:GooglePlayストアやDMMGameで配信されているようなゲームの開発
ブラウザアプリ開発:DMMゲームのブラウザゲームのようなアプリ開発
ホームページ作成:ある企業のホームページ作成など
この仕事をやるために必要な基礎技術は、こんなものがあります。
HTML/CSS : Webサイト作成やブラウザゲームなどブラウザ表示に使用します。
JavaScript:ブラウザ表示で動きを付けるときに使用するスクリプト言語です。
Java : ダブルクリックやフリック等のタッチ操作制御や画面の遷移制御などを行うときに使われます。
DB : データベースの略で、アカウント名のような画面から入力されたデータなどを保存するために使われます。
PHP/MySQL:WordPressにも使われているのでホームページ作成などが多い。
3.ミドルウェア・フレームワークの仕事
ミドルウェアの役割は、アプリケーションとデバイスドライバとの間に立ってデータ通信制御を行ったり、 Webサーバーやデータベースなどのサーバーもあります。
この仕事のやりがいは、アプリのシステムを制御しているという優越感です。
画面で絵的な動きより、システム的な動作を制御するということは、自分のプログラムの支配下にいるような感覚があります。
優越感がありますが、システム的に動作させないといけないので、
ソフトに動作不具合が出ると影響範囲が大きく、プロジェクトに致命的な損害を与えかねません。
優越感がある分、周囲に対する影響力があり責任が大きい仕事です。
実際にどういう仕事があるかというと、こんな仕事が多いです。
データベース管理: アカウント情報などのデータベースサーバーシステムを開発やメンテナンスを行います。
Webサーバー開発: Apacheなどを使用して、Webサーバーの開発やメンテナンスを行います。
動画・音楽再生: 動画・音声データファイルを解析して再生するソフトウェアの開発行います。
スマホアプリやゲーム関連の開発:フロントエンドのゲームシステム動作処理やサーバサイドのシステム開発を行います。
この仕事をやるために必要な基礎技術は、こんなものがあります。
Java:ミドルウェアではNative Javaと呼ばれ主にHTTP通信制御やアプリ間通信制御を行うときによく使われます。
C++: Javaと同じオブジェクト指向の言語で、GUIで使われているQtなどで使われている。C++のプログラム内でC言語も使用できます。
HTTPの知識:通信パケットがどのようなフォーマットになっているかなどの知識が必要になります。
サーバー知識 : Webサーバー、データベースサーバー、DNSサーバー、Sambaサーバーなどの知識が必要になります。
よく求人情報の中にサーバーサイドという表記がありますが、
これはLinuxのサーバーのことではありません。サーバー側のシステムのことを指します。
スマホゲームで例えると、
ユーザーであるクライアント側で戦闘画面になるとデータのロードが始まることがあります。
これは、その会社のサーバーからクライアント側にダウンロードして遊べるようにするためです。
必要に応じてサーバーとクライアント側が通信を行っています。
ですので、サーバーサイドの仕事とは、この時のサーバー側の動作システムの開発ということになります。
4.デバイスドライバ・組み込み系の仕事
これまで説明した、アプリケーションやミドルウェアは、LInux・Androidではユーザー層のソフトウェアになりますが、
デバイスドライバの仕事は、ユーザー層ではなく、カーネル層のソフトウェアになります。
ユーザー層とカーネル層の違いは、また別の機会で説明するとして、
カーネル層は、OSとなるカーネルとデバイスドライバで構成されています。
仕事内容は、ほとんどの場合、カーネルを開発することではなく、デバイスドライバを開発することがメインになります。
例えば、ある大手企業が新しいカメラ基盤を開発したが、それを動かすソフトがこの世に存在しないとします。
そのような場合に、このカメラ基盤を制御するソフトを開発しなければなりません。
こんな感じでデバイスドライバの開発の仕事が発生します。
この仕事のやりがいは、先ほどミドルウェアのところでもありましたが、
同じようにデバイスドライバが無いと、そのハードが動かせないという優越感があります。
どういう仕事があるかというと、こんな仕事が多いです。
デバイスドライバ開発: ハードデバイスに合わせたソフトウェアの開発を行います。
ポーティング開発: CPUが搭載されている基盤で、ソフトウェアを起動させることを目的とした開発を行います。
パフォーマンス改善:ソフトの起動時間の改善や、ある特定動作の処理速度改善など行います。
デバイスドライバや組み込み系の仕事をやるために必要な基礎技術は、こんなものがあります。
C言語: カーネルやデバイスドライバは、ほぼC言語で書かれているので開発もこの言語です。
C++: あまりこの言語で書かれているドライバはありませんが、ごく稀にあります。
割り込みドライバの処理は、速度を求められるため、アセンブラ言語で書かれていますので、読めて理解できるレベルは必要。
OS(カーネル知識):
ワークキューのプライオリティ値や割り込み設定など、ドライバを開発する上で、必要な知識です。
ハード知識( 制御するデバイスやGPIO,I2C,SPI,UARTなど ):
ハードを制御するのでそのハードのノウハウや知識、そしてそのハードと繋がっている通信線(I2C,SPI,UARTなど)や制御線(GPIO)を使うために必要です。
更にもう少し特殊な仕事になると、ブートローダーやCPUに関わるソフト開発業務もあります。
ブートローダーは、電源を入れたところからソフトが起動していく流れで必要な処理を行います。例えば、起動時にCPUに対する端子設定やメモリ設定などCPUに対する初期処理を行います。
また、CPUに関わる仕事とは、CPUの性能評価やペリフェラルのドライバ開発、ポーティング開発など、直接CPUに関係する仕事になります。
これらの仕事は、新規開発することは、ほとんど無く、
既に世の中にあるソフトウェアをベースにカスタマイズすることが多いと思います。
5.最後に
LinuxやAndroid業界は、スマートフォンやIot機器がなくならない限り、まず無くなりません。
自分が作ったプログラムが正しく動作したときの感動は何回やっても感動し、次また頑張ろうというモチベーションが保てます。
そして各レイヤーで紹介した仕事の基礎技術は、どこへ行っても必ず必要になります。もし自信が無ければ、スクールの活用や自宅でも容易にLinuxやAndroidの環境を作れますので勉強しながら、転職活動をしていくのでも良いと思います。
まずは、自分自身がどのレイヤーの仕事がしたいかを見つけることが大切です。
この記事が、その助けになれば幸いです。