天天看點

靈活開發的26條規則。

  • 靈活開發真正的問題是什麼?其實靈活主要還是一種觀念,一種意識,通過人來推動。本文總結了26條有關靈活開發的關鍵原則,供讀者參考借鑒。

我經常收集各種各樣的至理名言,最近我重溫靈活開發;真正的問題是什麼?下面是一份26條關鍵原則的清單,以指引靈活軟體開發團隊。

1、完整地幹完一件事後在開始另一件事:用廚房比喻來說就是:“先上這道菜,再開始做下一道”。軟體開發的最大問題就是同時開始幾件事情,這将不可避免的造成某些工作被廢棄,進而造成浪費。專注于一件事;完整地實作其功能;運作測試;編寫文檔;簽入所有,把這當做一項工作完成,然後再開始下一件事。

2、不要破壞建構:非常明顯,但必須被包含在任何軟體開發建議清單中。程式員在簽入之前采取所有合适的預防措施進行測試,則永遠不會破壞建構。如果建構被破壞,通常是因為有人偷懶了。

3、在用例需要之前,不要實作程式:當你實作一個特定的類,你應該在腦海中有一個特定的用例,同時應該隻實作用例需要的方法。你可以考慮該類潛在的功能,寫入注釋之中,但直到用例真正需要時,才應去實作它。

4、在用例需要之前,不要添加資料成員:同上一條,不過這是從類的資料成員角度考慮的。似乎顯而易見地,“客戶”記錄需要“送貨位址”,但直到有用例明确需要送貨位址,才應該實作它。

5、不要害怕做決定,不要害怕改變先前的決定:靈活開發是關于相應變化和快速相應的。開發初期,你沒有完整的資訊。你應該盡可能的推遲決策,直到你必須做出決策的時候。沒有資訊,無法支援你的決定,相反,在有效資訊的基礎上做出最佳決定。有了新的資訊,不要害怕改變先前的決定。(某些“恐龍”稱之為搖擺不定,但我稱之為響應變化的環境)

6、持續學習如何改善品質:這項工作永不會結束,是以你應經常留意可以改善的事情,并收集品質問題被确認和處理的案例。

7、度量、度量、度量:靈活開發幫助處理未來不确定性問題,但對于過去應沒有不确定性。測試應持續運作,每次運作的性能表現應被度量和記錄。

8、為人而設計,而不是系統:開發者常常因技術而使設計誤入歧途。絕不要忘記設計的最終目标,那就是幫助人們完成工作。

9、測試是産品的一部分:很多開發者和經理認為産品就是傳遞給客戶的東西,而其它所有東西都不那麼重要。測試應被認為是産品實實在在的一個部分,值得在設計時仔細考慮,甚至,在很多情況下,和産品一起傳遞給客戶。(後半部分有争議,但是内建測試作為軟體傳遞的一部分僅僅占用無關緊要的空間,卻在必要時提供顯而易見的好處,這種方式應該被考慮。)

10、在代碼之前編寫測試:測試本身可以用來闡釋真正需要的設計。設計的缺陷常常是通過測試用例被發現的。想想看,編碼之前,通過這些用例,可以節約多少時間。但是,為用例1編寫測試,然後編碼,然後再開始用例2。

11、消除浪費:坦率的說,這是另一個必須包含在任何開發原則清單中的陳詞濫調,因為它太重要了。發現浪費并消除它,這項工作沒有盡頭。消除任何不能增加客戶價值的東西。如果你不能确認客戶價值,那很可能你并不需要它。

12、建立對建構破壞立即響應的文化:要明白當建構被破壞,會影響項目中的每一個人,是以,最重要的是确認核心代碼被建構并合理測試。我曾見過有些團隊放任失敗測試持續數月,因為那是其它人的工作。每個人都痛苦,但沒人采取行動。想反,必須形成共識,那就是小工作能為團隊獲得大的回報。

13、所有團隊成員應了解客戶需要:大型的複雜項目定然被分解為獨立的團隊,進而被分派給開發人員。但是,不應在此範圍内做的是,失去關注最終項目真正使用者的期望和目标。

14、把相關定義放在一起:組織代碼以使高度相關的事情在一起,或在一個類中。這是标準面向對象設計封裝原則。理想情況下,所有的類外的代碼不需要知道内部工作細節。一些開發者樂于将細節擴散到多個檔案中以便按不同方式組織,如所有相同的資料類型放在一起,或者按字母順序組織。例如,在他們要用的不同包中,将所有常量放在一個類裡,這增加了不必要的程式複雜性。指導原則應該是按相關性分組進而隐藏複雜性。

15、始終在簽入之前運作測試:這條準則幫助你滿足“不要破壞建構”準則。

16、過早的優化時萬惡之源:引用高德納被證明的話:代碼應編寫良好以避免微觀層面的浪費,但獨立方法層次以外的優化應等待整個程式基于真實的最終使用者使用情景的壓力測試的進行。僅僅基于對代碼的靜态了解,直覺地判斷對整體性能什麼是重要的,結論幾乎總是錯誤的。相反,度量整個系統的行為,辨識1%真正影響性能的代碼,并專注于此。

17、減少積壓未完成的編碼任務:當開發人員開始一個用例,會發生成本,跟已修改卻未完成和測試的代碼相關聯。留着未完成的變化幾天或幾個星期會累積成巨大的重做風險。考慮每個估算需要一天的三個任務,同時開始這三個任務,并在3天内同時進行,意味着9個機關的累計成本。但是順序進行每個任務,完成一個再開始下一個,意味着隻有3個機關的成本。這個不是直覺,直覺告訴我們,在工作完成之前,我們不妨同時做三件事情。但軟體不像實體構造。短小,快速和完整的工作不僅減少認知的負擔,而且減少未完成工作與他人未完成工作之間沖突的可能。

18、不要過度強調代碼的通用性:這就是著名的“YAGNI-你不會需要它”。當編寫一個特定類的時候,程式員總喜歡認為該類可能用于其它用途。如果現在的用例需要這些用途,這很好,但是,程式員經常考慮未被提及的用途,或者那些實際上永遠不需要的。(這常常讓我聯想到經典的周六現場滑稽短劇,關于某産品既是地闆蠟,也是糕點上的甜食。)

19、兩行代碼能行,就不要用三行:有人閱讀時,簡潔的代碼總能獲得回報。但不要将代碼壓縮到難以閱讀。更小的,編寫良好的代碼比之冗長的,編寫華麗的代碼更容易維護,也更容易發現錯誤。始終盡可能簡化,但别過分。

20、不要用行數來度量代碼:完成特定任務所需的代碼行數,不同的程式員之間和編碼風格之間差異很大。代碼行數不能告訴你代碼完成和品質的些許東西。代碼品質可以相差200倍,這足以抵消代碼行數的作用。應該統計功能用例的數目。

21、持續地重新設計和重構:謹慎地使用這條準則,因為有些代碼脆弱而難以改變,但通常你不應害怕更改代碼以符合實際使用情況。一個資料成員過去可能是整數,但是當一個用例要求它是一個浮點數時不要害怕去改變它。

22、删除死代碼:涉及到大量不能很好了解的代碼是,有個傾向是不自找麻煩。一個例子就是往類中增加新的方法去替換另一個,開發人員常常會留下舊的方法以防萬一。必須努力檢查方法是否必須,如果沒有證據表明它是必須的,那就删除它。最糟糕的就是注釋掉大量的代碼,并把它留在那兒。注釋掉的代碼應在測試通過後盡快删除,當然應在簽入之前。是以,某個時候你發現一些東西可能并不需要,付出小小的努力去驗證并消除此代碼能讓代碼基線更易維護。

23、不要發明新語言:程式員喜愛使用文本檔案配置在運作時驅動功能。沒有配置檔案能夠不編譯而改變程式的行為。XML的出現推動了無休止的專門定制“腳本語言”的浪潮,以使功能能被最終使用者定制而不需要編譯。這種推理的缺陷在于,離開某個特定實施的環境,操作行為幾乎從來沒能很好地精确定義,同時,那些腳本語言隻對那些對問題領域代碼的内部運作有深入了解的人有用。是以,不具備詳盡内部知識的真實最終使用者永遠不可能知道預料複雜的指令組合的效果需要什麼。腳本語言有用,也不能被消除,但是設計者必須采取非常非常保守的态度,盡可能使用現有的語言,避免新的發明。

24、在你準備實作并測試前,别做設計:你應該有行進的總體思路和對系統架構的概覽,但是,直到開發疊代允許設計被實作和測試前,不要做詳細設計,不要編寫功能實作的詳細說明。詳細設計應當隻涉及到處理目前的用例。軟體開發中最大的浪費源于将時間花在設計那些不需要,或者因為某些錯誤的設計假定而需要重新設計的事情之上。

25、設計是可塑的:不像實體制造,軟體可以很容易地獲得顯著改變。事實上,有大量證據證明軟體本身比描述軟體的設計說明書更容易改變。此外,軟體比說明書更有效地傳達設計。是以,你應該把時間用于直接實作設計,讓客戶能看見設計的細節。如果你犯錯并改變設計,改變軟體比改變規格更容易。但最重要的是,客戶看到代碼運作後,你關于客戶想要什麼的資訊大為完善。

26、花時間編寫發現和報告異常情況的代碼中的問題的完整描述:程式員往往很懶惰,抛出粗淺描述錯誤的異常。認為他們永遠是唯一會看到這個問題的人,并且他們從含糊的描述會記得這個問題的意思。但實際上,在客戶支援環境,不準确或者不完整的錯誤報告比其它原因浪費更多的時間。編寫每個錯誤消息,就好像你正向某個正好走進房間并且沒有此代碼經驗的人解釋狀況。客戶和客戶支援團隊畢竟沒有此代碼的經驗。

轉載于:https://www.cnblogs.com/markxue/archive/2010/01/14/1648091.html