系統程式設計師成長計劃-序
寫作背景
在經歷過幾個大型的,失敗的專案之後,我終於明白沒有什麼比高素質的程式設計師更能決定專案的成功了,無論什麼過程,什麼程式語言和開發工具,離開了高素質的程式設計師,什麼都是白費力氣。毫無疑問,人是軟體開發中最重要的因素,但不是每個人都重要,不是什麼樣的人都重要,只有那些高素質的程式設計師和那些對專案有突出貢獻的人才是重要的。
不過高素質的程式設計師並不多見,所以從我開始帶人之際,就在思考團隊成員培養的問題。我做過很多嘗試,從小組內學習到整個部門一起上大課,最後又回到對個人單獨的輔導;從通過codreview做現場教育到制定過一個巨集偉的培訓計劃,最後又回到一個樸素的培訓過程。其中遇到了很多問題,開始是培訓不夠系統,效果不甚理想,後來又因為計劃過於”巨集偉”而無法實施,直到最後行成一個樸素的,切實可行的培訓方案,中間經過了好幾年時間,直到去年,整個計劃才趨於完善。我把這個培訓計劃稱為系統程式設計師成長計劃,這就是我在這個系列中要寫的。
培訓內容不是來源於某本書,畢業八年來,我堅持不斷的看書,家中放了7大儲物箱,有300多本不同型別的書籍,其中囊括了大部分經典的IT圖書。當然也不是全部內容都來源書本,這幾年我在開源軟體吸取了大量的營養,一些思想和經驗在broncho專案中也有充分的發揮,可以說是理論,經驗和實踐的結合。但我不嘗試闡述什麼高深的道理,相反我是針對應屆畢業生和業餘愛好者寫的,目的是要讓初學者進階為一個專業的程式設計師。
為什麼叫 系統程式設計師成長計劃?程式設計師的範圍太廣了,雖然軟體開發有很多相似之處,但是隔行如隔山,比如對於目前炙手可熱的WEB開發,我完全是外行。想什麼都講一點,結果是什麼都沒有講清楚,所以我得把培訓計劃限定在我熟悉的範圍之內。先定義一下系統程式設計師:從事作業系統核心、DBMS、GUI系統,基礎函式庫,應用程式框架,編譯器和虛擬機器等基礎軟體開發的程式設計師。這些培訓同樣適用於桌面軟體和智慧手機軟體開發,我想對其它軟體開發也會有一些啟發作用。
草莓醬定律與果醬定律。第一次在諮詢的奧祕中看到草莓醬定律時,我覺得非常有意思。當然這個系列也無法脫離草莓醬定律的魔法,利用這個系列中的內容,我手把手的教了十多個同事,收到了良好的效果。當有數百個讀者讀這些文章時,我不敢期望有同樣的效果。不過在果醬定律的鼓勵下,我相信這個系列中至少有部分內容的價值不會因為讀者群的增大而消失,所以最終決定寫出來。
中心思想
軟體開發的困難在哪裡?對於這個問題,不同的人有不同的答案,同一個人在不同職業階段也會有不同的答案。作為一個系統程式設計師來說,我認為軟體開發有兩大難點:
一是控制軟體的複雜度。軟體的複雜度越來越高,而人類的智力基本保持不變,如何以有限的智力去控制無限膨脹的複雜度?我經歷過幾個大型專案,也分析過不少現有的開源軟體,我得出一個結論:沒有單個難題和技術細節是我們無法搞定的,而所有這些問題出現在一個專案中時,其呈指數增長的複雜度往往讓我們束手無策。
二是隔離變化。使用者需求在變化,應用環境在變化,新技術不斷湧現,所有這些都要求軟體開發能夠射中移動的目標。即使是開發基礎平臺軟體,在超過幾年時間的開發週期之後,需求的變化也是相當驚人的。需求變化並不可怕,關鍵在於變化對系統的影響,如果牽一髮而動全身,一點小小的變化可能對系統造成致命的影響。
為了解決這兩個問題,方法學家們幾十年來不斷努力,他們發明或改進軟體的開發過程和設計方法。系統程式設計師面對的基礎軟體通常都是大型的複雜的軟體,其通用性也要求能容納更多變化,解決這兩個問題也是系統程式設計師成長計劃的主要目標。
文章特色
以引導讀者思考為主。培訓可以製造合格的程式設計師,卻無法造就一流的高手。培訓是一個被動的過程,我們都知道在大學裡聽課的效果,我不希望本系列文章的成為單純的培訓教材,相反我們要變被動為主動,最大限度的提高學習的效果。大多數情況下,我先提出問題讓讀者去思考,讓讀者自己嘗試去解決,能不能解決這個問題不重要,重要的是在思考中提升自己。如果讀者在一定時間無法找到解決問題的方法,後面會有專業程式設計師的參考做法(或許不是最優的)。
以簡單的例子講述複雜的設計方法。我曾經制定一個巨集偉的培訓計劃,結果失敗了,原因是我忘記了我在走路之前也艱難的爬行過。這次我吸取了教訓,用簡單的示例講述複雜的設計方法,而且不對讀者的背景太多假設。裡面不會出現複雜的資料結構和演算法,也不會引入大型軟體來唬人。即有足夠的挑戰,不會讓讀者感到乏味;又一切盡在掌握之中,不會因為挫折而打擊積極性。
技術能力與工作態度並重。古人說德才兼備者才是君子。同樣,做一流的程式設計師,也要德才兼修才行。當我手把手的教別人的時候,我不但希望他能學會我講的知識點,更希望他能學習我的工作態度和作為程式設計師的道德素養。當然有些東西只可意會不可言傳,未必能用文字表達出來,不管怎樣這是我的初衷之一。
讀者群
這個系列完全是針對初學者寫的,初學者包括在校學生、應屆畢業生和其他業餘愛好者。我面試過很多應屆畢業生,他們大多數都不具備程式設計能力,唯一的優勢就是對基本理論有一知半解的瞭解。本系列文章就是為他們量身定製的,經歷十幾個人的實踐,取得令人滿意的效果,大多數人在開始一行程式碼都寫不出,到培訓結束時一般都能獨立開發/維護一些幾千行的小模組。本系列文章並不是金鑰匙,最終學習的效果與個人的悟性和努力密切相關,但不管怎樣,只要讀完這些文章,你都會有不小收穫的。
如何使用
溫伯格說過,醫生的藥方包括藥物和服藥的方法,兩者缺一不可。同樣的教材,不同的學習方法,效果也有很大差別。對於本系列文章的服用方法,我的建議是,對於文中提出的問題,先自己想辦法去解決,可以查資料,至少經過兩三個小時的思考之後,再繼續閱讀,最後再按學到的方法獨立寫一遍,學習程式設計一定要多寫多練,否則效果會大打折扣。