「けしからん」で有名な、登大遊氏が相変わらず素晴らしい
登大遊氏と言えば、日本が誇る、誰から見ても本物の「エンジニア」であり、その技術面や成果物の素晴らしさだけでなく、言う事もなす事も素晴らしいというオールラウンドに素晴らしいとしか言えない誰からも尊敬を集める人物です。(IT系の人間で彼を知らぬという人がいたらモグリ)
日本で唯一無二の存在と言ってもいいでしょう。
彼のインタビュー記事は毎回とても話題になる(情熱大陸というテレビでも特集されたらしい)のですが、今回は「ITエンジニアのアウトプット」について、語っています。
今回は、多方面に「刺さる」内容という事で、また話題になっています。
「安易な解決策に走るITエンジニアの未来に警鐘を鳴らし」・・・「ジャンクフードのような情報を吸収し、それに少し手を加えた程度の情報をアウトプットと呼ぶとしたら、そこに価値はない」・・・「低レイヤーの技術領域にこそ、未来がある」
一部引用してみましょう。
表面をなぞっただけの情報や正しさが担保されていない情報をどこからか拾ってきて、都合よくアレンジしてつくったコンテンツは総じてジャンクフード的と言えます。
自作のソースコードを公開するにせよ、テックブログを書くにせよ、人の役に立つレベルのものを出そうと思ったら多大な労力が不可欠です。
最終成果物が何であるにせよ、アウトプットありきで考えるのではなく、出す前に一度立ち止まって考えるべきだと思います。
よくないことに不特定多数からのフィードバックには麻薬性があります。
もし「いいね」やコメントほしさに、コンテンツを量産に走っているのだとしたら、もっとほかのことに時間を費やすべきというのが私の立場です。
ヘビメタの首振り状態でうなずきたくなります。
安易なアウトプットに熱心なITエンジニアが、万人受けを狙って、人が理解しやすいことばかりに目を向けているような気がしてなりません。
複雑でこんがらがった問題と向き合うのがITエンジニア使命であるはずなのに、それを避けジャンクフードばかり食べている。そんな印象です。
しかし、ITエンジニアだからと言って技術だけに触れていればいいかというと、それだけでは十分とは言えないと思っています。
若いエンジニアの中には、自分が決めた専門領域の技術さえ学んでいればいいと考える人が多くいます。
「歴史、哲学、経済、経営、政治は文系の学問。生物、化学、物理や数学はICTとは無関係だから、ITエンジニアである自分には不要」というわけです。
でも本当にそうでしょうか。コンピュータテクノロジーは、本来、複雑で高度な思考力を必要とする領域です。
現実世界にあるさまざまな事柄と同じように、人類の長い営みのなかで育まれたもの。そうした成り立ちを持つコンピュータテクノロジーが、その他の領域と共通項を持たないはずがありません。
実際、データ構造やアルゴリズムをつくるのに欠かせない論理的思考や概念を抽象化するプロセスは、哲学や政治システムのあり方に通じます。
また、ネットワークセキュリティの基本的概念も民主主義の歴史や安全保障の考え方と無縁ではありません。
ヘビメタの首振り。
問題が大きければ大きいほど、複雑であれば複雑であるほど、技術を含む幅広い分野に目を向けることは非常に大事なことです。
技術分野に焦点を当てても同じことが言えます。
「自分は誰より最新の技術トレンドをキャッチアップしているし、人一倍技術を学んでいる」と自負している人でも、ごく限られた一部、とりわけ高レイヤーに属することしか知ろうとしない人は少なくありません。
誰かがつくった開発言語やフレームワーク、OS、ネットワークを所与のものとして使っているだけなのに、すべてを知った気になっている。
それは決して正しい振る舞いとはいえないと思います。
ヘビメタの首振り。
もし、二番煎じではなく、真に役立つオリジナルなサービスを開発したいのであれば、人の尻馬に乗ってラクをしようなんて考えるべきじゃありません。
少なくともアメリカや中国の名だたるプラットフォーマーは、どれほど手間暇がかかっても、自前で高度で複雑なインフラ基盤を整えています。
彼らはそこに競争力の源泉があることを知っているからです。
私は日本の若手ITエンジニアに対し、低レイヤーの技術領域にこそ、未来があると知ってほしい。
この事実をみなさんに伝えることも、自分の大事な使命だと思っています。
ヘビメタの首振り。
新しいルールをつくるためには、現行のルールを越えていく必要があります。
場合によっては、責任を問われるのは覚悟の上で、行動が先行することもあるということです。
だからといって、ユーザーを危険にさらすわけにはいきません。
高い技術力と用意周到な準備、意思決定のプロセスや既存のルールを踏まえた行動が必要です。
そういう意味でも、さまざまな分野のさまざまな立場の人から学ぶ姿勢が大事なんだと思います。
ヘビメタの首振り。
まったく同感であって、実際、自分がこのnoteの色々な所で書いてきたことにはこういう考えが根底にあります。表面的な技術トレンドだけ追っかけて「いいね」を貰って自己満足してしまい、他人のプラットフォーマーの手の平で踊らされているだけでは困難な問題は何も解決しませんし、新しい事を実現することは出来ません。
大事なのは何を解決するためにどんなモノを作ったかであって、イケてる技術を使った云々みたいのは二の次三の次。(言いたくはありませんが、note.comにあるIT系ものの多くも「ジャンク」。中には光る逸材もあるけど)
また、日本の「エンジニア」の中で、私が「日本円、大丈夫?『電子マネー』というガラパゴス」で書いたような国際政治から世界の歴史から金融から人文社会からビジネスに係るような話しを理解している人がどれだけいるのでしょうか。日常的にそれらをインプットしていないと無理でしょう。
さらに、「ルールを破るならまずルールを分かった上で(無意味と思う部分を)破っていく」で書いたことにも通じます。
当然ながら「いいね」欲しさではなく、「不動産業界だろうがIT業界だろうが国交省の天下り元官僚だろうが、全方位に対してぶっちゃけて指摘すべきことはする、というだけ」であります。
さらには、先月ですが自分は(note移行前の)元ブログでこういうのを書いています。
基礎技術をやるエンジニアが日本で少ない現状を嘆く
通常、基礎研究と言えば理系の分野で、その歴史の長さや人材の厚みが日本の産業における優位点としてよく取りあげられます。
インターネットやソフトウェアの世界でも同様に、基礎となる技術分野というものが存在します。しかし、なぜか日本ではそういった基礎技術をやるエンジニア人口が非常に少なく、そこだけすっぽりと抜けている感があります。
日本では基礎技術が軽視されているのか、教育レベルが追い付いていないのか、そもそも必要性が広く理解されていないのか・・・
基礎研究をおろそかにして手っ取り早い応用ばかりがもてはやされる状況は健全とは言えず、日本の競争力を極端に削ぐばかりですので、残念でなりません。
基礎技術とは
コンピュータープログラミングの初期の頃といえば、ベタな話しですが、物凄く頭が良い数学系の人達が始めたものでした。C言語やUnixが生まれたベル研究所では、文字通りノーベル賞級の数学や物理の博士号保持者がその辺にゴロゴロしていたわけです。そうした人達が、CPUやメモリと言ったハードウェアを制御しながら、色々と便利な事をより簡単にするためにプログラミング言語は発展していきました。
高級言語、低級言語
「低級言語」とは、CPUやメモリといったハードウェアに近い所を扱うプログラミング言語を言います。決して低級=レベルが低いという意味ではありません。ハードウェアに近い下の部分を直接扱うので「低級」で、上に行くほど日常言語に近く、より高度に抽象化されたものになります。それを「高級言語」と言います。一般的に、高級言語になるほど楽で便利ですが制約も多くなります。
高級言語は、JavaScriptと言ったスクリプト系の言語やPython、JavaやC#、Goといった言語も高級言語寄りです。
低級言語は、機械語やアセンブリ言語から始まって、厳密に言えば高級言語だけどC言語やC++が低級言語寄り。後述するRustも低級言語寄りです。
プログラミング言語は発展し、色々と楽になりましたが、基礎は待ったく変わっていません。基礎をやるのは今でもC/C++といった低級言語寄りの言語を使います。例えば低級寄りの言語はOSそのものを作れますが、JavaScriptなんて基本そのOSの上で動くブラウザの中でしか動かせないスクリプト言語です。
エンジニアとユーザー
自分のような超がつく文系人間に適しているのは、高度に抽象化されて日常言語に近い高級言語です。数学的な知識やコンピューターサイエンスの教育を受けていなくても、高級言語であれば簡単に習得できます。
因みに自分は一応C言語も基本は分かりますが、複雑で高度な演算もハードウェア寄りの事もやらないしできないし、寧ろUIで凝った事をしたいので、最近ではC#/WPFばかりです。(大昔は色々やっていて、特にDelphi - つまりはObject Pascal - やPerlも大好きでした。Delphiは、ポインタも使えてC言語のように低級言語的な事も出来る高級言語みたいな立ち位置でしたが、基本的にはどっちつかずみたいな立ち位置か・・・あるときDelphiのソースコードを読んでいたらいきなりインラインで普通にアセンブリのコードが書かれていてドン引きした覚えがありますw)
ですから、自分は一度たりとも「エンジニア」と名乗った事はありません。たとえ万人が使うようなソフトウェアを幾つも作ってはいても、自分は単なるIT技術を利用する「ユーザー」だと自認しています。基本的にエクセルのマクロを弄る事務員さんと変わりはありません。出来合いの既成プラットフォーム上で、提供されたものを弄っているに過ぎないと思っているからです。
低級言語の必要性
「ユーザー」ではない、自らプラットフォーム側に回って提供者となり、革新的で新しい事をやるなら、低級に近い言語を使う事が必須となります。OSやDB、サーバー、ブラウザといった、今日の基礎的なプラットフォームは全てC言語、またはC言語系のC++などで開発されてきました。
社会にインパクトを与えるようなものを作ってプラットフォーマーになるには、C/C++は必須です。
例えば、ビットコインのような全く新たなマネタリーシステムを開発するには、わざわざ調べるまでもなく、100%、まず間違いなくC/C++が使われているだろうね、と分かります。暗号とブロックチェーンとコンセンサスアルゴリズムの分散システムと聞いただけで、C/C++の香りがプンプンします。
また、昨今テレワークなどで注目のオンライン会議アプリなど、動画や音声通信といった技術を扱う際にも、C/C++が必須となります。JavaScriptなど(非C言語系)でも動画・音声の処理や通信を「使える」けれど、実の所はC/C++で作ったプラットフォーム上でそれ(ネイティブライブラリなど含む)を「利用」しているにすぎなかったりします。改良したり既定の枠からちょっと外れた利用をしたくても、ソースを弄れなくてどうにもならないハメに陥る訳です。
C/C++では、ポインターはもとよりヒープ、スタック、といったメモリ操作の概念が登場し、少なくともアセンブリ言語の基礎的概念も理解していないと辛くなります。スクリプト系言語や、JavaやC#、Goではこのメモリ操作を意識しなくて済む、という利点がありますが、その分、パフォーマンスを最適化出来ません。
C/C++が使われるのは、単に昔から使われてきたから、とか、過去の資産があるから、といっただけの話しでは無いのです。
Rustの登場
もっぱらCやC++が独占してきたこの分野に、新たなRustというプログラミング言語が(特に英語圏で)旋風を巻き起こしています。(最近ではさらにZig言語みたいのも出現)「長い年月の中で初めて登場した“真のC++の代替”」と称されるもので、Rustの登場はプログラミング言語黎明期以来かOOP以来の非常にインパクトがある事です。
C/C++の特徴の一つは、「メモリを直接操作できるが故の高速演算処理」です。日本ではコンパイラレベルのアルゴリズム最適化と勘違いして、単なる計算速度を比較して、GoやJavaなど他の言語も早い、とか言っている人がいますが、悲しくなるレベルの勘違いです。
しかし、この利点でもある「メモリを直接操作」出来てしまうということは、バッファオーバーフローやメモリアクセス違反などの不具合(による脆弱性)を生み出しやすい、という弊害があります。利点と欠点がトレードオフの関係だったわけです。
このトレードオフの関係を解消し、利点を残しつつ、少しの制約でC/C++の欠点を解消してしまったのが、Rustという言語です。(なので、RustをGoと同列に語るのは根本的に無知な為の間違いです)
元はFirefoxというブラウザを開発するMozillaが作ったRustですが、OSのLinuxやAndroidなどにも使われ始めています。
越えられない壁
JavaScriptやPython、JavaやC#、Goといった高級言語寄りの言語と、C言語やC++、Rustといった低級言語寄りの言語の間には、越えられない壁が存在します。
今までJavaScriptやPythonをやっていた、という人間がいきなりC/C++やRustに乗り換えようとしても、基本的な概念の所からして理解が難しくて挫折する人が多いと思います。アセンブリ言語とかハードウェアに近い基礎的な事を理解していないからです。
高級言語寄りでは、私のような文系人間でも問題なく、論理的思考さえできれば普通に活用できますが、低級言語寄りの世界では、バリバリ演算を行うので、理系人間でなければ活用しているとは言えません。
自分にとっての「エンジニア」、というのは、こういう低級言語寄りのをバリバリ駆使して新しい技術を提供する側の人間の事です。(外見的には、個人的な経験上、アメリカに多いひげもじゃのグルみたいな人を連想する・・・例えばリチャード・ストールマンやウォズニアックみたいなw)
日本の現状は
日本における「エンジニア」の統計を取った訳でも、それほどマジメな議論をしたい訳でもないのですが、適当に某所などを見ていると、ひたすら「やれVue.jsがどうだ、Reactだ、***を使ってみた」みたいな、ブラウザ上でJavaScriptを使う、というだけでなく、既存のライブラリを、単に「使う」というだけの話しばかりです。いわゆる「フロントエンド」の開発での話題ですね。
はたまた、サーバーやインフラ側の開発では、AmazonやGoogleのクラウドサービスを「使う」というこれまた「使い方」で終始しています。Dockerにしてもしかり。「使いました」という話し。そういう話しを聞くにつけ、自分としては、なぜにDockerを作る側になれないのか、と思うのです。
以前からの話しかも知れませんが、Ajaxが登場してから特に、かれこれ、10年以上こんな傾向が続いているでしょうか。少し悲しくなります。
Rustの採用率でみる
基礎技術をやるエンジニアが日本で少ない、というアネクドートな仮説を検証するには、Rustの採用率を見れば一目瞭然かもしれません。RustはCやC++でやってきたようなプラットフォーム側のシステム開発で必要とされる言語です。これを海外と比較してみればよいのです。
きっと、RustやC++などの低級寄りの言語をメインで使っている「エンジニア」の割合は日本は有意に少ないように思います。少なくとも表に出てくる技術話としてはそう見えます。
問題点
フロントエンドやクラウドは10年前は新しくてイケてる技術だったかもしれませんが、未だにそればかりがチヤホヤされて持ち上げられる風潮は問題があります。
当時から疑問を持っていましたが、自らプラットフォームを作る事をしないと、提供されたプラットフォーム上で踊らされているだけで終わってしまうからです。「フルスタックエンジニア」と言っても、「ユーザー」で終始している気がします。
フロントエンドやクラウドを利用しているだけで満足していると、私のような少しITに詳しい「ユーザー」が増えてくると、すぐに用済みになってしまうでしょう。
日本から Big Techが登場しないのは、こういった基礎技術を駆使するエンジニアが少ないのも一因です。(ま、因果関係が逆で、BigTechが存在しないから需要が少なくて・・という事も言えるがニワトリが先か卵が先かみたいな話しか)
教育
そもそも、日本で現在「エンジニア」を名乗っている人達で、大学でコンピューターサイエンス(CS)を専攻した人達って、日本では何割程度なんでしょうかね。(日本のIT企業なんて、理系・文系の専攻なんて関係無く新卒採用して、新人教育レベルの素人に「エンジニア」をやらせているような話しでしょう、実際)
感覚では日本では2%以下の気がします。北米では90%くらいな気がします。<かなり適当 (というか、米国ではそもそもCS専攻でないと普通エンジニア職にそもそも採用されないし、インターンとか別の実績も要)
結論
理系の若いエンジニア志向の人達は、表面的なトレンドやイケてる風潮などに惑わされずに、C言語からハードウェアに近い所を含めて、コンピューターサイエンス(CS)の基礎をしっかりと学んで、プラットフォーム側へ回れるように頑張って欲しいと思います。
これ、1ヵ月前に書いたものですが、我ながらドンピシャ・・・。
最後に、もうひとつ氏のコメントを引用します。
既成事実を積み重ねて、粘り強く交渉、説得すれば突破口は開けます。そうでなければ、保守的な2つの組織から、シン・テレワークシステムのようなサービスは出せなかったはずです。
—— なるほど。しかし既存のルールを破るのは難しそうです。
確かに簡単ではありません。
でも、本当にやるべきことならどんなに面倒でもやるべきではないですか?
これまで、何人ものITエンジニアから「自分は頑張って努力したけれど、上司の無理解や、古くさいルールに阻まれて悔しい思いをした」という話を聞きました。
しかし、そのなかに上司や経営者を説得できるだけの材料を揃えて、粘り強く交渉に当たった人はどれだけいたでしょう。一度の挫折で諦めてしまった人も多かったのではないでしょうか。
これは自分も耳が痛い話しであります。まぁ、自分の場合は(エンジニアを自称したことも無いし)相手は一つの企業でもなく「業界+官僚」というまた別の生き物ではありますが。
でも、諦めているわけではありません。
