「ソフトウェアの時代」について

まぁなんか適当に思うことを。

■ハードの限界の露呈
ムーアの法則の限界はITのあり方を根本から変えると思う。この四半世紀、ITの現場レベルでは「困ったらハード増強」が一つの基本政策であったことは間違いない。ハードウェアの進歩は結果として、IT全体のパフォーマンスを上げ、結果として社会における有用性を増した。その一方でハードウェアの高進はソフトウェアの進化を止めていた側面は確かにある。

ソフトウェアのレイヤー、とくにミドルレイヤー〜アプリケーションのレイヤーでは、通信にしろ、分散処理にしろ、DBにしろ、OSにしろ、「業界全体としてトコトンできるレベルまでやったのか?」という意味では、実際はやっていないと思う。もちろん、各セグメントではそれなりに追求はしたけど、ドカドカ、金突っ込んで全部ひっくり返すというまでには至っていない。これはIT全体に言えることだけど、ソフトウェアにコストをかけるよりもハードを向上させたほうが費用対効果が文字通り単純に高かったことにつきる。特にエンタープライズとか、業務系とか言われるセグメントでは顕著だ。

現状のソフトウェアは実は、かなり昔からのハードウェアの制約故の制限をそのまま引きずっている面がある。これはこれでメリットはあって、ハードそれ自体の性能があがれば、前提を変えずにパフォーマンスを上げることで急場はしのげる。ただ、結果として「ま、これでいいか」的な話で放置されがちになり、実際放置されてきた。アプリケーションについては、わりと見えやすいのでSIの現場でも割とわかりやすいが、実はミドルレイヤーも同じ事情は抱えている。

今までのソフトウェアの前提というか制約は、「少数の非常に高い高性能のCPUと貴重なメモリー」である。ムーアの法則はこの伸長にストップをかけつつある。少なくともCPU(一コア)の出力は上らない。他方、メモリーの高集約化はどんどん進み、貴重なメモリーは容量的にはそれほど貴重ではない。こんな感じで前提が変わりつつある。

現在、ソフトウェアは前提を変えて「作り直す」ことで、桁違いの性能を出すことが実はできる。その意味では、あまねくITがいきわたったIT依存度の高い(と思われている)現状が「ソフトウェアの時代」ではなく、今からこそが「ソフトウェアの時代」が来る、というか来る可能性がある、というか来ないと先がまったくない。(苦笑

■前提を変えて作り直す?
現状のソフトウェアの前提、すなわち「少数の非常に高い高性能のCPUと貴重なメモリー」の前提、を言ってみれば「覆す」ことは、ミドル以上のほぼすべてのソフトウェアレイヤーにまたがって可能だ。

「コア数は一気に桁違いに増える、メモリーそれほど貴重ではない」という前提変更は、簡単に言えば「限られたリソースを使い切る」ことが目標ではなく「少々パワーロスは問題でない、むしろ有り余ったリソースにどういうビジョンを実現するか」という風に考えることが必要になる。考え方が180度違う。

たとえば、発想変えずに、現状のアプリケーションレイヤーの考え方から無理矢理やるとすれば、現行のままでマルチスレッド化を強烈に推し進めて、disk的な扱いの領域をそのままメモリーに移行するのが関の山だ。動くには動くがパフォーマンスは、想定よりもかなりイマイチな上に、障害発生時には「なんかこれ無理がないか?」ということになる。実際に経験をしている人も多いと思う。漠然とそもそもなんか根本的に間違ってないか?という感覚が普通だ。

要するに、現行のまま単純に使うリソースをどかどか増やすということでは、いろんなところにボトルネックが出てむしろ効率は落ちるので、ビジョンはもちろんのこと、使い方そのものも見直すことが必要になる。

SIオンリーの現場的にはあまりピンと来ないかもしれないけど、実体験的に分散ミドルやメニーコア対応のミドル・アプリから見たときの今の、ソフトウェアの基本的なあり方は、「根本的に合ってないよな〜」の一言につきる。OS・DB・VM・各種フレームワーク・分散制御・・すべてにおいて「そもそも前提がズレまくっている」という印象だ。小手先のパラメーターチューニングでどうにか動かすというのが現在で、いろいろメトリクスとったり、アーキテクチャを見たりすると、もう「そもそも論」になっている。特にプロダクトベースでいろいろやってると顕著に感じる。まぁとにかくコア数が増えても使い切れないし、メモリーも使い方がいろいろ効率が悪い。

仮にこれら全てに手をつけた場合、そのコストはきわめて膨大になる。人・モノ・金のすべての面でリソースが必要になるほどに。まぁ、それが故にどちらかというとソフトウェアを抜本的にやり直すよりも、ハードウェアでなんとか解決という道筋が選択されていたわけなんだけれども。

今後はすぐにメニーコア化+大容量メモリー化が来て、それでその後にすぐメニーコア化の限界が来て、また多ノード化に進むと思う。ここ10年は、スケールアウト→スケールアップ→スケールアウトの「一見すると円環に見える流れを螺旋のように上がる」進み方をするだろう。どちらにしても「少数の非常に高い高性能のCPUと貴重なメモリー」はもはや「なんの話だ?それは?」という扱いになる。

■コンピューターサイエンスにも影響する。

また、前提変更はそもそも、コンピュータ・エンジニアリングだけではなく、コンピュータ・サイエンスにも及ぶと思う。

現状のコンピュータ・サイエンスは割と実証的になってきていて、純粋理論だけという論文はほとんどない。これがいいか悪いか別として、ある意味、研究自体が既存ハードウェア環境に依存していた。

前提が変わってくると、開発すべきアルゴリズムも変わる。特に実証的であれば、あるほど変わってくる。なるほどビッグデータ的なものだとそもそも環境が大手のクラウドベンダーに限られるので、そもそも研究がやりづらいというところはあるとは思うが、メニーコア・大量メモリーが比較的入手しやすくなると、その流れもかわってくるだろうし、実際変わりつつあるようにみえる。

今後は、新しいアーキテクチャに沿った、よりスマートなやり方・考え方・実装手法が考案され検討されていくことが加速すると思う。その意味では先端系の流れも見ていて損はない。(ただし前提知識が必要になるけど)

■では「ソフトウェア」にどう向き合うか?

そもそも汎用機->オープン化->分散処理/クラウドという大きな変化の波が来ているのは、誰もが薄々感じていることだ。たぶん、地殻変動的なものが来るのはこれからで、クラウド勢(Google, FB, AWS, などなど)は勿論、巨大パッケージベンダーであるOracleやSAPあたりもいろいろ先に手は打っているが、ちょっとこれは・・・と感じているのが現実ではないだろうか。

こういう流れは、ベンダーにしろ、ユーザにしろ、またエンジニア個人にしろ、どんな風にとらえて行くか?が「大きな判断」だと思う。表面上はビックデータ・IoT・AIとかなんかそんな感じのバズワードが百花繚乱になるとは思うけど、その下の地層レベルでは相当な変動がおこっている訳で、それを睨みながら、自分たちの立ち位置を確認して行く事が大事だ。

組織にしろ個人にしろ多少はリスクとって前に踏み出してもいい気がする。これだけ社会が低成長だと、事を起こすってのは博打としては分が悪いのが普通だけど、IT屋としてはベースが変わるって意味ではソフトウェア・エンジニアリングに張るのは、時期としては悪くない。

■エンジニアサイドから見て:

○保険としてのSI
そんな意味づけから見たときに、悪評名高いSIの位置づけも変わってくる気もする。要するに個人的・組織的に、博打打ちの保険としてSIを見ておくということがそれほど無茶な話ではない。SIについては、今後先行きには諸説いろいろあるけど、日本のIT市場は大半がSIからできており、いままでもそうだったし、今後もそうでしょう。まぁほぼ半永久的にそうでしょう。規模は縮小気味にはなるとは思いますが、あと3億年ぐらいは続くと思う。なので、組織にしろ、個人にしろ、ある程度SIにコミットして、「SIにおける自身の有用性」をもっておけば、一時的にそこを抜けても、最悪保険としてもどってくる事ができる。市場は絶対ある。3億年分ぐらいある。

SI市場をどうとらえるかは、ITで生きる人間であればある程度考えなければいけないわけだが、自分はもう「失業保険」としてかんがえるほうが良いように感じている。エンジニアが最低限生活するための手段ですね。その辺出入りしながら、技術的に「ソフトウェア・エンジニアリング」に張っているところにちょこちょこ参加するのがよいのではないかな、と。組織としてものめり込むのではなく、保険的に見ていくというのはありでしょう。

(なお、SI自体の質や方法については、とりあえず打つ手はないので適当にさばくしかないと思う。これはユーザのマネージメントや、SI屋のマネージメントが双方「大きな問題」とそもそも認識している「にもかかわらず」、この状態に「なってしまっている」ことが課題。一種の累積的不均衡過程になっている感があるので、ステークホルダーがバカだとか罵倒してもどうにもなりません。個人的には行政・立法の介入しかないと思ってます。)

○自己研鑽
クラウドのノウハウとか、開発方法論とか、特定言語のlibに通じるとか、MLにつえーとか、そういうのはまぁ有るには越した事はないけど、それより、もっと基礎的なところを習得した方がよいと思う。自分もそうしている。

物理レイヤーとかそういう話ではなくて、もっとソフトウェアの基本的なところかな、という気がする。どちらかというと純粋エンジニアよりもサイエンスに近いエンジニアリングの手法あたり。DB系はほとんどそうだし、OS系VMGCあたりはそういう感じだと思う。

例えばJVMひとつとっても、根本的に作りを変える必要がある。ここについては多分異論は少ない。ただ、その場合はそもそもjavaでいいのかという議論もでる。残す根拠はレガシー資産しかないと思うけど、それ汎用機時代のCOBOLと何が違うの?という議論も再燃する。そもそもjavaの広義のインターフェイスもそれ自体が相当変更にはなるはず。また、それだったら自力で特定の目的にあったVM(というか言語も含めた実行環境ですかね)があっても良いという人も出てくるだろうし、使う側より作る側の方が面白いということであればいろいろチャンスもでる。

DBについては言うまでもない。今のトレンドは完全に分散OLTPであり、普通に100万TPSでACIDが達成できてる。これはOracleでもPostgresでもMySQLでもない、まったく新しいDBエンジンで次々に考案・検証されている。もういろいろ変わりすぎて目が眩むレベルだ。

いろいろと打つ手が必要だと認識はどこも強い。ただしこれらの話を理解するには、やはり、サイエンス+エンジニアリングが必要になる。

■ユーザー企業的に見て:

いいかげんハードリプレースでは限界があるよ的なことは自覚した方がいいと思う。ムーアの法則云々は、別段特別な話ではなく普通にその辺の雑誌には書いてある話だ。そもそもウチはあんまり関係ないな、というのは大きな勘違いで、日本企業の8割はムーアの法則のお世話になっていた。本人が気がついていないだけだ。

どこにどう影響がでるかははっきりしていて、要は業務系のアプリケーションのあり方で、パフォーマンスを上げようとすると、ゴンと金が投資にかかる、ということになる。「ソフトウェア」での全面再構築になるから。まぁやりたくないな、というのは普通の感覚で、それは正しい。投資に対するリターンも見えづらい。

とはいえ、これは、たとえて言えば、舗装道路・高速道路ぐらいしかインフラの発展のしようがないですよ、って時にオイラのところは馬車でいいや、間に合ってるから高い車は要りません、って話に近い。まぁ馬車は馬車なりに便利なところは多分あるはずなんで、それは意味があるので、そういうのはそれでいいと思う。それもまた選択ではある。

それはさすがにってところは「んじゃー、車買ってなんか意味あるの?」は明確にしないとまずい。圧倒的にスピードが上がって便利になりますってだけでは、さすがに通らない。ガソリンも食うし。このへんの説得策については、個人的にはあんまりよいアイデアはない。システムを人質に強迫するか、まじで利益にヒットする(コスト削減は無理ですよ。下がんないから)仕組みを真剣に考えるしかない。・・・というかそもそも最初から真剣に考えろって話ではありますが。

いずれにしろ、ユーザ企業様においては、いわばムーアの法則という一種のフリーランチでしのいでいたところで、それが有料になるので、コストという痛みは発生する。こればっかりは、「すみません、これから有料なんで払うもの払ってください」としかアドバイスのしようがない。

■結論的には
日本においては、非常に難しい時期にきたなと思う。ソフトウェアの基本的なアーキテクチャの変更は、想像以上にコストがかかる。人・もの・金、すべてにおいてかかる。現在のユーザ企業が、この超高齢化・超低成長・低消費時代にそれだけのコストを負担する決断ができるようには思えない。なので、ソフトウェアの時代がきますよ、といってもバラ色というわけではない。

ただ、ソフトウェア・エンジニアについては面白い時期に来るのは間違いないだろう。さて、どうしてやろうか?と考えをまとめながら、先端系の論文でも読んでいると色々と考えが広がる感じがする。とかく微妙な手詰まり感がある世間だが、ソフトウェア、という意味では面白い将来が待ち構えているのは、間違いないと思う。いろいろと悲観的な世相だけれども、道が細いとはいえ、準備をし、賭けるには足る環境になりつつあるのは良いことだと思う。頑張りましょう。そんな感じの2016年の年の瀬ですわ。もう年末かよ。はえーよ。勘弁してくれ。