寫代碼的三重境界


搞IT的就是修電腦的,做軟件的就是寫代碼的。后一句可能更對一些,因為學校是這么教的,開發工作中的確也是這么在做。然而,新手在寫代碼,牛人也在寫代碼,他們之間有什么區別?為何新人老手相互之間不理解?新手如何成長為牛人,老手如何百尺竿頭更進一步?BDD、TDD為何興起,又為何難以推行?軟件研發公司的寫代碼能力提升為什么這么難?寫代碼的三重境界記錄了關於寫代碼的一些思考。

 

1. 寫代碼的三重境界

1.1 寫代碼三重境界之第一重境界是見山是山。

對第一重境界的人來看,寫代碼就是軟件開發的全部,軟件開發人員的工作就是寫代碼,如果沒有在寫代碼,軟件開發人員就沒有在工作。

他們會第一時間投入到代碼編寫工作中,編寫的代碼可以運行是他們的追求。他們喜歡調試工具,並將調試和直接運行作為驗證的主要手段。在他們看來,寫代碼是簡單的,設計不是必要的。他們對需求不求甚解。

1.2 寫代碼三重境界之第二重境界是見山不是山。

在第二重境界的人眼中,寫代碼只是軟件開發的一個階段,這只是軟件開發人員工作中比較低級的一種,軟件開發人員還有需求分析、架構、設計等更重要的工作在做。

他們會很晚才進入編碼階段,因為在這之前,他們還有需求分析、架構、設計等更重要的工作要完成,而編碼只是上述工作的一種結果呈現,編寫的代碼沒有錯誤是他們的追求。也許他們會承擔一部分測試工作,但這不完全是他們的工作。在他們看來,前期設計好是最重要的,寫代碼只是一種實現而已。他們對需求吹毛求疵,把細節討論到極致,以避免在后續設計和編碼工作中出現遺漏。

1.3 寫代碼三重境界之第三重境界是見山還是山。

在第三重境界的人眼中,寫代碼是軟件開發中非常重要的一部分,寫代碼並運行的方式不僅用來實現需求,還用來探索需求、嘗試實現和演化設計。

他們會很早就開始寫代碼,寫代碼的過程和探索需求、嘗試實現與演化設計等過程有效的聯系在一起,形成一種持續反饋學習的閉環。代碼不是最重要的,准確簡潔的達成業務目標並且具有更好內部結構的可運行軟件才是他們要的。有時他們甚至會有意識的舍棄對於探索需求、嘗試實現和演化設計過程中的部分代碼。測試是他們的首要工作之一,是寫代碼並運行的關鍵一環,用於形成快速的閉環反饋。在他們看來,有些高層前期設計是必要的,而其他的很多設計則是通過寫代碼演化出來的。有時,他們用代碼為需求設立標准,並通過不斷反饋探索需求並糾正理解偏差。有時,他們快速給出原型,和客戶一起挖掘真正的解決方案。

 

2. 對三重境界的思考

2.1 軟件開發人員成長之路

大多數情況下,新手都處於第一境界。也有一些具有很豐富經驗但知識缺乏的老鳥處於這一階段。他們認為軟件工程都是些紙上談兵的東西,對分析模式、設計模式、架構方法等方法缺乏認識和掌握。他們對自己的代碼能力相當自信,特別強調實干對代碼能力提升的作用,只有在看到對方的代碼確實比自己好時才會服氣。經過訓練或者在實際工作中屢屢碰壁后,第一重境界的同學能意識到分析設計的重要性,開始學習掌握分析設計能力,向第二重境界轉變。

大多數同學在工作經驗積累后能到達第二重境界。第二重境界的同學對軟件工程有所了解,對UML圖等工具相當精通,推崇面向對象、分析模式、設計模式、架構方法等。他們比較傾向於自頂向下的設計,期望嚴格分階段執行需求分析設計實現測試等過程。雖然知道重構、演化設計之類的概念,但對於他們來講,重構還未形成習慣,還是不得已而為之。

只有很少的同學能夠從第二重境界走到第三重境界。這些同學本身不缺乏分析設計技能,UML、面向對象、設計模式等都有掌握。更重要的是,他們對軟件開發的認識發生了變化,軟件不是實現出來的,而是演化而來的,軟件開發的主體是人,可工作的軟件比代碼更重要。重構、演化設計變成了他們的基礎技能,他們是TDD、BDD、DDD等方法的嘗鮮者與積極推動者。

2.2 境界之爭

軟件開發人員間的相互爭執很多,境界差異導致的相互不認可也是其中重要的一種。一重境界的同學嫌二重境界的同學動作太慢,小題大做,太理論化,動不動就分析模式、架構設計,二重境界的同學則認為一重境界的同學太過莽撞,思考不足,難以解決復雜一些的問題。二重境界的同學很不理解三重境界同學的工作方式,看起來設計能力挺強一個人怎么那么急於編碼呢。一重境界同學也受不了三重境界同學,動不動就是工作習慣,又在推行新方法,寫代碼就寫代碼好了,還分什么高低貴賤。

對大多數公司而言,第二重境界是常見的選擇。它的好處是非常明顯的。首先,第二重境界和公司的開發流程極其配合,活脫脫的瀑布;其次,人員成長路徑清晰,從寫代碼到做設計再到業務架構、技術架構,這是一條可控的成長路徑,符合公司崗位模型;最后,在做事上易於管理,在人員成長上易於管理,容易設計崗位績效,當然就選它。然而,它也帶來了壞處,第二重境界中學習探索變成了一個階段,而不是在整個過程中要做的事情,並且學習探索的比例隨着公司對可預測、可管理性要求的加強會進一步降低,公司在軟件研發中的學習和創新能力會以不那么顯著的方式持續下降。直到有一天,公司意識到創新能力下降帶來的危機,但為時可能已晚。

在這種環境下,人員要成長到第三重境界變得更加困難。因為你不是和一個人(你自己)在戰斗,你要面對的是整個環境。最好也最簡單的方式就是去適應環境,成為第二重境界的堅決追隨者。

2.3 BDD、TDD為什么這么難?

BDD、TDD(如果你不了解這些名詞,建議查一下)是第三重境界工作方式的典型示例。對於那些已經在第三重境界浸淫已久的牛人而言,這就是他們每天工作的方法。他們所做的就是把它描述出來,有時還開發出一些工具來簡化學習掌握這些工作方式的成本。

然而,軟件開發人員認為BDD、TDD很難,大多數人都還未具備探索需求、演化設計的能力。對第一重境界實干類型的軟件開發人員,他們只有兩種選擇,其中一種是完全接受它,沖上去寫測試代碼,做到95%甚至100%的測試覆蓋,很快他們會發現寫測試代碼和維護測試代碼會變成巨大的痛苦;另一種則是完全忽略它,痛苦就是自己的代碼還是沒提升,而且天天有聲音在耳邊說BDD、TDD更好。對第二重境界的軟件開發人員,他們感到很不安全,軟件開發工作脫離了控制,開發次序被打亂,設計會在后續工作中不斷變化,一切不再是盡在掌握。而且,轉到BDD、TDD后的前幾次嘗試都不能帶來更高的生產率或者更好的結果,這不是個好東西。

同時,公司也不會接受。采納這些實踐會打亂公司的現有研發流程,讓可預測的管理變得更加困難,崗位分工的邊界被打破並不再清晰,部分員工會抱怨做了原來自己不需要做的事情,管理者在聽到研發人員說設計演化時會變得沒有信心,我只想要結果,你卻告訴我它會變。

 

尾聲:

你還在寫代碼嗎?你自認為處於哪個境界?最近幾個月你寫代碼的能力有提升嗎?朝着什么方向提升的?

據我的觀察,大多數公司的寫代碼能力處於一種停滯狀態,很難想象在這種狀態下公司還能產出越來越優秀的軟件產品。你公司的寫代碼能力是否處於停滯狀態?公司對寫代碼能力的提升做過哪些努力?為什么最終都收效甚微?

 

參考:

好文推薦:看山還是山的人生三重境界http://hi.baidu.com/djkcn/item/f8a5cfef327a50265a2d643d

圖書推薦:《卓有成效的程序員》,對第二章加速的態度能很好的測試出你屬於哪個階段。

圖書推薦:《程序員修煉之道——從小工到專家》。

圖書推薦:《浮現式設計:專業軟件開發的演進本質》。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM