修煉一名程式設計師的職業水準

發表於2011-12-02

來源: 林慶忠

作者:林慶忠,1990年畢業於昆明工學院計算機軟體專業,後又於1999年畢業在南京大學 完成軟體工程專業碩士的學習,現供職於CNPC旗下的一個行業軟體研發中心,因為在網上看了許多有經驗的各路軟體開發人員寫的好帖,一時手癢興起,也湊一篇壯壯聲勢。(伯樂線上注:此文寫於2005年)

假設你是一名軟體專業畢業的本科學子,如何在工作中修煉成為一名有較高職業水準的程式設計師呢,本文試圖總結作者從事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都有),我為你鼓掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是把以前和當前你工作中你不滿 意的程式推倒重新設計一遍,這非常重要,省時省力,因為你熟悉需求,技術上也沒問題,目的就是改程式序的邏輯結構,很划算哦,唯一要克服的就是:你對推翻 以前工作中那點小小成就的心理障礙,如果你真想優秀,說句粗話:這點心理障礙算個屁,一遍遍反覆地推倒已有的成果只能使自己快速進步,放手幹吧,沒什麼好 可惜的,馬恩早就在《共.產.黨宣言》裡說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。

讓我們來總結一下,經過自我否定後,再生的你儘管對過去的“業績”還有一些眷戀,但已是一個初步具備職業水準的程式設計師了,掌握了相應的技術和技巧,具備了較高的抽象邏輯思維能力,最主要的特徵是:能自覺地自我否定,不斷地追求更高水平的邏輯能力。

在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。

從編譯原理的角度來理解你工作中使用的高階語言,如果你做到這一點,至少有兩個好處,第一個好處是避免一大堆低水平重複出現的編譯錯誤。一名優秀的 Coder平均在一個工作日中應該完成200行以上的原始碼,其編譯錯誤應該控制在5個以下,要知道這200行原始碼不是一次完成的,所以大多數情況下你都要 追求一次編譯通過,而一名職業水準的程式設計師,應該進一步做到即使用purify這類的工具來檢查原始碼,也不會存在嚴重的記憶體洩露。第二個好處是可以提高源 碼的可讀性和效率。規範地編寫你的程式碼使你自己的邏輯清晰,因為你明白多加幾個括號和空行、多換行對齊、多註釋,編譯器是會自動識別的,不影響程式執行的 效率,反過來,控制好遞迴呼叫和迴圈內的if語句才是提高程式效率的關鍵,要全力避免遞迴,但要深刻理解遞迴,能通過自己建立堆疊來把遞迴程式轉換成非遞 歸程式,要求還是較高的哦!

避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表現在你的程式邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但要心裡有數才 行,所以你需要幫助,如果你有幾個水平相若或更高的職業夥伴,太好了,當遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路 清晰明確地表述你的問題,通常你自己在這個過程中或者夥伴中就有人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業夥伴是人生的一件幸 事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT發展的這麼快,你再優秀,那點東東也沒有什麼值得隱藏的,所以你可以 技術或水平不夠高,但千萬不可以讓真正具有職業水準的選手鄙視你的職業品質和行為。

有自己debug的特點,下面的說法作者不敢太肯定,只是經驗之談。即使在VC這種高度完善的開放環境下,你仍然應該要求自己僅憑列印語句就能 debug。這也有兩點好處,第一個好處是,遇到bug你會認真想問題所在,而不是用debug工具一步步簡單地追蹤卡在哪兒了,你定位bug範圍的方式 是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應該先看到森林,再看到樹木。我反覆提及: 程式就是邏輯過程,大多數程式從main函式開始,是由資料結構和功能子程式組成的一個樹形結構的邏輯過程(要認清即使是物件導向的程式語言也是一樣 的),它的執行過程是深度優先的,但你定位bug應該是廣度優先的,好好想想這一點,嗯?第二個好處是強迫你思考並記住而不是用工具看到呼叫過程,你大腦 的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程式結構上的邏輯錯誤引起的,這一點就非常重要了,順便說一句,最難打的 bug就是程式邏輯結構錯誤導致的bug。你要是真正明明白白地認識到這兒了,那我就沒什麼東西可以告訴你了。總之,程式設計師的職業水準:生產效率和程式質 量,主要是取決於原始碼中bug的數量和debug的速度,而不是取決於編寫原始碼的速度。給你一個我自己定義的考查一個職業程式設計師的指標:一個合格水準的職 業程式設計師,程式設計的時間如果算一份的話,其累計debug的時間不能超過一份,真正職業高手累計debug的時間應該控制在0.5份以下,如何?你關上門悄 悄問問自己,你花費在程式設計和debug上的時間比例是多少?如果你把程式設計師作為自己一生的職業,那麼就永遠都要牢記一點:追求做一個0 bug的優秀程式設計師!這是任何一個想成為職業程式設計師的人的理想,請相信:堅忍不拔地追求實現這個理想將讓你出類拔萃!

做好程式的單元測試,這是另一項考查你是否是一名具有合格職業水準的程式設計師的一個必要指標。其實在你拿到需求的時候就要準備單元測試用例了,並且這些用例 將直接影響你的詳細設計(有關軟體設計本來是該放在第四節講的)。我們還是打比方吧,當你拿到一個需求時,除了分析它靜態的功能外,還應明確它動態的操作 /執行過程,把這個動態過程明確地用流程圖畫出來,比如分為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!,用周星星的話說:是高手之高高手,因為別人看不出你高在哪兒,沒見你有什麼高招或特拚命幹,但反正你就是幹得又快又好、又省力。關於進行單元 測試還有很多複雜的方法,在此本文只提到了最基本的一點,目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒有人能替你吃飽飯!

如果你是用C++程式設計,我再簡單談談有關內層釋放的一個小技巧,就是對所有你編寫的類,在構造和解構函式中加列印語句,統計每個類在執行程式時構造和析構 的地方,如果是配對的,那麼起碼沒有物件類一級的內層在程式執行結束時沒有釋放,然後你就可以把列印語句刪掉了,招數雖土,但管用!

還有其它一些好習慣,在這裡我隨筆寫一些,你要是有不同看法也請一笑過之吧。程式設計時應該對齊縮排,一個縮排用一個tab鍵,一般是4個空格,嚴格遵守開發 團隊的程式設計規範也是非常重要的。一個子程式不應超過30行(不算空行),其內多重迴圈不應超過3層,否則都應該分裂成兩個子程式,個別演算法程式可以長一 些,但也不宜超過200行。通常一個類的所有成員函式總和不宜超過1500行,多了就應該考慮分解成兩個類(這個工作最好在設計時就完成)。每完成一小段 程式,比如15~30行,就立即編譯執行,不要假裝高手,先敲它一大堆程式,再編譯執行,妄想一次成功,體驗一種假爽的、虛榮的快感,或炫耀給別人看,這 麼做只能證明自己是一個不折不扣的傻瓜,裝酷而已。因為只要有一次不成功,你就會花費大量的時間來調程式,別人的進度在這時就遠遠地超過你了,平常心是 道,還是修煉真功夫吧!孫子兵法裡關於這一點有明確的闡述,我就不引用了,但建議你真的不要這麼幹,除非你確實就是這樣總是一次就成功的天才,那你還看這 篇文章幹什麼呢?我又不是寫給你們這些天才們看的。再就是有學會買好書、讀好書,關於計算機和軟體方面的書太多了,時間有限,比如有一個叫侯捷的傢伙,幾 乎寫的每本書都不錯,張國峰的C++程式設計也不錯,這只是我的個人意見啊,好書多著呢,列出來比這篇文章長好多倍,我就不多說了。還有一招,要是你運氣好, 能搞到一些著名軟體系統的原始碼,好好讀讀吧,在此我只能告訴你,Linux作業系統的一些原始碼不錯,是開放的,你可以合法地搞到,其它的不要說是我建議你 侵犯知識版權啊!

四、天生神力:成為系統分析員

本來就論述如何成為一名職業程式設計師而言,本文已基本完成任務了,但《菜根譚》有言:竭世機樞,似一滴投於巨壑,窮諸玄辯,若一毫置於太虛。既已乘興到此,何妨多置一毫於太虛呢,作者不才,乾脆盡興寫算了。

你要是運氣好,直接進入了一個嚴格規範生產的軟體企業就業,剛開始就應該是按別人做好的軟體設計來實 現程式設計,你可以有機會直接學習軟體設計,當你積累的足夠多了,能夠對其中的一些設計提出好的改進建議,而且幹得又快又好,就會漸漸地展露頭角,我相信你終 有一天成為一名軟體設計人員(注意,不是軟體產品設計人員),步入系統分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個不規範的軟體企業工 作,那也不錯,你很可能直接就有機會進行軟體設計,然後開發、測試,甚至還不得不自己定義需求,把軟體開發過程的各個環節走一個遍,當然這樣對你的要求更 高,而且你也不容易得到及時有益的指點,在正態分佈的情況下,你應該是成長的很慢。但不管就業的單位如何,如果你決心要成為頂尖軟體職業選手,通常什麼客 觀困難都阻擋不了你,然而你個人的因素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此提前道歉,並建議你除非對本文有強烈的興 趣,否則就請直接看第五節或放下別看了。醜話已說在前頭了,在各種軟體開發組織的發展過程中的事實也證明,只有少數程式設計師能成為系統分析員,我想這一點不 是我杜撰的吧,因此你要是在看接下來的部分時感到氣憤難當,那也實在沒著,純屬活該,因為作者只是在說明自己的觀點而已,你最多可以呲之以鼻,表示一下你 的輕蔑好了,但沒有任何理由可以罵人!

作者自己沒有到微軟面試過,但身處軟體行業,關於微軟的許多東東當然還是有耳聞的,據說微軟招聘一名 程式設計師要過五個已經成為微軟程式設計師的面試關,而且是一票否決制,又據說大多數面試題並非程式設計,而是一些有關邏輯和智力的題,作者私下也做過許多流傳的微軟 面試題,並對此做法深以為然。程式的本質就是邏輯,所以幾十年前就有人提出程式設計是一門藝術,而藝術是要靠天份的,這一點少有人反對。一個人的邏輯能力可以 不斷提高,但其能到達的終極邏輯能力的層次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開承認自己沒有某種或全部的藝術天份,但 要說自己邏輯天份不夠,換句話說承認自己笨、IQ不夠高,往往是要怒髮衝冠的,其實這又有什麼區別呢?話都說到這兒了,再次建議你如果不夠自信,就跳過這 一節吧,直接看第五節,好嗎?

好了,把話題說回來,你已經成為一門合格的職業程式設計師了,如果要想成為從事軟體系統設計的職業系統分 析員,第一件事就是悄悄找一個標準智商測試的網站或其它渠道,嚴格認真的測一測自己的智商,如果IQ低於130 (正常智商是110),就請別費勁了,打消掉成為系統分析員的念頭吧!好!好!先請你冷靜一下,好好想想,其實微軟面試時就是在測你的智商和邏輯數學素質 呢,這就是本節的標題為“天生神力”的原因,因為設計就是從無到有地進行創造,無論是軟體還是其它行業都一樣,可以有借鑑的,沒有現成的,設計就是創造! 如果你IQ在130以上,又決心要當一名職業軟體系統分析員,其實你不過是要準備好吃更大的苦而已,有什麼好虛榮的呢?

修煉還是從基本功開始的,過程和成為一名職業程式設計師差不多。必須使用設計工具這一點是不用多說的。在 工作中,你基本上遇到的是兩類方式的設計,一個是結構化設計,另一個是物件導向設計,就個人經驗而言,物件導向的設計更好。如果你工作中不得不採用結構化 的設計,你必須熟練地掌握資料流圖和控制流圖的分析和設計,一般來講,如果你把一個軟體中用到的資料模型設計好了,針對功能化的流程,不難設計出資料流 圖,但下一步設計控制流圖才是挑戰,如果你按照需求走不通設計好的控制流圖,那麼你或別人在按照這個設計程式設計實現時,必定也走不通,沒有奇蹟會發生,還是 在設計階段嚴格要求吧,又有一點需要牢記:返工是最慢的。當你在進行控制流圖的設計時,也不要妄想得到需求人員提供給你明確的指點,通常他們要是能夠把需 求的功能和操作次序寫完整的話,你應該就感恩戴德了,從需求中整理出功能、操作的拓撲次序和條件是你作為系統分析員的職責。看看,要是沒有一點圖論的基礎 和拓撲學的入門知識,你是當不好一個職業系統分析員的,即使你天賦不錯,必要的數學和邏輯素質仍然不可或缺。也不用氣餒,永遠沒有最好的設計,只有更好的 設計,反覆地進行設計迭代,勇於推翻舊的設計,你將快速進步。

如果你在工作中是採用物件導向進行設計的,那就更有利了,有關物件導向設計的書太多了,不用 作者在此多費口舌,建議精讀一本經典的書,比如北大邵維忠等編譯的《物件導向的分析》,有些方法和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質 是,你在邏輯上是如何認識這個世界的,你就是如何設計軟體體系結構的,然後讀讀其它書,觸類旁通,自己創造機會多實踐,成功自然會到來的,總之,不管是結 構化設計還是物件導向設計,評價一下自己的軟體系統設計方案吧,有好多指標呢,比如是否均勻和平衡?區域性獨立性強不強?有沒有歧異的結構?有沒有層次太多 或太少?有沒有某個層次太大、太廣?是不是邏輯結構先複雜了再化簡的?還是隻會設計簡單的,複雜不起來(這一點是笨哦,如果出現多次,請你不要意氣用事, 轉行吧)?最重要的一點,是否容易理解、實現和改進?你自己會得出評價的。如果有機會看到別人的設計,一定不要錯過學習的機會,自己推導一遍,認真比較比 較,獲益會較多。

走到這一步,你就應該關注設計模式了,首先還是學習,這方面的好書有的是,但一般在工作中用到的設計 模式較為單一,應該多嘗試一下其它的設計模式。其次必須要明白設計模式不是設計思路,也不能代替設計思路,比方你要從A到B修一條路,設計模式只是讓你選 擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設計思路,模式對思路是有影響,但不能代替,所以如果你的智商高達 250,我相信你直接用匯編語言也能寫出物件導向的程式來。第三在此有一個陷阱,很多系統分析員生搬硬套設計模式,全然不懂如何融會貫通,在你的一項具體 工作中,往往是以一種設計模式為主,其它模式為輔的,思維不拘泥於形式才是關鍵,而且也為你到達更高的軟體設計的境界做好準備。

唉!都不知該怎麼向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟體設計最終 的層次是:以無法為有法、以無限為有限,這句話是李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天屠龍記》裡講到張無忌初學太 極,學會的標誌是把剛學的招數全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟體設計也一樣,忘記所有的設計模式,隨心所欲進行設計才是至高境 界,所以你能到達多高的軟體設計的境界最終將取決於你的哲學素質,這一點實在是不好寫啊,你自己領悟吧!作者只有祝福了!

五、職業人的終極目標:全面修煉,成為Leader

這一節更不好寫,涉及到太多其它非技術方面的因素,特別是個人人生觀和世界觀的修煉,如果本帖的點選 率超過作者私下期望的一個數值,那我就爭取盡力厚著臉皮再補上吧。我只說一句,雖然大家都知道軟體開發是一個團隊性的工作,但追求參與一個大型軟體系統的 成功開發,是一名軟體人員的本能,就像拿破崙說的不想當元帥的士兵不是好士兵,所以不追求實現大系統的軟體人員,也不是一個好的職業軟體人員,但你只有成 為Leader,領導一個優秀的軟體開發團隊,才有機會實現這個終極職業目標,對不對?

好吧,不管你現在的感受如何,我都謝謝你能讀到這裡!我不習慣假歉虛,就不說什麼作者水平有限,本文 拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然作者水平確實有限。所以我認為你儘管有權砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡 興寫一點多年從事軟體開發工作的體驗,因此接下來我就高掛免戰牌,不回覆任何回帖了。再次謝謝你能有耐心讀到這裡!希望本文對你有所裨益,祝你成功!再見!

 

相關文章