ソフトウェア参謀という仕事
大槻, 2014.02.13
ソフトウェアは、我々の社会にとってなくてはならないものですし、ソフトウェア産業に携わっている人々は、日本国内だけでも何十万人という人々がいます。ここのところ耳にするのは、製品欠陥の露見やリコール、開発プロジェクトの頓挫、不条理なマネジメント、サービスの停止などが散見され、関わっている人々も決して恵まれた境遇とは言えないようです。こういった事態に陥っているのは、ソフトウェアの本質が見えていないことや、本当の問題の在処を誤解しているところに要因があるように思えてなりません。
【ソフトウェアと何か?】
「ソフトウェアとは何か?」と問われて、明快に答えられる人は少ないでしょう。どんな言葉や概念でも同じですが、人や状況によってとらえ方は異なります。
開発者側の観点からすると、「ソフトウェアとは、コンピュータ上で実行されるプログラムコードと、それに関わる文書である。」といったところがもっともらしい定義です。操作マニュアル、仕様書、設計書といったものは無論のこと、開発途中の段取りや、品質保証のための検査書類などもソフトウェアの一部と考えてもよいでしょう。
利用者側からのソフトウェアとは、何か機器に組み込まれているとか、パソコンやタブレットの画面を通じて、「何か動くもの」といったとらえ方しかできません。つまり、「ソフトウェアが入っているよ」と言われれば、そのことを信じるしかありません。素朴な言い方をすれば、「何かよくわからないけれど、賢そうな反応、動作、計算などをやってくれるもの」と認識されるのが、利用者にとってのソフトウェアなのです。
【抽象機械】
ソフトウェアは、人間が意思を持って制作する人工物です。建築ではビルや建物、芸術では彫刻やオブジェ、工芸では茶碗や皿など、世の中は人工物で満ちています。では、ソフトウェアが一般の人工物と違うところは何でしょう?
一つの特性は、「動く」ことです。これは本質的な特性で、開発者側からすれば、プログラムの「実行」であり、利用者側からだと「動作」という言葉に現れています。コンピュータの動作原理は、アラン・チューリングやフォン・ノイマンといった天才が基礎付けをした厳格な理論の上に成り立っています。コンピュータの構成要素である演算装置、メモリ、入出力装置といったものは、抽象的に計算、記憶、通信といった概念に昇華させることができます。
従って、「ソフトウェアとは、抽象的なマシン(機械)である」というのが、本質的な特性を的確に表していると思います。マシンは、動きます。自動車、ロボット、家電品などは、マシンです。さらに、「抽象的」というところがポイントです。物理的な制約を受けることなく、人間が自由に想像して作り上げることができるのです。四角い地球でも、西から登る太陽でも、どんな妄想も在りです。
プログラミングは、汎用コンピュータに対する操作指令の列を作る作業です。実は、汎用コンピュータは、数学的な計算の理論によって限界が示されているので、何でも作れるわけではありません。簡単に言うと、有限の時間で、手順的に解けるものは作れますが、人間が本来持っている創造的な活動は、抽象機械として構築するのは難しいのです。東大の入試問題は解けるけど、問題を作ることは人間にしかできません。
【スキル】
では、抽象機械としてのソフトウェアに関わる人に要求される能力やスキルは何でしょう? 今までのソフトウェア産業でベンダと言われる開発企業がやってきたことは、ユーザ企業がITやソフトウェアの仕様を決定し、それの実装を請け負うということです。これは言うなれば、ベンダ側は、どのようなソフトウェアを作るべきかという問題設定が完了した段階以降、汎用コンピュータとプログラミングの知識に基づいて、問題を解く役割を担っていたことになります。
コンピュータが得意とすることは、帳票処理、会計管理、在庫管理などの、決まり切っていて手順化可能な業務です。世の中には同じような業務が溢れているので、これをソフトウェアによって置き換えていく活動は、それなりに意味があることでした。同じようなソフトウェア開発を繰り返していくうちに、プログラミングの部品化や再利用も進み、コンポーネント、フレームワーク、パッケージといった組み合わせで、半自動的に開発ができるようになってきています。
従来のソフトウェア開発企業が限界にきているのは、産業構造上の問題です。ユーザ/ベンダという図式でソフトウェア開発をとらえる限り明日はありません。上流が大切だとか、要件定義のスキルを向上させるとか、はたまた、大規模なプロジェクト管理能力を養成したところで、旧来のビジネスの延長線上での話に過ぎません。開発技術は進化していきます。開発プロセスの中で、手順化・機械化できるものは、どんどん自動化していくことになります。つまり、開発のための単純なツール操作によって置き換わっていくことになるでしょう。生産性向上は開発業務の効率化に過ぎず、手順的な開発作業は、より安価な人件費で済む海外新興国へ移転してしまうことになります。
原理的に言うと、一度解かれた問題は、二度解く必要はありません。同じソフトウェアを二度開発する必要もありません。我々がやるべきことは、新たな領域を開拓し、新たな問題設定をすることです。
プログラミング言語の歴史をたどってみれば分かりますが、コンピュータへの指令の仕方は、機械語あるいはアセンブラ言語と呼ばれる低レベルのものから始まり、より人間が扱いやすいCやJavaといった高級プログラミング言語へ発展してきています。これは抽象機械の抽象度も上がってきていることを意味しています。抽象機械を集めて、その上に、より高度の抽象機械を構築していくことができます。そう、ソフトウェアが解決すべき問題は、どんどん抽象度が上がり、より高度になっていく宿命にあるのです。そこで必要なものは、新しい世界を描き、新たな問題設定をする能力です。
【新しい専門家像】
ソフトウェアに関する主要な仕事は、想像力を駆使して、抽象機械による新たな世界を創造することです。数学的な定式化能力、論理力、抽象化能力のみならず、世界を創り出すデザイン力も必要になります。これ等を一言で表すなら「概念操作の専門家」ということになるでしょう。おそらく抽象機械の構成要素である、計算、記憶、通信といった諸概念が、実世界でどのような価値を生むのかを描いていくことになります。
これからは知識主導の社会です。勝ち残っていく企業は、競争力の源泉となる知識を、手順化できるものはソフトウェアに組み込んで自動化し、人間がやらなくてはならない創造的な活動に専念していくことになるでしょう。もっと言うと、ソフトウェアを含めたビジネス領域全体、組織や仕組みをデザインすることが要請されています。従って経営に直接結びつく活動になりますから、私はこういった職種を「ソフトウェア参謀」と呼ぼうと考えています。