OO厨厨トレイン
~オブジェクト指向の現在過去未来~
田中 恒,佐藤 匡剛,菅野 洋史,大村 伸吾
Caution!!
オブジェクト指向の歴史という大それたテーマを扱っています。いろいろ間違えや大言壮語等あると思いますが、、、スルーせずにガンガン突っ込みください。ね。
OOかつエンタープライズ中心史観という立場を取っているため、IT業界における重要な出来事をすっ飛ばしている可能性があります。おそらくこれらの出来事もすべて確実にリンクしているのでしょう。
いろいろご容赦ください
このスライドの企画書..
「過去が希望をくれる」
最新の技術を追うことも大事ですが、過去を振り返り
自分達の立ち位置を確かめることも重要ではないでしょうか。
オブジェクトの広場のナビケートで、日本におけるOOの過去、
現在の世界の潮流、OOの未来へ辿る旅にでましょう。
時の列車デンライナー 次の駅は過去か?未来か?(OPナレーション)
自己紹介
オブジェクトの広場
株式会社オージス総研「オブジェクトの広場」の活動開始は前世紀末(1998年)にまで遡ります。当時は、日本のオブジェクト指向コミュニティを立ち上げてやろうという志で設立されました。
現在は、月に一度、オブジェクト指向関連の話題を取り扱うWebマガジンを発行しています。ネタはいつでも募集中!
旅の準備
オブジェクト指向って何
- 言語パラダイム?
- 分析設計技法?
- 開発プロセス?
- 考え方?
言語パラダイムからスタートして用法が拡大してきている。
ここでは敢えて区別しない!!
もくじ
- 現代編
- 過去編
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の次代~
- 未来編(Part7)
- まとめ(Part8)
OO厨々トレイン
現代編
佐藤 匡剛
オブジェクトの広場
Part1(現代)
オブジェクト指向を取り巻く現在の状況
- DI + AOP
- サービス指向アーキテクチャ(SOA)
- ドメイン駆動設計(DDD)
DI + AOP
DI(依存性の注入)
- EJBのような超重量級コンテナに対する批判から生まれた
- Rod Johnsonによる痛烈なEJB批判(『実践J2EEシステムデザイン』)
- POJO(ピュアオブジェクト)への回帰
- PicoContainer、HiveMind、Spring・・・
- 日本では2004年5月に Seasar2 がリリース
- コンポーネント同士を疎結合に組み合わせる技術
DI + AOP
AOP(アスペクト指向プログラミング)
- 元々は、オブジェクト指向批判から生まれたパラダイム
- DIコンテナとの親和性の良さから、爆発的に普及
⇒ Java EE 5(EJB 3)も批判を受け入れて軌道修正した
サービス指向アーキテクチャ
オブジェクトからサービスへ
- システム開発が1アプリケーションを超えた視点へと広がっていく
- EA(企業全体の最適化)の視点
- SaaS(Software as a Service)
- より大きな粒度の再利用への挑戦
- SOAを支える新たな技術要素
- Webサービス meets オールドスクールEAI
- メッセージング(非同期通信)の再発見(MQ、MOM)
- 新たなミドルウェアの登場(ESB、BPM)
- Java EE 5で数多く盛り込まれたWS-*仕様
- SOA時代のGoFパターン?
- 『Enterprise Integration Patterns』(Hohpe&Woolf, 2003)
ドメイン駆動設計
オブジェクト指向の大本命
- 長年培われてきたOOベストプラクティスの集大成
- 責務駆動設計(RDD)の正統な継承者
- ドメイン(=ソフトウェア開発の真の課題)にタックル
- 反復的にドメインモデルを深化させていく
- ドメインモデルを開発者ユーザ間の共通言語に
- ドメインモデルと実装コードとの対応付け(=MDD)
- 40(+1)のDDDパターン
- DDDの三原則(3パターン)
- ドメインモデルの構成要素(8+1パターン)
- ドメインリファクタリング(7パターン)
- 戦略的DDD(22パターン)
DDDパターン
OO厨々トレイン
過去編
菅野 洋史(yojik)
オブジェクトの広場
ここからは歴史をさかのぼっていきます
無理やり歴史区分に当てはめる
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の次代~
Part2(90年代末期-00年代前半)
近代編 ~J2EEとアジャイル時代~
エンタープライズ分野ではJavaが主流の言語になった。
ベンダーによるアプリケーションサーバからデータベース、場合によっては開発プロセスまでを含めた垂直統合モデルが誕生した。
またそれとは相反する流れとしてアジャイルな開発方法論が提唱された
JavaEE(J2EE)の歴史
- 1999年に発表
- Javaのエンタープライズ用APIセット
- 一つ前の時代の理想といえる分散コンポーネント指向
- 源流はIBMサンフランシスコフレームワークやCORBA関連の各仕様(トランザクションサービスなど)
- コマンド(コントロール)とエンティティの分離はIBMサンフランシスコフレームワークから
- ネーミングサービスやトランザクションサービスなど技術的な仕様はCORBAから
日本でのJ2EE(JavaEE)開発スタイル
開発プロセス(RUP)の導入
- 大人数が分担作業を行えるようなプロセス/アーキテクチャを選択
- 属人性の排除を念頭にしたプロセス(略
- コンポーネント化の重視
- なぜかイテレーション開発はしなかったり・・・
Javaとフレームワーク
Strutsの普及
- 開発者にフレームワークの概念が普及した
- オープンソースのフレームワークが開発案件で利用されるようになった
- MVCアーキテクチャの普及(本来のものとは違う)
Patterns of Enterprise Application Architecture
PofEAAは大きなマイルストーン
- 2000年以降のエンタープライズアプリの設計パターンの集大成
- 結果としてエンタープライズアプリ設計の「地図」になっている
- Railsに直接影響を与えている
- DDDに直接影響を与えている
モデリングブーム
UMLの普及によりOOモデリングが流行
- オブジェクトの広場
- オブジェクト倶楽部
- 各種書籍の出版
- 検定試験
- MDA
実際案件で利用された例は...
アジャイルブーム
重厚長大なプロセスに対するアンチテーゼ
- オブジェクト倶楽部での紹介
- アジャイル関連の書籍等が大量に出版された
- くわしくは以下のタイムラインで
- http://timeline.nifty.com/portal/show/2242
- この頃からコミュニティ運動が流行りはじめた
アジャイルブーム
Extreme Programing(XP)
- XPの誕生は1999年
- XPが日本に紹介されたのも同年
- オブジェクトの広場の平鍋さんのインタビュー
- http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview06.html
オープンソースブーム
オープンソースが世界に認知されたのもこの時代
- エリック・S・レイモンド3部作が発表されたのが1998年
- 伽藍とバザール・ノウスフィアの開墾・魔法のおなべ
- Netscape(Mozilla)のオープンソース化
Part3(90年代後半)
近世編 ~コンポーネントと開発方法論時代~
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の次代~
Part3(90年代後半)
近世編 ~コンポーネントと開発方法論時代~
90年代後半、開発方法論は統一への道を歩む。
またソフトウェア業界の永遠の夢であるソフトウェアの部品化について様々な試みが行われた。
JavaやRuby、Pythonといったオブジェクト指向言語の登場時期でもある
コンポーネント指向の時代
1990年代の業界の話題はコンポーネントと分散オブジェクト
今(00年代後半)の技術の伏線はこの頃にある!
- DCOM&COM
- OpenDoc
- CORBA関連の各種仕様
- COMやOpenDocは現在のプラグインで構成されたアプリケーションの始祖
- CORBAの各種仕様はJ2EE(JavaEE)に取り込まれている
Javaの登場
1995年Javaが正式リリースされた
- 世間の一般的の受け止めかたはWebページを動的にするもの
- プログラミング言語使いからは、Better C++ , 庶民化版Smalltalk
- 分散コンポーネントの実現手段として期待される
- 多様な実行環境が共存するネットワークで動作可能
- ポータビリティのある実行コードのやりとり
- ネットワーク経由でのクラスロード
UMLの登場
1996年にver0.9が登場
- 1981年 Rational社誕生
- 90年代後半、Booch,Jacobson,RumbaughがRatinal社に移籍
- 各種開発方法論の表記法部分を統一した規格を発表した
- UML CASEツール市場が誕生した
開発プロセスの誕生
UMLの登場後、開発プロセス(RUP)が生まれた
- Ratuonal社の製品は他のツール(構成管理,テスト)を取り込んで開発プロセス全般を担う
- それに対応するようにRational Unified Processも誕生した
パターン運動
開発プロセスとは別の流れとしてパターン運動があった
基本理念は、コンピュータ・ユーザーが自分自身のプログラムを書くこと
- Alexsanderのパターンランゲージを源流とする
- オブジェクト指向プログラムのためのパターン言語の使用(1987)
- 設計に特別なスキルや才能を必要としない事を理想とした
- パターンランゲージは利用者と開発者の垣根を払う試み
パターン運動
パターン運動のひろがり
- デザインパターン(1995)
- Erich Gamma,Richard Helm,Ralph E. Johnson,John Matthew Vlissides
- パターンコミュニティ
- c2.com(最初のwiki)
- 国際会議 PLoP
日本でのパターン運動
デザインパターン等が紹介された
- 「オブジェクト指向における再利用のためのデザインパターン」
- まさーるさんのページ
- JPloP(Japan Pattern Language of Programming)
パターン運動は成功したか
- 開発者のテクニック集としてパターンは成功
- 開発者とユーザの垣根を取り払う試みとしてはあまり成功してない
次代への伏線
Perl(1987),Ruby(1993?)やPython(1991)、PHP(1995)といった高機能スクリプト言語が広く認知された
Part4(90年代前半)
中世編 ~統合開発環境の時代~
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の次代~
Part4(90年代前半)
中世編 ~統合開発環境の時代~
90年代初めは、統合開発環境がリリースされ開発手法が大きく変わりつつあった。またGUIが一般化した時期であり、ビジュアルプログラミングに期待がもたれていた。
商用ビジュアル統合開発環境の登場
Next InterfaceBuilder
- 厳密には1998年登場
- GUIビルダーをもつ最初期の開発環境(結構衝撃的)
- Objective-Cを採用
- この頃までは、C++とObjective-Cが「Better C」の立場を争っていた
- 遥か太古よりつづく「静的言語」対「動的言語」戦争
Objective-CはSmalltalkの影響を受けて、VisualWorksはNextの影響を受けるというループがある
統合開発環境の時代
InterfaceBuilderの影響を受けたIDEの登場
- VisualBasic
- Delphi
- VisualWorks(Smalltalk)
- FORTE(4GL)
- etc.
部品化とオブジェクト指向
最初期のOOはGUIライブラリとセットで語られていた
- MVCやその後継(Smalltalk)
- MacApp (ObjectPascal)
- Application Kit(Objective-C)
- PowerPlant (C++)
- MFC(C++)
- VCL(Delphi)
- Galaxy(C++)
IoCやフレームワークという言葉もこの時代(のちょっと前)に生まれた
再利用可能な部品という意味でのクラスライブラリや、部品を動作させる枠組みとしてのフレームワークの実例としては最もわかりやすい
オブジェクト指向言語 in ビジネス案件
例:VisualWorksによる日本のビジネス案件
- 開発はC/SのUI部分中心
- 画面仕様書からつくる普通のクライアントアプリ
- 江川達也の作品「ゴールデンボーイ」にもVisualWorksがちょろっと出てくる!
海外では金融、軍事、半導体などの業界でロジックを含めた案件例が多かった
日本では確かに「別にVBでいいじゃん」的な開発が大半であった。
オブジェクト指向はマイノリティだった
九大病院の失敗もこの頃
開発方法論の誕生
オブジェクト指向言語にあった開発手法が強く求められた
- オブジェクト指向言語を利用するためには、
- オブジェクト指向言語を意識した設計が必要で、そのためには
- システムの問題をオブジェクト指向で分析する必要があり、そのためには
- 新しい開発方法論が必要である
開発方法論の誕生
開発方法論が重視された理由
- ソフトウェアの複雑化に由来するソフトウェア危機が叫ばれていた
- このような時代の要請から開発方法論が提唱された
- 実は「人月の神話(1975)」のBrooksはOOが銀の弾丸かもしれないと発言した事がある
- http://d.hatena.ne.jp/squeaker/20071024#p1
開発方法論の乱立
UML関係の書籍をあさると90年代初頭はまさに戦国時代
- Shlaer&Mellor
- Coad&Yourdon
- OOSE
- OMT
- Booch
- RDD
- OOram
- Object Behavior Analysis
- XP(の元にやったやり方)
開発方法論の乱立
二つの流れ
- オブジェクトやクラスの静的な構造を重視
- オブジェクトの動的な振る舞いを重視
- RDD,OOram,OBA
- XPやDomainDrivenDesignへつながる
当初、日本では構造派が重視され、振る舞い派はあまり紹介されなかった
開発方法論の流派
大島さんの日記に書かれていたumejavaさんコメント
http://d.hatena.ne.jp/squeaker/20050208#c1107958142
OMT, Booch <-> RDD, OBA, OOSE, OORAM などなどこのような手法の違いは、彼らがネイティブとしていたプログラミング言語によって生まれてきたといって、ほぼ間違いないと思います。ADA, C++ vs Smalltalk という図式が裏にあります。UMLは前者の人たちが大きな貢献をして出来ていったものと思います。
後者は長い間、大多数のモデラーから、「図も描かない野蛮な人たち」とさげすまれてきたのですが、Kent BeckのXP伝導により、今ではある程度の市民権を得ることとなったのです。
ソフトウェアの再利用性とオブジェクト指向
この頃からオブジェクト指向言語パラダイムを語る「言葉」が変わる
- かつてはオブジェクトとメッセージ交換が重視された
- 同期呼び出しでさえ、結果をwaitして待つメッセージ送信という説明だった
- この頃からカプセル化、ポリモーフィズム、継承、抽象化が重視されるようになった
- 再利用性や部品化を強く主張する
- 動的なオブジェクト指向から静的なオブジェクト指向へ主流が移る
どちらにしろ、この時代の主流はDOAでウォーターフォール
サクサクSmalltalkとか
Part5(80年代後半)
古代編 ~AI研究時代~
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の次代~
Part5(80年代後半)
古代編 ~AI研究時代~
オブジェクト指向言語の日本への伝達の時代
オブジェクト指向の黎明期(1980年代)、日本に最初のオブジェクト指向を伝えたのはLispハッカーだった!!
日本への輸入1
日本に最初にオブジェクト指向を体系的に紹介されたのは
- 1983年
- Bit誌の竹内郁雄(日本のLispハッカーの草分けの一人)さんによる短期連載
- 日本語で読める最初のSmalltalkの解説
和田研究室のことも乗せておく。(あとでかく)
日本企業でのオブジェクト指向
富士ゼロックス、富士ゼロックス情報システム
OO関連の人材を輩出
- 青木淳氏(Smalltalk)
- 羽生田栄一氏(UML)
- 阿部 和広氏(Squeak)
以下のような研究がおこなわれていた
Star/JStar
当時最強のオブジェクト指向環境
- 最初にSmalltalkを走らせたマシンがAlto
- Star は Alto の後継ハードウエアにStar システム(後に ViewPoint)を載せたもの。
- オブジェクト指向デスクトップ
- Smalltalk専用の環境ではなくInterlisp,Mesaなど様々な環境を動作可能
- 現在のユニコードより優れたコード体系などを備えてた
- らしいです。
この時代はAI研究の時代だった
- 日本ではIPAの第5世代コンピュータプロジェクト
- Prologに注目された
- LispやSmalltalkもなぜかAI関連
- オブジェクト指向もAIの一分野と捉えられた節がある
どちらにしろ、この時代のビジネスの主流はDOAでウォーターフォール
Part6(70年代-80年代)
先史時代編 ~黎明期~
- Part2(90年代末期-00年代前半)~近代:J2EEとアジャイル時代~
- Part3(90年代後半)~近世:コンポーネントと開発方法論時代~
- Part4(90年代前半)~中世:統合開発環境の時代~
- Part5(80年代後半)~古代:AI研究時代~
- Part6(70年代-90年代)~先史時代:オブジェクト指向誕生の時代~
Part6(70年代-80年代)
先史時代編 ~黎明期~
オブジェクト指向誕生の時代。現在の我々から見れば伝説と神話の時代
オブジェクト指向言語の誕生
Simula(1968)
- Ole-Johan Dahl、Kristen Nygaard によって開発される
- (一般的に語られている)オブジェクト指向言語の基本的な概念をそなえる
- クラス指向言語
- 名前のとおり離散シミュレーションのための言語
- Simula自身はオブジェクト指向言語を名乗っていなかった
- ノルウェー産(北欧か!)
オブジェクト指向言語の誕生
Smalltalk(1971,1972,1980)
- SimulaやLisp、ロゴの影響を受けている
- オブジェクト指向言語
- 明確に「オブジェクト指向」というコンセプトを元に実装された最初の言語
- 細胞(セル)としてのオブジェクトが、メッセージをやり取りすることによって、複雑な処理を実行するというメタファ
オブジェクト指向言語の誕生
C++(1979,1983)
- 1979年にBjarne StroustrupによりC言語の拡張機能として開発開始(C with Classes)
- 1983年にC++に改称
- C++は単なるOO言語ではなく、マルチパラダイム言語
- C++のOO部分はSimulaの影響を受けている
オブジェクト指向言語の誕生
Objective-C(1983)
- 1983年にBrad Coxにより開発される
- Cの上位互換の言語仕様
- オブジェクト関連の機能はSmalltalkの影響を強く受けている
- 実行時のクラス拡張機能などをもち、動的なオブジェクト指向言語
- Javaに影響を及ぼしている
オブジェクト指向における二つの流れ
静的と動的
-
静的とはクラス指向、プログラムが動き出す前に正確な世界を構築し、動作させる。
-
動的とはメッセージ指向、プログラムを動かしながら世界を変更していく
この流れが、現在のプロセスや言語に影響を与えている。(と思う)
この二つの流れがずっーと尾を引いているのだ
なお、当初「オブジェクト指向」は、この“オブジェクトへのメッセージ送信”を意味するものであったが、後に C++ の設計者であるビアルネ・ストラウスラップが 1986年に発表した“抽象データ型のスーパーセット”という「カプセル化、継承、多態性」に代表される考え方に置き換えられてゆくことになる。現在は、両者をミックスした概念で語られることが多く、これが「オブジェクト指向」を難解なキーワードにしてしまう原因のひとつとも考えられる。また、“オブジェクト指向プログラミング言語”に2つの元祖があるのはこうした背景による(後者の「オブジェクト指向」の立場での元祖は SIMULA )。
初期オブジェクト指向にあった共通概念
静的OO言語でも動的OO言語でも共通のテーマがある
- 分散という概念が重要だった
- ソフトウェアを単純に分割するだけじゃなく、オブジェクト自体が独立して動く世界を目指していた
- カール・ヒューイットによるActor理論のような理論的基盤も作成された
- 分散処理は計算機リソースが限られた時代の要請でもあった
- しかし当時の環境ではあまりに野心的な試みだった
OO厨々トレイン
未来編
大村 伸吾
オブジェクトの広場
Part7(未来編)
オブジェクト指向から見えてくる近未来!?
- 多種多様なDSLの出現
- 関数(宣言)型言語の普及
- 分散処理から分散プログラミングへ
DDDの発展形としてのDSL
背景
- DDDの発展がアプリケーション領域でのDSLの発展を促す
- 特定ドメイン毎に必要とされる言語は異なるから
DDDの発展形としてのDSL
要求される技術
- 良いDSLを設計できるドメインスペシャリスト
- DSL処理系を効率よく生み出せる手段
- 関数型言語によるパーサジェネレータ
- RubyやLispなど言語内DSLが書きやすい言語
- ランゲージワークベンチ
関数型言語の力をオブジェクト指向言語に取り込む
以下のような力をもった言語が必要になる
- 関数型言語ならでは宣言的なDSL定義
- ドメインに応じて関数型っぽく、オブジェクト指向っぽく記述できる、記述容易性
- Java/.netのライブラリなどの既存の資産を利用可能
オブジェクト指向の言語と関数型言語の特性をもった言語が望ましい。
Scalaなど
分散処理から分散プログラミングへ
背景
- 大量のリクエスト処理するアプリケーションの必要性
- 複数CPUプロセッサを生かすアプリケーションの必要性
- CPUのメニーコア化
- 「分散」が単なる処理方式ではなく、ソフトウェア設計の基本的なパラダイムへ
分散処理から分散プログラミングへ
必要となる技術
- アクターモデル,π計算の適用
- 複数の計算主体が、通信しながら全体としての計算を進めていく
- メッセージ処理のためのガードや強力なパターンマッチングなどの処理
- アクター指向をサポートした言語 (Scala等)
分散処理から分散プログラミングへ
ちなみに
アクター理論はオブジェクト指向の影響をモロに受けています
Part8(まとめ) ~時代は廻る~
過去の人たちも同じような問題に同じように悩んでた!! それを知り引き継いで先に進もう
- 因果は円環ではなく螺旋なのです(ベルセルク)
- 一回転すればほんの少しだけ前に進む、それがドリルなんだよ!!(グレンラガン)
- 過去が希望をくれる(仮面ライダー電王)
- 温故知新(論語為政篇)
ありがとうございました
突っ込み大歓迎でございます!!
Thanks To ...
- 羽生田栄一さん
- kazumi007君
- umejavaさん
- yyamanoさん
- オブジェクト倶楽部のみなさん
- オブジェクトの広場のみなさん
参考書籍:現在編
- Rod Johnson,"実践J2EEシステムデザイン",ソフトバンククリエイティブ,2003年
- 千葉滋,"アスペクト指向入門",技術評論社,2005年
- Gregor Hohpe&Bobby Woolf,"Enterprise Integration Patterns",Addison-Wesley,2003年
- Dirk Krafzig他,"SOA大全",日経BP社,2005年
- 大場克哉他,実践!SOAモデリング",翔泳社,2007年
- David Chappell,エンタープライズサービスバス,オライリー,2005年
- Eric Evans,Domain-Driven Design",Addison-Wesley,2003年
参考書籍:未来編
- Gerald Jay Sussman, Julie Sussman, Harold Abelson, 和田 英一 (翻訳),"計算機プログラムの構造と解釈",ピアソンエデュケーション, 2000年
- 高橋 正子,"計算論 計算可能性とラムダ計算 コンピュータサイエンス大学講座",近代科学社,1991
- "岩波講座情報科学<12>算法表現論" 岩波書店,1982年
- 米沢 明憲, 柴山 悦哉, "モデルと表現," 岩波書店, 1992年