基盤系プログラマ

いわゆる基盤系のエンジニアリング技術について、私の場合は、今の会社に入社して2年間で徹底的に叩き込まれました*1C言語なんかは独習の範囲内であって、コンピュータに関する基礎的な知識が不足していると痛感しています。一方、Computer Scienceに関する基本的なトピックはシンプルなものが多いので、数学の素養と、大学で詰め込まれた技術があれば何とかなる感じがしています。

飽くまでも、ですが、OSとかRDBMSとか、全ては手段です。ビル建設でいえば生コンのようなもの。砂利とか。肝心なのは、自分が欲しいビルの理想をきちんと描き、実現までの手段・手順を整理する。理想としているビルができているかを確かめる。難しいのは、「そんなビルが技術的な観点から本当に建設できるのか?」を確かめながら進むこと。
あるいは、それらの技術を全て、日本語にしてきちんと表現すること、設計を周囲に伝えて合意をとること、こういった能力が不足していると痛感しています。
まとめると、

  1. コンピュータ(道具)を操作する手段(プログラミング言語)を使いこなせること
  2. ソフトウェアの目的を定め、技術的な実現性を確認し、漏れなく設計できること
  3. 上記のことを、日本語できちんと表現し、文書(資料)にできること

といった能力が会社や実社会では要求されていると思います。このうち、大学〜大学院でトレーニングによって学べているのは1.だけのような気がします。論文を書けば3.の能力も鍛えられますが、会社で要求されるのはやはり博士レベルだと感じています。

ここで言う基盤系というのは、OSとかRDBMSとかプログラミング言語処理系とか、そーゆー奴ね。アプリケーションプログラムとかWebサービスとかを支える縁の下の力持ち。その基盤を作るプログラマをどのように育てるかというお話。

まあ、ハッカー予備軍をどのように育成するか。ハッカーって、育てるとか教育するとか、そーゆーものではなく勝手になるものだから、そもそも、そんなものはありえないという議論もある。確かに天才というのは、天才なので、教育がどうだこうだということはないのだけど、一般的なプログラマというのは、一般的な教育プログラムである程度底上げ的なことは出きると思う。

例えば、PostgreSQLの開発者を考えてみる。ちょっとRDBMSに興味がある、だけどどこからとっかりをつけていいのかよく分からないという初心者がいたとする。今ある、OSS利用者教育プログラムをいくらやったところで開発者にはなれない。利用者教育プログラムの延長線上には開発者に必要なトレーニングはない。全くないといっては語弊があるかもしれないがほとんどない。

現在は、顧客企業はITシステムを、自社内に作っています。ハードを社内に置いて、それに対するシステム構築をSI企業に発注します。SI企業はOSとかRDBMSとか基盤系のエンジニアをほとんど抱えず、赤い帽子の会社のものとか、神託の会社のものとかOSSのものから基盤系のソフトウェアを調達します。つまり、基盤系のエンジニアはほとんど仕事がなかったわけです。しかし、これから、クラウドコンピューティングの時代になってくると、顧客企業はITシステムを自社内に作らなくなります。そうするとどうなるかというと、一部のクラウド事業者が、自社内のインフラ管理のための基盤系のエンジニアを必要とし、技術者を自社に囲い込もうとします*2。何せ巨大なインフラなので、基盤系からフロントまで垂直統合する必要がありますから、広い視野を持ったエンジニアが必要とされます。
つまり、標準化されたLinuxや*SQLのようなRDBMSの使い方にだけ通じていればよいのではなく、バックエンドシステムの特性(読み込み性能が高いが書き込みは遅い、書き込み性能が高いが強整合性は保証されていない、等)について通じている必要があったり、要求に応じて自分たちのインフラの設計や特性をきちんと考えて作る必要があったりします。そのときに、単にOSを使うだけじゃなくて、コンピュータの内部や分散システムに造詣の深い技術者が要求されるようになると思います。

このように、基盤系エンジニアは貴重な人材となっていきます。ただ、クラウドの技術は事業者に囲い込まれていきますから、技術の華やかな面が表に出ることはますますなくなるでしょう。ちょうど、製薬会社が薬学博士を囲い込んだり、自動車メーカーが内燃機関の研究者を囲い込んだり、という風にIT技術の見え方が変わってくるでしょう。ちょうど、10年前まではソフトウェアは全てプロプライエタリで、ソースコードも技術も囲い込まれ、ハードウェアも汎用機ばかりで技術者が囲い込まれていた時代に戻っていくのではないでしょうか。
というわけで、今の大学生の皆さんは、

  • 基盤系エンジニア - コンピュータの内部構造や分散システムに精通し、CやC++、アセンブリなどプリミティブな言語でコンピュータおよびネットワークを操作し、フロントエンドが使う基盤を整備する
    • →クラウド事業者に重宝される
  • フロントエンド系エンジニア - ブラウザの内部構造やプラグイン、業務に精通し、JavaScriptRubyPythonなど抽象的な言語でユーザに対する最前線を実装するが、クラウド技術にもある程度通じていて特性を知っている
    • →SI事業者に重宝される

のどちらかを目指すのがよいのではないでしょうか。大学の中の人は、こういう選択肢を学生に与えることも目指してカリキュラムを組む必要があるでしょう。クラウドをやろうとしている会社であれば、こういう協力は惜しまないことと思います。さらに、大学がきちんとした人材を輩出することによって、ソフトウェアエンジニアを始めとするIT技術者の地位が日本でも向上するのではないでしょうか。
他にも、組み込み系やセキュリティ系というのもありますが、そちらは私の専門外ということで、ひとつ。。。

それでは、日本国内にどの程度クラウド事業者があって、そこが必要としている人材はどの程度の量なのか?というところは定量的な評価が必要なので、少し難しいです。しかし、基盤系エンジニアが不要になるということはありません。

*1:ただしOJTに限る

*2:そして学生を青田買い