# 高效程序員的45個習慣:敏捷開發修練之道 - 閱讀筆記
###### tags: `程式理論`
[圖書鏈結](https://www.tenlong.com.tw/products/9787115370365)
出版日期:2014年
## 第2章 態度決定一切
#### 2.3 對事不對人
發現別人錯誤我們可能會有以下幾種反應方式:
* 否定個人能力
最糟的一種應對方式,指責並不會使對方進步,反而會讓其以後也不想提出自己的想法
* 指出明顯的缺點,並否定其觀點
雖然觀點明確,但會讓聽的人想要反擊,最後可能造成兩方都不愉快
* 肯定其想法,並提出你的顧慮
由此可以開始一次交談,而不是爭辯。但如何在提出顧慮時,不要用指責的方式,需要多加練習
如何讓討論有效進行,下面提供一些技巧
* 設定最終期限:我們應該要有預期,沒有最好的答案,只有當下最適合的方案。設定期限能幫助我們在為難時,做出決策,讓工作繼續進行
* 逆向思維:先看方法的優點,再努力尋找其缺點。進而幫助我們決定何者是最適合的
* 設定仲裁人:仲裁人應專注於調停,而不是發表自己的觀點,讓每個人都有發言的機會,使會議順利進行
* 支持已經做出的決定
## 第3章 學無止境
是一種增量的學習,持續跟進就不會困難,若中間落差太大就需花更多的時間補齊。除了學習新東西,也要學會淘汰不需要的知識。
#### 3.5 跟蹤變化
每天花一點時間,持續的學習(有點難QQ)。可透過雜誌研討會了解最新趨勢。不用精通所有,但必須了解產業趨勢。
#### 3.6 對團隊投資
每周持續地舉辦知識分享,有助於團隊的成長,是否限定主題可以自己決定。
若已經是團隊中最厲害的人,就需考慮換團隊了,因很難可以再驅動你進步。
#### 3.7 懂得丟棄
學習新語言技術時,需了解其語言特性,並比較與自己熟悉的有甚麼不同,避免將不合時宜的觀念套用於其上。
#### 3.8 打破砂鍋問到底
面對一個新系統或新需求,別人可能直接告訴你要做什麼,但應該要去了解其背後的原因,如此可以學到一些新的東西,也可能發現別人疏漏的部分。
#### 3.9 把握開發節奏
每天下班前,把工作收尾開心下班,明天開始面對新的問題。
## 第4章 交付用戶想要的軟體
主要講開發時要注意的東西
#### 4.10 讓客戶做決定
會影響到使用者體驗的東西,應該要站在使用者角度,跟客戶解釋各方案的優缺點,讓其選擇。
#### 4.11 讓設計指導而不是操縱開發
設計應該正確,而不是精確???但不想開發時還要想各種情況啊!
#### 4.12 合理地使用技術
使用新技術時,應該要評估他是否適用,但必須保持一個開放的心,這不是不學新技術的理由。
#### 4.13 保持可以發布
coding -> build & run test -> get latest -> build & run test -> publish
#### 4.14 提早集成,頻繁集成
早點 commite code,並 merge 進需要的地方。
#### 4.15 提早實現自動化部署
在專案一開始就建置好 CI 環境,因安裝環境時可能還需要一些其他的東西,在還有記憶時最容易找到問題。
#### 4.16 使用演示獲得頻繁反饋
早點把做好的小部分功能展示給客戶看,可以確保符合需求,避免一個項目做了兩年,發先核心功能其實存在問題。
#### 4.17 使用短疊代,增量發佈
現在軟體生命週期短,若不頻繁發佈給使用者,可能等要發佈時,市場已經不需要了。
#### 4.18 固定的價格就意味著背叛承諾
在說明接案時該如何報價
## 第5章 敏捷反饋
主講測試方法,加一點時間估算,及使用者體驗
#### 5.19 守護天使
寫單元測試,執行並維護他,讓他自動運行在CI上,及時提供反饋。
#### 5.20 先用它再實現它
講TDD(Test Driven Development)。先寫測試,就會站在使用者的角度思考。
#### 5.21 不同環境,就有不同問題
最好在每個支援平台和環境中運行單元測試,可用 VMware 或 Virtual PC。
#### 5.22 自動驗收測試
讓客戶可以自己輸入想要的數據驗收結果。PS:我對此該怎麼實現沒經驗。
#### 5.23 度量真實的進度
估算應計算還需要花都少時間,而不是做了多少,若還需很多時間也應誠實面對。
#### 5.24 傾聽用戶的聲音
若有用戶抱怨,不管是不是 bug 都應該正視,想辦法找到原因解決他。
## 第6章 敏捷編碼
#### 6.25 代碼要清楚地表達意圖
怎樣算清楚地表達意圖?讓一年後的你也可以一眼就看懂
#### 6.26 用代碼溝通
需要加註釋的情況
* 目的:為什麼需要這個方法? (命名好應該可省略)
* 需求(前置條件):方法需要什麼樣的輸入(變數名稱應該可做到),對象須處於何種狀態,才能讓各個方法工作?
* 承諾(後置條件):方法執行成功後,對象處於何種狀態,有哪些回傳值? (應該也可以省略)
* 異常:可能會發生什麼樣的問題?會拋出什麼異常?