ジェネレーティブプログラミングの世界

41
2014/2/15(土) 第29回 IT勉強宴会in名古屋 ジェネレーティブプログラミング の世界 PHPメンターズ 久保敦啓 (KUBO Atsuhiro)

Upload: atsuhiro-kubo

Post on 13-Dec-2014

2.909 views

Category:

Technology


7 download

DESCRIPTION

 

TRANSCRIPT

Page 1: ジェネレーティブプログラミングの世界

2014/2/15(土)第29回 IT勉強宴会in名古屋

ジェネレーティブプログラミングの世界

PHPメンターズ久保敦啓 (KUBO Atsuhiro)

Page 2: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

久保敦啓 (KUBO Atsuhiro)● Twitter @iteman● GitHub https://github.com/iteman● 株式会社アイテマン● PHPメンターズ● Piece Framework● 関西IT勉強宴会

Page 3: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

PHPメンターズ● PHPプログラマーを対象とするサービス

– トレーニング、技術サポート、メンタリング– プログラミング道場

● メンター– 久保敦啓 @iteman– 後藤秀宣 @hidenorigoto

Page 4: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

PHPメンターズ● Twitter @phpmentors● GitHub https://github.com/phpmentors-jp● Webサイト・ブログ

http://phpmentors.jp/

Page 5: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Piece Framework● PHPフレームワーク、ツール

– MakeGood– Stagehand_TestRunner– Stagehane_FSM

...● オープンソースソフトウェア● Piece Project

Page 6: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Piece Framework● Twitter @piece_framework● GitHub https://github.com/piece

Page 7: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ジェネレーティブプログラミング(GP: Generative Programming)

Page 8: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ジェネレーティブプログラミング● ソフトウェアシステムファミリのモデリングに

基づくソフトウェア工学のパラダイム[1]● 与えられた特定の要求仕様を元に、構成の知識

を生かし、再利用可能な基本部分を使って、カスタム化かつ最適化された中間または最終製品を自動的に生成[1]

Page 9: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

従来のソフトウェア開発

Page 10: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 11: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ジェネレーティブプログラミングに基づくソフトウェア開発

Page 12: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 13: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン● 知識、影響、または活動の領域[2]● 限定されたエリア、もしくは関心のある領域

[4]● 知識分野[1]● 例:販売管理システム、状態マシン

Page 14: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメインの相互関係● ドメインは一般的に複数のドメインから構成される● 例:販売管理システムのドメイン

– 売上、在庫、仕入、…– Webアプリケーション、データベース、…

● 相互関係の種類:[1]– 包含(サブドメイン)– 使用(サポートドメイン)– 類似(類似ドメイン)

Page 15: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

問題ドメイン(problem domain)

● 問題領域、アプリケーションドメイン(application domain)、問題空間(problem space)

● ユーザー(ドメインエキスパート含む)の活動領域● ドメイン知識(domain knowledge)● 成果物:問題ドメインモデル

ドメインの定義、ドメイン辞書、概念モデル、ユースケースモデル、…

Page 16: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン知識(domain knowledge)

● ユーザーの関心が寄せられている知識の体系[4]

● 分析するビジネスを構成するプロセス、エンティティ、そして制約[3]

● 実践者によって共通に理解される概念と用語の集まり[1]

● その分野のソフトウェアシステム(またはシステムの一部)の構築に関する知識[1]

Page 17: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

解決ドメイン(solution domain)

● 解決領域、解決空間(solution space)● ソフトウェアに関わる人間(主に開発者)の活

動領域● 実装者の関心が中心になるが、システムユーザ

にとってもその界面部分は関心事項[4]● 成果物:解決ドメインモデル

アーキテクチャ、基本コンポーネント、フレームワーク、ドメイン特化言語、…

Page 18: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 19: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメインモデル

“ドメインモデルとは特定の図ではなく、図が伝えようとしている考え方である。これはドメインエキスパートの頭の中にある単なる知識ではなく、その知識が厳密に構成され、選び抜かれて抽象化されたものなのだ。”

ー『エリック・エヴァンスのドメイン駆動設計』[2]

Page 20: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメインモデル

“事業を眺めて、事業を要約する。こういう書きかたでは、絶対にモデルにならない。なぜか。「解釈」のほうが先を歩いているからだ。モデルは、「論理」によって、つまり論理規則によって、構成をととのえていなければならない。”

ー 佐藤正美さんのツイートhttps://twitter.com/satou_masami/status/384687177302437889

Page 21: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメインモデル● 問題ドメインのドメイン知識を入力とし、解決

ドメインにおいて構成された抽象● モデリング(モデル化、モデル制作)による成

果物● 論理規則によって形式化されるのが望ましい

Page 22: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン特化言語● DSL: Domain-Specific Languages● ドメイン固有言語、アプリケーション固有言語● 特定の問題に焦点を当てたプログラミング言語

[3]● 特定のドメインの特定のモデル用にあつらえたプ

ログラミング言語[4]● ドメイン知識をユーザーのニーズに合わせた詳細

レベルで記述するための言語

Page 23: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 24: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン特化言語

“ドメイン固有言語は、システムファミリの具体的なメンバを「発注」するのに使い、ゆえにジェネレーティブプログラミングにおいて重要な役割を果たします。”

ー『ジェネレーティブプログラミング』[1]

Page 25: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

意図性(Intentionality)

"意図的な記述は、何が必要なのかを直接かつ明確に示し、余計ながらくたや不要な実装の詳細を避けます。これらは、理解しやすさ、分析しやすさ、修正しやすさ、保守のしやすさなどの、良いコードが持つすべての属性を備えています。ドメインに固有な表記法により、意図性を達成します。"

ー『ジェネレーティブプログラミング』[1]

Page 26: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

グラフィカルDSL

Page 27: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

テキストDSL...PHPMentors\Training\CourseRegistration\Domain\Data\Registration: getters: paymentMethod: - NotBlank: { message: "選択してください" } lastName: &mandatoryText - NotBlank: &notBlankText message: "入力してください" - MaxLength: &maxLengthText limit: 255 message: "{{ limit }} 文字以下で入力してください" firstName: *mandatoryText email: - NotBlank: *notBlankText - Email: { message: "正しいメールアドレスを入力してください" }..

Page 28: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ジェネレーター● ソフトウェア部品の高レベルな仕様から、その

実装を生成するプログラム[1]● ドメイン特化言語で記述されたドメイン知識を解決ドメインモデルの組み合わせに変換するプログラム

● 実行可能な形式(オブジェクト、バイトコード)やソースコード、その他の形式を生成

Page 29: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 30: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン工学● 特定のドメインのシステムまたはシステムの一部の構築に関

する過去の経験を再利用可能な資産として集めて、まとめて、蓄積すること[1]

● SCV– スコープ(scope)– 共通性(commonality)– 可変性(variability)– ドメイン間の関係(relationship)、SCV + R[4]

● システムファミリ● マルチパラダイムデザイン[4]はドメイン工学の一形態

Page 31: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメインスコープ● 垂直ドメイン(vertical domain)

単一システムドメイン、アプリケーションドメイン例:販売管理システム

● 水平ドメイン(horizontal domain)システムカテゴリドメイン

例:状態マシン

Page 32: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

共通性、可変性● 分析の形式[4]● ほとんどすべての設計手法の根底に存在する直観的な概念[4]

● 人間の思考が抽象を生み出すやり方の本質[4]● システムファミリの共通部分と可変部分

Page 33: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

システムファミリ● ソフトウェアファミリ● 共通な資産から作るに十分な特徴を共有するシステ

ム集合[1]● 構造(structure)、名前(name)、振る舞い

(behavior)といった評価基準に基づいて、データ構造と機能(function)をグルーピングされた、何らかの関連性を持つグループ[4]

● 構造化プログラミングの提唱者であるダイクストラ(Dijkstra)を起源とする概念

Page 34: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン工学に基づくソフトウェア開発

Page 35: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン工学に基づくソフトウェア開発 ー『ジェネレーティブプログラミング』[1]

Page 36: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ドメイン工学+ドメイン駆動設計

Page 37: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 38: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

ジェネレーティブプログラミングに基づくソフトウェア開発

Page 39: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

Page 40: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

関連パラダイム● インテンショナルプログラミング(Intentional Programming)● ジェネレーティブプログラミング(GP: Generative Programming)● ソフトウェアファクトリ(Software Factories)● ソフトウェアプロダクトライン(SPL: Software Product Lines)● ドメイン特化モデリング(DSM: Domain Specific Modeling)● ドメイン特化言語(DSL: Domain-Specific Languages)● ドメイン駆動設計(DDD: Domain-Driven Design)● マルチパラダイムデザイン(Multi-Paradigm Design)● メタプログラミング(Metaprogramming)● モデル駆動開発(MDD: Model Driven Development)● 宣言的プログラミング(Declarative Programming)● 言語ワークベンチ(Language Workbenches)● 言語指向プログラミング(LOP: Language-Oriented Programming)

Page 41: ジェネレーティブプログラミングの世界

Copyright (c) 2014 KUBO Atsuhiro <[email protected]>, All rights reserved.

参考文献1. クシシュトフ・チャルネッキ、ウールリシュ・W・アイセンアッカー 著/津田 義史、今関 剛、朝比奈

勲 訳『ジェネレーティブプログラミング』翔泳社、2008(原著 Krzysztof Czarnecki, Ulrich Eisenecker, “Generative Programming: Methods, Tools, and Applications”, Addison-Wesley Professional, 2000)

2. エリック・エヴァンス 著/今関 剛、和智 右桂、牧野 祐子 訳『エリック・エヴァンスのドメイン駆動設計』翔泳社、2011(原著 Eric Evans, "Domain-Driven Design: Tackling Complexity in the Heart of Software", Addison-Wesley Professional, 2003)

3. Debasish Ghosh 著/佐藤 竜一 訳『実践プログラミングDSL』翔泳社、2012(原著 Debasish Ghosh, "DSLs in Action", Manning Publications, 2010)

4. ジェームス・O・コプリン 著/平鍋 健児、金澤 典子、羽生田 栄一 訳『新装版マルチパラダイムデザイン』ピアソン・エデュケーション、2009(原著 James O. Coplien, “Multi-Paradigm Design for C++”, Addison-Wesley Professional, 1998)

5. Magnus Christerson, Henk Kolk, "Domain Expert DSLs", 2008, http://www.slideshare.net/deimos/magnus-christerson-henk-kolk-domain-expert-ds-ls