天天看點

程式員應具備的能力

程式員應具備的能力 

1:團隊精神和協作能力

它是基本素質,是程式員應該具備的最基本的,也是最 重要的安身立命之本

2:文檔習慣

作為代碼程式員,30%的工作時間寫技術文檔是很正常的,而作為進階 程式員和系統分析員,這個比例還要高很多。

缺乏文檔,一個軟體系統就缺乏生命力,在未來的查錯,更新以及子產品的複用時就都會遇 到極大的麻煩。

3:規範化,标準化的代碼編寫習慣

作為一些外國知名軟體公司的規矩,代碼的變量命名,代碼内注釋格式,甚至嵌套中行縮進的長度和函數間的空行數字都有明确規定,良好的編寫習慣,不但有助于代碼的移植和糾錯,也有助于不同技術人員之間的協作。

代碼具有良好的可讀性,是程式員基本的素質需求。

如:整個linux的搭建,沒有規範化和标準化的代碼習慣,全球的研發協作是絕對不可想象的。

4:需求了解能力

程式員需要了解一個子產品的需求,很多小朋友寫程式往往隻關注一個功能需求,他們把性能名額全部歸結到硬體,作業系統和開發環境上,而忽視了本身代碼的性能考慮,有人曾經放言說寫一個廣告交換程式很簡單,這種人從來不知道在百萬甚至千萬數量級的通路情況下的性能名額是如何實作的,對于這樣的程式員,你給他深藍那套系統,他也做不出太極鍊的并訪能力。性能需求名額中,穩定性,并訪支撐能力以及安全性都很重要,作為程式員需要評估該子產品在系統營運中所處的環境,将要受到的負荷壓力以及各種潛在的危險 和惡意攻擊的可能性。就這一點,一個成熟的程式員至少需要2到3年的項目研發和跟蹤經驗才有可能有心得。

5:複用性,子產品化思維能力

複用性設計,子產品化思維就是要程式員在完成任何一個功能子產品或函數的時候,要多想一些,不要局限在完成目前任務的簡單思路上,想想看該子產品是否可以脫離這個系統存在,是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避免重複性的開發工作,如果一個軟體研發機關和工作組能夠在每一次研發過程中都考慮到這些問題,那麼程式員就不會在重複性的工作中耽誤太多時間,就會有更多時間和精力投 入到創新的代碼工作中去。

一些好的程式子產品代碼,即便是70年代寫成的,拿到現在放到一些系統裡面作為功能子產品 都能适合的很好,而現在我看到的是,很多小公司軟體一更新或改進就動辄全部代碼重寫,大部分重複性工作無謂的浪費了時間和精力。

6:測試習慣

作為一些商業化正規化的開發而言,專職的測試工程師是不可少的,但是并不是說有了專職的測試工程師程式員就可以不進行自測;軟體研發作為一項工程而言,一個很重要的特點就是問題發現的越早,解決的代價就越低,程式員在每段代碼,每個子子產品完成後進行認真的測試,就可以盡量将一些潛在的問題最早的發現和解決,這樣對整體系統建設的效 率和可靠性就有了最大的保證。

測試工作實際上需要考慮兩方面,一方面是正常調用的測試,也就是看程式是否能在正常 調用下完成基本功能,這是最基本的測試職責,可惜在很多公司這成了唯一的測試任務, 實際上還差的遠那;第二方面就是異常調用的測試,比如高壓力負荷下的穩定性測試,使用者潛在的異常輸入情況下的測試,整體系統局部故障情況下該子產品受影響狀況的測試,頻發的異常請求阻塞資源時的子產品穩定測試等等。當然并不是程式員要對自己的每段代碼都 需要進行這種完整測試,但是程式員必須清醒認識自己的代碼任務在整體項目中的地位和 各種性能需求,有針對性的進行相關測試并盡早發現和解決問題,當然這需要上面提到的 需求了解能力。

7:學習和總結的能力

程式員是人才很容易被淘汰,很容易落伍的職業,因為一種技術可能僅僅在三兩年内具有領先性,程式員如果想安身立命,就必須不斷跟進新的技術,學習新的技能。

善于學習,對于任何職業而言,都是前進所必需的動力,對于程式員,這種要求就更加高了。

但是學習也要找對目标,一些小coding fans們,他們也津津樂道于他們的學習能力,一會學會了asp,一會兒學會了php,一會兒學會了jsp,他們把這個作為炫耀的資本,盲目的追逐一些膚淺的,表面的東西和名詞,做網絡程式不懂通訊傳輸協定,做應用程式不懂 中斷向量處理,這樣的技術人員,不管掌握了多少所謂的新語言,永遠不會有質的提高。

善于總結,也是學習能力的一種展現,每次完成一個研發任務,完成一段代碼,都應當有目的的跟蹤該程式的應用狀況和使用者回報,随時總結,找到自己的不足,這樣逐漸提高, 一個程式員才可能成長起來。

一個不具備成長性的程式員,即便眼前看是個高手,建議也不要選用,因為他落伍的時候馬上就到了。

具備以上全部素質的人,應當說是夠格的程式員了,請注意以上的各種素質都不是由IQ決定的,也不是大學某些課本裡可以學習到的,需要的僅僅是程式員對自己工作的認識,是一種意識上的問題。

那麼作為進階程式員,以至于系統分析員,也就是對于一個程式項目的設計者而言,除了應該具備上述全部素質之外,還需要具備以下素質:

第一,需求分析能力

對于程式員而言,了解需求就可以完成合格的代碼,但是對于研發項目的組織和管理者, 他們不但要了解客戶需求,更多時候還要自行制定一些需求,為什麼這麼說呢?

一般而言,進行研發任務,也許是客戶提出需求,也許是市場和營銷部門提出的需求,這時候對于研發部門,他們看到的不是一個完整的需求,通常而言,該需求僅僅是一些功能上的要求,或者更正規些,可能獲得一個完整的使用者視圖;但是這都不夠,因為客戶由于非技術因素多一些,他們可能很難提出完整和清晰,或者說專業性的性能需求,但是對于 項目組織者和規劃者,他必須能夠清醒認識到這些需求的存在并在完成需求分析報告的時 候适當的提出,同時要完整和清晰的展現在設計說明書裡面,以便于程式員編碼時不會失去這些準則。

程式設計者必須正确了解使用者需求所處的環境,并針對性做出需求的分析,舉例而言,同樣一個軟體通過ASP租用方式釋出和通過License方式釋出,性能需求可能就是有差別的,前者強調的是更好的支撐能力和穩定性,而後者則可能更強調在各種平台下的普适性和安 裝使用的簡捷性。

第二,項目設計方法和流程處理能力

程式設計者必須能夠掌握不少于兩到三種的項目設計方法(比如自頂至下的設計方法,比 如快速原型法等等),并能夠根據項目需求和資源搭配來選擇合适的設計方法進行項目的 整體設計。

設計方法上選擇不當,就會耽誤研發周期,浪費研發資源,甚至影響研發效果。

一個程式設計者還需要把很多功夫用在流程圖的設計和處理上,他需要做資料流圖以确立 資料詞典;他需要加工邏輯流圖以形成整體的系統處理流程。

一個流程有問題的系統,就算代碼多漂亮,每個子產品多精緻,也不會成為一個好的系統。 當然,做好流程分析并選擇好項目設計方法,都需要在需求分析能力上具有足夠的把 握。

第三,複用設計和子產品化分解能力

這個似乎又是老調重談,前面基本素質上不是已經說明了這個問題嗎?

作為一個從事子產品任務的程式員,他需要對他所面對的特定功能子產品的複用性進行考慮, 而作為一個系統分析人員,他要面對的問題複雜的多,需要對整體系統按照一種子產品化的 分析能力分解為很多可複用的功能子產品和函數,并針對每一子產品形成一個獨立的設計需 求。舉個例子,好比是汽車生産,最早每輛汽車都是獨立安裝的,每個部件都是量身定做 的,但是後來不一樣了,機器化大生産了,一個汽車廠開始通過流水線來生産汽車,獨立 部件開始具有一定的複用性,在後來标準化成為大趨勢,不同型号,品牌甚至不同廠商的 汽車部件也可以進行友善的換裝和更新,這時候,汽車生産的效率達到最大化。軟體工程 也是同樣的道理,一個成熟的軟體行業,在一些相關項目和系統中,不同的部件是可以随 意換裝的,比如微軟的許多桌面軟體,在很多操作子產品(如打開檔案,儲存檔案等等)都 是複用的同一套功能子產品,而這些接口又通過一些類庫提供給了桌面應用程式開發者友善 挂接,這就是複用化的子產品設計明顯的一個佐證。

将一個大型的,錯綜複雜的應用系統分解成一些相對獨立的,具有高度複用性的,并能僅 僅依靠幾個參數完成資料聯系的子產品組合,是作為進階程式員和系統分析員一項最重要的 工作,合适的項目設計方法,清晰的流程圖,是實作這一目标的重要保證。

第四,整體項目評估能力

作為系統設計人員,必須能夠從全局出發,對項目又整體的清醒認識,比如公司的資源配 置是否合理和到位,比如工程進度安排是否能最大化展現效率又不至于無法按期完成。評 估項目整體和各個子產品的工作量,評估項目所需的資源,評估項目可能遇到的困難,都需 要大量的經驗積累,換言之,這是一種不斷總結的累計才能達到的境界。在西方一些軟體 系統設計的帶頭人都是很年長的,比如4,50歲,甚至更老,他們在編碼方面已經遠遠不 如年輕人那樣活絡,但是就項目評估而言,他們幾十年的經驗積累就是最重要和寶貴的财 富。中國缺這麼一代程式員,主要還不是缺那種年紀的程式員,而是那種年紀的程式員基 本上都是研究機關作出來的,都不是從專業的産品化軟體研發作出來的,他們沒有能積累 那種産品化研發的經驗,這也是沒有辦法的事情。

第五,團隊組織管理能力

完成一個項目工程,需要團隊的齊心協力,作為項目設計者或研發的主管人,就應當有能 力最大化發揮團隊的整體力量,技術管理由于其專業性質,不大同于一般的人事管理,因 為這裡面設計了一些技術性的名額和因素。

首先是工作的量化,沒有量化就很難做到合适的績效考核,而程式量化又不是簡單的代碼 行數可以計算的,是以要求技術管理人員需要能真正評估一個子產品的複雜性和工作量。

其次是對團隊協作模式的調整,一般而言,程式開發的協作通常分為小組進行,小組有主 程式員方式的,也有民主方式的,根據程式員之間的能力水準差距,以及根據項目研發的 需求,選擇合适的組隊方式,并能将責權和成員的工作任務緊密結合,這樣才能最大發揮 組隊的效率。

一個代碼水準高的人,未必能成為一個合格的項目研發主管,這方面的能力欠缺往往是容易被忽視的。

綜上可以看到,作為一個主管研發的負責人,一個項目設計者,所需要具備的素質和能力 并不是程式代碼編寫的能力,當然一般情況下,一個程式員通過不斷的總結提高達到了這 種素質的時候,他所具有的代碼編寫能力也已經相當不簡單了,但是請注意這裡面的因果 關系,一個高水準的項目設計者通常已經是代碼編寫相當優秀的人了,但是并不是一個代 碼相當優秀的程式員就可以勝任項目設計的工作,這裡面存在的也不是智商和課本的問 題,還是在于一個程式員在積累經驗,逐漸提升的時候沒有意識到應當思考哪方面的東 西,沒有有意識的就項目的組織和複用設計進行揣摩,沒有經常性的文檔習慣和總結習 慣,不改變這些,我們的合格的項目設計者還是非常欠缺。

另外,為防止有無聊的人和我較真,補充一點,本文針對目标是作商業化的軟體項目和工程,那些科研機構的程式設計高手,比如算法高手,比如圖象處理高手,他們的工作是研究課題而非直接完成商業軟體(當然最終間接成為商業産品,比如微軟研究院在作的研究課 題),是以他們強調的素質可能是另外的東西,這些人(專家),并不能說是程式員,不能用程式員的标準去衡量。

最後補充一點東西,一個軟體項目研發的設計流程是怎樣的呢?以通常标準的設計方法為例,(不過筆者喜歡快速原型法)。

第一個步驟是市場調研,技術和市場要結合才能展現最大價值。

第二個步驟是需求分析,這個階段需要出三樣東西,使用者視圖,資料詞典和使用者操作手冊。

使用者視圖是該軟體使用者(包括終端使用者和管理使用者)所能看到的頁面樣式,這裡面包含了 很多操作方面的流程和條件。

資料詞典是指明資料邏輯關系并加以整理的東東,完成了資料詞典,資料庫的設計就完成 了一半多。

使用者操作手冊是指明了操作流程的說明書。

請注意,使用者操作流程和使用者視圖是由需求決定的,是以應該在軟體設計之前完成,完成 這些,就為程式研發提供了限制和準繩,很遺憾太多公司都不是這樣做的,因果颠倒,順 序不分,開發工作和實際需求往往是以産生隔閡脫節的現象。

需求分析,除了以上工作,筆者以為作為項目設計者應當完整的做出項目的性能需求說明 書,因為往往性能需求隻有懂技術的人才可能了解,這就需要技術專家和需求方(客戶或 公司市場部門)能夠有真正的溝通和了解。

第三個步驟是概要設計,将系統功能子產品初步劃分,并給出合理的研發流程和資源要求。 作為快速原型設計方法,完成概要設計就可以進入編碼階段了,通常采用這種方法是因為 涉及的研發任務屬于新領域,技術主管人員一上來無法給出明确的詳細設計說明書,但是 并不是說詳細設計說明書不重要,事實上快速原型法在完成原型代碼後,根據評測結果和 經驗教訓的總結,還要重新進行詳細設計的步驟。

第四個步驟是詳細設計,這是考驗技術專家設計思維的重要關卡,詳細設計說明書應當把 具體的子產品以最'幹淨'的方式(黑箱結構)提供給編碼者,使得系統整體子產品化達到最 大;一份好的詳細設計說明書,可以使編碼的複雜性減低到最低,實際上,嚴格的講詳細 設計說明書應當把每個函數的每個參數的定義都精精細細的提供出來,從需求分析到概要 設計到完成詳細設計說明書,一個軟體項目就應當說完成了一半了。換言之,一個大型軟 件系統在完成了一半的時候,其實還沒有開始一行代碼工作。

第五個步驟是編碼,在規範化的研發流程中,編碼工作在整個項目流程裡最多不會超過1/ 2,通常在1/3的時間,所謂磨刀不誤砍柴功,設計過程完成的好,編碼效率就會極大提 高,編碼時不同子產品之間的進度協調和協作是最需要小心的,也許一個小子產品的問題就可 能影響了整體進度,讓很多程式員是以被迫停下工作等待,這種問題在很多研發過程中都 出現過。編碼時的互相溝通和應急的解決手段都是相當重要的,對于程式員而言,bug永 遠存在,你必須永遠面對這個問題,大名鼎鼎的微軟,可曾有連續三個月不發更新檔的時候 嗎?從來沒有!

第六個步驟是測試

測試有很多種:

按照測試執行方,可以分為内部測試和外部測試

按照測試範圍,可以分為子產品測試和整體聯調

按照測試條件,可以分為正常操作情況測試和異常情況測試

按照測試的輸入範圍,可以分為全覆寫測試和抽樣測試

以上都很好了解,不再解釋。

總之,測試同樣是項目研發中一個相當重要的步驟,對于一個大型軟體,3個月到1年的外 部測試都是正常的,因為永遠都會又不可預料的問題存在。

完成測試後,完成驗收并完成最後的一些幫助文檔,整體項目才算告一段落,當然日後少 不了更新,修補等等工作,隻要不是想通過一錘子買賣騙錢,就要不停的跟蹤軟體的營運 狀況并持續修補更新,知道這個軟體被徹底淘汰為止。

繼續閱讀