驚濤駭浪!台灣軟體業的險境

360
1

Upload: malha

Post on 04-Jan-2016

63 views

Category:

Documents


0 download

DESCRIPTION

驚濤駭浪!台灣軟體業的險境. 台灣工廠外移,國力所繫的代工產業 危在旦夕,舉國寄望軟體業勃然興起, 但 真相是: 軟體業 乩童 * 亂舞、神壇遍佈, 導致產業不振! ** * 乩童 指軟體工程師 不做設計 ( 切割 ) ,自然無法做 單元測試 ,則工作不精準 (BUG 未除盡 ; 不易閱讀維修 ) 軟體品質不良;但他能很快做完軟體並 demo ,善男信女頂禮膜拜! ( 其主管當年也是乩童,當然不知要糾正此事 ) ** 乩童愈多、愈努力,則產生愈多垃圾 ( 指無設計、無法維修的軟體 ) ;軟體公司如神壇,當然產業就烏煙瘴氣了. 敏捷方法苗圃. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 驚濤駭浪!台灣軟體業的險境

11

Page 2: 驚濤駭浪!台灣軟體業的險境

驚濤駭浪!台灣軟體業的險境驚濤駭浪!台灣軟體業的險境 台灣工廠外移,國力所繫的代工產業台灣工廠外移,國力所繫的代工產業 危在旦夕,舉國寄望軟體業勃然興起,危在旦夕,舉國寄望軟體業勃然興起, 但但真相是:真相是:軟體業軟體業乩童乩童 ** 亂舞、神壇遍佈,亂舞、神壇遍佈, 導致產業不振!導致產業不振! ****

** 乩童乩童 指軟體工程師指軟體工程師不做設計不做設計 (( 切割切割 )) ,自然無法做,自然無法做單元測單元測試試,則工作不精準,則工作不精準 (BUG(BUG 未除盡未除盡 ;; 不易閱讀維修不易閱讀維修 )) 軟體品軟體品

質不良;但他能很快做完軟體並質不良;但他能很快做完軟體並 demodemo ,善男信女頂禮膜拜!,善男信女頂禮膜拜!(( 其主管當年也是乩童,當然不知要糾正此事其主管當年也是乩童,當然不知要糾正此事 ))

** ** 乩童愈多、愈努力,則產生愈多垃圾乩童愈多、愈努力,則產生愈多垃圾 (( 指無設計、無法指無設計、無法維修的軟體維修的軟體 )) ;軟體公司如神壇,當然產業就烏煙瘴氣了;軟體公司如神壇,當然產業就烏煙瘴氣了

22

Page 3: 驚濤駭浪!台灣軟體業的險境

33

Page 4: 驚濤駭浪!台灣軟體業的險境

敏捷方法苗圃 敏捷方法苗圃 座落於座落於 ::

www.AgileMethod.csie.ncu.edu.tw

有研討會投影片、有研討會投影片、最新最新上課教材 上課教材 、、實習教材實習教材、、國外論國外論文文、、產業體檢問卷、經驗心得,產業體檢問卷、經驗心得,

有志開創新局之士 有志開創新局之士 請鑑賞請鑑賞 !!

44

Page 5: 驚濤駭浪!台灣軟體業的險境

軟體行銷 軟體行銷 vs. vs. 軟體工程軟體工程軟體行銷軟體行銷 - - 找出利基產品、客戶,經營品牌,找出利基產品、客戶,經營品牌, 是軟體業最重要的事,是軟體業最重要的事, 老闆老闆們靈活地全球找商機 們靈活地全球找商機 - - 紅海紅海 (( 既存市場既存市場 ) ) 或藍海或藍海 (( 全新市場全新市場 )) 行行銷銷

之後,開發團隊之後,開發團隊工程師工程師們快速完成高品質產品,們快速完成高品質產品, 這是這是軟體工程軟體工程,才是本課程範圍,才是本課程範圍

有人疾呼有人疾呼 : : 應行銷某軟體,軟體業就有錢賺應行銷某軟體,軟體業就有錢賺 - - 混淆議題了!須深沈反省 混淆議題了!須深沈反省 工程缺失工程缺失

55

Page 6: 驚濤駭浪!台灣軟體業的險境

教材結構教材結構p. 7 p. 7 觀念 觀念 泛泛談 軟體觀念 談 軟體觀念 p.10 p.10 文化文化 ,, p.18 p.18 溝通溝通 ,, p.202p.202 思考思考

p.218 p.218 方法方法 擴充 極限開發法 擴充 極限開發法 (( 極致工藝極致工藝法法 ))

(eXtreme Programming, XP)(eXtreme Programming, XP)

而得的十一道工序而得的十一道工序 ,, 叫 叫 myAgilemyAgile

p.310 p.310 範例範例 myAgile myAgile 的 的 Java Java 開發例子開發例子p.345 p.345 附錄 附錄 安裝安裝 C#C# 單元測試工具單元測試工具

66

Page 7: 驚濤駭浪!台灣軟體業的險境

觀念觀念77

Page 8: 驚濤駭浪!台灣軟體業的險境

資訊 與資訊 與 軟體軟體 資訊資訊 (information)(information) 是真實世界中,是真實世界中, 物件物件 (object) (object) 與物件之間的關係與物件之間的關係(relationship)(relationship) 的一種抽象概念的一種抽象概念(abstraction)(abstraction) ,而這些概念可由,而這些概念可由人腦人腦認認知及處理 知及處理 (( 注意注意 :: 資訊不是電子的 資訊不是電子的 0,10,1))

電腦軟體 電腦軟體 (computer software) (computer software) 是一種特別的資訊 是一種特別的資訊 (information)(information) ,用,用來描述電腦系統設計與實作的解決方案,生來描述電腦系統設計與實作的解決方案,生產產電腦軟體的產業就叫電腦軟體的產業就叫軟體業軟體業

軟體軟體 (software) (software) 是否僅限電腦軟是否僅限電腦軟體?體?

NO! NO! 小說、畫作、舞台劇等,亦是軟體小說、畫作、舞台劇等,亦是軟體88

Page 9: 驚濤駭浪!台灣軟體業的險境

創新 創新 軟體工程 軟體工程 方法方法本課程以創新方法,提升軟體業工程實力本課程以創新方法,提升軟體業工程實力

強調 強調 綿密的綿密的團隊溝通團隊溝通 (( 組織組織心理學心理學 *)*)

及及專注的專注的個人思考個人思考 ** (** (認知心理學認知心理學 *)*) 並採並採新的 新的 測試帶動法 測試帶動法 (( 測試驅動開發測試驅動開發 )) (Test-driven development,TDD)(Test-driven development,TDD)* * 軟體與心理學軟體與心理學 (( 如 如 cognitive informatics)cognitive informatics) 數學 數學 (( 如 如 modal logic) modal logic) 相相關關** ** 個人思考是陳教授針對國情而補充的,國外文獻無此個人思考是陳教授針對國情而補充的,國外文獻無此

99

Page 10: 驚濤駭浪!台灣軟體業的險境

軟體業 文化最重要軟體業 文化最重要法國研究者 法國研究者 Bossavit * Bossavit * 指出指出 :: 文化文化 藏於內心無重量藏於內心無重量至輕至輕,卻影響至深,,卻影響至深,所以是軟體業無法承受的輕所以是軟體業無法承受的輕

例子例子 :: –鄉間深夜遇紅燈停車–鄉間深夜遇紅燈停車 乃乃是發自內心的是發自內心的文化文化 (( 紀律紀律 )) 確實等候確實等候才才可可永永保行車安全保行車安全

反之 若自以為聰明 反之 若自以為聰明 取巧通過 取巧通過 看到警察才看到警察才紅紅燈停車燈停車 某次可能因沒停車而釀成車禍 造成 某次可能因沒停車而釀成車禍 造成無法承受的傷害無法承受的傷害

* * Bossavit,The Unbearable Bossavit,The Unbearable LightnessLightness of of Programming ,available at: www.cutter.comProgramming ,available at: www.cutter.com

1010

Page 11: 驚濤駭浪!台灣軟體業的險境

軟體業 文化最重要 軟體業 文化最重要 (Cont.)(Cont.)

Bossavit Bossavit 指出某軟體公司的文化是指出某軟體公司的文化是 ::

熱熱 情 情 (passion) (passion)

大膽 大膽 (daring) (daring)

華麗 華麗 (glamour) (glamour) 這不是好這不是好的文化的文化

因因熱熱情情 ,, 大膽 並不等同 大膽 並不等同 勇氣 勇氣 (courage)(courage)

軟體外表軟體外表 華麗 也不等同 華麗 也不等同 程式品質程式品質

如抽象層次 模組程度 等 如抽象層次 模組程度 等1111

Page 12: 驚濤駭浪!台灣軟體業的險境

奠定新的軟體業文化奠定新的軟體業文化台灣房子蓋好後常漏水 台灣房子蓋好後常漏水 -- -- 需 需 ””抓漏抓漏” ” 要請技術很好的師傅,用獨門要請技術很好的師傅,用獨門””撇步撇步”” 修理漏水,一修再修,住戶很不方便修理漏水,一修再修,住戶很不方便為什麼不在當初,就把漏水為什麼不在當初,就把漏水測試測試做好做好 ? ? 營造業長年營造業長年缺乏紀律使然缺乏紀律使然 ! ! 工人訓練不佳工人訓練不佳 ,, 工頭監工不嚴工頭監工不嚴

軟體業亦然,軟體業亦然,不良不良工作文化 工作文化 (( 粗糙粗糙 ,, 不細膩精準不細膩精準 )) ,,造成軟體 造成軟體 ””常漏水常漏水””,用戶很不方便,用戶很不方便為什麼:不在 為什麼:不在 當初 當初 就建立正確工作文化,就建立正確工作文化, 以 以 測試來帶動開發 測試來帶動開發 呢呢 ? ? 文化文化紮根愈早愈好,中學即應進行,紮根愈早愈好,中學即應進行,大一已遲了大一已遲了

1212

Page 13: 驚濤駭浪!台灣軟體業的險境

奠定新的軟體業文化 奠定新的軟體業文化 (Cont.)(Cont.)

陳教授遇過三級木工工班陳教授遇過三級木工工班 ::

AA 級級 :IKEA:IKEA 工班 有零件工序的圖示文件工班 有零件工序的圖示文件 ,, 技術技術熟練熟練 ,, 會不斷檢查品質會不斷檢查品質 ,, 並與在場客戶確認並與在場客戶確認BB 級級 :: 本土年輕工班 技術熟練本土年輕工班 技術熟練 ,, 但無文件但無文件CC 級級 :: 本土年老工班 拼命認真本土年老工班 拼命認真 ,, 但品質不行但品質不行 ,,且工時完全無法預估且工時完全無法預估

台灣軟體工班大多屬台灣軟體工班大多屬 CC 級級 ,, 年輕人應以敏捷工年輕人應以敏捷工法法 (( 可達可達 AA 級水準級水準 )) 來創業來創業 ,, 滿足社會需求 滿足社會需求

1313

Page 14: 驚濤駭浪!台灣軟體業的險境

文化是產業基礎 但不是產業文化是產業基礎 但不是產業 **

舉例說舉例說 : : 若故宮博物院視辦特展為文化若故宮博物院視辦特展為文化創意創意 (( 文創文創 )) 產業產業 ,, 而以高價門票的收入而以高價門票的收入為產業產值為產業產值 ,, 則這是膚淺短視而不對的 則這是膚淺短視而不對的

相反的相反的 ,, 故宮應低價或免費供民眾觀賞精故宮應低價或免費供民眾觀賞精品品 ,, 以提升人民文化水準以提升人民文化水準 ,, 日後人民才可日後人民才可蘊育出高產值的文創產業 蘊育出高產值的文創產業

* * 漢寶德漢寶德 ,”,” 當心,文化與產業兩失!當心,文化與產業兩失!””中國時報中國時報 , 2009.11.29, 2009.11.29..

1414

Page 15: 驚濤駭浪!台灣軟體業的險境

軟工是軟體業基礎 但不是產業軟工是軟體業基礎 但不是產業軟體工程軟體工程 (( 軟工軟工 )) 是任何軟體業都需的工作文是任何軟體業都需的工作文化化 ,, 是軟體業基礎是軟體業基礎 ,, 但軟工本身不是產業但軟工本身不是產業

國內資訊教育要加強此點國內資訊教育要加強此點

例子例子 : : 電信軟體是電信領域的軟體業的產電信軟體是電信領域的軟體業的產品品 ,, 當某開發團隊做某電信軟體專案時當某開發團隊做某電信軟體專案時 ,, 該該團隊的工作方式團隊的工作方式 ,, 特別是溝通方式特別是溝通方式 ,, 就是該就是該專案的軟工專案的軟工

1515

Page 16: 驚濤駭浪!台灣軟體業的險境

Agile Agile 文化文化 軟體業需 快捷週密 軟體業需 快捷週密 (agile) (agile) 的文化的文化 ::

1)1) 綿密綿密的團隊的團隊溝通溝通

團隊成員隨時隨地面對面快速溝通,團隊成員隨時隨地面對面快速溝通, 如如 :: 架構設計會議架構設計會議

2) 2) 專注專注的個人的個人思考思考 各成員個人思考每分每秒要專注週密, 各成員個人思考每分每秒要專注週密, 如如 :: 演算法演算法設計設計

1616

Page 17: 驚濤駭浪!台灣軟體業的險境

1) 1) 綿密的團隊溝通綿密的團隊溝通 敏捷方法的重點敏捷方法的重點 ::

透過開發團隊成員透過開發團隊成員綿密綿密的的溝通,溝通, 使開發團隊能因應 使開發團隊能因應 變動變動 (being able to support change)(being able to support change)

這對任何成員都有效,不限資深成員,資深而這對任何成員都有效,不限資深成員,資深而抗拒敏捷方法的反而是最大阻礙抗拒敏捷方法的反而是最大阻礙

下面先談各種溝通管道,找出最佳的管道,下面先談各種溝通管道,找出最佳的管道, 依此設計 依此設計 軟體公司佈置 軟體公司佈置 及及測試帶動的開發方法測試帶動的開發方法

1717

Page 18: 驚濤駭浪!台灣軟體業的險境

Communication Channels Communication Channels 溝通管溝通管道道

A. Cockburn, A. Cockburn, Agile Software Development, p.95,Agile Software Development, p.95,Addison-Wesley, Addison-Wesley, 2002.2002.

1818

Page 19: 驚濤駭浪!台灣軟體業的險境

Communication Channels Communication Channels 溝通管道溝通管道 (Cont.)(Cont.)

上圖上方上圖上方細線有三點細線有三點表示三種表示三種可提問可提問(Question-and-Answer)(Question-and-Answer) 溝通管道溝通管道 ::

1.1. 二人傳 二人傳 E-mailE-mail 2.2. 二人通電話二人通電話 3.3. 二人白板二人白板前前面對面溝通面對面溝通 (( 效果最佳效果最佳 ))下方粗線下方粗線也有三點,但 也有三點,但 不可提問不可提問 (No Question-Answer)(No Question-Answer)::1.1. 書面文件書面文件 (( 效果最差效果最差 )) 2.2. 錄音帶 錄音帶 3.3. 錄錄影帶影帶

1919

Page 20: 驚濤駭浪!台灣軟體業的險境

人際溝通的人際溝通的感感覺豐富覺豐富度度 (( 感度感度 ))

從面對面溝通從面對面溝通 (( 具備十一種具備十一種感覺感覺,如視覺、聽覺、信任感,如視覺、聽覺、信任感 )) 刪減 實質接近感度後 例如 視訊連線 刪減 實質接近感度後 例如 視訊連線 (video link)(video link) 刪減刪減 視覺感度後 例如 電話 視覺感度後 例如 電話 刪減刪減 聲音感度後 例如 聲音感度後 例如 e-maile-mail 刪減刪減 提問感度後 例如 手寫字條提問感度後 例如 手寫字條 刪減刪減 所有感度後 就是所有感度後 就是 :: 書面文件 書面文件 (paper or document)(paper or document) Document communicationDocument communication 文件文件溝通 溝通 效果最差 效果最差 ((傳統軟工用傳統軟工用的方的方式式 ))

Face to face communicationFace to face communication 面對面溝通 面對面溝通 效果最佳 效果最佳 (( 本課程本課程用用的方式的方式 ))

2020

Page 21: 驚濤駭浪!台灣軟體業的險境

2121

Document Communication

Face to Face Communication

軟體工程的大進步

Page 22: 驚濤駭浪!台灣軟體業的險境

Document CommunicationDocument Communication

真相是真相是 : : 有有軟體公司寫很多文件軟體公司寫很多文件 (( 甚至有不通順甚至有不通順英文文件英文文件 ,,無人無人看懂看懂 )-)- 但但乏乏人閱讀人閱讀 ,,且讀後是且讀後是否了解否了解 ,,達成溝通達成溝通效果效果 --存疑!存疑!

應設計 應設計 command file command file 用於電子檔文件 用於電子檔文件自動統計自動統計 : 1): 1) 文件閱讀時間 文件閱讀時間 2)2) 讀者了解程度 等 讀者了解程度 等

當然 完整文件可用於新手訓練 當然 完整文件可用於新手訓練但,典型而簡單的一個專案文件就夠了但,典型而簡單的一個專案文件就夠了

2222

Page 23: 驚濤駭浪!台灣軟體業的險境

Document Communication Document Communication (Cont.)(Cont.)

例子例子 :: 台灣某知名軟體公司高層得意的說台灣某知名軟體公司高層得意的說 ::其員工素質高其員工素質高 ,, 所以皆寫英文文件所以皆寫英文文件 .. 但但是是 ,, 這些英文文件的這些英文文件的溝通力溝通力 (( 有無讀者有無讀者 ??若有若有 ,, 是否易讀是否易讀 ,, 是否能精準了解是否能精準了解 )) 頗令頗令人存疑人存疑 ,, 更不用說更不用說維修力維修力 (( 是否易於修改是否易於修改延伸延伸 )) 了了 .. 甚至連最基本的甚至連最基本的精準度精準度可能都可能都成問題成問題 .. 這些文件恐淪為乩童做秀道具這些文件恐淪為乩童做秀道具 ! !

陳教授因而倡導陳教授因而倡導英詞中句的文件英詞中句的文件 (( 詳後詳後敘敘 ))

2323

Page 24: 驚濤駭浪!台灣軟體業的險境

何以敏捷方法叫敏捷何以敏捷方法叫敏捷 ??

因 因 face to face communication face to face communication 遠比 遠比 document communication (document communication ( 如如CMMI*) CMMI*) 快速精準 故稱之快速精準 故稱之敏捷 敏捷 (agile)(agile)

若用乩童式開發方法 不做設計切割 單元若用乩童式開發方法 不做設計切割 單元測試 這樣固然可測試 這樣固然可快速 快速 demo demo 軟體 但常有軟體 但常有bugs bugs 品質很差 這不是敏捷品質很差 這不是敏捷

* * Capability maturity model integrated (CMMI) Capability maturity model integrated (CMMI) 是美國 是美國 Carnegie Mellon University (CMU) Carnegie Mellon University (CMU) 評鑑軟體公司能力的分評鑑軟體公司能力的分級制度級制度

2424

Page 25: 驚濤駭浪!台灣軟體業的險境

知道 知道 溝通管道 溝通管道 (communication channel) (communication channel) 後後 談一下 談一下 溝通目的 溝通目的 (communication purpose)(communication purpose)

2525

Page 26: 驚濤駭浪!台灣軟體業的險境

溝通目的溝通目的 依 依 A. Cockburn,A. Cockburn, 溝通具有三個目的溝通具有三個目的 ::

1) inform (1) inform ( 告知告知 )) 告知對方不知想告知對方不知想法法

2) remind (2) remind ( 提示提示 )) 提示對方已知想提示對方已知想法法

3) inspire (3) inspire ( 激發激發 )) 激發彼此不知想激發彼此不知想法法

2626

Page 27: 驚濤駭浪!台灣軟體業的險境

溝通的三個例子溝通的三個例子 1) 1) 寫小說寫小說

作家常年得各方 作家常年得各方 inspire inspire 溝通溝通 :: 累積想法累積想法作家會記下小扎或拍照作家會記下小扎或拍照 (( 聽說九把刀隨身帶相聽說九把刀隨身帶相機機 ) remind ) remind 自己想法自己想法

某夜作家文思泉湧振筆疾書某夜作家文思泉湧振筆疾書 (( 軟體創作軟體創作 )) 書成書成 !!

小說送出版商小說送出版商 :: inform inform 出版商小說內容出版商小說內容出版商校稿出版商校稿 : : inform inform 作家錯字筆誤 作家錯字筆誤

2727

Page 28: 驚濤駭浪!台灣軟體業的險境

溝通的三個例子 溝通的三個例子 (Cont.)(Cont.)

2) 2) 攀岩攀岩 這是這是 CockburnCockburn喜歡舉的例子 喜歡舉的例子 攀岩要有體能條件攀岩要有體能條件 ,, 技術訓練技術訓練 ,, 各式裝備等不各式裝備等不是每個人皆可勝任 是每個人皆可勝任 同理同理 -- 不是每個人皆可勝任軟體工程師不是每個人皆可勝任軟體工程師攀岩時不可單飛攀岩時不可單飛 (( 類似類似 pair programming)pair programming) 要等同伴的安全信號要等同伴的安全信號 ,, 才可向上攀才可向上攀 ,, 否則粉身否則粉身碎骨碎骨 ,, 這需生死與共高度信任感及精準溝通這需生死與共高度信任感及精準溝通

2828

Page 29: 驚濤駭浪!台灣軟體業的險境

溝通的三個例子 溝通的三個例子 (Cont.)(Cont.)

3) 3) 編排舞台劇編排舞台劇 編劇寫出劇本編劇寫出劇本 (( 是書面文件是書面文件 ) )

導演閱讀後導演閱讀後 ,, 深受感動深受感動 ,, 思潮澎湃思潮澎湃 (inform & inspire (inform & inspire 溝通溝通 ) )

經無數次與音樂 佈景 演員 開會及彩排 經無數次與音樂 佈景 演員 開會及彩排 (( 是面對面溝通是面對面溝通 ,, 其中不乏拍桌咆哮的溝通其中不乏拍桌咆哮的溝通 ))

整個流程中整個流程中 ,, 電話 電話 EmailEmail不斷 不斷 (remind (remind 溝通溝通 ))

終於終於 ,, 舞台劇推出舞台劇推出 ,, 撼動觀眾人心撼動觀眾人心 !(!(軟體成功軟體成功 ))

2929

Page 30: 驚濤駭浪!台灣軟體業的險境

溝通目的 影響文件溝通目的 影響文件依溝通目的的不同依溝通目的的不同 ,, 文件須做調整文件須做調整讀者經驗豐富讀者經驗豐富 :: 是是 remindremind溝通溝通 ,, 文件要精簡文件要精簡讀者經驗不足讀者經驗不足 :: 是是 informinform溝通溝通 ,, 文件要詳細文件要詳細因此因此 ,, 為適應多種讀者為適應多種讀者 ,, 文件應有精簡版 文件應有精簡版 並用 並用 hyperlink hyperlink 閱讀詳細版閱讀詳細版

又又 ,video,video文件比 文字文件 易溝通文件比 文字文件 易溝通 ,, 也比 動也比 動畫文件 製作快畫文件 製作快 ,, 而手機就可拍而手機就可拍 videovideo 了了

3030

Page 31: 驚濤駭浪!台灣軟體業的險境

CMMI and CMMI and 敏捷方法敏捷方法

CMMI Level 2 (project management) CMMI Level 2 (project management)

有助有助敏捷方法敏捷方法 須須實現實現之之CMMI Levels 3,4,5 (engineering CMMI Levels 3,4,5 (engineering and process management) and process management) 則與 則與 敏敏

捷方法 捷方法 觀點不同觀點不同 * * 不應進行之不應進行之

* Sison and Yang, Use of Agile Methods and Practices * Sison and Yang, Use of Agile Methods and Practices in the Philippines, Asian Pacific Software Eng. in the Philippines, Asian Pacific Software Eng. Conf. (APSEC), Nagoya, Japan, 2007.Conf. (APSEC), Nagoya, Japan, 2007.

3131

Page 32: 驚濤駭浪!台灣軟體業的險境

CMMI and CMMI and 敏捷方法 敏捷方法 (Cont.)(Cont.)

有有 CMMI level 5 CMMI level 5 公司指出公司指出 *: *: 可保有 可保有 CMMI levels 2 & 3 CMMI levels 2 & 3 的 的 goal and goal and practice, practice, 但用 但用 agile agile implementation of the practices. implementation of the practices. 例例如如 : : 用用 check list check list 以面對面溝通來 以面對面溝通來 validate goals,validate goals, 使文件減量使文件減量 ,, 這是可行這是可行的的 . .

* Jacobsen et. al., Mature Agile with a Twist of CMMI, * Jacobsen et. al., Mature Agile with a Twist of CMMI,

Agile 2008. Agile 2008. 本苗圃本苗圃””論文選讀論文選讀””有收錄本文有收錄本文3232

Page 33: 驚濤駭浪!台灣軟體業的險境

CMMI and CMMI and 敏捷方法 敏捷方法 (Cont.)(Cont.) XP 2010 XP 2010 業界最佳報告 業界最佳報告 (Best (Best Experience Report*)Experience Report*)中中 ,, 一家 一家 Norway Norway 軟體公司指出軟體公司指出 : :

敏捷方法要轉為以文件 敏捷方法要轉為以文件 (work item) (work item) 工工作流 作流 (work flow) (work flow) 為主為主 ;; 而非以 而非以 time-time-boxed iteration (boxed iteration (以時程框架的回合以時程框架的回合 )) 及及各人工作為主各人工作為主 . . 這是這是 CMMICMMI與與敏捷方法敏捷方法的磨的磨合合 :: 鐘擺略為擺回鐘擺略為擺回 CMMICMMI了了 ,, 巧合的是巧合的是 :: 陳教授陳教授myAgile myAgile 倡導增設計草圖倡導增設計草圖 ,, 虛擬碼兩文件虛擬碼兩文件

* J.O.Birkeland,“Moving to Flow-based* J.O.Birkeland,“Moving to Flow-based Software Software Development, XP 2010, Norway.Development, XP 2010, Norway.

3333

Page 34: 驚濤駭浪!台灣軟體業的險境

敏捷方法 減少文件敏捷方法 減少文件 傳統軟工傳統軟工 CMMICMMI採工廠思維:視軟體工程師為採工廠思維:視軟體工程師為

被動被動的工人,故訂出很多考核評量辦法的工人,故訂出很多考核評量辦法 台灣學生從小應付考試,很被動的台灣學生從小應付考試,很被動的 相反的,敏捷方法則:提升為相反的,敏捷方法則:提升為主動主動負責的人負責的人(( 改造的生命 改造的生命 changed human life)changed human life) ,,

所以辦法所以辦法 ((及相及相關關文件文件 ))就消失了就消失了 例子例子 :: 如要考核 如要考核 pair programmingpair programming,則,則 工程師每天要寫報告,秘書每週做報表,經工程師每天要寫報告,秘書每週做報表,經理每週審閱報表理每週審閱報表

3434

Page 35: 驚濤駭浪!台灣軟體業的險境

敏捷方法 減少文件 敏捷方法 減少文件 (Cont.)(Cont.)

CMMI CMMI 與 極限開發法 與 極限開發法 (Extreme (Extreme Programming, XP) Programming, XP) 可謂連續光譜兩端可謂連續光譜兩端點的極端 而光譜中間是二者相混合的 點的極端 而光譜中間是二者相混合的

隨著人員隨著人員面對面溝通能力面對面溝通能力逐漸提升 文件活逐漸提升 文件活化簡化了 文件量逐漸減少化簡化了 文件量逐漸減少 (( 決非強制消去決非強制消去文件文件 )) 專案逐漸由一端 專案逐漸由一端 CMMI CMMI 轉為另一轉為另一端 端 XP XP 這中間的任何點都算是敏捷方法這中間的任何點都算是敏捷方法

3535

Page 36: 驚濤駭浪!台灣軟體業的險境

敏捷方法 減少文件 敏捷方法 減少文件 (Cont.)(Cont.)

這兒有一點要深思這兒有一點要深思 ::

如果大家只在同一房間不斷溝通 如果大家只在同一房間不斷溝通 但各人內心無深入思考 但各人內心無深入思考 則仍不可能產出優良產品的則仍不可能產出優良產品的

3636

Page 37: 驚濤駭浪!台灣軟體業的險境

Agile Method vs. Agile ProcessAgile Method vs. Agile Process

Method Method 指的是軟工使用的符號指的是軟工使用的符號 如 如 Object-oriented (O-O) Object-oriented (O-O) Method Method

Process Process 則是執行 則是執行 method method 的方式的方式 如 面對面方式 如 面對面方式所以,嚴格說 所以,嚴格說 Agile Process* Agile Process* 才對 才對

但大家習慣稱 但大家習慣稱 Agile MethodAgile Method 本教材也依此本教材也依此* * 歐洲知名的 歐洲知名的 XP 200X conference XP 200X conference 就叫 就叫 Agile Processes in Agile Processes in

Software Engineering and eXtreme Programming.Software Engineering and eXtreme Programming.

3737

Page 38: 驚濤駭浪!台灣軟體業的險境

先進軟體公司 的五個敏捷點先進軟體公司 的五個敏捷點愈接近這五點,團隊溝通愈愈接近這五點,團隊溝通愈敏捷敏捷 ::

1.1. 開發者同處一室 開發者同處一室 (( 可面對面溝通可面對面溝通 )) ((一室最多十人一室最多十人 ))2.2. 有駐點使用專家 有駐點使用專家 (( 口頭溝通需求口頭溝通需求 ))3.3. 一個月交貨一次 一個月交貨一次 (( 以產品與用戶溝以產品與用戶溝通通 ))

4.4. 全自動的迴歸測試全自動的迴歸測試 (( 一有變動全面重一有變動全面重測測 ))

5.5. 有經驗的開發者 有經驗的開發者 (( 人的素質最重要人的素質最重要 ))3838

Page 39: 驚濤駭浪!台灣軟體業的險境

滲透式溝通 滲透式溝通 (Osmotic Communication)(Osmotic Communication)

同處一室 同處一室 耳可聽耳可聽 (ear contact)(ear contact) 、目可視、目可視(eye contact)(eye contact) ,週遭資訊會潛意識地滲透,週遭資訊會潛意識地滲透到人腦,達成溝通,其溝通效果旣深層又自然到人腦,達成溝通,其溝通效果旣深層又自然!!

例子:例子:小張老李討論某設計時,反覆提到某些詞彙;小小張老李討論某設計時,反覆提到某些詞彙;小林雖埋首工作,竟不知不覺林雖埋首工作,竟不知不覺””學會學會”了”了。數週後,小林。數週後,小林與他人討論時,脫口而出與他人討論時,脫口而出這些這些詞彙!詞彙!

反之反之 ,, 惡質滲透惡質滲透溝通溝通 ((如客服中心對話如客服中心對話 ))需設牆壁阻絕需設牆壁阻絕

3939

Page 40: 驚濤駭浪!台灣軟體業的險境

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

caves

common

4040

whiteboard

Page 41: 驚濤駭浪!台灣軟體業的險境

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

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

programming) programming)

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

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

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

4141

Page 42: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

4242

Page 43: 驚濤駭浪!台灣軟體業的險境

觀察、改善現場觀察、改善現場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.勿自欺,久而久之,自豪感消失,倦怠挫折勿自欺,久而久之,自豪感消失,倦怠挫折……戰將折翼戰將折翼 !!!!

4343

Page 44: 驚濤駭浪!台灣軟體業的險境

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

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

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

4444

Page 45: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

每天快樂工作每天快樂工作 ,, 每晚安然沉睡每晚安然沉睡 ,, 不知不覺中精不知不覺中精品呈現了品呈現了 !!

4545

Page 46: 驚濤駭浪!台灣軟體業的險境

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

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

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

4646

Page 47: 驚濤駭浪!台灣軟體業的險境

IKEA Office IKEA Office [IKEA [IKEA 新莊店 新莊店 2012.1.11]2012.1.11]

下面是下面是 1010 坪 坪 5 5 人團隊工作室 陳設於人團隊工作室 陳設於IKEAIKEA

照片照片 1: leader 1: leader 辦公處辦公處照片照片 2: 2: 小餐桌 小餐桌 (( 下午茶用下午茶用 ))

照片照片 3: 4 3: 4 人辦公處人辦公處

4747

Page 48: 驚濤駭浪!台灣軟體業的險境

4848

Page 49: 驚濤駭浪!台灣軟體業的險境

4949

Page 50: 驚濤駭浪!台灣軟體業的險境

5050

Page 51: 驚濤駭浪!台灣軟體業的險境

Cost DownCost Down

Cost Down Cost Down 是工廠思維下的迷思是工廠思維下的迷思 ,, 工廠作業工廠作業合理化合理化 ,, 杜絕混亂浪費杜絕混亂浪費 ,, 當然對當然對 ,, 但是但是……

有教授半開玩笑的說有教授半開玩笑的說 :: 某電子廠不斷在研究如某電子廠不斷在研究如何抽掉省掉某零件而系統仍可運轉何抽掉省掉某零件而系統仍可運轉

不斷這樣做不斷這樣做 ,, 則工廠不斷則工廠不斷 cost down,cost down,績效優績效優良但產品品質不斷下降良但產品品質不斷下降 ,, 使用期限縮短使用期限縮短 ,, 故障故障率不斷提高率不斷提高 ,, 很快變垃圾很快變垃圾 ,, 造成生態負擔造成生態負擔 **

* Paul Hawken, * Paul Hawken, 中譯中譯 :: 商業生態學商業生態學 , , 新自然主義新自然主義 , 2005. , 2005.

5151

Page 52: 驚濤駭浪!台灣軟體業的險境

軟體公司 佈置軟體公司 佈置 **

軟體開發是密集合作的活動軟體開發是密集合作的活動 ,, 開放空間開放空間 (( 叫叫team room)team room) 可鼓勵團隊談話及互動可鼓勵團隊談話及互動 ,, 增進增進非正式及深度的溝通非正式及深度的溝通 ;; 有自然光可使人舒暢有自然光可使人舒暢

每人空間約每人空間約 4.54.5平方公尺平方公尺 (1.36(1.36坪坪 ))

有人擔心這帶來噪音有人擔心這帶來噪音 ,, 但同團隊的談話多半是但同團隊的談話多半是與專案相關的與專案相關的 ;; 倒是不同團隊之間要隔間倒是不同團隊之間要隔間 ((最好用活動隔間牆最好用活動隔間牆 ,, 可彈性變動之可彈性變動之 ))

* Martin Fowler web site, posted June 14, 2010.* Martin Fowler web site, posted June 14, 2010.

5252

Page 53: 驚濤駭浪!台灣軟體業的險境

軟體公司 佈置 軟體公司 佈置 (Cont.)(Cont.)團隊有全權支配空間團隊有全權支配空間 ,, 小秘訣小秘訣 ::

1)1)勿用需工人搬動的傢俱勿用需工人搬動的傢俱 ,, 用簡單桌子即可用簡單桌子即可2)2) 電源線電源線 ,, 網路線走底下或頭上網路線走底下或頭上 ,, 易接到桌子易接到桌子3)3)椅子勿節省椅子勿節省 !! 有人因背痛要跪姿椅或升降桌有人因背痛要跪姿椅或升降桌 ,,去買去買 !!

4)4)白板要很多白板要很多 ,, 含輪子白板含輪子白板 ,, 相機白板相機白板 ,, 動態顯動態顯示板示板 (( 連接投影機連接投影機 ,, 如顯示如顯示 buildbuild狀況狀況 ))

5)5)見下圖 見下圖 Central Desk Central Desk 有 有 eye contacteye contact

U-Pod U-Pod 則有 則有 ear contact ear contact 且易看別組螢幕且易看別組螢幕

5353

Page 54: 驚濤駭浪!台灣軟體業的險境

軟體公司 佈置 軟體公司 佈置 (Cont.)(Cont.)

5454

Page 55: 驚濤駭浪!台灣軟體業的險境

軟體公司 佈置 軟體公司 佈置 (Cont.)(Cont.)

白板又叫 白板又叫 information radiator (information radiator ( 資資訊發射器訊發射器 ) ) 因為它會不自覺地將資訊射至因為它會不自覺地將資訊射至週遭的人的眼球週遭的人的眼球 ,, 極為有效極為有效 !!

一種有名的白板叫 一種有名的白板叫 kanban (kanban ( 看板看板 ),), 它源它源自豐田汽車著名的剛好及時 自豐田汽車著名的剛好及時 (just in (just in time) time) 生產模式生產模式 -- 因各生產人員可同時因各生產人員可同時看到看板資訊看到看板資訊 ,, 可剛好及時取得中間製品可剛好及時取得中間製品 ,,故無中間製品庫存故無中間製品庫存

5555

Page 56: 驚濤駭浪!台灣軟體業的險境

下面介紹最新的 下面介紹最新的 kanban (kanban ( 看板看板 )) 觀念觀念 ,, 主主要取材自 要取材自 XP 2010 in NorwayXP 2010 in Norway

看板源自 看板源自 Toyata Toyata 生產線上顯示各站現況的生產線上顯示各站現況的

白板白板 , , 它可使各人知道其他人動態而機動它可使各人知道其他人動態而機動調整調整 , , 進而達到全線最高效率進而達到全線最高效率

5656

Page 57: 驚濤駭浪!台灣軟體業的險境

A call for craftsmanship A call for craftsmanship **

當壓力變大,當壓力變大, developers developers 會會做較少測試做較少測試

此導致更多錯誤,帶來更大壓力此導致更多錯誤,帶來更大壓力,接著做更少測試,如此生出更,接著做更少測試,如此生出更多 多 bugs… bugs… 這樣的惡性循環這樣的惡性循環

It’s time to SLOW down!It’s time to SLOW down!

5757

* Ketil Jensen, Improving software quality with Kanban, XP 2010.* http://ketiljensen.wordpress.com/2010/08/19/improving-the-quality-of-software-with-kanban-and-xp-practices/

Page 58: 驚濤駭浪!台灣軟體業的險境

Slow down to go FAST – limit work in progressSlow down to go FAST – limit work in progress

在工作中自然發現問在工作中自然發現問題,並試著去解決題,並試著去解決

限制同時處理的工作限制同時處理的工作數量,而減少在工作數量,而減少在工作間轉換的負擔間轉換的負擔

鬆弛緊張的神經,讓鬆弛緊張的神經,讓團隊成員能平穩踏實團隊成員能平穩踏實的工作的工作

kanbankanban 能平均分散流能平均分散流程各個工序的負擔程各個工序的負擔

5858

流程最大產出才是真正目標,並非讓人員隨時處於 最大產出才是真正目標,並非讓人員隨時處於 100% 100% 勞累狀態勞累狀態

Page 59: 驚濤駭浪!台灣軟體業的險境

Why introduce kanban?*Why introduce kanban?*

• Kanban Kanban 改善 改善 transparencytransparency 及 及 cooperationcooperation --- which are key values in --- which are key values in agile method.agile method.

• 公司在意的不是 公司在意的不是 individual results, individual results,

而是 而是 team results!team results!

• 同時做多件事時分散注意力,每多一事生產力便同時做多件事時分散注意力,每多一事生產力便降低 降低 15%15%。同時做五事時,便不具生產力了。同時做五事時,便不具生產力了

* Olav Maassen & Jasper Sonnevelt, Kanban at an Insurance * Olav Maassen & Jasper Sonnevelt, Kanban at an Insurance Company Are You Sure?, XP 2010.Company Are You Sure?, XP 2010.

5959

Page 60: 驚濤駭浪!台灣軟體業的險境

Experiences and Experiences and recommendations about recommendations about introducing kanbanintroducing kanban

• 團隊 團隊 leader leader 可了解可了解 what, why, what, why, how how the team is doing, the team is doing, 能隨時並能隨時並持續改善任何事情,呈現舒適的工作環境持續改善任何事情,呈現舒適的工作環境

• Kanban Kanban 對使用 對使用 waterfall waterfall 或或 scrum scrum 的團隊都適應良好,很快就看見 的團隊都適應良好,很快就看見 transparency transparency 提升的成果提升的成果

• It is all about It is all about COMMUNICATIONS!COMMUNICATIONS! --- --- 主動並定期地與客戶溝通,幫助他們了解我們為主動並定期地與客戶溝通,幫助他們了解我們為

他們工作的狀況(否則客戶可能經常催促工作進度、增加他們工作的狀況(否則客戶可能經常催促工作進度、增加需優先處理的工作等)需優先處理的工作等)

6060

Page 61: 驚濤駭浪!台灣軟體業的險境

From Chaos to Kanban, From Chaos to Kanban, via Scrum*via Scrum*

Agile 開發方式,可有效改善軟體開發過程,從一團混亂(陷入不斷 debug 的漩渦)到功能符合客戶需求的最小功能集,不做多餘開發,更能將客戶需求功能的品質,不斷檢視,達到高品質的軟體。

Kanban 能有效將團隊注意力集中,讓整個開發團隊掌握全局,並清楚明白, 目前做到哪裡,現在需要做甚麼,哪些是需要立即開發,並能檢視各個 unit 是否能達到讓客戶與內部團隊接受的品質,有效的品管所生產的軟體。

以下實例說明結合 agile method 與 kanban 對於開發流程與品質的改善:

• Paul Paul ShannShannon, on, Kevin Kevin RutherRutherford, ford, Craig Craig Judson Judson and and Neil Neil Kidd,Kidd, XP2010 - From Chaos to Kanban, via Scrum,availa,available at: ble at: http://xp2010.org/

Page 62: 驚濤駭浪!台灣軟體業的險境

From Chaos to Kanban, From Chaos to Kanban, via Scrumvia Scrum

• Kanban 2

• Kanban 3

• Kanban 4

Not Started In Development Done

Not In Done Internal Customer Live Started Development acceptance acceptance

Not Started In Development Done Customer acceptance

Page 63: 驚濤駭浪!台灣軟體業的險境

軟體軟體設計原則設計原則 傳統軟工依傳統工程設計原則傳統軟工依傳統工程設計原則 * * 力求以 力求以

最少資源產出最大價值之產品 最少資源產出最大價值之產品 但大部分軟但大部分軟體不易維修 很多在短期內成昂貴廢棄物體不易維修 很多在短期內成昂貴廢棄物

新思維應是生態設計原則新思維應是生態設計原則 ** ** 使軟體易演使軟體易演化化 (evolve) (evolve) 生生不息 無廢棄垃圾生生不息 無廢棄垃圾 ******

* * 合理的設計原則合理的設計原則 , , 漢寶德譯漢寶德譯 ,, 1972, The Discipline of 1972, The Discipline of Design, by Roe,Soulis,and Handa.Design, by Roe,Soulis,and Handa.

** ** 從搖籃到搖籃從搖籃到搖籃 , , 野人出版野人出版 , 2008, Cradle to Cradle, by , 2008, Cradle to Cradle, by McDonough and Braungart.McDonough and Braungart.

*** 2009*** 2009 哥本哈根氣候變遷大會後哥本哈根氣候變遷大會後 ,, 節能減碳成主流節能減碳成主流 ,2010,2010 世博可世博可見此見此 ,, 而軟體業是免能源的而軟體業是免能源的 !!

6363

Page 64: 驚濤駭浪!台灣軟體業的險境

軟體軟體設計原則 設計原則 (Cont.)(Cont.)

環境保護與人體保護環境保護與人體保護 (( 中醫中醫 )) 是異曲同工的是異曲同工的 : :

最大限度利用與激發物件最大限度利用與激發物件 (( 環境或環境或 人體內人體內 )) 的自我循環與調節系統的自我循環與調節系統 ;;

最小限度介入與破壞這自足的系統最小限度介入與破壞這自足的系統 **

著重人與自然著重人與自然 ,, 社會社會 ,, 自身的互動關係及循環自身的互動關係及循環體系體系 ,, 即天人合一即天人合一 . . 軟體開發也要依此軟體開發也要依此””道道

非重外在規範非重外在規範 ,, 而重團隊互動來演化軟體而重團隊互動來演化軟體* * 蕭宏慈蕭宏慈 ,, 醫行天下醫行天下 (( 上上 ),),橡實文化橡實文化 ,2010,pp.163-164,2010,pp.163-164..

6464

Page 65: 驚濤駭浪!台灣軟體業的險境

6565

軟體設計追求的品質軟體設計追求的品質

Creativity Creativity 創意性創意性 Usability Usability 易用性易用性 Dependability Dependability 可靠性可靠性 Maintainability Maintainability 易修性易修性 Efficiency Efficiency 效率性效率性

•以上只有「效率性」與電腦有關,以上只有「效率性」與電腦有關,•其餘皆與電腦無關,而與開發者人腦有關其餘皆與電腦無關,而與開發者人腦有關 ;;•易用性涉及大量使用者的人腦,最為複雜易用性涉及大量使用者的人腦,最為複雜

Page 66: 驚濤駭浪!台灣軟體業的險境

軟體設計中 創意性最重要軟體設計中 創意性最重要 創意人要創意人要激情與放縱激情與放縱來發展創意構想來發展創意構想 ,,

又要有又要有嚴格紀律嚴格紀律來執行創意構想來執行創意構想 **

創意來自開發過程所下的苦工創意來自開發過程所下的苦工 : :

1) 1) 用功 用功 - - 奠定踏實知識基礎奠定踏實知識基礎 2) 2) 勇氣 勇氣 - - 挑戰現有知識挑戰現有知識 才能才能感動客戶感動客戶 ,, 要專注要專注 (concentration)(concentration)及決心 及決心 (determination),(determination), 絕非輕鬆的絕非輕鬆的 ,,速食式的速食式的

* * 賴聲川賴聲川 ,, 賴聲川的創意學賴聲川的創意學 , , 天下雜誌天下雜誌 , 2006., 2006.

6666

Page 67: 驚濤駭浪!台灣軟體業的險境

軟體設計中的紀律軟體設計中的紀律 以表演藝術為例以表演藝術為例 ,, 加拿大太陽劇團加拿大太陽劇團 ,, 台灣台灣雲門舞集雲門舞集 ,, 都有令人崇敬的專業度 都有令人崇敬的專業度 - - 這這來自團隊紀律與對細節的要求來自團隊紀律與對細節的要求 .. 所有看似自所有看似自然卻精準的呈現然卻精準的呈現 ,, 乃出自平日嚴謹的排練乃出自平日嚴謹的排練 ,,並將之內化為身心狀態和生活態度並將之內化為身心狀態和生活態度 . . 這是這是勞力密集產業勞力密集產業 ,, 講究專業分工和標準作業流講究專業分工和標準作業流程程 ,, 幕前幕後人員須各司其職幕前幕後人員須各司其職 ,, 以達最好以達最好演出品質演出品質 * * 這紀律正是軟體設計所需這紀律正是軟體設計所需

* * 朱宗慶朱宗慶 , , 紀律是藝術工作者的基本功紀律是藝術工作者的基本功 , , 中國時報中國時報 , 2010.12.24., 2010.12.24.

6767

Page 68: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??台灣學生從小獨自做作業,禁與同學討論,台灣學生從小獨自做作業,禁與同學討論,故故群育群育不彰,不善清晰精準溝通不彰,不善清晰精準溝通 (( 口頭及文字口頭及文字 )) 、集思、集思廣益;美育也無,無美感、時尚感,難成就精品廣益;美育也無,無美感、時尚感,難成就精品

例子例子 : : 巴黎街頭人人衣著搭色和諧巴黎街頭人人衣著搭色和諧 , , 有色感!有色感!

例子例子 :: 廣達林百里幼年住香港中環,廣達林百里幼年住香港中環, 培養了美培養了美感感

例子例子 : : 自從蘋果痛擊台灣筆電後 竹科廠商找了美學自從蘋果痛擊台灣筆電後 竹科廠商找了美學大師蔣勳演講 這是補習式的 沒有用的 是否再設個大師蔣勳演講 這是補習式的 沒有用的 是否再設個美學學分及證照美學學分及證照 ??

6868

Page 69: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??

台灣智育重視填鴨應付考試台灣智育重視填鴨應付考試 ,, 以分數定高下,以分數定高下,考試中不做思考、只是快速作答;因此,考試中不做思考、只是快速作答;因此,沒有平心靜氣仔細思考的習慣,不重內在沒有平心靜氣仔細思考的習慣,不重內在修鍊修鍊 ,, 故做不出精品故做不出精品

例子例子 :: 90 90分鐘考分鐘考 3030題,每題若題,每題若 33分鐘解不分鐘解不出,放棄!出,放棄!

軟體開發本是團隊合作的工作方式及生活方軟體開發本是團隊合作的工作方式及生活方式,人才首重 式,人才首重 群育 群育 ;;尤其是尤其是 -- 忌招忌招乩童 乩童

6969

Page 70: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??(Cont.)(Cont.)

在此網路推平世界、全球競爭的時代,台灣學生國在此網路推平世界、全球競爭的時代,台灣學生國際觀不足際觀不足 ,, 眼界見識低,未與世界接軌眼界見識低,未與世界接軌 ,, 例如例如 :1):1)大學生怕英文教科書,依靠陳舊而質差的中文翻譯大學生怕英文教科書,依靠陳舊而質差的中文翻譯本本 (( 其原文版更舊了其原文版更舊了 )) ;; 2)2) 研究生無力上網吸收研究生無力上網吸收最新英文論文最新英文論文 ..卻自卻自傲傲以為以為 ::憑憑拼命拼命苦幹苦幹及臨機應及臨機應變變 ,, 耍小心眼耍小心眼 小聰明 小聰明 (( 誤以為是創意誤以為是創意 ),),就就可做好可做好工作工作,大錯特錯,大錯特錯 !!

而且而且 ,, 英文乃國際語言英文乃國際語言 ,, 英文不好則疏於了解吸收英文不好則疏於了解吸收其他文化其他文化 ,, 可能造成台灣人信心可能造成台灣人信心 ,, 活力及創造力的活力及創造力的流失流失 .. 幸好台灣學生會華語幸好台灣學生會華語 (( 世界最大市場的語世界最大市場的語言言 ))

7070

Page 71: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??(Cont.)(Cont.)

例子例子 : :

某研究生自己承認上研究所後某研究生自己承認上研究所後 ,, 較少接觸較少接觸英文了英文了 ,, 何以致之何以致之 ? ? 因無英文課了因無英文課了

可見他學英文是為了應付考試可見他學英文是為了應付考試 ,, 取得學取得學分分 ;; 而非利用英文吸收新知而非利用英文吸收新知

例子例子 ::

某研究生視英文為亂碼某研究生視英文為亂碼 ,, 聽英語如雜訊聽英語如雜訊 ,,這造成自我封鎖這造成自我封鎖 ,, 成井底之蛙成井底之蛙

7171

Page 72: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??(Cont.)(Cont.)

例子例子 : : 台灣學生英文不佳 無法精準決定程台灣學生英文不佳 無法精準決定程式變數英文名稱 使程式可讀性不佳 影響式變數英文名稱 使程式可讀性不佳 影響維修品質 寫可用的英詞中句文件都不容易維修品質 寫可用的英詞中句文件都不容易了 寫英文文件更是遙不可及了 寫英文文件更是遙不可及

所以所以 英文比數學重要 英文比數學重要 (( 台灣學生修不少台灣學生修不少數學課 但對軟體業的幫助似乎不大數學課 但對軟體業的幫助似乎不大 ))

例子例子 : : 印度成軟體強國 與印度精英精通英文 印度成軟體強國 與印度精英精通英文 恐怕有點關係吧恐怕有點關係吧

7272

Page 73: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??(Cont.)(Cont.)

例子例子 : : 有資訊系畢業生在履歷表上註明寫過有資訊系畢業生在履歷表上註明寫過多少行程式 這表示多少行程式 這表示 :: 1) 1) 該生以此為傲 該生以此為傲 可能其他人不太會寫程式 可能其他人不太會寫程式 2) 2) 公司想招募公司想招募此種人才此種人才

但真相是但真相是 :: 該生可能不會上網找該生可能不會上網找 open open source source 合適的程式來 合適的程式來 reusereuse 也不會也不會設計設計 (( 切割切割 )) 做單元測試 做單元測試

而那些多少行程式其實 而那些多少行程式其實 - - 只是昂貴的垃圾只是昂貴的垃圾

7373

Page 74: 驚濤駭浪!台灣軟體業的險境

軟體公司招募什麼人才軟體公司招募什麼人才 ??(Cont.)(Cont.)

Microsoft Microsoft 全球資深副總裁張亞勤說全球資深副總裁張亞勤說 *:*:

不能招募 不能招募 1) 1) 雙面人 多面人雙面人 多面人 2) 2) 負面心態 老是批評負面心態 老是批評 ,, 澆冷水的澆冷水的 3) 3) 玩世不恭 什麼都不在乎的玩世不恭 什麼都不在乎的

大器而努力的人大器而努力的人 , , 才有可能做好軟體才有可能做好軟體

* * 商業週刊商業週刊 , 2010.11.8, p. 30., 2010.11.8, p. 30.

7474

Page 75: 驚濤駭浪!台灣軟體業的險境

開發團隊 公民意識 開發團隊 公民意識 ((群育群育 ))依 依 A. Cockburn A. Cockburn 所見,有下面五點公民意識:所見,有下面五點公民意識:1. 1. 準時與會 準時與會 Getting to meeting on timeGetting to meeting on time2. 2. 回答問題 回答問題 Answering questions from other peopleAnswering questions from other people

3. 3. 看到事情要主動講 看到事情要主動講 Bothering to mention things they Bothering to mention things they noticenotice

4. 4. 遵守程式規定 遵守程式規定 Following group coding conventionsFollowing group coding conventions5. 5. 用程式庫用程式庫 Using code librariesUsing code libraries

注意注意 :: 無擅長交友,順從他人等,要勇於表達自我, 無擅長交友,順從他人等,要勇於表達自我, 包容異見,服装自由包容異見,服装自由,特立獨行,特立獨行

例子例子 :: 聯發科需要在兩人擇一時,不用絕頂聰明的人,而用聯發科需要在兩人擇一時,不用絕頂聰明的人,而用可跟別人合作的人 可跟別人合作的人 [[ 中國時報中國時報 , 2009.9.20], 2009.9.20]

7575

Page 76: 驚濤駭浪!台灣軟體業的險境

群育的極致群育的極致 Cockburn Cockburn 累積多年顧問經驗,發現軟累積多年顧問經驗,發現軟體開發困難很多,失敗的專案比比皆是,體開發困難很多,失敗的專案比比皆是,

而成功的軟體開發有一特色而成功的軟體開發有一特色 :: 就是在極度就是在極度困難時,總有意想不到的團隊成員挺身而困難時,總有意想不到的團隊成員挺身而出,以意想不到的方法克服困難,因此解出,以意想不到的方法克服困難,因此解救了團隊,這應該就是群育的極致表現吧救了團隊,這應該就是群育的極致表現吧 !!

7676

Page 77: 驚濤駭浪!台灣軟體業的險境

兩個弔詭問題兩個弔詭問題1.1. 某電腦雜誌問某電腦雜誌問 :: 台灣資訊教育不錯,台灣資訊教育不錯,何以無蓬勃軟體業何以無蓬勃軟體業 ? *? *

2.2. 某教授提出某教授提出 :: 台灣硬體業很強,何台灣硬體業很強,何不發展搭配硬體的軟體不發展搭配硬體的軟體 (( 嵌入式系統 嵌入式系統 embedded systems)?embedded systems)?

* * 有人怪罪政府有人怪罪政府支持不力,或本國市場太小等因素支持不力,或本國市場太小等因素

7777

Page 78: 驚濤駭浪!台灣軟體業的險境

解答一解答一台灣資訊教育不錯,何以無蓬勃軟體業台灣資訊教育不錯,何以無蓬勃軟體業 ??陳教授答陳教授答 :: 因大部分開發團隊因大部分開發團隊溝通溝通不良,不良, 大部分開發者大部分開發者思考思考不密,所以不密,所以工程工程困難多,困難多, 另外還有行銷另外還有行銷 ((市場市場 )) 困難 困難 - - 落後而不自知!落後而不自知!真相真相 : : 資工資工 ** 畢業生辛苦地工作 畢業生辛苦地工作 ((常加班常加班 )) 資管資管 ****畢業生辛苦地畢業生辛苦地找找工作工作 ((大多找不到大多找不到 ))** 資工資工不重視軟工不重視軟工,,用蠻力做軟體用蠻力做軟體;;**** 資管著重一般企業管理中軟體之應用,含領域知識,但資管著重一般企業管理中軟體之應用,含領域知識,但

不是軟體公司的管理,故不是軟體公司的管理,故無軟工無軟工呼籲呼籲 : : 資訊系大一皆修敏捷方法資訊系大一皆修敏捷方法 (( 含於計概含於計概 ) ) 資工偏重 資工偏重 Java,C#,C Java,C#,C 開發開發 資管偏重 資管偏重 DB/Ruby/PHP DB/Ruby/PHP 開發 打造就業力! 開發 打造就業力!

7878

Page 79: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

20082008金融海嘯後金融海嘯後 ,, 韓國中國大器大膽改革韓國中國大器大膽改革 ,, 復復甦快速甦快速 ,, 一線廠商具世界競爭力一線廠商具世界競爭力 ;; 台灣以往個台灣以往個人電腦的成功人電腦的成功 ,, 造成造成””成功為失敗之母成功為失敗之母””

台灣資訊科系若大膽改革台灣資訊科系若大膽改革 :: 計概教敏捷方法計概教敏捷方法 ,Java (O-O, open source) ,Java (O-O, open source)

從新計概出發從新計概出發 ,, 也許軟體業也許軟體業八年後有競爭力八年後有競爭力 (( 大學四年大學四年 ,, 碩士兩年碩士兩年 ,, 上班兩年升主管上班兩年升主管 ))

但舊思維阻擋但舊思維阻擋 ,, 不知幾年後才能開始不知幾年後才能開始 ??

7979

Page 80: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

有資深工程師說有資深工程師說 ::

台灣工程師能寫出任何程式,言下頗自台灣工程師能寫出任何程式,言下頗自滿滿 !!

陳教授答陳教授答 :: 優質軟體的重點在優質軟體的重點在溝通溝通 ::

如釐清需求,設計質感,易學易用易重用 如釐清需求,設計質感,易學易用易重用 回應快速,而不只是程式本身如何寫 回應快速,而不只是程式本身如何寫

8080

Page 81: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

中國也有類似問題 中國也有類似問題 * * 指出在中國推廣敏捷方法有兩指出在中國推廣敏捷方法有兩個困難個困難 :: 1)1) 閉口合約使專案範圍進度成本無彈性 閉口合約使專案範圍進度成本無彈性 2) 2) 程序員素質不佳 正規大學出來的 程序員素質不佳 正規大學出來的 OOP OOP 不強 不強 則 則 test-driven development, test-driven development, refactoringrefactoring 做不好 則幾乎不可能做 做不好 則幾乎不可能做 collective code ownership collective code ownership 及及 short short iteration iteration

沒 沒 short iteration short iteration 也就沒有敏捷了 也就沒有敏捷了 中國學校的計算機人才教育已成為 不僅是敏捷方法中國學校的計算機人才教育已成為 不僅是敏捷方法的推廣 也是中國軟件行業發展 的制約因素的推廣 也是中國軟件行業發展 的制約因素

* * http://www.iteye.com/topic/19270http://www.iteye.com/topic/192708181

Page 82: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)某研究生說某研究生說 : : 校計中某團隊校計中某團隊 codingcoding 很強很強 ,,用用 API (application program API (application program interface) interface) 也很強也很強 ,, 言下很佩服言下很佩服 !!

陳教授答陳教授答 : : 軟體團隊強在優秀溝通能力軟體團隊強在優秀溝通能力 ::

精準寫出 精準寫出 scenarios, acceptance scenarios, acceptance test cases; test cases; 做做 CRCCRC 反覆推敲設計反覆推敲設計 ; ; 週密而自動化的 週密而自動化的 unit test casesunit test cases 等等 ; ; 還有還有 ,, 由溝通而激發的創意由溝通而激發的創意 ,, 士氣及相互士氣及相互學習增強功力學習增強功力 .. 國人觀念落後國人觀念落後 ,, 可嘆可嘆 !!

8282

Page 83: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

在二十屆台灣物件導向在二十屆台灣物件導向 (O-O)(O-O) 研討會研討會 ** panel panel discussion discussion 中中 ,, 有人問軟體重用 有人問軟體重用 (reuse) (reuse) 效果如何效果如何 ?? 在場有業界人士指出在場有業界人士指出 :: 縱使同領域軟縱使同領域軟體體 ,, 重用效果也不佳重用效果也不佳

陳教授答陳教授答 : O-O : O-O 動作要精準確實 且鎖定同領域 動作要精準確實 且鎖定同領域 ,, 則重用效果數年逐漸浮現則重用效果數年逐漸浮現 ;; 若推動若推動 O-OO-O二十年二十年而無重用效果而無重用效果 ,, 則是則是設計不確實 所致設計不確實 所致 ,O-O,O-O 落實落實與內化了多少與內化了多少 ?? 答案很負面答案很負面 !!

* * 2020thth Object-Oriented Technology and Application (OOTA), Object-Oriented Technology and Application (OOTA), Tai-Chung, Taiwan, Nov. 2009.Tai-Chung, Taiwan, Nov. 2009.

8383

Page 84: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

承上述承上述 , , 若某軟體公司長期鎖定某領域若某軟體公司長期鎖定某領域 ,,

而且而且””真的真的””做 做 O-O,O-O,

則公司長期諸多專案累積的 則公司長期諸多專案累積的 scenarios scenarios 必有重覆之處必有重覆之處 , , 而由這些 而由這些 scenarios scenarios 開發所得的相關的 開發所得的相關的 classes classes 即為公司的即為公司的可重用 可重用 (reusable) classes (reusable) classes

8484

Page 85: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

進入雲端運算進入雲端運算 (cloud computing)(cloud computing) 時代時代後後 ,, 資料儲存資料儲存 ,, 程式執行程式執行 ,, 都從本機移到都從本機移到遠方的一片雲遠方的一片雲 ,, 本機退化成 本機退化成 user user interface device,interface device, 手機即可勝任手機即可勝任 ,, 不不再需要功能強大的個人電腦 再需要功能強大的個人電腦 (personal (personal computer, PC)computer, PC)

反之反之 ,, 需要雲裡的 需要雲裡的 server server 及網路軟體及網路軟體技術技術 ,, 這剛好暴露台灣資工系軟體教學缺這剛好暴露台灣資工系軟體教學缺失失 ,, 下面舉兩個教學例子說明之下面舉兩個教學例子說明之

8585

Page 86: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

資料結構資料結構 (data structure)(data structure) 是資工系核心是資工系核心課程課程 .. 程式設計中程式設計中 ,, 架構設計切割出架構設計切割出 class class interfaceinterface後後 ,, 各各 classclass 要先做資料結構設要先做資料結構設計然後計然後 ,class,class 中各中各 methodmethod 才做演算法設才做演算法設計計 ,, 此時可用 此時可用 Big O Big O 評估 評估 method Worst method Worst time, Average time,time, Average time,以便早期告知客戶以便早期告知客戶

資料結構設計不良的徵候是資料結構設計不良的徵候是 :: 只用基本資料結只用基本資料結構 構 array,array, 導至演算法不簡潔精緻導至演算法不簡潔精緻 ,, 軟體品質軟體品質差矣差矣 ! !

8686

Page 87: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.) 資工系教學中資工系教學中 ,, 編譯器 編譯器 (Compiler)(Compiler)是重要而基是重要而基礎的軟體工具礎的軟體工具 ,, 更是程式設計的絕佳教材更是程式設計的絕佳教材 :: 模組清模組清晰晰 ,, 大小適宜大小適宜 .. 以陳教授經驗以陳教授經驗 ,, 可實作完下列各模可實作完下列各模組組 :: scanner, parser, intermediate scanner, parser, intermediate code generator, assembly code code generator, assembly code generator.(optimizergenerator.(optimizer 可另開課可另開課 ))

但很多系所只教 但很多系所只教 scanner, parser scanner, parser 理論理論 ,, 編編譯器教學危矣譯器教學危矣 !! 而軟體教學中而軟體教學中 ,Operating ,Operating System, Data Base System System, Data Base System 比 比 CompilerCompiler更複雜更複雜 ,, 實作更難教實作更難教 ,, 軟體教學危矣軟體教學危矣 !!

8787

Page 88: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

陳教授在上述兩門課 皆設計 陳教授在上述兩門課 皆設計 Labs Labs 讓讓學生用敏捷方法工序開發精簡文件及程式 學生用敏捷方法工序開發精簡文件及程式

讓資工系基礎課程變成活生生軟體業界存讓資工系基礎課程變成活生生軟體業界存活可用的養分活可用的養分 !!

文件細節請參閱本苗圃 文件細節請參閱本苗圃 ““其他課程其他課程””

8888

Page 89: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

陳教授認為資訊系陳教授認為資訊系 (( 資工及資管資工及資管 )) 低年級低年級 ((大一大二大一大二 )) 應著重上述基礎軟體教學應著重上述基礎軟體教學

這樣這樣 ,, 基礎紮實了基礎紮實了 ,, 高年級高年級 (( 大三大四大三大四 )) 及及研究所研究所 (( 碩一碩二碩一碩二 )) 尖端課程才有可能落尖端課程才有可能落實於軟體業實於軟體業 ,, 醞釀出優質產品醞釀出優質產品

8989

Page 90: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

MIT CSAI Lab MIT CSAI Lab 主任 主任 Victor Victor 舒 舒 * * 指出指出 ::

雲端來了雲端來了 ! ! 台灣硬體代工台灣硬體代工 (( 甚至電機甚至電機 )) 思維要改思維要改變為變為 :: 以軟體為中心的思維以軟體為中心的思維 -- 系統化的軟體開發應系統化的軟體開發應用用 (( 陳教授認為這就是上述軟體教學缺失之處陳教授認為這就是上述軟體教學缺失之處 ),), 要要重視 重視 operating system, security, operating system, security, compiler compiler 等等 ,, 否則十年內產業消失 否則十年內產業消失

2010 2010 廣達佈局中國雲端五城市試點廣達佈局中國雲端五城市試點 ** ** 令人振奮令人振奮 * * 遠見遠見 , 2010.7., 2010.7.

** ** 今週刊今週刊 , 2010.11.1., 2010.11.1.

9090

Page 91: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

中研院院長翁啟惠坦言中研院院長翁啟惠坦言 *:*:

台灣學術界要自我反省 是否有培養對社會有台灣學術界要自我反省 是否有培養對社會有貢獻的人 貢獻的人

台灣產業界則要技術升級 不要滿足於量產代台灣產業界則要技術升級 不要滿足於量產代工賺取微利工賺取微利

這對資訊軟體業也是真心話這對資訊軟體業也是真心話

* * 中國時報 中國時報 2011.10.252011.10.25

9191

Page 92: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.)

廣達林百里痛批台大電機系不創新 廣達林百里痛批台大電機系不創新 相反的 哈佛 史丹佛 重視數位人文教育 才相反的 哈佛 史丹佛 重視數位人文教育 才能培養出創造 能培養出創造 faceBook faceBook 及 及 GoogleGoogle 的的學生 台灣學生不會創新 只能代工學生 台灣學生不會創新 只能代工

代工廠微利 代工廠微利 4% 4% 而蘋果因創新而獲厚利四成而蘋果因創新而獲厚利四成 賈伯斯更是人性工程師 而不只是硬體或軟體賈伯斯更是人性工程師 而不只是硬體或軟體工程師 老賈應不會說只碰硬體不碰軟體 工程師 老賈應不會說只碰硬體不碰軟體

* * 中國時報 聯合報 中國時報 聯合報 2011.10.262011.10.269292

Page 93: 驚濤駭浪!台灣軟體業的險境

解答一 解答一 (Cont.)(Cont.) 鴻海郭台銘已宣告電子代工盛世結束鴻海郭台銘已宣告電子代工盛世結束 (( 成長率減半成長率減半 ),),目前目前

投資泡麵勝過筆電投資泡麵勝過筆電 ;; 以淨利率而言以淨利率而言 ,, 傳統產業傳統產業 15%,15%, 而電子而電子業只有業只有 2.8% *2.8% *

台灣小筆電軟體很少台灣小筆電軟體很少 ,, 不好用不好用 ;; 反觀蘋果的反觀蘋果的 iPad iPad 有 有 App App StoreStore 好用的廣大軟體好用的廣大軟體 ;; 宏基敗給宏基敗給 App Store,App Store,顯示問題顯示問題在軟體在軟體 ,, 不要再追求硬體升級了不要再追求硬體升級了 ****

宏達電 宏達電 (htc) (htc) 反映較快反映較快 ,, 已棄微軟已棄微軟 ,, 改用改用 AndroidAndroid 開放開放平台平台 . . 股價二度上千元股價二度上千元 ,, 顯示品牌實力顯示品牌實力 ;; 詹宏志鼓勵進一步詹宏志鼓勵進一步開發手機下載軟體開發手機下載軟體 ,, 以匹敵 以匹敵 iPhone iPhone 封閉平台 封閉平台 ******

宏達電王雪紅且於宏達電王雪紅且於 20112011超越鴻海郭台銘超越鴻海郭台銘 ,, 成台灣首富成台灣首富* * 商業週刊商業週刊 , 2010.9.20., 2010.9.20.

** ** 今週刊今週刊 , 2011.4.11., 2011.4.11.

*** *** 工商時報工商時報 , 2011.2.22., 2011.2.22.

9393

Page 94: 驚濤駭浪!台灣軟體業的險境

解答二解答二 台灣硬體業很強,何不發展搭配硬體的軟體台灣硬體業很強,何不發展搭配硬體的軟體(( 嵌入式系統嵌入式系統 )?)?

陳教授答陳教授答 : : 嵌入式系統需開發組合語言碼嵌入式系統需開發組合語言碼 ** ,,

並考慮底層資源限制並考慮底層資源限制故故工作量增大,因此溝通工作量增大,因此溝通要更多,思考要更密,要更多,思考要更密,這這豈非難上加難豈非難上加難 ??

** 因因 CC 語言兼具高階及低階語言兼具高階及低階 (( 組合語言組合語言 )) 特性特性 , , 所以今天很多組合語所以今天很多組合語言碼已改以言碼已改以 CC 開發開發 , , 難度降低不少了難度降低不少了

9494

Page 95: 驚濤駭浪!台灣軟體業的險境

解答二 解答二 (Cont.)(Cont.)

某教授指出某教授指出 : O-O : O-O 程式執行速度較非程式執行速度較非 O-OO-O程式慢,言下有些遺憾程式慢,言下有些遺憾 !!

陳教授答陳教授答 : O-O : O-O 本來就是多一層包裝,使本來就是多一層包裝,使領域觀念更清晰,因而更易維修領域觀念更清晰,因而更易維修 ; ; 程式執程式執行速度慢,就是付出的小小代價行速度慢,就是付出的小小代價 ; ;

不可停留在 不可停留在 C++C++ 思維,要進至 思維,要進至 Java (O-Java (O-O)O)

9595

Page 96: 驚濤駭浪!台灣軟體業的險境

解答二 解答二 (Cont.)(Cont.)

陳教授續答陳教授續答 : :

O-O O-O 軟體的好處在於軟體的好處在於 :: 舊版軟體易於延舊版軟體易於延伸 伸 (extend) (extend) 成新版軟體 成新版軟體 (( 見下例見下例 XX延伸成延伸成 Y), Y), 藉著 藉著 polymorphic polymorphic reference (xreference (x 可指可指 XX 或其或其 subclass Ysubclass Y的的 object) object) 及 及 dynamic binding dynamic binding (whatIAm() (whatIAm() 可 可 bind bind 新或舊版的新或舊版的method),method), 使得新舊版軟體可同時使用使得新舊版軟體可同時使用 ..這樣這樣 ,, 軟體才能活得長久軟體才能活得長久

9696

Page 97: 驚濤駭浪!台灣軟體業的險境

An Example of ExtensionAn Example of Extension/*/*舊版軟體舊版軟體 */*/publicpublic classclass X { int a; X { int a;

publicpublic String whatIAm() String whatIAm()

{{returnreturn “I’m an X.”;} “I’m an X.”;}

} //end of class X} //end of class X

  /*/* 新版軟體新版軟體 */*/public classpublic class Y Y extendsextends X { int b;X { int b;

publicpublic String whatIAm() String whatIAm()

{ { returnreturn “I’m a Y.”;} “I’m a Y.”;}

} //end of class Y} //end of class Y

9797

Page 98: 驚濤駭浪!台灣軟體業的險境

9898

public static void main (String[ ] args) throws IOException{ X x; // reference “x” is declared to be of class X 

BufferedReader reader = new BufferedReader (new InputStreamReader (System.in); 

if (reader.readLine().equals (“ 我要 X”)) x = new X(); // x points to an object of class X

else (reader.readLine().equals (“ 我要 Y”)) x = new Y(); // x points to an object of class Y

 System.out.println (x.whatIAm());//dynamic binding

 } // end of main 

Page 99: 驚濤駭浪!台灣軟體業的險境

解答二 解答二 (Cont.)(Cont.)

承上述承上述 ,, 領域知識的每個觀念形成一個 領域知識的每個觀念形成一個 class class

要利用三種 要利用三種 class relationships class relationships (aggregation, use, and (aggregation, use, and inheritance)inheritance)

仔細構建各觀念之關係仔細構建各觀念之關係 ,, 才能開發出優質軟體才能開發出優質軟體

也要考慮不同程度使用者如何容易地使用也要考慮不同程度使用者如何容易地使用

執行速度當然不可太慢執行速度當然不可太慢 ,, 但這非首要考量但這非首要考量9999

Page 100: 驚濤駭浪!台灣軟體業的險境

解答二 解答二 (Cont.)(Cont.)

某教授指出某教授指出 :: 台灣硬體產業已經做得很好台灣硬體產業已經做得很好了了 ,, 接著接著 ,, 要再接再厲要再接再厲 ,, 做好軟體產業做好軟體產業

陳教授答陳教授答 :: 台灣硬體產業是工廠式代工產業台灣硬體產業是工廠式代工產業((並無發明某創新硬體架構等並無發明某創新硬體架構等 ),), 而軟體產而軟體產業是創意產業業是創意產業 ,, 二者本質不同不相關的 二者本質不同不相關的 只不過只不過 ,, 剛巧電腦軟體要在電腦硬體上執剛巧電腦軟體要在電腦硬體上執行行 ,, 使人誤以為相關而已使人誤以為相關而已 ,, 勿誤導國人勿誤導國人 !!

100100

Page 101: 驚濤駭浪!台灣軟體業的險境

解答二 解答二 (Cont.)(Cont.)某教授指出某教授指出 :: 台灣是資訊王國台灣是資訊王國 ,, 政府應採購政府應採購國產系統國產系統 ,, 而不應考慮外國系統而不應考慮外國系統

陳教授答陳教授答 :: 台灣確是資訊電子產品大國台灣確是資訊電子產品大國 (PC (PC NotebookNotebook 面板等面板等 )) 電腦大國 電腦大國

但絕非資訊系統大國但絕非資訊系統大國 ,, 更非軟體大國更非軟體大國 ,, 台灣軟體一般品質不佳 台灣軟體一般品質不佳 例子例子 : : 某研究生透過工研院計畫某研究生透過工研院計畫 ,, 看到某美看到某美國頂尖軟體公司的國頂尖軟體公司的 JavaJava 程式碼後程式碼後 ,, 慨言慨言 ::台灣差太多了台灣差太多了 !!

101101

Page 102: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思近數十年近數十年 ,, 台灣生產線橫掃全球台灣生產線橫掃全球 ,, 從雨傘到從雨傘到鴻海帝國鴻海帝國 ,,靠拼命靠拼命文化文化 ::

1) 1) 老闆拼命回應客户需求,老闆拼命回應客户需求, 2) 2) 工頭拼命工頭拼命 runrun生產線生產線 ((台積電張忠謀台積電張忠謀頗頗賞賞識識台灣工頭台灣工頭 ))

3) 3) 工人則拼命工人則拼命 ,, 但不精準 但不精準

拼命拼命文化文化長期長期硬拼硬拼 ,,傷害員工傷害員工 ,, 如緊張焦慮如緊張焦慮 ,, 高血壓高血壓 ,, 肝腎病肝腎病 ,, 癌癌症症 ,, 跳樓自殺跳樓自殺

又又破壞環境破壞環境 ,, 如如台塑六輕污染空氣水土壤台塑六輕污染空氣水土壤 ,, 全球暖化全球暖化 ,, 且利潤微薄且利潤微薄

軟體業不是生產線,倒像工藝家聯合工坊,軟體業不是生產線,倒像工藝家聯合工坊,不再需要傳統的不再需要傳統的拼命拼命,而需要深層的敏捷精準,而需要深層的敏捷精準 : :

如何思考深且密如何思考深且密 ? ? 如何溝通快而準如何溝通快而準 ??

102102

Page 103: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思台塑六輕連續大火 燒毀台塑管理神話 台塑六輕連續大火 燒毀台塑管理神話 原來 與海爭地人定勝天原來 與海爭地人定勝天 -- 今天造成海水鹽今天造成海水鹽份腐蝕管線 份腐蝕管線

原來 低廉建廠成本原來 低廉建廠成本 -- 今天發現用了低價易今天發現用了低價易腐蝕黑鐵管線 腐蝕黑鐵管線

原來 用低價原油提煉得高利潤原來 用低價原油提煉得高利潤 -- 今天發現今天發現琉化物因而多了 易腐蝕管線琉化物因而多了 易腐蝕管線 **

台灣硬拼的產業文化要檢討了台灣硬拼的產業文化要檢討了* * 商業週刊 商業週刊 12371237 期 期 2011.8.8.2011.8.8.

103103

Page 104: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.) 鴻海死對頭鴻海死對頭––中國比亞迪王傳福中國比亞迪王傳福 20092009成中國首富成中國首富 ,, 財財富富 396396億人民幣億人民幣 ** 中國已學會台灣生產線技術中國已學會台灣生產線技術 ;; 但馬但馬步不穩步不穩 ,, 其手機充電器召回其手機充電器召回 ,, 股價暴跌股價暴跌 ** ** 且吃不到且吃不到蘋果訂單蘋果訂單 *** 2010*** 2010王跌至王跌至 1212名名 ,, 飲料大王哇哈哈飲料大王哇哈哈宗慶后以人民幣宗慶后以人民幣 800800億元居首億元居首 ********

上海世博展現中國升級了上海世博展現中國升級了 ,, 富士康跳樓事件使中國的富士康跳樓事件使中國的工資大幅升級了工資大幅升級了 ,, 台商當年趾高氣昂台商當年趾高氣昂 ,, 今天黯然撤離今天黯然撤離中國中國 (( 或去開發西北或去開發西北 ),),台商不應再流浪了台商不應再流浪了 ,, 應返台應返台升級或轉型升級或轉型

* * 旺報旺報 , 2009.11.6., 2009.11.6.

** ** 今週刊今週刊 , 2009.11.30., 2009.11.30.

*** *** 非凡周刊非凡周刊 , 2010.9.5 **** , 2010.9.5 **** 聯合報聯合報 2010.9.30.2010.9.30.

104104

Page 105: 驚濤駭浪!台灣軟體業的險境

台灣文化的省思台灣文化的省思 台灣人被評價為呆胞台灣人被評價為呆胞 ,, 指的是見識不足指的是見識不足 ,, 不精準不精準 ,, 不確不確實實 ,, 看來呆呆的同胞看來呆呆的同胞 ..

台灣人一般單純熱情搏感情台灣人一般單純熱情搏感情 (( 有人情味有人情味 ),),愛錢愛錢 ,, 生活上生活上省錢省錢 ,, 工作上拼命工作上拼命 ,, 到處找撇步到處找撇步 ,, 急就章急就章““慶菜慶菜””貪小便貪小便宜宜 (( 塑化劑應運而生塑化劑應運而生 ),),因陋就簡因陋就簡 ,, 沾沾自喜沾沾自喜 ,, 自滿自自滿自大大 ;; 思維不精準思維不精準 ,, 規畫不足規畫不足 (( 無競爭力無競爭力 ););沒有大方向沒有大方向 ,,不大器不大器 ,, 不求開闊視野不求開闊視野 ,, 不提昇境界不提昇境界 ,, 不投資升級台灣不投資升級台灣

台灣人不自認呆台灣人不自認呆 ,, 不自知自省不自知自省 ,, 可悲可悲 !!

105105

Page 106: 驚濤駭浪!台灣軟體業的險境

台灣文化的省思 台灣文化的省思 (Cont.)(Cont.)士林夜市乾淨度已輸中國很多夜市士林夜市乾淨度已輸中國很多夜市 ,, 台灣業者長久台灣業者長久不升級不升級 ,, 可嘆可嘆 !! 還好還好 ,, 客人排隊情形不錯客人排隊情形不錯 (( 年輕年輕人群育有進步人群育有進步 ))

還有還有 ,, 台灣機車氾濫成災台灣機車氾濫成災 ,, 民眾只圖方便省錢民眾只圖方便省錢 ,, 有有見父母夾幼兒騎一車見父母夾幼兒騎一車 ,, 極易傷亡極易傷亡 ,, 落後國家景象落後國家景象也也 ,, 政府及民眾皆不謀求投資升級政府及民眾皆不謀求投資升級 !!

Bella Vita,Bella Vita,君品酒店君品酒店 ,, 艾美酒店等艾美酒店等 ,, 提升台灣提升台灣生活文化生活文化 ,, 猶如數年前微風廣場一樣猶如數年前微風廣場一樣 ,, 可佩可佩 !!

106106

Page 107: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

台灣面板業台灣面板業 ,, 石化業佔國家生產毛額四分之石化業佔國家生產毛額四分之一以上一以上 , , 但耗費五百萬人用水但耗費五百萬人用水 , , 產生的產生的二氧化碳需十五萬個大安森林公園來化解二氧化碳需十五萬個大安森林公園來化解

這種掠奪資源這種掠奪資源 (( 水水 ,, 空氣空氣 ,, 土地土地 )) 破壞環破壞環境的工廠已危害人民境的工廠已危害人民 * * 傳統工廠思維要拋傳統工廠思維要拋棄了棄了 ! !

20112011 福島核災更突顯環境的重要福島核災更突顯環境的重要

* * 天下雜誌天下雜誌 , 2010.8.10., 2010.8.10.

107107

Page 108: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

世界經濟論壇評比世界經濟論壇評比 :: 台灣產業聚落競爭力全球第一 台灣產業聚落競爭力全球第一 有毛豆 自行車 工具機 等十三個小鎮 以毛豆為有毛豆 自行車 工具機 等十三個小鎮 以毛豆為例 三個不認輸敢冒險的人用新品種 採機械化大例 三個不認輸敢冒險的人用新品種 採機械化大面積耕作 不靠 面積耕作 不靠 ECFA ECFA 賺世界財 這些小鎮都在賺世界財 這些小鎮都在新竹以南 都非中央政府主導的產業 卻有技術門新竹以南 都非中央政府主導的產業 卻有技術門檻有品牌 且產值持續成長 檻有品牌 且產值持續成長 **

台灣何時有軟體產業聚落台灣何時有軟體產業聚落 ?? 將靠不認輸敢冒險的人 將靠不認輸敢冒險的人 且不要靠政府且不要靠政府

* * 商業週刊商業週刊 , 2011.11.7., 2011.11.7.

108108

Page 109: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

台灣有競爭力的可能是文化創意產業 台灣有競爭力的可能是文化創意產業 例子例子 : : 周杰倫在中國演唱會及代言的產值高達周杰倫在中國演唱會及代言的產值高達一年一年 75007500萬人民幣萬人民幣 ,, 被譽為最成功的台商被譽為最成功的台商

發人深思的是發人深思的是 :: 周杰倫的母親不追求周的文周杰倫的母親不追求周的文憑學位憑學位 ,, 而是全力培植其音樂才華而是全力培植其音樂才華 ,, 終於成就終於成就產業巨人產業巨人 ,, 可譽為偉大的教育家可譽為偉大的教育家 !!

例子例子 : : 台裔服裝設計師吳季剛 台裔服裝設計師吳季剛 (Jason Wu)(Jason Wu)的母親也是偉大的教育家的母親也是偉大的教育家 !!

109109

Page 110: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.) 趨勢大師奈思比解答中國經濟成功之謎趨勢大師奈思比解答中國經濟成功之謎 * * 在於高幹由上在於高幹由上

而下制定架構而下制定架構 (( 像企業執行長像企業執行長 )) 而社會大眾則由下而上創而社會大眾則由下而上創新發展新發展 ,, 並影響上層並影響上層 ,, 上下逐漸互信上下逐漸互信 ,, 社會逐漸進步社會逐漸進步 ,,也就是也就是 :: 中國產業成功來自新的社會制度的成功中國產業成功來自新的社會制度的成功 ..

台灣社會需台灣社會需””世紀接軌世紀接軌”” **,**, 開創新現實開創新現實 !!

台灣發展遠勝中國式的台灣發展遠勝中國式的””賣腎創造賣腎創造 GDP”, GDP”, 勿庸擔心勿庸擔心 ******

* John & Doris Naisbitt, The 8 Pillars of a New * John & Doris Naisbitt, The 8 Pillars of a New Society: ChinaSociety: China’s’s Megatrends, Megatrends, 天下遠見天下遠見 ,, 中國大趨勢中國大趨勢 , , 2009.10.26. 2009.10.26.

** ** 吳祥輝吳祥輝 , , 挪威驚喜挪威驚喜 , , 遠流遠流 , 2009.5.1, pp.186-191., 2009.5.1, pp.186-191.

*** *** 吳祥輝吳祥輝 , , 陪你走中國陪你走中國 , , 遠流遠流 , 2011.2.1, pp. 112-113., 2011.2.1, pp. 112-113.110110

Page 111: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

陳教授 陳教授 2010 2010 九月遊中國西安法門寺九月遊中國西安法門寺 ,,發現其硬體建築極其浩大宏偉發現其硬體建築極其浩大宏偉 , , 遊客如織 遊客如織 (( 門票不便宜門票不便宜 ,120,120 人民幣合台幣人民幣合台幣 600600元元 ), ), 但不見僧人禪修但不見僧人禪修 , , 只見不少只見不少””假僧假僧人人””心不在焉的在場看顧心不在焉的在場看顧 ,, 軟體蕩然無存軟體蕩然無存矣矣 !!

趨勢大師奈思比可能未見及此事趨勢大師奈思比可能未見及此事

111111

Page 112: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

2010 2010 陳教授觀察陳教授觀察 : : 中國大建高速公路鐵中國大建高速公路鐵路路 ,, 青藏鐵路已完成青藏鐵路已完成 ,, 新疆高鐵將動工新疆高鐵將動工 ,,新疆最西的喀什將建經濟特區新疆最西的喀什將建經濟特區 ,, 各都市高各都市高樓林立樓林立 ,, 國力驚人國力驚人 ,, 雄心萬丈雄心萬丈 ,, 世人應正世人應正視借鏡之視借鏡之

但同時塞車頻傳但同時塞車頻傳 , , 一塞數小時一塞數小時 , , 可見其軟可見其軟體管理面尚薄弱體管理面尚薄弱

112112

Page 113: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

2010 2010 陳教授觀賞中國連續劇陳教授觀賞中國連續劇””闖關東闖關東”” ,,

描述山東家庭勇闖東北開墾的大時代故事描述山東家庭勇闖東北開墾的大時代故事 ..

其編劇其編劇 ,, 導演導演 ,, 攝影皆思維精準豐富攝影皆思維精準豐富 ,, 戲劇戲劇張力很強張力很強 ,, 勝過台劇勝過台劇 ,, 可見其軟體的思維面可見其軟體的思維面是深厚的是深厚的 ,, 只是軟體的管理面目前較薄弱而只是軟體的管理面目前較薄弱而已已

台灣人因歷史淵源及語言相通台灣人因歷史淵源及語言相通 ,, 遠比美歐日人遠比美歐日人士易於了解中國士易於了解中國

113113

Page 114: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

20112011夏 陳教授壯遊中國北疆喀納斯湖 賽里夏 陳教授壯遊中國北疆喀納斯湖 賽里木湖 馳馬那拉提 巴音布魯克 飛車穿天山木湖 馳馬那拉提 巴音布魯克 飛車穿天山

又訪漢化中的南疆喀什 親睹維漢種族緊張 又訪漢化中的南疆喀什 親睹維漢種族緊張 洽薩古城沒落 東門巴扎人潮中不見漢人洽薩古城沒落 東門巴扎人潮中不見漢人

有維吾爾族歌舞表演的知名餐廳竟然消失了 有維吾爾族歌舞表演的知名餐廳竟然消失了 原來是改建成了百貨公司大樓原來是改建成了百貨公司大樓

中國或將擴充經濟實力至中亞 重現大唐雄風中國或將擴充經濟實力至中亞 重現大唐雄風

114114

Page 115: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

台灣以經濟體名義與中國簽署經合架構協議 台灣以經濟體名義與中國簽署經合架構協議 Economic Cooperation Framework Economic Cooperation Framework Agreement (ECFA)Agreement (ECFA) 舉國議論舉國議論 ;; 但是但是 ,, 柯林頓來柯林頓來台演講指出此可帶來中國及世界的投資台演講指出此可帶來中國及世界的投資

後後 ECFAECFA 時代時代 ,, 台灣有品牌競爭力的企業台灣有品牌競爭力的企業 (( 非耗能非耗能拼命的傳統製造業台商拼命的傳統製造業台商 )) 應藉網購進入廣大中國市應藉網購進入廣大中國市場場 ,, 與全世界廠商競爭與全世界廠商競爭 ,, 求取發展機會求取發展機會

台灣軟體業能否在被殲滅前練出競爭力台灣軟體業能否在被殲滅前練出競爭力 ??

能否拋開過去能否拋開過去 ,, 脫胎換骨脫胎換骨 ,, 成就台灣製軟體精品成就台灣製軟體精品 ? ?

成敗在一念之間成敗在一念之間 !!115115

Page 116: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.) 例子例子 :: 電影海角七號震撼市場電影海角七號震撼市場 ,, 創下台幣創下台幣 4.64.6億空前產億空前產值值 ;; 這應歸功於優秀的編劇導演 演活台灣多元文化及族這應歸功於優秀的編劇導演 演活台灣多元文化及族群群 ,, 激發市場共鳴激發市場共鳴 ,, 掌握了掌握了行銷面行銷面

但是但是 ,, 因為細節處理因為細節處理 (( 如服裝考據如服裝考據 )) 不夠精準 即不夠精準 即工程面工程面不夠嚴謹 不夠嚴謹 ,, 無法獲金馬獎評審青睞 終未獲選最佳影片無法獲金馬獎評審青睞 終未獲選最佳影片

接著接著 ,, 艋舺艋舺 ,, 雞排英雄也創佳績雞排英雄也創佳績 ,, 賽德克巴萊製作嚴謹而賽德克巴萊製作嚴謹而浩大 那一年我們一起追的女孩 清新可喜 皆令人振奮 浩大 那一年我們一起追的女孩 清新可喜 皆令人振奮

116116

Page 117: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

例子例子 :: 日月潭涵碧樓房價每晚一萬四千日月潭涵碧樓房價每晚一萬四千元,法國雜誌曾推薦,是觀光業成功例子元,法國雜誌曾推薦,是觀光業成功例子

但因理念不同,外國經營團隊撤出,一段但因理念不同,外國經營團隊撤出,一段時間後,驚傳洗澡水呈土黄色時間後,驚傳洗澡水呈土黄色

台灣老闆不台灣老闆不知知 : : 維持高品質須要嚴謹步維持高品質須要嚴謹步驟驟,是很昂貴的,不可,是很昂貴的,不可只憑苦幹只憑苦幹省錢省錢將將就就,,要勇於投資升級要勇於投資升級

117117

Page 118: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

觀光股王晶華酒店斥資十七億餘台幣,買觀光股王晶華酒店斥資十七億餘台幣,買知名麗晶飯店(知名麗晶飯店( RegentRegent )品牌,創台灣)品牌,創台灣觀光史首例,一躍為國際品牌管理者,掌觀光史首例,一躍為國際品牌管理者,掌管全球十七家五星級麗晶飯店,及四艘麗管全球十七家五星級麗晶飯店,及四艘麗晶郵輪品牌特許權,將在台北成立全球營晶郵輪品牌特許權,將在台北成立全球營運中心,也計畫讓麗晶重返香港、東京、運中心,也計畫讓麗晶重返香港、東京、上海、紐約、倫敦、巴黎與雪梨等重要城上海、紐約、倫敦、巴黎與雪梨等重要城市市 * * 遠離工廠思維遠離工廠思維 , , 露出曙光了露出曙光了 !!

* * 聯合報聯合報 , 2010.4.17., 2010.4.17.

118118

Page 119: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

晶華潘思亮不重視土地等有形資產晶華潘思亮不重視土地等有形資產 ,, 反而反而重視品牌等無形資產重視品牌等無形資產

二十年前二十年前 ,, 晶華年付百萬美元品牌權利金晶華年付百萬美元品牌權利金給麗晶給麗晶 (Regent), (Regent), 今天買下麗晶品牌今天買下麗晶品牌後後 , , 每年固定可收不少權利金每年固定可收不少權利金 **

潘說潘說 :: 要重文化要說故事要重文化要說故事 ,, 北市中山區巷北市中山區巷弄內就有不少故事弄內就有不少故事 ,, 引人流連引人流連 ****

* * 遠見遠見 , 2010.8, pp. 356-357., 2010.8, pp. 356-357.

** ** 經濟日報經濟日報 , 2010.9.20., 2010.9.20.

119119

Page 120: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

台灣的連鎖休閒服務業台灣的連鎖休閒服務業 ,, 如超商如超商 ,, 飲料飲料店店 ,, 快餐店的密度世界第一快餐店的密度世界第一 ,, 因此競爭激因此競爭激烈烈 ,, 創新度高創新度高

8585度度 CC 在中國展店順利在中國展店順利 ,, 即為成功例子即為成功例子

* * 遠見遠見 , 2010.9, pp. 266-267., 2010.9, pp. 266-267.

120120

Page 121: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思 台灣產業文化的省思 (Cont.)(Cont.)

在新北市泰山區一片鐵皮屋工業區在新北市泰山區一片鐵皮屋工業區 ,, 都是傳都是傳統鐵工廠也有顯示器廠的當中統鐵工廠也有顯示器廠的當中 ,, 很神奇的很神奇的有家餐廳叫有家餐廳叫””香草花緣香草花緣” ” (Herb (Herb Garden),Garden), 大樹成蔭大樹成蔭 ,, 花木扶疏花木扶疏 ,, 生意鼎生意鼎盛盛 ,, 客人悠閒愉悅客人悠閒愉悅 ,, 還有店員吹氣球做成還有店員吹氣球做成帽子給小孩子玩帽子給小孩子玩 ,, 一客海陸餐賣一客海陸餐賣 750750元元 ,,營收應不錯營收應不錯

拼命的傳統工廠提昇為悠閒的庭園餐廳拼命的傳統工廠提昇為悠閒的庭園餐廳 ,,感覺蠻不錯的感覺蠻不錯的 !! 121121

Page 122: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

有軟體公司員工因怕上級責難 而做假文件 有軟體公司員工因怕上級責難 而做假文件 應付上級應付上級 要有要有不責難的企業文化不責難的企業文化 不責難不責難下屬遵行錯誤、落後、無法遵行的規條,下屬遵行錯誤、落後、無法遵行的規條,以以去除造假去除造假的存在必要的存在必要

信任開發團隊會以最有智慧與效率的方法信任開發團隊會以最有智慧與效率的方法完成任務 不以績效考核逼迫做無意義的事 完成任務 不以績效考核逼迫做無意義的事

[[ 中華電信 童欣仁 中華電信 童欣仁 (Chris)](Chris)]

122122

Page 123: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

有軟體公司外行領導內行有軟體公司外行領導內行 : : 不懂技術只會不懂技術只會管理的主管,沒有能力帶領開發團隊管理的主管,沒有能力帶領開發團隊

管理階層做後盾,依開發團隊的需要全力管理階層做後盾,依開發團隊的需要全力支援之,而不是高高在上,訂定並要求無支援之,而不是高高在上,訂定並要求無法遵守的規條法遵守的規條

在彈性中尋求制度,在制度中仍保有彈性在彈性中尋求制度,在制度中仍保有彈性 : : 以彈性敏捷方法開始,遇共通規律性問題以彈性敏捷方法開始,遇共通規律性問題才訂指引,但指引中仍保留實際執行的彈才訂指引,但指引中仍保留實際執行的彈性性 [[ 中華電信 童欣仁 中華電信 童欣仁 (Chris)](Chris)]

123123

Page 124: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

經建會主委劉憶如說經建會主委劉憶如說 : : 金融海嘯後金融海嘯後 ,, 亞亞洲經濟大於歐美經濟洲經濟大於歐美經濟 ,, 台灣過去重視製造台灣過去重視製造業業 ,, 以出口為重心以出口為重心 ;; 今後應重視創新服務今後應重視創新服務業業 ,, 出口及內需並重出口及內需並重 **

陳教授認為陳教授認為 : : 以創新的敏捷方法為基礎以創新的敏捷方法為基礎的軟體業即在創新服務業之中的軟體業即在創新服務業之中

* * 中國時報中國時報 , 2010.12.18., 2010.12.18.

124124

Page 125: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

20102010 春陳教授遊法國春陳教授遊法國 Evian,Evian, 其飲食文化其飲食文化值得借鏡值得借鏡 : : 極慢食極慢食 ,, 逐一享用小酒逐一享用小酒 ,, 前前菜菜 ,, 沙拉沙拉 ,, 熱湯熱湯 ,, 主食主食 ,, 甜點甜點 ,, 咖啡咖啡 ,, 大大家熱絡交談家熱絡交談 ,, 一餐要吃兩小時一餐要吃兩小時 ,, 這樣身心這樣身心悠閒舒暢下悠閒舒暢下 ,, 深度溝通自然發生深度溝通自然發生 ,, 創意易創意易產生產生 .. 這也能使人全神貫注這也能使人全神貫注 ,, 易製出精品易製出精品

反之反之 ,, 台灣人常埋頭拼命工作後台灣人常埋頭拼命工作後 ,, 大魚大大魚大肉肉 ,, 大吃大喝大吃大喝 ,, 傷身體了傷身體了 ,, 且工作有時略且工作有時略草率草率

125125

Page 126: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.)

林百里說 賈伯斯沒讀過工程學 不算工程師 林百里說 賈伯斯沒讀過工程學 不算工程師 但因他融入人文思考 所以創造了截然不同但因他融入人文思考 所以創造了截然不同的蘋果產品的蘋果產品

人性工程才是真正的價值 製造冷冰冰的機人性工程才是真正的價值 製造冷冰冰的機器不再是獲利模式器不再是獲利模式

* 2012.3.6 * 2012.3.6 聯合晚報聯合晚報

126126

Page 127: 驚濤駭浪!台灣軟體業的險境

台灣產業文化的省思台灣產業文化的省思 (Cont.)(Cont.) 爾必達事件像一個高倍數的照妖鏡,立刻讓「高科技產爾必達事件像一個高倍數的照妖鏡,立刻讓「高科技產

業」中的科技成分現形;原來我們的業」中的科技成分現形;原來我們的 DRAMDRAM 產業不努力研發產業不努力研發自有技術,年年捧著數百億鉅資向人討些現成專利;自有技術,年年捧著數百億鉅資向人討些現成專利;

面板產業面對強敵三星節節敗退,最後淪落到撿食其面板產業面對強敵三星節節敗退,最後淪落到撿食其棄之無味的雞肋;棄之無味的雞肋;

iPhoneiPhone 代工廠在單價中只能努力爭取區區百分之一代工廠在單價中只能努力爭取區區百分之一的代工錢,還要面對血汗工廠的譴責。的代工錢,還要面對血汗工廠的譴責。

結果,十餘年來台灣經濟一蹶不振,勉強維繫百分之結果,十餘年來台灣經濟一蹶不振,勉強維繫百分之三、四的成長,還胥賴對大陸世界工廠的出超支持;如今世三、四的成長,還胥賴對大陸世界工廠的出超支持;如今世界工廠瀕臨關閉的命運,我們要向何處尋求一線生機?界工廠瀕臨關閉的命運,我們要向何處尋求一線生機?

* 2012.3.8 * 2012.3.8 聯合報 馬凱 廿年一覺科技夢聯合報 馬凱 廿年一覺科技夢

127127

Page 128: 驚濤駭浪!台灣軟體業的險境

產業失敗例子產業失敗例子 震驚社會且引起國際嘲笑的高鐵售票專案震驚社會且引起國際嘲笑的高鐵售票專案即是失敗專案:國內知名的神通軟體公司即是失敗專案:國內知名的神通軟體公司 承包後,自己不開發,轉包承包後,自己不開發,轉包 IBM, IBM, 取得美取得美國陳舊鐵路軟體,加以修改,結果釀成大國陳舊鐵路軟體,加以修改,結果釀成大禍,禍,變成國際級笑話變成國際級笑話

真相是真相是 : : 台灣台灣是是軟體軟體落後國落後國,,要深切反要深切反省省,,認清事實認清事實,,承認落後,才能掌握承認落後,才能掌握後進後進優勢優勢後來居上後來居上 . . 國際競爭起起伏伏,落後國際競爭起起伏伏,落後真的不可怕,不知落後才可怕真的不可怕,不知落後才可怕

128128

Page 129: 驚濤駭浪!台灣軟體業的險境

產業失敗例子 產業失敗例子 (Cont.)(Cont.)

有一些台灣軟體公司在軟體程式碼開發完有一些台灣軟體公司在軟體程式碼開發完成之後成之後 ,, 才補寫文件才補寫文件 ,, 甚至另外找人甚至另外找人 (( 非非原開發者原開發者 )) 來寫文件來寫文件 , , 這是典型應付考試這是典型應付考試心態心態 (( 可能是應付某 可能是應付某 process process 標準的要標準的要求求 ,, 如如 CMMI),CMMI), 真是匪夷所思真是匪夷所思 ! ! 難怪產業難怪產業不振不振 !!

129129

Page 130: 驚濤駭浪!台灣軟體業的險境

產業例子產業例子 遊戲軟體公司智冠王俊博遊戲軟體公司智冠王俊博 ** 說說 :: 台灣產品台灣產品上市讓人眼睛一亮上市讓人眼睛一亮 ,, 十萬人上線十萬人上線 ,, 但人數但人數遞減遞減 ; ; 中國產品則擴充速度快中國產品則擴充速度快 ,, 上市後很上市後很快可擴充功能快可擴充功能 ,, 使上線人數遞增使上線人數遞增

陳教授猜測可能中國軟體 陳教授猜測可能中國軟體 O-O O-O 設計設計 (( 切切割割 )) 較佳較佳 ,, 使軟體較易延伸擴充使軟體較易延伸擴充

* * 商業周刊商業周刊 , 2010.6.28., 2010.6.28.

130130

Page 131: 驚濤駭浪!台灣軟體業的險境

似成功 實失敗 的例子似成功 實失敗 的例子 20072007華航火燒機,全機乘客三分鐘逃離,飛機隨華航火燒機,全機乘客三分鐘逃離,飛機隨

即爆炸。畫面傳及全球,俄國讚為奇蹟 即爆炸。畫面傳及全球,俄國讚為奇蹟 ((類似案類似案件他們死數百件他們死數百 )) ,華航譽機長為英雄 ,華航譽機長為英雄 ....成功例成功例子子 : : 機組員訓練有素、乘客臨危不亂,構成機組員訓練有素、乘客臨危不亂,構成高效高效率團隊率團隊!!

真相是真相是 ::

機組員完全無指揮照顧機組員完全無指揮照顧,,乘客爬過座椅,高呼開乘客爬過座椅,高呼開門,數百人耳聰目明、爭先恐後逃難,原來是台門,數百人耳聰目明、爭先恐後逃難,原來是台灣人自求多福、拚命求生的一幕,令人扼腕!灣人自求多福、拚命求生的一幕,令人扼腕!

131131

Page 132: 驚濤駭浪!台灣軟體業的險境

產業成功例子產業成功例子 2009 2009 裕隆汽車推出納智捷 裕隆汽車推出納智捷 LUXGEN LUXGEN (for luxury and genius)(for luxury and genius) 智慧車 智慧車

整合宏達電車用電腦系統整合宏達電車用電腦系統 ,, 與全球大廠競與全球大廠競爭 角逐世界最大汽車市場爭 角逐世界最大汽車市場 (( 中國中國 ))

雖然網友試駛意見雖然網友試駛意見 ,, 反映一些小瑕疵反映一些小瑕疵 ,, 但但瑕不掩瑜瑕不掩瑜 ,, 這是台灣資訊業創新成功的一這是台灣資訊業創新成功的一例例

132132

Page 133: 驚濤駭浪!台灣軟體業的險境

產業成功例子 產業成功例子 (Cont.)(Cont.) 台灣人才多,素材豐富,從高雄世運、台北台灣人才多,素材豐富,從高雄世運、台北聽奧的經驗,可看出台灣有能力舉辦國際大聽奧的經驗,可看出台灣有能力舉辦國際大型活動且嶄露光芒。尤其,活動中見到多媒型活動且嶄露光芒。尤其,活動中見到多媒體科技大量運用,讓節目畫龍點睛,豐富的體科技大量運用,讓節目畫龍點睛,豐富的變化顯現多媒體科技可應用於各領域,將成變化顯現多媒體科技可應用於各領域,將成為我國產業的明日之星為我國產業的明日之星

[web site [web site 朱宗慶文化觀測站朱宗慶文化觀測站 , Sep. 2009], Sep. 2009]

例子例子 :: 據聞世博中國館內叫好的清明上河圖據聞世博中國館內叫好的清明上河圖 ,, 即出自台灣軟體 即出自台灣軟體 公司之手公司之手

133133

Page 134: 驚濤駭浪!台灣軟體業的險境

產業成功例子 產業成功例子 (Cont.)(Cont.)

台灣線上遊戲神諭之戰台灣線上遊戲神諭之戰 (Runes of Magic)(Runes of Magic) 奪奪德國大獎德國大獎 ,, 歐洲每日上線突破四十萬人歐洲每日上線突破四十萬人 ..

唐志偉唐志偉 (35(35歲歲 )) 志宗志宗 (31)(31)兄弟兄弟 ,, 因逃避考試制因逃避考試制度度 ,, 小學赴美小學赴美 ,, 研究所畢業才回台研究所畢業才回台 ,2005,2005 創創立思維工坊立思維工坊 .. 其父是台中鞋廠老闆其父是台中鞋廠老闆 ,, 一輩子代一輩子代工工 ,, 倒是兒子自創品牌了倒是兒子自創品牌了 !!

神諭之戰玩家有神諭之戰玩家有 1313部位可打扮部位可打扮 ,, 背景音樂高價背景音樂高價找德國管弦樂團找德國管弦樂團 ,, 投投 40004000萬萬 ,, 每月獲利每月獲利 800800萬萬

* * 遠見遠見 , 2010.8, pp. 366-367., 2010.8, pp. 366-367.134134

Page 135: 驚濤駭浪!台灣軟體業的險境

產業成功例子 產業成功例子 (Cont.)(Cont.)

宏達電率先脫離較舊的微軟平台宏達電率先脫離較舊的微軟平台 ,, 跨入新跨入新的 的 android android 手機平台手機平台 , , 並以並以 11001100 萬萬歐元併購法國手機軟體公司歐元併購法國手機軟體公司 , , 這是軟體創這是軟體創新思維新思維 , , 勝過聯發科的山寨機低價思維勝過聯發科的山寨機低價思維 , ,

當然當然 ,, 股價也反映此點股價也反映此點

* * 商業週刊商業週刊 , 2010.7.19, p.44., 2010.7.19, p.44.

135135

Page 136: 驚濤駭浪!台灣軟體業的險境

以上回顧台灣軟工文化的缺失以上回顧台灣軟工文化的缺失

下面則簡述敏捷方法帶給全球的下面則簡述敏捷方法帶給全球的 一些軟工新觀念一些軟工新觀念

136136

Page 137: 驚濤駭浪!台灣軟體業的險境

軟體只有設計 而無施工軟體只有設計 而無施工 **

軟體設計圖軟體設計圖 (( 用用 Unified Modeling Language, Unified Modeling Language, UMLUML畫出畫出 ) ) 像畫家的草稿或作家的章節大綱,目像畫家的草稿或作家的章節大綱,目的是便於後續的細部思考的是便於後續的細部思考 :: 資料結構、演算法、程資料結構、演算法、程式碼等式碼等 (( 我們用設計草圖、虛擬碼來協助這思考,我們用設計草圖、虛擬碼來協助這思考,後敘後敘 ))

軟體設計圖 軟體設計圖 不像 不像 橋樑設計圖橋樑設計圖,它已完成細部思考,,它已完成細部思考,已定案,故可交施工部門。此時,因已定案,才可已定案,故可交施工部門。此時,因已定案,才可做長期詳細的施工時程及成本的規劃做長期詳細的施工時程及成本的規劃 **傳統軟工這方面觀念有誤解,敏捷方法矯正之傳統軟工這方面觀念有誤解,敏捷方法矯正之

* Martin Fowler, From Nothing, to Monumental, to Agile , , http://www.martinfowler.com

137137

Page 138: 驚濤駭浪!台灣軟體業的險境

敏捷方法等於寫程式敏捷方法等於寫程式 ??

因敏捷方法最後只留下原始碼、測試碼等程式,因敏捷方法最後只留下原始碼、測試碼等程式,所以有人誤解為所以有人誤解為 : : 只在寫程式只在寫程式

當然不是當然不是 ! ! 敏捷方法做規劃,但不寫規劃書敏捷方法做規劃,但不寫規劃書(planning, but no plan)(planning, but no plan);做設計;做設計(CRC)(CRC),但,但不寫設計不寫設計書書 (sequence (sequence diagram, class diagramdiagram, class diagram等等 ))。很多工作。很多工作(tasks)(tasks)用面對面溝通加短期文件用面對面溝通加短期文件 (( 白紙白白紙白板板 ))即達成了,即達成了,所以長期留下的只有程式所以長期留下的只有程式 (( 及驗及驗收測試收測試 ))

138138

Page 139: 驚濤駭浪!台灣軟體業的險境

客户關係客户關係與客户為合作與客户為合作 *(*(非合約非合約 **)**)關係,試想關係,試想某軟體公司某軟體公司以以 200200萬承接某專案;萬承接某專案;若該軟體很快推出且達到客若該軟體很快推出且達到客户期望,客户可能獲利户期望,客户可能獲利 10001000萬,如案子砸了,誰吃萬,如案子砸了,誰吃虧大虧大 ? ? 客户!客户!故聰明客户願派出故聰明客户願派出駐點使用專家駐點使用專家 ******

客户公司可能指定兩人探索需求,找出功能清單,再客户公司可能指定兩人探索需求,找出功能清單,再由其中一人任駐點使用專家由其中一人任駐點使用專家分次付款分次付款 -- 若該軟體分四次交貨若該軟體分四次交貨,每次付,每次付 5050萬萬

* * 此時社會此時社會成熟互信,無人詐欺,斯不成熟互信,無人詐欺,斯不易矣!易矣!* * 目前客户及軟體公司目前客户及軟體公司不很互信,故須以合約規範之不很互信,故須以合約規範之*** *** 反之,若反之,若開發團隊去客户端開發團隊去客户端工作,也可以啊!工作,也可以啊!

139139

Page 140: 驚濤駭浪!台灣軟體業的險境

團隊組織團隊組織 傳統三層傳統三層 : 1)system analyst (SA), : 1)system analyst (SA), 2)system designer (SD), 2)system designer (SD), 3)programmer (PR) 3)programmer (PR) 另有 另有 project project manager (PM)manager (PM)

現只 現只 designer-programmer designer-programmer 簡稱簡稱developer (1developer (1或或 2 programmers2 programmers,改為,改為 2 2 developers in pair-programming; 3developers in pair-programming; 3或或 4 4 改 改 2 pairs)2 pairs)

駐點使用專家駐點使用專家 (( 後敘後敘 ))取代取代 SASA;溝通簡化低;溝通簡化低階階 PMPM消失;工讀生將消失;工讀生將 developerdeveloper 做的做的 test test cases cases 轉成 轉成 test codetest code

140140

Page 141: 驚濤駭浪!台灣軟體業的險境

團隊組織 團隊組織 (Cont.)(Cont.)

由舊團隊轉型為新團隊時,有一靈魂人物由舊團隊轉型為新團隊時,有一靈魂人物 : : Coach (Coach (教頭教頭 ))

通常,通常, Coach Coach 是最早接觸敏捷方法的團是最早接觸敏捷方法的團隊成員,他為其他成員打氣加油,並尋求隊成員,他為其他成員打氣加油,並尋求外界資源外界資源,,如如 ::

網路上敏捷方法成功故事、網路上敏捷方法成功故事、 敏捷方法研討會、敏捷方法顧問敏捷方法研討會、敏捷方法顧問 當然,上級及客户支持轉型是先決條件當然,上級及客户支持轉型是先決條件

141141

Page 142: 驚濤駭浪!台灣軟體業的險境

團隊組織 團隊組織 (Cont.)(Cont.)

Diversity and Software Development Diversity and Software Development 一文一文 ** 中引 中引 Scott E. Page** Scott E. Page** 專書指出專書指出 ::

多樣化不同個性的成員有助軟體團隊多樣化不同個性的成員有助軟體團隊

DiversityDiversity 指各人 指各人 perspective, interpretation, perspective, interpretation, heuristics, and predictive model heuristics, and predictive model 的不同的不同 ..

例子例子 :: 1949 1949難民潮難民潮 ******帶來中國各省多樣化基因帶來中國各省多樣化基因 ,, 是台灣是台灣最珍貴資產最珍貴資產 ,, 其後代今日已成台灣中堅其後代今日已成台灣中堅 (( 如金溥聰是滿如金溥聰是滿族族 ))

例子例子 :: 美國融合各族 過世的賈伯斯 其父阿拉伯人 母美國人美國融合各族 過世的賈伯斯 其父阿拉伯人 母美國人

*IEEE Software, May/June 2009.*IEEE Software, May/June 2009.

** XP 2010, Norway, keynote speaker.** XP 2010, Norway, keynote speaker.

*** *** 龍應台龍應台 , , 大江大海一九四九大江大海一九四九 ,, 天下天下 ,2009.8.31,2009.8.31.. 142142

Page 143: 驚濤駭浪!台灣軟體業的險境

團隊組織 團隊組織 (Cont.)(Cont.)

團隊合作的背後是信任團隊合作的背後是信任例子例子 :: 中視超級星光大道中 有一新秀須在中視超級星光大道中 有一新秀須在歌唱中一躍而後 後面則有舞群安全的接住歌唱中一躍而後 後面則有舞群安全的接住他他 但新秀看不到舞群 難免心生畏懼 這就但新秀看不到舞群 難免心生畏懼 這就合作不良影響歌唱表現了 若老手有信任感合作不良影響歌唱表現了 若老手有信任感則不同了則不同了

同樣的 軟體團隊須信任他人程式可依文件同樣的 軟體團隊須信任他人程式可依文件所述執行 而勇於呼叫使用之 團隊才能合所述執行 而勇於呼叫使用之 團隊才能合作 作

143143

Page 144: 驚濤駭浪!台灣軟體業的險境

專案經理怎麽不見了?專案經理怎麽不見了? 原有專案經理做原有專案經理做 : : 工作分派、工時計算、工作分派、工時計算、預算規劃控制、進度報告,要做不少文件預算規劃控制、進度報告,要做不少文件,何以不見了? 原因,何以不見了? 原因 ::

各人主動協調,不需經理指揮 各人主動協調,不需經理指揮 ((這超這超難難 !)!)

善用白板溝通,不需太多文件善用白板溝通,不需太多文件 因駐點客户在現場,不必報告客户了因駐點客户在現場,不必報告客户了

144144

Page 145: 驚濤駭浪!台灣軟體業的險境

駐點使用專家 駐點使用專家 (On-site usage expert)(On-site usage expert)

駐點使用專家駐點使用專家 (( 或叫駐點客户 或叫駐點客户 on-site customeron-site customer由客户長期派駐團隊工作。它由客户長期派駐團隊工作。它顛覆傳統,問號很多顛覆傳統,問號很多 :: 使用者怎願到現場幫我們開發使用者怎願到現場幫我們開發 ?? 使用者程度很低,怎懂電腦,如何一起工作使用者程度很低,怎懂電腦,如何一起工作 ??但,開發者直接面對使用者,但,開發者直接面對使用者,需求瓶頸 需求瓶頸 消除了!消除了!他只要懂需求,不用懂電腦 他只要懂需求,不用懂電腦 開發時開發時,,駐點專家駐點專家整天與開發者在一起,可確保整天與開發者在一起,可確保需求需求精準落實於精準落實於程式程式中中 (( 尤其是氣氛,美感,情調等美學價值尤其是氣氛,美感,情調等美學價值 ))

實務上,實務上, part time(part time(非非 full time)full time)亦可,但要亦可,但要 補足溝通功能,如多用補足溝通功能,如多用 Email,Email,手機手機 (( 含簡訊含簡訊 ))等等

145145

Page 146: 驚濤駭浪!台灣軟體業的險境

駐點使用專家 工作超忙 駐點使用專家 工作超忙 有人以為這是涼缺,其實要做很多事有人以為這是涼缺,其實要做很多事 ::

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

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

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

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

146146

Page 147: 驚濤駭浪!台灣軟體業的險境

駐點使用專家 駐點使用專家 (Cont.)(Cont.) 軟體有客製型軟體有客製型 (( 如某公司銷售系統如某公司銷售系統 )) 或或 一般型一般型 (( 如 如 Microsoft WORD)Microsoft WORD)

前者前者 :: 客戶要派出駐點使用專家 客戶要派出駐點使用專家 後者後者 :: 要指定市場調查者擔任駐點使用專家 要指定市場調查者擔任駐點使用專家

總之總之 ,, 駐點使用專家要負責需求之釐清駐點使用專家要負責需求之釐清

147147

Page 148: 驚濤駭浪!台灣軟體業的險境

駐點使用專家 駐點使用專家 (Cont.)(Cont.)

使用專家必須反映各種不同使用者的不同使用專家必須反映各種不同使用者的不同使用習慣 使用習慣 例如例如 ::

手機操作常未考慮中老年人手機操作常未考慮中老年人 手指遲緩 按不到小小的按鈕 手指遲緩 按不到小小的按鈕 近視老花眼 看不清小小的顯示近視老花眼 看不清小小的顯示

更常見軟體使用手冊寫的像程式更常見軟體使用手冊寫的像程式 ,, 難閱讀難閱讀

148148

Page 149: 驚濤駭浪!台灣軟體業的險境

駐點使用專家 駐點使用專家 (Cont.)(Cont.)

有電信業界人士指出有電信業界人士指出 ::

駐點使用專家之薪資經費駐點使用專家之薪資經費 應正式編入計畫預算 應正式編入計畫預算 因為這經費比程式師開發需求文件的經費少因為這經費比程式師開發需求文件的經費少 ,,

而且有效多了而且有效多了

例子例子 : : 中研院生醫組聘駐點使用專家中研院生醫組聘駐點使用專家 (( 薪資三萬薪資三萬多多 )) 遠勝於聘程式師寫需求文件遠勝於聘程式師寫需求文件 (( 薪資五萬多薪資五萬多 ) ) 而更有效而更有效 !!

149149

Page 150: 驚濤駭浪!台灣軟體業的險境

逐步改善 以達極致逐步改善 以達極致 溝通要達極限極致溝通要達極限極致 (extreme)(extreme)絕非一步可達絕非一步可達

要逐步改善文化及設施,要逐步改善文化及設施, 如 如 1) 1) 同仁願交談 同仁願交談 2) 2) 設交誼區設交誼區

如 如 1) 1) 願做設計 願做設計 2)2)願做單元測試 願做單元測試 3) 3) 安裝 安裝 JUnitJUnit

150150

Page 151: 驚濤駭浪!台灣軟體業的險境

守破離守破離––習武之極致習武之極致 習武者一開始要遵習武者一開始要遵守守規則方法規則方法 ,, 有武功後可打有武功後可打破破規則因時制宜規則因時制宜 ,, 到大師級後可跳到大師級後可跳離離規則自由規則自由揮灑揮灑 ,, 這是日本武道的這是日本武道的 ::

守破離守破離 (Shu Ha Ri) (Shu Ha Ri)

它描述學藝三階段它描述學藝三階段 ,, 軟體工藝的學習亦不例外軟體工藝的學習亦不例外 Cockburn Cockburn 提此提此 ; Agile 2010 ; Agile 2010 以此為主以此為主題題

依此才能心平氣和從容自若依此才能心平氣和從容自若 ,, 有專注力及決心有專注力及決心 151151

Page 152: 驚濤駭浪!台灣軟體業的險境

到達極致卻失敗的例子到達極致卻失敗的例子 芬蘭 芬蘭 NOKIANOKIA 工程技術已達極致 工程技術已達極致 (extreme) (extreme) 但從手機霸主地位瞬間覆亡 何但從手機霸主地位瞬間覆亡 何以致之 以致之 ?? 因為平地冒出賈伯斯的 因為平地冒出賈伯斯的 iPhoneiPhone 顛覆了整個科技環境 使其極致優勢瞬間失效 顛覆了整個科技環境 使其極致優勢瞬間失效

所以要應付變動的環境 就要勇於拋棄及忘所以要應付變動的環境 就要勇於拋棄及忘記以前的優勢及成功記以前的優勢及成功 * * 這正是 這正是 Agile Agile 的精的精神神 !!

* * 商業週刊商業週刊 12231223期期 2011.7.11.2011.7.11.

152152

Page 153: 驚濤駭浪!台灣軟體業的險境

基本溝通能力基本溝通能力 (( 口頭及文字口頭及文字 )) 之外之外 ,, 下面,陳教授引用最新溝通學著作 下面,陳教授引用最新溝通學著作

Made to Stick, Heath, Made to Stick, Heath, 2007.2007.

at www.madetostick.comat www.madetostick.com

進一步探討溝通進一步探討溝通153153

Page 154: 驚濤駭浪!台灣軟體業的險境

人際溝通 人際溝通 擊節者實驗擊節者實驗1990 Stanford Univ. 1990 Stanford Univ. 心理學博士論文心理學博士論文擊節者拿到紙片上有擊節者拿到紙片上有 2525 首常見歌曲 首常見歌曲 ((如生日快如生日快樂樂 ) ) 任選一首 在桌上敲擊節奏給聽 任選一首 在桌上敲擊節奏給聽者者聽聽者則根據者則根據節奏節奏來來猜歌名猜歌名擊節者預測 猜中機率 擊節者預測 猜中機率 50%50% ( (因他知因他知旋律旋律 ))

但但聽聽者聽到一串者聽到一串 敲擊聲 敲擊聲 只猜中 只猜中 2.5%2.5%

真相真相 :: 擊節者很難想像聽者擊節者很難想像聽者無無旋律的旋律的知識知識 , , 敲得很累敲得很累 (( 腦中旋律震耳腦中旋律震耳 )) 也沒用,這形 也沒用,這形 成成魔咒魔咒 ,阻絕溝通 ,阻絕溝通 ((對方怎可能沒聽對方怎可能沒聽出出 ??)??)

Page 155: 驚濤駭浪!台灣軟體業的險境

人際溝通 人際溝通 (Cont.)(Cont.) 從心理學觀點從心理學觀點 *:*:人際溝通有人際溝通有知識知識的魔咒 的魔咒 (( 上上頁頁實驗實驗 ) ) (The Curse of Knowledge)(The Curse of Knowledge)

以軟工而言:以軟工而言:開發者在開發當下擁有知識,開發者在開發當下擁有知識,但無法想像維修者完全無知識的困境,開發者但無法想像維修者完全無知識的困境,開發者會會誤誤以為維修者也擁有該知識以為維修者也擁有該知識

本法 本法 myAgile myAgile 的 的 設計草圖 設計草圖 (design (design sketch)sketch) 及及虛擬碼 虛擬碼 (pseudo code)(pseudo code)即補捉即補捉開開發者該知識發者該知識 ,, 再傳播給再傳播給維修者維修者

* Made to Stick: Why Some Ideas Survive and Others Die), * Made to Stick: Why Some Ideas Survive and Others Die),

中譯本:創意黏力學 中譯本:創意黏力學 (( 觀念溝通學 觀念溝通學 似為較佳譯名似為較佳譯名 ), ), 大塊文化大塊文化 , 2007, , 2007, pp. 29-30. pp. 29-30.

155155

Page 156: 驚濤駭浪!台灣軟體業的險境

人際溝通 人際溝通 (Cont.)(Cont.)

例子例子 : : 郵局行員問寄包裹顧客郵局行員問寄包裹顧客””要幾天的要幾天的 ?”?”

顧客呆住顧客呆住,,溝通失敗了溝通失敗了 !!

正確的溝通是正確的溝通是 : “: “ 這包裹三天送到要一百元 這包裹三天送到要一百元 ,,七天送到要五十元七天送到要五十元,,你要幾天的你要幾天的 ?”?”

原因原因 : : 行員每天講幾十次行員每天講幾十次,,誤以為顧客也擁有誤以為顧客也擁有””三天送到要一百元 三天送到要一百元 ,,七天送到要五十元七天送到要五十元””的 的 知識知識,其實,其實顧客是第一次聽到這事顧客是第一次聽到這事

156156

Page 157: 驚濤駭浪!台灣軟體業的險境

人際溝通 人際溝通 (Cont.)(Cont.)

例子例子 : : 台北車站多鐵共構台北車站多鐵共構 ,, 大量大量 usersusers中各中各 useruser腦海知識腦海知識(knowledge)(knowledge) 不同不同 ,, 因此設計標示因此設計標示 (sign)(sign)使之快速與各種 使之快速與各種 user user 溝通很重要溝通很重要

假設假設 :: 某某 useruser搭捷運到台北車站搭捷運到台北車站 ,, 要去微風要去微風 food court,food court, 如其如其腦海知識有腦海知識有 ::

““微風在台鐵微風在台鐵 2F”2F”知識知識

而循而循台鐵標示台鐵標示前進前進 ,, 則會輕鬆找到則會輕鬆找到 . . 反之反之 ,, 因無微風標示因無微風標示 ,, 則會找的很累 則會找的很累

如何用標示 如何用標示 (sign) (sign) 適時提供適切知識適時提供適切知識 值得深思值得深思

157157

Page 158: 驚濤駭浪!台灣軟體業的險境

人際溝通 人際溝通 (Cont.)(Cont.)

例子例子 :: 某工程師完成一報告,是用某工程師完成一報告,是用debuggerdebugger 查出的某程式的複雜的資料結查出的某程式的複雜的資料結構構

但報告中無足夠文字說明,也無但報告中無足夠文字說明,也無debuggerdebugger 操作簡例,讀此報告的工程師操作簡例,讀此報告的工程師勢將無法順利依據此報告維修軟體,例如勢將無法順利依據此報告維修軟體,例如增添一個簡單的資料欄位增添一個簡單的資料欄位

158158

Page 159: 驚濤駭浪!台灣軟體業的險境

破解 知識的魔咒破解 知識的魔咒 人類聽故事 人類聽故事 (story)(story) 時,不是被動的聽時,不是被動的聽,而是會模擬地理位置,在腦海形成一幅,而是會模擬地理位置,在腦海形成一幅圖畫,用視覺想像場景 圖畫,用視覺想像場景 (scenario)(scenario) ,,有誰在裡面,自己在那兒,有誰在裡面,自己在那兒,想像的焦點是想像的焦點是故事過程,而非結果故事過程,而非結果

CRC(CRC( 後敘後敘 )) 就是開發團隊一齊做上述的模就是開發團隊一齊做上述的模擬 ,可模擬多樣的使用狀況擬 ,可模擬多樣的使用狀況 (use case)(use case)

這可能是這可能是 O-O O-O 及敏捷方法的學理根據及敏捷方法的學理根據

159159

Page 160: 驚濤駭浪!台灣軟體業的險境

破解知識的魔咒 破解知識的魔咒 (Cont.)(Cont.) 故事故事提供抽象文字裡缺乏的情境,所以提供抽象文字裡缺乏的情境,所以講故事可破解知識的魔咒,而達成溝通講故事可破解知識的魔咒,而達成溝通

使用者的故事 使用者的故事 (user story) (user story) 及及 故事的情境 故事的情境 (scenario)(scenario)

會成為會成為 O-O O-O 及敏捷方法中使用者與開及敏捷方法中使用者與開發者溝通的利器,是有學理根據的發者溝通的利器,是有學理根據的

下列溝通六原則,就以 下列溝通六原則,就以 故事 故事 總其成總其成 ::

160160

Page 161: 驚濤駭浪!台灣軟體業的險境

觀念溝通六原則觀念溝通六原則 簡單 簡單 simple simple 核心 核心 + + 簡潔簡潔 意外 意外 unexpected unexpected 吸引聽眾注意力吸引聽眾注意力 具體 具體 concrete concrete 使每位聽眾聽到同樣使每位聽眾聽到同樣訊息訊息

可信 可信 credible credible 讓聽眾可查證讓聽眾可查證 情緒 情緒 emotional emotional 讓聽眾有感覺讓聽眾有感覺 故事 故事 stories stories 讓聽眾心中模擬情境讓聽眾心中模擬情境

161161

Page 162: 驚濤駭浪!台灣軟體業的險境

觀念溝通 實例觀念溝通 實例1961 1961 甘乃迪總統 提出下面與全國溝通甘乃迪總統 提出下面與全國溝通 ::

在十年內送人登陸月球 並讓他安全返回地球在十年內送人登陸月球 並讓他安全返回地球 吻合上述六原則吻合上述六原則

反之,若當時甘乃迪這樣說反之,若當時甘乃迪這樣說 : :

我們的目標是 靠著高度團結的創新 以及策略我們的目標是 靠著高度團結的創新 以及策略指向的太空攻勢 成為太空工業的全球領導者指向的太空攻勢 成為太空工業的全球領導者那麼,溝通很可能失敗,無法登月成功那麼,溝通很可能失敗,無法登月成功 !!

162162

Page 163: 驚濤駭浪!台灣軟體業的險境

觀念溝通 實例 觀念溝通 實例 (Cont.)(Cont.)

Nordstrom Nordstrom 百貨公司有兩套員工訓練簡報百貨公司有兩套員工訓練簡報 ::

1) 1) 超優的客戶服務是業務優勢之主要泉源超優的客戶服務是業務優勢之主要泉源 2) 2) 有個員工免費給客戶包裝在 有個員工免費給客戶包裝在 Macy (Macy (敵對的百貨公司敵對的百貨公司 )) 買的禮物買的禮物上述何者深植員工腦海上述何者深植員工腦海 ? ?

Ans: 2) Ans: 2) 因為是一個簡單意外的故事因為是一個簡單意外的故事 163163

Page 164: 驚濤駭浪!台灣軟體業的險境

觀念溝通 新研究觀念溝通 新研究XP 2010 Best Research Paper* XP 2010 Best Research Paper* 探討菁英探討菁英團隊中團隊中 ,, 各人不懂他人領域下各人不懂他人領域下 ,, 如何溝通如何溝通

FageiFagei 用社會科學的 用社會科學的 action research action research 研究研究組織如何導入 組織如何導入 agile method.agile method. 其論點是其論點是 :: 要要建立 建立 redundant knowledge,redundant knowledge,各人才能溝各人才能溝通通 .. 其其 actionaction 是在 是在 Scrum meeting Scrum meeting 中用撲中用撲克牌做 克牌做 team estimate of tasksteam estimate of tasks

此 此 action action 稍嫌簡單稍嫌簡單 ,, 但研究方法頗具啟發性但研究方法頗具啟發性

* T.E. Fagei, “Adoption of Team Estimation in a Specialist * T.E. Fagei, “Adoption of Team Estimation in a Specialist Organizational Environment”, XP 2010, Norway.Organizational Environment”, XP 2010, Norway.

164164

Page 165: 驚濤駭浪!台灣軟體業的險境

下面下面,,簡介極限開發法簡介極限開發法 Extreme Programming (XP)Extreme Programming (XP) 及 及 Agile Method Agile Method 源起及重視點源起及重視點

165165

Page 166: 驚濤駭浪!台灣軟體業的險境

XP Core Practice 核心實務 **

1. 1. Fine scale feedback Fine scale feedback 細部回授細部回授• TestDrivenDevelopment via via ProgrammerTests and s and

CustomerTests (were s (were UnitTests & s & AcceptanceTests) s) • PlanningGame • WholeTeam (was (was OnsiteCustomer) ) • PairProgramming

2. Continuous process rather than batch 2. Continuous process rather than batch 非批次流程非批次流程• ContinuousIntegration • DesignImprovement (was (was RefactorMercilessly) ) • SmallReleases

166166

Page 167: 驚濤駭浪!台灣軟體業的險境

XP Core Practices (Cont.)

3. Shared understanding 3. Shared understanding 分享所知分享所知• SimpleDesign ( (DoSimpleThings, , YouArentGonnaNeedIt, ,

OnceAndOnlyOnce, , SimplifyVigorously) ) • SystemMetaphor • CollectiveCodeOwnership • CodingStandard or or CodingConventions

4. Programmer welfare 4. Programmer welfare 員工福祉員工福祉• SustainablePace (original name: (original name: FortyHourWeek))

* http://c2.com/cgi/wiki?ExtremeProgrammingCorePractices* http://c2.com/cgi/wiki?ExtremeProgrammingCorePractices

167167

Page 168: 驚濤駭浪!台灣軟體業的險境

XP valuesXP values 價值觀價值觀 [wikipedia][wikipedia]

Extreme Programming initially recognized four Extreme Programming initially recognized four values in 1999. A new value was added in the values in 1999. A new value was added in the second edition of second edition of Extreme Programming Extreme Programming ExplainedExplained. The five values are:. The five values are:

Communication 溝通溝通 Simplicity 簡約簡約 Feedback 回饋回饋 Courage 勇氣勇氣 Respect 尊重 尊重 ((ssee next page)ee next page)

168168

Page 169: 驚濤駭浪!台灣軟體業的險境

Respect Respect 尊重尊重 The The respectrespect value manifests in several ways. Team value manifests in several ways. Team

members respect each other because programmers should members respect each other because programmers should never commit changes that break compilation, that make never commit changes that break compilation, that make existing unit-tests fail, or that otherwise delay the work of existing unit-tests fail, or that otherwise delay the work of their peers. Members respect their work by always striving their peers. Members respect their work by always striving for high quality and seeking for the best design for the for high quality and seeking for the best design for the solution at hand through refactoring.solution at hand through refactoring.

Adopting four earlier values led to Adopting four earlier values led to respectrespect gained gained from others in team. from others in team. Nobody on the team should feel Nobody on the team should feel unappreciated or ignored. This ensures high level of unappreciated or ignored. This ensures high level of motivation and encourages loyalty toward the team, and motivation and encourages loyalty toward the team, and the goal of the project. This value is very dependent upon the goal of the project. This value is very dependent upon the other values, and is very much oriented toward people the other values, and is very much oriented toward people in a team.in a team.

169169

Page 170: 驚濤駭浪!台灣軟體業的險境

Agile Agile 此詞源起此詞源起

In 2001 in Utah, ”In 2001 in Utah, ”agileagile” was coined by the ” was coined by the Agile Alliance to stress importance of: Agile Alliance to stress importance of:

being able to respond being able to respond to changing requirements to changing requirements within the project time frame.within the project time frame.

“ “LightweightLightweight” was not adopted because it ” was not adopted because it was regarded as too much of a reaction was regarded as too much of a reaction against something (“heavyweight”), and not against something (“heavyweight”), and not enough of a belief in something.enough of a belief in something.

170170

Page 171: 驚濤駭浪!台灣軟體業的險境

Agile revisitedAgile revisited

2001 Utah 2001 Utah 盛會盛會 ,17,17位大師簽署發表敏捷位大師簽署發表敏捷宣言 宣言 (Agile Manifesto),(Agile Manifesto), 驚豔世人驚豔世人倏忽十年倏忽十年 ,Agile 2011 conference ,Agile 2011 conference 重返 重返 UtahUtah 舉行舉行 ,, 其網站有大師感言 撼人心弦其網站有大師感言 撼人心弦

Agile 2011Agile 2011 3 keynote speakers 3 keynote speakers 談心談心理學 溝通學理學 溝通學 , , 請讀者上網注意此新趨勢 請讀者上網注意此新趨勢

下附簡介下附簡介171171

Page 172: 驚濤駭浪!台灣軟體業的險境

Agile2011 Keynote 1Agile2011 Keynote 1

Dr. Fredrickson researches on how Dr. Fredrickson researches on how POSITIVE EMOTIONS help humans POSITIVE EMOTIONS help humans thrive and grow. Experiencing thrive and grow. Experiencing positive motions in a 3-to-1 ratio with positive motions in a 3-to-1 ratio with negative ones leads people to a negative ones leads people to a tipping point beyond which they tipping point beyond which they naturally become more resilient to naturally become more resilient to adversity and lead more agile, adversity and lead more agile, vibrant lives.vibrant lives.

172172

Page 173: 驚濤駭浪!台灣軟體業的險境

Agile 2011 Keynote 2Agile 2011 Keynote 2

Henney claims that CODE is the Henney claims that CODE is the definition of the software, the definition of the software, the realizer of business value, and the realizer of business value, and the expression of understanding. In a expression of understanding. In a broader sense, CODE refers to a set broader sense, CODE refers to a set of conventions by which a group of of conventions by which a group of people will govern themselves.people will govern themselves.

173173

Page 174: 驚濤駭浪!台灣軟體業的險境

Agile 2011 Keynote 3Agile 2011 Keynote 3

Rising discusses the power of “agile Rising discusses the power of “agile mindset” that equates failure and mindset” that equates failure and problems with opportunities for problems with opportunities for learning, that believes that we can all learning, that believes that we can all improve over time, and that our improve over time, and that our abilities are not fixed but evolve with abilities are not fixed but evolve with effort. This mindset helps creativity effort. This mindset helps creativity and collaboration in and out of the and collaboration in and out of the workplace.workplace.

174174

Page 175: 驚濤駭浪!台灣軟體業的險境

Agile Method Agile Method 重視點重視點1)1) 重視個人及互動 重視個人及互動 valuesvalues Individual and Individual and

interactions interactions overover 超過程序及工具 超過程序及工具 processes and tools.processes and tools.2)2) 重視可用軟體 重視可用軟體 values values Working software Working software

overover 超過完整文件 超過完整文件 comprehensive comprehensive documentation.documentation.

3)3) 重視客戶合作 重視客戶合作 values values Customer Customer collaboratcollaboration ion overover

超過合約談判 超過合約談判 contract negotiation.contract negotiation.4)4) 重視因應變動 重視因應變動 values values Responding to Responding to

change change overover 超過遵循計畫 超過遵循計畫 following a following a plan.plan.

175175

Page 176: 驚濤駭浪!台灣軟體業的險境

下面,先解釋七個基本觀念下面,先解釋七個基本觀念再以這些觀念建構出以溝通周期為基礎的再以這些觀念建構出以溝通周期為基礎的

測 試 帶 動 法測 試 帶 動 法

陳教授提倡的 陳教授提倡的 myAgilemyAgile 即是一套 即是一套 具體可行的 測試帶動法具體可行的 測試帶動法

176176

Page 177: 驚濤駭浪!台灣軟體業的險境

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)177177

Page 178: 驚濤駭浪!台灣軟體業的險境

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

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

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

178178

Page 179: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

Page 180: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

180180

Page 181: 驚濤駭浪!台灣軟體業的險境

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 , ,

效果並效果並不好不好 ) ) 181181

效果

Page 182: 驚濤駭浪!台灣軟體業的險境

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

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

182182

Page 183: 驚濤駭浪!台灣軟體業的險境

pair programming studiespair programming studies

after adjusting, pairs produced code 15%more slowly than individuals...

reference: http://qconsf.com/sf2008/file?path=/qcon-sanfran-2008/slides//NealFord_10_Ways_to_Improve_Your_Code.pdf

Page 184: 驚濤駭浪!台灣軟體業的險境

pair programming studiespair programming studies

...with 15% fewer defects

reference: http://qconsf.com/sf2008/file?path=/qcon-sanfran-2008/slides//NealFord_10_Ways_to_Improve_Your_Code.pdf

Page 185: 驚濤駭浪!台灣軟體業的險境

Reviewer vs. Reviewer vs. SupporterSupporter一般 一般 ReviewerReviewer 從不同角度思考從不同角度思考 ,, 負責即時查核負責即時查核driver driver 工作工作 ,, 其工作量比 其工作量比 driverdriver 少很多少很多 . .

故可改為故可改為 supporter.supporter. 他除了以當他除了以當 ReviewerReviewer為為主外主外 ,, 還負責還負責 :: 查查 APIAPI文件文件 ,, 局部程式的最佳局部程式的最佳化化 ,, 測試不同測試不同 APIAPI 或不同演算法或不同演算法 ..

SupporterSupporter 須具備須具備 ::

1)1)熟練的熟練的 Programming skillProgramming skill 及 及 domain domain knowledgeknowledge 才能快速回應才能快速回應 driverdriver

2)2) 能隨時關注能隨時關注 driverdriver狀況狀況 ,, 快速切換思考快速切換思考 (( 不不能像能像 driverdriver般般 ,, 陷入深思陷入深思 ))

[[ 中央大學碩士 王鈺歆 中央大學碩士 王鈺歆 (Lala)](Lala)]185185

Page 186: 驚濤駭浪!台灣軟體業的險境

Rotation in Pair ProgrammingRotation in Pair Programming

Rotation (Rotation (輪調輪調 ) ) 在 在 Pair Pair Programming Programming 中很重要 中很重要 例如本次例如本次iteration iteration 張三及李四一組 下 張三及李四一組 下次次iteration iteration 張三及王五一組張三及王五一組

這使各人知識分散至其他所有人 這使各人知識分散至其他所有人 可減低因人員流動而造成的知識流失可減低因人員流動而造成的知識流失 極有助於軟體演化極有助於軟體演化 ((即軟體不斷維修即軟體不斷維修 ))

186186

Page 187: 驚濤駭浪!台灣軟體業的險境

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

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

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

187187

Page 188: 驚濤駭浪!台灣軟體業的險境

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改了,改了,則則要重做要重做測試碼測試碼

188188

Page 189: 驚濤駭浪!台灣軟體業的險境

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

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

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

189189

Page 190: 驚濤駭浪!台灣軟體業的險境

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 的細節,所以很容易整合的細節,所以很容易整合

190190

Page 191: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

(( 它叫它叫 test stub)test stub)191191

Page 192: 驚濤駭浪!台灣軟體業的險境

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) 了了

192192

Page 193: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

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

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

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

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

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

Page 194: 驚濤駭浪!台灣軟體業的險境

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

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

194194

Page 195: 驚濤駭浪!台灣軟體業的險境

6. Iteration 6. Iteration ((回合回合 ) ) 規劃規劃 由開發者主導的會議 由開發者主導的會議 (( 駐點使用專家必駐點使用專家必參加參加 )) 會中決定會中決定””派工及時程派工及時程”” (( 工序四工序四 ))

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

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

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

195195

Page 196: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

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

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

Page 197: 驚濤駭浪!台灣軟體業的險境

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

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

197197

Page 198: 驚濤駭浪!台灣軟體業的險境

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

198198

Page 199: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

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

Page 200: 驚濤駭浪!台灣軟體業的險境

測試帶動的開發方法 測試帶動的開發方法 (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

200200

Page 201: 驚濤駭浪!台灣軟體業的險境

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

某愛爾蘭軟體公司報導這種綿密測試,已使傳統軟工整某愛爾蘭軟體公司報導這種綿密測試,已使傳統軟工整合測試階段,幾消失無蹤,這得力於合測試階段,幾消失無蹤,這得力於 O-OO-O,藉繼承及組,藉繼承及組合旣有合旣有 classclass,嚴謹建構新的,嚴謹建構新的 classclass

而且,本方法的專案不可能失敗,何也而且,本方法的專案不可能失敗,何也 ?? 失敗專案乃是客戶在付出大筆金錢後,得不到預期效果,失敗專案乃是客戶在付出大筆金錢後,得不到預期效果,

而失望、生氣、冒煙 而失望、生氣、冒煙 ……

而本方法兩個月後就要出貨,如客戶不滿意該貨,因只而本方法兩個月後就要出貨,如客戶不滿意該貨,因只付出第一期款小錢,通常自認倒霉了事,不致冒煙付出第一期款小錢,通常自認倒霉了事,不致冒煙

201201

Page 202: 驚濤駭浪!台灣軟體業的險境

以上介紹 以上介紹 團隊溝通 團隊溝通 也就是國外談的敏捷方法也就是國外談的敏捷方法

以下簡短談談 以下簡短談談 個人思考及創意 個人思考及創意 這是陳教授補充敏捷方法的地方這是陳教授補充敏捷方法的地方 **

* * 有趣的是有趣的是 ,Cockburn ,Cockburn 以攀岩喻軟體開發以攀岩喻軟體開發時時 ,, 同樣引用同樣引用 CsikszentmihalyiCsikszentmihalyi的的 flow(flow(下頁下頁 ) )

202202

Page 203: 驚濤駭浪!台灣軟體業的險境

專注的個人思考專注的個人思考

Csikszentmihalyi Csikszentmihalyi [tʃɪ:k'sɛntmiha:ɪi] *[tʃɪ:k'sɛntmiha:ɪi] *

是創意研究大師,他說是創意研究大師,他說 :: 創意湧現 創意湧現 (Flow) (Flow) 產生優質工作產生優質工作 (good (good work)work)

此時工作極為專注,意志力集中,用心、堅持、此時工作極為專注,意志力集中,用心、堅持、獨持,獨持,思考思考深且密深且密,將開發者個人思考推至,將開發者個人思考推至極限 極限 (extreme)(extreme)

* * Csikszentmihalyi, Creativity: From Flow Experience to Csikszentmihalyi, Creativity: From Flow Experience to

Good Work, Good Work, 中大創意研討會中大創意研討會 , Nov. 29, 2006., Nov. 29, 2006.203203

Page 204: 驚濤駭浪!台灣軟體業的險境

促成創意湧現 的三項條件促成創意湧現 的三項條件 1. 1. 全程各步驟目標明確 全程各步驟目標明確 Clear Clear goalsgoals in in

every step of the way.every step of the way.

2. 2. 行動有立即回饋 行動有立即回饋 Immediate Immediate feedback feedback to one’s action. to one’s action. (1)(2)(1)(2) 正是測試正是測試帶動法的溝通週期帶動法的溝通週期

3. 3. 挑戰與技能的平衡 挑戰與技能的平衡 ((下圖下圖 ) ) BalanceBalance between challenges and skills. between challenges and skills. (3)(3)使開發使開發者不斷長進者不斷長進 ((某員工某員工由由 A,B,C,D A,B,C,D 至 至 E)E) ,,

止於至善 止於至善 E (flow, extremeE (flow, extreme))

204204

Page 205: 驚濤駭浪!台灣軟體業的險境

高低

挑戰

技能

A B

C

D E焦慮

無聊

創意湧現創意湧現

205205

Page 206: 驚濤駭浪!台灣軟體業的險境

優質工作 優質工作 (Good work)(Good work)

生產性活動生產性活動 (productive activity):(productive activity):

1.1.滿足工藝水準 滿足工藝水準 (( 所謂所謂 craftmanship)craftmanship) (meet the requirements of the (meet the requirements of the craft)craft)

2.2.有益社會,且獲重視有益社會,且獲重視 (socially useful and valued)(socially useful and valued)

3.3.本身獲益本身獲益 (personally rewarding)(personally rewarding)

206206

Page 207: 驚濤駭浪!台灣軟體業的險境

創意湧現 經驗一創意湧現 經驗一

專注幾個點 完全專注、全面投入專注幾個點 完全專注、全面投入Attention is focused on a limited stimulus field.Attention is focused on a limited stimulus field.Full concentration and complete involvement.Full concentration and complete involvement.

例子例子 :: 某西洋棋士說某西洋棋士說 : : 專注有如呼吸,你從沒專注有如呼吸,你從沒想到它 想到它 (Concentration is like (Concentration is like breathing: you never think of breathing: you never think of it)it) ;專注時,就算屋頂塌了,只要沒打到;專注時,就算屋頂塌了,只要沒打到你,你甚至沒查覺到你,你甚至沒查覺到 !!

207207

Page 208: 驚濤駭浪!台灣軟體業的險境

創意湧現 經驗二創意湧現 經驗二

不再擔心失敗了不再擔心失敗了There is freedom from worry about failure.There is freedom from worry about failure.

例子例子 :: 某自行車選手說某自行車選手說 : :

你覺得你覺得 .... 沒有東西可阻擋你。你已準備沒有東西可阻擋你。你已準備好應付任何事情。不怕任何可能發生的事,好應付任何事情。不怕任何可能發生的事,真令人振奮!真令人振奮!

208208

Page 209: 驚濤駭浪!台灣軟體業的險境

創意湧現 經驗三創意湧現 經驗三

對時間的感覺扭曲了對時間的感覺扭曲了Sense of time distorted.Sense of time distorted.

例子例子 :: 某舞者說某舞者說 : : 兩件事發生兩件事發生……

(1)(1) 練舞後,時間似乎過得很快,時已練舞後,時間似乎過得很快,時已凌晨一時,我說凌晨一時,我說””喔,幾分鐘前才晚上八喔,幾分鐘前才晚上八點 點 (2) (2) 可是,當我練舞時,時間好像可是,當我練舞時,時間好像過得比真正時間來得慢過得比真正時間來得慢

209209

Page 210: 驚濤駭浪!台灣軟體業的險境

神清氣爽 才能專注神清氣爽 才能專注 極限開發法有一實務:極限開發法有一實務:不可加班 不可加班 (No (No

overtime) *overtime) *,,饒富啟發性饒富啟發性 :: 創意工作要精神飽滿、愉快,才能工作專注創意工作要精神飽滿、愉快,才能工作專注,創意湧現,才獲高品質作品;如加班、熬,創意湧現,才獲高品質作品;如加班、熬夜,次日精神不濟,品質危矣!進而,週休夜,次日精神不濟,品質危矣!進而,週休二日應徜佯青山綠水或悠遊藝文活動,或二日應徜佯青山綠水或悠遊藝文活動,或好好好睡到飽好睡到飽,充份休息,才能神清氣爽、從容,充份休息,才能神清氣爽、從容自若自若

* * 但若敷衍應付瞎忙八小時,則不適用此但若敷衍應付瞎忙八小時,則不適用此 ! !

新新 XPXP 準則叫它準則叫它 sustainablePace sustainablePace 可持久的步可持久的步伐伐 210210

Page 211: 驚濤駭浪!台灣軟體業的險境

創意的重要性創意的重要性

世界有可能從 世界有可能從 資訊時代 資訊時代

進入進入 觀念時代觀念時代

這時 這時 創意創意 將是最重要的 將是最重要的

211211

Page 212: 驚濤駭浪!台灣軟體業的險境

創意學創意學 **國內學者賴聲川 以舞台劇國內學者賴聲川 以舞台劇 **** 創作經驗 創作經驗 研究創意學 他認為創意來自研究創意學 他認為創意來自 ::

1) 1) 深刻人生經驗帶來的洞察力深刻人生經驗帶來的洞察力 這方面叫這方面叫 :: 靈感 想像力 靈感 想像力 是感性工作是感性工作2) 2) 工程方法工程方法 ((即軟工即軟工 )) 的認真執行 的認真執行 並以適當形式呈現並以適當形式呈現 這方面叫這方面叫 :: 製作 組合力 製作 組合力 是理性工作是理性工作* * 賴聲川賴聲川 ,, 賴聲川的創意學賴聲川的創意學 ,, 天下雜誌天下雜誌 ,2006.,2006.

**** 舞台劇與軟體並非不相関,軟體常用的 舞台劇與軟體並非不相関,軟體常用的 scenario scenario 即是即是舞台劇場舞台劇場景景

212212

Page 213: 驚濤駭浪!台灣軟體業的險境

實例實例 某舞台劇將三個靈感串成故事某舞台劇將三個靈感串成故事 ::

1) 1) 台大醫院五號垂死病人講他的故事台大醫院五號垂死病人講他的故事 2) 2) 他去法國鄉下古堡看到一幅畫 他去法國鄉下古堡看到一幅畫 畫中有中國女子畫中有中國女子 3) 3) 他去中國上海找尋畫中女子他去中國上海找尋畫中女子

213213

Page 214: 驚濤駭浪!台灣軟體業的險境

實例 實例 (Cont.)(Cont.)

上面第二個靈感來自上面第二個靈感來自 ::

某次賴聲川到羅馬看畫展 某次賴聲川到羅馬看畫展 看到一幅畫 畫中有畫 看到一幅畫 畫中有畫 他當時記下小扎他當時記下小扎 ::

故事中可套著故事故事中可套著故事

這就是他的一個 這就是他的一個 人生經驗人生經驗

214214

Page 215: 驚濤駭浪!台灣軟體業的險境

實例 實例 (Cont.)(Cont.)

各個人生經驗已分別儲存成腦海的檔案各個人生經驗已分別儲存成腦海的檔案 創作時 心自動找檔案串在一起 形成創意創作時 心自動找檔案串在一起 形成創意 但要慎防但要慎防 : : 心受習性蒙敝 而無法串出創心受習性蒙敝 而無法串出創意意

戲劇是人類 戲劇是人類 抽象思考 抽象思考 的精華的精華 [[ 飛碟電台 飛碟電台 20092009 春春

節節 ] ] 而抽象思考正是軟工的首要工作 值得而抽象思考正是軟工的首要工作 值得深思深思

215215

Page 216: 驚濤駭浪!台灣軟體業的險境

軟體業例子軟體業例子 1) 1) 小王某次看到某網頁呈現方式 小王某次看到某網頁呈現方式 日後用到他的作品日後用到他的作品 2) 2) 老李讀到某論文的演算法 老李讀到某論文的演算法 日後用到他的設計日後用到他的設計 3) 3) 小林上網搜尋 找到某個小林上網搜尋 找到某個 API API (application program interface) (application program interface)

日後他的程式呼叫之日後他的程式呼叫之上述皆基於各人的上述皆基於各人的人生經驗人生經驗

216216

Page 217: 驚濤駭浪!台灣軟體業的險境

人生經驗 例子人生經驗 例子 1)1) 某人參加觀光團 走馬看花 號稱游歷多某人參加觀光團 走馬看花 號稱游歷多國還留影為證 但毫無體驗人生經驗不深刻國還留影為證 但毫無體驗人生經驗不深刻

2)2) 某學生很會應付考試 修課證照無數 但某學生很會應付考試 修課證照無數 但無深入理解體會 無法在工作上用的好無深入理解體會 無法在工作上用的好

3) 3) 因無英文課 某研究生自高三後很少唸因無英文課 某研究生自高三後很少唸英文 可見英文只是學分 與人生無關英文 可見英文只是學分 與人生無關

4) 4) 某人喜歡聽英文歌 很投入 所以聽懂某人喜歡聽英文歌 很投入 所以聽懂歌詞且受感動 這就有了人生經驗 歌詞且受感動 這就有了人生經驗

217217

Page 218: 驚濤駭浪!台灣軟體業的險境

方法方法218218

Page 219: 驚濤駭浪!台灣軟體業的險境

試行團隊試行團隊 國內軟體公司如有決心國內軟體公司如有決心 ** 、意志力、專注力,、意志力、專注力,可組本 可組本 myAgile myAgile 方法試行團隊如下方法試行團隊如下 ::

1. 1. 一名駐點使用專家一名駐點使用專家 2. 2. 四名軟體工程師,形成兩組四名軟體工程師,形成兩組 (2 pairs)(2 pairs) 3. 3. 二名兼職工讀生二名兼職工讀生依前述辦公室佈置,依前述辦公室佈置, runrun下面 下面 myAgile myAgile 方法方法

* * 依陳教授顧問經驗,老闆有心改變採用新方法,而開發者雖依陳教授顧問經驗,老闆有心改變採用新方法,而開發者雖然認真聽課,但工作時還是用自己熟悉有把握的舊方法,沒然認真聽課,但工作時還是用自己熟悉有把握的舊方法,沒有有專注力專注力及及決心 決心 拋棄過去的做法拋棄過去的做法

219219

Page 220: 驚濤駭浪!台灣軟體業的險境

myAgile myAgile 敏捷方法敏捷方法 myAgile myAgile 係陳教授運用上述觀念,補充極限開發法 係陳教授運用上述觀念,補充極限開發法

(Extreme Programming, XP)(Extreme Programming, XP) 所得所得 是高度理想性做是高度理想性做法,須與業界現行做法磨合,逐步改善 法,須與業界現行做法磨合,逐步改善 - - 不要不要妄求一次到位妄求一次到位

這方法適用十人以內這方法適用十人以內 ((含含 )) 小團隊,小團隊, 而全世界很多優質軟體,是小團隊完成的而全世界很多優質軟體,是小團隊完成的

又,因為大型團隊又,因為大型團隊 ((如如 100100人人 )) 會做組織細分會做組織細分 (organizational breakdown)(organizational breakdown) ,, 所以其底層也是小團隊所以其底層也是小團隊 ((如如 1010個個 1010人團隊人團隊 )) ,, 故亦適用之,其上層則需其他管理方法故亦適用之,其上層則需其他管理方法

220220

Page 221: 驚濤駭浪!台灣軟體業的險境

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)

221221

Page 222: 驚濤駭浪!台灣軟體業的險境

誠摯的叮嚀誠摯的叮嚀myAgilemyAgile 十一道工序都 十一道工序都 似易實難似易實難,,因為其理念與台灣現行方法大不相同,因為其理念與台灣現行方法大不相同,要扭轉思維、換腦袋,超難!要扭轉思維、換腦袋,超難!尤其,若圖反敗為勝,立足國際,尤其,若圖反敗為勝,立足國際, 更須用心做好,是難上加難!!更須用心做好,是難上加難!!我們絕非嘩眾取寵,已針對每道工序,設計我們絕非嘩眾取寵,已針對每道工序,設計實習課程,公佈於苗圃網站,敬供參考實習課程,公佈於苗圃網站,敬供參考

222222

Page 223: 驚濤駭浪!台灣軟體業的險境

myAgile myAgile 適用範圍適用範圍 本法適用本法適用 Java,C++,C#Java,C++,C#等傳统高階語言等傳统高階語言 不不適用網路時代更適用網路時代更 高階語言 如標記語言 高階語言 如標記語言(mark-up language) (mark-up language) 寫出的 寫出的ontology, agentontology, agent

精準的說精準的說 :C/C++:C/C++思維較舊思維較舊 ,C#,C#仿仿Java;JavaJava;Java具具 O-OO-O思維思維 ,, 並擴展至並擴展至agent(agent(語意網路語意網路 semanticWeb)semanticWeb)思維思維 --計概應直接教計概應直接教 Java!Java!

223223

Page 224: 驚濤駭浪!台灣軟體業的險境

00.. 探索需求探索需求 * * (Exploring requirements)(Exploring requirements)

客戶公司兩位資深人員做需求分析如下客戶公司兩位資深人員做需求分析如下 ::1.1.列出使用者名單,列出使用者名單, 如電梯資訊裝置案區分如電梯資訊裝置案區分 :: 友善友善 (( 如殘友如殘友 ) ) 不管不管 (( 如文盲如文盲 ) ) 不友善不友善 (( 如如強盜強盜 ))

2.2.選取使用者樣本選取使用者樣本3.3. 觀察、訪談觀察、訪談 (2)(2) ,與之開會,與之開會4.4. 開會要充份討論 開會要充份討論 - - 腦力激盪腦力激盪 (( 用左腦語文用左腦語文 )) 腦力繪圖腦力繪圖 (( 用右腦視覺用右腦視覺 ) ) 以增加想法;以增加想法; 減少語意曖昧、投票過濾 以刪減想法減少語意曖昧、投票過濾 以刪減想法* Gause and Weinberg, * Gause and Weinberg, Exploring requirementsExploring requirements,, 中譯本 中譯本 從需求到設計從需求到設計 , 2007., 2007.

224224

Page 225: 驚濤駭浪!台灣軟體業的險境

00.. 探索需求 探索需求 (Cont.)(Cont.)

5.5. 會後得到會後得到功能清單,及相關特性、限制、偏好功能清單,及相關特性、限制、偏好例如例如 :: 電梯資訊裝置案電梯資訊裝置案功能 功能 feature (feature (如如 :: 語音提示樓層語音提示樓層 ))特性 特性 attribute (attribute (如如 :: 快速快速提示上述資訊提示上述資訊 ))限制 限制 constraint(constraint(如如 :: 獲得該資訊獲得該資訊要少於要少於 1.751.75秒秒 ))偏好 偏好 preference(preference(如如 :: 上述上述少於 少於 11 秒價值一百萬元,秒價值一百萬元,

也許使用者不喜歡語音也許使用者不喜歡語音提提示太快示太快 少於 少於 0.050.05秒價值二十萬元秒價值二十萬元 ))

6.6.功能分次開發後,做喜好度調查功能分次開發後,做喜好度調查

225225

Page 226: 驚濤駭浪!台灣軟體業的險境

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 (圖二圖二 )*)* ,,離開系統離開系統 * * 在在白板白板畫出各圖畫出各圖

226226

Page 227: 驚濤駭浪!台灣軟體業的險境

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

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

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

227227

Page 228: 驚濤駭浪!台灣軟體業的險境

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.

228228

Page 229: 驚濤駭浪!台灣軟體業的險境

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

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

Page 230: 驚濤駭浪!台灣軟體業的險境

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

230230

Page 231: 驚濤駭浪!台灣軟體業的險境

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殺殺 屬於土匪 屬於土匪

231231

Page 232: 驚濤駭浪!台灣軟體業的險境

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

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

classclass軍人軍人 {..}; {..}; 軍人 張三軍人 張三 ;;

classclass土匪土匪 {..{..殺殺 (( 武器武器 ,, 被殺者被殺者 ))};};土匪 李四土匪 李四 ;;

classclass醫生醫生 {..{..殺何處 殺何處 ( )};( )}; 醫生 王五 醫生 王五 ;; ..........

李四李四 .. 殺殺 (( 刀刀 , , 李四李四 ); );

…… ……

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

232232

Page 233: 驚濤駭浪!台灣軟體業的險境

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

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

User Story (User Story (功能功能 )) 是是 :: 張三殺人張三殺人Scenario Scenario 是是 : : 張三要李四用張三要李四用刀刀殺了殺了他自己他自己Use Case Use Case 是是 : (: ( 這文件併入架構設計文件這文件併入架構設計文件 ))

張三要李四用張三要李四用刀刀殺了殺了他自己他自己 李四問王五殺何處李四問王五殺何處

233233

Page 234: 驚濤駭浪!台灣軟體業的險境

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

* 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.234234

Page 235: 驚濤駭浪!台灣軟體業的險境

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

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

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

235235

Page 236: 驚濤駭浪!台灣軟體業的險境

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

236236

Page 237: 驚濤駭浪!台灣軟體業的險境

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 237237

Page 238: 驚濤駭浪!台灣軟體業的險境

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

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% 成功!成功!

238238

Page 239: 驚濤駭浪!台灣軟體業的險境

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

軟體必須精準反映領域知識軟體必須精準反映領域知識 (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 貸貸239239

Page 240: 驚濤駭浪!台灣軟體業的險境

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

Class interface and method Class interface and method interface interface

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

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

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

240240

Page 241: 驚濤駭浪!台灣軟體業的險境

標頭標頭 (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)無甚意義了無甚意義了241241

Page 242: 驚濤駭浪!台灣軟體業的險境

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

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

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

242242

Page 243: 驚濤駭浪!台灣軟體業的險境

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

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

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

243243

Page 244: 驚濤駭浪!台灣軟體業的險境

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

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

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

Page 245: 驚濤駭浪!台灣軟體業的險境

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)

245245

Page 246: 驚濤駭浪!台灣軟體業的險境

/* 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 ( 最早存進來最早存進來 ) year09 mon11 day 23) year09 mon11 day 23

* 091123153040500.xml* 091123153040500.xml

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

* *

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

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

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

Page 247: 驚濤駭浪!台灣軟體業的險境

文件簡化文件簡化 上述 上述 1)scenario, 2)acceptance 1)scenario, 2)acceptance test case, 3) test case, 3) 架構設計 三種文件可簡架構設計 三種文件可簡化合一化合一 (( 如下頁如下頁 ))

此文件還可當 此文件還可當 4) 4) 維修指引維修指引(maintenance guide):(maintenance guide): 維修時依維修時依acceptance test caseacceptance test case執行軟體執行軟體,,可找可找到呼叫的 到呼叫的 methodmethod ,,再找到再找到 source code source code filefile 中該中該 methodmethod的的 headerheader及及 pseudo-pseudo-codecode ,,了解後才去修改了解後才去修改 source code source code

247247

Page 248: 驚濤駭浪!台灣軟體業的險境

同類 同類 accep. test cases accep. test cases 由簡單而複雜 存同一檔案 由簡單而複雜 存同一檔案

最簡單最簡單 casecase 如下如下 ::

method 1 (source code file)method 1 (source code file)

method 2 (source code file)method 2 (source code file)

最複雜最複雜 casecase 如下如下 ::

method 1 (source code file)method 1 (source code file)

method 11 (source code file)method 11 (source code file)

method (source code file)method (source code file)

method 12 (source code file)method 12 (source code file)

method 2 (source code file)method 2 (source code file)248248

Page 249: 驚濤駭浪!台灣軟體業的險境

傳統設計方式傳統設計方式 架構師架構師 (architect)(architect) 花一段時間,完成 花一段時間,完成 class diagramclass diagram ,用 ,用 unified unified modeling language (UML) modeling language (UML) 表示,用 表示,用 Rational Rose Rational Rose 製出文件,局部製出文件,局部組成關組成關係係如下圖如下圖 :: (( 輪胎是組成車子的一部分輪胎是組成車子的一部分 ))

車子

輪胎249249

Page 250: 驚濤駭浪!台灣軟體業的險境

傳統設計方式 傳統設計方式 (Cont.)(Cont.)

如果去檢查程式,理應找到如果去檢查程式,理應找到 :: class class 輪胎輪胎 {…}{…}

classclass 車子車子 {{ 輪胎 右前輪輪胎 右前輪 =new =new 輪胎輪胎 (); (); …} …}

以對應上面的設計,但 以對應上面的設計,但 真相是真相是 ::

那 那 class diagram class diagram 只是架構師個人構想,只是架構師個人構想,與程式師想法不同,與程式師想法不同,文件淪為 乩童道具文件淪為 乩童道具 !!

基本動作已不確實,較複雜的 基本動作已不確實,較複雜的 design pattern, component design pattern, component 如何落如何落實實 ??

250250

Page 251: 驚濤駭浪!台灣軟體業的險境

例子例子 ::架構師畫的架構師畫的 class class diagramdiagram

吉普車繼承吉普車繼承 (inherite)(inherite)車子車子 ;1;1 人員使用人員使用 (use)1(use)1吉普車吉普車

人員 吉普車

車子輪胎

1 1

251251

Page 252: 驚濤駭浪!台灣軟體業的險境

傳統設計方式 傳統設計方式 (Cont.)(Cont.)class class 吉普車 吉普車 extends extends 車子 車子 { the extended data and methods}{ the extended data and methods}

class class 車子 車子 {{ 輪胎 右前輪輪胎 右前輪 =new =new 輪胎輪胎 () …; int () …; int 哩程哩程 ; ;

public boolean public boolean 發動 發動 (… ) {…} }(… ) {…} }

class class 輪胎 輪胎 {…}{…}class class 人員 人員 {private boolean {private boolean 車子狀況車子狀況 ;; public void public void 駕車 駕車 (( 吉普車 吉普車 車號車號 ) ) {/*{/* 發動該車發動該車 **// 車子狀況 車子狀況 = = 車車號號 .. 發動 發動 (… ); … }(… ); … }小小張張 =new =new 人員人員 ();();老老李李 =new =new 人員人員 (); (); 吉普車 車吉普車 車 1 = new 1 = new 吉普車吉普車 ( );( );吉普車 車吉普車 車 2 = new 2 = new 吉普車吉普車 ( );( );小小張張 .. 駕車 駕車 ((車車 1) ;1) ;老老李李 .. 駕車 駕車 ((車車 2)2) 依物件互動依物件互動,, class diagram class diagram 只看到只看到人員、吉普車人員、吉普車兩個 兩個

classesclasses 並非架構師畫的四個 並非架構師畫的四個 classes:classes: 人員、吉普車 人員、吉普車 、、車子、輪胎車子、輪胎

252252

Page 253: 驚濤駭浪!台灣軟體業的險境

傳統設計方式 傳統設計方式 (Cont.)(Cont.)

真相是真相是 ::在開發在開發吉普車時,搜尋標頭才發現可繼吉普車時,搜尋標頭才發現可繼承之前的車子承之前的車子 ;; 而之前開發車子時,利用組成而之前開發車子時,利用組成關係,重用更早之前開發的輪胎關係,重用更早之前開發的輪胎 ;; 之後之後用逆向用逆向工程工具則會看到工程工具則會看到四個 四個 classesclasses

所以所以 ,, 執行執行 O-OO-O 設計時設計時 ,, 一開始只有一開始只有 useuse關係關係 ,,接著接著 ,, 才出現才出現 inheritance, aggregationinheritance, aggregation 關關係係 ,, 進一步進一步 ,, 一些一些 classesclasses 可套用可套用 design design patternpattern

253253

Page 254: 驚濤駭浪!台灣軟體業的險境

傳統設計方式 傳統設計方式 (Cont.)(Cont.)

例子例子 :: 兩個軟體工程師互誇兩個軟體工程師互誇 ::

小王小王 : : 我的我的 O-O O-O 程式有三層繼程式有三層繼承承 小林小林 : : 我的有四層我的有四層 !!

誰應加薪誰應加薪 ?? 真相真相 : : 通常軟體使用一段時間通常軟體使用一段時間 ((如半年如半年 ))後,客户才會要求延伸原軟體後,客户才會要求延伸原軟體 ((即繼即繼承承 ))

當然,重用當然,重用時時修改旣有軟體,會有繼修改旣有軟體,會有繼承,承,但不至於三、四層但不至於三、四層

254254

Page 255: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

255255

Page 256: 驚濤駭浪!台灣軟體業的險境

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

256256

Page 257: 驚濤駭浪!台灣軟體業的險境

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),已無開發、維修之分,已無開發、維修之分257257

Page 258: 驚濤駭浪!台灣軟體業的險境

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

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

回合 (派工及時程 )

約三週

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

增量 1 增量 2

258258

Page 259: 驚濤駭浪!台灣軟體業的險境

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)

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

259259

Page 260: 驚濤駭浪!台灣軟體業的險境

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)); }}

260260

Page 261: 驚濤駭浪!台灣軟體業的險境

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() {………………

  261261

Page 262: 驚濤駭浪!台灣軟體業的險境

More on Test CasesMore on Test Cases

O-O O-O 程式呼叫為程式呼叫為 :: o2 = o1.m1(p1,p2) *o2 = o1.m1(p1,p2) *

本法找出不同 本法找出不同 input parameters input parameters (p1,p2), output object (o2)(p1,p2), output object (o2) 的組的組合合 ,, 每一組合為一待測試的狀況每一組合為一待測試的狀況 , , 即 即 test test case case

但但 o1 (object 1) o1 (object 1) 內也有多種組合內也有多種組合 ,, 這需這需setter setter 設定 設定 object object 內 內 data valuedata value

** 嚴格講嚴格講 , , 呼叫時傳入 呼叫時傳入 arguments, method arguments, method 本身則寫 本身則寫 parametersparameters

262262

Page 263: 驚濤駭浪!台灣軟體業的險境

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

263263

Page 264: 驚濤駭浪!台灣軟體業的險境

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

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

Page 265: 驚濤駭浪!台灣軟體業的險境

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.265265

Page 266: 驚濤駭浪!台灣軟體業的險境

266266

小英 10.0 8.3 7.4 小明 小華

阿偉 20.0

14.2 15.0 小莉

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

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

Page 267: 驚濤駭浪!台灣軟體業的險境

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 268: 驚濤駭浪!台灣軟體業的險境

設計草圖轉成設計草圖轉成Java data structureJava data structure

protected HashMap protected HashMap

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

protected Houses protected Houses 小明小明 ;;

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

268268

Page 269: 驚濤駭浪!台灣軟體業的險境

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

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

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

269269

Page 270: 驚濤駭浪!台灣軟體業的險境

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)

270270

Page 271: 驚濤駭浪!台灣軟體業的險境

設計草圖設計草圖

271271

Page 272: 驚濤駭浪!台灣軟體業的險境

演算法設計一演算法設計一

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 skipBlanksend skipBlanks

272272

Page 273: 驚濤駭浪!台灣軟體業的險境

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 of getTheTokensend of getTheTokens

273273

Page 274: 驚濤駭浪!台灣軟體業的險境

演算法設計二演算法設計二 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 skipBlankend skipBlank   

     

274274

Page 275: 驚濤駭浪!台灣軟體業的險境

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 of getTheTokensend of getTheTokens275275

Page 276: 驚濤駭浪!台灣軟體業的險境

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

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

1. 1. 設計草圖 設計草圖 (design sketch) (design sketch) 寫在白板或白紙,短暫儲存 寫在白板或白紙,短暫儲存 (( 目前軟工環境不佳,圖難與程式融合於電子檔目前軟工環境不佳,圖難與程式融合於電子檔 ))

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

276276

Page 277: 驚濤駭浪!台灣軟體業的險境

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

277277

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 278: 驚濤駭浪!台灣軟體業的險境

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 ,, 可充份討論,品質較佳可充份討論,品質較佳

278278

Page 279: 驚濤駭浪!台灣軟體業的險境

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

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

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

279279

Page 280: 驚濤駭浪!台灣軟體業的險境

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 ,, 並換到它的第一個位置並換到它的第一個位置

280280

Page 281: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

281281

Page 282: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

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

boolean buy (Tables hisTable) boolean buy (Tables hisTable) 為不同 為不同 methodsmethods

282282

Page 283: 驚濤駭浪!台灣軟體業的險境

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

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

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

283283

測驗一 : WT0820 Oleogg Crosmioft

測驗二 : TW2008 Google Microsoft

Page 284: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

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

284284

Page 285: 驚濤駭浪!台灣軟體業的險境

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

285285

Page 286: 驚濤駭浪!台灣軟體業的險境

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 <= ( a<=1 means “set a to 1”)call null <= ( a<=1 means “set a to 1”)

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

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

286286

Page 287: 驚濤駭浪!台灣軟體業的險境

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 ,,這就是 這就是 演算法設計 除錯演算法設計 除錯

287287

Page 288: 驚濤駭浪!台灣軟體業的險境

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!

288288

Page 289: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

289289

Page 290: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

290290

Page 291: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

291291

Page 292: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

292292

Page 293: 驚濤駭浪!台灣軟體業的險境

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

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

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

293293

Page 294: 驚濤駭浪!台灣軟體業的險境

例子例子單元單元 : : 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

294294

Page 295: 驚濤駭浪!台灣軟體業的險境

例子 例子 (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) 行程式 不可思議行程式 不可思議 !!295295

Page 296: 驚濤駭浪!台灣軟體業的險境

296296

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 297: 驚濤駭浪!台灣軟體業的險境

297297

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 of } // end of successorsuccessor

Page 298: 驚濤駭浪!台灣軟體業的險境

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 的標頭的標頭 ((當當然有些寫不好然有些寫不好 )) ,正確呼叫使用,並與全球同好討,正確呼叫使用,並與全球同好討論論

298298

Page 299: 驚濤駭浪!台灣軟體業的險境

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

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

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

299299

Page 300: 驚濤駭浪!台灣軟體業的險境

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)

300300

Page 301: 驚濤駭浪!台灣軟體業的險境

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

** 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. toHousesList <=1. toHousesList <= getToHouses(theHouse) getToHouses(theHouse) 如小華 阿偉 如小華 阿偉 O(n)O(n)

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

3. fromHousesList <=3. fromHousesList <= getfromHouses(theHouse) getfromHouses(theHouse) 例 小明 例 小明 O(nO(n22))

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

301301

Page 302: 驚濤駭浪!台灣軟體業的險境

演算法設計例子演算法設計例子 (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

302302

Page 303: 驚濤駭浪!台灣軟體業的險境

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

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

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

303303

Page 304: 驚濤駭浪!台灣軟體業的險境

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

* * 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 */

注意注意 :: 要凸顯虛擬碼 隱藏程式碼 以利閱讀要凸顯虛擬碼 隱藏程式碼 以利閱讀304304

Page 305: 驚濤駭浪!台灣軟體業的險境

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) 叫叫單元測試 單元測試

305305

Page 306: 驚濤駭浪!台灣軟體業的險境

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

306306

Page 307: 驚濤駭浪!台灣軟體業的險境

10. 10. 逆向工程 工具逆向工程 工具利用逆向工程 工具 如 利用逆向工程 工具 如 AgileJAgileJ需要時,可由程式碼需要時,可由程式碼 (source file(source file ;不含 ;不含 reused reused code) code)

動態產生 動態產生 class diagram, sequence diagram class diagram, sequence diagram 等文等文件,供了解軟體全貌、決定維修那個件,供了解軟體全貌、決定維修那個 classclass及檢查相及檢查相關關classesclasses

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

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

307307

Page 308: 驚濤駭浪!台灣軟體業的險境

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

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

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

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

308308

Page 309: 驚濤駭浪!台灣軟體業的險境

Class diagrams Class diagrams generated by toolgenerated by tool

309309

Page 310: 驚濤駭浪!台灣軟體業的險境

Sequence diagram Sequence diagram generated by tool generated by tool

310310

Page 311: 驚濤駭浪!台灣軟體業的險境

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) 民主溝通費時但品質高;獨裁快速但危險民主溝通費時但品質高;獨裁快速但危險311311

Page 312: 驚濤駭浪!台灣軟體業的險境

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

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

再讀 再讀 pseudo codepseudo code

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

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

312312

Page 313: 驚濤駭浪!台灣軟體業的險境

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

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

313313

Page 314: 驚濤駭浪!台灣軟體業的險境

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

陳教授授課敏捷方法一學期後陳教授授課敏捷方法一學期後 ,, 全班舉行全班舉行 開發郵局開發郵局 ATM ATM 模擬遊戲 模擬遊戲 各人接力說故事各人接力說故事 ,, 說明如何依說明如何依 myAgilemyAgile 開發開發

意外的是意外的是 :: 同學竟不知駐點使用專家要獨力同學竟不知駐點使用專家要獨力做出大量 做出大量 scenarios scenarios 及 及 acceptance acceptance test cases test cases 文件 文件 - - 同學打從心裡不同學打從心裡不重視需求分析重視需求分析 ,, 難怪台灣軟體品質差難怪台灣軟體品質差 !!

314314

Page 315: 驚濤駭浪!台灣軟體業的險境

範例範例315315

Page 316: 驚濤駭浪!台灣軟體業的險境

範例一 範例一 Selection SortSelection Sort 本例闡釋本例闡釋 ::

Test Case,Test Case, Test Code,Test Code, Design Sketch, Design Sketch,

Pseudo Code,Pseudo Code, Maintenance.Maintenance.

316316

Page 317: 驚濤駭浪!台灣軟體業的險境

Test CaseTest Case

Creating unit test casesCreating unit test cases• Post-conditionPost-condition:數列元素為自然數,:數列元素為自然數, 且由小到大且由小到大排序。排序。

• Pre-conditionPre-condition:數列元素為自然數,:數列元素為自然數, 可能有以下可能有以下情形:情形:

1. 1. 數列元素皆不同數列元素皆不同 2. 2. 所有數列元素皆相同所有數列元素皆相同 3. 3. 數列元素部分相同數列元素部分相同

317317

Page 318: 驚濤駭浪!台灣軟體業的險境

Test Case (Cont.)Test Case (Cont.)

依據以上列舉情形,設計以下依據以上列舉情形,設計以下 test casestest cases ::1. 1. 數列元素皆不同數列元素皆不同

InputInput:: {3,1,4,2}{3,1,4,2} Expected OutputExpected Output:: {1,2,3,4}{1,2,3,4}

2. 2. 所有數列元素皆相同所有數列元素皆相同 InputInput:: {1,1,1,1}{1,1,1,1} Expected OutputExpected Output:: {1,1,1,1}{1,1,1,1}

3. 3. 數列元素部分相同數列元素部分相同 InputInput:: {2,2,3,1}{2,2,3,1} Expected OutputExpected Output:: {1,2,2,3}{1,2,2,3}

318318

Page 319: 驚濤駭浪!台灣軟體業的險境

Test Code Test Code 標頭 標頭 (h(header)eader)

/* test code: testMySort.java/* test code: testMySort.java source code: mySort.java source code: mySort.java 張一二張一二 2011.4.12011.4.1 test case 1: test case 1: {3,1,4,2} ->{1,2,3,4} {3,1,4,2} ->{1,2,3,4}

test case 2: {1,1,1,1} ->{1,1,1,1}test case 2: {1,1,1,1} ->{1,1,1,1} test case 3: {2,2,3,1}-> {1,2,2,3}test case 3: {2,2,3,1}-> {1,2,2,3} */*/

開發者寫標頭開發者寫標頭 ,再交工讀生補上 ,再交工讀生補上 test codetest codetest code, source code test code, source code 檔名要易記易用易管理檔名要易記易用易管理

319319

Page 320: 驚濤駭浪!台灣軟體業的險境

Test CodeTest Code

// Java Test Code (C# test code // Java Test Code (C# test code 請參閱附錄請參閱附錄 )) import junit.framework.*;import junit.framework.*;

public class TestmySort extends TestCase {public class TestmySort extends TestCase {

public TestmySort (String s) {super(s);}public TestmySort (String s) {super(s);}

/*/* 處理處理 test casestest cases 前,需一致處理前,需一致處理 **/ / protected void setUp (){}protected void setUp (){}

/*/* 處理 處理 test cases test cases 後,需釋放記憶體後,需釋放記憶體 **//protected void tearDown (){}protected void tearDown (){} /*/* 改寫每個改寫每個 test casetest case為為 public void public void 名稱為“名稱為“ test”test” 開頭的開頭的 method */method */ public void testSort () {}public void testSort () {} } }

320320

Page 321: 驚濤駭浪!台灣軟體業的險境

Test Code (Cont.)Test Code (Cont.)

// Java Test Code// Java Test Code //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)); }}

321321

Page 322: 驚濤駭浪!台灣軟體業的險境

Test Code (Cont.)Test Code (Cont.)

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

int input[] = {1,1,1,1}, expected[] = {1,1,1,1}, result[];int input[] = {1,1,1,1}, expected[] = {1,1,1,1}, result[]; mySort obj = new mySort(input); result = obj.sort();mySort obj = new mySort(input); result = obj.sort();

assertEquals (toString(result), toString(expected));assertEquals (toString(result), toString(expected)); }}

依此方式,寫出所有 依此方式,寫出所有 Test Cases Test Cases 的 的 Test CodeTest Code

322322

Page 323: 驚濤駭浪!台灣軟體業的險境

Test Code (Cont.)Test Code (Cont.)

開發開發 test cases test cases 要由簡而繁,且要測異常要由簡而繁,且要測異常 錯誤狀況,以一個 錯誤狀況,以一個 55 至至 1010 行 行 source source

code code unit (method) unit (method) 來說,若有來說,若有三三個輸個輸入參數,每個假設有入參數,每個假設有四四 個狀況 個狀況(cases)(cases),, 4433=64 cases=64 cases,每個,每個 casecase寫寫1010 行 行 test codetest code,,

即有 即有 640 640 行 行 test codetest code 所以所以 test codetest code行數遠多於行數遠多於 source codesource code

323323

Page 324: 驚濤駭浪!台灣軟體業的險境

Pseudo Code Pseudo Code

1. 1. 最高抽象層次為:最高抽象層次為: 1. 1. 首先從首先從數列 數列 中中 selectselect 出出 minmin ,放到,放到它它的第一個位置,的第一個位置, 並固定此數不再更動並固定此數不再更動 2. 2. 再從再從剩餘數列剩餘數列中,中, selectselect 出 出 minmin ,並且放到,並且放到它它的第一個位的第一個位置置

3. 3. 依此方式依此方式 (repeat)(repeat) ,直到,直到 (until)(until) 走訪完走訪完數列數列 倒數第二個數倒數第二個數2. 2. 中等抽象層次為:中等抽象層次為:

repeatrepeat 1. 1. 從從數列 數列 ((第一次是 第一次是 0 ~ n-1)0 ~ n-1)中中 selectselect 出 出 minmin ,, 放到放到它它的第一個位置的第一個位置 ((即索引即索引 0) 0) ,並固定此數不再更,並固定此數不再更動。動。

2. 2. 繼續走訪繼續走訪剩餘數列 剩餘數列 ((第一次是第一次是 1 ~ n-1)1 ~ n-1)until until 走訪到走訪到數列數列 倒數第二個數 倒數第二個數 ((即索引 即索引 n-2)n-2) 324324

Page 325: 驚濤駭浪!台灣軟體業的險境

Pseudo Code (Cont.)Pseudo Code (Cont.) 設計問題設計問題 ::數列數列與與剩餘數列剩餘數列有何關係? 挑戰!有何關係? 挑戰! 走訪 走訪 剩餘數列剩餘數列 就是就是 array array 索引 索引 (i)(i) 的走訪,的走訪, 所以改成 所以改成 for loop :for loop :

ii為為 00時,時, array[0..N-1] array[0..N-1] 為為數列數列 ii不不為為 00時,時, array[i..N-1] array[i..N-1] 為為剩餘數列剩餘數列 由由 repeat until repeat until 改為 改為 for eachfor each ::

//// 走訪數列走訪數列for i fromfor i from 0 upto0 upto N-2N-2

1.1. 從 從 array[i..N-1]array[i..N-1] 中 中 select select 出 出 minmin ,且換到,且換到它它的第一個位置 的第一個位置 ((即即arry[i]arry[i]))

2.2. 固定此數不再更動固定此數不再更動end forend for

325325

Page 326: 驚濤駭浪!台灣軟體業的險境

Pseudo Code (Cont.)Pseudo Code (Cont.)3.3. 最低抽象層次為最低抽象層次為 :: sort: sort array sort: sort array 成由小而大的順序成由小而大的順序 for i fromfor i from 0 upto0 upto N-2 N-2 1.min(1.min( 最小數的索引最小數的索引 )) 指著指著 array[i..N-1]array[i..N-1] 的第一個數的第一個數 ((即即 arry[i]arry[i])) 2.2.從 從 array[i..N-1] array[i..N-1] 中中 selectselect 出 出 min min for j fromfor j from i+1 uptoi+1 upto N-1 N-1 if if 第 第 j j 個數比 個數比 min min 所指的數小所指的數小 then then 叫它叫它 min end ifmin end if end forend for

3.3.把 把 min min 所指的數換到 所指的數換到 array[i..N-1]array[i..N-1] 的第一個位置的第一個位置 ((即即 arry[i]arry[i])) end forend for 326326

Page 327: 驚濤駭浪!台灣軟體業的險境

CodingCoding 開發開發 Java Java source codesource code 首先建構一個 首先建構一個 Class Class 叫做 叫做 mySortmySort ,其 ,其 constructorconstructor 所傳所傳入的參數為 入的參數為 integer integer 的 的 input arrayinput array

public class mySort { public class mySort {

/* data structure *//* data structure */ private int array []; private int array [];

/*constructor*/ /*constructor*/ public public mySort mySort (int inputArray[])(int inputArray[])

{{/*this array /*this array 即傳入的 即傳入的 input array*/input array*/this.array = inputArray;this.array = inputArray;}}

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

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

327327

Page 328: 驚濤駭浪!台灣軟體業的險境

Coding (Cont.)Coding (Cont.) /*/* sort: sort array sort: sort array 成由小而大的順序成由小而大的順序 **// sort ( ) {sort ( ) {

/* for i from/* for i from 0 upto0 upto N-2 */ N-2 */ for (int i = 0; i <= array.length-2; i++) {for (int i = 0; i <= array.length-2; i++) {

/*1.min(/*1.min( 最小數的索引最小數的索引 )) 指著指著 array[i..N-1]array[i..N-1] 的第一個數 的第一個數 ((即即 array[i]array[i])*/)*/ int min=i; int min=i;

/*2./*2. 從 從 array[i..N-1] array[i..N-1] 中 中 selectselect 出 出 min */ min */ /*for j from/*for j from i+1 i+1 upto N-1*/ upto N-1*/ for (int j = i + 1; j <= array.length-1; j++) for (int j = i + 1; j <= array.length-1; j++) /*/*if if 第 第 j j 個數比 個數比 min min 所指的數小所指的數小 thenthen叫它叫它 min end if*/min end if*/ if (array[j] < array[min]) if (array[j] < array[min])

min = j;min = j; ////end forend for

/*/*3.3.把 把 min min 所指的數換到 所指的數換到 array[i..N-1]array[i..N-1] 的第一個位置 的第一個位置 ((即即 array[i]array[i])*/)*/ swap (i,min);}swap (i,min);}

//end for//end for

328328

Page 329: 驚濤駭浪!台灣軟體業的險境

Coding (Cont.)Coding (Cont.)

Coding Coding 就是逐行在 就是逐行在 pseudo code pseudo code 後面,後面, 補上對應的 補上對應的 source code source code

開發者閱讀的是 開發者閱讀的是 pseudo codepseudo code ,非 ,非 source codesource code ;;故故 source codesource code 要隱蔽 要隱蔽 (( 以後有工具 以後有工具 PseudoCoder )PseudoCoder )

不可阻礙 不可阻礙 pseudo code pseudo code 之畫面呈現之畫面呈現 程式才易於閱讀、了解、維修,才是活著,程式才易於閱讀、了解、維修,才是活著,

活著! 活著! 活著!活著!329329

Page 330: 驚濤駭浪!台灣軟體業的險境

Coding (Cont.)Coding (Cont.)

不是活著不是活著的程式無法閱讀、維修,叫:的程式無法閱讀、維修,叫: 垃圾垃圾,,這專案已死掉了!有個嚴肅問題這專案已死掉了!有個嚴肅問題 :: 小林每月生產垃圾一噸;小王二噸小林每月生產垃圾一噸;小王二噸 誰薪水高誰薪水高 ??

1.1. 小王 小王 因產量兩倍 因產量兩倍 ((故產值兩故產值兩倍倍 ))

2.2. 小林 小林 因垃圾量較少,較環保因垃圾量較少,較環保 3.3. 相同 反正都是垃圾 相同 反正都是垃圾

330330

Page 331: 驚濤駭浪!台灣軟體業的險境

Coding (Cont.)Coding (Cont.)

““swap” methodswap” method ,因無涉解題邏輯,故不需,因無涉解題邏輯,故不需 pseudo-pseudo-codingcoding ,可直接 ,可直接 coding coding 為 為 private methodprivate method

又,又, private method private method 常重構,故不做 常重構,故不做 test codetest code /*swap: /*swap: 交換 交換 i1, i2 i1, i2 所指的數所指的數 **// private void swap (int i1, int i2) private void swap (int i1, int i2) {int temp = this.array[i1];{int temp = this.array[i1]; this.array[i1] = this.array[i2];this.array[i1] = this.array[i2]; this.array[i2] = temp; }this.array[i2] = temp; }

331331

Page 332: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.)用用 JUnit JUnit 其下載網址 其下載網址 http://www.junit.org/index.htmhttp://www.junit.org/index.htm (a)(a)把 把 source code: mySort.java test code: TestmySort.java source code: mySort.java test code: TestmySort.java 放同一目錄放同一目錄 (b)(b) 在命令列檔案所在目錄鍵入 在命令列檔案所在目錄鍵入  javac *.java javac *.java 編譯這兩個檔案編譯這兩個檔案    若編譯正確,不會出現錯誤    若編譯正確,不會出現錯誤

訊息訊息

332332

Page 333: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.) (c)(c) 鍵入 鍵入 java junit.swingui.TestRunner TestmySort

333333

Page 334: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.)

(d) 結果如下: 所有 Test Cases 通過測試

334334

Page 335: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.)

假設 假設 test case1 test case1 改成:改成: public void testSort1() {public void testSort1() { int input[] = {3,1,4,2}, int input[] = {3,1,4,2}, expected[] = {2,1,3,4}; //expected[] = {2,1,3,4}; // 錯了!應是錯了!應是 1, 2, 3, 41, 2, 3, 4 int result[];int result[];

mySort obj = new mySort(input); result = obj.sort();mySort obj = new mySort(input); result = obj.sort(); assertEquals (toString(result), toString(expected));assertEquals (toString(result), toString(expected));}}

335335

Page 336: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.) 重編譯 TestmySort ,再執行 Testing ,結果如下 :

實際結果是 : 1,2,3,4 但 test case 1 中預期結果是 : 2,1,3,4,

比對結果,錯誤 !

336336

Page 337: 驚濤駭浪!台灣軟體業的險境

Unit Testing (Cont.)Unit Testing (Cont.)

Test case 1 錯誤 Test case 2 正確 Test case 3 正確

337337

Page 338: 驚濤駭浪!台灣軟體業的險境

針對 針對 Selection Sort Selection Sort 給予給予 maintenance request :maintenance request :

改為由大排到小改為由大排到小 1. 1. 修改 修改 test case code (test case code (如如 input input 仍是仍是 3142,3142, 但 但 expected output expected output 改為改為 4321)4321) 2.2. 閱讀瞭解 閱讀瞭解 pseudo code pseudo code ,, 3.3. 修改 修改 pseudo code pseudo code 及 對應的 及 對應的 source codesource code ,, 4. 4. 用用 unit testing tool unit testing tool 做 做 testingtesting

Maintain Maintain 範例一範例一

338338

Page 339: 驚濤駭浪!台灣軟體業的險境

Maintained pseudo and source codeMaintained pseudo and source code /*/* sort: sort array sort: sort array 成由大而小的順序成由大而小的順序 **// sort ( ) {sort ( ) {

// for i from// for i from 0 upto0 upto N-2 N-2 for (int i = 0; i < =array.length-2; i++) {for (int i = 0; i < =array.length-2; i++) {

//1.max(//1.max( 最大數的索引最大數的索引 )) 指著指著 array[i..N-1]array[i..N-1] 的第一個數的第一個數 ((即即 array[i]array[i])) int max=i;int max=i;

// 2.// 2.從 從 array[i..N-1] array[i..N-1] 中中 selectselect 出 出 max max // for j from// for j from i+1 uptoi+1 upto N-1 N-1 for (int j = i + 1; j <= array.length-1; j++)for (int j = i + 1; j <= array.length-1; j++)

////if if 第 第 j j 個數比 個數比 max max 所指的數大所指的數大 thenthen 叫它叫它 max end ifmax end if if (array[j] > array[max]) max = j;if (array[j] > array[max]) max = j;

////end forend for ////3.3.把 把 max max 所指的數換到 所指的數換到 array[i..N-1]array[i..N-1] 的第一個位置的第一個位置 ((即即 array[i]array[i]))

swap (i,max);}swap (i,max);}

//end for//end for

339339

Page 340: 驚濤駭浪!台灣軟體業的險境

範例二範例二 Insertion SortInsertion Sort 及其擴充之及其擴充之範例三範例三 Shell SortShell Sort

這兩個範例 皆展示 這兩個範例 皆展示 design sketch,design sketch,

pseudo code, pseudo code,

source code.source code.

340340

Page 341: 驚濤駭浪!台灣軟體業的險境

Insertion Sort Design SketchInsertion Sort Design Sketch

341341

待 sort

9 6 3 4 1 20(i) 1 2 … n-2 n-1

已 sort 待 sort9 6 3 4 1 20 1(i) 2 … n-2 n-1

已 sort 待 sort6 9 3 4 1 20 1 2(i) … n-2 n-1

已 sort1 2 3 4 6 90 1 2 … n-2 n-1

數值索引

原數列是待 sort ,逐一將待 sort數列插至左邊(已 sort數列)使之變大,並保持已 sort ,最後數列完成 sort。

首先將 待 sort 數列(數列 i..n-1)中第一個數(即數值 9 ),設為已 sort數列。

再將待 sort 數列(數列 i..n-1)中第一個數 (即數值 6 ), insert入已 sort

數列,並保持已 sort 數列。

依此方式直到走訪完,數列最後一個數(即索引 n-1)。

到此,即完成數列由小到大的 sort。

::

Insert

Page 342: 驚濤駭浪!台灣軟體業的險境

Insertion Sort Pseudo CodeInsertion Sort Pseudo Code

public int[] insertionSort()public int[] insertionSort()/* /* 排序 排序 integer array integer array 張一二 張一二 2009.5.13 2009.5.13 input input 待 待 sortsort integer arrayinteger array ouput ouput 已 已 sortsort integer array */ integer array */ 1.for i1.for i from 1 upto N-1from 1 upto N-1 ,逐一將待,逐一將待 sortsort 插至左邊已插至左邊已 sortsort arrayarray ,, 使變大之 使變大之 array[0..i] array[0..i] 保持已保持已 sortsort

for j for j fromfrom i i downtodownto 11 if array[j]<if array[j]< 左邊元素 左邊元素 then swapthen swap 二元素二元素

else else 已 已 insert insert 至定位,離開迴圈至定位,離開迴圈 end ifend if end forend for end forend for

2.return array2.return array

342342

Page 343: 驚濤駭浪!台灣軟體業的險境

Insertion Sort source codeInsertion Sort source code

public int[] insertionSort(){public int[] insertionSort(){/*1.for i/*1.for i from 1from 1 upto N-1upto N-1 ,逐一將待 ,逐一將待 sortsort 插至左邊已插至左邊已 sortsort arrayarray ,,

使變大之 使變大之 array[0..i] array[0..i] 保持已保持已 sortsort**//for (int i=1; i<=array.length-1;i++){for (int i=1; i<=array.length-1;i++){

/* for j from/* for j from ii downto 1 */downto 1 */for (int j=i; j>=1;j--){for (int j=i; j>=1;j--){

/*if array[j]</*if array[j]< 左邊元素 左邊元素 then swapthen swap二元素二元素 **// if (array[j]<array[j-1]) swap(j,j-1);if (array[j]<array[j-1]) swap(j,j-1);

/*else /*else 已 已 insert insert 至定位,離開迴圈至定位,離開迴圈 end if*/end if*/else break; } }else break; } } // end for// end for // end for// end for

/*2*//*2*/ return array;}return array;}

343343

Page 344: 驚濤駭浪!台灣軟體業的險境

Shell Sort Design SketchShell Sort Design Sketch

344344

Shell sort 依 increment將數列分成數個子數列,分別做 insertion sort從子數列第二個元素起,向右隔 increment個元素,逐一 insert至左邊已 sort之子數列

0 1 0 1 0 19 6 3 4 1 20 1 2 … n-2 n-1

0 1 0 1 0 11 6 3 4 9 20 1 2 … n-2 n-1

0 1 0 1 0 11 2 3 4 9 60 1 2 … n-2 n-1

0 0 0 0 0 01 2 3 4 6 90 1 2 … n-2 n-1

餘數數值索引

increment = 1

increment = 2

定 increment(此為 2) 將數列分成 increment 個子數列

將第 0 子數列 (灰色 ) 做 insertion sort( 得 1, 3, 9)

直到做完所有子數列

遞減 increment 為 increment/2,並依上述處理,直到 increment為 1

到此即完成 sort 數列

: :

Page 345: 驚濤駭浪!台灣軟體業的險境

Shell Sort Design Sketch (cont.)Shell Sort Design Sketch (cont.) (( 下面是開發者看到 下面是開發者看到 design sketch design sketch 時的時的 內心思考,不寫出文件的內心思考,不寫出文件的 ))

1. increment 2 1. increment 2 時,時, arrayarray分為兩個 子陣列分為兩個 子陣列 :: k=1: {9 3 1} k=1: {9 3 1} k=2: {6 4 2}k=2: {6 4 2} 分別做分別做 insertion sortinsertion sort

2. 2. 遞迴做 遞迴做 shell sortshell sort ,每次,每次 increment increment 減半,減半, 直到直到 1 1 (( 即退化為 即退化為 insertion sort)insertion sort)

345345

Page 346: 驚濤駭浪!台灣軟體業的險境

Shell Sort pseudo code Shell Sort pseudo code public int[] shellSort (int increment)public int[] shellSort (int increment) 1.for 1.for 子陣列 子陣列 k fromk from 11 uptoupto increment, increment, 分別做分別做 insertion sortinsertion sort

for i for i fromfrom 1+k 1+k upto N-1upto N-1 by increment, by increment, 逐一插至左邊逐一插至左邊 arrayarray 使變大之 使變大之 arrayarray 保持已保持已 sort sort

for j fromfor j from ii downto 1+k by incrementdownto 1+k by increment if array[j] <if array[j] < 左邊元素 左邊元素 then swapthen swap 二元素二元素

else else 已插至定位,離開迴圈已插至定位,離開迴圈 end ifend if end forend for end forend for end forend for

2.2.遞迴做遞迴做 shell sortshell sort ,,每次每次 increment increment 減半,減半,直到直到 11 3. return array3. return array

346346

Page 347: 驚濤駭浪!台灣軟體業的險境

Shell Sort source codeShell Sort source codepublic int[] shellSort (int increment) {public int[] shellSort (int increment) {

/*1.for /*1.for 子陣列 子陣列 k fromk from 11 uptoupto increment, increment, 分別做分別做 insertion sort*/insertion sort*/for (int k=1; k<=increment; k++){for (int k=1; k<=increment; k++){

/* for i/* for i from 1+kfrom 1+k upto N-1upto N-1 by increment, by increment, 逐一插至左邊逐一插至左邊 array array 使變大之 使變大之 arrayarray 保持已保持已 sort*/ sort*/

for (int i=1+k; i<=array.length-1; i=i+increment;){for (int i=1+k; i<=array.length-1; i=i+increment;){

/* for j from/* for j from ii downto 1+k by increment */downto 1+k by increment */ for (int j=i; j>=k+1; j=j-increment;){for (int j=i; j>=k+1; j=j-increment;){

/*if array[j]</*if array[j]< 左邊元素左邊元素 then swapthen swap二元素二元素 **// if (array[j]<array[j-increment]) swap(j,j-1);if (array[j]<array[j-increment]) swap(j,j-1);

/* else /* else 已插至定位,離開迴圈已插至定位,離開迴圈 end if*/end if*/else break; } } }else break; } } } //end for//end for //end for//end for

// end for// end for

/*2./*2.遞迴做 遞迴做 shell sortshell sort ,,每次每次 increment increment 減半,減半,直到直到 1*/1*/if (increment >=1) array=shellSort(increment/2);if (increment >=1) array=shellSort(increment/2);

/*3*//*3*/ return array;}return array;}347347

Page 348: 驚濤駭浪!台灣軟體業的險境

風平浪靜風平浪靜 -- 台灣軟體業 台灣軟體業 藍海 藍海 揚帆!揚帆!

敏捷敏捷 (agile)(agile) 方法方法以測試帶動開發以測試帶動開發 (Test-driven development, TDD)(Test-driven development, TDD)軟體品質極佳軟體品質極佳

除國外重視的除國外重視的溝通 溝通 訓練,亦加強訓練,亦加強 國人不足的國人不足的思考 思考 (( 含含創意創意 )) 訓練 訓練 – – 溝通 溝通 及 及 思考思考 乃深層基本功乃深層基本功––

練功後人人紮實、軟體優質,練功後人人紮實、軟體優質, 迎向創意時代,迎向創意時代,錢錢途光明!途光明!

348348

Page 349: 驚濤駭浪!台灣軟體業的險境

349349

Page 350: 驚濤駭浪!台灣軟體業的險境

附錄附錄350350

Page 351: 驚濤駭浪!台灣軟體業的險境

C# Unit TestingC# Unit Testing

// C# test code// C# test codeusing NUnit.Framework;using NUnit.Framework;

/*/*建立一個建立一個 TestmySort ClassTestmySort Class為測試的為測試的 ClassClass**//[TestFixture][TestFixture]public class TestmySort {public class TestmySort {

/*/*改寫每一個改寫每一個 TestCaseTestCase 為一個為一個 public methodpublic method ,並加上,並加上 [Test]*/[Test]*/ [Test][Test] public void testCase1(){}public void testCase1(){}

}}

351351

Page 352: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.)

//Test Code//Test Code//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}

[Test][Test] public void testCase1(){public void testCase1(){ /* input/* input 為待排序數列,為待排序數列, expectedexpected 為預期結果為預期結果 , result, result 為實際結果為實際結果 ** / / int[] input={3,1,4,2}; int[] excepted={1,2,3,4}; int[] result=new int[4];int[] input={3,1,4,2}; int[] excepted={1,2,3,4}; int[] result=new int[4];

/* 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 */ Assert.AreEqual(result,excepted); }Assert.AreEqual(result,excepted); }

352352

Page 353: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.)

Test Case 2Test Case 2:: input {1,1,1,1} expected outputinput {1,1,1,1} expected output:: {1,1,1,1}{1,1,1,1}

[Test][Test]

public void testCase2(){public void testCase2(){

int[] input={1,1,1,1}; int[] excepted={1,1,1,1}; int[] result=new int[4];int[] input={1,1,1,1}; int[] excepted={1,1,1,1}; int[] result=new int[4];

mySort obj= new mySort(input); result=obj.Sort();mySort obj= new mySort(input); result=obj.Sort();

Assert.AreEqual(result,excepted);}Assert.AreEqual(result,excepted);}

依此方式寫出所有 依此方式寫出所有 Test Cases Test Cases 的 的 Test CodeTest Code353353

Page 354: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.)

取得與安裝取得與安裝 UltraEditUltraEdit 下載點:下載點: http://ape.csie.ncu.edu.tw/http://ape.csie.ncu.edu.tw/

cuedit920a.execuedit920a.exe 下載完後得到下載完後得到 cuedit920a.execuedit920a.exe 檔,執行該檔檔,執行該檔案進行安裝案進行安裝

354354

Page 355: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.) 安裝完成後執行安裝完成後執行 UltraEditUltraEdit ,點選輸入授權號碼,點選輸入授權號碼 使用者名稱輸入使用者名稱輸入 Universal UserUniversal User 授權碼輸入授權碼輸入

355355

Page 356: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.)Testing (Testing (使用使用 NUnit) NUnit) 下載網址:下載網址: http://www.nunit.org/index.php?p=downloadhttp://www.nunit.org/index.php?p=download(a)(a) 設定 設定 UltraEdit UltraEdit 環境 選擇 環境 選擇 進階進階 >> 工具組態工具組態 指令列輸入指令列輸入 csc /t:library /r:(csc /t:library /r:( 安裝路徑安裝路徑 )\bin\nunit.framework.dll %n%e)\bin\nunit.framework.dll %n%e 工作目錄輸入 工作目錄輸入 %p %p 名稱輸入 名稱輸入 NUnitC#NUnitC#

356356

Page 357: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.) (b)(b)將將 mySortmySort與與 TestmySortTestmySort 編輯在同一個檔案中編輯在同一個檔案中 (mySort.cs)(mySort.cs) ,, 並選擇 進階並選擇 進階 >NUnitC#>NUnitC# ,進行編譯,產生,進行編譯,產生 mySort.dllmySort.dll 檔案檔案

357357

Page 358: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.) (c)(c) 開啟開啟 NUnitNUnit圖形介面,並選擇圖形介面,並選擇 File>open File>open 開啟開啟 mySort.dllmySort.dll 檔案檔案

TestmySort class中包含的TestCases

358358

Page 359: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.) (d)(d) 選擇選擇 TestmySort TestmySort ,並點選,並點選 RunRun 執行執行 TestingTesting

綠色表示測試通過綠色表示測試通過

359359

Page 360: 驚濤駭浪!台灣軟體業的險境

C# Unit Testing (Cont.)C# Unit Testing (Cont.) 如果將如果將 TestCaseTestCase 改寫產生錯誤,會顯示紅色,並產生錯誤訊息改寫產生錯誤,會顯示紅色,並產生錯誤訊息

360360