唐突にまたソフトウェア業界について考えていた。元々は受託開発が非効率云々というエントリ(受託開発が本質的に非効率である理由の考察 - GeekFactoryと■なぜ受託開発は非効率になってしまうのかを考えてみた)を読んでちょっと考えることがあったのだが、それがしまいに産業の歴史全体を考えるまでになってしまった。そんなことをやっているとなぜ日本のソフトウェアが世界で通用しないのかというのが目に映った。歴史をひもとけばこういう関係が何処に行き着くか解るかと思い、自分なりにソフトウェア産業におけるマイルストーンを書き出してみた。

内容については必ずしも正確だとは思わないし、また抜けているものも多々ある。特に最初のいくつかは果たして挙げるべきかどうかという点まで考えたが、歴史的にはあるべきと思ったので書いた。ハードウェアも本来考慮すべきだろうが、そこはあまり触れていない。ネットワーク対応やアジャイル(オープンソースより遅いと思われるだろうが、実はスクラムは1986年と古い)などは、順番を悩んだ。しかし全体の流れとしては間違っていないと思うので、あくまで参考程度に読んで、もっと考慮すべきものがあるとすれば是非教えてほしいかなと思う。

引き続き考察篇も執筆中なので期待されたし。

  1. 専業プログラマ。
    特定の一人がプログラミングし、全員の仕事を効率化するようになる。専任になるためその個人の実作業に対する作業量は減る一方、経験値が特定の個人に集中するため、プログラムの生産が効率化した。
  2. 複数人開発。
    複数人数が同時にプログラムを書くことで、一人がプログラミングするより巨大なプログラムを、より素早く開発することが可能になった。ドキュメント化や、ライブラリの作成と言ったものが含まれる。
  3. 初歩的な開発プロセス。
    設計・開発・テストという大まかな枠組みができることで、行き当たりばったりではなく、計画したとおりのソフトウェアをリリースするという形態ができた。ただし、プロセスが固定化することにより、成果物の柔軟性は減った。
  4. 専業ソフトウェア会社。
    「初歩的な開発プロセス」と「集約化」を受け、複数の組織をまたがってソフトの開発を請け負う形態が可能になった。同じようなプログラムを多数開発していくことにより、共通基盤的部分が洗い出されるため、それを共通部品として抜き出し定型ライブラリ化することにより、あらゆるプログラムをスクラッチから書くより生産性は向上した。
  5. 低級言語と高級言語
    定型ライブラリのようなものができてくるに従い、ハードウェアに依存しないより高度な言語の発明が可能になった。また、これにより特定のハードウェアに依存しないソフトウェア技術者が存在できるようになった。同時に低級言語がハードウェア依存度の高いところを担当し、高級言語とハードウェアの橋渡しを担当するようになる。
  6. パッケージソフトウェア
    専業ソフトウェア会社のさらに次の段階として、ライブラリのようなプログラムそのものだけでなく、複数組織の仕様をとりまとめて、一つのソフトウェアが複数の組織から利用できる、パッケージソフトウェアができるようになった。プロプラエタリなソフトウェアの発明もこの頃か。
  7. 標準ライブラリ
    「高級言語」が「パッケージソフトウェア」として普及し、しかもそれが複数のソフトウェア会社で使われることによって、各ソフトウェア会社を越える規模で共有される、全体の標準となるようなライブラリが構成された。
  8. 高度な開発プロセスとプロジェクト管理
    専業会社、高級言語、ライブラリによって飛躍的に高まった開発力を生かして、巨大なプロジェクトが運営されるようになると、それを運営するためには組織管理技術が必要になった。これにより、多数の人数が関わることで飛躍的に増大する不確定要素を最低限に抑え、大プロジェクトを成功させられるようになる。ソースコード管理ツールなどが使われるようになったのもこのあたり。
  9. モジュール化の推進
    プロジェクトが巨大化するにつれ、プログラム内部の依存性も飛躍的に増大した。これに対して、プロジェクト内のサブシステムの独立性を高め、インターフェースを明確に定義する、つまりモジュール化を行った。これにより巨大なプロジェクトも複数の独立したソフトウェアの集合となり、より単純化してとらえられるようになった。また、オブジェクト指向言語などの、よりモジュール指向の強い言語が台頭することになった。
  10. 小規模ソフトハウスとアジャイル開発
    巨大プロジェクトは大規模な変化をもたらすことができる一方で、コストも掛かるし、素早くリリースをできない。全体のスループットは巨大プロジェクトに劣っても、少人数によるコスト削減のほうがコストは削減できる。あるいは細かいリリースによりレイテンシや素早いフィードバックが期待できる。これにより、時代の変化により追随しやすい、安価でレイテンシの少ない手法が誕生した。
  11. 中級言語?軽量言語?
    従来高級言語と低級言語と大きく2つにくくれる言語も、よりソフトウェアの用途が複雑化するにつれ、高級言語ほど業務よりではないが低級言語ほどハードウェアよりではない、ちょうど中間にあたる言語の必要性がでてき、Cより使いやすく、Cのライブラリをモジュールとして扱える中級言語とでも言うべき環境が登場した。当初この地位に収まったのはいわゆる第四世代言語やVBのようなGUI/RADツールであり、のちにWebの時代になるとJavaや現在LLと呼ばれる言語群が主流になった。
  12. ネットワーク対応
    ネットワークの普及と、ソフトウェア規模が巨大になるに従い、1台のマシンで収まらないようなソフトウェアができるに従い、複数マシンにまたがった形のシステムが形成されるようになった。また結果としてインターネットを生み、ソフトウェア業界を世界規模で連携させる役目を果たした。
  13. オープンソース
    本来プロプラエタリなソフトウェアへのアンチテーゼとして誕生したFLOSSだが、単純にクロースとオープンという対比ではなく、一社主導によって開発されるパッケージに対する、複数社によって共同開発/利用ができるソフトウェア開発手法として定着した。これにより、プロジェクトは大企業を越え、世界規模での開発が可能になった。また、優れたソフトウェアが多数公開されることで、
  14. 世界規模のプロジェクト管理
    オープンソースの発達とグローバル化に伴い、従来の小さなソフトウェア開発モデルを越えた、世界規模でのプロジェクト進行を支えることが必要になった。メーリングリスト、チャット、BTS、Gitのようなバージョン管理ツールや再帰テストの自動化などがその代表的なものである。
  15. 知識集約型開発モデル
    多数のソフトウェアやライブラリ、軽量言語などが開発効率を飛躍的に向上させ、またアジャイル開発モデルが素早くニーズに合ったソフトウェアを提供できるモデルを提示することで、優秀な少人数による開発が非常に強い力を発揮するようになった。もはや大規模かどうかより、どれだけ精鋭かが重要なのである。
  16. クラウド
    おそらく今起こっている一番重要なムーブメントだと思うが、WebアプリケーションからASPという過程を経て、パッケージソフトよりもよりたくさんの顧客を相手に出来、また発達した知識集約型開発モデルにてより迅速にリリースをできるという2点が卓越していると思われる。しかしまだ結論づけるには時期尚早だろう。