跨校推動敏捷方法 促成軟體產業升級 中央大學資工系 陳振炎

123
跨跨跨跨跨跨跨跨 跨跨跨跨跨跨跨跨 跨跨跨 跨跨跨跨 跨跨跨 跨跨跨跨 跨跨跨跨跨跨跨 跨跨跨跨跨跨跨 跨跨跨 跨跨跨 1

Upload: jackson-pearson

Post on 02-Jan-2016

74 views

Category:

Documents


0 download

DESCRIPTION

跨校推動敏捷方法 促成軟體產業升級 中央大學資工系 陳振炎. 緣由. 台灣薪資低 名校畢業生當台勞 產業未升級 公司無力調高薪資 觀念老舊 阻礙產業升級 所以軟體業要推動新觀念 : 敏捷方法 全面從教育入手 跨校推動 ( 初步四校參與 ). 做法. 一個方法 myAgile (Extreme Programming plus) 一個專案 Grade System 成績系統 一個網站 Agile Taiwan ( 台灣敏捷方法苗圃 ) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

跨校推動敏捷方法跨校推動敏捷方法 促成軟體產業升級促成軟體產業升級 中央大學資工系 中央大學資工系 陳振炎陳振炎

11

Page 2: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

緣由緣由 台灣薪資低 名校畢業生當台勞 台灣薪資低 名校畢業生當台勞

產業未升級 公司無力調高薪資產業未升級 公司無力調高薪資

觀念老舊 阻礙產業升級 觀念老舊 阻礙產業升級

所以軟體業要推動新觀念所以軟體業要推動新觀念 :: 敏捷方法敏捷方法 全面從教育入手 跨校推動 ( 初步四校參與初步四校參與 ))

22

Page 3: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

做法做法 一個方法 一個方法 myAgile myAgile

(Extreme Programming plus)(Extreme Programming plus)

一個專案 一個專案 Grade System Grade System 成績系統成績系統 一個網站 一個網站 Agile TaiwanAgile Taiwan

(( 台灣敏捷方法苗圃台灣敏捷方法苗圃 ))

今天先談 今天先談 1) 1) 敏捷觀念 敏捷觀念 2) myAgile2) myAgile方法方法

33

Page 4: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

敏捷觀念敏捷觀念

44

Page 5: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

美國先進軟體公司 佈置圖美國先進軟體公司 佈置圖

caves

common

55

whiteboard

Page 6: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

美國先進軟體公司 佈置圖 美國先進軟體公司 佈置圖 (Cont.)(Cont.)上圖分 上圖分 common common 及 及 cave cave 兩區兩區 ::

Common Common 區區 : : 兩人一組,在一台大尺寸螢幕前 兩人一組,在一台大尺寸螢幕前 工 作 工 作 (( 這叫 這叫 pair pair

programming) programming)

各組可目視各組可目視、、交談交談、、溝溝通通

Cave Cave 區區 : : 個人處理個人處理 e-mail, e-mail, 電話電話 ,, 閱讀資料等閱讀資料等此外牆上很多白板 此外牆上很多白板 white boardwhite board ,供討論用,供討論用

粗估需粗估需 3030 坪 坪 ((約約 9999 平方公尺平方公尺 )) ,台北很易設置的,,台北很易設置的,軟體業不求廠大人眾,求高素質高薪少人易溝通軟體業不求廠大人眾,求高素質高薪少人易溝通

66

Page 7: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

回顧 台灣軟體公司 現場回顧 台灣軟體公司 現場 一個小房間裏面坐著滿臉倦容、神情呆滯 一個小房間裏面坐著滿臉倦容、神情呆滯 (( 有可能公司節能,有可能公司節能,

不開冷氣,頭暈腦脹不開冷氣,頭暈腦脹 )) 工作一整天,仍加班中的軟體工程師工作一整天,仍加班中的軟體工程師小林小林,獨自看著一大疊列印出來,自己也看不太懂的程式碼,獨自看著一大疊列印出來,自己也看不太懂的程式碼(( 別人當然更看不懂啦別人當然更看不懂啦 )) ,喃喃自語,喃喃自語 ::

只要再改這地方,就可消除這可惡的最後一個 只要再改這地方,就可消除這可惡的最後一個 BUGBUG !! 桌上有多本裝訂精美厚厚的文件,但與程式距離遙遠桌上有多本裝訂精美厚厚的文件,但與程式距離遙遠 三小時後,更悲慘了,三小時後,更悲慘了, BUG BUG 仍在仍在 ! ! 夜已深,開始自欺麻夜已深,開始自欺麻醉醉 : :

明天一早一定就可解決了! 明天一早一定就可解決了! (( 現場寂靜、死氣沈沈現場寂靜、死氣沈沈 )) 注意注意 : : 像這樣 既沒有像這樣 既沒有溝通溝通,, 又又思考思考不清,軟體怎麼可能優質不清,軟體怎麼可能優質 ??

77

Page 8: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

觀察、改善現場觀察、改善現場1.1. 冷氣電費是小錢,工程師產值是大錢,勿省小錢丟大錢冷氣電費是小錢,工程師產值是大錢,勿省小錢丟大錢2.2. 辦公室要便於溝通,非必要勿隔間辦公室要便於溝通,非必要勿隔間 (( 要搭配群育訓練要搭配群育訓練 ))3.3. 要先寫要先寫 test code test code 用工具依序用工具依序 testtest ,則不會困惑 ,則不會困惑 (( 當然要先設計切割,才能在切面上做當然要先設計切割,才能在切面上做 test codetest code ,, 且二人邊討論邊做,且二人邊討論邊做,現場有點喧嘩,但現場有點喧嘩,但生氣勃勃、生氣勃勃、 且流露 祥和自在 專注自信的氣氛且流露 祥和自在 專注自信的氣氛 ))4.4. 要閱讀虛擬碼,勿讀瑣細難讀的程式碼要閱讀虛擬碼,勿讀瑣細難讀的程式碼5.5. 要用工具瀏覽 要用工具瀏覽 hypertext (hypertext ( 內含 內含 hyperlink)hyperlink) ,, 勿列印勿列印 (( 因無工具輔助搜尋、瀏覽因無工具輔助搜尋、瀏覽 ))6.6. 文件常過時未與程式同步 裝訂本更易過時文件常過時未與程式同步 裝訂本更易過時7.7. 勿加班,否則第二天很累,第三天更累勿加班,否則第二天很累,第三天更累……8.8. 勿自欺,久而久之,自豪感消失,倦怠挫折勿自欺,久而久之,自豪感消失,倦怠挫折……戰將折翼戰將折翼 !!!!

88

Page 9: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

兩家軟體公司的省思兩家軟體公司的省思要進步,就須改變;如本國公司因工程品質差而業務外包他國,要進步,就須改變;如本國公司因工程品質差而業務外包他國,吃虧的還是本國畢業生的工作權吃虧的還是本國畢業生的工作權 !!

因工資高,台灣自豪的工廠外移低工資國度因工資高,台灣自豪的工廠外移低工資國度 [[ 劉維公,風格社會,天劉維公,風格社會,天下雜誌,下雜誌, 2006]2006],,我叫它我叫它 : : 後工廠時代後工廠時代 ,, 留下的要升級留下的要升級 ,, 不不要代工要代工 ,, 埋頭拼命,處處省錢埋頭拼命,處處省錢 cost downcost down ;要;要 cost up, cost up, value up,value up, 豪氣做時尚精品;要敏捷工作,心平氣和,慢豪氣做時尚精品;要敏捷工作,心平氣和,慢活,慢食,深眠活,慢食,深眠

拼命文化 要 拼命文化 要提升為提升為 敏捷敏捷 文化 文化

99

Page 10: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

兩家軟體公司的省思 兩家軟體公司的省思 (Cont.)(Cont.)

Slow, but Firm - Slow, but Firm - 要徐緩而確實地工作要徐緩而確實地工作

徐緩徐緩 (slow)(slow) 使心沉靜使心沉靜 ,, 則工作平順確實則工作平順確實(firm)(firm)

沒有失誤沒有失誤 ,, 沒有沒有 Bugs,Bugs, 沒有拼命沒有拼命 ,, 沒有加沒有加班班 ,,

每天快樂工作每天快樂工作 ,, 每晚安然沉睡每晚安然沉睡 ,,

不知不覺中 精品呈現了不知不覺中 精品呈現了 !!1010

Page 11: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

軟體公司的省思 軟體公司的省思 (Cont.)(Cont.)

假設有 假設有 A,B A,B 兩家軟體公司兩家軟體公司 :: AA 公司員工制服整齊 各人埋頭苦幹 一片寂然公司員工制服整齊 各人埋頭苦幹 一片寂然無聲 管理報表齊備 工作緊張 無聲 管理報表齊備 工作緊張 BB 公司員工穿著隨意 大家不斷討論工作 隨時公司員工穿著隨意 大家不斷討論工作 隨時有哄堂大笑 沒什麼管理報表 工作從容有哄堂大笑 沒什麼管理報表 工作從容

請問何公司有品質請問何公司有品質 ?? 答案可能是答案可能是 B B 但不可但不可能是能是 A A 因因 AA 公司缺軟體公司核心要素 公司缺軟體公司核心要素 - - 溝通溝通

1111

Page 12: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

團隊須含駐點使用專家 團隊須含駐點使用專家 有人以為這是涼缺,其實要做很多事有人以為這是涼缺,其實要做很多事 ::

1.1. 寫使用情節 寫使用情節 (Scenarios)(Scenarios)

2.2.與開發者確認使用畫面與開發者確認使用畫面3.3.由使用情節寫驗收測試由使用情節寫驗收測試 (( 需準備大量需準備大量 data)data)

4.4.當某功能完成當某功能完成 (( 即其即其 methodsmethods皆已整合皆已整合 )),,即刻執行即刻執行其其驗收測試驗收測試 (( 或督導工讀生去或督導工讀生去執行執行 ))

例子例子 :: 若若某功能某功能有五個有五個使用畫面,使用畫面,每每畫面畫面有三狀有三狀況況 則最多有 則最多有 33的的 55次方次方 243243個驗收測試個驗收測試

1212

Page 13: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

下面先解釋七個基本觀念下面先解釋七個基本觀念再以之建構 再以之建構 溝通週期 溝通週期 (Communication (Communication

Cycle) Cycle) 為基礎的為基礎的

測 試 帶 動 法 測 試 帶 動 法 (Test-driven (Test-driven development, TDD)development, TDD)

陳教授的 陳教授的 myAgilemyAgile 即是測試帶動法即是測試帶動法1313

Page 14: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.Pair Programming 1.Pair Programming 雙人組開雙人組開發發 兩人配對即時溝通,有點像趣味賽兩人三腳;兩人配對即時溝通,有點像趣味賽兩人三腳;

加快開發及除錯速度,並激發創意加快開發及除錯速度,並激發創意兩人肩並肩坐電腦前,同時注視螢幕,一人主導兩人肩並肩坐電腦前,同時注視螢幕,一人主導(drive)(drive) ,另一人從不同角度思考,即時查核,另一人從不同角度思考,即時查核(review)(review) ,並可隨時交換角色,並可隨時交換角色

過程中隨時討論程式細節、做法,並藉由討論、爭辯,過程中隨時討論程式細節、做法,並藉由討論、爭辯,找到最佳程式寫法,隨時注意程式撰寫的小錯誤或邏輯找到最佳程式寫法,隨時注意程式撰寫的小錯誤或邏輯錯誤,錯誤發生時則共同除錯,錯誤,錯誤發生時則共同除錯,

以以降低錯誤率降低錯誤率和和提高除錯效率提高除錯效率

這樣可較快完成較佳成果這樣可較快完成較佳成果 (Better work in less (Better work in less time)time) , ,

會帶來會帶來工作驕傲感 工作驕傲感 ((pride-in-work)pride-in-work)1414

Page 15: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.Pair Programming (Cont.)1.Pair Programming (Cont.)1)1) 工作驕傲感,即自慢工作驕傲感,即自慢 (( 日語,慢者傲慢也日語,慢者傲慢也 )) 、自傲、自、自傲、自豪,有助培養強烈企圖心、不服輸鬥志、樂在工作中豪,有助培養強烈企圖心、不服輸鬥志、樂在工作中

在此在此””後工廠時代後工廠時代””,應揚棄下面工廠思維,應揚棄下面工廠思維 : : 兩人做一事,人力成本太高兩人做一事,人力成本太高 兩人整天交頭接耳,一定在混!兩人整天交頭接耳,一定在混!此外要培養 此外要培養 2)2) 公民意識公民意識 ((後敍後敍 )) ,, 3)3) 敏銳注意週遭,敏銳注意週遭, 4)4) 自發地行動 自發地行動 (act spontaneously)(act spontaneously) ,,這四點可使團隊績效臻於顛峰這四點可使團隊績效臻於顛峰上述就是 上述就是 群育群育,正是台灣教育的弱點之一,正是台灣教育的弱點之一

例子例子 :[:[ 電視骨質藥廣告電視骨質藥廣告 ] ] 一老一少忙於佈置新店面,古董一老一少忙於佈置新店面,古董花瓶不小心被年青人撥倒,老人快步扶住,兩人相視一笑花瓶不小心被年青人撥倒,老人快步扶住,兩人相視一笑

1515

Page 16: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.Pair Programming (Cont.)1.Pair Programming (Cont.) 有程式師很自我 有程式師很自我 egoego ,不願與某人配對,應離職;,不願與某人配對,應離職; 兩人互不願配對,兩人應離職兩人互不願配對,兩人應離職 草莓族雖不耐操,但較不自私自大、反而較合群草莓族雖不耐操,但較不自私自大、反而較合群 例子例子 ::某路邊,中年人轎車亂停,某路邊,中年人轎車亂停, 草莓族草莓族青年人機車反而都依照格子停青年人機車反而都依照格子停 成員程度有高低,成員程度有高低,高高配、低低配高高配、低低配可收切磋效果激發創意可收切磋效果激發創意 而而高低配高低配則形同教學無切磋之效,但有管理之效則形同教學無切磋之效,但有管理之效 人其實不相等,二人行必有我師人其實不相等,二人行必有我師 ((三人行不精確三人行不精確 )) ,配對,配對

工作可促成團隊技術提升拉齊,每個回合工作可促成團隊技術提升拉齊,每個回合 (iteration)(iteration) 配配不同人不同人 (( 輪調 輪調 rotation),rotation),大一計概開始大一計概開始做做 !!

例子例子 ::某某研究生團隊四人藉 研究生團隊四人藉 pairing pairing 由不懂到完成軟體由不懂到完成軟體 ! !

大道至簡大道至簡 ,, 溝通而已矣溝通而已矣 !!1616

Page 17: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.Pair Programming (Cont.)1.Pair Programming (Cont.)

如何深耕 如何深耕 pair programming? pair programming? 陳教授陳教授認為要改變工作習慣 認為要改變工作習慣

試想試想 :: 遊玩時要有遊玩時要有””玩伴玩伴””才愉快盡興才愉快盡興 ,, 那那麼學習時也要有麼學習時也要有””學伴學伴”” ,, 兩人一齊在螢幕兩人一齊在螢幕前複習教學投影片前複習教學投影片 ,, 才愉快有效才愉快有效

陳教授希望藉教學時推廣陳教授希望藉教學時推廣””學伴學伴”” ,, 來厚植 來厚植 pair programming pair programming 習慣習慣

1717

Page 18: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1. Pair programming (Cont.)1. Pair programming (Cont.)面對面面對面溝通 溝通 效果效果最佳!最佳!

1. 1. 小張、老李小張、老李 pair programs.(pair programs.( 效果最佳效果最佳 )) 2. 2. 兩人用不同電腦,但肩併肩兩人用不同電腦,但肩併肩 (( 效果很好效果很好 )) 3. 3. 兩人各據一角,背對背兩人各據一角,背對背 4. 4. 兩人在相鄰辦公室,有牆隔開兩人在相鄰辦公室,有牆隔開 5. 5. 兩人在不同樓層或相鄰大樓兩人在不同樓層或相鄰大樓 6. 6. 兩人在不同時區的城市兩人在不同時區的城市 (( 效果差,有人加裝視訊設備,效果差,有人加裝視訊設備, 叫 叫 distributed pair programmingdistributed pair programming , ,

效果並效果並不好不好 ) ) 1818

效果

Page 19: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Pair Programming Pair Programming 好處好處 一個人的邏輯思考上常常會出現漏洞,兩個人的邏輯思考卻可一個人的邏輯思考上常常會出現漏洞,兩個人的邏輯思考卻可以降低這樣的漏洞發生。以降低這樣的漏洞發生。 Pair programmingPair programming 不僅可以提昇不僅可以提昇工作上的品質,更可以營造出融洽的工作氣氛,以往的工作上的品質,更可以營造出融洽的工作氣氛,以往的programmerprogrammer都是一個人撰寫一支程式,遇到問題才與同事間 都是一個人撰寫一支程式,遇到問題才與同事間 相互討論的方式來解決,或是自己悶著頭上網找資料或想法;相互討論的方式來解決,或是自己悶著頭上網找資料或想法;若是採用若是採用 pair programming pair programming 的方式,兩個人可以在討論的方式,兩個人可以在討論問題之餘穿插個閒話家常,這樣問題之餘穿插個閒話家常,這樣看似是在浪費時間,但是實際看似是在浪費時間,但是實際上是可以降低彼此腦部思考的壓力上是可以降低彼此腦部思考的壓力,因為一直想同一件事是容,因為一直想同一件事是容易想不通透的,那何不放下心情來降低腦中的壓力後再來思考易想不通透的,那何不放下心情來降低腦中的壓力後再來思考,這樣對於事情的進展反而是更有幫助的。 ,這樣對於事情的進展反而是更有幫助的。

[[ 中央大學碩士 蘇友信 中央大學碩士 蘇友信 (Silver)](Silver)]

1919

Page 20: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Collective Code OwnershipCollective Code Ownership 經過上述 經過上述 Pair Programming Pair Programming 及 及 rotation rotation 久而久之久而久之 ,, 團隊成員可大致了解團隊成員可大致了解他人寫的程式他人寫的程式 ,, 甚至可維修他人程式甚至可維修他人程式 -- 不畏員不畏員工流動了工流動了 !!

成員間成員間信任感信任感很高很高 ,, 重用重用 (reuse)(reuse) 閱讀他人閱讀他人程式時程式時 ,, 可快速主動改善之可快速主動改善之 ,, 而不必知會原作而不必知會原作者或上級者或上級 ,, 使軟體在不知不覺中使軟體在不知不覺中 ,, 不斷提升品不斷提升品質質 ,, 再搭配測試碼把關再搭配測試碼把關 ,, 可確保品質可確保品質

這形成程式碼不屬於原作者的共有制度這形成程式碼不屬於原作者的共有制度 叫叫程式共有 程式共有 collective code ownershipcollective code ownership

2020

Page 21: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

2. Re-factoring 2. Re-factoring 重整重整 程式在保持原功能下 需不斷小幅改寫 以提升可讀性 程式在保持原功能下 需不斷小幅改寫 以提升可讀性 (small behavior-preserving transformations)(small behavior-preserving transformations) ,,

叫叫重整 重整 需需 :: 1.1. 各人願意去改別人寫的程式;相對的, 各人願意去改別人寫的程式;相對的, 高興自己程式被別人改進 高興自己程式被別人改進 (( 群育群育訓練訓練 )) 2.2. 程式人人易懂程式人人易懂 ((設計草圖及設計草圖及虛擬碼解決此事虛擬碼解決此事 )) 3.3. 程式修改後,要週密地重做測試 程式修改後,要週密地重做測試 (test code,JUnit (test code,JUnit 解決此事解決此事 )) 重重整整後得新版本,存於版本控制系統後得新版本,存於版本控制系統

好處好處 :interface:interface不變時,不變時,因有測試碼保護,開發者勇於修改 因有測試碼保護,開發者勇於修改 舊程式舊程式 ((重重整整 )) ,使軟體常新;,使軟體常新; 若若 interfaceinterface改了,改了,則則要重做要重做測試碼測試碼

2121

Page 22: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Reuse Reuse 重用 重用 vs. Refactor vs. Refactor 重整重整

架構設計決定後架構設計決定後 ,, 應盡量應盡量 Reuse(Reuse( 重用重用 ))既有程式既有程式 (( 不管是本公司別人寫的或未謀不管是本公司別人寫的或未謀面的人寫的面的人寫的 open source)open source) 以提高品質以提高品質 ,,且少耗力氣且少耗力氣

另一更重要的是另一更重要的是 :: 程式要勇於 程式要勇於 Refactor(Refactor(重整重整 ),), 使程式脫胎換骨使程式脫胎換骨 ,, 品質爆增品質爆增 ,, 有如有如地上醜醜人見人厭的地上醜醜人見人厭的蛹蛹勇於蛻變勇於蛻變 ,, 成了美成了美麗飛翔人人欣羨的麗飛翔人人欣羨的蝴蝶蝴蝶

2222

Page 23: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3. Continuous Integration 3. Continuous Integration 持續整合持續整合

每個每個 public method public method 寫完,寫完,用用 unit unit test code (test code ( 後敘後敘 ) ) 測完後,數小時內即整測完後,數小時內即整合進系統,不拖過夜 合進系統,不拖過夜 (( 隔夜就忘大半了隔夜就忘大半了 ) ) ,,各個 各個 method method 是這樣持續地整合進去,是這樣持續地整合進去,

若某功能的 若某功能的 methods methods 都齊了,駐點都齊了,駐點使用專家就手動測其驗收測試使用專家就手動測其驗收測試

這好處是這好處是 : : 以往痛苦的以往痛苦的 integration integration phase phase 不見了;現在,腦筋還記得不見了;現在,腦筋還記得當天當天寫該寫該method method 的細節,所以很容易整合的細節,所以很容易整合

2323

Page 24: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3. Continuous Integration 3. Continuous Integration (Cont.)(Cont.)

Method Method 有其呼叫使用順序有其呼叫使用順序 ::

被呼叫者為下層 被呼叫者為下層 methodmethod 呼叫者為上層 呼叫者為上層 method method 最好先整合下層 最好先整合下層 methodmethod 進入系統進入系統 若先整合上層 若先整合上層 method method 則因其呼叫尚未則因其呼叫尚未在系統內的下層 在系統內的下層 method method 會造成錯誤 會造成錯誤

這時應在系統內暫補 空的下層 這時應在系統內暫補 空的下層 method method

(( 它叫它叫 test stub)test stub)2424

Page 25: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3. Continuous Integration 3. Continuous Integration (Cont.)(Cont.)

傳統軟工的整合測試已在此巧妙完成了傳統軟工的整合測試已在此巧妙完成了 ::

當各個 當各個 unit (method) unit (method) 由下而上由下而上(bottom-up) (bottom-up) 持續整合進系統時 持續整合進系統時 (continuous integration),(continuous integration),

unit testing (unit testing ( 單元測試單元測試 ) ) 也就成為也就成為整合測試 整合測試 (integration testing)(integration testing) 了了

2525

Page 26: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

4. Simple Design 4. Simple Design 簡約設計簡約設計簡約是任何設計的精髓簡約是任何設計的精髓 **

透過透過 CRCCRC 會議會議 (( 後敘後敘 )) 的溝通,想出軟體系統中各的溝通,想出軟體系統中各 classclass

及其之間的關係及其之間的關係 ::

1) 1) 各各 class class 須呈現簡潔外觀 須呈現簡潔外觀 (interface)(interface) ,與一致,與一致的格式的格式

2) classes 2) classes 之間的關係須之間的關係須 ::

簡潔簡潔 (( 關係不可太多關係不可太多 ))

平衡平衡 (( 不可呈星狀結構不可呈星狀結構 ))

** 設計簡約,質感出眾 設計簡約,質感出眾 [IKEA [IKEA 桃園店標語桃園店標語 ]]

反映北歐極簡、內斂風格 反映北歐極簡、內斂風格 質感 質感 > > 品質 品質 > > > > 質量質量2626

Page 27: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

5. 5. 交貨交貨規劃規劃 ((Release Planning)Release Planning)

由駐點使用專家由駐點使用專家 (( 後敘後敘 )) 主導的會議 主導的會議 (( 開發者必參加開發者必參加 ) ) 會中決定目前系統功能 會中決定目前系統功能 (user stories) (user stories) 要分幾次交貨要分幾次交貨(releases)(releases)

客戶需求不斷客戶需求不斷變動變動,故只第一個,故只第一個 release release (( 平均為兩個月平均為兩個月 )) 確定,往後確定,往後 releasesreleases ,,日後再修訂,這叫演化日後再修訂,這叫演化 (evolve)(evolve) ;軟體;軟體不斷演化,不不斷演化,不再有開發、維修之分,且再有開發、維修之分,且演演化使文件瞬間過時,化使文件瞬間過時,故本法倡虛擬碼,隨故本法倡虛擬碼,隨時閱讀了解修改時閱讀了解修改軟體軟體

2727

Page 28: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6. 6. 回合回合規劃規劃 ((Iteration Iteration PlanningPlanning)) 由開發者主導的會議 由開發者主導的會議 (( 駐點使用專家必駐點使用專家必

參加參加 )) 會中決定會中決定””派工及時程派工及時程”” (( 工序四工序四 ))

每個回合工作量不同,故其週數不固定,每個回合工作量不同,故其週數不固定,平均為三週平均為三週 ** ,這就是敏捷方法,這就是敏捷方法專案管理專案管理**** 。三週不長,故時程可嚴格控制,因而。三週不長,故時程可嚴格控制,因而取信取信 (( 甚至感動甚至感動 )) 客戶客戶

* * 石頭閒語網站認為石頭閒語網站認為 :Ruby/PHP :Ruby/PHP 生產力比生產力比 Java Java 快快 55 倍,倍,可可 2-32-3 天就推出天就推出 releaserelease

** ** 傳統軟工專案傳統軟工專案管理管理常規劃一常規劃一季季 (( 三個月三個月 )) 時程時程,,軟體業軟體業一一季季中變動太大,專案經理中變動太大,專案經理通通常無力控制時程常無力控制時程

2828

Page 29: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6. 6. 回合回合規劃 規劃 (Cont.)(Cont.)

要在白板上精準寫出要在白板上精準寫出 : :

每個每個 method method 每個每個 class class 預定之預定之工工作天數 作天數

每天追蹤進度 才能依規劃完成該每天追蹤進度 才能依規劃完成該回合回合

之前之前交貨交貨規劃時 會預估每個功能規劃時 會預估每個功能 (user (user story)story) 之之工作週數 工作週數 向客戶粗估時程 向客戶粗估時程

這與上述精準控管不同 這與上述精準控管不同 2929

Page 30: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7. 7. 站著開日會站著開日會 **(daily stand-up (daily stand-up

meeting)meeting)每個工作天,全體開發團隊成員要每個工作天,全體開發團隊成員要 站著、圍成一圈,舉行每日會議站著、圍成一圈,舉行每日會議要站著,才可長話短說,使會議簡短要站著,才可長話短說,使會議簡短要全員,才使資訊直接傳達至每一人要全員,才使資訊直接傳達至每一人要每日,才使溝通週期縮為一天要每日,才使溝通週期縮為一天 ((昨日談的事,今日即可當面問昨日談的事,今日即可當面問 ))* * 有專家認為有專家認為 :: 既然團隊整天在一起既然團隊整天在一起 ,, 溝通已足夠溝通已足夠 ,, 就不就不

需此會議需此會議 ,, 各公司自行斟酌吧各公司自行斟酌吧

3030

Page 31: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Communication Cycle Communication Cycle 溝通週期溝通週期不斷溝通、回饋、檢查、除錯、修改;不斷溝通、回饋、檢查、除錯、修改;幫助人人成長、技術精進幫助人人成長、技術精進

回合規劃

簡約設計Pair Programming with On-site Customer 1..N Bugs CYCLE TIME 5 seconds

持續整合

重構

1..N IterationsCYCLE TIME

3 weeks

交貨規劃

1..N IncrementsCYCLE TIME

2 months

增量

增量加上次交貨

測試碼保護中

1..N Methods CYCLE TIME

0.5day

喜好度調查喜好度調查1..N Questions CYCLE TIME 5 seconds (Not in XP)

站著開日會

CYCLE TIME1 day

3131

Page 32: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

測試帶動的開發方法測試帶動的開發方法(Test-driven development, TDD)(Test-driven development, TDD)

上面的溝通週期圖中,每個溝通圈走一圈 ( 溝通要快而準 ) ,就是一次測試,在週而復始的不斷測試中,優質軟體緩緩開發出來了 !

例子 : Pair Programming 中,小張將 N-1寫成 N,

同伴老李馬上指正,這就是測試例子 : Pair Programming中 , 駐點客戶 (on-site customer) 小王要求畫面字體加大,這也是測試

例子 : 喜好度調查喜好度調查中,使用者小林回答對某功能喜好度(1至 5,5表最愛 ) 為 : 1 (極不喜愛 ) ,這也是測試

Page 33: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

測試帶動的開發方法 測試帶動的開發方法 (Cont.)(Cont.)

Test-driven development (TDD) Test-driven development (TDD) 原本是指 原本是指 test case, test code, test case, test code,

test tooltest tool

在本法中 在本法中 TDD TDD 擴充其範圍,包含擴充其範圍,包含 ::

口頭確認 口頭確認 (check) (check)

人工審查 人工審查 (review) (review) 等等 廣義的 廣義的 TestTest

3333

Page 34: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

myAgile myAgile 方方法法

3434

Page 35: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

myAgile myAgile 敏捷方法 敏捷方法 (11(11道工序道工序 ) ) ** 0 0.. 探索需求 探索需求 (Exploring requirements)(Exploring requirements) 1.1.使用情節使用情節 (Scenario)(Scenario) 2. 2. 驗收測試案例驗收測試案例 ((Acceptance test case)Acceptance test case) 3.3.架構設計會議 架構設計會議 (CRC session)(CRC session) 4.4.派工及時程 派工及時程 (Dispatching and Scheduling)(Dispatching and Scheduling) 5. 5. 單元測試碼 單元測試碼 (Unit test code)(Unit test code)* 6.* 6. 資料結構設計 資料結構設計 (Data Structure Design)(Data Structure Design)* 7. * 7. 演算法設計 演算法設計 (Algorithm Design) (Algorithm Design) 含設計草圖及虛擬碼含設計草圖及虛擬碼 8. 8. 補上程式碼 補上程式碼 (Coding)(Coding) 9.9.單元及單元及驗收驗收測試 測試 (Unit & Acceptance testing)(Unit & Acceptance testing)* 10.* 10.逆向工程工具 逆向工程工具 (Reverse Engineering Tool)(Reverse Engineering Tool)(* 4(* 4道工序 即陳教授補充道工序 即陳教授補充 ,, No.6,7No.6,7 未落實可能造成未落實可能造成 O-OO-O失敗失敗 ))((另外另外 77道工序 即原始 道工序 即原始 Extreme Programming)Extreme Programming)

3535

Page 36: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.1. 使用情節使用情節 (Scenario)(Scenario)

駐點使用專家駐點使用專家 (on-site usage expert)((on-site usage expert)( 前工序兩人之前工序兩人之一一 )) 逐步用文字寫軟體逐步用文字寫軟體某功能 某功能 ( feature) ( feature) 的的使用情節使用情節(scenario)(scenario) ,用,用 A4A4紙以鉛筆記錄之,字跡工整可讀,不可紙以鉛筆記錄之,字跡工整可讀,不可鬼畫符;阿拉伯數字要慢寫清晰 鬼畫符;阿拉伯數字要慢寫清晰

探索找尋各種探索找尋各種使用情節 使用情節 - - 由由簡單簡單而繁雜,由而繁雜,由正常正常 ((normal)normal)而異常而異常 (exceptional)(exceptional)

同類 同類 scenarios scenarios 存放同存放同 filefile ,可用,可用 editoreditor快速修改快速修改

例子例子 :: 遊戲軟體最簡單的 遊戲軟體最簡單的 ””情節一情節一”” ::1.1. 看到看到 welcomeScreen (welcomeScreen (圖一圖一 )* )* ,輸入,輸入 password password 2. 2. 看到 看到 mainScreen (mainScreen (圖二圖二 )*)* ,,離開系統離開系統 * * 在在白板白板畫出各圖畫出各圖

3636

Page 37: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1.1. 使用情節使用情節 (Cont.)(Cont.)

傳統常做 流程圖 傳統常做 流程圖 (Flow Chart) (Flow Chart) 它與它與虛擬碼 虛擬碼 (pseudo code) (pseudo code) 的抽象層次相的抽象層次相同 只是表示法不同 而本法採用虛擬碼同 只是表示法不同 而本法採用虛擬碼

一個虛擬碼會對應多個使用情節一個虛擬碼會對應多個使用情節 (( 雖抽象雖抽象層次高很多層次高很多 )) 例如虛擬碼中 例如虛擬碼中 if then if then else else 對應兩個使用情節對應兩個使用情節 (( 分別執行分別執行thenthen及及 else)else)

3737

Page 38: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

2.2. 驗收測試案例驗收測試案例(Acceptance test case)(Acceptance test case)

上述每個使用情節上述每個使用情節 , , 加上輸入資料及預期輸出資料加上輸入資料及預期輸出資料後後 ,, 即做為測試該功能可否驗收之依據即做為測試該功能可否驗收之依據 , , 叫一個驗收叫一個驗收測試案例測試案例

也就是, 依每個案例跑程式也就是, 依每個案例跑程式 ; ; 如順利跑完,則該如順利跑完,則該驗收測試案例 驗收測試案例 (acceptance test case)(acceptance test case) 通過通過

例子例子 : : 遊戲軟體最簡單的遊戲軟體最簡單的””驗收測試驗收測試一一”” :: 看到 看到 welcomeScreenwelcomeScreen ,輸入,輸入 password password

JFK2008*JFK2008* 後,後, 看到 看到 mainScreenmainScreen ,,點選 點選 ExitExit ,,離開系統離開系統*JFK2008 *JFK2008 是 是 exact dataexact data ” ” , 情節一 無此” ” , 情節一 無此 data ,data , 又又 , , 此此 datadata 常是龐大的常是龐大的 data file.data file.

3838

Page 39: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

User ManualUser Manual

驗收測試案例稍加修改簡化 可輕易得到 驗收測試案例稍加修改簡化 可輕易得到 User ManualUser Manual

記得文件是動態的 驗收測試案例隨時變動 記得文件是動態的 驗收測試案例隨時變動 所以 所以 User ManualUser Manual 也是隨時變動的也是隨時變動的

3939

Page 40: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3.3.架構設計會議 架構設計會議 (CRC (CRC Session)Session)

架構設計會議常使用架構設計會議常使用 CRC(Class,Responsibility, CRC(Class,Responsibility, Collaborator)Collaborator) 會議:五人以內圍坐會議:五人以內圍坐 (( 二人亦可,國內單人專案多二人亦可,國內單人專案多無切割,兩人先溝通切割系統吧無切割,兩人先溝通切割系統吧 )) ,執行驗收測試案例,推敲切割,執行驗收測試案例,推敲切割(partition)(partition)之之 , , 找出物件找出物件 (object)(object) 及物件互動及物件互動 (object (object interactioninteraction,即,即 method)method) ,須含下層隱藏物件,須含下層隱藏物件 (hidden (hidden objects),objects), 用小卡片用小卡片 (CRC card,(CRC card, 可用可用 A4A4紙紙 )) 記錄記錄 : :

1.Class name (C), 1.Class name (C), 2.2. 要做何事 要做何事 Responsibility (R),(Responsibility (R),( 將轉為 將轉為 method)method) 3.3. 要誰合作要誰合作 (( 即需呼叫誰的 即需呼叫誰的 responsibility) responsibility) 叫 叫 Collaborator (C)Collaborator (C)

會議後所有 會議後所有 CRC cards CRC cards 即系統架構即系統架構 (class interfaces)(class interfaces),,(1)(2) (1)(2) 找找 class encapsulation, (3) class encapsulation, (3) 找 找 class use class use relationshiprelationship

此會議是此會議是群體智慧群體智慧 - - 腦力激盪,快速溝通腦力激盪,快速溝通 真相真相 : : 大型軟體從未在架構師腦袋,而是多個程式師共同擁有大型軟體從未在架構師腦袋,而是多個程式師共同擁有 4040

Page 41: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3.3.架構設計會議 架構設計會議 (Cont.)(Cont.) 1. 1. 對每個 對每個 accep. test case accep. test case 由第一步驟出發,大由第一步驟出發,大

家討論家討論 : : 要有那個 要有那個 object object 執行那個 執行那個 methodmethod ,,接著接著

又有那個 又有那個 object object 執行那個 執行那個 method … method … 直到最後步驟做完直到最後步驟做完

2. 2. 討論中,用一張討論中,用一張 A4A4 紙記錄一個紙記錄一個 classclass 及其及其 methodsmethods ,, 並指定專人扮演這並指定專人扮演這 class (class (即即 CRC)CRC)

3. 3. 會後,檢視所有會後,檢視所有 A4A4 紙,並調整之紙,並調整之 (( 如某些如某些classes classes 可合併可合併 ) )

即得 即得 class interfacesclass interfaces ( ( 軟體架構軟體架構 )) 4. 4. 架構定案後,各 架構定案後,各 method method 要寫好要寫好 header header (method description, parameters, (method description, parameters, return value, exceptions)return value, exceptions) 1.parameters 1.parameters 不超過 不超過 5 5 個 個 (magic 7 (magic 7

minus 2)minus 2) 2.return value 2.return value 是一個 是一個 object, object, 但寫出的但寫出的

是其 是其 classclass 3.3. 原則上禁用 原則上禁用 global variablesglobal variables

4141

Page 42: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3.3.架構設計會議 架構設計會議 (Cont.)(Cont.)CRCCRC集思廣益來切割集思廣益來切割 (partition)(partition)驗收測驗收測試案例試案例 ,, 並找出並找出 useruser 看不到的下層隱藏物看不到的下層隱藏物件件 (hidden objects) (hidden objects) 紅色表示 紅色表示 例如例如 ::張三張三是位是位官兵官兵 李四李四是個是個土匪 土匪 某日二人狹路相逢某日二人狹路相逢 **

張三張三要用繩子捉拿要用繩子捉拿李四李四 ****

李四李四問問王五王五綁何處 綁何處 (( 王五王五是位是位醫生醫生 ))張三想起兩人恩怨情仇 不禁流下熱淚張三想起兩人恩怨情仇 不禁流下熱淚

** 一般英文書用一般英文書用 John, MaryJohn, Mary為物件名為物件名 , , 國人感受不深國人感受不深 , , 故用張三等故用張三等* Scenario* Scenario 中細字表示未實作部分 底線表中細字表示未實作部分 底線表 class,object class,object 粗體表粗體表 method method 斜體表斜體表

parameterparameter

****直覺的說直覺的說 : : 張三用繩子捉拿李四 但 張三用繩子捉拿李四 但 O-OO-O 程式不是這樣執行的程式不是這樣執行的 methodmethod捉拿屬於土捉拿屬於土匪匪

4242

Page 43: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3.3.架構設計會議架構設計會議 (Cont.)(Cont.)

由上述 可得下列設計由上述 可得下列設計 ::

classclass官兵官兵 {..} {..} 官兵 張三官兵 張三classclass土匪土匪 {.{. 捉拿捉拿 (( 工具工具 ,, 被捉者被捉者 ))}} 土匪 李四土匪 李四classclass醫生醫生 {..{.. 綁何處 綁何處 ( )}( )} 醫生 王五 醫生 王五 ..........

李四李四 .. 捉拿捉拿 (( 繩子繩子 , , 李四李四 ); );

…… ……

王五王五 .. 綁何處 綁何處 (( ););

4343

Page 44: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

3.3. 架構設計會議架構設計會議 (Cont.)(Cont.)

複習一下本例基本觀念複習一下本例基本觀念 ::

User Story (User Story (功能功能 )) 是是 :: 張三捉人張三捉人Scenario Scenario 是是 :: 張三要用繩子捉拿李四張三要用繩子捉拿李四Use Case Use Case 是是 : (: ( 這文件併入架構設計文件這文件併入架構設計文件 ))

張三要李四用繩子捉拿張三要李四用繩子捉拿他自己他自己 李四問王五綁何處李四問王五綁何處

4444

Page 45: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

張三捉李四的真相張三捉李四的真相 的確是張三下令要捉李四的確是張三下令要捉李四 ,, 但張三沒動手但張三沒動手 張三把繩子給了李四張三把繩子給了李四 ,, 並指示李四並指示李四 :: 被捉者正被捉者正是李四自己是李四自己 ** 然後李四毫不猶豫執行捉拿動然後李四毫不猶豫執行捉拿動作作 **** 而張三不知道動作細節而張三不知道動作細節 (( 綁手或腳綁手或腳 ),),執行後系統會回報結果給張三執行後系統會回報結果給張三 ******

* The method gets two input * The method gets two input arguments.arguments.

** then, it executes the method,** then, it executes the method,

*** finally, it sends return value.*** finally, it sends return value.4545

Page 46: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

架構設計的重要性架構設計的重要性 專案如沒做好專案如沒做好架構設計,將導至架構設計,將導至 :: 物件不吻合客戶觀念,即 物件不吻合客戶觀念,即 O-O O-O 失敗失敗 !!

同時,因無良好切割,常有太大模組,同時,因無良好切割,常有太大模組, 無法找到完整無法找到完整單元測試狀況單元測試狀況,使品質差。,使品質差。 而且,重擔集中在寫大模組那一人,而且,重擔集中在寫大模組那一人, 無法真正分工,也就無法做到無法真正分工,也就無法做到 teamworkteamwork

架構設計切割出的架構設計切割出的 class, public method class, public method 要寫要寫 class interfaceclass interface,,再補充成再補充成標頭標頭(header)(header)

4646

Page 47: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Class InterfaceClass Interface 的好處的好處1. 1. 藉精準命名 藉精準命名 class names, method names class names, method names

捕捉客戶觀念,以落實物件導向捕捉客戶觀念,以落實物件導向 (O-O)(O-O)開發;開發;如客戶不懂這些 如客戶不懂這些 namesnames,此時尚未開始寫程式,,此時尚未開始寫程式,即已確定 即已確定 O-OO-O失敗失敗 !!

2. 2. 可依之分工,多人併行開發各 可依之分工,多人併行開發各 classclass,, 以加速軟體交貨;以加速軟體交貨;高速度交貨高速度交貨很重要很重要

Class interface Class interface 補充後成為 補充後成為 class class headerheader

內有 內有 method headersmethod headers

4747

Page 48: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Class Interface Class Interface 例子例子 Selection Sort Selection Sort 的的 class interface class interface 如下如下 ::

public class public class mySortmySort {{

/*/* 稍後 稍後 data structure data structure 在此 在此 ((目前目前不不含含 )*/)*/

public public mySortmySort (int inputArray[]){ } (int inputArray[]){ }

public int [] public int [] sortsort ( ) { } ( ) { }

} // end of mySort } // end of mySort

method interfacemethod interface 4848

Page 49: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

確認 物件確認 物件 駐點駐點使用專家使用專家要確認要確認 : : 物件是否吻合客戶觀念物件是否吻合客戶觀念 ::

1. 1. 將將 class names, public method names (class names, public method names ( 英文英文 )) 列一清單, 列一清單, 刪除底層電腦相關 刪除底層電腦相關 namesnames ,如資料庫,如資料庫 classclass 2.2. 不加任何書面或口頭解釋,將清單給多位領域不加任何書面或口頭解釋,將清單給多位領域專家專家 3. 3. 專家們逐一確認上述 專家們逐一確認上述 names names :: 如了解,則打勾;如不清楚,則打X如了解,則打勾;如不清楚,則打X 4. 4. 統計打勾比例,如統計打勾比例,如 100 100 個 個 names names 平均有 平均有 80 80 個打勾,個打勾,

則 則 O-O 80% O-O 80% 成功!成功!

4949

Page 50: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

為何要為何要確認 物件確認 物件 ??

軟體必須精準反映領域知識軟體必須精準反映領域知識 (domain (domain knowledge) knowledge) 才易不斷維修 軟體才活著才易不斷維修 軟體才活著

而領域知識就是領域專家們的知識而領域知識就是領域專家們的知識 所以要所以要確認確認軟體用詞吻合軟體用詞吻合 領域專家們領域專家們 (domain experts)(domain experts) 的用詞的用詞

例子例子 :: 會計軟體用 會計軟體用 class Names class Names 如如 BalanceSheets, BalanceSheets, Accounts Accounts 等等 ;; Object Name Object Name 如 如 sep09Account;sep09Account;

method Names method Names 如 如 debit debit 借借 , credit , credit 貸貸5050

Page 51: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Interface and Header (Interface and Header (標頭標頭 ))

Class interface and method Class interface and method interface interface

之前都需要文字說明之前都需要文字說明 ,,

以便維修者閱讀了解之以便維修者閱讀了解之

這文字說明就叫 這文字說明就叫 Header (Header ( 標頭標頭 ))

5151

Page 52: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

標頭標頭 (header)(header) 的重要性的重要性 搜尋、閱讀 搜尋、閱讀 open source open source 的的標頭,才能重標頭,才能重用程式用程式 (reuse code)(reuse code);與開發程式;與開發程式(developed code) (developed code) 相較,它較優質,應相較,它較優質,應優先採用:優先採用: 1)1)因大眾測試過因大眾測試過 ((可信任可信任 )),,

2)2)並有效能評估並有效能評估 (Big O time (Big O time estimate)estimate)

大量重用程式,小團隊大量重用程式,小團隊 (small project (small project size, team size)size, team size) 能快速完成優質大軟體能快速完成優質大軟體(big problem size)(big problem size)

開發程式行數開發程式行數 (Line of code)(Line of code)無甚意義了無甚意義了5252

Page 53: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

標頭的重要性 標頭的重要性 (Cont.)(Cont.)

標頭有點像程式碼的使用手冊,常見一般標頭有點像程式碼的使用手冊,常見一般人使用電氣用品不讀使用手冊人使用電氣用品不讀使用手冊 (( 有時因使有時因使用手冊艱澀難讀用手冊艱澀難讀 )) ,易把東西用壞,修幾,易把東西用壞,修幾次後就不能修了,只好丟棄,很不環保次後就不能修了,只好丟棄,很不環保

標頭也像報紙標題,要能助讀者輕鬆讀報標頭也像報紙標題,要能助讀者輕鬆讀報 標頭要寫好,程式碼才能易讀易修, 標頭要寫好,程式碼才能易讀易修, 活得長長久久活得長長久久

5353

Page 54: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Interface Interface 的重要性的重要性 有次安裝冷氣機後有次安裝冷氣機後 ,, 工人開冷氣開關工人開冷氣開關 ,, 機器不機器不動動 ,, 於是拆開冷氣機檢查於是拆開冷氣機檢查 ,, 後來才發現是後來才發現是 : :

電氣總開關中電氣總開關中 ,, 冷氣開關標示位置錯誤冷氣開關標示位置錯誤

對應到軟工領域對應到軟工領域 :: 有次開發軟體時有次開發軟體時 ,, 軟體不軟體不動動 ,, 於是工程師 於是工程師 debug source code,debug source code, 後後來才發現是來才發現是 : API (application : API (application program interface) program interface) 的 的 header header 寫錯寫錯了了

5454

Page 55: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Header(Header( 標頭標頭 )) 設計原則設計原則Header要醒目易溝通 [ 寫給大家的平面設計書 ,R.

Williams原著 , 三言社 ,2006] 舉數原則 : (後面有例子 )

1.1.利用空白將利用空白將相似相似項目放一起 形成視覺單元項目放一起 形成視覺單元2.2.每頁不超過五個單元每頁不超過五個單元3.3. 各單元要各單元要對齊 對齊 形成視覺聯貫性 形成視覺聯貫性 4.4. 要要重複重複重點重點 (( 如粗體字如粗體字 )) 營造一致性風格營造一致性風格5.5. 要強烈要強烈對比對比 (( 如粗體字與標準字如粗體字與標準字 )) 營造視覺焦點營造視覺焦點 5555

Page 56: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Header(Header( 標頭標頭 ) ) 兩例兩例/* method subString ----------------------------------------------

* A String object 呼叫此 method ,傳回介於兩個指定的 indexes 的子字串** @param beginIndex 子字串起始的 index ( 含此 index)* @param endIndex 子字串最後的 index ( 不含此 index)* @return 由 beginIndex 到 “ endIndex 的前一個位置” 的子字串** @throws IndexOutOfBoundsException – * if beginIndex 是負數 or* beginIndex 大於 endIndex or* endIndex 大於 length()** Time estimate : 演算法設計後,才獲此資訊,如 O (n)* Example: “helloworld”.subString(3,6) ; 傳回結果為 “ low”-------------------------------------------------------------------------*/public String subString (int beginIndex, int endIndex)

5656

Page 57: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

/* class EventDetectionThread -----------------------------------/* class EventDetectionThread -----------------------------------

**

* * 本 本 thread thread 產生 產生 detector,detector,它它 startstart後後 ,, 每每 0.50.5秒秒 (500 ms)(500 ms) 到預到預設的設的 ./buffer./buffer 資料夾抓取資料夾抓取 (fetch)(fetch) 一個一個 event information(.xml)event information(.xml)的的 pathpath

* * 並通知並通知 observer (observer ( 叫 叫 event parser) event parser) 此此 path. path.

* * 如資料夾是空的如資料夾是空的 , , 則回傳則回傳 null.null.

* *

* Example:* Example:

* ./buffer* ./buffer 資料夾有存進來的三個資料夾有存進來的三個 event information:event information:

**

* 091123153040000.xml (* 091123153040000.xml ( 最早存進來最早存進來 ) y09 m11 d23 ms0) y09 m11 d23 ms0

* 091123153040500.xml y09 m11 d23 time1530 ms40500* 091123153040500.xml y09 m11 d23 time1530 ms40500

* 091123153041000.xml (* 091123153041000.xml ( 最晚存進來最晚存進來 ) )

* *

* detector * detector 依序抓取 依序抓取 091123153040000.xml 091123153040000.xml 等等等等

*------------------------------------*------------------------------------*/*/

註註 :: 如寫如寫 detector=new EventDetectionThred();detector=new EventDetectionThred(); 則不夠則不夠 abstractabstract

Page 58: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

工序一至三片段例子工序一至三片段例子工序是前後聯貫的 例如工序是前後聯貫的 例如 ::

1.Scenario: show finish message 1.Scenario: show finish message (msg)(msg)

2.Acceptance test case:2.Acceptance test case:

show finish message (msg) “show finish message (msg) “結束了結束了””

3.Architecture design:3.Architecture design:

/*------------------------------/*------------------------------

show finish message “show finish message “結束了結束了””

-------------------------------*/ -------------------------------*/

public void showFinishMsg()public void showFinishMsg()5858

Page 59: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

傳統軟工設計傳統軟工設計 (Cont.)(Cont.)

例子例子 :: 兩個軟體工程師兩個軟體工程師風格迥異風格迥異 ::

小王小王 : : 某程式寫二百行很快寫完某程式寫二百行很快寫完 小林小林 : : 上網查上網查 APIAPI直接直接 reuse reuse 一行也沒寫一行也沒寫誰應加薪誰應加薪 ??

真相真相 :: 小林應加薪小林應加薪 因因 reused codereused code 不需測試 且日後永不需維修不需測試 且日後永不需維修

5959

Page 60: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

傳統軟工設計傳統軟工設計 (Cont.)(Cont.)

例子例子 : : 兩個軟體工程師兩個軟體工程師風格迥異風格迥異 ::

小王小王 : : 很快開發完很快開發完 20K20K的的 class class

小林小林 : : 仔細推敲不同切割方式 最後完成 多仔細推敲不同切割方式 最後完成 多個 個 2K 2K 的小的小 classesclasses

誰應加薪誰應加薪 ??

真相真相 :: 小林應加薪 他完成 小林應加薪 他完成 well-crafted well-crafted software software 而而小王小王只完成只完成 working working softwaresoftware

6060

Page 61: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

4.4. 派工及時程派工及時程 依上述軟體架構 依上述軟體架構 (class interfaces)(class interfaces) ,, 各個 各個 class class 由團隊成員由團隊成員””認領認領””

即為即為派工派工 ((真義是真義是 : : 領工領工 )) 由由認領本人依本身狀況認領本人依本身狀況,,估計工作天數估計工作天數,,乘公司經驗值寬放係數後,即為乘公司經驗值寬放係數後,即為時程 時程

本回合內每天嚴守時程,即可精準本回合內每天嚴守時程,即可精準交貨,以交貨,以執行力達成承執行力達成承 諾 諾 才能取信、感動客戶才能取信、感動客戶 **

** ”國興電視 全”國興電視 全能住宅改造王能住宅改造王””注重生態文化,工匠極致矣 注重生態文化,工匠極致矣 下圖白板上顯示 下圖白板上顯示 Mary Ann Mary Ann 回合 的派工資訊回合 的派工資訊

6161

Page 62: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Cockburn, Cockburn, Agile Software Development, Agile Software Development, p.86p.86,,Addison-Wesley, 2002.Addison-Wesley, 2002.

6262

Page 63: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

4.4. 派工及時程 派工及時程 (Cont.)(Cont.)

Release Release 交貨 交貨 vs.Iteration vs.Iteration 回合回合只對只對目前回合目前回合 (( 二至四週,二至四週,平均三週平均三週 **) ) 做派做派工及時程規劃,回合可打出進攻節奏工及時程規劃,回合可打出進攻節奏 (pace)(pace)

使團隊威猛快速 使團隊威猛快速 (strong heart-beat)(strong heart-beat) 每回合後微調方法每回合後微調方法 (methodology tune-(methodology tune-up)up)每一至四個月每一至四個月 (( 平均二個月平均二個月 )) 交貨給客戶交貨給客戶 ****

** 用用 Ruby/PHP(Ruby/PHP(而非而非 Java)Java)可縮短時間;可縮短時間;用組合語言,則增用組合語言,則增長長

** ** 不斷交貨不斷交貨 (( 即演化 即演化 evolve)evolve),已無開發、維修之分,已無開發、維修之分6363

Page 64: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Release Release 交貨交貨 Increment Increment 增量增量Iteration Iteration 回合回合

交貨 1 交貨 1 +增量 2 = 交貨 2

回合 ( 派工及時程 )

約三週

約二個月 虛線表示:不確定、可變動

增量 1 增量 2

6464

Page 65: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

5.5. 單元測試碼 單元測試碼 (Unit test code)(Unit test code)

對某 對某 class class 的每個 的每個 public method (public method ( 叫單叫單元 元 unit)unit) 先想出多種測試狀況 先想出多種測試狀況 (test (test cases)cases)由簡而繁由簡而繁 (( 最簡如 最簡如 null input)null input)由正由正

常而異常 常而異常 ((異常異常 exceptions exceptions 若 若 handle handle 不好,軟體將不好用不好,軟體將不好用 ))

每一狀況寫出輸入 每一狀況寫出輸入 (input) (input) 及預期輸出 及預期輸出 (expected output) (expected output) 叫一個單元測試 叫一個單元測試 (unit (unit test case)test case);再改寫成測試碼 ;再改寫成測試碼 (test code) (test code)

相對於他國,國人工作文化較急燥,所以更需要相對於他國,國人工作文化較急燥,所以更需要做好做好單元測試碼 做為程式護身符單元測試碼 做為程式護身符 程式一有維修,程式一有維修,即全面重跑測試碼,可確保品質即全面重跑測試碼,可確保品質

6565

Page 66: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Test Code ExampleTest Code Example

//Test Case 1//Test Case 1:: input {3,1,4,2} expected outputinput {3,1,4,2} expected output:: {1,2,3,4}{1,2,3,4} public void testSort1() {public void testSort1() {

/* input/* input 為待排序數列,為待排序數列, expectedexpected 為預期結果為預期結果 , result, result 為實際結果為實際結果 **//   int input[] = {3,1,4,2},expected[] = {1,2,3,4}; int result[];int input[] = {3,1,4,2},expected[] = {1,2,3,4}; int result[];   /* new /* new 一個 一個 mySortmySort 的物件,傳入參數的物件,傳入參數 input */input */ mySort obj = new mySort(input);mySort obj = new mySort(input);

/*/* 呼叫呼叫 sortsort 來排序來排序 **/ / result = obj.sort();result = obj.sort();

/* assert/* assert 實際結果與預期結果是否 實際結果與預期結果是否 equal */equal */ assertEqualsassertEquals (toString(result), toString(expected)); (toString(result), toString(expected)); }}

6666

Page 67: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Test Cases As Test Cases As Test Code HeaderTest Code Header

//Test Case 1: input {3,1,4,2} expected output//Test Case 1: input {3,1,4,2} expected output:: {1,2,3,4}{1,2,3,4}//Test Case 2: input {1,1,1,1} expected output//Test Case 2: input {1,1,1,1} expected output:: {1,1,1,1}{1,1,1,1}//Test Case 3: input {3,2,4,2} expected output//Test Case 3: input {3,2,4,2} expected output:: {2,2,3,4}{2,2,3,4} public void testSort1() {public void testSort1() { /* input/* input為待排序數列,為待排序數列, expectedexpected為預期結果為預期結果 , result, result為實際結果為實際結果 **//   int input[] = {3,1,4,2},expected[] = {1,2,3,4}; int result[];int input[] = {3,1,4,2},expected[] = {1,2,3,4}; int result[];………….. .. public void testSort2() {public void testSort2() {…………public void testSort3() {public void testSort3() {………………

  6767

Page 68: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

More on Test Cases (Cont.)More on Test Cases (Cont.)舉極簡例舉極簡例 : : 先開發 先開發 method interface:method interface: /*/*加 加 a,b,a,b,回傳其和回傳其和 */public int add (int a,b) {}*/public int add (int a,b) {}

1.a,b 1.a,b 各有正各有正 ,, 零零 ,, 負三狀況負三狀況 ,, 共有九狀況共有九狀況 :: Case 1: a is 1, b is 2 (Case 1: a is 1, b is 2 (正正 ,, 正正 ))

Case 2: a is 1, b is 0 (Case 2: a is 1, b is 0 (正正 ,, 零零 ) ……) ……

2.2.將 將 9 test cases 9 test cases 寫成 寫成 test codetest code

3.3.再開發 再開發 source code source code 即即 { return a+b;}{ return a+b;}

4.4.最後用最後用 JunitJunit跑跑 test codetest code測測 source codesource code

6868

Page 69: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6.6. 資料結構設計 資料結構設計 (Data Structure Design)(Data Structure Design)

對每個 對每個 classclass ,要設計這 ,要設計這 class class 所含的 所含的 public methods public methods 共同要用的 共同要用的 datadata

儘可能設計出 儘可能設計出 high-level data structure high-level data structure 如如 tree tree 而非而非

low-level data structure low-level data structure 如如arrayarray

這樣可簡化 演算法設計 使之易於思考 這樣可簡化 演算法設計 使之易於思考 6969

Page 70: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6.6. 資料結構設計 資料結構設計 (Cont.)(Cont.)建議使用建議使用 Java Collections Framework (JCF) * Java Collections Framework (JCF) * 含下列三種離散數學觀念及其 含下列三種離散數學觀念及其 classesclasses::1.List1.List如如 <1,2,3>: ArrayList, <1,2,3>: ArrayList, LinkedListLinkedList

2.Set 2.Set 如如 {3,1,2}: TreeSet, HashSet{3,1,2}: TreeSet, HashSet3.Map 3.Map 如如 {1->a,2->b,3->a}: TreeMap, HashMap{1->a,2->b,3->a}: TreeMap, HashMap另有 另有 Heap, PriorityQueue (Heap, PriorityQueue (以後可能有 以後可能有 Network)Network)JCF method JCF method 有 有 Big OBig O,使開發,使開發的 的 method method 也也 有 有 Big OBig O

例子例子 :: for each i for each i 從從 1 1 到 到 NN call TreeSet method with O(logN) call TreeSet method with O(logN) end for end for 即得 即得 O (N logN)O (N logN)* Collins,* Collins,Data Structures and the Java Collections Data Structures and the Java Collections

Framework,Framework, McGraw-Hill, 2005. McGraw-Hill, 2005.7070

Page 71: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7171

小英 10.0 8.3 7.4 小明 小華

阿偉 20.0

14.2 15.0 小莉

An ExampleAn Example例例 : : 從小明家有單行道十公里到小英家 從小明家有單行道十公里到小英家

本頁是本頁是問題描述 問題描述 下頁才是下頁才是設計草圖設計草圖

Page 72: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

100

17

adjacencyMap0

0

29

57

85

95

null

hash key value next

68899 小華 null null

-303674281 小莉 null

72266597 小明 null

2390765 小英 null

2599292 阿偉 nullnull

阿偉 null15.0

阿偉 null8.3

小華 20.0

小莉 null14.2

小英 10.0

小華 7.4

to distance next

Page 73: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

設計草圖轉成設計草圖轉成Java data structure codeJava data structure code

protected HashMap protected HashMap

<Houses, LinkedList <NeighborDistances>> adjacencyMap;<Houses, LinkedList <NeighborDistances>> adjacencyMap;

protected Houses protected Houses 小明小明 ;;

protected NeighborDistances protected NeighborDistances 小明小莉小明小莉 14.2;14.2;

7373

Page 74: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6.6. 資料結構設計 資料結構設計 (Cont.)(Cont.)

資料結構設計與演算法設計互有關連,前資料結構設計與演算法設計互有關連,前者高階 則後者精簡、品質高者高階 則後者精簡、品質高

目前很多人寫程式,不落實資料結構設計目前很多人寫程式,不落實資料結構設計,直接進入演算法設計,甚至直接進入程,直接進入演算法設計,甚至直接進入程式設計,其資料結構只用很多基本的陣列 式設計,其資料結構只用很多基本的陣列 (array)(array)這這使得使得演算法繁複,導致演算法繁複,導致程式冗程式冗長長,,不易閱讀維修不易閱讀維修

7474

Page 75: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

6.6. 資料結構設計 資料結構設計 (Cont.)(Cont.)

有學生問有學生問 :: 如要存放一些資料到 如要存放一些資料到 arrayarray 那那麼資料結構就用麼資料結構就用 arrayarray 就好了 何必用高階就好了 何必用高階資料結構呢資料結構呢 ??

答答 :: 用高階資料結構 用高階資料結構 Java Java 的 的 ArrayList ArrayList 可 可 auto resizing auto resizing 當長時當長時間使用後 間使用後 arrayarray 資料滿了 它可自動擴充資料滿了 它可自動擴充size size 使系統不當機 這當然比用低階的 使系統不當機 這當然比用低階的 arrayarray 好多了好多了

7575

Page 76: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7.7. 演算法設計 演算法設計 (Algorithm (Algorithm Design)Design)

先依資料結構及先依資料結構及單元測試,單元測試,畫出畫出設計草圖 設計草圖 (design (design sketch)sketch)並寫下當時的解題想法並寫下當時的解題想法,,再用英詞中句的再用英詞中句的虛擬虛擬碼 碼 (pseudo code)(pseudo code) 寫出該想法寫出該想法,此,此即即演算法設計 演算法設計

要依不同抽象層次 要依不同抽象層次 (abstraction levels) (abstraction levels) 由上而下逐層寫出虛擬碼 由上而下逐層寫出虛擬碼 每層都要 每層都要 trace test casetrace test case來來 debugdebug ,即,即演算法設演算法設

計 計 除錯除錯

最下層虛擬碼即最下層虛擬碼即演算法演算法,要做時間估算 ,要做時間估算 (time estimate)(time estimate) ,, 若若時間時間太長,如太長,如 O(nO(n33)) ,則重做資料結構設計,則重做資料結構設計

若若演算法超過一個畫面,則分割出下層 演算法超過一個畫面,則分割出下層 private methodprivate method ,, 這可使這可使演算法清晰呈現演算法清晰呈現 (( 若只有程式碼,無法若只有程式碼,無法呈現演呈現演

算法算法 )) 演算法可投影牆上,做 演算法可投影牆上,做 團隊審查 團隊審查 (group review)(group review)

7676

Page 77: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

設計草圖設計草圖

7777

Page 78: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

虛擬碼虛擬碼設計一設計一

public Tokens[] public Tokens[] getTheTokens getTheTokens ( )( ) //see youTube “compiler lab1 scanner”//see youTube “compiler lab1 scanner” Tokens aToken // next token in the lineTokens aToken // next token in the line String line //the current line being scannedString line //the current line being scanned       private private skipBlanksskipBlanks () () if (endOfLine) then do nothingif (endOfLine) then do nothing elseelse while (tokenBeginning points to a blank) while (tokenBeginning points to a blank) increment both tokenBeginning & forwardincrement both tokenBeginning & forward end whileend while end ifend if end skipBlanks()end skipBlanks()

7878

Page 79: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1 open sourceFile 1 open sourceFile 2. read first line into “line”2. read first line into “line” 3. forward,tokenBeginning 3. forward,tokenBeginning ←← 0 0 4. while (not endOfFile)4. while (not endOfFile) 1. call skipBlanks( )1. call skipBlanks( ) 2. if (endOfLine) then 2. if (endOfLine) then 1.read next line into “line”1.read next line into “line” 2.if (not endOfFile) then 2.if (not endOfFile) then forward,tokenBeginning forward,tokenBeginning ←← 0 0 end ifend if elseelse 1. call getNextToken( ) to get aToken (“tokenBeginning” to “forward-1”)1. call getNextToken( ) to get aToken (“tokenBeginning” to “forward-1”) 2. store aToken into theTokens2. store aToken into theTokens 3. tokenBeginning 3. tokenBeginning ← ← forward;forward; end if end if end whileend while 5. return theTokens 5. return theTokens

end getTheTokens()end getTheTokens()

7979

Page 80: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

改善虛擬碼改善虛擬碼 虛擬碼虛擬碼設計一的缺點設計一的缺點 :: 1: skipBlank() 1: skipBlank() 內不只跳過空白字 還要內不只跳過空白字 還要檢查是否 檢查是否 end of line end of line 太複雜太複雜

2. 2. 若把上述若把上述 end of line end of line 檢查移到檢查移到calling program (calling program (getTheTokens) getTheTokens) 發現發現end of line end of line 檢查重複兩次 須化簡檢查重複兩次 須化簡

改善後 得到虛擬碼改善後 得到虛擬碼設計設計二二8080

Page 81: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

虛擬碼虛擬碼設計二設計二 public Tokens[] public Tokens[] getTheTokens getTheTokens ( )( ) //see youTube “compiler lab1 scanner”//see youTube “compiler lab1 scanner” Tokens aToken // next token in the lineTokens aToken // next token in the line String line //the current line being scannedString line //the current line being scanned

private private skipBlanksskipBlanks () () while (tokenBeginning points to a blank) while (tokenBeginning points to a blank) increment both tokenBeginning & forwardincrement both tokenBeginning & forward end whileend while end skipBlank ()end skipBlank ()

8181

Page 82: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

1 open sourceFile 1 open sourceFile 2. read first line into “line”2. read first line into “line” 3. forward,tokenBeginning 3. forward,tokenBeginning ←← 0 0 4. while (not endOfFile)4. while (not endOfFile) if (endOfLine) then if (endOfLine) then 1.read next line into “line”1.read next line into “line” 2.if (not endOfFile) then 2.if (not endOfFile) then forward,tokenBeginning forward,tokenBeginning ←← 0 0 end ifend if elseelse 1. call skipBlanks( )1. call skipBlanks( ) 2. call getNextToken( ) to get aToken (“tokenBeginning” to “forward-1”)2. call getNextToken( ) to get aToken (“tokenBeginning” to “forward-1”) 3. store aToken into theTokens3. store aToken into theTokens 4. tokenBeginning 4. tokenBeginning ← ← forward;forward; end if end if end whileend while 5. return theTokens 5. return theTokens

end getTheTokens()end getTheTokens()8282

Page 83: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Why Why 增加兩種文件增加兩種文件 ??

XP XP 常被批評文件不足,又斟酌台灣國情,常被批評文件不足,又斟酌台灣國情,故增加兩種文件故增加兩種文件 ::

1. 1. 設計草圖 設計草圖 (design sketch) (design sketch) 寫在白板或白紙,短暫儲存 寫在白板或白紙,短暫儲存 重要草圖可貼入文字檔長久儲存 重要草圖可貼入文字檔長久儲存

2. 2. 虛擬碼 虛擬碼 (pseudo code)(pseudo code) 寫在文字檔寫在文字檔 (( 如如 Java file)Java file) 可與程式融合,可與程式融合, 長久儲存 它與流程圖長久儲存 它與流程圖 (flow chart)(flow chart) 語意相同語意相同

8383

Page 84: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Why Why 增加兩種文件增加兩種文件 ? (Cont.)? (Cont.)

有研究生問有研究生問 :: 網站看到美國程式 並無設計草圖虛網站看到美國程式 並無設計草圖虛擬碼 何以需要?擬碼 何以需要?答答 :: 在美國鄉間小路 中間沒劃分隔黃線 但開車在美國鄉間小路 中間沒劃分隔黃線 但開車者心中有把尺 把路分兩半 車子開在右半 左半者心中有把尺 把路分兩半 車子開在右半 左半留於對向來車 這就不撞車了 留於對向來車 這就不撞車了

在台灣 就需要有分隔黃線 才免於撞車 因為人的在台灣 就需要有分隔黃線 才免於撞車 因為人的心中無法度 文化不夠 只好增加工序心中無法度 文化不夠 只好增加工序另一正面思考是 這可使台灣軟體品質超過美國另一正面思考是 這可使台灣軟體品質超過美國軟體軟體

8484

Page 85: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Design Sketch Design Sketch 設計草圖設計草圖 利用紙、鉛筆、橡皮擦、尺描繪出利用紙、鉛筆、橡皮擦、尺描繪出 design sketchdesign sketch

8585

0 1 .. .. n-2 n-13 1 4 2

0 1 ( i ) .. .. n-2 n-11 3 4 2

0 1 ( i ) .. .. n-2 n-11 3 4 2

0 1 .. .. n-2 n-11 2 3 4

0 1 .. .. n-2 ( i )

n-1

1 2 4 3

首先從數列中 select 出 min (即 數值 1 ),並放到數列的第一個位置(即 索引 0 )。固定此數不再變動。

再從剩餘數列中 select 出 min (即 數值 2 ),並放到剩餘數列(即 索引 i ~ n-1 )的第一個位置 (即 索引 1 )。

固定此數不再變動。

::

依此方式直到走訪完,走訪至數列倒數第二個數(即 索引 n-2 )。

即完成數列小到大 sort ( 詳見範例 )

索引數值

Page 86: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Design Sketch (Cont.)Design Sketch (Cont.)

畫畫 design sketch design sketch 後 後 - - 看圖說故事看圖說故事 :: 圖 圖 即 即 design sketch design sketch 設計草圖設計草圖 (( 上頁左側上頁左側 )) ,, 故事故事即 即 pseudo code pseudo code 細部設計細部設計 (( 上頁右側上頁右側 ) )

Sketch Sketch 很人性化,開發者心神負擔 很人性化,開發者心神負擔 (cognitive load) (cognitive load) 小,不易出錯,品質較高小,不易出錯,品質較高

兩人在白板前進行 兩人在白板前進行 design sketchdesign sketch ,, 可充份討論,品質較佳可充份討論,品質較佳

8686

Page 87: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Design Sketch (Cont.)Design Sketch (Cont.)

各種設計皆始於草圖各種設計皆始於草圖 (sketch)(sketch) ,, 草圖要草圖要””草草”” (( 不精確描述 未確定部份不精確描述 未確定部份 )) ,, 再逐步思考、決定,趨於精確描述,再逐步思考、決定,趨於精確描述, 可用 可用 //TODO //TODO 或 或 //?? //?? 表示未確定部分的圖 表示未確定部分的圖 這樣避免率爾決定,才有深而密的思考這樣避免率爾決定,才有深而密的思考

程式師常過早使用精確符號程式師常過早使用精確符號 (( 如程式語言如程式語言 )) 過早決定細節,過早決定細節,這就破壞了設計品質這就破壞了設計品質

8787

Page 88: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Pseudo code Pseudo code 內文內文 Pseudo code Pseudo code 內文以內文以英詞中句書寫 書寫 英詞英詞 (English Term) (English Term) 就是詞直接以英文表達就是詞直接以英文表達 ((如 如 class nameclass name、、 method namemethod name、、 variable namevariable name等等 )) ,,要要精準精準,,須與程式內命名相同須與程式內命名相同

至於至於「詞」組合成「句」,因國人英文造句能力較弱,「詞」組合成「句」,因國人英文造句能力較弱,故用中文句子故用中文句子 (( 叫叫中句中句 )) ,便於快速了解以維修之,便於快速了解以維修之

例如例如下面中句含二英詞:下面中句含二英詞:

從從 aarray [i..N-1]rray [i..N-1] 中找 中找 min min ,, 並換到它的第一個位置並換到它的第一個位置

8888

Page 89: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

英詞 英詞 (English Term)(English Term)

如果開發者以中文思考 且皆閱讀中文資料如果開發者以中文思考 且皆閱讀中文資料則其腦海不易訂出精準英詞 則其腦海不易訂出精準英詞

可是程式要以精準英文表達的 可是程式要以精準英文表達的

此時要找英文較好者 此時要找英文較好者 review review 英詞英詞

8989

Page 90: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

英詞 命名英詞 命名 Class, object, variableClass, object, variable 以以名詞名詞命名命名

class class 用大寫開頭 最好複數 用大寫開頭 最好複數 (( 如如 Desks)Desks)

object object 用單數 最好有冠詞 用單數 最好有冠詞 (( 如如myDesk)myDesk)

只有一個 只有一個 objectobject ,不致混淆,則省冠詞,不致混淆,則省冠詞 如 如 symbolTable symbolTable 而非 而非 aSymbolTableaSymbolTable

Method Method 以以動詞動詞命名,並以參數區別之,如:命名,並以參數區別之,如: buy (Desks myDesk)buy (Desks myDesk)

buy (Tables hisTable) buy (Tables hisTable) 為不同 為不同 methodsmethods9090

Page 91: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

英詞 命名 英詞 命名 (Cont.)(Cont.)

英詞 要易了解,才記得住 英詞 要易了解,才記得住 (sticky (sticky 黏得緊不脫黏得緊不脫落 意即不忘記落 意即不忘記 ))

請用十秒鐘 默記下面英詞 再寫出:請用十秒鐘 默記下面英詞 再寫出:

9191

測驗一 : WT0820 Oleogg Crosmioft

測驗二 : TW2008 Google Microsoft

Page 92: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

英詞 命名 英詞 命名 (Cont.)(Cont.)

上面的英詞 上面的英詞 WT0820 TW2008WT0820 TW2008

雖擁有相同字母 但因排列不同 其易記性 雖擁有相同字母 但因排列不同 其易記性 (stickiness) (stickiness) 品質差異甚大品質差異甚大

TW2008 TW2008 使讀者聯想到使讀者聯想到 ::

1. TAIWAN (TW) 2. 1. TAIWAN (TW) 2. 西元西元 20082008 年 年 這兩個印象深刻的詞 易了解 因而易記這兩個印象深刻的詞 易了解 因而易記WT0820 WT0820 則無此機制 讀者需死背字母順序 則無此機制 讀者需死背字母順序 所以易忘 不易記得所以易忘 不易記得

9292

Page 93: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Pseudo code Pseudo code 結構結構1. Sequence 1. Sequence 如如 : : 1.1.從 從 array[i..N-1]array[i..N-1] 中中 selectselect 出 出 minmin ,且換到,且換到它它的第一個位置的第一個位置 2.2.固定此數不再更動固定此數不再更動

只有只有 1.1.無無 2. 2. 時,不構成時,不構成 sequencesequence ,故不寫,故不寫 1.1.

2. Selection 2. Selection 如如 :: if if 第 第 j j 個數比 個數比 min min 所指的數小 所指的數小 then then 叫它叫它 min else nullmin else null end if end if 又如 又如 case .. end casecase .. end case

3. Iteration 3. Iteration 如如 :: for j fromfor j from i+1 uptoi+1 upto N-1 N-1 if if 第 第 j j 個數比 個數比 min min 所指的數小 所指的數小 thenthen 叫它叫它 min end ifmin end if end for end for 又如 又如 while .. end whilewhile .. end while

9393

Page 94: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Pseudo Code Pseudo Code 關鍵詞關鍵詞1. 2. 1. 2. ……..

if then else end ifif then else end ifcase end casecase end case

while end whilewhile end whilefor each end for from upto downto by for each end for from upto downto by

call null call null ←← ( a ( a←← 1 means “set a to 1”)1 means “set a to 1”)

//?? //?? 存疑部分存疑部分//TODO //TODO 待補充部分待補充部分 (( 有有 ?? 或或 TODOTODO 時 不可時 不可 codingcoding))

關鍵詞以外的英詞,必須是 關鍵詞以外的英詞,必須是 data (data (或或 method) namesmethod) names

9494

Page 95: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Pseudo Code (Cont.)Pseudo Code (Cont.)

Pseudo Code Pseudo Code 依據下面抽象層次 依據下面抽象層次 (abstraction (abstraction levels) levels) 逐層開發:逐層開發:

1. 1. 抽象層次最高,接近人類思考敘述方式。抽象層次最高,接近人類思考敘述方式。 2. 2. 抽象層次中等,一半程式一半人類方式。抽象層次中等,一半程式一半人類方式。 3. 3. 抽象層次最低,接近程式層次。抽象層次最低,接近程式層次。

且逐層用 且逐層用 test case test case 手工 手工 tracetrace ,,這就是 這就是 演算法設計 除錯演算法設計 除錯

9595

Page 96: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Trace to DebugTrace to Debug ( (演算法設計 除演算法設計 除錯錯 ))

Trace pseudo code Trace pseudo code 要精準 要精準 如無法如無法 trace trace 則表示則表示 pseudo code pseudo code 有有思考不週之處思考不週之處 ,, 絕不可貿然進行 絕不可貿然進行 coding, coding, 否則否則 , source code , source code 絕不會 絕不會 workwork

Trace Trace 要心平氣和,從容自信,要優雅,要心平氣和,從容自信,要優雅, 不慌亂粗糙,才能精準除錯 不慌亂粗糙,才能精準除錯 (Trace to Debug)(Trace to Debug)

source codesource code 將無任何 將無任何 BUG!BUG!

9696

Page 97: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Trace to Debug (Cont.)Trace to Debug (Cont.)認知心理學家指出認知心理學家指出 : : 要放鬆要放鬆 (relax)(relax) 、、專注專注沉沉靜,不能焦慮不安,才能心智暢通,創意湧現靜,不能焦慮不安,才能心智暢通,創意湧現(( 神經緊繃時,做不到這個的神經緊繃時,做不到這個的 ))

不妨泡杯好茶,戴耳機不妨泡杯好茶,戴耳機 ((不妨礙同事不妨礙同事 ))聽聽音樂 音樂 在此 在此 專注 專注 情境下,才能查出:情境下,才能查出: 軟體思考漏洞 軟體思考漏洞 (BUG!)(BUG!)

例子例子 :: 某生 某生 確實 確實 trace Compiler Project trace Compiler Project 虛擬碼,虛擬碼,

使 使 整個 整個 project project 程式無 程式無 BUG!BUG!

9797

Page 98: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Trace to Debug (Cont.)Trace to Debug (Cont.)

請回想請回想 : : 上次找不到鑰匙的情形上次找不到鑰匙的情形愈著急、愈找不到,氣了一整天 愈著急、愈找不到,氣了一整天 …………晚餐時,氣消了、認了、算了、晚餐時,氣消了、認了、算了、放鬆了放鬆了 突然間 突然間 - - 想到了!鑰匙就放在 想到了!鑰匙就放在 …………

放鬆而專注 放鬆而專注 (( 絕不是鬆懈絕不是鬆懈 ) )

- - 才能 才能 創意湧現 創意湧現 (Flow)(Flow)

9898

Page 99: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Trace to Debug (Cont.)Trace to Debug (Cont.)

TraceTrace 不下去時,表示在那特定點不下去時,表示在那特定點思考不清思考不清,,可即刻尋求他人協助那點可即刻尋求他人協助那點

只要問題點明確,他人可快速解答之,只要問題點明確,他人可快速解答之, 這種溝通甚為 這種溝通甚為 簡短有效簡短有效

若無 若無 pseudo codepseudo code ,他人縱然有心協助,,他人縱然有心協助, 也將陷入 也將陷入 source code source code 泥淖中泥淖中 ,, 這種溝通 這種溝通 耗時耗力、而無成效耗時耗力、而無成效

9999

Page 100: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7.7. 演算法設計 演算法設計 (Cont.)(Cont.)

寫出完整虛擬碼,然後耐心地 寫出完整虛擬碼,然後耐心地 trace to trace to debugdebug,這工作似易實難,這工作似易實難

因為因為 ::長年來工作習慣根深蒂固,要寫程式長年來工作習慣根深蒂固,要寫程式才能思考才能思考 ((趕工不放心時更是如此趕工不放心時更是如此 ));寫;寫虛虛擬碼只是應付上級要求,不習慣在該階層思擬碼只是應付上級要求,不習慣在該階層思考。也不會封裝低階考。也不會封裝低階 data data 為為高階高階 classclass,,以進行高階思考,當然無法有效做此事以進行高階思考,當然無法有效做此事

一定要深信本方法威力,才能心平氣和、心思澄靜,一定要深信本方法威力,才能心平氣和、心思澄靜,不只無錯,而且有創意、美感不只無錯,而且有創意、美感

100100

Page 101: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7.7. 演算法設計 演算法設計 (Cont.)(Cont.)

有人指出有人指出 : : 不需寫出虛擬碼 不需寫出虛擬碼 因為因為 Java code Java code 是高階語言 是高階語言 本身即具可讀性 本身即具可讀性

但是 依陳教授經驗但是 依陳教授經驗 :: 虛擬碼可提供更簡潔 更高階的了解 虛擬碼可提供更簡潔 更高階的了解 可讀性更提升 更有助日後維修 可讀性更提升 更有助日後維修

101101

Page 102: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

例子例子單元單元 : : public Entry public Entry findMin findMin (root)(root)

資料結構資料結構 : : binary search treebinary search tree

單元測試單元測試 : input 5; expected output 2: input 5; expected output 2

設計草圖設計草圖 :: 53 6

虛擬碼虛擬碼(( 演算法演算法 ):):

1.從 root 沿左邊走到底2.return 該 entry的 element

2 4

102102

Page 103: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

例子 例子 (Cont.)(Cont.)三個方法開發三個方法開發 findMin(): findMin(): 找找 a,b,ca,b,c等等 1000010000 個 個 data elements data elements 的的

最小值最小值1.1. 資料結構如用資料結構如用 arrayarray 則 則 findMin findMin 演算法為演算法為 ::

令令 minmin為為 arrayarray第一個元素 第一個元素 for each arrayfor each array 元素 元素 if if 它比它比 minmin 小 小 then then 令令 minmin為它為它 end forend for

2.2. 資料結構如用資料結構如用 heap heap 則 則 findMin findMin 演算法更簡單演算法更簡單 ::

令令 minmin為為 arrayarray第一個元素第一個元素

3.3.如無資料結構如無資料結構 ,, 則無演算法則無演算法 ::

令令 minmin為為 a if ba if b比比 minmin 小 小 then then 令令 minmin為為 bb

if cif c比比 minmin 小 小 then then 令令 minmin為為 cc

這要寫這要寫 (10000-1)(10000-1)行程式 不可思議行程式 不可思議 !!103103

Page 104: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

104104

Design Sketch for Successor in binary search tree 50 39 75 25 61 15 30 55 68 28 32 59 36

Successor of 36? 39; Successor of 50? 55

Page 105: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Design SketchDesign Sketch rootroot

subTree1 subTree2subTree1 subTree2

The successor of Root is the smallest The successor of Root is the smallest of sub-tree 2 (go left to the end)of sub-tree 2 (go left to the end)

Root is the successor of the largest Root is the successor of the largest of sub-tree 1 (go right to the end)of sub-tree 1 (go right to the end)

105105

Page 106: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

106106

Pseudo codePseudo code protected Entry<E> protected Entry<E> successorsuccessor (Entry<E> e) (Entry<E> e)

1. 1. ifif (e == (e == nullnull) ) return nullreturn null;;

else if e else if e 有 有 right child, right child, 像 像 5050 右下走一步 再右下走一步 再往往左下方走到底左下方走到底

elseelse e e 沒有 沒有 right child, right child, 像 像 3636 往往左上方走到底 再右上走一步左上方走到底 再右上走一步 2. return 2. return 找到的 找到的 entry entry end end successor()successor()

Page 107: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7. 7. 演算法設計 演算法設計 (Cont.)(Cont.) 先上網找現成演算法,常可找到,可省下不少演算先上網找現成演算法,常可找到,可省下不少演算法設計時間法設計時間

若從若從 open sourceopen source找到程式碼,那省下更多時間,找到程式碼,那省下更多時間,如自行開發程式碼,因演算法常較差執行速度慢,且如自行開發程式碼,因演算法常較差執行速度慢,且程式行數較多開發速度慢程式行數較多開發速度慢

因因 open source open source 通常他人用過,有通常他人用過,有 bugbug 會有人報會有人報告或訂正,通常告或訂正,通常不用做單元測試;但必要時,可把不用做單元測試;但必要時,可把reused open sourcereused open source當當 unitunit ,做 ,做 test codetest code

英文要英文要 OKOK ,才能讀清楚,才能讀清楚 open sourceopen source 的標頭的標頭 ((當當然有些寫不好然有些寫不好 )) ,正確呼叫使用,並與全球同好討,正確呼叫使用,並與全球同好討論論

107107

Page 108: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

7. 7. 演算法設計 演算法設計 (Cont.)(Cont.)

一般人從大一起就直接寫程式 跳過演算法一般人從大一起就直接寫程式 跳過演算法設計 這已是根深蒂固的惡習 要改正設計 這已是根深蒂固的惡習 要改正

注意注意 :: 並非整個系統的演算法都設計好了 才寫程並非整個系統的演算法都設計好了 才寫程式 否則又陷入傳統 式 否則又陷入傳統 waterfall waterfall 模式模式了了

108108

Page 109: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Class Interface & Class Interface & Data StrucureData Strucure

class Adjacencyclass Adjacency

protected HashMap protected HashMap

<Houses, LinkedList<NeighborDistances>> adjacencyMap;<Houses, LinkedList<NeighborDistances>> adjacencyMap;

void showAllAdjacencies (Houses theHouse)void showAllAdjacencies (Houses theHouse)

void showNames (HouseList houseList)void showNames (HouseList houseList)

end Adjacencyend Adjacency

109109

Page 110: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

演算法設計例子演算法設計例子/*-------------------------------------------------------------------------------/*-------------------------------------------------------------------------------

** showAllAdjacencies showAllAdjacencies 顯示所有與 顯示所有與 theHousetheHouse 相鄰 相鄰 (( 不見得有路不見得有路 ) ) 的人名的人名

** * * @param theHouse @param theHouse 某個人住的 某個人住的 househouse

* Time estimate: O(n* Time estimate: O(n22))

* * 例例 : : 若若 theHousetheHouse 為小莉為小莉 ,, 相鄰的是 小華 阿偉相鄰的是 小華 阿偉 (( 有路有路 ) ) 小明小明 (( 沒沒有路有路 ))

--------------------------------------------------------------------------------*/--------------------------------------------------------------------------------*/

public void showAllAdjacencies (Houses theHouse)public void showAllAdjacencies (Houses theHouse)

1. 1. 找從 找從 theHouse theHouse 可到的 可到的 toHousesList toHousesList 如小華 阿偉 如小華 阿偉 O(n)O(n)

2.2. 顯示 顯示 toHousesList toHousesList showNames(toHousesList) showNames(toHousesList)

3. 3. 找可到 找可到 theHouse theHouse 的 的 fromHousesList fromHousesList 例 小明 例 小明 O(nO(n22))

4. 4. 顯示 顯示 fromHousesList fromHousesList showNames(fromHousesList) showNames(fromHousesList)

110110

Page 111: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

演算法設計例子演算法設計例子 (Cont.)(Cont.)/*--------------------------------------------------------/*--------------------------------------------------------

* * showNames showNames 顯示 顯示 houseList houseList 各人名各人名 * *

* @param houseList * @param houseList 例 例 小華 阿偉小華 阿偉 * Time estimate: O(n)* Time estimate: O(n)

--------------------------------------------------------*/--------------------------------------------------------*/

private void showNames (HouseList houseList)private void showNames (HouseList houseList)

for i fromfor i from 0 upto houseList0 upto houseList 的元素個數的元素個數 -1-1

顯示 顯示 houseList houseList 第第 i i 個元素所含的人名個元素所含的人名end forend for

111111

Page 112: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

8.8. 補上程式碼 補上程式碼 (Coding)(Coding)

將虛擬碼改成註解 將虛擬碼改成註解 (( 加加 /* /* 及 及 **/)/) 虛擬碼逐行補上對應之程式碼 虛擬碼逐行補上對應之程式碼 儘量使程式碼隱蔽,不干擾虛擬碼之閱讀儘量使程式碼隱蔽,不干擾虛擬碼之閱讀(( 常見舊程式難讀、難維修,只好重寫常見舊程式難讀、難維修,只好重寫 ))

本步驟虛擬碼針對 本步驟虛擬碼針對 Java, C#,C Java, C#,C 程式,程式,若用若用 Ruby/PHP Ruby/PHP 程式本身程式本身即已易讀,即已易讀, 虛擬碼須寫得更高階虛擬碼須寫得更高階

112112

Page 113: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

補上程式碼 例子補上程式碼 例子/*--------------------------------------------------------/*--------------------------------------------------------

* * showNames showNames 顯示 顯示 houseList houseList 各人名各人名 * *

* @param houseList * @param houseList 例 例 小華 阿偉小華 阿偉 * Time estimate: O(n)* Time estimate: O(n)

--------------------------------------------------------*/--------------------------------------------------------*/

private void showNames (HouseList houseList)private void showNames (HouseList houseList)

/*for i from/*for i from 0 upto houseList 0 upto houseList 的元素個數 的元素個數 -1 -1 */*/ for(i=0, i<=length(houseList-1), i++);for(i=0, i<=length(houseList-1), i++);

/*/* 顯示 顯示 houseList houseList 第第 i i 個元素所含的人名個元素所含的人名 */*/println houseList(i).name);println houseList(i).name);

/*end for *//*end for */

注意注意 :: 要凸顯虛擬碼 隱藏程式碼 以利閱讀要凸顯虛擬碼 隱藏程式碼 以利閱讀 虛擬碼程式碼分開亦可 清晰為先虛擬碼程式碼分開亦可 清晰為先

113113

Page 114: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

9.9. 單元測試 單元測試 (Unit testing)(Unit testing)

待單元程式待單元程式 (unit, (unit, 如一個 如一個 Java Java public public

methodmethod source code) source code) 完成後,完成後, 用工具用工具 (( 如如 JUnit)JUnit) ,自動執行 ,自動執行 test test code code

測試該單元 測試該單元 (unit) (unit) 叫叫單元測試 單元測試

114114

Page 115: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

單元測試 例子單元測試 例子

115115

Page 116: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

10. 10. 逆向工程 工具逆向工程 工具利用逆向工程 工具 如 利用逆向工程 工具 如 eUMLeUML,,AgileJAgileJ需要時,可由程式碼需要時,可由程式碼 (source file(source file;不含 ;不含 reused code) reused code) 動態產生 動態產生 class diagram, sequence diagram class diagram, sequence diagram 等設計等設計

圖文件,供了解軟體全貌、決定維修那個圖文件,供了解軟體全貌、決定維修那個 classclass 及及 檢查相檢查相關關 classesclasses

((為為了解軟體全貌,了解軟體全貌, main program main program 之前也要有標頭之前也要有標頭 ::系統描系統描述、重大決策述、重大決策 ))

這有可能敏捷達成 這有可能敏捷達成 CMMI CMMI 一些 一些 process areas process areas 的 的 goalsgoals

從從 CRCCRC 工序後 即可隨時使用此工具產生設計圖 工序後 即可隨時使用此工具產生設計圖

116116

Page 117: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

10. 10. 逆向工程 工具 逆向工程 工具 (Cont.)(Cont.)

一般人常直接 一般人常直接 coding source codecoding source code

這種 這種 source code source code 輸入逆向工具輸入逆向工具後後 產生的 產生的 class diagram class diagram

亂七八糟 慘不忍睹 亂七八糟 慘不忍睹 反映出 反映出 軟體設計品質低落 的 軟體設計品質低落 的 真相真相雖另有工整的 工具畫的 class diagram但那與 但那與 source code source code 不符 造假的!不符 造假的!

117117

Page 118: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Class diagrams Class diagrams generated by toolgenerated by tool

118118

Page 119: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

Sequence diagram Sequence diagram generated by tool generated by tool

119119

Page 120: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

myAgile myAgile 經驗談經驗談陳教授研一學生試用陳教授研一學生試用 myAgile myAgile 做小軟體,做小軟體,

覺得 覺得 CRC, test code, pseudo code CRC, test code, pseudo code 很很費時,不甚敏捷費時,不甚敏捷。反之傳统直接。反之傳统直接 coding coding 快快多了多了重點重點 :: 1) CRC 1) CRC 使使 test codetest code可行,確保了可行,確保了品質品質

2) pseudo code 2) pseudo code 使使變動變動的需求帶來的重構的需求帶來的重構(refactor) (refactor) 得以敏捷地做;而在變動需求得以敏捷地做;而在變動需求下,下, CMMI CMMI 大量大量文件瞬間過時無用文件瞬間過時無用

3) 3) 民主溝通費時但品質高;獨裁快速但危險民主溝通費時但品質高;獨裁快速但危險120120

Page 121: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

myAgile myAgile 經驗談 經驗談 (Cont.)(Cont.)

有一雙人組 有一雙人組 (pair) (pair) 在一齊維修時在一齊維修時 先讀 先讀 headerheader

再讀 再讀 pseudo codepseudo code

了解後再修改 了解後再修改 Java codeJava code

這樣只花 這樣只花 15 15 分 分 若直接修改 若直接修改 Java code Java code 時時間拉長不少間拉長不少

121121

Page 122: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

myAgile myAgile 經驗談 經驗談 (Cont)(Cont) 讀者投書讀者投書 :: 一般行業精密分工一般行業精密分工 ,, 使員工專使員工專業業 ,, 引進流程引進流程 ,, 重視紀律重視紀律 ,, 以掌握品質以掌握品質 ,, 平平行作業行作業 ,, 以壓縮時程以壓縮時程 ,, 何以為敏捷而反其道何以為敏捷而反其道而行而行 ?? 要員工會寫程式要員工會寫程式 ,, 會設計會設計 ,, 會測試會測試 ,,要改他人程式要改他人程式 ,, 大家同室大家同室 ,, 同桌同桌 ,, 同電腦同電腦

陳教授回覆陳教授回覆 : : 上述行業是一般工廠式行業 上述行業是一般工廠式行業 流程固定流程固定 ,, 變化少變化少 ,, 創意少 創意少 但是但是 ,, 軟體業不是工廠軟體業不是工廠 ,, 所以是不同的所以是不同的

122122

Page 123: 跨校推動敏捷方法 促成軟體產業升級          中央大學資工系  陳振炎

最後 簡單瀏覽 最後 簡單瀏覽 Grade System ProjectGrade System Project

謝謝大家謝謝大家 !!

123123