軟體人才不是從書本中來,也不是從證書中來。軟體人才只能從實踐中來,從軟體中來!
軟體業的發展是關係到中國高科技能否站到世界前沿的一件大事,受到國家有關領導部門及資訊產業界人士的高度重視。一個產業的發展需要有三個基本條件,即資金、人才和市場。今天的專欄針對如何培養軟體人才進行分析和論證。
軟體人才的缺乏是世界上眾多國家,包括世界第一大軟體國美國,所共同面臨的問題。由於中國軟體業發展相對較晚,規模較小,人才缺乏就顯得更加突出。在政府大力號召和支援國內軟體產業發展的情況下,如何以快速度培養出一大批高品質的軟體人才就成了一個很迫切的話題。
從過去一年多看來,國內的解決方法大致有兩方面。一是軟體人員的培訓。新辦的全國35所軟體學院去年秋季都已開始招生,有讀碩士的、博士的,也有讀本科或第二學士學位的。有的班面向所謂“藍領”人才,即軟體工程師;也有的班面向“白領”或“高級”人才,即軟體結構設計師或經理級的管理人才。同時,許多脫產的或業餘的軟體培訓班亦應運而生,以滿足希望轉行的技術人員之需要。
解決方法的第二方面則是軟體企業的培訓。更具體地說,就是通過CMM的考試認證,來提高一個企業在開發軟體方面的素質。一年前,通過CMM3級的企業還屈指可數。目前一些企業已達到CMM4級,而最近東軟則率先達到了CMM5級的認證。
學院式的培訓以及CMM的認證是否能達到快速培養高品質人才的目的呢?軟體人才到底從何而來?要回答這些問題,必須先了解軟體是怎麼開發的,軟體人員需要什麼技能和知識結構,以及軟體人員的成長路線。根據在美國Sun公司領導軟體開發團隊的經驗以及多年在矽谷的耳濡目染,我認為軟體開發與其說是科學技術不如說更像藝術或體育,紮實的基本功與刻苦的訓練雖然重要,但最終的成功是通過大量的實戰,不斷地積累經驗,不斷地在比賽中磨練而獲得的。
軟體人才的知識結構
一個軟體產品不是存在於真空中的。 它是針對某一類應用的需要,通過一定的開發工具,面對某些特定的運行平臺而開發出來的。 因此, 除了足夠的電腦背景和編程技巧之外,一個好的軟體工程師還要具備如下幾方面的知識:
1. 通用的軟體工程知識。譬如,一個好的工程師應懂得從產品需求書、項目規劃、軟體系統框架設計,到具體介面設計、編程、測試等一系列步驟,知道哪一步應做什麼。
2. 軟體應用領域的專業知識。舉例說,如果一個軟體是為銀行業所用的,那麼懂得相關銀行業務就對軟體的設計和修改有決定性的作用。而如果設計的是java.net這個套裝程式,就一定要了解其他程式員怎樣使用網路介面最方便,因為java.net是針對這一群“用戶”的通用介面。
3. 具體軟體工具和環境的知識。在做一個軟體產品前,要選定軟體的應用平臺、作業系統,以及編程所用的程式設計語言和開發系統。用Java 開發一個運行在Solaris伺服器上的企業級的應用軟體與用C++編寫Windows XP上的個人應用軟體,對一個工程師的專業知識結構有很不一樣的要求。譬如,如何利用Java虛擬機的特點提高程式效率,如何利用CVS的特點更有效地管理開發,如果是開源軟體,如何與開源社區協調等等,問題都因項目而不同。
顯然,這些知識大部分是在軟體班的課堂上學不到的。只有通過大量實踐,才有可能成為軟體開發的專家。而也只有能力強,吸收快,積累多的人才有可能成為專家。
管理人才與高級技術人才
所謂軟體“高級”人才是指資深的軟體工程師。他們的工作偏重於軟體開發的帶頭作用,設計產品框架,解決疑難問題,以及輔導中、初級的工程師。所謂軟體“管理”人才是指軟體產品部門的經理級人物。他們的主要任務偏于管理,既管理團隊又管理軟體產品開發的整個項目。
管理人才和高級技術人才是兩類截然不同的人才。高級技術人員需要深厚的技術基礎,大量的軟體開發經驗,有品味的結構和介面的設計能力,以及對各種開發系統和平臺擁有既廣泛又深入的了解。在博得其他技術人員的尊敬以外,好的高級技術人員也應具有較強的領導能力、親和力,能在技術上領導大家的同時,在非技術方面也成為大家的“領袖”。
而管理人才則需要很強的運作能力,能有效地計劃(包括資金和時間),分配資源,指揮多個不同功能的部門。在預定的時間內,在不超過預算的情況下,做出高品質的軟體產品。管理人員還需較多與客戶及其他部門打交道,所以人與人之間的交流和溝通能力,書面及口頭表達等方面要求都很高。管理人員同樣要得到員工的信賴與支援,才能起到領導作用。
這兩種不同的人才在素質上,甚至在性格上, 都有不同的特點,但卻有共同之處,那就是好的人才大多是工程師出身,有足夠的技術背景。高級技術人員是從普通工程師中脫穎而出,這一點可能比較容易理解。可為什麼軟體管理人才最好也從工程師中選拔呢?簡單地講,軟體部門的經理必須要了解軟體工程師的工作方式、愛好、習性等等,才能有效地管理。自身出於工程師的行列,比其他人在管理上有許多天然的優勢。而更重要的是,一個部門的經理,天天面對著許多決策性的問題。譬如說,如何解決產品在性能、品質和開發時間三方面不可避免的矛盾。或在產品研發過程中,當出現了新的市場動向,需怎樣應變。要決策這些管理上的問題,實際上必須掌握較深的技術知識,才能做出準確的判斷。反過來, 一個不懂技術的管理者,則通常要配備一個高級技術人員做“軍師”。而且在遇到兩、三種不同的技術意見時,會很難定奪。 縱觀Sun的幾大硬軟體產品部門,絕大多數管理人員都是從工程師這個位置起家的。
下面我以Sun公司的產品部門為例,看看在技術和管理方面,以及在低中高三個層次上,人才是如何配置的。 (本文所使用的級別名稱引自Sun公司全球人事系統規範,與某些地區工作上的用法不一定完全吻合。)
軟體部門的人才結構
在Sun公司,一般工程師 (Member of Technical Staff) 分為四級。做到第四級時,能力就應已經十分強,技術上多多少少可以獨擋一面。從第四級再往上走,就要做一個比較大的職業選擇。這是晉陞的第一個比較大的“坎”。 一條路是升為高級工程師 (Staff Engineer)或“高工”。高工內又分為二級。做到高級高工 (Senior Staff Engineer),則應能同時主導數個項目的技術方向。 當然,級別越高,要求也越嚴,年終評定也把得越緊,很少能拿到優。
再往上走,就遇到第二個大“坎”,即升到傑出工程師 (Distinguished Engineer) 或院士 (Fellow) 。在Sun全球一、二萬技術人員中,傑出工程師和院士共計六十人左右,每個人通常在某一技術領域有突出的造詣 ,是工業界在世界上的領先人物。 這些人是主持Sun硬軟體系統開發的技術帶頭人,一般不直接管人或項目。大部分時間處理技術問題,做設計和寫程式也是很經常的事。
另一條路是升為部門經理,分為普通經理和高級經理二級。 如果再升,就要躍過大“坎”,到總監,甚至副總裁。這些人則是以管理為主。部門經理與軟體開發的細節接觸還很多,而總監或副總裁就與編程無緣了。
選擇兩條路中的哪一條,一是要看機會,二是要看個人的能力與愛好。在Sun,不是誰想當經理就能當上的,也不是拿個“白領”班的畢業證書就行了。 通常的情況是,一個工程師在工作中顯示出經理人才的素質,經過定向培養和一段實踐後,再提拔起來。這裡,定向培養包括選修一些管理的基礎課,其中涵蓋有關管理法律知識的課程,以及由該人的上級進行一定量的諮詢輔導。
在工程師成長的過程中,要避免的一個大問題就是把最有成績的技術人員不分三七二十一,不論他們是否有管理的天賦或願望,都提拔成經理,讓他們去管理人和項目。這個問題的原因是,在許多公司,升為經理是唯一提拔的途徑。 這樣一來,不僅沒得到優秀的管理人員,還丟掉了好的高級工程師。 解決這個問題的有效辦法之一,就是給技術人員開闢一條寬廣明亮的職業發展道路。在Sun公司,為了鼓勵技術人員,高級技術人員的四級(從普通高級工程師到院士)與管理層的四級(普通經理到副總裁)在級別上一一對應,在工資待遇等方面一律劃等號。當然,由於工作性質的關係,從人數上講,高級工程師遠遠多於經理,但總監或副總裁則遠遠多於傑出工程師和院士。
除了技術人員以外,一個完整的軟體開發部門還應有配套的程式管理(Program Management)、文檔管理(Documentation)、測試和質管(Quality Assurance),以及產品化(Release Engineering) 部門。本文在這些方面就不多談了。 但值得一提的是Sun有一整套產品生命週期的流程(Product Life Cycle, 簡稱PLC)。而我們的Program Manager,則要確保產品的開發,嚴格遵守PLC的流程規範。
軟體開發與CMM
說到PLC,自然想到CMM,因為PLC可以說是Sun內部的產品研發規範。由於國內對CMM的重視,許多人問我,CMM到底有沒有用。CMM是美國卡內基梅隆大學軟體工程院提出的一套軟體企業研發和管理的規範。近年來有不少國內外單位採用,一方面通過實施CMM來提高軟體開發過程的管理水準,同時以CMM證書來說明自己的實力。 學習CMM,自然比不學習要有用處。就像一個想成為作家的人去上寫作課一樣,聽聽別人是怎樣寫的,小說都有哪幾種形式等等,不無啟發作用。另外,也時常聽到有些公司說CMM使軟體開發效率提高,使錯誤和返工率下降,程式穩定性提高。
但拿到CMM的認證與一個企業的軟體研發能力是否有必然的關係,恐怕就不一定了。世界上一流的軟體公司,包括Sun、Oracle、微軟、IBM、BEA、Adobe、蘋果、MacroMedia等,沒有一家用CMM作為產品開發的規範。而世界上一流的軟體產品,如Unix(Solaris、HP/UX、AIX)、Linux(RedHat、SuSE)、微軟Windows、辦公套件(微軟Office、StarOffice、OpenOffice)、排版軟體(FrameMaker、InDesign)、瀏覽器(微軟 IE、Netscape Navigator、Mozilla、Opera、Safari)、網站伺服器(Appache、SunONE Web Server)、應用伺服器(WebLogic、WebSphere,、SunOne Application Server)、Java(J2ME、J2SE、J2EE)、微軟 .NET等許多其他產品,也都不是用CMM開發出來的。
這並不是說CMM沒用處,而是說明沒有CMM同樣可以開發出世界一流的軟體產品。大家之所以信賴這些著名公司所開發出來的產品,歸因于這些公司多年努力開發一流產品所帶來的聲譽而已。