職業程式設計師培養之道

  軟體開發是以人為核心的過程,對人的依賴性遠高於傳統的硬體生產企業,為了保持開發能力的穩定性,一方面需要定義軟體過程,以過程為樞紐將人、技術、工具銜接起來,另一方面也要加強人才的培養,使人的工作能力能夠穩定、提高人員的自治性。隨著社會需求的膨脹,對程式設計師的需求量、對熟練的程式設計師的需求量在劇增,然而對程式設計師的培養問題卻成了一個盲點,學生在學校里學習的是關於軟體開發的基礎知識,軟體企業需要的是熟練的能夠快速開發出產品的程式設計師,需要程式設計師具有很強的實用知識,因而出現了明顯的學校教育與實際需求脫節的問題。企業反映新畢業的學生知識老化、動手能力太差、缺乏實用理論知識、缺少工程管理知識等問題。儘管社會上有各種各樣的專業程式設計師培訓班,但是距離企業的實際需求仍然有較大的差距。在企業中培養一名合格的程式設計師一般需要3個月到半年時間,對企業來講,這個周期就顯得太長了,所以一般的企業不願要新畢業的學生,企業希望程式設計師能夠“來則戰之,戰則勝之”。無論如何,對程式設計師來講總是要面臨一個成長的過程,希望學校或者培訓班來解決這個問題很難,因為程式設計師不是標準件,程式設計師不是教育出來的,是在實踐中乾出來的,最終還是要在實踐中來培養程式設計師,這是任何軟體企業必須承受的,因此,對軟體企業來講需要有一套機制,一套辦法來培養程式設計師。
那么,我們需要從哪些方面來培養程式設計師呢?大體來講,包括以下幾個方面:精神、能力、理論基礎、工作方法、工作習慣。
1、精神
軟體開發是一項智力勞動,需要開發人員很投入的工作,因而需要開發人員能夠熱愛軟體開發,有工作熱情,有投入的精神。如果一個程式設計師缺少一種投入的精神,他不可能在最需要他投入精力的時候來工作。有的人很聰明,但是他對軟體開發沒有興趣,或者他工作很不專心,雜事很多,工作效率很低,別人1天能幹完的,他需要3天甚至5天才能幹完,而且還漏洞百出,這樣的程式設計師需要儘早識別出來,儘早轉換工作。
現在的工作環境對程式設計師的誘惑很多,比如遊戲、qq、各種新聞等等,這些誘惑使不能很好處理這些關係的程式設計師瀏覽忘返,浪費了大量的時間,降低了工作效率。程式設計師的業績很大程度上不是取決於其智商,而是取決於其情商。
2、能力
程式設計師最主要的能力可以概括為3點:良好的邏輯思維能力、良好的溝通能力與良好的學習能力。
  良好的邏輯思維能力
軟體的開發過程是解決複雜業務邏輯的過程,是簡化複雜邏輯的過程,是用精確來實現模糊的過程,開發人員需要具有良好的邏輯思維能力才能勝任。現實空間是模糊的,數字空間是精確的,在現實世界中很簡單的問題,在數字空間中來模擬時,就變成了一個複雜的問題。它要求程式設計師能夠全面、準確、簡潔地把握問題、分析問題、解決問題。
在筆者接觸過的很多程式設計師新手中,很少有程式設計師能將下列的題目解答的完全正確:
畫出解答下面問題的程式流程圖:輸入三個整數,作為三角形的三個邊,判斷是否構成:等邊、等腰、直角、銳角、鈍角三角形。
這個題目的邏輯很簡單,需要的處理的邏輯包括:
1 輸入的合法性判斷:輸入的是否是正整數
2 是否構成三角形:任意2邊之和大於第三邊
3 是否構成等腰或等邊三角形
4 是否構成鈍角、直角、銳角三角形
答題者常見的錯誤有: 序號 常見的錯誤1
沒有判斷輸入的合法性2沒有判斷是否構成三角形3判斷為其中一種結論時就結束了,沒有考慮到:等邊三角形也是銳角三角形,等腰三角形可以是鈍角也可以是直角或銳角4程式內部邏輯複雜


上邊的題目是一個很簡單的程式,但是類似的邏輯問題在實際的軟體開發中是經常用到的,需要程式設計師能夠對各種情況進行仔細的分析、歸納、總結,如果在這樣的問題上出錯是很難成為出色的程式設計師的。
  溝通能力
現在的軟體越來越龐大,根本不是單兵作戰能解決的,需要多人來協同工作,比如一套簡單的進銷存系統可能就要產生30萬行代碼,按每人天生產100行代碼來估算,也需要3人年,再加上分析、測試等的時間,需要6人年才能完成,因此就需要開發人員具有很好的溝通能力。作為程式設計師要善於溝通,習慣溝通。程式設計師在交流問題時,往往在描述問題是什麼時要花費大量的時間。這種現象在項目組中是經常出現的:在給一個程式設計師布置任務時,講清楚任務比他完成這項任務花費的時間還要多,而有的程式設計師自己心裡明白,但是說不清楚,或者乾脆就不說,這些情況都會降低整個團隊的工作效率。
  學習能力
軟體的新技術發展很快,開發人員必須能夠不斷的跟蹤、學習新技術,要有很好的學習能力。只有善於學習的人,才能夠不斷進步,在實踐中快速成長。真正優秀的程式設計師一定是掌握了很好的學習方法的程式設計師,否則現在是優秀的程式設計師,2年後可能就被淘汰了。

3、理論基礎
如果基於.net做多層結構的軟體開發,以下的知識是必須的:作業系統原理、實體關係理論、sql語句、oo基本理論、數據結構、vc++/java、com/dcom、asp/html、psp/tsp/iso 9000/cmm、專業英語、程式設計風格等。可以看出如果沒有學過數據結構、程式設計方法、資料庫概論、以及軟體工程的基本知識,要想在現在的環境下成為一名合格的程式設計師顯然是很困難的,而且一名熟練的程式設計師需要的知識可能還遠不止這些。掌握了基礎的計算機科學理論,再擁有一定的學習能力,才能不斷的進步。
4、工作方法
有很多程式設計師不會高效率的編寫程式,也不知道如何高效的調試自己的程式,這不僅僅是對於工具掌握不熟練的問題,而是沒有掌握一些基本的方法。做為程式設計師來講需要掌握幾種最基本的方法如:程式的設計方法、程式的調試方法、新工具的學習方法等。
在很多程式設計的課程中都講解了程式的設計方法和調試方法,但大都是從理論的角度來講解的,而不是從工程的角度來論述的。比如說對於事件驅動的編程,在程式設計時首先要做的應該是窮舉事件,然後再設計事件之間的信息共享的機制,設計事件的內部處理邏輯等,這些基本的方法往往是程式設計師迷惑的地方。再如調試程式時採用常規錯誤檢查單、單步執行、記憶體變數查看等方法。
在實踐中經常看到很多程式設計師在學習一種新的開發工具時,不知道從何下手,對老師的依賴性很強,總是希望有師傅手把手地來教他,這一方面是個人的認知能力問題,另一方面也說明他沒有掌握基本的學習方法,如:
在學習一種新語言時,先通讀有關的類、標準函式,過程等,從整體上有個印象,當需要時可憑記憶查詢資料。
類比。 與以前熟悉的語言進行類比。
詢問他人,互通有無。
閱讀示範程式。
網上檢索相關的資料等。
5、工作習慣
良好的工作習慣是程式設計師個人開發過程成熟的體現,是效率的保證。程式設計師的培養很大程度上是習慣的培養。有的程式設計師總是沒有寫注釋的習慣,結果一個月後他要花費很長的時間才能讀懂自己寫的程式;有的程式設計師經過簡單考慮後就急於去寫程式,往往是把簡單的問題搞複雜了,複雜的問題搞亂了,效率很低。對於一個好的程式設計師必須養成一些好的工作習慣:
按照明確的編碼過程工作
職業的程式設計師設計的時間長於編碼的時間,業餘程式設計師編碼的時間長於設計的時間;職業的程式設計師是設計程式,業餘程式設計師是調試程式;職業的程式設計師是預防bug,業餘程式設計師是修改bug。為什麼會出現這種情況呢?因為職業的程式設計師一定是按照一個規範的編碼過程來工作,編碼的前期工作量超過了其實際的編碼工作量。在進行任何一項編碼工作時,需要按一個規範的過程來進行。首先要定義清楚做什麼,包括功能範圍、接口,任務要明確,不能似是而非;其次要想清楚如何作,包括數據結構、算法;第三,要定義清楚驗收標準,如何檢驗自己做對了;第四,動手編程式、調程式;最後,測試程式。按照規範的過程來編碼,才能真正提高工作效率。
編碼之前寫文檔
軟體設計文檔是軟體實現思想的載體,是開發人員之間、開發人員與管理之間交流的工具,是設計人員與編碼之間、設計人員與需求人員之間的一種約定,是組織的軟體設計經驗的積累,是組織軟體財富的記錄,是軟體復用的基礎。只有真正認識到了設計文檔的重要性,才能積極主動的來寫文檔。對程式設計師而言,在動手編程之前通過寫文檔可以把實現的方法想清楚、表達清楚、討論清楚,這是已經通過無數的實踐來證明了的好經驗。 初級的程式設計師往往在寫程式的過程中發現越寫越覺的複雜,程式越改越亂,等真正把工作做完了,再反思一下,卻發現原來是很簡單的事情,為什麼會有這種感覺呢?問題就在於事先沒有真正想清楚,弄明白,一旦進入問題的解決細節中,就很容易出錯了,所以職業的程式設計師應該是培養起寫文檔的好習慣。
  遵循設計進行編碼
程式設計師不能隨意自己決策,不按設計人員的設計去施工。同一個問題,可能有多種解決方案,在考慮解決方案時,程式設計師想的是局部,設計人員想的是全局,因而在進行決策時,設計人員是從全局的角度的考慮問題。在這種情況下,程式設計師要嚴格按照設計去實現,不能在如何實現上偏離設計,造成隱患。對於設計中有疑問的問題,可以討論,但是不可以隨意變更。
按照良好程式設計風格編碼
有人講程式設計是一門個人藝術,他飽含了程式設計師個人的創造性,正是這樣,才使得很多程式構思精巧,耐人尋味。但是同時它卻使得程式的可讀性較差,尤其是在多個人合作開發一個軟體時,風格迥異的程式使得軟體的可靠性與可維護性大大降低。程式設計語言一方面是人與計算機之間進行交流的工具,它還是人與人之間進行交流的工具。單純的作為人機交流的工具,只要程式能夠正確地忠實地表達設計者的思想,也就發揮了其作用,但是人與人之間的交流沒有一種固定的統一的模式,因此作為人與人之間的交流工具,還要表達的清晰易懂,能夠為其他程式設計師所理解,這也正式要求程式設計師講究程式設計風格的主要原因。
維護好自己的開發環境
俗話講:磨刀不誤砍柴工。程式設計師的工具主要就是計算機,程式設計師必須維護好自己的開發環境,常用工具要裝齊,無用的軟體不要裝,要定期防毒、定期備份,減少非正常停機,確保環境能夠正常進行,保證環境的乾淨,否則就會因為環境的問題降低工作效率。
總之,培養程式設計師是一個長期的艱苦的過程,程式設計師是可以培養出來的,頂尖的程式設計師是在職業的程式設計師中選出來的。