手段的な技術と陳腐化しない本質的な技術

ウェブには技術情報が溢れかえっています。C++のちょっとしたテクニック、Ruby on Railsのリファレンス、MySQLのチューニング方法……などなど。技術情報を発信する道具としてのブログは広く普及しました。我々エンジニアはRSSリーダーやソーシャルブックマークでそんな技術情報を集めます。大量の技術情報が流れ込んできます。

こうしてウェブから集めてきた情報を吸収し続ける毎日。でも、何か不安が残ります。最新の技術情報には精通しているはずなのに、圧縮アーカイバ、検索エンジン、3Dグラフィックスエンジン……、そんなかって憧れた魅力的なソフトウェアを、いつになっても作れる気がしない。作れるようになったのは、スクリプト言語とデータベースを使ったウェブアプリケーション。それなら1時間もあれば思ったものは作れるのだが。

なぜか。ウェブに溢れる情報は、そのほとんどが、手段的で陳腐化しやすい知識だからです。「こうしたらこうなる」なんてノウハウ的な知識ばかりが増えても、背景にある理論の理解を必要とするソフトウェアを作ることはできません。圧縮、検索、3Dグラフィックス、それぞれの実現にはしっかりとした理論体系があります。

また、ノウハウは次々と新しいものが見出されますから、すぐに陳腐化してしまいます。次から次へと新しいことを覚えて、それがどんどん陳腐化していく。さながらゼロサムゲームの様相です。

計算機を扱うにあたって、もっと本質的な知識とは?アルゴリズムとデータ構造、情報理論、計算機の動作原理、情報検索、情報圧縮…などなど。これらの知識は、ウェブでは手に入りにくい。手に入ったとしても、ウェブはそんな情報を吸収するために最適化されているとは言い難い。長編小説をウェブで読む人は少ないのと同様、体系的かつ陳腐化しない重厚長大な技術の情報源は書籍(特に大学の教科書)や学術論文にあります。

ではウェブを捨て、教科書に頼るべきか。

困ったことに、教科書から得られた知識は陳腐化こそしないものの、即効性は薄いんです。Railsを覚えれば10分でサイトが作れるし、jQueryを覚えればウェブのUIがさくさく作れる。Eclipseを覚えれば作業が楽になる。では、情報圧縮理論を学んだら……、圧縮プログラムが作れる……、「そんなのzlib使えばいいじゃん!」。

検索エンジンはできた、どうやってユーザーに届ける?今ならiPhoneのUIを作ると良いのはわかってる、でも自分はコンソールのそれしか作れない!困った。

プログラミング作業の80%、いや90% は経験やノウハウが要求される作業です。ですから、手段的な知識の量が、効率的に開発を進めるための助けになります。この90%をいかに積み重ねるかで、ユーザーにとってのソフトウェアの魅力が決まります。しかし、残り10%では本質的な知識が要求されます。そして、その10%で何をしたかで、ソフトウェアの革新性が決まってしまいます。

GMailを見てください。色々な小さな工夫が積み重なっています。工夫のひとつひとつは、技術的には難しい話ではないかもしれません。でも、そんな積み重ねが、ストレスなく使えるサービスを提供する原動力になります、ユーザーにとってはそこが魅力です。

バックエンドはどうでしょう。世界中から寄せられた膨大な数のメールを日々処理し、アーカイブし、検索できるようにしなければなりません。大量のデータを効率的に扱えるアルゴリズム、ミドルウェア、検索技術が必要です。ユーザーはそんなことに関心はないかもしれません。でも、そこを乗り越えなければ、革命を起こすことはできません。

手段的な知識は、ユーザーに製品を届けるために必ず必要になります。そしてその知識をもって作る箇所は、ソフトウェア開発の大部分です。だからといって、手段的な知識を得ることだけに夢中になってはいけません。クリテイカルな難しい問題を解かなければいけない場面は、いつか訪れます。そしてその問題を解けたということが、ソフトウェアに革新性をもたらします。その力は、陳腐化しない知識によって養われます。

結論: 日々の開発のために手段を学び、躍進のために本質的な技術を、バランス良く学びましょう。前者はウェブや書籍で、後者は教科書や論文で。何だって、どちらにも偏らない中庸こそがベストです。