作者:林慶忠,1990年畢業于昆明工學院計算機軟件專業,后又于1999年畢業在南京大學 完成軟件工程專業碩士的學習,現供職于CNPC旗下的一個行業軟件研發中心,因為在網上看了許多有經驗的各路軟件開發人員寫的好帖,一時手癢興起,也湊一篇壯壯聲勢。
假設你是一名軟件專業畢業的本科學子,如何在工作中修煉成為一名有較高職業水準的程序員呢,本文試圖總結作者從事15年軟件開發工作的感想,希望對有志成為職業程序員的人有所幫助,并借此機會感謝原昆明工學院計算機系的和智玲老師和張懷寧老師,特別感謝我的碩士導師,南京大學計算機系的博導鄭國梁教授。
注:本帖言辭尖刻,乃作者脾氣秉性使然,如果你看著有氣,就請多多見諒,放下別看了。
程序就是一系列按步驟進行的操作序列,它有好多種級別,比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序,也許我列的不對,但沒關系,我要說的是不管是那個級別的程序,其本質都是操作的邏輯序列。大多數系統和應用程序都是建立在高級編程語言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就讓我們只關注這一級的編程能力吧。因此如果一個程序員的邏輯能力不高,他永遠都不能成為一名具有合格職業水準的程序員,我們在下面的討論有關編程能力的方方面面,最終都是為了最大程度地提高和實現一名程序員的邏輯能力。
一、掌握基礎知識:十六年寒窗的持續積累
從7歲讀小學起,經過16年的學習,你從軟件專業本科畢業后,必須完成以下幾門專業課程的學習:計算機組成、操作系統原理、匯編語言、數據結構、編譯原理、數據庫原理、軟件工程、結構性設計語言(PASCAL、C)、面向對象設計語言(C++、C#)、計算機網絡等,你最好還懂一些算法分析、分布式系統、計算機圖形學、形式邏輯、人工智能原理、軟件設計模式、軟件構架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學習方法和工作方法。這些是你具備程序員職業水準的基礎能力,不要受什么計算機軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學了大多數專業課程,很可能比在校學習的學生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現在你只需要問問自己,那些課程和知識都學會并掌握了嗎?如果是,那就準備好進行實踐了。
二、在實踐中提高:成為一名高水平的Coder
好了,你畢業了,在校功課都不錯,也找了一個專業對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。
通常,你在工作中都會用到某一種單位/公司固定的操作系統和編程語言開發環境,比如Windows、UNIX、LINUX等操作系統,又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發環境,我們在后面把它們合稱為開發環境。就在校學習的有關開發環境的知識而言,大概你距工作需要的差距是不小的,當某個操作系統和編程語言環境成為你的飯碗時,就不應也不能用通過課程/認證考試之類的眼光和要求來評價你的能力,即使你能考100分。你需要深入地學習該操作系統和編程語言環境的各類開發手冊的所有內容,你會說大多數你都用不上,其實你既對又不對,對的是單從使用的角度而言,你確實用不上開發手冊的大多數內容,比如龐大的VC開發類庫和復雜的開發環境,你在實際工作中能用到的不到總數的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發環境下進行Coding的職業水準(還遠不夠程序員的職業水準呢),而這只是剛開始。如何才能真正掌握一種開發環境的全面的知識呢,最原始的辦法就是讀開發指南/教程、參考手冊,一般來講,學習開發指南/教程時,你如果是一個認真的人,都會完成5/10~7/10左右內容的學習和練習,如果你想成為職業選手,就應該完成9/10以上內容的學習和練習。參考手冊不同,大多數所謂的"程序員"們只是用到了才翻翻,這差的太遠了,你應該象讀開發指南/教程一樣,每個環節都要讀,比如VC,參考手冊中的每個類,類的每個函數,都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發環境安裝的全面,它們往往都有開發商做的demo例子可看,你就進入另一個境界了,開始時你關注demo中的具體技術,后來你發現這些demo的程序寫的都還算不錯,結構簡單但合理,如果你真的用心,就一定能發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注,這時的你,開始了從一名Coder向一名Programmer的轉變,你會忍不住要看看開發商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學的太多了,沒時間顧及其它的業余愛好了,現在知道為什么程序員是年輕人的職業了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團隊中,已經是經常有人向你請教技術問題,經常有人請求你幫忙debug,你已是公認的"高手"了,別得意,因為你仍然是個Coder,為什么這么說呢,你想想,你已深入了解了這個開發環境中的各種技能,知道一名Coder如何用好這些東西,可是你能設計的出提供給Coder們用的東西嗎?唔......,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質是個Coder,當然已是一名高水平的Coder了,然而你需要進一步登堂入室才能成為一名真正的程序員。
讓我們繼續吧,通常你都是從精通一種編程環境開始的,假設你已經較為精通在Windows下用VC開發軟件了,這時在技術和技巧方面你將面臨一小一大兩個挑戰,第一個小挑戰是如果公司/單位改換了開發環境,比如用LINUX下的QT交互語言工具進行開發,你不過是把前面掌握VC的過程再來一遍,由于在主觀上經歷了VC工具的學習過程,在客觀上各種開發環境都有太多相似的方面,這回你掌握的應該較快。要小心,在這時第一次誘惑之門打開了,因為你感覺良好,看!這回這么快,我就這么好地掌握了新的開發環境,你開始關注其它暫時還用不到的同類環境,比如VB、Delph、JAVA,如饑似渴地掌握各種開發工具,證明自己的學習能力和價值,但你忘了一點,你仍然是個Coder,只不過是一個在好多開發環境下都能編程的Coder,就像你生活在中國,因而精通了漢語,工作需要你又掌握了英語,然后你就來了勁,把俄語、日語、阿拉伯語、拉丁語,等等等等,都學習個遍,我只能說,有點BT。你忘了自己是個職業人,同一類的東西工作中用得到才需學習,太多太多的Coder們喜歡在一起比較和炫耀自己會掌握了幾種開發工具,不信你看看招聘時的求職書就知道了,sigh!他們中絕大多數人永遠都只能停留在這個層次上,心浮氣躁,一生都再也當不成真正的程序員了。總結一下,其實你在這時需要的是對自己掌握新開發環境的能力的自信,而不是一遍遍地重復來證明自己。第二個大挑戰就是你明白了只掌握VC是不夠的,你發現自己有點淺薄,有很多東東你會用但你不太懂,很多方面支持VC編程的知識你都沒掌握,比如操作系統的源碼、網絡協議知識、Windows 的注冊表、進程和線程的基礎知識、硬件驅動方面的知識、ActiveX、Windows 龐大的 API,又是一個等等等等,這些基礎知識的學習和掌握可是要花費大量時間的,你再一次深切地感到時間太不夠用了,因為這時的你大概有許多俗務纏身了,所以有點沮喪,還不用提IT業每天不知有多少新東西在發布,KAO,永遠都跟不上,越拉越遠了。哎!別氣餒,振作一點,你還是忘記了自己是個職業人,既然好多東東在工作中你永遠都沒機會用,那么干嘛要學呢?用什么才學什么,最多預測到馬上要用什么,先一步學什么好了,要知道沒有人是真正的、無所不精的全科大夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個人嘛。
OK,一般工作后三五年,你經歷了上述過程,經受了誘惑和考驗,終于明白了一個道理:你要的是強勁的學習知識的能力,是對某種軟件知識/技能的有深度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類和數量。這時無論誰用他掌握了多少種你不會的技能來嚇唬你都沒用,你對他的層次只有蔑視。通過幾年的學習和工作,要記住最重要的一點,永遠最重要:對自己學習IT知識能力的自信,一個程序員一生都要不停地進行高強度的學習,用心問問自己,有沒有這個自信?別用虛榮心來騙自己哦,如果沒有的話,那就不必花費你寶貴的時間向下看了,作者在此感謝你有耐心看到這里,現在建議你關閉這篇文章,趁著年輕,當機立斷轉行吧!
三、注重邏輯:成為一名職業程序員
好,再前進一點點,你就要成為一名職業程序員了,讓我們繼續來完成這個任務吧!我們在前一節提到過,"你發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注",其實你是在關注這個demo程序作者的思維邏輯,所有程序的本質就是邏輯。技術你已經較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業程序員。打一個比方吧,你會十八般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠都上不了戰場,這個力氣對程序員而言就是邏輯能力(其本質是一個人的數學修養,注意,不是數學知識)。邏輯能力也是逐步提高的,開始時你一定是用直觀的邏輯能力來編程的,怎么想就怎么編,不對就再改,在改進中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏輯能力,這是很正常的。提前說一句吧,到達邏輯能力的至高境界,其表現是用數學語言來描述問題和問題的解決辦法,高度抽象!好,說回來吧,你要提高邏輯能力,最快的辦法就是讀別人寫的結構優秀的程序。優秀的代碼是百讀不厭的(這句話是我抄來的),暫時放放對其中某種技術和技巧的關注吧,你要推導和學習的是這些好程序的邏輯結構,它們是被精心設計出來的。你可以先捂住這個demo程序,自己設計一個功能相同的程序結構,然后比較一下demo的程序結構,如果差距較大,那你就不應簡單地改進一下,而是要把demo作者設計的過程在心里復原一遍,做到這一點也許有點困難,但這種事干的多了,你就會越干越快,越來越得心應手,你的邏輯能力飛速提升,你能看得上的邏輯結構優秀的程序開始不多了,下一步就是練習。從工作中開始吧,如果你有空閑,你需要做至少兩類練習,一類是算法練習,所有的經典算法都是經典的邏輯,題目有的是,像個好學生一樣吧,每年的國內國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道難題來做做。當你可以把復雜的單遞歸程序(只有A調A)變成非遞歸程序時,已經不錯了,如果你能看得懂雙遞歸程序(A調A、A調B、B調A、B調B都有),我為你鼓掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是把以前和當前你工作中你不滿意的程序推倒重新設計一遍,這非常重要,省時省力,因為你熟悉需求,技術上也沒問題,目的就是改進程序的邏輯結構,很劃算哦,唯一要克服的就是:你對推翻以前工作中那點小小成就的心理障礙,如果你真想優秀,說句粗話:這點心理障礙算個屁,一遍遍反復地推倒已有的成果只能使自己快速進步,放手干吧,沒什么好可惜的,馬恩早就在《共.產.黨宣言》里說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來總結一下,經過自我否定后,再生的你盡管對過去的"業績"還有一些眷戀,但已是一個初步具備職業水準的程序員了,掌握了相應的技術和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追求更高水平的邏輯能力。
在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。
l???????? 從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一點,至少有兩個好處,第一個好處是避免一大堆低水平重復出現的編譯錯誤。一名優秀的Coder平均在一個工作日中應該完成200行以上的源碼,其編譯錯誤應該控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數情況下你都要追求一次編譯通過,而一名職業水準的程序員,應該進一步做到即使用purify這類的工具來檢查源碼,也不會存在嚴重的內存泄露。第二個好處是可以提高源碼的可讀性和效率。規范地編寫你的代碼使你自己的邏輯清晰,因為你明白多加幾個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執行的效率,反過來,控制好遞歸調用和循環內的if語句才是提高程序效率的關鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉換成非遞歸程序,要求還是較高的哦!
l???????? 避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表現在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但要心里有數才行,所以你需要幫助,如果你有幾個水平相若或更高的職業伙伴,太好了,當遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業伙伴是人生的一件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT發展的這么快,你再優秀,那點東東也沒有什么值得隱藏的,所以你可以技術或水平不夠高,但千萬不可以讓真正具有職業水準的選手鄙視你的職業品質和行為。
l???????? 有自己debug的特點,下面的說法作者不敢太肯定,只是經驗之談。即使在VC這種高度完善的開放環境下,你仍然應該要求自己僅憑打印語句就能debug。這也有兩點好處,第一個好處是,遇到bug你會認真想問題所在,而不是用debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應該先看到森林,再看到樹木。我反復提及:程序就是邏輯過程,大多數程序從main函數開始,是由數據結構和功能子程序組成的一個樹形結構的邏輯過程(要認清即使是面向對象的程序語言也是一樣的),它的執行過程是深度優先的,但你定位bug應該是廣度優先的,好好想想這一點,嗯?第二個好處是強迫你思考并記住而不是用工具看到調用過程,你大腦的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結構上的邏輯錯誤引起的,這一點就非常重要了,順便說一句,最難打的bug就是程序邏輯結構錯誤導致的bug。你要是真正明明白白地認識到這兒了,那我就沒什么東西可以告訴你了。總之,程序員的職業水準:生產效率和程序質量,主要是取決于源碼中bug的數量和debug的速度,而不是取決于編寫源碼的速度。給你一個我自己定義的考查一個職業程序員的指標:一個合格水準的職業程序員,編程的時間如果算一份的話,其累計debug的時間不能超過一份,真正職業高手累計debug的時間應該控制在0.5份以下,如何?你關上門悄悄問問自己,你花費在編程和debug上的時間比例是多少?如果你把程序員作為自己一生的職業,那么就永遠都要牢記一點:追求做一個0 bug的優秀程序員!這是任何一個想成為職業程序員的人的理想,請相信:堅忍不拔地追求實現這個理想將讓你出類拔萃!
l???????? 做好程序的單元測試,這是另一項考查你是否是一名具有合格職業水準的程序員的一個必要指標。其實在你拿到需求的時候就要準備單元測試用例了,并且這些用例將直接影響你的詳細設計(有關軟件設計本來是該放在第四節講的)。我們還是打比方吧,當你拿到一個需求時,除了分析它靜態的功能外,還應明確它動態的操作/執行過程,把這個動態過程明確地用流程圖畫出來,比如分為A~Z的26步,其中A又可以進一步分解為A1~A5的5步,直到不能再分解為止。又比如說A3步不可分解了,那么你應該把A3步的正常操作和所有五花八門的異常操作都列出來,確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要寫好多好多的測試用例,說句老實話,我也從來不寫!但我一般會列一個提綱,比如A3步有正常的操作a、b、c、d、e共5項,異常的操作有f、g、h、i、j、k、l、m、n共9項,你在進行單元測試時都應該跑一遍,這樣的程序都還不敢說質量如何好,但起碼可以說較穩定吧!如果要想在進行單元測試時干得快、效率高,那么在進行詳細設計時,你就應該把A3步中對所有正常操作和異常操作的判斷都設計好,在編程實現A3步時,使得程序的結構合理高效,對不對?所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設計、編程、測試等各個環節,恐怕水平很有限喔!但如果你在分析需求時就能看到測試的問題,并改進設計和實現,為此做好相應的準備工作,嘿嘿,整個軟件開發過程你的效率會高很多,通常你在一個開發團隊中就會高度自信的,你已越過當一名偏頗、露骨的高手的境界,成為一個平靜的高手,這可是The best in the best!,用周星星的話說:是高手之高高手,因為別人看不出你高在哪兒,沒見你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關于進行單元測試還有很多復雜的方法,在此本文只提到了最基本的一點,目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒有人能替你吃飽飯!
l???????? 如果你是用C++編程,我再簡單談談有關內層釋放的一個小技巧,就是對所有你編寫的類,在構造和析構函數中加打印語句,統計每個類在運行程序時構造和析構的地方,如果是配對的,那么起碼沒有對象類一級的內層在程序運行結束時沒有釋放,然后你就可以把打印語句刪掉了,招數雖土,但管用!
l???????? 還有其它一些好習慣,在這里我隨筆寫一些,你要是有不同看法也請一笑過之吧。編程時應該對齊縮進,一個縮進用一個tab鍵,一般是4個空格,嚴格遵守開發團隊的編程規范也是非常重要的。一個子程序不應超過30行(不算空行),其內多重循環不應超過3層,否則都應該分裂成兩個子程序,個別算法程序可以長一些,但也不宜超過200行。通常一個類的所有成員函數總和不宜超過1500行,多了就應該考慮分解成兩個類(這個工作最好在設計時就完成)。每完成一小段程序,比如15~30行,就立即編譯運行,不要假裝高手,先敲它一大堆程序,再編譯運行,妄想一次成功,體驗一種假爽的、虛榮的快感,或炫耀給別人看,這么做只能證明自己是一個不折不扣的傻瓜,裝酷而已。因為只要有一次不成功,你就會花費大量的時間來調程序,別人的進度在這時就遠遠地超過你了,平常心是道,還是修煉真功夫吧!孫子兵法里關于這一點有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實就是這樣總是一次就成功的天才,那你還看這篇文章干什么呢?我又不是寫給你們這些天才們看的。再就是有學會買好書、讀好書,關于計算機和軟件方面的書太多了,時間有限,比如有一個叫侯捷的家伙,幾乎寫的每本書都不錯,張國峰的C++編程也不錯,這只是我的個人意見啊,好書多著呢,列出來比這篇文章長好多倍,我就不多說了。還有一招,要是你運氣好,能搞到一些著名軟件系統的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說是我建議你侵犯知識版權啊!
四、天生神力:成為系統分析員
本來就論述如何成為一名職業程序員而言,本文已基本完成任務了,但《菜根譚》有言:竭世機樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。
你要是運氣好,直接進入了一個嚴格規范生產的軟件企業就業,剛開始就應該是按別人做好的軟件設計來實現編程,你可以有機會直接學習軟件設計,當你積累的足夠多了,能夠對其中的一些設計提出好的改進建議,而且干得又快又好,就會漸漸地展露頭角,我相信你終有一天成為一名軟件設計人員(注意,不是軟件產品設計人員),步入系統分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個不規范的軟件企業工作,那也不錯,你很可能直接就有機會進行軟件設計,然后開發、測試,甚至還不得不自己定義需求,把軟件開發過程的各個環節走一個遍,當然這樣對你的要求更高,而且你也不容易得到及時有益的指點,在正態分布的情況下,你應該是成長的很慢。但不管就業的單位如何,如果你決心要成為頂尖軟件職業選手,通常什么客觀困難都阻擋不了你,然而你個人的因素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此提前道歉,并建議你除非對本文有強烈的興趣,否則就請直接看第五節或放下別看了。丑話已說在前頭了,在各種軟件開發組織的發展過程中的事實也證明,只有少數程序員能成為系統分析員,我想這一點不是我杜撰的吧,因此你要是在看接下來的部分時感到氣憤難當,那也實在沒著,純屬活該,因為作者只是在說明自己的觀點而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理由可以罵人!
作者自己沒有到微軟面試過,但身處軟件行業,關于微軟的許多東東當然還是有耳聞的,據說微軟招聘一名程序員要過五個已經成為微軟程序員的面試關,而且是一票否決制,又據說大多數面試題并非編程,而是一些有關邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質就是邏輯,所以幾十年前就有人提出編程是一門藝術,而藝術是要靠天份的,這一點少有人反對。一個人的邏輯能力可以不斷提高,但其能到達的終極邏輯能力的層次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開承認自己沒有某種或全部的藝術天份,但要說自己邏輯天份不夠,換句話說承認自己笨、IQ不夠高,往往是要怒發沖冠的,其實這又有什么區別呢?話都說到這兒了,再次建議你如果不夠自信,就跳過這一節吧,直接看第五節,好嗎?
好了,把話題說回來,你已經成為一門合格的職業程序員了,如果要想成為從事軟件系統設計的職業系統分析員,第一件事就是悄悄找一個標準智商測試的網站或其它渠道,嚴格認真的測一測自己的智商,如果IQ低于130 (正常智商是110),就請別費勁了,打消掉成為系統分析員的念頭吧!好!好!先請你冷靜一下,好好想想,其實微軟面試時就是在測你的智商和邏輯數學素質呢,這就是本節的標題為"天生神力"的原因,因為設計就是從無到有地進行創造,無論是軟件還是其它行業都一樣,可以有借鑒的,沒有現成的,設計就是創造!如果你IQ在130以上,又決心要當一名職業軟件系統分析員,其實你不過是要準備好吃更大的苦而已,有什么好虛榮的呢?
修煉還是從基本功開始的,過程和成為一名職業程序員差不多。必須使用設計工具這一點是不用多說的。在工作中,你基本上遇到的是兩類方式的設計,一個是結構化設計,另一個是面向對象設計,就個人經驗而言,面向對象的設計更好。如果你工作中不得不采用結構化的設計,你必須熟練地掌握數據流圖和控制流圖的分析和設計,一般來講,如果你把一個軟件中用到的數據模型設計好了,針對功能化的流程,不難設計出數據流圖,但下一步設計控制流圖才是挑戰,如果你按照需求走不通設計好的控制流圖,那么你或別人在按照這個設計編程實現時,必定也走不通,沒有奇跡會發生,還是在設計階段嚴格要求吧,又有一點需要牢記:返工是最慢的。當你在進行控制流圖的設計時,也不要妄想得到需求人員提供給你明確的指點,通常他們要是能夠把需求的功能和操作次序寫完整的話,你應該就感恩戴德了,從需求中整理出功能、操作的拓撲次序和條件是你作為系統分析員的職責。看看,要是沒有一點圖論的基礎和拓撲學的入門知識,你是當不好一個職業系統分析員的,即使你天賦不錯,必要的數學和邏輯素質仍然不可或缺。也不用氣餒,永遠沒有最好的設計,只有更好的設計,反復地進行設計迭代,勇于推翻舊的設計,你將快速進步。如果你在工作中是采用面向對象進行設計的,那就更有利了,有關面向對象設計的書太多了,不用作者在此多費口舌,建議精讀一本經典的書,比如北大邵維忠等編譯的《面向對象的分析》,有些方法和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質是,你在邏輯上是如何認識這個世界的,你就是如何設計軟件體系結構的,然后讀讀其它書,觸類旁通,自己創造機會多實踐,成功自然會到來的,總之,不管是結構化設計還是面向對象設計,評價一下自己的軟件系統設計方案吧,有好多指標呢,比如是否均勻和平衡?局部獨立性強不強?有沒有歧異的結構?有沒有層次太多或太少?有沒有某個層次太大、太廣?是不是邏輯結構先復雜了再化簡的?還是只會設計簡單的,復雜不起來(這一點是笨哦,如果出現多次,請你不要意氣用事,轉行吧)?最重要的一點,是否容易理解、實現和改進?你自己會得出評價的。如果有機會看到別人的設計,一定不要錯過學習的機會,自己推導一遍,認真比較比較,獲益會較多。
走到這一步,你就應該關注設計模式了,首先還是學習,這方面的好書有的是,但一般在工作中用到的設計模式較為單一,應該多嘗試一下其它的設計模式。其次必須要明白設計模式不是設計思路,也不能代替設計思路,比方你要從A到B修一條路,設計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設計思路,模式對思路是有影響,但不能代替,所以如果你的智商高達250,我相信你直接用匯編語言也能寫出面向對象的程序來。第三在此有一個陷阱,很多系統分析員生搬硬套設計模式,全然不懂如何融會貫通,在你的一項具體工作中,往往是以一種設計模式為主,其它模式為輔的,思維不拘泥于形式才是關鍵,而且也為你到達更高的軟件設計的境界做好準備。
唉!都不知該怎么向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟件設計最終的層次是:以無法為有法、以無限為有限,這句話是李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天屠龍記》里講到張無忌初學太極,學會的標志是把剛學的招數全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟件設計也一樣,忘記所有的設計模式,隨心所欲進行設計才是至高境界,所以你能到達多高的軟件設計的境界最終將取決于你的哲學素質,這一點實在是不好寫啊,你自己領悟吧!作者只有祝福了!
五、職業人的終極目標:全面修煉,成為Leader
這一節更不好寫,涉及到太多其它非技術方面的因素,特別是個人人生觀和世界觀的修煉,如果本帖的點擊率超過作者私下期望的一個數值,那我就爭取盡力厚著臉皮再補上吧。我只說一句,雖然大家都知道軟件開發是一個團隊性的工作,但追求參與一個大型軟件系統的成功開發,是一名軟件人員的本能,就像拿破侖說的不想當元帥的士兵不是好士兵,所以不追求實現大系統的軟件人員,也不是一個好的職業軟件人員,但你只有成為Leader,領導一個優秀的軟件開發團隊,才有機會實現這個終極職業目標,對不對?
好吧,不管你現在的感受如何,我都謝謝你能讀到這里!我不習慣假歉虛,就不說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然作者水平確實有限。所以我認為你盡管有權砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點多年從事軟件開發工作的體驗,因此接下來我就高掛免戰牌,不回復任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對你有所裨益,祝你成功!再見!
二、在實踐中提高:成為一名高水平的Coder
好了,你畢業了,在校功課都不錯,也找了一個專業對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。
通常,你在工作中都會用到某一種單位/公司固定的操作系統和編程語言開發環境,比如Windows、UNIX、LINUX等操作系統,又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發環境,我們在后面把它們合稱為開發環境。就在校學習的有關開發環境的知識而言,大概你距工作需要的差距是不小的,當某個操作系統和編程語言環境成為你的飯碗時,就不應也不能用通過課程/認證考試之類的眼光和要求來評價你的能力,即使你能考100分。你需要深入地學習該操作系統和編程語言環境的各類開發手冊的所有內容,你會說大多數你都用不上,其實你既對又不對,對的是單從使用的角度而言,你確實用不上開發手冊的大多數內容,比如龐大的VC開發類庫和復雜的開發環境,你在實際工作中能用到的不到總數的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發環境下進行Coding的職業水準(還遠不夠程序員的職業水準呢),而這只是剛開始。如何才能真正掌握一種開發環境的全面的知識呢,最原始的辦法就是讀開發指南/教程、參考手冊,一般來講,學習開發指南/教程時,你如果是一個認真的人,都會完成5/10~7/10左右內容的學習和練習,如果你想成為職業選手,就應該完成9/10以上內容的學習和練習。參考手冊不同,大多數所謂的"程序員"們只是用到了才翻翻,這差的太遠了,你應該象讀開發指南/教程一樣,每個環節都要讀,比如VC,參考手冊中的每個類,類的每個函數,都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發環境安裝的全面,它們往往都有開發商做的demo例子可看,你就進入另一個境界了,開始時你關注demo中的具體技術,后來你發現這些demo的程序寫的都還算不錯,結構簡單但合理,如果你真的用心,就一定能發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注,這時的你,開始了從一名Coder向一名Programmer的轉變,你會忍不住要看看開發商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學的太多了,沒時間顧及其它的業余愛好了,現在知道為什么程序員是年輕人的職業了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團隊中,已經是經常有人向你請教技術問題,經常有人請求你幫忙debug,你已是公認的"高手"了,別得意,因為你仍然是個Coder,為什么這么說呢,你想想,你已深入了解了這個開發環境中的各種技能,知道一名Coder如何用好這些東西,可是你能設計的出提供給Coder們用的東西嗎?唔......,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質是個Coder,當然已是一名高水平的Coder了,然而你需要進一步登堂入室才能成為一名真正的程序員。
讓我們繼續吧,通常你都是從精通一種編程環境開始的,假設你已經較為精通在Windows下用VC開發軟件了,這時在技術和技巧方面你將面臨一小一大兩個挑戰,第一個小挑戰是如果公司/單位改換了開發環境,比如用LINUX下的QT交互語言工具進行開發,你不過是把前面掌握VC的過程再來一遍,由于在主觀上經歷了VC工具的學習過程,在客觀上各種開發環境都有太多相似的方面,這回你掌握的應該較快。要小心,在這時第一次誘惑之門打開了,因為你感覺良好,看!這回這么快,我就這么好地掌握了新的開發環境,你開始關注其它暫時還用不到的同類環境,比如VB、Delph、JAVA,如饑似渴地掌握各種開發工具,證明自己的學習能力和價值,但你忘了一點,你仍然是個Coder,只不過是一個在好多開發環境下都能編程的Coder,就像你生活在中國,因而精通了漢語,工作需要你又掌握了英語,然后你就來了勁,把俄語、日語、阿拉伯語、拉丁語,等等等等,都學習個遍,我只能說,有點BT。你忘了自己是個職業人,同一類的東西工作中用得到才需學習,太多太多的Coder們喜歡在一起比較和炫耀自己會掌握了幾種開發工具,不信你看看招聘時的求職書就知道了,sigh!他們中絕大多數人永遠都只能停留在這個層次上,心浮氣躁,一生都再也當不成真正的程序員了。總結一下,其實你在這時需要的是對自己掌握新開發環境的能力的自信,而不是一遍遍地重復來證明自己。第二個大挑戰就是你明白了只掌握VC是不夠的,你發現自己有點淺薄,有很多東東你會用但你不太懂,很多方面支持VC編程的知識你都沒掌握,比如操作系統的源碼、網絡協議知識、Windows 的注冊表、進程和線程的基礎知識、硬件驅動方面的知識、ActiveX、Windows 龐大的 API,又是一個等等等等,這些基礎知識的學習和掌握可是要花費大量時間的,你再一次深切地感到時間太不夠用了,因為這時的你大概有許多俗務纏身了,所以有點沮喪,還不用提IT業每天不知有多少新東西在發布,KAO,永遠都跟不上,越拉越遠了。哎!別氣餒,振作一點,你還是忘記了自己是個職業人,既然好多東東在工作中你永遠都沒機會用,那么干嘛要學呢?用什么才學什么,最多預測到馬上要用什么,先一步學什么好了,要知道沒有人是真正的、無所不精的全科大夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個人嘛。
OK,一般工作后三五年,你經歷了上述過程,經受了誘惑和考驗,終于明白了一個道理:你要的是強勁的學習知識的能力,是對某種軟件知識/技能的有深度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類和數量。這時無論誰用他掌握了多少種你不會的技能來嚇唬你都沒用,你對他的層次只有蔑視。通過幾年的學習和工作,要記住最重要的一點,永遠最重要:對自己學習IT知識能力的自信,一個程序員一生都要不停地進行高強度的學習,用心問問自己,有沒有這個自信?別用虛榮心來騙自己哦,如果沒有的話,那就不必花費你寶貴的時間向下看了,作者在此感謝你有耐心看到這里,現在建議你關閉這篇文章,趁著年輕,當機立斷轉行吧!
三、注重邏輯:成為一名職業程序員
好,再前進一點點,你就要成為一名職業程序員了,讓我們繼續來完成這個任務吧!我們在前一節提到過,"你發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注",其實你是在關注這個demo程序作者的思維邏輯,所有程序的本質就是邏輯。技術你已經較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業程序員。打一個比方吧,你會十八般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠都上不了戰場,這個力氣對程序員而言就是邏輯能力(其本質是一個人的數學修養,注意,不是數學知識)。邏輯能力也是逐步提高的,開始時你一定是用直觀的邏輯能力來編程的,怎么想就怎么編,不對就再改,在改進中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏輯能力,這是很正常的。提前說一句吧,到達邏輯能力的至高境界,其表現是用數學語言來描述問題和問題的解決辦法,高度抽象!好,說回來吧,你要提高邏輯能力,最快的辦法就是讀別人寫的結構優秀的程序。優秀的代碼是百讀不厭的(這句話是我抄來的),暫時放放對其中某種技術和技巧的關注吧,你要推導和學習的是這些好程序的邏輯結構,它們是被精心設計出來的。你可以先捂住這個demo程序,自己設計一個功能相同的程序結構,然后比較一下demo的程序結構,如果差距較大,那你就不應簡單地改進一下,而是要把demo作者設計的過程在心里復原一遍,做到這一點也許有點困難,但這種事干的多了,你就會越干越快,越來越得心應手,你的邏輯能力飛速提升,你能看得上的邏輯結構優秀的程序開始不多了,下一步就是練習。從工作中開始吧,如果你有空閑,你需要做至少兩類練習,一類是算法練習,所有的經典算法都是經典的邏輯,題目有的是,像個好學生一樣吧,每年的國內國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道難題來做做。當你可以把復雜的單遞歸程序(只有A調A)變成非遞歸程序時,已經不錯了,如果你能看得懂雙遞歸程序(A調A、A調B、B調A、B調B都有),我為你鼓掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是把以前和當前你工作中你不滿意的程序推倒重新設計一遍,這非常重要,省時省力,因為你熟悉需求,技術上也沒問題,目的就是改進程序的邏輯結構,很劃算哦,唯一要克服的就是:你對推翻以前工作中那點小小成就的心理障礙,如果你真想優秀,說句粗話:這點心理障礙算個屁,一遍遍反復地推倒已有的成果只能使自己快速進步,放手干吧,沒什么好可惜的,馬恩早就在《共.產.黨宣言》里說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來總結一下,經過自我否定后,再生的你盡管對過去的"業績"還有一些眷戀,但已是一個初步具備職業水準的程序員了,掌握了相應的技術和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追求更高水平的邏輯能力。
在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。
l???????? 從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一點,至少有兩個好處,第一個好處是避免一大堆低水平重復出現的編譯錯誤。一名優秀的Coder平均在一個工作日中應該完成200行以上的源碼,其編譯錯誤應該控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數情況下你都要追求一次編譯通過,而一名職業水準的程序員,應該進一步做到即使用purify這類的工具來檢查源碼,也不會存在嚴重的內存泄露。第二個好處是可以提高源碼的可讀性和效率。規范地編寫你的代碼使你自己的邏輯清晰,因為你明白多加幾個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執行的效率,反過來,控制好遞歸調用和循環內的if語句才是提高程序效率的關鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉換成非遞歸程序,要求還是較高的哦!
l???????? 避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表現在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但要心里有數才行,所以你需要幫助,如果你有幾個水平相若或更高的職業伙伴,太好了,當遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業伙伴是人生的一件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT發展的這么快,你再優秀,那點東東也沒有什么值得隱藏的,所以你可以技術或水平不夠高,但千萬不可以讓真正具有職業水準的選手鄙視你的職業品質和行為。
l???????? 有自己debug的特點,下面的說法作者不敢太肯定,只是經驗之談。即使在VC這種高度完善的開放環境下,你仍然應該要求自己僅憑打印語句就能debug。這也有兩點好處,第一個好處是,遇到bug你會認真想問題所在,而不是用debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應該先看到森林,再看到樹木。我反復提及:程序就是邏輯過程,大多數程序從main函數開始,是由數據結構和功能子程序組成的一個樹形結構的邏輯過程(要認清即使是面向對象的程序語言也是一樣的),它的執行過程是深度優先的,但你定位bug應該是廣度優先的,好好想想這一點,嗯?第二個好處是強迫你思考并記住而不是用工具看到調用過程,你大腦的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結構上的邏輯錯誤引起的,這一點就非常重要了,順便說一句,最難打的bug就是程序邏輯結構錯誤導致的bug。你要是真正明明白白地認識到這兒了,那我就沒什么東西可以告訴你了。總之,程序員的職業水準:生產效率和程序質量,主要是取決于源碼中bug的數量和debug的速度,而不是取決于編寫源碼的速度。給你一個我自己定義的考查一個職業程序員的指標:一個合格水準的職業程序員,編程的時間如果算一份的話,其累計debug的時間不能超過一份,真正職業高手累計debug的時間應該控制在0.5份以下,如何?你關上門悄悄問問自己,你花費在編程和debug上的時間比例是多少?如果你把程序員作為自己一生的職業,那么就永遠都要牢記一點:追求做一個0 bug的優秀程序員!這是任何一個想成為職業程序員的人的理想,請相信:堅忍不拔地追求實現這個理想將讓你出類拔萃!
l???????? 做好程序的單元測試,這是另一項考查你是否是一名具有合格職業水準的程序員的一個必要指標。其實在你拿到需求的時候就要準備單元測試用例了,并且這些用例將直接影響你的詳細設計(有關軟件設計本來是該放在第四節講的)。我們還是打比方吧,當你拿到一個需求時,除了分析它靜態的功能外,還應明確它動態的操作/執行過程,把這個動態過程明確地用流程圖畫出來,比如分為A~Z的26步,其中A又可以進一步分解為A1~A5的5步,直到不能再分解為止。又比如說A3步不可分解了,那么你應該把A3步的正常操作和所有五花八門的異常操作都列出來,確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要寫好多好多的測試用例,說句老實話,我也從來不寫!但我一般會列一個提綱,比如A3步有正常的操作a、b、c、d、e共5項,異常的操作有f、g、h、i、j、k、l、m、n共9項,你在進行單元測試時都應該跑一遍,這樣的程序都還不敢說質量如何好,但起碼可以說較穩定吧!如果要想在進行單元測試時干得快、效率高,那么在進行詳細設計時,你就應該把A3步中對所有正常操作和異常操作的判斷都設計好,在編程實現A3步時,使得程序的結構合理高效,對不對?所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設計、編程、測試等各個環節,恐怕水平很有限喔!但如果你在分析需求時就能看到測試的問題,并改進設計和實現,為此做好相應的準備工作,嘿嘿,整個軟件開發過程你的效率會高很多,通常你在一個開發團隊中就會高度自信的,你已越過當一名偏頗、露骨的高手的境界,成為一個平靜的高手,這可是The best in the best!,用周星星的話說:是高手之高高手,因為別人看不出你高在哪兒,沒見你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關于進行單元測試還有很多復雜的方法,在此本文只提到了最基本的一點,目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒有人能替你吃飽飯!
l???????? 如果你是用C++編程,我再簡單談談有關內層釋放的一個小技巧,就是對所有你編寫的類,在構造和析構函數中加打印語句,統計每個類在運行程序時構造和析構的地方,如果是配對的,那么起碼沒有對象類一級的內層在程序運行結束時沒有釋放,然后你就可以把打印語句刪掉了,招數雖土,但管用!
l???????? 還有其它一些好習慣,在這里我隨筆寫一些,你要是有不同看法也請一笑過之吧。編程時應該對齊縮進,一個縮進用一個tab鍵,一般是4個空格,嚴格遵守開發團隊的編程規范也是非常重要的。一個子程序不應超過30行(不算空行),其內多重循環不應超過3層,否則都應該分裂成兩個子程序,個別算法程序可以長一些,但也不宜超過200行。通常一個類的所有成員函數總和不宜超過1500行,多了就應該考慮分解成兩個類(這個工作最好在設計時就完成)。每完成一小段程序,比如15~30行,就立即編譯運行,不要假裝高手,先敲它一大堆程序,再編譯運行,妄想一次成功,體驗一種假爽的、虛榮的快感,或炫耀給別人看,這么做只能證明自己是一個不折不扣的傻瓜,裝酷而已。因為只要有一次不成功,你就會花費大量的時間來調程序,別人的進度在這時就遠遠地超過你了,平常心是道,還是修煉真功夫吧!孫子兵法里關于這一點有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實就是這樣總是一次就成功的天才,那你還看這篇文章干什么呢?我又不是寫給你們這些天才們看的。再就是有學會買好書、讀好書,關于計算機和軟件方面的書太多了,時間有限,比如有一個叫侯捷的家伙,幾乎寫的每本書都不錯,張國峰的C++編程也不錯,這只是我的個人意見啊,好書多著呢,列出來比這篇文章長好多倍,我就不多說了。還有一招,要是你運氣好,能搞到一些著名軟件系統的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說是我建議你侵犯知識版權啊!
四、天生神力:成為系統分析員
本來就論述如何成為一名職業程序員而言,本文已基本完成任務了,但《菜根譚》有言:竭世機樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。
你要是運氣好,直接進入了一個嚴格規范生產的軟件企業就業,剛開始就應該是按別人做好的軟件設計來實現編程,你可以有機會直接學習軟件設計,當你積累的足夠多了,能夠對其中的一些設計提出好的改進建議,而且干得又快又好,就會漸漸地展露頭角,我相信你終有一天成為一名軟件設計人員(注意,不是軟件產品設計人員),步入系統分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個不規范的軟件企業工作,那也不錯,你很可能直接就有機會進行軟件設計,然后開發、測試,甚至還不得不自己定義需求,把軟件開發過程的各個環節走一個遍,當然這樣對你的要求更高,而且你也不容易得到及時有益的指點,在正態分布的情況下,你應該是成長的很慢。但不管就業的單位如何,如果你決心要成為頂尖軟件職業選手,通常什么客觀困難都阻擋不了你,然而你個人的因素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此提前道歉,并建議你除非對本文有強烈的興趣,否則就請直接看第五節或放下別看了。丑話已說在前頭了,在各種軟件開發組織的發展過程中的事實也證明,只有少數程序員能成為系統分析員,我想這一點不是我杜撰的吧,因此你要是在看接下來的部分時感到氣憤難當,那也實在沒著,純屬活該,因為作者只是在說明自己的觀點而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理由可以罵人!
作者自己沒有到微軟面試過,但身處軟件行業,關于微軟的許多東東當然還是有耳聞的,據說微軟招聘一名程序員要過五個已經成為微軟程序員的面試關,而且是一票否決制,又據說大多數面試題并非編程,而是一些有關邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質就是邏輯,所以幾十年前就有人提出編程是一門藝術,而藝術是要靠天份的,這一點少有人反對。一個人的邏輯能力可以不斷提高,但其能到達的終極邏輯能力的層次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開承認自己沒有某種或全部的藝術天份,但要說自己邏輯天份不夠,換句話說承認自己笨、IQ不夠高,往往是要怒發沖冠的,其實這又有什么區別呢?話都說到這兒了,再次建議你如果不夠自信,就跳過這一節吧,直接看第五節,好嗎?
好了,把話題說回來,你已經成為一門合格的職業程序員了,如果要想成為從事軟件系統設計的職業系統分析員,第一件事就是悄悄找一個標準智商測試的網站或其它渠道,嚴格認真的測一測自己的智商,如果IQ低于130 (正常智商是110),就請別費勁了,打消掉成為系統分析員的念頭吧!好!好!先請你冷靜一下,好好想想,其實微軟面試時就是在測你的智商和邏輯數學素質呢,這就是本節的標題為"天生神力"的原因,因為設計就是從無到有地進行創造,無論是軟件還是其它行業都一樣,可以有借鑒的,沒有現成的,設計就是創造!如果你IQ在130以上,又決心要當一名職業軟件系統分析員,其實你不過是要準備好吃更大的苦而已,有什么好虛榮的呢?
修煉還是從基本功開始的,過程和成為一名職業程序員差不多。必須使用設計工具這一點是不用多說的。在工作中,你基本上遇到的是兩類方式的設計,一個是結構化設計,另一個是面向對象設計,就個人經驗而言,面向對象的設計更好。如果你工作中不得不采用結構化的設計,你必須熟練地掌握數據流圖和控制流圖的分析和設計,一般來講,如果你把一個軟件中用到的數據模型設計好了,針對功能化的流程,不難設計出數據流圖,但下一步設計控制流圖才是挑戰,如果你按照需求走不通設計好的控制流圖,那么你或別人在按照這個設計編程實現時,必定也走不通,沒有奇跡會發生,還是在設計階段嚴格要求吧,又有一點需要牢記:返工是最慢的。當你在進行控制流圖的設計時,也不要妄想得到需求人員提供給你明確的指點,通常他們要是能夠把需求的功能和操作次序寫完整的話,你應該就感恩戴德了,從需求中整理出功能、操作的拓撲次序和條件是你作為系統分析員的職責。看看,要是沒有一點圖論的基礎和拓撲學的入門知識,你是當不好一個職業系統分析員的,即使你天賦不錯,必要的數學和邏輯素質仍然不可或缺。也不用氣餒,永遠沒有最好的設計,只有更好的設計,反復地進行設計迭代,勇于推翻舊的設計,你將快速進步。如果你在工作中是采用面向對象進行設計的,那就更有利了,有關面向對象設計的書太多了,不用作者在此多費口舌,建議精讀一本經典的書,比如北大邵維忠等編譯的《面向對象的分析》,有些方法和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質是,你在邏輯上是如何認識這個世界的,你就是如何設計軟件體系結構的,然后讀讀其它書,觸類旁通,自己創造機會多實踐,成功自然會到來的,總之,不管是結構化設計還是面向對象設計,評價一下自己的軟件系統設計方案吧,有好多指標呢,比如是否均勻和平衡?局部獨立性強不強?有沒有歧異的結構?有沒有層次太多或太少?有沒有某個層次太大、太廣?是不是邏輯結構先復雜了再化簡的?還是只會設計簡單的,復雜不起來(這一點是笨哦,如果出現多次,請你不要意氣用事,轉行吧)?最重要的一點,是否容易理解、實現和改進?你自己會得出評價的。如果有機會看到別人的設計,一定不要錯過學習的機會,自己推導一遍,認真比較比較,獲益會較多。
走到這一步,你就應該關注設計模式了,首先還是學習,這方面的好書有的是,但一般在工作中用到的設計模式較為單一,應該多嘗試一下其它的設計模式。其次必須要明白設計模式不是設計思路,也不能代替設計思路,比方你要從A到B修一條路,設計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設計思路,模式對思路是有影響,但不能代替,所以如果你的智商高達250,我相信你直接用匯編語言也能寫出面向對象的程序來。第三在此有一個陷阱,很多系統分析員生搬硬套設計模式,全然不懂如何融會貫通,在你的一項具體工作中,往往是以一種設計模式為主,其它模式為輔的,思維不拘泥于形式才是關鍵,而且也為你到達更高的軟件設計的境界做好準備。
唉!都不知該怎么向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟件設計最終的層次是:以無法為有法、以無限為有限,這句話是李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天屠龍記》里講到張無忌初學太極,學會的標志是把剛學的招數全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟件設計也一樣,忘記所有的設計模式,隨心所欲進行設計才是至高境界,所以你能到達多高的軟件設計的境界最終將取決于你的哲學素質,這一點實在是不好寫啊,你自己領悟吧!作者只有祝福了!
五、職業人的終極目標:全面修煉,成為Leader
這一節更不好寫,涉及到太多其它非技術方面的因素,特別是個人人生觀和世界觀的修煉,如果本帖的點擊率超過作者私下期望的一個數值,那我就爭取盡力厚著臉皮再補上吧。我只說一句,雖然大家都知道軟件開發是一個團隊性的工作,但追求參與一個大型軟件系統的成功開發,是一名軟件人員的本能,就像拿破侖說的不想當元帥的士兵不是好士兵,所以不追求實現大系統的軟件人員,也不是一個好的職業軟件人員,但你只有成為Leader,領導一個優秀的軟件開發團隊,才有機會實現這個終極職業目標,對不對?
好吧,不管你現在的感受如何,我都謝謝你能讀到這里!我不習慣假歉虛,就不說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然作者水平確實有限。所以我認為你盡管有權砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點多年從事軟件開發工作的體驗,因此接下來我就高掛免戰牌,不回復任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對你有所裨益,祝你成功!再見!
一、掌握基礎知識:十六年寒窗的持續積累
從7歲讀小學起,經過16年的學習,你從軟件專業本科畢業后,必須完成以下幾門專業課程的學習:計算機組成、操作系統原理、匯編語言、數據結構、編譯原理、數據庫原理、軟件工程、結構性設計語言(PASCAL、C)、面向對象設計語言(C++、C#)、計算機網絡等,你最好還懂一些算法分析、分布式系統、計算機圖形學、形式邏輯、人工智能原理、軟件設計模式、軟件構架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學習方法和工作方法。這些是你具備程序員職業水準的基礎能力,不要受什么計算機軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學了大多數專業課程,很可能比在校學習的學生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現在你只需要問問自己,那些課程和知識都學會并掌握了嗎?如果是,那就準備好進行實踐了。
程序員的成長
技術&管理&做人&行業每天晚上,請你問自己這些問題:
?? 1, 今天我是否克服了技術上新的困難?
?? 2, 今天我是否多讀了一些新書?
?? 3, 今天我是否就某方面的問題與人進行了交流?
?? 4, 今天我是否多認識了一個新同事或新朋友并準備與他們保持聯絡?
?? 5, 今天我是否更多的接觸到身處的行業需求,現狀,和發展?
精通技術
精通技術是技術人員的根本要求,也是技術人員人生發展的必經之路,只有首先精確掌握一門技術,才能觸類旁通的掌握其他技術。精通技術不僅僅是為了精通技術,而是為了觸類旁通,為了掌握精通技術的學習方法,研究方法,體會身處技術頂點的感受和境界,這樣,下一次準備或需要進入另一個領域時,才會有明確的目標。
為了精通技術,就要有以工作為樂的精神。不主張過于頻繁的換工作(常常被認為是不熱愛工作,不適應環境,或者不忠誠的表現)。以工作為樂,才會投入更多的精力和時間,才能夠飛快成長,成為該方面的能手。以工作為樂,是朝著技術高峰闊步邁進的享受過程。
如果僅僅的是以工作為樂,僅僅號稱自己喜歡工作,而沒有“朝著技術高峰闊步邁進”,則是一種浪費。要做工作和生活的有心人,才不會迷信技術,才會避免驕傲,才不會在達到某個水平以后停步不前。不僅要做有心人,還要學會研究。研究該門技術的發展方向,該門技術最好的學習方法,在該門技術上取得突出成就的道路,和激勵自己沿著正確的方向前進的訣竅。做好了這些問題的研究,就會在以工作為樂的境界中做出超凡的成績。
總之,
1, 反對不認真對待技術。
2, 反對不熱愛工作,一心旁鶩。
3, 做生活和工作的有心人。
懂得管理
懂得管理,既要學會管理,也要學會配合管理。那些對所有人和所有事情都吹毛求疵的人是不適應社會的,也是不容易成功的。懂得管理,既要學會管理工程(進度,過程,資源,需求分析,客戶交流),又要學會管理人。要重視團隊建設,重視團隊的合作,重視團隊的文化建設,重視團隊的凝聚力,重視管理者的個人感染力。
在用戶不能提出明確的需求的情況下,要綜合經驗,替用戶提出明確的需求。
符合標準的過程控制,方法論的實際應用可以引導工程有一個可期望的好結果。否則就是運氣的功勞。
資源的合理配置,建設一個每個人舒適工作的環境,不要讓你的組員不得不總是把精力放在環境建設等問題上,是讓人做出更大成績的捷徑。
與人暢快交流的能力,成為軟件人員必備的素質之一。懂得行業的知識就從這里開始。
那些單純學過管理的人,無論進入那一個行業,都需要不斷的迅速的學習一些關于該行業的專門知識,至少是名詞術語,基本原理,關鍵技術,主要應用。這樣的了解初步管理知識的人,一定不要對技術人員指手畫腳,否則一定得不到應有的認同,反之,如果他們從過程本身的流程或者方法論等方面提出建議,就可以更好的體現自己的價值。
進入行業
軟件工作,離不開行業,尤其是應用軟件。一個僅僅懂得實現技術的人,是不夠的。所以一定要拓展你的知識,對你所處在的行業有一個更全面,更準確,更實質性的了解。
軟件人員看到需求分析,常常想到如何去實現它,而不會認真的去研究這份需求,站在用戶的角度上來做更多的工作,這是值得軟件人才所注意的。
研究你所在的行業,也需要有一種系統的方法。了解其中的關鍵點是進入這個行業的捷徑。了解觸及該行業更多方面的關鍵點,是掌握這個行業的必經之路。對該行業做系統的總結分析,是深入該行業的目的。初步的研究成果經過更多的提煉和交流,就會成為金子般的智慧。
以下是幾點建議:
從點滴做起。先做好那些你力所能及的工作。標準化你的行業。你所處的行業雖然確定,但是每一家公司的需求各不相同。掌握他們做事情的流程,可以幫助你做好標準化。同時學習那些該行業的標準,以用戶的標準為標準,更加深刻的理解標準,是代替用戶做好標準化的方法。
掌握核心技術。任何行業都有核心技術。掌握某一項核心技術,就可以讓你進入這個行業并在其中生存,反之僅僅淺嘗輒止,就會讓你遭遇失敗,抱怨不公。
影響你職業發展的幾項能力
?? 1, 研究問題的能力
?? 2, 影響他人的能力
?? 3, 個人履歷
請相信以下觀念
?? 1,教育不是萬能的。希望學校或者任何一個教育機構為你準備所有的知識,能力,水平,是不可能的。最好的大學是自己和無字書。
?? 2, 成長在工作中。工作中的表現和積累才是人生騰飛的實際動力。
從今天起,請做好
?? 1, 培養你自己更廣泛的興趣,并堅持你的人生目標
?? 2, 鍛煉你的演講能力
?? 3, 多認識朋友,以他們為榮
?? 4, 培養你的遠見卓識
昨天,我參加了一個技術人員的論壇.接觸到一些新觀點,很多和開復提倡的是一樣的.我在總結的時候也把開復的很多觀點加了進去.開復的信和網站給了我很多幫助.我也想盡量多的為這里貢獻.但是總結能力有限,寫了好幾編,好象也就這水平了.與大家分享吧!
程序開發的心理研究——“以人為本”
今天看到CSDN網友sunlen在BLOG中寫的“程序開發的心理研究”,讓我想起了 Weinberg先生的著作——《程序開發心理學》 。在計算機界,還沒有任何一本計算機方面的書,在初次出版之后,能夠在長達25年的歲月中一直保持活力,而且這種活力到今天仍在繼續。 《程序開發心理學》 是開創“以人為本”研究方法的先驅,它以其對程序員們在智力、技巧、團隊和問題求解能力等方面獨特的視角和敏銳的觀察經受住了時間的考驗。以下是 sunlen在程序開發心理學的一些個人見解:?????? 本文只是根據本人的一些經驗,還有外界的一些文章,總結出來的程序開發過程中程序員的心理的一些總結,并沒有通過嚴格的驗證。
一、開發項目的原則
?????? 一般研究發現,一個人剛進行一個新的公司,或者接受一個新的任務,他總得要一個適應的過程,這段時間叫做適應期,這個過程根據不同的人所需要適用的時間長度不同,對于一個程序員來說,如果接受一個難度適中的項目,他一般需要3個月的時間來適應,當然,這個時間只是一個一般比較普遍的情況,可能有些人1個月就可以適應了,有些人搞了半年,還是對系統很不熟悉。這個適應期大概包括下面幾個部分:1。對環境的適應。社會是由人組成的社會,當然程序員進行一家新的公司、或者一個新的環境,總免不了要跟人打交道,可能有人會說,“每次開發系統都是我獨自一人完成”,恕我坦白一點的說,這樣開發出來的系統根本不能算是一個系統,現代項目開發一般需要包括前期需求分析、需求文檔開發、設計文檔開發、代碼編寫、系統測試等。要使得這一總個流程順利的進行下去,那就需要人與人之間的合作,所以一個程序員到了一個新的環境、面對一些陌生的人、總得有一點的時間相互之間進行交流,建立起一種友誼。2。對項目的適應。我們接受一個項目,不管是全新的還沒開發的項目,還是已經處于維護狀態的項目,我們總得對它的業務邏輯、開發風格、編程規范、系統構架等有一個了解。業務邏輯是指一個項目相關的操作是怎么進行的、各個操作具體如何操作等等。開發風格是系統原有是如何進行開發的,現在國內有很多系統都是一招了一個新人就叫他進行代碼的開發,結果他等到開發完了才發現原來他花了很久才開發出來的類(java和c++中的一種概念,相當于一個功能模塊,可以被其它功能使用),其實系統早就已經有了,使用的時候這樣調用就可以了,等等。編程規范大家應該都知道了,現在基本不同的語言都有自己的編程規范,比如說java有java編程規范,同時,不同的公司可能根據自己的情況定義了一些規范,比如說,判斷一個變量是否為空,有些公司要求將null放在前面等。系統構架是指一個項目的總的框架是如何搭建的,采用哪種語言等,比如說、現在很多開發網上應用系統都采用Struts+Spring+Hibernate構架(采用java語言)。這些都需要一個適應的過程,如果對這些都還沒了解清楚就匆忙的開發編寫代碼,那寫出來的將會是一些格格不入的代碼、不管這個代碼單獨拿出來看的時候是多么的完美。
?????? 適應期過后,接下來是一段比較長的穩定期。這段時間一般有半年到一年的時間。在這段時間里面,程序員對系統業務比較熟悉,開發系統得心應手,他們一般在定位一個系統問題的時候,能夠比較快的查找出問題并處理,而不像一些新手一樣,對系統調試N久之后,才將問題處理,之后才發現,問題只不過處理了一半,在其它地方存在的相同的問題沒有處理,或者處理完一個問題之后,卻導致其它地方出了問題。
?????? 穩定期過后,程序員開始陷入了厭煩期。這個厭煩期是沒有期限的,隨著時間的推移,程序員可能越來越討厭自己的工作,他經常抱怨系統編碼是如何的差勁,而完全忘記了這個差勁的系統也有他的一份功勞在內。他們工作的時候不像以前那樣有積極性,經常在上班前2分鐘到達公司,還可能在下班前半個小時就開始收拾東西、給家人打電話、等待的下班時間的到來。他們開始對反饋的一些問題應付了事,他們開始對新近來的員工指手畫腳,在開會的時候發短信,等等。
?????? 根據上面我們可以發現,一個程序員新接觸一個新的項目的時候,我們要給他一段時候熟悉系統,而不管他是多么強的一個高手。很遺憾的是,現在國內很多公司一招了一個新人,就開始壓一大堆任務給他,而完全不給他們適應的機會。這樣產生出來的經常是一個千瘡百孔的系統,甚至完全就是一個失敗、無法使用的系統。當一個人開發對現在的系統厭煩的時候,就要開始分配新的任務給他,讓他去熟悉、開發新的系統,而不要總抱著這樣的想法,就是現在系統他最熟悉了,讓他開發最合適,讓他去開發新系統還要讓他花時間去熟悉新系統等等。這樣下去的結果可能有兩種,一是開發人員被迫辭職了,剩下來的就是一個沒有人熟悉的系統,招來的新員工在這個系統上花費了大量的時候,才搞個一知半解,甚至系統可能就這樣壽終正寢了。還有一種結果就是開發人員因為高工資繼續留下來,但是系統的開發進度越來越慢,bug越來越多,開發人員也變得有恃無恐的,而領導層卻越來越擔心由于開發人員辭職導致系統無法進行下去。
二、今天周末、早點回家吧!
?????? 我想國內企業最擅長的就是剝削勞動者的勞動力的,甚至有人叫嚷著:“沒有程序員是不需要加班的”。他們將一個又一個的任務壓在程序開發人員的身上,將完成時間壓縮后再壓縮,直壓得開發人員兩眼冒星,口吐三口鮮血后在當天的工作日志上寫道:“今天是我連續第三天通宵了,今天總共處理了283個系統問題,最后系統終于跑起來了,用戶終于同意通過了檢查,我光榮的完成了使命!”。
?????? 在這里我并不想批駁公司對程序開發人員的剝削,這種高強度開發對系統的影響,它最終也會損壞到公司的利益。項目開發跟一般工廠上組裝一件電器是不一樣的,我們的項目要實現一個功能,是有很多中實現方式的,還要考慮系統構架、可重用性、可讀性等。比如說,一個好的系統構架,你會發現實現起功能來又快又好,而且能夠應付系統開發過程中業務邏輯的變化,而一個差的構架,實現起功能來很困難,而當業務邏輯變化時,你會發現幾乎所有的代碼都需要重新修改,這會令你陷入絕望的境地,而不像一個好的架構那樣修改一下配置文件或者兩段代碼都搞定了,這其中的快慢有時可以用N次方來形容的。而恰恰是這種好的構架在前期需要大量的時候進行設計,如果一味求快的話,那么開發人員根本就沒有時間進行一個好的構架的設計,這樣前頭快的做法,將會對后續的開發帶來影響,使得開發起來更加困難。可重用性也是一樣,如果考慮可重用性的話,那么可以將一些邏輯抽象出現,寫出一個類,這樣,還后續開發的時候,如果有相同的邏輯,就可以使用這個類了,如果對這個邏輯進行修改的話,那只要修改了這個類,所有的邏輯都同時改變了。如果完全不考慮這些的話,那么后續開發都要開發類型的代碼,如果對邏輯修改的話,那么將是很麻煩的事情,當然,這個進行抽象成一個類的動作,比自己開發更花時間,但是更好。對于可讀性,對于一個緊急的開發,你可能發現里面連一個注釋都沒有,很可能開發人員后來翻出這些代碼來看的時候,他已經不記得這到底是什么意思了,甚至連是不少他開發的都不記得了。
?????? 所以,我想說的就是,不要給程序開發人員太大的壓力,只要適中就可以了。還有,不要一味的要求開發人員干活,要適當的表現出對他們的關心,比如說,周末的時候,跟他們說:“今天周末,早點回家吧!”,這樣對開發人員的作用是很大的。
三、監獄里的囚犯
?????? 我想大概國內的軟件公司是全世界男女比例最失調的吧,隨便走進那家公司,你經常會看到的是大批的男性開發人員的,而作為女性的一般都是些文員,市場人員,資料開發人員等,領導層他們有自己的想法,他們這樣想著,如果招了一個女性開發人員進公司的話,那么她晚上就不能加班太晚,不然還得負責她的安全。還有,在中國程序員眼里,女性程序員大多不懂編程,整天問東問西。還有,領導們可能擔心招了女性程序員之后,會影響到大家的情緒,可能是造成公司內部分裂的根源,等等。同樣的,也是女性自身方面的問題,國內的女性一般偏向于學習文科方面的東西,在大學里面,學習理科的女性要比男性少得多。等等這些都造成了現在程序開發行業陽盛陰衰的現象。
?????? 這種現象所引起的后果就是國內很多的男性開發人員都很內向,不善于跟女性交流,見了女性有些還會臉紅。很多在公司里面勤勤懇懇,工資也不低,人長得也不衰,但是就是沒有女朋友。他們的生活是壓抑的(至少是性壓抑吧)。程序員就好像被關在監獄里的囚犯,白天干活,經常加班,晚上回去就睡覺,第二天又開始新的工作。他們在公司里的經常是在處在一個被壓迫的狀態,很少有時間進行其它的活動等。
?????? 我想這是有害的,中國如果繼續這樣發展的話,將會阻礙軟件行業的發展。領導應該多考慮招一些女性的程序員,多組織一些活動等。讓程序員感覺到公司里面的一些人性化管理,這就是一個公司的軟環境,讓程序員安居樂業的軟環境。
一個老程序員的工作經歷 誤導中國IT該當何罪
一些人總是發出一些錯誤的聲音,形成了劣勝優汰可怕的現象。他們在誤導著中國,把我們的后繼軍訓練成軟件藍領――――胸無大志,目光短淺,稍有點成績就自滿就自高自大的人,渾不知天外有天,外國正在虎視眈眈盯著中國的龐大市場。由于軟件藍領的呼聲人們不再致力于培養大批的高精尖人才,掌握國際尖端技術的人。而是花費心思培訓一群豬出來給外國人利用。把自己的命運交給了外國人手里。結果,在最容易的管理軟件領域也輸給外國人,外國人派幾個人過來,利用中國的勞動力,開發出軟件,再賣給中國。大量的利潤到了外國人手里。而我們的中的一些人還在沾沾自喜:外國人給的工資高;外國的軟件好。
奴才!
低品質產品是沒人要的。軟件藍領也不例外。
他們不知道中國制造一個優秀程序員的難度,還在患紅眼病。程序員制造,你可算過成為一個程序的高昂代價?沒日沒夜地工作,沒有女朋友,感情是一片沙漠,沒有錢打工者的命運是悲慘的。
真想知道究竟是哪個公司的程序員為了五十塊錢跳槽,是哪個公司說需要軟件藍領。
在馬年,過春節,萬家歡樂的時候,程序員們還在工作,用他們瘦弱的身軀,支撐起中國的軟件工業。
他們把不思進取比喻為工作穩定。
國外可以在一個單位效力幾十年。在國內不行。為什么?沒有培訓,沒有上升機會。你被壓榨完后就被扔掉。哪個有志向的人甘于這樣的命運?
中國的程序員是世界上最好的程序員。他們不計報酬,沒日沒夜地工作。沒有女朋友,沒有節假日,可能幾年后他們一無所有。他們仍在加班。
一、 程序員為什么要跳槽?有兩個報道:
1、“程序員為了五十塊錢就跳槽”“萬月月薪請不動程序員”“20%的程序員跳槽后都去了外企”
2、印度的程序員比中國穩定。
另有兩個報道:
1、 本科生去美國工作兩年后即可年薪10萬美元。當然,他們是加薪很快。
2、 國外的企業都有培訓。很吸引人。許多人是沖著培訓去的。
國外可以在一個單位效力幾十年。在國內不行。為什么?沒有培訓,沒有上升機會。你被壓榨完后就被扔掉。哪個有志向的人甘于這樣的命運?
中國的程序員是世界上最好的程序員。他們不計報酬,沒日沒夜地工作。沒有女朋友,沒有節假日,可能幾年后他們一無所有。他們仍在加班。
有培訓,就意味著你不會永遠拿著現在的薪水。意味著你在不斷進取,不斷進步,能力越來越強,你就可以擔當越來越重的工作,就可漲工資。給人看到未來。即使你對現在的薪水待遇不滿意,你通過自身的辛勤不懈的努力和奮斗,就可達到你要的待遇。你不用嫉妒別人。只要你努力就可達到他甚至超過他。
沒培訓,意味著不思進取,思想僵化,要被淘汰。沒有希望,看不到未來。你注定被淘汰。別人通過拼捕獲得的成功你就要嫉妒。因為你永遠達不到那個高度。只有暗算他,把他拉下來,你才能達到心理的平衡。
去外企,你可以看到一個光明的前途,你可以不斷進步。路越走越寬。你在那個企業工作一段時間后,學到了很多東西。出來后你就是另外一個人。我曾經想去一個企業,不是因為他的工資高,而是他那里有培訓,甚至送到國外培訓,從他那里出來后可以當總經理。
在國內,你的路會越走越窄,最終無路可走。因為你沒有學習,落后于時代,再找到新工作都很難。
國內公司只會大呼疾呼人才難留。他們沒想過,他們是如何對待人才的,他們只會殘酷剝削,搞政治斗爭,整人。
國內公司不去學習別人的先進的管理方法,反倒怨來怨去,渾不去找自己自身的原因。
1、 為什么要跳來跳去?
因為在本公司內沒有上升機會。
中國程序員是艱苦的,也是聰明的。他們利用一切時間進行學習。就拿我來說,軍訓完畢后,離計算機機房下班只有十五分鐘時間了。一口飛跑到機房,只有十分鐘可以學習電腦。就這十分鐘,也要利用上。
當他們發現本公司沒有培訓機會,沒有學習機會,可這一切又怎能擋得住前進的腳步?國內公司管理一般是很差的,員工沒有成長機會和發展空間。唯一的辦法就是跳槽。某人戲稱,每跳一次,工資就要加一倍。就拿我來說,每跳一次工資也確實是加一倍。拼命學習獲得了知識的高增長,個人的高速進步,這沒錯。而雇主能看上我,也確實是自己能力已經達到這個水平。但越來最后每跳一次的時間越長。也許是因為進步速度慢了吧。后來又有些后悔,跳來跳去沒有根,人到了一定程度就要扎下根來,把一項技術搞透,就需要長時間的積累,反而又踏實下來了。
所以說,那些不斷跳來跳去的程序員,其實是仍在初級階段,到了中級階段基本就穩定下來了,在某一個細分方向上獲得突破。但我建議是,如果不能達到工資翻一倍的水平,或者目標公司沒有特別之處,最好不要跳。否則每跳一次,原來積累的人際關系就會丟掉,而技術又沒有長足的進步,如此跳來跳去,只會毀了自己,更可能越跳工資越低。到了一定層次后就不能再滿足于一些小錢,而是要做事業了。衡量的目標,不是當前多少錢,而是以后會有多少錢。
一般來說,國內公司也沒培訓,初級階段獲得迅速成長的惟一途徑是自我學習跳槽。中級階段要穩定下來。因為你這時已經到了“高原階段”,工資也到了高原,精力也沒以前充沛,不能再沒日沒夜加班加點了,也很難再獲得突破,要想技術飛速進步只能去國外了。或者自己苦心鉆研。現在許許多多的程序員通過自己的努力都到了此階段。
2、 為什么要跳到外企?
外企有信用。讓人放心。有培訓,有高薪,老板把你當人看,剝削較輕,不像國內企業那樣敲骨吸髓。可以找到女朋友。一般可以找到大施身手的空間。但有隨時被裁危險。但一般是做得非常開心、順心。
老板說給你多少錢一般不用擔心他會找理由克扣。這樣你就可以盡可以放心地大施手腳。
下面列舉幾個事實,說明為什么要跳到外企:
1、廣州惠創軟件公司http://www.hcweb.com.cn/ ;在廣州體育西路。
其老板以前是搞外貿的,發了財。我拿自己的全部代碼(我擁有版權的軟件),他賣.他老板說,你只能給我打工.你自己去運作,賺了錢,你這個軟件開發者和版權擁有者只能拿到40%以下.而且你來到公司三個月后,代碼的版權要歸公司 。
我起身走了。如果我能出國的話,我一輩子都不愿意再回來。
2、廣州市小聰軟件公司http://www.jxcchina.com
我去之前談好,我不要工資,我自己獨立運作市場和軟件開發,他公司只提供一個營業執照,賺錢分給他一半。辛苦了一個月,擊敗了眾多對手后,一個十萬元的項目總算有要簽合同了。那個老板說,公司調整。你劃到市場部。項目的10%拿到市場部,你再從市場部分得點數。(到我手里只有不到5%)。從下個月起,每個月1000塊錢工資。你說話不算數,出爾反爾,沒信用。我抗議。抗議無效。算工資的話,也行,那你把上個月的1000塊錢工資算給我才行。不,上個月沒工資。只能從下個月開始算工資。那我走,你把項目的15%提成算給我,這是你定的規定。沒有15%,你只能拿5%。如果你現在走,那5%也拿不到。
跟這樣的公司混,你有未來嗎?我能拼命給他干嗎?
我拿起背包頭也不回地走了。一分錢也沒拿到。找到的新工作是,一個月一萬。打工。
我想把項目帶走。但客戶怕得不到保障。因為我沒有公司。最后仍是把項目給了那個進銷存公司。
3、晶苑集團。港資企業http://www.crystalgroup.com
我對晶苑集團懷著深深的尊敬,并祝 晶苑集團 南中國電腦部 葉富華先生 馬到成功,新春愉快。
我印象最深的就是外企的信用。
面試時,接待小姐端來一杯茶水。我很感激他們對我這樣一個普通程序員的重視。(我去國內公司面試沒有一家給我端水的。他們讓你先做一份考題。做完了你回去等通知。后來我有經驗了,去之前先問問怎樣面試,只要是做題,見不著考官的,一概不去。再后來發展到只要是國內企業的,一概不去。)我的工資是上一份工作的將近二倍。
欣喜若狂。公司有買被子津貼(公司給你買被子)、吃飯補助、住宿補助、加班費(1.5元/小時)。有加班費好啊。拼命加班吧。
每天工作十八個小時到二十個小時。在四個月零十天的工作中,我只休息了一天。其他時間時間每天都像玩命似地。。。沒有人逼我們,是我們自愿的。
公司從香港總部派人到大陸對我們進行培訓。支出專門的圖書經費讓我們建立電腦圖書館。請來專門的電腦教師,列出培訓大綱,每天對我們進行程序培訓。
4、香港迎新豐軟件公司。港資http://www.welcomeERP.com ;位于廣州天河軟件園。
我做了四天,什么成績都沒做出來。但公司歸給工資不誤。午餐費、住宿費、交通費、保險費都給了我。很有信用。這樣的公司,員工不會說它的壞話。只會尊敬、熱愛和擁戴這個企業。
老板很好。我們只要使他的資本達到20%的利潤率就行了。
5、矩元鞋業。臺資。
月薪8000請了個程序員(這個程序員不是我,我沒有那么菜)。不知什么原因,反正做了兩個月什么也沒做出來。公司雖然大呼上當,但仍然是客客氣氣地付了一萬六給他。這份胸襟,試問哪個國內企業能做得到?
結論:
國外企業已經完成原始積累,所以剝削相對輕很多,給員工的空間也較大。國內的企業還正在進行原始積累,進行瘋狂壓榨。正如資本論所說,只給你基本的生活費,其他的全部被老板拿走。“每一個毛孔都滴著血和骯臟的東西”。那兩個國內公司,也滴盡了無數程序員的血淚。
不說了。空喊口號沒用。還是克隆微軟,克隆人家的管理方式來得實在。把我們玩弄于股掌之上,說給我們加薪加薪再加薪全部算下來我拼命賺錢的95%都被你拿走多一分都不給我,說給我股票給我們期權可沒一樣能兌現,你說給我們多少工資我時刻都要提防你克扣工錢。你太貪婪,恨不得把全部拿過去,全部占為己有,不給我們留下一點活路。
你喊多少口號都沒用。我幸而生在這個加入WTO的社會,要在以前,我早被你整死了。我入外企我光榮。我逃脫魔掌我光榮。“士為知己者死”,你不要怪我們去外企。不能因為你生在中國我們就活該被你整死。你是土老財,我們是被解放軍解放的翻身作主的奴隸。
二、程序員工資太高?
你們在花前月下親那柔嫩的紅唇的時候,我們在做什么?你們在剝開女孩子衣服共度良宵的時候,我們在做什么?你們在唱歌跳舞縱情享樂的時候,我們在做什么?你們在爭風吃醋大打出手的時候,我們在做什么?你們在給校長送禮的時候,我們在做什么?你們在喝酒猜拳的時候,我們在做什么?
我們在寫程序。
如果你把我們的工資和那些好吃懶做在學校泡妞打架畢業后貪污受賄瘋狂壓榨人民血汗黑心黑手拿黑錢的人進行比較,我只能告訴你,你錯了。
你付出了什么,我們付出了什么?
如果因為你的工資只有八百元,看見別人的工資超過你就生氣,就要求別人的工資也要向八百元看齊,我只能說,你犯了紅眼病了。中國人的劣根就是,不患窮患不均。外國人看到誰有錢就說,啊,我要超過他。中國人說,他媽 的,我恨不得把他殺掉!大家都窮,我沒意見,如果有誰冒尖我就想把他給拔掉。只想問一句,別人辛苦工作的時候,你干什么去了?
我要說,當一個人,傾畢生精力和心血,把所有東西都傾注于一件事情時,他獲得的只是普通人的十倍工資,這太低了。
只拿著幾千塊錢工資,太少了。拿這點工資想去買一個人的青春和愛戀,這個人太不值得了。
做生意的,當官的,欺壓老百姓的,作威作福的,貪污受賄的。
他們不用擔心失業,不用擔心技術過時,不用擔心眾多的競爭者。他們不用擔心房子,不用擔心車子。誰都知道他們一個月不會只有幾千塊錢那么簡單。打工,寫程序,是不能同他們比的。一個擁用著程序員的聰明和智慧的人去做那些事情,收入肯定比當程序員強算了,不比了。比起來心痛。
這兩個是縱向比較。同地區不同工種這間比較。按勞取酬,多勞多得,我們的所得與所付出的,仍然是不成比例。
再橫向比較。同一個勞動力在不同勞動市場上價格的比較,同一工種在不同地區的工資進行比較。
程序員的工資,不是太高,而是太低了。
一個本科生,出國工作兩年后就可年薪十萬,美元。而我們在為我們偉大的社會主義國家作貢獻,只拿著5%的工資。(國外100萬,國內才5萬)
一個同事到了國外,月薪5000美元,而他在國內才4000人民幣。相差十倍。
一個人,排除掉感情因素,他的東西當然是賣給出價高的那個人。這還用問嗎?
正如大批的留學生回來。不是我愛國,而是國內的空白多,機會多,發展空間大,所以我們大批地回來。
時代在呼喚,人才的價值在回歸,知識的價值在回歸。
附記:
今年過春節,萬家團聚,馬年飛躍的時候,我在寫程序。
劉興波,你在做什么?
3、 中國需要大量軟件藍領?
我們已經輸給了外國,還要在新一輪的競爭中自甘墮落?
1、誰要軟件藍領?
一記者去人才市場向各招聘單位問其需不需要軟件藍領.招聘單位都不明白軟件藍領是什么意思.待記者說明軟件藍領的意思后,各公司都說我們不要。基層人才從來都不缺乏。
一方面是報紙大聲呼吁軟件藍領要盡快制造出來,”我們要有大量的低成本的代碼工人”,另一方面,企業不要這方面的人才.怪事。是誰大聲疾呼需要軟件藍領的?他不知道各大公司都在裁員嗎?
面對生產力越來越高的生產工具(軟件開發工具),軟件藍領淘汰勢在必行。那些學習太慢的白領都會被淘汰掉,更遑論藍領了。軟件藍領,還沒培訓出來就已面臨滅頂之災。
軟件工廠是不錯,但軟件工廠的核心不是吞下大量的軟件藍領和人海戰術,而是對現有資源的整合和利用,降低現有的生產成本和交易成本.一味嚷嚷要求軟件藍領的企業,只是那些由于管理不善快要被市場淘汰的企業,這樣的險惡用心有兩個:一是最好不要錢的軟件奴隸供驅使,二是將那些正在會成長起來的優秀的人才扼殺在搖籃中,他們成長不起來,就減少了競爭對手。而且由于對他們進行的愚化教育,要他們立志成為軟件藍領。沒有了胸懷大志,中國的軟件產業才真正危險。
可喜的是,市場將用殘酷的市場法則對那些人和那些所謂的軟件藍領進行殘酷地淘汰。只有那些真正有領導眼光的魄力的“軟件工廠”才會真正建立起來。微軟才是軟件工廠,他將幾十幾百人幾千人幾萬人的力量集中在一起,生產出產品,在全世界銷售。我們某些“軟件工廠”不過是玩概念罷了。玩吧,玩吧,終有死的一天。你會死的很難看。
可喜的是,軟件藍領喊了很久也沒見哪個企業招一個,更多的是裁員。
事實證明了藍領的不適應性。機器排擠人,程序員中也在排擠之列。由于高生產力的開發工具的越來越多的使用,軟件開發成本的大幅下降,軟件開發越來越自動化,越來越多的人被機器排擠掉。許多由人去完成的事情,現在由機器做的很好,許多程序員被裁下來。(資深程序員應該有這種體會)。
現在所謂的“軟件工廠”,最大的危害在于他由于在學生中傳播,使許多學生胸無大志,掙兩錢就滿足,把許多優秀人才扼殺在搖藍中。
我們需要的是,天才的政治家,整合起一盤散沙的中國,天才的軍事家,抵抗外強的侵略。
附:有人由“深圳快找不到藍領了”而覺得“軟件業也快找不到藍領了”。
深圳快找不到藍領了。
不錯。
他們要找的是什么樣的藍領?是以前概念中的只讀完小學二年級,穿著藍色工裝,滿身油污,手拿老虎鉗的藍領嗎?
不。
他們要精通計算機技術,要精通圖紙,要精通制造工藝,要精通機電技術,還要懂英文。這樣才能讀懂英文說明書,才能看懂圖紙,才能編制數控機床所用的計算機程序,才能控制數控機床。而且這些最先進的數控機床使用了目前世界上最先進的技術,因此這個“藍領”如果幾年不跟蹤技術趨勢他就會發現他不再會使用這些代表著最先進生產力的機器,就會被淘汰掉。
這樣的藍領是一般的所謂的白領能比得上的嗎?三個白領也比不上這樣一個“藍領”呀。隨隨便便大喊一聲“我們找不到這樣的藍領”,實在是有失偏頗。有沒有想過,在這樣一個使用著高技術,掌握著自動化工具藍領的背后,是多少低技術藍領的失業?生產制造這樣一個藍領,需要多少金錢和時間?這樣的藍領實在是造價不菲。所以在國外,總工和總經理是一級的,總工的待遇有時比總經理還高。而在國內人多粥少人治環境中,技術人才實在得不到重視。
4、軟件工廠
其實,我們真正想要的,不是軟件藍領,而是軟件工廠。而且這樣的工廠最多只要兩個。
當軟件生產的管理水平到了一定高度,自會以工廠的形式運作,以大幅降低生產成本。
軟件工廠是用來做什么的?
1、生產什么?哪里這么多的訂單來維持工廠的運轉?
2、軟件的零邊際成本(即可復制多份而成本幾乎為零)。一份軟件只需要一份就夠的情況下,多個工廠是不是重復開發,浪費資源?這樣競爭的結果,頂好是全世界就一家工廠歸好,交易成本減少到最小。
中國大規模的重復開發,低水平的重復開發。如果大家團結在一起,組成個工廠,嚴密組織,分工協作,既提高了生產率,也降低了浪費。
工廠的設立是為了降低交易成本。
軟件工業也有生產成本逐漸下降的趨勢。只有大規模地群體協作,用工廠這種組織方式能有效地提高生產力,降低交易成本。
工廠的核心不是軟件藍領,而是組織和協作。集中所有人的智慧去做一件事情。大規模地降低生產成本。
中國目前雖然需要軟件,但還缺少強有力的組織。可以說,還沒發展到工廠的程度。
所以我們曾經有個把中國所有程序員組織起來,像一個大型的軟件公司那樣運作,做成虛擬軟件工廠的想法。但還沒做完。
中國的IT確像有些人說的那樣,中間人才大量,高精尖人才嚴重不足。在我看來,基層員工從來就不缺少,由于外國對我們進行技術封鎖,所以我們在向前進軍的路上很難突破。但我們中間人才正在夜以繼日地,在管理和技術領域進行拼搏,向高精尖人才進軍。但只要有一個能突圍,一定會有大批人相繼突圍。我們在等待著群體突破的那一天。那一天,從中間領域“制造”出來的大批高精尖人才在國際軟件工業叱咤風云,領袖群雄。
五、“淘盡黃沙始見金”,要是再有員工因為工資而“叛逃”的話,不如說一句:由他去吧!
很瀟灑。很氣派。道理也很對。只是口氣有點自大,有點不自量力,而且也寫錯了。
我記得原文是"千淘萬漉雖辛苦,吹盡狂沙始見金。”,出自于《菜根譚》。劉興波這位仁兄居然用"淘"盡狂沙始見金”,可見是一位炒股高手。妙,妙!只可惜恐怕是人云亦云,如果所猜不錯的話,這位仁兄在專家的指示下應該賠了不少。
只是,在人才界,這個恐怕還要改。去的是誰?留下的是什么?
很不幸,去的都是頂尖高手和優秀員工,留下來的只是找不到工作的人。在這個人滿為患,就業困難的社會,只有那個頂尖高手和高素質的人,才能自由選擇工作單位,才能來去自如,才能到外企工作。留下來的,不是不想走,而是怕找不到新工作。只有那些有本事的人才能“你不把老子當人,老子自會找到把我當人的地方”
借用微軟的一句話,那些最優秀的人才永遠不會懇求你。
說說兩件事。
1、在某軟件公司工作期間,深圳一個獵頭公司天天打電話來。沒錯,http://www.jpc.com獵頭。
2、簡歷在網上發布幾天后,突然接到神秘電話,邀去面試。咦,這個企業我沒發過應聘信哪?去面試。幾十人濟濟一堂,集中比賽。這個公司股東中,日本住友銀行竟郝然在目。
3、某集團。好像是在某國際排名中占第十六位吧,說,你過來。你可以把你的朋友全都叫過來上班。把你父母也接來。
你以為被挖走的黃沙哪?
“沙中找金(人才爭奪)好激烈,拿走黃金留下沙”。黃金以前被拿到美國,現在是拿到外企,留下的都是別人挑剩下來的。對不?
聽劉興波話的人要倒霉了。
今天是2002.2.14,情人節,一個令所有程序員淚如雨下的日子。“只羨鴛鴦不羨仙”,祝天下所有程序員早日結束不吃飯不睡覺的仙人的日子,早日過上鴛鴦的生活。
我拿著錢痛苦流涕:多少錢才能買走我的愛?
一個程序員的奮斗歷程
這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向 ,所以把我的經歷寫出來與大家共勉,希望能給剛如行的朋友們一點點幫助。 一轉眼我在IT行業學習工作已經七年多了,這期間我做過網頁,寫過MIS、數據庫,應用程序,做過通信軟件、硬件驅動、協議棧,到現在做操作系統內核和IC相關開發,這中間走了很多彎路,也吃了不少苦。我上的是一個三流的高校,就連同一個城市的人多數都不知道。因為學校不好也就沒 有指望能靠學校名氣找一個好工作。所有的希望都寄托在自己的努力上了,大一開學前的假期我就開始了學習,記得我買的第一本書是《計算機基礎DOS3.0》,大家別嚇著了,其實當時已經普及了DOS6.22了,只是我在書店里看到了DOS4.0,5.0,6.0的書,以為像英語那樣是第四、五、六冊,記得當時到處找DOS1.0,現在想想也幸好我沒有找到:)開學前我學完了PASCAL,那時既沒有計算機也沒有人可以請教,我連程序是什么的概念都沒有, 只好死記硬背代碼,然后拿紙寫,我一直到大三才有了一臺486,在這之前用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30多頁,我的C語言、C++ 、VC都是在這樣的條件下入門的。所以說條件是可以克服的,希望我的經歷多少給條件艱苦的同學們一點信心。第一次上機是在我姐夫的機房,我的心情激動的無與倫比,但是一上機我立刻傻了眼,他們用的是英文版的Win3.1,我的那點DOS知識都見了鬼,上機提心吊膽的一陣瞎摸,一不小心把Word弄成了全屏,怎么都還不了原,當時真是心急如焚,我以為機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會非常少,也沒有書告訴我開發環境(TC2.0)需要設置,而且開始我都不知道有編譯器,我甚至自作聰明把寫好的程序擴展名從.c改成.exe,結果可想
而知。大一學完了C、X86的匯編、數據結構、C++。由于精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點說,我那么刻苦都及不了格,可見我們國家的計算機教育有多死板。
大二準備學VC和BC,當時難以取舍,后來選了VC,不為別的,只為書店里兩本書,VC 那本便宜6塊錢。我的努力在班上無人能及,學的日夜不分,大三有了計算機后更是如此, 很多次父親半夜教訓我說我不要命了,我一直覺得自己基礎差,記憶又不行,條件也不好 ,所以覺得只有多花點時間才能趕上別人。居然后來有許多朋友說我有學計算機的天賦, 讓我哭笑不得。我用的是486,16M內存,1G硬盤,當時同學們的配置都是P166MMX,我安裝 一個Windows NT4.0需要一個通宵,編譯一個BC5.0向導生成的程序需要近兩個小時,我的顯示器是個二手的,輻射非常大,開機屏幕冒火花,看起來很酷的:),有一次程序寫的太久,覺得怎么白色的編輯器背景變成了紫色,以為顯示器壞了,后來才發現眼睛不行了,不過說來也奇怪,到今天我的視力還能保持1.5,真是個奇跡。但是就是那臺破機器陪伴了我兩年,讓我學會了VC、Delphi、SQLServer等。后來那臺機器給我阿姨打字用,據她說一天她正打的開心,一股青煙夾著火苗從顯示器鉆出來,之后它才壽終正寢。
大三假期找了個機會在一個計算機研究所實習,與其說實習不如說是做義工,工作了兩個月一分錢沒有拿。但是這兩個月對我的發展幫助很大,讓我早一步了解了社會,剛去的時候我當然是一竅不通,在那里我熟悉了網絡,學會了Delphi和Oracle。由于工作很認真, 得到了比較好的評價,在一位長者的引薦下,我開始和他們一起做項目,這使我在大三大四就有了自己的收入,大四又找了兩家MIS公司兼職,雖然錢不多,但是在學生期間有1000多的收入我已經非常滿足了,我終于用自己賺的錢把計算機換了。大四下開始找工作,這時我的工作經驗已經比較多(當然現在想想非常幼稚),開始聽父母的想去那個研究所, 實習過那個部門也希望我能去,但是不知道為什么最后不了了之,這種單位就是比較官僚 ,我一氣之下就到了我兼職的一個公司做MIS的TeamLeader。在大三到畢業一年的時間,做過了各種MIS,從煤氣、煙廠、公安、鐵路、飲食到高校,什么有錢做什么,工作也很辛苦 ,經常加班和熬通宵,從跟客戶談需求到設計、編碼、測試、交付都要上。那時覺得很有成就感,覺得自己還不錯,現在想想真是很膚淺。
剛走上工作崗位的學生很容易被誤導,各種開發工具讓人眼花繚亂,同時也覺得很受 公司器重,但這樣工作永遠是一個低層次的開發者。不要跟我說什么系統分析有多么多么重要,多么多么難。你以為自己跟用戶談需求做設計就是系統分析和設計了嗎,國內又有幾個公司能夠做的很到位很規范?我是ISO9000內審員,也在Rational公司受過多次培訓,拿了4個證書,還有一個公司讓我去做CMM。這些我聽過很多,但是很多事情到國內就變了性質,一個公司不是通過了ISO9000或者CMM就能規范了,我現在在一家有幾十年歷史的外企工作,里面的管理不是一般國內企業能及的。作為一個畢業不久以前沒有步入過社會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個工具,關鍵是人本身的思想,不是說你熟悉了C++、Rose就能夠做出好的設計,相反如果你具備了很高的素質,你可以用C寫出比別人用C++更加模塊化的程序。
話說遠一些,國內軟件開發行業有一個怪圈,很多人覺得VC > Delphi > VB,真是很搞笑。這幾個軟件我都做過開發,說白了他們都是工具,應該根據應用的需要選擇采用哪個,而不是覺得哪個上層次。如果你因為用某個開發工具很有面子而選擇的話,只能說明你很淺薄。如果說層次,那么這些工具都不上層次,因為它們用來用去都是一些系統的API,微軟的朋友不會因為你記住他們多少個API或者多少個類就會覺得你很了不起,你永遠只是他們的客戶,他們看重的是你口袋里的銀子。我也做過系統內核,我也封裝過很多API,同樣我也不會看重那些使用這些API做二次開發的客戶,除非他能夠作出自己獨到的設計。
至于有人認為C++ > C那更是讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的內核和實時系統中C++還無法與C匹敵,至于說C++適合做應用系統的開發那是另外一回事。所以我的觀點是不在于你用什么工具和語言,而在于你干什么工作。你的設計體現了你的技術層次。
這樣干了一年我覺得非常苦悶,做的大多數都是熟練工種的活,個人技術上沒有太多 的提高也看不到方向。所以決定離開這個城市去上海,尋求更好的發展,并且打算放棄我以前的MIS轉到通信行業。
寫到這里不能不提到我女朋友,我們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,我們的感情發展的很快。她告訴我很多事情,她家原本是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了很多債,她有男朋友,但是她對他沒有感情,只因為他給了她母親兩萬多塊錢,后來還強迫她寫了四萬塊的借條,她男朋友背叛過她并且不止一次打她,現在逼她結婚不然就要她還錢。這人居然還是一個高校的老師!她母親把父親給她的學費花了,因為拖欠學費她沒有辦法拿到畢業證。她母親現在有病需要錢,我拿出了自己的一點積蓄并且跟朋友們接了一些,替她交了學費并給她母親看 病(后來才知道看病的錢又不知所終,就連她母親是不是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅決反對我和她在一起,她原來的男朋友也極力破壞。無奈之下我們決定早一定離開這個傷心的城市,并且瞞著我們家。由于時間倉促,我只準備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中午的,兩張是晚上的,中午我的家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了很多年的城市,帶走的只是一身債務。沒有來過上海的我們兩個性倔強,都不愿意去麻煩同學和朋友。來到上海是傍晚6點半,我們都不知道該去哪里,我們找了一個20塊錢的旅館,這個房間連窗戶都沒有,7月份的天氣酷熱難耐,房間里非常悶熱。第二天我們開始租房子,因為身上的錢不多,我們基本都是步行,花了一個星期時間,不知道在浦東轉了多少圈后找到了一個400塊的房子,但是我們都不了解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆后,我們身上只有800塊錢了,工作都還沒有著落,這800塊錢要支持到我們拿到第一個月工資,為了省錢我們
自己做飯,每天買菜只花兩塊錢,她非常喜歡吃(也可能她在大學經常挨餓的愿意),看到她現在這樣省吃儉用我真的很不忍心。她以前的男朋友也沒有放過她,經常打電話來騷擾,并且來上海看她,還說了不少恐嚇她的話,她過于善良,說他以前畢竟幫助過她,叫我不要與他一般見識。以后的每天在家就是苦等面試通知,原本我想迅速找一家MIS公司解決眼前的困難,但是她堅持讓我不要放棄自己的理想,終于功夫不負有心人,我找到了一家通信公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工作,第一天上班她哭了,這是她來上海第一次流淚,我心里很難受也很感動。
由于是全新的行業,我把自己降到了零點,我學的VC、Delphi、數據庫派不上用場, 擺在我面前的是嵌入式、協議、信令一些我從未接觸過的知識。我知道我沒有退路,于是拼命的學習,我把自己當做一個應屆畢業生一樣,一分努力一分收獲,半年過去我終于熟悉了工作,并且得到了公司的表彰,薪水也加了一級。后面的日子里我們省吃儉用,把欠朋友的1萬多塊錢還了,日子終于上了正軌。這時女朋友告訴我她想考研究生,我也很支持,于是她辭職在家備考。
另外,在這里我要感謝我的ProjectManager,他原來是一個大通信公司的產品經理, 對人非常和善,我從他那里學到了很多知識,而且他也給了我許許多多無私的幫助。在工作上他給我充分的空間和信任。記得公司安排我維護一個接入服務器軟件,由于代碼量不算太小(5萬行),資料和文檔都不齊全,我維護起來非常吃力,所以想重新把它做一遍, 公司領導不太支持,可能覺得工作量太大,但是他極力支持我,私下里他讓我放手去做, 我的維護工作他擠時間做。在他的支持下,我花了半年時間完成了接入服務器的軟件,并且實現了一個相對完整的TCP/IP協議棧。在這里我學會了嵌入式系統設計、驅動開發、TCP/IP和很多通信的知識,我花了一年時間終于使自己從MIS開發轉到了通信行業,并且站穩了腳跟。我的開發大量是對硬件的直接操作,不再受微軟的操作系統,VC、Delhpi這些開發工具的約束,我終于看到了另外一片天空。
我做事情喜歡追根問底,隨著開發的深入,軟件開發與硬件聯系越來越緊密,硬件知 識的匱乏又對我的發展產生了障礙,而且芯片技術基本上掌握在國外公司的手里,這對做系統級設計是一個非常大的制約,一個新產品出來,第一道利潤(也往往是最豐厚的利潤)常常都被IC公司如Intel、Motorola賺去了,國內的廠商只能喝點湯。所以我決心解決自己的硬件技術障礙,并打算離開通信行業,進入IC設計相關領域。
當然我明白如果我對硬件了解的非常少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。所以我必須努力打好基礎,學一些相關知識為以后做準備。就像我開始從MIS轉到通信一樣,我看過大量通信方面的書,并且給一個ISP做過RADIUS計費分揀臺,在這樣的背景下這家通信公司才給了我這個機會。我在的通信公司是做系統設計的,有不少PCB Layout硬件人員,平常我就注意向他們學習,由于我做的是軟件,在公司看硬件資料不好意思,所以開始只好在家看,剛來上海工作我連續一年都在加班,后來不加了,因為我要擠出時間學習,通常我12點左右睡,第二天5點半起,我上班比較早,地鐵上如果人不多我也用來看書。學習當然不會是一帆風順的,有些實在不懂的問題就積累起來問硬件人員,他們的幫助使我學習進度快了很多,因為在沒有人點撥的情況下自學,我的一半時間是花在解決疑難問題上,但這種問題經常是別人的一句話就可以讓我豁然開朗,我非常慶幸我有這樣的學習環境。在后面的一年里,我學會了看硬件原理圖,學會了簡單的硬件設計(模擬電路方面還有不小的差距),事情就是這樣的,當你安安份份做軟件,別人永遠認為你是軟件開發人員,在你開始學習硬件時別人未必會認同,有位中興通訊的朋友還對我說過,一個人不可能把所有東西都學完。我也明白這一點,但我希望自己做的更好。但當你熟悉硬件后大家又會覺得你好像原本就是軟硬件都懂的,同事們也都習以為常了。這個時候我可以把硬件資料堂堂正正的拿到公司看,沒有人再大驚小怪了。 讓我比較自豪的是我通過自己的努力做了一個IAD(軟交換的終端設備)系統方案,包含軟硬件的選型、設計等內容,這個方案得到了公司和同事們的認同,讓我感到非常欣慰。
技術是相輔相成的,當我的硬件有了一定的進步后,我的軟件設計也有了很大的提高 ,我可以從更深層次理解問題,我做的接入服務器CPU是Motorola PowerPC860,熟悉的朋友都知道860 QMC與軟件的批量數據傳輸通常采用BD表的方式,硬件人員做驅動的時候習慣采用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer,或從用戶Buffer拷貝到BD表,由于理解的比較深入,我自己重新實現了這個過程,采用動態BD表的方式,驅動從一個網口接收數據,提交給我的軟件進行三層交換,直至從另外的接口發送出去,沒有進行一次拷貝。這樣的設計大大提高了性能,使系統的指標接近理論值。軟硬件的結合使我的設計水平上了一個臺階。我現在寫的這個操作系統,編譯后我把程序反編譯成匯編,找出其中不優化的代碼,然后在C程序中進行調整。舉個例子,很多CPU沒有專門的乘法指令,這個大家應該都知道,在這種CPU上進行一個乘法操作常常會花費大量的指令周期, 有的朋友會說這個我知道,我會盡量避免采用×號,但是事情往往不是那么簡單,你知道
C語言中數組的下標操作是怎么實現的嗎?仔細看看反匯編的代碼你就會明白,同樣是通過下標的定位操作,C編譯器會有時候會產生位移指令,但有時候會用乘法實現,兩者效率往往是天壤之別,所以明白這些問題你才能將系統性能提升到極致。?
些問題就不多說了,有興趣的話以后可以共同探討。
話說遠一點,我由衷的希望在軟件上做的比較深入的朋友們有機會學學硬件以及其它 相關知識,尤其是做底層開發和嵌入式設計的。這對軟件技術的提高有非常大的幫助,否則很多事情你只知道該這樣但不會明白為什么該這樣。我這個觀點在我現在的IC公司Project Manager那里也得到了驗證。他告訴我們公司現在的802.11芯片產品的軟件經理原本是做該芯片硬件設計的,某某某原本是做軟件的,現在在做IC,類似的例子還有很多,只是在國內這樣的風氣不是非常流行。
我有一些心得體會與大家分享,只有當我干好本職工作后,我才會學習與工作關系不 大的技術,這樣公司的上司才不至于反感,在入門階段的問題我通常不去問那些資深人士 ,而是問一些資歷比較淺的朋友,比如剛畢業不久的學生,因為他們往往會跟你詳細的講解,而資深人士通常覺得你的問題太簡單,所以回答的也很簡單,我又不好意思多問。等技術上了一定的層次后我才會問他們,他們也能給你比較深入的回答。另外,有些朋友說我機會比較好,他們也希望能從事新的工作可惜沒有機會,我聽了只有苦笑,我的機會了解的人都應該知道,我沒有出生在什么IT世家:)也沒有誰一路提拔我,所有的路都是自己走出來的,我母親去世比較早,我的后母(我叫她阿姨)看著我努力過來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。
我的最終目的是IC而不是PCB,所以我下一步的準備開始學習IC設計的知識。公司的同事沒有懂IC設計的,后面的路又要靠自己了,我買了不少相關的書,在網上也查了很多的資料,我花了大量的時間去學習VHDL,并且用軟件進行了一些簡單的設計和仿真(沒有設計ASIC,只是針對FPGA),隨著學習的深入,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經做好了跳槽的準備,我向一家業界又一定知名度的IC設計公司投了簡歷,并通過了漫長的面試(4個多小時)。其他的一切我都比較滿意,唯獨薪資差強人意,我也明白原因,因為我是這個行業的新人,我沒有經驗,我再一次將自己清零了。公司老板問我6000多一個月能不能接受,我知道他也是照章辦事。想想我通信行業的朋友們,基本上都是年薪10萬以上,月薪過萬的也比比皆是,朋友們也幫我介紹了不少待遇不錯的公司,我該怎么選擇,當時我很猶豫,我熱愛我的事業,我向往我的追求, 但我也是一個普通的人,我也需要養家糊口,我也想早一點買房買車。生活給我出了一道難題。
愛因斯坦在63歲時說過“一個人沒有在30歲以前達成科學上的最大成就,那他永遠都不會有。”這句話給了我很大的壓力和震動,我馬上就26歲了,離30只有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我技術上的最高峰。為了這個理想,為了能離自己的夢更近一些,我選擇了這家IC公司,我明白自己的薪資和公司剛進來的碩士研究生相差無幾, 但為了今后的發展只能忍受,一切又得重新開始。換行業是一個非常痛苦的過程,尤其從一個春風得意的位置換到一個陌生的崗位,感覺象從溫暖的被子里鉆出來跳進冰水中,讓人難以接受。在原來那家通信公司,我是唯一兩年時間漲了五次工資的員工,公司和同事都給了我極大的認可,工作上也常常被委以重任。但現在這一切都成了過去,在新的公司我只是一個新人,沒有人知道也沒有人在意我過去的成績。我決定重新開始,我把自己看作新畢業的學生,我要用自己的努力得到公司的認可。進入新的行業是非常痛苦的,我告訴自己必須忍受這一切,雖然外面有很多誘惑,但是既然作出了選擇我就不允許自己輕易放棄。
我現在已經在這家新公司上了一個多月的班,開始非常艱難,現在慢慢適應了。第一 個月結束時,Team Leader找我談話,說我是新進員工中最優秀的一個,我心里很欣慰,這也算對我努力的一個肯定吧。在這里還要感謝我的女朋友,她給了我很大的支持和鼓舞, 每次在我動搖的時候她都在鼓勵我,讓我堅持自己的理想,剛來上海是她讓我不要勉強去做MIS,這次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會有今天的成績。 現在的公司有自己的操作系統,自己的CPU、DSP和其它芯片,在這里我能學到世界上最先進的技術,我們的設計開發不再完全依賴別人的硬件和系統,這讓我很開心。我打算等工作步入正軌后,全力學習新的知識,實現我的理想。
在后面的兩年里我給自己定下了幾個目標:
一.努力做好本職工作,在工作上得到公司和同事們的認同;
二.努力學習IC硬件設計知識,多向同事請教,并利用一切機會多實踐;
三.實現我的實時操作系統的主要部分,完成TCP/IP協議棧模塊,并免費發布源代碼;
四.和我女朋友結婚并買一套小房子,這是最重要的,因為我明白事業是可以重來的,但是珍貴的感情很難失而復得。
在這里提一下我現在開發的操作系統,它是一個實時嵌入式系統,目前支持以下特性:
a.支持時間片輪轉調度和基于優先級調度,最多64個優先級;
b.搶占式實時內核;
c.為了便于移植,主體用標準C實現;
d.匯編代碼非常少,不到100行;
e.支持任務管理,各任務有獨立的堆棧;
f.進程同步和通信目前完成了Semaphore,Message Queue正在調試;
g.實現了定時系統調用;
h.可以在windows上仿真調試
我還打算下一步實現優先級反轉保護,Event Flag,Data Pipe,內存管理(以前實現過)、驅動接口等。 在這之后我還會努力完善它,比如加入文件系統,協議棧、調試接口等。希望朋友們提出自己的意見和建議,在此不勝感激!
后記:
就像有的朋友說的,我的經歷或許會給一些朋友產生誤導,在這里我必須說明一下。 我來上海以前學習過于拼命,常常晚上只睡3個多小時,我身高1米71,那時只有108斤(我現在130多),家人也說我這樣拼命活不過60歲,但是當時的我太固執,我對他們說只要能實現理想活50歲我就夠了。那時的拼命使我的身體受到了影響,有一次早上突然腰肌劇痛難忍,痛的我倒在床上站不起來。雖然我現在已經比較注意,但有時候還會隱隱作痛。后來在女朋友說服了我,來上海以后我不再如此。我經常引用父親的一句話“身體是革命的本錢”。
而且我也發現拼命不是辦法,我可以熬一兩個通宵,最多的一次我連續工作了三天三夜, 但是我半個月都沒有恢復過來,這樣是不是得不償失?學習工作應該是一個長期的過程, 像馬拉松而不是百米沖刺。我現在非常注意調整學習和工作的強度,我要保證每天盡量有相對充沛的精力,一些年輕的朋友覺得自己也應該拼命努力,這讓我多少有些擔心,如果我的故事能讓你在學習工作上多一點興趣,我會感到很開心,但如果誤導了某些朋友,讓你做一些不值得的付出,我會感到很內疚。
技術沒有貴賤只分,我以前換行業是因為自己的興趣所致,而不是對哪個行業有什么 偏見。我希望我的經歷不要給朋友一個錯誤的導向,覺得我始終向更高的技術發展。其實各行各業做到頂尖都是很困難的。話又說回來雖然技術沒有貴賤,但是門檻是有高低的, 無論如何,做IC的門檻要比做網頁的高,這一點無可否認。國家各種人才都是需要的,但是作為個人奮發向上的想法還是應該有的,努力在自己喜歡的行業上做的更好,而不應該停留在比較膚淺的層次上。
我是一個自己覺得比較有自知之明的人,或許我最大的優點就是知道自己有很多缺點 :)。我的故事中很多的曲折和錯誤都是由我的缺點造成的,希望大家用審慎的眼光看待我的經歷,不要被我的“花言巧語”所迷惑。我學習有些隨心所欲,這給我帶來了無盡的麻煩,也大大阻礙的我的發展。記得我小時候成績比較出色,但是后來學習嚴重偏科,導致我中學成績一再滑坡,也沒有考上什么好的學校,小時候的一個朋友,當時的成績和我相仿,但是沒有我這個缺點,她上了清華,后來在去了美國深造,在一個著名導師手下研究理論科學,這未嘗不是一條更好的出路。另外我的學習方法也是在不斷改善中的,過去 的學習過于講究數量和時間,那樣學習既苦而已效率不高,現在我非常注意學習的效率和技巧,這樣才是學習的捷徑(當然不是指投機取巧),比如說學一相對陌生的技術,如果有條件,不妨問一問有經驗的人,不需要問很多,往往他不經意的幾句話會給你非常大的幫助,甚至超過你看一個星期的書。帶著這樣的思想再去學習你會節省很多時間,這樣何樂不為呢?這些年中我學了不少的東西,由于開始非常盲目,所以學的東西雜亂無章,現在回想起來讓我啼笑皆非,我把大量的時間浪費在一些沒有必要深入了解的知識上,畢竟一個人的精力是有限度的。很多朋友很我一樣都背過五筆字形,的確它是個不錯的輸入法,但是對一個研發人員它絕對不值得你去背,你的時間應該花在有價值的地方。我這樣的事情還做過很多,我背過CCED、WPS的命令和快捷鍵,在dBase基本退出歷史舞臺后我還花了很多時間去學習它的使用。所以我的學習在前期缺乏規劃,沒有明確的短期目的、中期目標,只有一個虛無飄渺的長期的理想。這就像做設計一樣,好的設計是從需求抽象到代碼有很多過程,而不能得到了需求就立刻開始開始編碼。
當然這么些年的學習和工作多多少少有些收獲,下面我說說我的一些學習的心得,這 些方法未必正確,我也在不斷探索和改進中。我的學習和工作有相對明確的目標,我不會一時心動而去學習某一技術,在下決定之前我會考慮很多,包括長期的發展,個人路線的規劃,需要付出的代價、可能遇到的困難及解決的辦法等等,在決定后還會制定更加明確的計劃,包括短期、中期和長期的,身邊可以利用到的資源(包括好的書籍、資料、軟硬件環境,也包括有經驗的朋友或者師長),以及每一個階段是怎么過渡到高一階段的計劃,往往在一個學習階段一旦上路后會走的相對順利,但是跨階段通常比較麻煩,比如從學習基礎知識轉到實踐。另外我買書也有自己的方法,現在世面上高質量的書遠不如低質量書多,對于一個陌生的技術,往往在第一次買書會選擇錯誤,即使買到一本好書但是它的方向也未必適合你,所以我通常會先在網上查找一些該技術的介紹,有了一點點概念后再去買一本比較薄、相對便宜并且內容相對泛泛而談的書,這是國內作者最善于寫的書:) ,再把它瀏覽一遍后我就會基本明白這門技術的要點,后面買書和制定計劃就會明確的多。否則一開始就想找本好書往往比較困難,而且買回來后努力學習,有時候學了一半才發現是本低質量的書或者是相對過時技術,讓人非常懊惱。另外讓有經驗的人幫你介紹,通常也是一個不錯的選擇。
有些朋友想學通信、嵌入式開發,但總覺得自己沒有軟硬件環境,我就按我的了解給 大家介紹一下怎么建立這樣的環境,當然我了解的只是我學習和工作的方向。通信我做的是數據網方面的工作,包括TCP/IP、二三層交換、對接入網、H.323和軟交換也有一點認識。這些軟硬件環境都是可以在PC上構建的。你甚至可以在一個沒有網卡的PC上建立一個包含多個路由器、接入服務器、VoIP網關、網守、主機等的仿真網絡環境,而且與實際的網絡相當接近,當然這需要你有清晰的網絡概念和一定的網絡知識,我一直在努力開發一套軟件將這個過程簡化,目前試驗已經做完,我可能會將它融入我的操作系統外圍擴展軟件中。這樣的方法我無法用簡單的語句講的很清楚,我可以說一下大概的思想,就是在PC上實現仿真網卡,(知道Windows怎么在沒有網卡的機器實現虛擬網卡技術的朋友都應該會明白),然后每一個仿真網卡對應一個虛擬設備,如路由器或者主機。你也可以借助第三方工具完成部分工作,如VmWare等。我現在就是利用一個仿真網卡做自己的開發的。
至于嵌入式開發環境更加容易實現,PC就是一個非常大的硬件平臺,現有的嵌入式操 作系統通常都支持X86,你可以在上面做開發,通過軟盤Boot或者使用虛擬機裝載,我用VxWorks做了試驗,在一臺PC上跑Windows和VxWorks兩個系統。另外Windows上的兼容DOS的16位仿真X86環境也為很多操作系統提供了絕佳的試驗環境,我的操作系統在Windows上就是這樣實現的。Linux在嵌入式中應用也比較廣泛,它在網上有大量的資料,而且也相對比較容易實踐。同時很多完善的嵌入式開發環境支持軟件仿真,如Tornado、WinCE等。?
從Coding Fan到真正的技術專家
中國有很多小朋友,他們18,9歲或21,2歲,通過自學也寫了不少代碼,他們有的代碼寫的很漂亮,一些技術細節相當出眾,也很有鉆研精神,但是他們被一些錯誤的認識和觀點左右,缺乏對系統,對程序的整體理解能力,這些人,一個網上的朋友說得很好,他們實際上只是一些Coding fans,壓根沒有資格稱為程序員,但是據我所知,不少小網絡公司的CTO就是這樣的coding fans,拿著嚇人的工資,做著嚇人的項目,項目的結局通常也很嚇人。程序員基本素質:
作一個真正合格的程序員,或者說就是可以真正合格完成一些代碼工作的程序員,應該具有的素質。
1:團隊精神和協作能力
把它作為基本素質,并不是不重要,恰恰相反,這是程序員應該具備的最基本的,也是最重要的安身立命之本。把高水平程序員說成獨行俠的都是在囈語,任何個人的力量都是有限的,即便如linus這樣的天才,也需要通過組成強大的團隊來創造奇跡,那些遍布全球的為linux寫核心的高手們,沒有協作精神是不可想象的。獨行俠可以作一些賺錢的小軟件發點小財,但是一旦進入一些大系統的研發團隊,進入商業化和產品化的開發任務,缺乏這種素質的人就完全不合格了。
2:文檔習慣
說高水平程序員從來不寫文檔的肯定是乳臭未干的毛孩子,良好的文檔是正規研發流程中非常重要的環節,作為代碼程序員,30%的工作時間寫技術文檔是很正常的,而作為高級程序員和系統分析員,這個比例還要高很多。缺乏文檔,一個軟件系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇到極大的麻煩。
3:規范化,標準化的代碼編寫習慣
作為一些外國知名軟件公司的規矩,代碼的變量命名,代碼內注釋格式,甚至嵌套中行縮進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助于代碼的移植和糾錯,也有助于不同技術人員之間的協作。
有些coding fans叫囂高水平程序員寫的代碼旁人從來看不懂,這種叫囂只能證明他們自己壓根不配自稱程序員。代碼具有良好的可讀性,是程序員基本的素質需求。
再看看整個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年的外部測試都是正常的,因為永遠都會又不可預料的問題存在。
完成測試后,完成驗收并完成最后的一些幫助文檔,整體項目才算告一段落,當然日后少不了升級,修補等等工作,只要不是想通過一錘子買賣騙錢,就要不停的跟蹤軟件的運營狀況并持續修補升級,知道這個軟件被徹底淘汰為止。
寫這些步驟算不上賣弄什么,因為實話講我手邊是一本《軟件工程》,在大學里這是計算機專業的必修課程,但是我知道很多程序員似乎從來都只是熱衷于什么《30天精通VC》之類的,他們有些和我一樣游擊隊出身,沒有正規學過這個專業,還有一些則早就在混夠學分后就把這些真正有用的東西還給了老師。
網上現在也很浮躁,一些coding fans亂嚷嚷,混淆視聽,實際上真正的技術專家很少在網上亂發帖子的,如筆者這樣不知天高地厚的,其實實在是算不上什么高手,只不過看不慣這種對技術,對程序員的誤解和胡說,只好挺身而出,做撥亂反正之言,也希望那些還沉迷于一些錯誤人士的coding fans們能認真想想,走到正途上,畢竟那些聰明的頭腦還遠遠沒有發揮應有的價值。