pre formalから exploratory formalにおける ツール支援 小田朋宏 Software Research Associates, Inc. 2015/3/24 @福岡 Agenda ● pre formalとexploratory formal o o ● ● ● ● ● どのような工程があるか problem framing問題 VDMPadによる支援 Lively Walk-Throughによる支援 Cloudly Walk-Throughによる支援 課題 まとめ pre formal and exploratory formal informalからimplementationまで informal requirements なんとなくの話 pre formal specification 核心部分を見極める どこをformalに書くか exploratory formal spec 試行錯誤 どう書けばうまく行くか rigorous formal spec 仕様の正しさに確信を持つ 仕様を系統的に扱う implementation 確信のある仕様を有効に使う pre formalとexploratory formal pre formal ● 形式化するスコープを決める ● 形式化する語彙を決める ● problem framing o 例:チェッカーボード問題 exploratory formal ● ドメインによる適切な抽象を探る ● 言語による適切な抽象を探る ● 妥当性を確認しながら 必要に応じてpre formalに立ち返る problem framing チェッカーボード問題 (Fischer, AVI2006から引用) チェス盤がある。ドミノで2マスずつ埋めたい。 普通のチェス盤なら埋まる。 図のように対角線にある2つだけが欠けている場合には? とある解法 pythonで全空間探索するプログラムを書いて 制約を満たすドミノの配置が存在しないことを 確認した。 コネクタ問題 (Fischer, AVI2006をアレンジ) 32本のケーブルと32個のコネクタがある 1本のケーブルに1個のコネクタを半田付けする つもりが、 半田付けを失敗して2個のコネクタをダメにし てしまいました 32本全てのケーブルと残る30個のコネクタで 部品を残さず半田付けできるでしょうか? チェッカーボード問題 revisited (Fischer, AVI2006から引用) 赤いマスが32個、黒いマスが30個あります。赤と黒のマス を1つずつ隠すドミノで全部のマスを隠せますか? ソフトウェア開発ならば ● 開発者が顧客に 解法としてのシステムを説明/提案する o o o 妥当性の確認 顧客にとってどちらが理解しやすいか? 「プログラムで全空間探索しました」 vs 「赤いマスと黒いマスの数が合いません」 適切なproblem framingが必要 problem framing は formal methods の範囲内? ● YES o 問題の形式化に不可欠な過程 o 数学/計算理論でよく見かける 対角線論法 補題 NP完全問題 ● ある問題を既知の問題に帰着させる 全空間探索とコネクタ問題の分岐点 不適切な抽象 この絵をどれだけ見つめても、 コネクタ問題との繋がりは見えない problem framingへのツール支援 ● ツールによる自動化は困難 ● 自動化はできなくても支援は可能? o 解法のカタログ化 対角線論法、εδ論法、パターン言語、定石集 o 語彙の整理 チェッカーボードを8x8の盤に抽象したらダメ o 発見的知識獲得 「隣接するマスのペア」が赤マスと黒マスをで あることに気付く abstraction of the language abstraction of the domain 言語による抽象とドメインによる抽象 ● 言語による抽象 o o ある概念をその言語のどの言語要素で表現するか その言語を使う技術者に共有される ● ドメインによる抽象 o o o どの粒度の概念を定義するか ある概念に関連するルールや概念 顧客を含む開発チーム全体で共有される ドメイン専門家からチーム全体に伝えられる 言語による抽象 ● どの概念をどの言語要素で表現するか o o o o o function : state * args -> state vs operation : args ==> () 型の不変条件 vs 状態の不変条件 vs 関数/操作の事前/事後条件 set vs map vs seq 内包表現 vs for文 などなど ドメインによる抽象 ● どの粒度の概念を定義するか o o ドミノ ● 縦配置のドミノ ● 横配置のドミノ チェス盤 マス ● 黒いマス ● 赤いマス 行、列 ● ある概念に関連するルールや概念 o o ドミノを敷き詰める、とは? マスが隣接している、とは? tools pre formalとexploratory formal pre formal ● 形式化するスコープを決める ● 形式化する語彙を決める ● problem framing o 例:チェッカーボード問題 exploratory formal ● 言語による適切な抽象を探る ● ドメインによる適切な抽象を探る ● 妥当性を確認しながら 必要に応じてpre formalに立ち返る 大森先生の 辞書ツール 佐原さんの イディオム・定石 VDMPad Lively / Cloudly VDMPad Lively / Cloudly Walk-Through exploratory formal ● 「適切に」表現できる記述の切り口を探す o o 1つの問題の表現は複数ありうる 言語による抽象 ● 仕様記述者がドメイン知識を獲得する o o ドメイン専門家からの意見を獲得する ドメインによる抽象 exploratory formalへのツール支援 ● 言語による抽象 o o ● media for reflection: 自分で考えるためのメディア VDMPad ドメインによる抽象 o o o media for communication: 他者から意見を得るためのメディア Lively Walk-Through (UIデザイナとの対話) Cloudly Walk-Through (ドメイン専門家との対話) VDMPad VDMPad ● 言語による抽象を支援する ● アニメーションを軸にした試行錯誤 o o o Specを素早く書き下ろす いろいろな状態を作ってみて、 ビジュアル表現で俯瞰する Workspace上で表現式を書いてみる ザッピングTVリモコン ● 特に見たい番組がない時、いつものチャン ネルを巡回して面白そうな番組がやってな いか探したい。(ザッピング) o o ザッピング用のリストにチャンネルを追加したり削 除したりしたい。 ザッピング用のリストのチャンネルで巡回したい。 型と状態 types channel = nat inv channel == channel >= 1 and channel <= 12; state memory of current : channel zapList : seq of channel zapIndex : [nat1] inv mk_memory(current, zapList, zapIndex) == zapIndex = nil or zapIndex <= len zapList 普通のリモコンとしての機能 operations num : channel ==> channel num(x) == (zapIndex := nil; current := x; return current); inc : () ==> channel inc() == return num((current mod 12) + 1); dec : () ==> channel dec() == return num(((current - 2) mod 12) + 1); get : () ==> channel get() == return current; ザッピング関係 operations toggleZap : () ==> channel nextZap : () ==> channel prevZap : () ==> channel addZap : () ==> () delZap : () ==> () -- ユーザは見たい番組がある時とない時で行動が違う -- 通常モードとザッピングモードを分離して -- モード切り替えの操作 toggleZapと -- ザップの順送り nextZapと逆送りprevZapと -- 今のチャンネルをリストに追加 addZapと削除delZap VDMPadで探究的に仕様を書く Lively Walk-Through Lively Walk-Through ● VDM仕様をUIデザイナに説明する o media for communication ● UIプロトタイプ作りを軸にした対話 o UIデザイナはユーザの認知のドメイン専門家 o UIデザイナがVDM仕様を理解することで VDM仕様にUIデザイナのドメイン知識を 反映させることができる ザッピング関係 operations toggleZap : () ==> channel nextZap : () ==> channel prevZap : () ==> channel addZap : () ==> () delZap : () ==> () -- ユーザは見たい番組がある時とない時で行動が違う -- 通常モードとザッピングモードを分離して -- モード切り替えの操作 toggleZapと -- ザップの順送り nextZapと逆送りprevZapと -- 今のチャンネルをリストに追加 addZapと削除delZap VDM仕様を使ったUIプロトタイプ UIデザイナの主張 ● 安易にモードを作るな o o ユーザにモードをどう把握させる? ユーザがメンタルモデルを構築しにくい ● ユーザはチャンネルを巡回したいのであっ て、順送りnextZapや逆送りprevZapは必要 ない ● チャンネルの順送りinc()や逆送りdec()に加 えて zap()があればいい 見直したzap機能 zap : () ==> channel zap() == ( if zapList = [] then return current; if zapIndex = nil then zapIndex := 1 else zapIndex := zapIndex mod len zapList + 1; current := zapList(zapIndex); return current); -- zapボタンを押せば、zapListに登録された順に -- チャンネルを何周でも巡回する。 新しい仕様を使ったUIプロトタイプ Cloudly Walk-Through Cloudly Walk-Through ● ドメインによる抽象を支援する o media for communication ● ポンチ絵とアニメーションを軸にした対話 o o VDMの文法を知らない人のためのビジュアル表現 ポンチ絵による文脈の表現 Cloudly Walk-Throughによる ポンチ絵 3つのツールのまとめ ● VDMPad o o 適切な言語抽象を探究 [仕様記述者による] 適切なドメイン抽象を探究 ● Lively Walk-Through o [UIデザイナによる] 適切なドメイン抽象を探究 ● Cloudly Walk-Through o [ドメイン専門家による] 適切なドメイン抽象を探究 これらの探究を通じてproblem framingの機会を得る missing link 課題 鶏と卵 ● 正しい抽象を得るためには 適切なproblem framingが必要 ● 正しいproblem framingを得るには 適切な抽象が必要 解決するためには ● トンカチで叩くのではなく、ネジを回せ o 形式手法の常道 ● 異なる種類の専門家の知恵を得る o コミュニケーションメディアとしてのツール ● 経験の蓄積 → イディオム・定石 o information retrieval / recommender systems code clone clustering, cataloging, discourse wrap up まとめ ● pre formal o o 形式化のスコープ、語彙: 大森先生のツール problem framing: 佐原さんのイディオム・定石 ● exploratory formal o o 言語による抽象:VDMPad ドメインによる抽象:Walk-Through series multidisciplinary communication 今後の課題 ● 経験を蓄積し、適用するためのツール o o o 経験をどうencodingするか 経験をどうretrieveするか 経験をどうdiscourseするか
© Copyright 2025 ExpyDoc