アプリケーションエンジニアとインフラエンジニアの違いは、アプリケーションエンジニアは、サービスやプログラムを作る仕事で、インフラエンジニアは、サービスやプログラムを動かす環境を作る仕事です。
その違いを具体的に見ていきましょう。
アプリケーションエンジニアの仕事とは
アプリケーションエンジニアの仕事は、プログラミングを行い、目的を達成するために必要な機能持ったアプリケーションを作ることです。
アプリケーションはソフトウェアと言われることもあります。その中でも役割分担があり、機能的に担当を分けると、大きく2つに分けることができます。
アプリケーションエンジニア
- フロントエンドエンジニア
- データ入力やデータ表示する機能を開発する
- サーバサイドエンジニア
- データ操作や外部とやり取りする機能を開発する
フロントエンドエンジニアは、スマートフォンなどのインストールアプリケーション開発や、ブラウザでアクセスするWebサイトの開発をイメージするとわかりやすいです。
アプリケーションやWebサイトは数も多く、情報も豊富で仕事として始め易いです。小規模で開発難易度は低いものが多いです。
主に開発に使うプログラム言語は、HTML5、CSS3、JavaScript、PHP、Ruby、Pythonなどです(PHP、Ruby、Python についてはサーバサイドで使われますが、データを画面に組み込む際に理解する必要があります)。
サーバサイドエンジニアは、API(決まった形式でデータ交換を行うインターフェース)やフロントエンドから受け取った情報を集計・加工する処理を開発するので、仕事していくイメージです。
汎用的なインターフェースやデータフローなどを意識した効率の良い処理の検討が必要で、外部接続なども伴う為、比較的規模が大きく難易度が高いものが多いです。
主に開発に使うプログラム言語は、Java、C++、Python、PHP、Ruby、SQLなどです。
各仕事を工程別に分けると、
- 目的に対してどうやって機能を実現するか設計を行う
- 設計に従ってプログラミングを行う
- 目的を達成しているかテストを行う
- 完成した機能を実際のサービスに適用して安定するまで保守を行う
開発する工数を見積りするときに意識することが多いですが、エンジニアは、規模やスキルによって複数の工程を担当して仕事をすることになります。
インフラエンジニアの仕事とは
インフラとは、インフラストラクチャー(infrastructure)という英語を略したもので、プログラムを動かす「基盤」と意味になります。
こちらも機能的に担当を分けると、大きく2つに分けることができます。
インフラエンジニア
- ネットワークエンジニア
- ネットワーク構築とセキュリティ確保を行う
- サーバエンジニア
- ハードウェア設定の最適化とデータの保全を行う
ネットワークエンジニアは、目的に合わせた最適な通信環境を提案し、ネットワーク機器の特性を理解したうえで適切にそれを配置し、セキュリティの保たれたアプリケーションを動かすために必要なネットワークを構築して維持していくことが仕事になります。
セキュリティの脆弱性や技術や情報については、常にアンテナを張っておいて、日々アップデートしてくことが求められます。
サーバエンジニアは、アプリケーションのパフォーマンスを最大限に引き出すための必要なリソースやOS、データを保全する方法を提案し、それを実現するハードウェアを選定し、構築して維持してくことが仕事になります。
アプリケーションエンジニアと近い位置にいるので、より高いコミュニケーションスキルが求められます。
各仕事の中を工程別にわけると、
- インフラを設計・構築を行う
- インフラのリソース監視を行う
- 機器の保守・サポートを行う
アプリケーションエンジニアより、それぞれの工程の役割分担が明確なことが多いので、各工程に特化した専門性を持ったエンジニアが存在します。
共通して必要なスキルとはなにか
アプリケーションエンジニアとインフラエンジニアに共通して必要なスキルもあります。
それは、インターネット接続に必要な、DNS(機器やサイトのアドレスに名前を付けてわかりやすくする技術)・SSL(通信を暗号化する技術)の知識です。
これは、多くの作業がインターネット接続を前提にして行われるので、その知識を使用することが多いです。
次に、Linuxなどコマンドを使ってOSの操作するコマンドの知識は、設定やファイル操作を行う際に必要になるので、どちらのエンジニアに必要となります。
最後に、多くのサービスや機能は、データベースにデータを蓄積して処理することが多いので、SQL(データベースでデータ層操作するための言語)の知識もあると良いでしょう。
アプリケーションエンジニアが知っておいた方が良いインフラエンジニアのスキルとしては、IPアドレスやデフォルトゲートウェイといった簡単なネットワークの基礎で、サービスの信頼性を高めるための2重化、動作を確認する際にネットワークを意識することが出てくるので、その知識があると良いです。
インフラエンジニアが知っておいた方が良いアプリケーションエンジニアのスキルとしては、データのバックアップ、テストツール、構成管理などにもプログラミングすることで、より効率的な作業ができるので、何かしらのプログラミングの知識があると良いかと思います。
それぞれのエンジニアの今後は
今までは、同じようなシステムを個別にインフラからアプリケーションまでを開発していましたが、今後は、仮想化やクラウド化により、インフラは集約されて、より大規模になっていくことが予想されます。
また、アプリケーションはどんどんサービス化されて、個別で1から作られなくなってくるでしょう。
それに伴い、インフラエンジニアが扱うプロジェクトは、現在よりも大きくなっていき、今よりもさらに専門性や責任感が高まって行くでしょう。
アプリケーションエンジニアはインフラが仮想化されていくことで、意識することが少なくなっていくので、機能やプログラミングに集中することができるようになる為、扱える案件も多くなっていくことになるでしょう。
ただ、義務教育でプログラミングを学習するようになり、プログラミングが特別なスキルでなくなる可能性があるので、自ら新しいサービスを生み出すことも必要になってくるでしょう。
補足:フルスタックエンジニアとは
よく見かけるフルスタックエンジニアという言葉について、実は明確な定義はないのですが、一人でインフラからアプリケーションすべて構築してしまうエンジニアもしくは、インフラエンジニアとアプリケーションエンジニア両方のスキルを持ちつつ、システム開発を各エンジニアと円滑に進めることができるスキルを持ったエンジニアだとおおむね言えるでしょう。
大規模なシステム開発では役割分担が明確なので、あまりこのようなエンジニアは必要とされない為ポジションとして中々難しいでしょう。
比較的小規模システム開発でインフラからアプリケーションまで行うような案件を繰り返して開発する環境で役割を兼務するか、交代していくことが必要になってきます。
こうした環境では、同じことを繰り返す傾向があるので、内容が古くなっていきます。そのため、新しい技術を常に学んでいく姿勢も必要となります。