極限編程的核心有四個,交流、簡單、反饋和勇氣,這四個原則大家在平時做項目的過程中一定也注意到了。但是兩位大師Kent Beck 和 Martin Fowler能夠把這四點歸結在一起,使他們能夠共同組成極限編程這架四輪馬車,卻是一個不小的創造的。
下面僅就自己的學習和簡單的實踐過程中遇到的問題來談談自己對這四個核心的一些理解。
一、交流
1) 開發人員與客戶的交流
這一點與傳統的軟件工程中有些類似,在平時開發軟件的過程中也非常注重與客戶的交流,特別是在需求分析、概要設計以及驗收測試的時候,開發人員與客戶有效的交流是必不可少的,那將直接影響到一個項目是否能夠符合客戶的要求。
然而,在極限編程中客戶所處的開發階段有些不同,傳統的項目開發過程中,客戶只在最初的時候和最後的時候需要和開發人員在一起,他們的責任也就是在於業務功能上的幫助,但是這樣就不可避免的導致了這樣的一個狀況:在項目最初的時候客戶提出了錯誤的或者不准確的需求,然後項目組開始開發,客戶很長一段時間不介入項目,而在項目驗收的時候發現有些地方有錯誤或者需要修改,此時項目組不得不付出很多的時間和精力來適應客戶的需求。這是時間和資金上很大的浪費。在極限編程中,需要一個非常精通業務的現場客戶,他們不僅隨時提供業務上的信息,而且要編寫業務驗收測試的測試代碼,這樣就可以在很大的程度上保證項目的方向不會錯誤。
極限編程的過程是“瞄准-》射擊-》調整-》調整”的過程,並不強求在項目開始的時候就准確把握項目的方向,由於有現場客戶的存在,項目的方向是不斷的調整中的,這樣就可以極大程度上避免項目走彎路。
2) 開發人員之間的交流
當前在招聘開發人員以及其他一切的工作人員的時候,我們都會強調團隊精神,但是在實際的工作過程中,我們除了在出現問題,而且自己解決出現很大困難的時候才會去請教別人(我以前是這樣的,可能每個人都會不同),再就是大家能夠一起聚在一起閒聊、吃飯、唱歌等等開發過程以外的活動。以上的這些的確可以使團隊之中產生一定的凝聚力,可以讓大家和睦相處,但是離真正意義上的團隊還有一定的差距。
我們所受到的教育一直培養的是一種獨立解決問題的能力,所以,再遇到問題的時候我們想到的大多是自己來就解決,而不是和其他人一起來完成。
極限編程的實踐中有一個非常重要的原則就是結對編程,這個原則看起來似乎有些奇怪。因為我們第一個想到的問題就是讓兩個人來同時做一件事情,那麼不就是浪費了一個人的生產力了嗎?但實際上並非如此,這裡所謂的結對編程並非是一個人在編程,另一個在看著,另外一個人也同樣起著非常重要的作用,他的大腦也在不停地運轉,他需要幫助編碼的人找到低級的失誤,防止其編碼出現方向性的錯誤,特別是在出現一個正在編碼的人不擅長解決的問題的時候,他會直接拿過鍵盤,與其交換角色,直接來進行編碼。
這樣做的好處也許只有在實踐了之後才能夠體會到,它不僅可以避免一些錯誤的發生,而且可以通過直接的討論來解決一些容易產生歧義的問題。而且兩個人的思路碰撞出來的火花,能夠更加快速的解決問題。而且,在交流的過程中,大家的水平也會有很快的提高。結對編程的過程也是一起學習的過程。(只可惜我這裡只有一個人,沒有辦法長期實踐,但只要有機會我就會努力的)
3) 開發人員與管理人員的交流
在一個項目組裡面,管理人員和開發人員之間的關系是影響項目的一個非常重要的因素,如果處理不好的化,可能會直接導致一個項目的失敗。而管理人員所具備的素質更是要求很高的。如果是一個從技術人員轉型的管理者,那麼他的管理能力需要很大的提高,否則就會因為管理能力的缺乏而導致項目的混亂。而對於一個單純的具備管理技能的人來說,如何能夠得到技術人員的佩服是十分重要的,否則根本就無法使開發人員聽從管理,那麼他的位置也就岌岌可危了。
而且,如果開發人員能夠和管理人員進行好的交流,那麼他們的工作環境就會得到很大的改善,並不一定要非常豪華的房間和高級的家具,只需要一個可以非常舒服工作的環境,就可以讓一個團隊的戰斗力得到很大的提升。而且,對於一個項目的計劃和預算,如果開發人員能夠提出自己的想法,就會避免最後爭取到了項目卻最終得不到利潤的情況的出現。
管理人員也應該主動的聽取開發人員的意見,很多的開發人員都是一些比較內向的人,如果不向他們詢問,他們只會將自己心中的不滿埋在心中,最後的結果是突然的爆發,然後辭職離去,造成重大的損失。
二、簡單
1) 設計的簡單
在極限編程的過程中,提倡一種簡單設計的實踐。這樣做的原因是由於過多的設計文檔會使我們浪費太多的時間在上面,而且設計文檔沒有不修改的,可能在項目結束的時候,我們會發現當初的設計文檔早已經使面目全非了。
所以,我們在最初的設計工作中要做的是明確我們要實現的最重要的功能,然後設計出總體的框架和核心的技術,這些文檔從頭到尾不會超過十頁紙,那樣即使有了一些改變,我們也不需要花費太多的時間來進行修改了。特別是在有了修改之後,我們不需要費很大的力氣去讓代碼和文檔完全一致了。
但是,簡單的設計並不意味著這些設計是可有可無的,相反,那簡單的幾頁紙更加重要,因為一個項目的核心內容都在上面,所以在編寫的過程中一定要慎重。
2) 編碼的簡單
編碼的簡單表現在迭代的過程中,在極限編程的過程,並非要一下子實現所有需要的功能,也不需要一下子就完成以後不再改變,相反,變化在極限編程中是被提倡的。我們可以先簡單的實現一點功能,然後添加詳細的內容,再後對程序進行重構,最終的代碼將是非常簡單的,因為依照重構的原則進行修改了之後,所有的類和函數、過程都是非常簡短而非冗長的,每一個模塊完成的功能是非常明確的。
但是,不要把簡單和隨意等同起來。盡管我們要實現簡單的編碼,依然要有編碼的標准,使得所有的人都能夠很容易的看懂我們編寫的程序。其它象屬性要使用名詞來定義,過程要使用動詞來開頭的標准也是非常有用的,我們應該遵循。
3) 注釋的簡單
在某些項目中,注釋要求是非常嚴格的,甚至於規定在一個程序中注釋量必須要達到一個百分比。這個初一看起來很有道理,因為注釋能夠讓我們更好的理解程序的功能,但是細想一下,卻完全不是那麼一回事。
曾經有人說過“一般的程序員能夠編寫出計算機能看懂的程序,而一個真正的高手能夠編寫出普通人也能夠看懂的程序”。的確是那樣,與其讓注釋來解釋程序,不如在給變量和過程、函數起名的時候用大家都能夠理解的,那樣即使沒有太多的注釋,另外的一個程序員想要讀懂你寫的程序也不是一件非常困難的事情了。
所以,在編寫代碼的過程中應該盡可能的使用代碼本身來說明問題,而非借助注釋的幫助,我們要編寫的是代碼,如果裡面帶有太多的無關輕重的代碼,一方面會浪費我們的時間,還可能引起歧義;另一方面向微軟的Windows源代碼裡面充滿的發牢騷的注釋就更不應該了。那些注釋只是會給閱讀代碼的人帶來分散注意力的效果了。
4) 測試的簡單
通常我們的項目如果是按照瀑布式開發的化,測試會全部放在編碼完成之後,其中包括單體測試,集成測試,功能測試以及驗收測試等等,而且大多數的測試是通過手工來完成的。所以依據經驗來說,如果編碼使用了20%的時間,測試至少要用掉40%以上的時間。而且在測試的過程中,還有好多問題需要修改,這也是導致測試耗費了大量時間的原因。
而在極限編程中,測試是通過編寫測試代碼來自動化完成的。特別是在一些面向對象的編程環境中,我們可以使用xUnit工具來快速、有效的進行單體測試。而且編寫這些單體測試代碼甚至可以是在正式編碼之前。每一次修改了程序之後,都要運行測試代碼來看程序是否有問題。而且對於程序的集成,極限編程提倡的是持續集成,也就是不斷的將編寫好的通過了單體測試的代碼模塊集成到編寫完畢的系統中,在那裡可以直接進行Test Suit的集成測試,從而保證代碼不會影響到整個系統。
我們可以看到,極限編程中的編碼和測試都是一小步一小步的進行的,這樣就方便我們及時的發現並修改出現的錯誤。而自動化測試工具保證了我們的工作的效率,使我們避免了過多重復的工作。