エンジニアであれば一度は聞いたことがあるであろう、C/C++。なかなか習得が難しい言語ですが、一度習得するとエンジニアとしての可能性が広がります。今回はC/C++についてご説明し、キャリアの可能性を一部ご紹介します。
C/C++とは
C/C++はもともとはC言語とよばれる。今ある数多くのプログラミング言語の先祖のような存在で、かつてはプログラミング初学者が最初に学ぶ言語でした。C++はその派生言語となります。オブジェクト指向などが取り入れられ、多人数で分担して実装しやすくなりました。パフォーマンスを追及しようとしたらC言語で書くのが最も良いのですが、複数のエンジニアで構成されるチームでシステム開発をすることが増え、分担作業ができるようにオブジェクト指向と呼ばれる思想が取り入れられました。
いわゆるアセンブラと呼ばれる低水準の言語の中と比較すると高水準言語とよばれます。しかし、いまある数多くの高級言語の中では最も低レイヤーに位置する言語です。これは最もハードウェア側、コンピュータ言語に近いことを意味します。アセンブラと呼ばれる機械語を除くと、もっともハードウェア処理に近い言語と言えるでしょう。
C/C++の強み・良い点
C/C++の強みはなんといっても、実行速度にあります。C/C++はハードウェアに近い言語で、メモリアクセスなどを厳密に制御できるプログラミング言語です。すなわちハードウェアの性能を最大限に引き出すことのできる言語といっても過言ではないでしょう。さまざまなハードウェアに対応できるようなクロスプラットフォーム開発には不向きですが、特定のデバイスに特化したシステムを必要とする際は、C/C++を大きく貢献するはずです。
また仕様も豊富で、こだわった実装ができます。ポインタ、構造体といった旧来のC言語の仕様はもちろん名前空間やクラスといったオブジェクト指向の仕様も入り、最近ではラムダ式なども仕様も入り、拡張性が増しています。仕様が豊富であるがゆえに、極めるのが非常に難しい言語ではありますが、使いこなせるとエンジニアとしての可能性が広がり、市場価値も高まるでしょう。
C/C++の弱み・悪い点
まずは学習ハードルが高いことです。上記でも述べたとおり仕様が多く複雑なので、極めるのは難しいです。メモリやポインタについても深い理解が必要であり、初学者を苦しめます。しかし、学習ハードルが高いということは一度身に着けてしまえば他のライバルエンジニアを寄せ付けないたしかな技術力という資産を得ることになるでしょう。
筆者が初めて学んだプログラミング言語はJavaでしたが、C/C++で必要とされるポインタやメモリ確保という考え方はほとんど隠ぺいされてました。Javaにはガベージコレクションという機能があり、メモリの確保・解放を考えなくてもフレームワーク側で勝手に実施してくれるためです。このあたりをC/C++では自分で行う必要があります。最近ではスマートポインタと呼ばれる仕様もでてきているので、利便性は向上しています。
C/C++が必要とされる主な業界
もしあなたがC/C++のスキルを高めたかったり、すでにC/C++の知識・経験があり活かしたい場合、どのような業界が良いのでしょうか?
コンシューマーゲーム
PlayStationやSwitchなどいわゆるゲーム専用機における開発は、C/C++を使っているところが未だ多い状況です。ゲームは未だにメモリ容量との勝負で、効率的なメモリ使用をするプログラムが求められます。各ハードに最適化されたメモリでスレッド管理なども含め、ハイパフォーマンスなプログラミングが求められています。コンシューマーゲーム業界ではそのようなスペシャリストが多く存在し、刺激を受けるでしょう。
コンシューマーゲーム最近はUnityなどのゲームエンジンで代替されつつあるものの、ハイエンドのゲームの開発ではまだあまり使われていないのが現状です。
組み込みシステムの開発
C/C++はハードウェアのスペックを最大限引き出すことを得意とする言語です。そのため、組み込みシステムやアプリの開発で使われていることが多いのです。
皆さんがよく知っているAndroidもミドルウェアやハードウェアにアクセスする部分についてはC/C++で書かれていたりします。基本的にほとんどのスマートフォンアプリ開発では、上位レイヤーの高級言語がつかわれます。AndroidであればJavaやKotlin、iOSであればSwiftなどです。しかし、スマホのハードウェアに近い部分のアクセスや、ハイパフォーマンスを求める処理はC/C++で書くこともあります。またOS 内部のミドルウェアはほとんどC/C++です。最近はグラフィックスも簡単に利用できるライブラリが表れていますが、C/C++で書かれているものも多いです。
C/C++をきわめること = アセンブラをきわめること?
最近ではさまざまな高級プログラミング言語があらわれ、C/C++の必要性がなくなってきています。しかし、それでもC/C++エンジニアの需要は残り続けると筆者は考えます。というのも、ほとんどの組み込みシステムにおいてはハードウェアに近い部分の実装やミドルウェアはC/C++が使われているのです。かつてはアセンブラと呼ばれる低級言語がハードウェアスペックを引き出すために必要な言語でした。最近ではアセンブラを使えるエンジニアが減ってきており、開発効率等のバランスもあってC/C++にそのポジションが移りつつあります。といっても実はC/C++を極めること=アセンブラを極めることと言えなくもないのです。なぜならC/C++によってハードウェアのスペックを最大限引き出すためには、アセンブラの挙動を理解する必要があるためです。ハードウェアに近いところでメモリやポインタの利用操作フローを知ることがC/C++を極めることにつながります。
C/C++エンジニアは人材市場において貴重
より書きやすく、保守性の良い高級プログラミング言語が増える中で、徐々にC/C++エンジニアは減りつつあります。しかしながら、ハイパフォーマンスのプログラムを求める世界は残り続けるため、C/C++で実現できるエンジニアは今後も貴重な存在と言えるでしょう。今後のキャリア戦略を考えていく上で、もしあなたがハイパフォーマンスを出すプログラムを作れるスペシャリストになりたいのであれば、C/C++を学ぶだと思います。C/C++エンジニアとしてのキャリアを考えてみてはいかがでしょうか。