これは,98年9月8日、岐阜大学工学部応用情報学科のプログラム演習のときに話した内容です。
(2002/09/24修正)
構造化プログラムミングに代表される。構造化○○の構造化とはなんであったのか。それは,大きい物を小さくして,直感的に分かる大きさにして扱おうという考えであった。さらに,それは,大規模システムにおいて,後戻りせずに開発をしたいと言う願望として,水が上から下へと流れるように開発を進めたいという「ウォータモデル」へと発展していった。
プログラムはどのように分割して分かり易くしていくか。それは,プログラムの3構造の認識により解決された。いわゆる,連続,選択,繰り返しである。これによって大きなプログラムが線の形をしたものとなり,それを部分に分割できるようになった。
さらに,システムをサブシステムにどう分割していくか。それは,どのようにやるかではなく,何をするかによって分割していくことであった。
どんどん細分化して階層構造を深くしていき,多くの部品が生まれた。その部品は,部品同士の機能が重複しており,その重複に注目して,部品が対象とする「物」を中心に再構築するという発想が生まれた。
プログラムを3つの構造(連続,判断,繰り返し)によってかけることは分かったが,さらに大きな意味の固まりとしてどう固めていくか,モジュールの分割の視点が,モジュールの独立度であった。モジュールの強度を高め,関係度を弱くするという発想である。
関係の深い要素を扱うルーチンは,一つのモジュールに閉じこめておくといいことが認識された。関係の深い要素の定義,さらにそれを扱う各処理もできれば一つのモジュールに入れておくのがいいことが分かった。モジュールの単位としてクラスが生まれる。
事務計算を合理化するものとしてコンピュータの利用が進み,いくつかのプログラムが作成され,捨てられていった。そこで,気づいたのは,変化しないものは,実はデータであった。プログラムは,時間をかけて作成するので,これに価値がある思っていたが,実はデータの蓄積,検索,加工の方が重要で,プログラム一つ一つは対して価値がないという発想が生まれた。
処理するデータ,残るデータを中心に設計すべきであると考えたのがデータ中心設計が生まれた。そのため,対象となるデータを標準化して,それの処理を考えていった。このデータへの処理を中心に設計をしていくという考えは,「モジュール分割」とも結びついていった。このデータを中心にそれに関連する処理をまとめていうことで,オブジェクト指向型の事務アプリケーションの作り方が生まれた。
コンピュータの能力が低く,また高価な時代は,コンピュータにとって無駄がない利用法がされた。それは,仕事を溜めて,一気に処理をするやり方である。一括して処理するので,バッチ処理と言われた。コンピュータの能力が高くなり,コンピュータの値段が下がるにつれて,コンピュータの無駄に使ってもいいが,人間にとって,時間の無駄がなく処理する形態,必要なときに,すぐに使えるコンピュータとして,対話型処理が生まれて,それが中心になってきた。
バッチ処理は,入力される,また,出力されるデータの構造により,プログラムが構造が決定してくると考えるとたいへん都合良く設計ができた。しかし,対話型プログラムは,指示によって,動作が決定すると考えた方が分かり易く設計できた。
コンピュータは指示があるまで,無限ループで動作し,指示があれば,それを片づけるという形である。そのため,指示は動作するきっかけであるとして,考え,イベントドリブンという発想が生まれた,これは,モジュールの起動がメッセージによって成されるという考えである。バッチ処理時代の考えでは,一つの処理の流れの中で,特定モジュールが呼び出されて実行されるであったが,イベントドリブン時代では,複数の無限ループの空回りの中で,メッセージが発生すると,それに対応するモジュールが起動して,メッセージを流すという考えになった。
プログラムを作成するときに,このデータをどう処理するか明確にしておく必要あった。また,すでにそれを実現すべき,部品的なプログラムはライブラリィとして用意されていた。プログラムの完成時点では,それがすべて揃って,リンカによって合体された。プログラムの実行前に,動作すべきプログラムのモジュールはできあがったいた。これは静的に作成されたいう。
現在は,プログラムの完成時には,インターフェースのみが規定に従っており,実行時に自動的にリンクしながら動作する形態が主流になってきた。
プログラムを作成するときに,よく似たプログラムが過去にあった場合,その差だけをプログラムすればよいとありがたい。これを実現したものが差分プログラムという考え方である。使えるところをコピーして貼り付けしてそれを修正して新たにプログラムを作成するが初期のやり方で,次の段階では,その部分を別のファイルにして,コンパイル時にそこに入れ込みコンパイルするという手法が合った。