程序員的四個境界

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

  國學大師王國維先生認為古今成大事業、大學問者,必經過三種 境界,第一種境界:“昨夜西風凋碧樹。獨上高樓,望盡天涯路”;第二 種境界:“衣帶漸寬終不悔,為伊消得人憔悴”,第三種境界:“眾里尋 他千百度,驀然回首,那人卻在燈火闌珊處”。一代宗師真是體察入微, 寥寥數語,道盡了求道者的心路歷程,將一個人由淺嘗、迷茫到徹悟的過 程盡數概括,可謂入木三分。

  IT行業可謂現在的熱門行業,程序員也是很多人羨慕的工作。薪 水高,不用東跑西顛,敲敲鍵盤,看看屏幕,一切工作全都搞定,輕松而 方便。果真如此嗎?不盡然,實際上,程序員的職業生涯也是一個求道的 過程,需要不斷的提高和學習,IT行業知識更新之快,常讓程序員們有隨 時掉隊的危險,無一日不戰戰兢兢,不敢稍有懈怠。

  程序員的職業生涯也可分為四個階段,初級程序員(菜鳥)、高級 程序員(熟練工)、系統程序員(高手)、軟件大師(大師),其作品也經歷四 種境界:

  · 可以運行的程序

  · 健壯、高效的程序

  · 結構優美的程序

  · 思想深邃的程序

  程序員的必經第一個階段都是編寫可以運行的程序。很多人的編 程生涯是從“Hello World”開始,當第一次按照教科書上的步驟,將源 文件編輯完后,編譯、連接、運行,在屏幕上顯示出“Hello World”時 ,心中的激動一點也不亞于阿里巴巴打開了寶庫的大門。初級程序員的目 標一般是讓程序能運行起來,他們迷惑于庫函數的眾多,不知道該用那一 個,他們還要學習基本的語法,以使程序編譯通過。初級程序員一般不會 考慮設計模式、軟件結構等問題。記得本人編寫的第一個較大的程序是本 人的本科畢業論文題目——一個計算機輔助實驗系統,開發工具為Turbo C,在DOS下開發(那個時候Windows還不太流行,怎么樣,年代夠久遠吧) ,整個軟件大約7000行代碼,在當時已經能干不少事,在DOS下也能顯示 不少花里胡哨的圖形界面,支持中文,支持鼠標操作(那時候在DOS下需要 自己處理鼠標事件中斷),當時還頗受好評。可是今天再重新溫習過去的 作品,真有點摻不忍睹,整個軟件毫無結構可言,一共分成兩個源文件還 是由于編譯器不支持一個太大的源文件而被迫分開,整個系統就是源代碼 的簡單堆砌。相信每個程序員都需要經歷這個階段,它是程序員職業生涯 的開始,沒有捷徑可以跨越,只有不斷的實踐、學習和總結。

  第二階段的程序員已積累了不少的編程經驗,語法和庫函數不再 是障礙,他們已不再滿足于程序正確運行、功能實現無誤。他們需要了解 程序背后發生的事情,需要了解操作系統的原理和調度機制,內存管理, 文件系統組織等;了解開發工具的細節,如C的函數調用機制,參數的傳 送機制、堆棧的建立過程等;了解C++的封裝、繼承和多態性背后的機制 ,虛函數實現機理等。他們不僅知道程序應該如何運行,還知道它為什么 這樣運行,能編寫高效、魯棒的程序。

  第三階段的程序員能構建結構優美的軟件系統,軟件系統結構的 合理性、可擴展性、可維護性、可測試性是系統程序員考慮的重點,結構 優美的軟件系統同一棟完美的建筑群一樣,每個部分各司其職,搭配合理 。本人一直認為,一個好的軟件系統應當具有美學特征,如簡潔、和諧、 層次感等,一個好的軟件系統應當是簡潔的,易于理解的;應當是和諧的 ,每個部分高內聚、低耦合,既分工又合作;應當是層次分明,易于維護 和移植。所以,本人建議那些進行軟件系統設計的程序員,當你設計完一 個系統后,需要問問自己:"它美嗎?",如果答案是否定的,那么我建議 你需要重新考慮系統的設計,如果答案是肯定的,那么,恭喜你,你已經 達到一個相當高的水平。

  最后一級也許是每個程序員夢想達到的頂峰,程序設計不再是簡 單的工具,而是大師們改變世界的魔杖,從C到C++,再到COM和COBRA,再 到XML和WEB SERVICES,每次改變,不是軟件語法和開發工具的升級,而 是用軟件構建現實世界模型的改變,是一種軟件思想的革命,軟件具有了 靈魂和智能。如果沒有理解這一點,認為C++只是更好的C,COM只是更好 的C++話,你就沒有了解它們的精髓和思想性。

程序員的七宗"罪"

  雖然軟件工程的思想已被絕大部分程序員所接受,但要將這種思 想轉化為軟件開發過程中的種種自覺行為卻不是一件很容易的事。究其原 因,有很多因素,如很多程序員缺乏專業化的訓練,重技巧,輕規范,包 括一些計算機專業科班出身的程序員也存在這種問題;再如很多公司只注 重軟件產品的開發結果,不注重開發過程,客觀上也影響了程序員的目標 取向。如此種種,使很多中國的軟件公司難以邁上一個新的臺階,發展壯 大也就無從談起。程序員們作為軟件產品的創造者,當然也難辭其咎。

   下面所列不過是產品開發過程中諸多問題中的其中幾個, 也許你不會犯這樣的錯,我還是引用一句老話:“有則改之,無則加勉” 。

一宗罪:以偏概全

  大家都知道,在對一種產品決定立項開發前,都需要進行產品開 發的可行性進行分析,而其中的市場分析至關重要,其實市場分析無外乎 三點,一是要開發的產品是有市場需求的,二是公司有能力獲取這份市場 ,三是公司能從產品中獲益(不一定是指賺錢,如公司戰略利益等)。看似 簡單的幾點,想要完全弄清楚決非易事,所以很多產品的市場分析容易“ 以偏概全”,如通過個別用戶的特定要求或報刊雜志的片面報道將產品市 場無限擴大(分析人員自己想象的),技術驅動而忽略用戶需求和成本(如 銥星計劃)等,至使產品開發完后沒有預期的市場效果。想要全面而準確 地的進行產品的市場分析確實是很不容易,需要平時的積累和理性的分析 思考,不能靠撞大運。

二宗罪:畫貓成虎

  大家也許有這樣的經歷,產品開發完畢交付用戶使用后,用戶總 是不滿意,如不符合他們的使用習慣,功能設置不合理等。所以產品的需 求分析是如此重要,沒有正確的需求,軟件開發得再好,技術再先進,也 不過是當擺設的花瓶。程序員們,尤其是系統分析員容易犯的第二宗罪就 是“畫貓成虎”,曲解了用戶的要求。一份好的需求分析不是簡單地將用 戶的每個具體的需求點記錄下來,而是要洞察用戶每個具體要求背后的動 機,將分散的需求點串成一個有機的整體,基于需求并“超越需求”。一 個好的系統分析員不僅是一位軟件專家,還要是一個出色的領域知識專家 和溝通者。

三宗罪:好大喜功

  項目延期好象是軟件開發一個必經的步驟。項目經理在制定開發 計劃時,往往過于樂觀,每個開發階段都按最樂觀的估計來計算開發時間 ,而沒有充分考慮到軟件開發的特殊性和不可預見性,程序員可能都有這 樣的經歷,一個非常小的BUG可能要耽誤很長的時間,使開發進行不下去 。所以項目經理切忌“好大喜功”,因為項目的不斷延期會打擊項目成員 的信心和士氣,久而久之,會使大家產生一種慣性:項目延期是正常的。 當然,這也不能完全怪罪項目經理們,因為在國內,很多項目計劃都是采 用倒排序的方法,即先確定產品交付的時間表,再依次倒推測試、實現、 設計和分析所需的時間,而整個開發的時間往往是那些從沒實際開發過產 品的領導來拍腦袋決定的。

四宗罪:只顧眼前

  即便是最優秀的系統分析員也不能保證所提供的軟件系統需求不 會變化,所以軟件設計人員要充分考慮這一點,不能僅僅"只顧眼前"的需 求,還要有一定的前瞻性,滿足可預見的未來需求,軟件系統的可擴展性 和可維護性對于一個大型、復雜、長生命周期的軟件系統來說至關重要。 打個比方理解一下軟件的可擴展性,給一個10歲的孩子做一條褲子(需求) ,你不能將褲子的長度裁減得剛剛與孩子的身高合適(設計/實現),因為 孩子長身體很快,到他11歲時褲子已經短了(需求變化),有兩種方法解決 ,一是將短了的褲子丟棄,重做一條(重新開發系統),但成本很高;二是 將在褲腿上接上一段接著穿,但不美觀且不宜操作(維護成本高)。而最恰 當的做法是將褲子裁減得稍長過現在的要求,將長的部分反縫在褲腿里, 等孩子長高后,拆線將原來長的部分放下一點就可以了(擴展方便),既方 便又不失美觀。可見,可擴展性并非軟件系統專利,裁縫們早已理解了這 一點并付與實踐。

五宗罪:得過且過

  軟件設計需要通過軟件實現成為最終的產品,優秀的設計需要靠 一行一行的代碼體現,而有些程序員對軟件實現的態度是,最小滿足原則 ,“得過且過”,對于系統的容錯性,安全性,效率考慮甚少,滿足基本 功能即可,沒有持續改進的態度和精神。

六宗罪:自我安慰

  產品實現是否達到設計要求在公司內部需要測試驗證,嚴格的測 試對于保證軟件產品的質量是必須的,而出于時間、資金等緣故,很多軟 件產品并沒有經過嚴格的測試就已交付給用戶使用,程序員們總是善于" 自我安慰":應該沒問題吧。"想當然"不能消除缺陷,只有測試再測試才 是科學的精神。

七宗罪:敝帚自珍

  技術總是向前發展的,不要過于“敝帚自珍”,抱著原有的東西 不肯放棄,軟件產品也有生命周期,該終結時要毫不猶豫。

程序員的七種武器

信息技術的發展時間雖然不長,但其爆炸式的發展速度使信息技 術迅速覆蓋社會和人類生活的各個角落。程序員們是這場信息化浪潮的見 證者之一,更是其中的主要參與者,這是時代賦予每個程序員的機會和責 任。

信息技術的更新速度是驚人的,程序員的職業生涯則是一個要求 不斷學習的過程,永遠不能固步自封。本人在工作期間曾看見過很多程序 員只要有閑暇時間就瀏覽一些沒有太大作用的網頁,在網上聊天,打游戲 ,浪費了大量的時間,十分不可取。而另外一種情況是,IT技術的日新月 異使很多程序員眼花繚亂,什么都想學,卻又不知從何學起,今天看看這 個,明天學學那個,貪多不熟。

雖然IT技術發展迅速,但很多技術都是有規律可循,一些基本的 概念、原理和方法還很通用,可以舉一反三。本人根據自己的體會和經驗 ,向那些剛剛踏入IT行業的新程序員們或正在迷茫的程序員們推薦程序員 必須掌握的七種武器,有了這七種武器,雖不敢說笑傲江湖,但將自己立 于不敗之地還是可以的。

第一種武器:開發工具

至少熟練掌握兩到三種開發工具的使用,這是程序員的立身之本 ,其中C/C++和JAVA是我重點推薦的開發工具,C/C++以其高效率和高度的 靈活性成為開發工具中的利器,很多系統級的軟件還是用C/C++編寫。而 JAVA的跨平臺和與WEB很好的結合是JAVA的優勢所在,而本人對SUN公司的 “網絡即計算機”的概念相當欣賞,并相信JAVA即其相關的技術集JAVA One會成為未來的主流開發工具之一。其次,如果能掌握一種簡便的可視 化開發工具,如VB,PowerBuilder,Delphi,C++ Builder,則更好,這 些開發工具減小了開發難度,并能夠強化程序員對象模型的概念。另外, 需要掌握基本的腳本語言,如shell,perl等,至少能讀懂這些腳本代碼。

第二種武器:數據庫

為什么數據庫是如此重要?很多應用程序都是以數據庫的數據為 中心,而數據庫的產品也有不少,其中關系型數據庫仍是主流形式,所以 程序員至少熟練掌握一兩種數據庫,對關系型數據庫的關鍵元素要非常清 楚,要熟練掌握SQL的基本語法。雖然很多數據庫產品提供了可視化的數 據庫管理工具,但SQL是基礎,是通用的數據庫操作方法。如果沒有機會 接觸商業數據庫系統,可以使用免費的數據庫產品是一個不錯的選擇,如 mySQL, Postgres等。

第三種武器:操作系統

當前主流的操作系統是Windows,Linux/Unix,熟練地使用這些操 作系統是必須的,但只有這些還遠遠不夠。要想成為一個真正的編程高手 ,需要深入了解操作系統,了解它的內存管理機制、進程/線程調度、信 號、內核對象、系統調用、協議棧實現等。Linux作為開發源碼的操作系 統,是一個很好的學習平臺,Linux幾乎具備了所有現代操作系統的特征 。雖然Windows系統的內核實現機制的資料較少,但通過互聯網還是能獲 取不少資料。只有對操作系統有一定的了解后,你會發現自己上了一個新 的臺階。

第四種武器:網絡協議TCP/IP

在互聯網如此普及的今天,如果您還沒有對互聯網的支撐協議 TCP/IP協議棧有很好的掌握,就需要迅速補上這一課,網絡技術已改變了 軟件運行的模式,從最早的客戶/服務器結構,到今天的WEB Services, 再到未來的網格計算,這一切都離不開以TCP/IP協議棧為基礎的網絡協議 支持,所以,深入掌握TCP/IP協議是非常必要的。至少,你需要了解ISO 七層協議模型,IP/UDP/TCP/HTTP等常用協議的原理和三次握手機制。

第五種武器:DCOM/CORBA/XML/WEB Services

隨著技術的發展,軟件與網絡的無縫結合是必然趨勢,軟件系統 的位置無關性是未來計算模式的重要特征之一,DCOM/CORBA是當前兩大主 流的分布計算的中間件平臺,DCOM是微軟COM(組件對象模型)的擴展,而 CORBA是OMG支持的規范。程序員需要做的不僅僅是利用商業的開發平臺來 開發軟件,而是要理解這些技術的初衷,即為什么需要這項技術,如果你 能理解了這一點,再回頭看這些技術的具體實現,就如庖丁解牛,迎刃而 解。XML/WebServices重要性不言而喻,XML以其結構化的表示方法和超強 的表達能力被喻為互聯網上的“世界語”,是分布計算的基石之一。

第六種武器:軟件工程與CMM

現代大型軟件系統的開發中,工程化的開發控制取代個人英雄主 義,成為軟件系統成功的保證,一個編程高手并不一定是一個優秀的程序 員,一個優秀的程序員是將出色的編程能力和開發技巧同嚴格的軟件工程 思想有機結合,編程只是軟件生命周期中的其中一環,優秀的程序員應該 掌握軟件開發各個階段的基本技能,如市場分析,可行性分析,需求分析 ,結構設計,詳細設計,軟件測試等。一句話可以概括我的看法:“創意 無限,流程保證”。

第七種武器:強烈的好奇心

什么才是一個程序員的終極武器呢,那就是強烈的好奇心和學習 精神。沒有比強烈的好奇心和學習精神更好的武器了,它是程序員們永攀 高峰的源泉和動力所在。


  "程序員之路漫漫兮,吾將上下而求索",希望與所有的程序 員共勉。希望知識、經驗能共分享,為中國的信息技術發展添自己的一份 力。


附:給編程愛好者的忠告

  近來有不少人問我是學Vb好還是學C好,還有人問Vc和C++Builder 哪個更好,還有人說只要是面向對象的就是好的所以C++和Java最有前途 。以我從事計算機教育多年的經驗我要告訴這些編程愛好者,如果只是一 味追求學會一門所謂的最先進的編程語言(事實上不存在最優),而忽視 了編程思想和基礎知識無疑是犯了學習編程的大忌。

  就拿面向對象來說,人們一提到它就贊不絕口,然而又有多少人 領會到什么是面向對象的思想,我想如果沒有真正做過大項目的人是很難 體會到其優越性的,這不是通過學習C++或Java就能掌握的。我的意思是 編程注重的是想法而不是語言,這就是計算機專業要開設“算法分析”和 “數據結構”的原因,如果一頭鉆到某一門語言中無疑于作繭自縛,束縛 了自己的思想,打一個不好的比方一個程序員的工作性質和民工沒什么兩 樣只是在壘磚頭,而真正的計算機人才應該是一個設計師、工程師。

  現在國外的一些優秀的計算機著作的都是一些從事如生物、化學 等領域的專家,我想這是因為他們以前沒學過計算機,沒有被某些傳統的 觀點所束縛,從宏觀上來看待問題,反而在思想上有所突破,這是值得我 們深思的。


網載 2013-07-05 11:07:20

[新一篇] 中國程序員的文化模式

[舊一篇] 移動大航海時代:海闊天空or驚濤駭浪?
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表