軟件產業發展到今天,分工越來越細。程序員做為一個通用的稱謂已經無法確切定義各種工作的特點和分類。正因為軟件開發中各種職責區分不清,無論是剛剛寫代碼的新手還是具有多年經驗的老手,一概被扣上程序員的通用名稱,這也使得很多進入這個領域的軟件開發人員無法制定自己未來的技術職業發展之路。
實際上,軟件公司也逐漸認識到了對程序員分類的重要性,開始將各種職位定義的更加準確。對于從事軟件開發的程序員來說,更需要盡快明確自己的發展方向,并在此方向上將專業知識積累的更深厚,這能讓你盡快逃脫對未來發展方向的迷茫。為此,我們專門推出程序員成長系列的特別策劃,將分別深入探討軟件設計師、測試工程師、文檔工程師、項目經理、產品經理幾種角色的成長之路。
程序員成長系列之一
軟件設計師可以預先構建軟件結構,如同建筑架構師一般。比爾·蓋茨被稱為微軟公司的首席軟件設計師,首先是因為他是一個優秀的架構設計師,中國同樣需要這樣的人才。-微軟大中國區總經理黃存義
從程序員到軟件設計師
2000年1月13日下午,世界軟件業巨人、美國微軟公司突然在位于華盛頓州雷德蒙德市的總部舉行新聞發布會。比爾·蓋茨把微軟CEO寶座拱手讓給長期伙伴史蒂夫-巴爾默,只保留董事局主席一職,但同時出任新職務“首席軟件設計師”。比爾·蓋茨說:“今后我將全力設計開發面向未來的新軟件,同時研究制定微軟的總體技術發展戰略。” 比爾·蓋茨的這一舉動將軟件設計師的稱謂蒙上了高貴的面紗。從程序員的技術方向發展來看,軟件設計師無疑是職業生涯的頂峰。
拿破侖說過“不想當元帥的士兵不是好士兵”,我想不想當軟件設計師的程序員也不是好程序員。但首先要了解什么是軟件設計師,如何才能成為軟件設計師。明了這些,就有可能向軟件設計師發展,創造更輝煌的程序人生。基于這些想法,我們采訪了佳軟CTO廖恒毅,用友軟件副總工程師彭六三和U8產品總設計師鄧適宜,這些中國軟件產業技術帶頭人從他們的切身體會談了對軟件設計師的看法。
軟件設計師的定義
軟件設計師包括軟件系統設計師(System Designer)和軟件架構設計師(Architect)。系統設計師應對“系統結構”所使用的軟件技術非常了解,自身具備良好編程技巧,才能成為優秀的系統設計師。系統設計師的職責是把結構模型對應到實現模型上,從概念到實現期間規劃和組合模型的優劣是決定軟件系統設計師好壞的標準。而軟件架構設計師是程序員技術方向的最終歸屬,也是成長鏈中最神圣的一環,架構設計師的貢獻最大。架構設計師徹底擺脫了語言的束縛,知道軟件發展趨勢。他們會開發新一代產品或者制定新一代產品的方案。軟件架構設計是面向未來的。全球大規模的軟件公司并不多,很重要的一個原因是因為軟件產品的發展都滯后于市場需求,即有需求后再研發產品,而不是預見需求,預先設計,因此往往軟件設計局部是合理的,但從整體的角度看卻不合理。要解決這些問題就要看軟件架構設計師的能力了。
軟件設計可以分三個層次。第一層屬于標準層,像J2EE、.Net的框架設計;第二種屬于系統層的設計,比如Delphi這樣的開發工具就是工具系統級的設計;而應用最廣泛的是第三層:應用軟件設計。基于中國軟件產業發展的現狀,大部分設計都是這個層次上的基于應用的架構設計,本文所非特殊標明,提到的軟件設計師泛指應用軟件系統設計師,當然有些也是架構設計師的能力所在。
從軟件開發歷史看,軟件設計經歷了很多階段。最早是結構化設計,只是把復雜的問題逐層分解,通過流程圖形式將任務逐級細化;后來出現面向對象設計,從底層進行對象封裝、繼承、多態,這時更多的是考慮代碼重用,面向的主要是類和對象。接下來出現組件設計,這主要是面向應用方面。這三種都是面向功能的設計。
從EJB、COBRA技術出現之后,人們開始基于框架進行設計,也就是架構設計。繼續發展,就是基于規則的設計了,比如基于模塊和工作流的設計,這時主要考慮客戶化做的更詳細以及產品的開放性、可擴展性、可靠性、效率方面的問題。
軟件設計師的工作
隨著大型軟件開發越來越多,整體把握軟件架構變的越來越重要。尤其當用戶需求并不明確的情況下,就要開始做軟件,如何防止交付的軟件產品和用戶的要求差的很遠,這就需要軟件系統設計師進行恰當的設計。
在應用軟件開發中,軟件設計師擔當承上啟下的角色,也就是把用戶的需求,基于應用的問題變成計算機系統中可以解決的問題。設計可以分為功能上的設計和技術體系上的設計,但在實際工作中,這兩者很難區分清晰。彭六三談到,NC(用友大型ERP系統)是通過總體設計組這個團隊共同完成軟件設計的。首先要進行產品定義,規定產品要做什么,以及相關的市場、產品周期和前景等問題,產品所應用的技術方向也會有一些描述。接下來是總體設計,總體設計要考慮技術架構以及與應用有關的問題。像跨地域的大型產品肯定要選擇慮B/S架構。每個模塊中功能節點也要定義,應用組件和描述的數據模型也要做出來,諸如形成哪些標準平臺,軟件如何分布,應用環節都屬于總體設計的范疇。總體設計再向下細分就是詳細設計。詳細設計完成之后就是編寫代碼了。
對于軟件設計,廖恒毅有自己的觀點。他認為軟件設計師如果面對很復雜的設計,即便將架構設計出來,別人如何去實現也是很困難的。既然自然語言不如程序語言表達的清晰,他喜歡先用代碼的方式把整個框架架構好,并編寫基本的組件和接口代碼。這樣其他的程序員就可以很方便的復用自己的基礎組件,并利用預留的接口添寫完整的代碼。做為軟件設計師,他能夠提供一個平臺性的開發環境,讓其他的程序員方便的進行擴展開發。這不僅降低了開發難度,而且節省了大量的重復勞動。復用模塊也可以提高系統的穩定性,因為這是經過多次測試的代碼。
軟件設計師的周圍也有很多角色,應用專家對應用需求分析了解的更深。還有技術平臺的專家,因為盡管設計師對技術平臺有一定的了解,但對于細節的內容還要請教技術平臺專家的,還需要程序員做出原型并進行驗證,通過反饋和評估不斷完善。最終用戶的反饋也是軟件設計師非常重視的。
軟件設計師的要求
做為應用軟件開發中最頂層的角色,軟件設計師的能力要求更強,除了具備更強的編程技巧能力外,還需要了解系統結構、主流軟件技術和軟件趨勢,同時要具備相當的專業知識。
多年編程經驗:既包括在專業領域的經驗,也包括在軟件工程領域的經驗。對于一個構架團隊,這些素質要求可由各團隊成員來分別承擔,但其中至少要有一名構架設計師能夠把握項目的全局。和任何行業一樣,經驗是最重要的。軟件設計不是紙上談兵,一個軟件設計師首先要是非常好的程序員。軟件設計師在編程的時候,用的工具和普通程序員沒有任何差別,但使用深度是絕對不一樣的。廖恒毅花了三天寫了個處理表格的程序,因為考慮的很巧妙,代碼不到一千行左右,但有人寫只是畫表格單元的代碼就有二千多行,這就是經驗的差距。做軟件設計的時候,肯定要求是可實施和可測試的,如果沒有做過程序員,就無法保證這個設計是可實施并進行測試。
抽象能力:一個程序員剛寫程序的時候,無非就是為了解決某個功能而進行代碼編寫。隨著程序編寫越來越多,他對自己所做的應用方面的理解也越來越多。不同的企業有不同的需求,但把這些企業放在一起來看的話,就會發現他們的一些共性。將這些共性提煉出來,這就是抽象的過程。抽象出來的共性形成的模型可以把這些企業的需求都包含進去,這是做通用軟件必須要走的一步。
哪些東西是可以抽象的呢?鄧適宜舉例說:企業管理軟件內部有很多內部票據流程,票據傳遞有自己的規則,要把他們內部的關系比較靈活的組織起來,只能把流程做為管理對象,而不能把票據做為管理對象,因為票據只是一個載體。這樣做,整個系統的柔性會更強,產品才能適合不同的企業,讓企業可以靈活的控制,取得最好的效益。。
廖恒毅更是將抽象發揮的淋漓盡致。他整個管理流程抽象成不斷矩陣運算的過程,軟件本身就是做矩陣運算的乘法器和分解器。其他程序員只需要將具體的業務抽象為以XML表達的矩陣,放入到這個矩陣中,利用乘法器做運算就可以了。
面向對象的思想:面向對象是軟件開發出現以來最偉大的創新之一,這是每個程序員都追求的,但是否真正掌握了面向對象的思想,這是需要探討的。面向對象并不受開發工具和語言的限制。很多程序員在用C++寫面向對象的代碼時候,實際上還是在寫C代碼。甚至使用C#這種完全面向對象的語言寫出來的還是流程化的程序。
很多時候學習面向對象用屏幕上畫圖的方法,新的形狀可以從標準的形狀中轉化而來,用來學習繼承的概念。但廖恒毅認為這遠遠不夠,因為屏幕上對象相互之間是獨立的,是沒有作用的離散關系。要真正學習面向對象,就要去學畫表格。表格是由行組成的,同時也是由列組成的,行中又有獨立的單元格組成。作為一個行,要整體去操作這些格,做為列,也要去操作這些格,到底是以行為單位還是以列為單位去操作單元格。如果能把這個搞清楚,那才表明你對面向對象理解的夠深刻。廖恒毅笑著說:“有的程序員在程序中把所有的東西都繼承到一起,爺爺動的時候,孫子跟著跳,孫子動的時候,爺爺跟著晃。實際上,寫面向對象的代碼,一定不要用太多的繼承。最關鍵的是如何傳遞消息和產生動作,以及考慮各個模塊之間通過什么接口來聯系,而不是再繼承。”
面向對象可以應用的領域非常廣泛。不僅在寫代碼的過程中要考慮到面向對象,實際上在設計和分析階段也可以用面向對象的方法。
舍得拋棄:軟件設計是一個漸進過程,是通過不斷碰壁,不斷調整提高的。要想取得突破,就需要舍得拋棄。廖恒毅說:“通常情況下,我寫的第一版程序是要被扔掉的。對于一個功能,我上來就寫,也不做設計,什么都不想,寫到最后,自己都煩了,然后就把這些代碼刪除掉再重新寫,這些腦中有了很多體會和印象,寫完第二版之后,也會扔掉,繼續寫第三版的代碼。這時程序邏輯架構和關系自然就很清晰了。只有用這種不斷消滅自己以前的東西方面才能夠成長的特別快,這就像相當于脫殼,不過這需要自己對自己要求很嚴格,否則又會回到原來的老路子上了。”很多人舍得扔掉自己的代碼的,往往是不斷的修改,最后進入一個惡性的循環。當然,這種拋棄也是有繼承的拋棄,不同時期產品的架構之間也有連續性,不是一個架構就會完全取代前面的架構,好的東西還是可以繼承的,像微軟的.NET架構就是從DNA架構上發展來的。
領悟和突破:程序員技術成長一種是通過學習技巧而成長,一種是通過思想領悟而得到成長,后者更為重要。如果不能領悟開發的思想,僅僅掌握了技巧,一旦改換了平臺和語言,又要從頭學起,所以很多人在轉型過程中失敗了。而掌握了編程的思想,自動就移過去了。廖恒毅表示:“語言本身從來不對我產生任何障礙,各種語言沒有任何本質的差別,就象練武一樣,刀背也可以當錘子用。” 《》
即便是很小的軟件,也可以鍛煉突破性的編程思維。廖恒毅以自己寫拼音加加的經歷講了一個例子。“輸入法體系結構和流程很簡單,就是原生數據庫和后生數據庫加上一個簡單的界面。但在處理退格的時候,你會發現這是一個很復雜的問題,如果按照常規的方法考慮各種出現的情況,程序幾乎是無法寫下去了。其實方法很簡單,只要做一個正向編輯器,定義好一個字母產生什么樣的操作,二個字母產生什么樣的操作,一個字符串產生什么樣的操作,并抽象成為每個操作對應后臺進行什么樣的操作。刪掉一個字母,無非就是把字符串去掉一個,重新處理一遍就可以了。這個問題就變得很簡單。總結出來一種基本的設計原則和思路,就是程序設計千萬不要回溯,否則就會崩潰,這是腦袋碰墻多少次之后才明白的。所以說盡管編程序寫了十幾年了,到現在還不敢稱完全領悟軟件設計,而是一直在找這種感覺。”
非軟件知識:提起軟件設計師,人們很喜歡那建筑師做比較,的確這兩個行業有很多相似之處。古羅馬建筑師維特魯威說“理想的建筑師應該既是文學家又是數字家,他還應通曉歷史,熱衷于哲學研究,精通音樂,懂得醫藥知識,具有法學造詣,深諳天文學及天文計算。”軟件設計師同樣如此。
廖恒毅說“所有讓人去思考,一切美的東西都會吸引我,我欣賞每個行業中有內涵的東西。”甚至包括周易五行,他都覺得這對開發軟件有很大的幫助。“周易五行的一套自我完備運行的體系結構,它也有自己的對象和作用關系。各種對象之間不是獨立的,而且衍生出來的作用關系讓整個系統運轉的更加自然。我編程的時候也用這種思路,努力去尋找整個程序中的內部作用關系。”
鄧適宜也有自己的看法,他覺得軟件系統比起建筑來,更象一臺機械。因為建筑一旦完成之后就很少改變它的結構,但機械不一樣,它是一臺可以通過改裝改變不斷增加功能的系統。“現在機械制造中經常是把機器分解為多個組件,分別生產,只有到最終銷售的時候,才根據用戶的需求把各個組件拼接組合起來產生不同的功能,這稱為延遲制造。這種想法在我們的軟件開發中也經常用到。我們也開發了很多靈活的可視化組件,在實施的時候才根據用戶的需求進行組裝,不僅滿足了客戶的個性化需求,而且也降低了開發成本。U8軟件中的ERB模塊要提供第三方軟件的接口程序,為了保證穩定性和下一代產品的延續性,我們做了一些模塊,可以通過注冊擴展功能,很象機械中的插件。”
向軟件設計師發展
當然,并不是每一個程序員都適合向軟件設計師角色發展的。除了自身的努力之外,還同所處的環境有很大的關系,如果只是幾個人的小公司,對軟件設計的要求不明確,自然也就無法得到鍛煉。鄧適宜說自己早期接觸的軟件開發環境都是比較大型的基于UNIX的大型數據庫環境,從中學到了很多東西,受益菲淺。
彭六三介紹說,在用友這樣開發大型軟件的公司中,程序員成長是很快的。一個普通的程序員,在代碼編寫多之后,首先可以成為一個主程序員。除了他的編程能力更強,在一個開發小組中起主導作用之外,他實際上也具有了一定的設計能力。接下來,就是和深入的了解具體的應用。除了面向對象的程序設計一定要具備,對具體應用的深入了解也是必不可少的,否則無法去設計產品。要想繼續發展,接下來的工作就是要更多了解技術標準方面的知識了。
不過,即便你是一個普通的程序員,沒有機會參與大型的軟件開發項目,也可以在開發中向軟件設計師的思維靠近,提升自己對軟件開發的認識。一個播放軟件,不同的用戶對界面有不同的需求,如何滿足不同的需求也是需要設計的,而播放軟件對不同格式文件的支持也是需要考慮的,尤其是為未來的格式預留接口,這些問題是需要在架構中考慮。不管軟件大小,都可以應用設計模式的東西。
補充資料
新聞:10月18日,微軟董事長兼首席軟件設計師比爾·蓋茨宣布了旨在培養2000名中國軟件大師的“Architect 2000高級軟件研發主管研修計劃”項目。此次微軟推出的“Architect 2000高級軟件研發主管研修計劃”,以培養軟件構架高層次人才為宗旨。該計劃將用一年的時間,通過與中國11個軟件開發園區的合作,為中國領先軟件企業的首席技術官員提供軟件設計體系原則、開發技巧和最新技術的培訓,從中培養出2000個中國軟件架構設計師。
微軟(中國)公司開發合作部經理王靜茹表示,這個項目主要解決中國軟件產品化程度不夠高、軟件開發項目管理程度不夠高的問題。該計劃用一年的時間,通過與中國11個軟件開發園區合作,為中國領先軟件企業的管理人員提供培訓。它選擇的培訓對象來自獨立軟件開發商、系統集成商和大型軟件企業,針對這3類企業選送的技術主管進行培訓。“類似培訓目前在其它發展中國家都沒有開展。國外類似培訓,受訓者每人要付幾千美元,而在中國的這次培訓是免學費的。學員參加開發研討會等也是免費的,只需交1500元的資料費。“王靜茹說。
到目前為止,微軟為這項培訓已經投入1000萬元,用來邀請老師、建立技術支持等等,同時還要做一個專門的網站。“當然,微軟的投入還包括自己的核心技術,這是無價的。”
業內人士評價說:微軟的“Architect 2000高級軟件研發主管研修計劃”其實并不是真正的培養軟件架構設計師,而是培訓使用微軟.NET構架的高級系統分析師。從學員的反饋來看,課程的內容無非是近期微軟的主打基于WEB的企業解決方案及其開發新秀.NET。具體的內容包括三方面:統一的、位置無關的的數據訪問標準XML-.NET的核心之一;Web Service -.NET的應用服務核心;.NET戰略的目的。
-
軟件工程師
+關注
關注
8文章
218瀏覽量
21136
發布評論請先 登錄
相關推薦
評論