torum

主に開発中のアプリにまつわる技術系の事。

基礎技術をやるエンジニアが日本で少ない現状を嘆く

通常、基礎研究と言えば理系の分野で、その歴史の長さや人材の厚みが日本の産業における優位点としてよく取りあげられます。

インターネットやソフトウェアの世界でも同様に、基礎となる技術分野というものが存在します。しかし、なぜか日本ではそういった基礎技術をやるエンジニア人口が非常に少なく、そこだけすっぽりと抜けている感があります。

日本では基礎技術が軽視されているのか、教育レベルが追い付いていないのか、そもそも必要性が広く理解されていないのか・・・

基礎研究をおろそかにして手っ取り早い応用ばかりがもてはやされる状況は健全とは言えず、日本の競争力を極端に削ぐばかりですので、残念でなりません。

基礎技術とは

コンピュータープログラミングの初期の頃といえば、ベタな話しですが、物凄く頭が良い数学系の人達が始めたものでした。C言語Unixが生まれたベル研究所では、文字通りノーベル賞級の数学や物理の博士号保持者がその辺にゴロゴロしていたわけです。そうした人達が、CPUやメモリと言ったハードウェアを制御しながら、色々と便利な事をより簡単にするためにプログラミング言語は発展していきました。

高級言語、低級言語

「低級言語」とは、CPUやメモリといったハードウェアに近い所を扱うプログラミング言語を言います。決して低級=レベルが低いという意味ではありません。ハードウェアに近い下の部分を直接扱うので「低級」で、上に行くほど日常言語に近く、より高度に抽象化されたものになります。それを「高級言語」と言います。一般的に、高級言語になるほど楽で便利ですが制約も多くなります。

高級言語は、JavaScriptと言ったスクリプト系の言語やPythonJavaC#、Goといった言語も高級言語寄りです。

低級言語は、機械語アセンブリ言語から始まって、C言語C++が低級言語寄り。後述するRustも低級言語寄りです。

プログラミング言語は発展し、色々と楽になりましたが、基礎は待ったく変わっていません。基礎をやるのは今でもC/C++といった低級言語寄りの言語を使います。例えば低級寄りの言語はOSそのものを作れますが、JavaScriptなんてそのOSの上で動くブラウザの中でしか動かせないスクリプト言語です。

エンジニアとユーザー

自分のような超がつく文系人間に適しているのは、高度に抽象化されて日常言語に近い高級言語です。数学的な知識やコンピューターサイエンスの教育を受けていなくても、高級言語であれば簡単に習得できます。自分は一応C言語も基本は分かりますが、数学が苦手で複雑で高度な計算もハードウェア寄りの事もやらないので、今はC#ばかりです。(大昔ー10年以上前までーやっていたDelphiやObject Pascalは、Cのように低級言語的な事も出来る高級言語みたいな立ち位置でしたが、基本的にはもっぱらどっちつかずな立ち位置か・・・あるときDelphiのコードを読んでたらいきなりインラインで普通にアセンブリのコードが書かれていてドン引きした気もする)

ですから、自分は一度たりとも「エンジニア」と名乗った事はありません。例え万人が使うソフトウェアを作っているとしても、自分は単なるITを利用する「ユーザー」だと自認しています。基本的にエクセルのマクロを弄る事務員と変わりはありません。出来合いの既成プラットフォーム上で、提供されたものを弄っているに過ぎないと思っているからです。

低級言語の必要性

「ユーザー」ではない、自らプラットフォーム側に回って提供者となり、革新的で新しい事をやるなら、低級に近い低水準言語を使う事が必須となります。OSやDB、サーバー、ブラウザといった、今日の基礎的なプラットフォームは全てC言語、またはC言語系のC++などで開発されてきました。

社会にインパクトを与えるようなものを作ってプラットフォーマーになるには、C/C++は必須です。

例えば、ビットコインのような全く新たなマネタリーシステムを開発するには、わざわざ調べるまでもなく、100%、まず間違いなくC/C++が使われているだろうね、と分かります。暗号とブロックチェーンとコンセンサスアルゴリズムの分散システムと聞いただけで、C/C++の香りがプンプンします。

また、動画や音声通信といった技術を扱う際にも、C/C++が必須となります。高級言語でも動画・音声の処理や通信を「使える」けれど、実の所はC/C++で作ったプラットフォーム上で(ネイティブライブラリなど含む)それを「利用」しているにすぎなかったりします。

C/C++では、ポインターはもとよりヒープ、スタック、といったメモリ操作の概念が登場し、少なくともアセンブリ言語の基礎的概念も理解していないと辛くなります。スクリプト系言語や、JavaC#、Goではこのメモリ操作を意識しなくて済む、という利点がありますが、その分、パフォーマンスを最適化出来ません。

C/C++が使われるのは、単に昔から使われてきたから、とか、過去の資産があるから、といった話しでは無いのです。

Rustの登場

もっぱらCやC++が独占してきたこの分野に、新たなRustというプログラミング言語が(特に英語圏で)旋風を巻き起こしています。「長い年月の中で初めて登場した“真のC++の代替”」と称されるもので、Rustの登場はプログラミング言語黎明期以来かOOP以来の非常にインパクトがある事です。

C/C++の特徴の一つは、「メモリを直接操作できるが故の高速演算処理」です。日本ではコンパイラレベルのアルゴリズム最適化と勘違いして、単なる計算速度を比較して、GoやJavaなど他の言語も早い、とか言っている人がいますが、悲しくなるレベルの勘違いです。

しかし、この利点でもある「メモリを直接操作」出来てしまうということは、バッファオーバーフローやメモリアクセス違反などの不具合(による脆弱性)を生み出しやすい、という弊害があります。利点と欠点がトレードオフの関係だったわけです。

このトレードオフの関係を解消し、利点を残しつつ、少しの制約でC/C++の欠点を解消してしまったのが、Rustという言語です。(なので、RustをGoと同列に語るのは根本的に無知な為の間違いです)

元はFirefoxというブラウザを開発するMozillaが作ったRustですが、OSのLinuxAndroidなどにも使われ始めています。

グーグルやMSが「Rust」言語でOS開発、背景に国家による諜報活動の影 | 日経クロステック(xTECH)

越えられない壁

JavaScriptPythonJavaC#、Goといった高級言語寄りの言語と、C言語C++、Rustといった低級言語寄りの言語の間には、越えられない壁が存在します。

今までJavaScriptPythonをやっていた、という人間がC言語やRustに乗り換えようとしても、基本的な概念の所からして理解が難しくて挫折する人が多いと思います。アセンブリ言語とかハードウェアに近い基礎的な事を理解していないからです。

高級言語では、私のような文系人間でも問題なく、論理的思考さえできれば普通に活用できますが、低級言語の世界では、バリバリ演算を行うので、理系人間でなければ活用しているとは言えません。

自分にとっての「エンジニア」、というのは、こういう低級言語をバリバリ駆使して新しい技術を提供する側の人間の事です。(外見的には、個人的な経験上、アメリカに多いひげもじゃのグルみたいな人を連想する・・・例えばリチャード・ストールマンやウォズニアックみたいなw)

日本の現状は

日本における「エンジニア」の統計を取った訳でも、それほどマジメな議論をしたい訳でもないのですが、適当にはてなブックマークなどを見ていると、ひたすら「やれVue.jsがどうだ、Reactだ、***を使ってみた」みたいな、ブラウザ上でJavaScriptを使う、というだけでなく、既存のライブラリを、単に「使う」というだけの話しばかりです。いわゆる「フロントエンド」の開発での話題ですね。

はたまた、サーバーやインフラ側の開発では、AmazonGoogleクラウドサービスを「使う」というこれまた「使い方」で終始しています。Dockerにしてもしかり。「使いました」という話し。そういう話しを聞くにつけ、自分としては、なぜにDockerを作る側になれないのか、と思うのです。

かれこれ、10年ほどこんな傾向が続いているでしょうか。少し悲しくなります。

Rustの採用率でみる

基礎技術をやるエンジニアが日本で少ない、というアネクドートな仮説を検証するには、Rustの採用率を見れば一目瞭然かもしれません。RustはCやC++でやってきたようなプラットフォーム側のシステム開発で必要とされる言語です。これを海外と比較してみればよいのです。

きっと、RustやC++などの低級寄りの言語をメインで使っている「エンジニア」の割合は日本は有意に少ないと思います。 

問題点

フロントエンドやクラウドは10年前は新しくてイケてる技術だったかもしれませんが、未だにそればかりがチヤホヤされて持ち上げられる風潮は問題があります。

当時から疑問を持っていましたが、自らプラットフォームを作る事をしないと、提供されたプラットフォーム上で踊らされているだけで終わってしまうからです。「フルスタックエンジニア」と言っても、「ユーザー」で終始している気がします。

フロントエンドやクラウドを利用しているだけで満足していると、私のような少しITに詳しい「ユーザー」が増えてくると、すぐに用済みになってしまうでしょう。

日本から Big Techが登場しないのは、こういった基礎技術を駆使するエンジニアが少ないのも一因です。(ま、因果関係が逆で、BigTechが存在しないから需要が少なくて・・という事も言えるがニワトリが先か卵が先かみたいな話し)

教育

そもそも、現在「エンジニア」を名乗っている人達で、大学でコンピューターサイエンスを専攻した人達って、日本では何割程度なんでしょうかね。

感覚では日本では2%以下の気がします。北米では90%くらいな気がします。<かなり適当

結論

理系の若いエンジニア志向の人達は、表面的なトレンドやイケてる風潮などに惑わされずに、C言語系からハードウェアに近い所を含めて、コンピューターサイエンス(CS)の基礎をしっかりと学んで、プラットフォーム側へ回れるように頑張って欲しいと思います。