第一篇:修煉一名程序員的職業(yè)水準(zhǔn)
修煉一名程序員的職業(yè)水準(zhǔn)(林慶忠__署名原創(chuàng))
作者:林慶忠,1990年畢業(yè)于昆明工學(xué)院計(jì)算機(jī)軟件專(zhuān)業(yè),后又于1999年畢業(yè)在南京大學(xué) 完成軟件工程專(zhuān)業(yè)碩士的學(xué)習(xí),現(xiàn)供職于CNPC旗下的一個(gè)行業(yè)軟件研發(fā)中心,因?yàn)樵诰W(wǎng)上看了許多有經(jīng)驗(yàn)的各路軟件開(kāi)發(fā)人員寫(xiě)的好帖,一時(shí)手癢興起,也湊一篇壯壯聲勢(shì)。
假設(shè)你是一名軟件專(zhuān)業(yè)畢業(yè)的本科學(xué)子,如何在工作中修煉成為一名有較高職業(yè)水準(zhǔn)的程序員呢,本文試圖總結(jié)作者從事15年軟件開(kāi)發(fā)工作的感想,希望對(duì) 有志成為職業(yè)程序員的人有所幫助,并借此機(jī)會(huì)感謝原昆明工學(xué)院計(jì)算機(jī)系的和智玲老師和張懷寧老師,特別感謝我的碩士導(dǎo)師,南京大學(xué)計(jì)算機(jī)系的博導(dǎo)鄭國(guó)梁教 授。
注:本帖言辭尖刻,乃作者脾氣秉性使然,如果你看著有氣,就請(qǐng)多多見(jiàn)諒,放下別看了。
程序就是一系列按步驟進(jìn)行的操作序列,它有好多種級(jí)別,比如最低級(jí)的微程序、次低級(jí)的匯編程序、高級(jí)的各種編程語(yǔ)言程序、最高級(jí)的腳本語(yǔ)言程序,也 許我列的不對(duì),但沒(méi)關(guān)系,我要說(shuō)的是不管是那個(gè)級(jí)別的程序,其本質(zhì)都是操作的邏輯序列。大多數(shù)系統(tǒng)和應(yīng)用程序都是建立在高級(jí)編程語(yǔ)言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就讓我們只關(guān)注這一級(jí)的編程能力吧。因此如果一個(gè)程序員的邏輯能力不高,他永遠(yuǎn)都不能成為一名 具有合格職業(yè)水準(zhǔn)的程序員,我們?cè)谙旅娴挠懻撚嘘P(guān)編程能力的方方面面,最終都是為了最大程度地提高和實(shí)現(xiàn)一名程序員的邏輯能力。
一、掌握基礎(chǔ)知識(shí):十六年寒窗的持續(xù)積累
從7歲讀小學(xué)起,經(jīng)過(guò)16年的學(xué)習(xí),你從軟件專(zhuān)業(yè)本科畢業(yè)后,必須完成以下幾門(mén)專(zhuān)業(yè)課程的學(xué)習(xí):計(jì)算機(jī)組成、操作系統(tǒng)原理、匯編語(yǔ)言、數(shù)據(jù)結(jié)構(gòu)、編 譯原理、數(shù)據(jù)庫(kù)原理、軟件工程、結(jié)構(gòu)性設(shè)計(jì)語(yǔ)言(PASCAL、C)、面向?qū)ο笤O(shè)計(jì)語(yǔ)言(C++、C#)、計(jì)算機(jī)網(wǎng)絡(luò)等,你最好還懂一些算法分析、分布式 系統(tǒng)、計(jì)算機(jī)圖形學(xué)、形式邏輯、人工智能原理、軟件設(shè)計(jì)模式、軟件構(gòu)架/框架等研究生的課程,16年來(lái),你積累的除了知識(shí),更重要的是形成最適合自己的學(xué)習(xí)方法和工作方法。這些是你具備程序員職業(yè)水準(zhǔn)的基礎(chǔ)能力,不要受什么計(jì)算機(jī)軟件怪杰之類(lèi)傳奇的影響,那不過(guò)是小概率事件,而且這些怪杰們就算沒(méi)有讀過(guò)軟 件本科和研究生,也往往自學(xué)了大多數(shù)專(zhuān)業(yè)課程,很可能比在校學(xué)習(xí)的學(xué)生對(duì)這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但 普遍性差,可以借鑒,不宜模仿。好,所以現(xiàn)在你只需要問(wèn)問(wèn)自己,那些課程和知識(shí)都學(xué)會(huì)并掌握了嗎?如果是,那就準(zhǔn)備好進(jìn)行實(shí)踐了。
二、在實(shí)踐中提高:成為一名高水平的Coder
好了,你畢業(yè)了,在校功課都不錯(cuò),也找了一個(gè)專(zhuān)業(yè)對(duì)口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說(shuō)來(lái)看看。
通常,你在工作中都會(huì)用到某一種單位/公司固定的操作系統(tǒng)和編程語(yǔ)言開(kāi)發(fā)環(huán)境,比如Windows、UNIX、LINUX等操作系統(tǒng),又比如用 VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語(yǔ)言和開(kāi)發(fā)環(huán)境,我們?cè)诤竺?把它們合稱(chēng)為開(kāi)發(fā)環(huán)境。就在校學(xué)習(xí)的有關(guān)開(kāi)發(fā)環(huán)境的知識(shí)而言,大概你距工作需要的差距是不小的,當(dāng)某個(gè)操作系統(tǒng)和編程語(yǔ)言環(huán)境成為你的飯碗時(shí),就不應(yīng)也不 能用通過(guò)課程/認(rèn)證考試之類(lèi)的眼光和要求來(lái)評(píng)價(jià)你的能力,即使你能考100分。你需要深入地學(xué)習(xí)該操作系統(tǒng)和編程語(yǔ)言環(huán)境的各類(lèi)開(kāi)發(fā)手冊(cè)的所有內(nèi)容,你會(huì) 說(shuō)大多數(shù)你都用不上,其實(shí)你既對(duì)又不對(duì),對(duì)的是單從使用的角度而言,你確實(shí)用不上開(kāi)發(fā)手冊(cè)的大多數(shù)內(nèi)容,比如龐大的VC開(kāi)發(fā)類(lèi)庫(kù)和復(fù)雜的開(kāi)發(fā)環(huán)境,你在實(shí) 際工作中能用到的不到總數(shù)的1/10或1/5,不對(duì)的地方在于,你用到的部分不是孤立存在的,它們是整個(gè)體系中的一部分,只有對(duì)整個(gè)體系有了一個(gè)較完整的 了解,才能得心應(yīng)手、隨心所欲地用好你用到的部分,你才算初步具備在這種開(kāi)發(fā)環(huán)境下進(jìn)行Coding的職業(yè)水準(zhǔn)(還遠(yuǎn)不夠程序員的職業(yè)水準(zhǔn)呢),而這只是 剛開(kāi)始。如何才能真正掌握一種開(kāi)發(fā)環(huán)境的全面的知識(shí)呢,最原始的辦法就是讀開(kāi)發(fā)指南/教程、參考手冊(cè),一般來(lái)講,學(xué)習(xí)開(kāi)發(fā)指南/教程時(shí),你如果是一個(gè)認(rèn)真 的人,都會(huì)完成5/10~7/10左右內(nèi)容的學(xué)習(xí)和練習(xí),如果你想成為職業(yè)選手,就應(yīng)該完成9/10以上內(nèi)容的學(xué)習(xí)和練習(xí)。參考手冊(cè)不同,大多數(shù)所謂的 “程序員”們只是用到了才翻翻,這差的太遠(yuǎn)了,你應(yīng)該象讀開(kāi)
發(fā)指南/教程一樣,每個(gè)環(huán)節(jié)都要讀,比如VC,參考手冊(cè)中的每個(gè)類(lèi),類(lèi)的每個(gè)函數(shù),都要讀上幾 遍,它們往往是一小伙一小伙地糾纏在一起使用的,開(kāi)始時(shí)讀得你毫無(wú)頭緒、心煩意亂,不要緊,還有一手呢,如果你開(kāi)發(fā)環(huán)境安裝的全面,它們往往都有開(kāi)發(fā)商做 的demo例子可看,你就進(jìn)入另一個(gè)境界了,開(kāi)始時(shí)你關(guān)注demo中的具體技術(shù),后來(lái)你發(fā)現(xiàn)這些demo的程序?qū)懙亩歼€算不錯(cuò),結(jié)構(gòu)簡(jiǎn)單但合理,如果你真 的用心,就一定能發(fā)現(xiàn)一些個(gè)別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計(jì)不出來(lái)的,你現(xiàn)在有點(diǎn)更關(guān)心它的程序設(shè)計(jì)構(gòu)架,甚于對(duì)你原始目的(某種相 關(guān)的技術(shù)/技巧)的關(guān)注,這時(shí)的你,開(kāi)始了從一名Coder向一名Programmer的轉(zhuǎn)變,你會(huì)忍不住要看看開(kāi)發(fā)商提供的源程序,比如.h 和.cpp,通常你會(huì)找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊(cè)中都沒(méi)提到,你要學(xué)的太多了,沒(méi)時(shí)間顧及其它的業(yè)余 愛(ài)好了,現(xiàn)在知道為什么程序員是年輕人的職業(yè)了吧,你要有足夠多的時(shí)間才行,即使你的智商有160。如果你走到這一步,在你工作的團(tuán)隊(duì)中,已經(jīng)是經(jīng)常有人 向你請(qǐng)教技術(shù)問(wèn)題,經(jīng)常有人請(qǐng)求你幫忙debug,你已是公認(rèn)的“高手”了,別得意,因?yàn)槟闳匀皇莻€(gè)Coder,為什么這么說(shuō)呢,你想想,你已深入了解了 這個(gè)開(kāi)發(fā)環(huán)境中的各種技能,知道一名Coder如何用好這些東西,可是你能設(shè)計(jì)的出提供給Coder們用的東西嗎?唔??,你想了想,可能還不太行。對(duì) 了,就是這樣,你還是一名小我境界的程序員呢,本質(zhì)是個(gè)Coder,當(dāng)然已是一名高水平的Coder了,然而你需要進(jìn)一步登堂入室才能成為一名真正的程序 員。
讓我們繼續(xù)吧,通常你都是從精通一種編程環(huán)境開(kāi)始的,假設(shè)你已經(jīng)較為精通在Windows下用VC開(kāi)發(fā)軟件了,這時(shí)在技術(shù)和技巧方面你將面臨一小一 大兩個(gè)挑戰(zhàn),第一個(gè)小挑戰(zhàn)是如果公司/單位改換了開(kāi)發(fā)環(huán)境,比如用LINUX下的QT交互語(yǔ)言工具進(jìn)行開(kāi)發(fā),你不過(guò)是把前面掌握VC的過(guò)程再來(lái)一遍,由于 在主觀上經(jīng)歷了VC工具的學(xué)習(xí)過(guò)程,在客觀上各種開(kāi)發(fā)環(huán)境都有太多相似的方面,這回你掌握的應(yīng)該較快。要小心,在這時(shí)第一次誘惑之門(mén)打開(kāi)了,因?yàn)槟愀杏X(jué)良 好,看!這回這么快,我就這么好地掌握了新的開(kāi)發(fā)環(huán)境,你開(kāi)始關(guān)注其它暫時(shí)還用不到的同類(lèi)環(huán)境,比如VB、Delph、JAVA,如饑似渴地掌握各種開(kāi)發(fā) 工具,證明自己的學(xué)習(xí)能力和價(jià)值,但你忘了一點(diǎn),你仍然是個(gè)Coder,只不過(guò)是一個(gè)在好多開(kāi)發(fā)環(huán)境下都能編程的Coder,就像你生活在中國(guó),因而精通 了漢語(yǔ),工作需要你又掌握了英語(yǔ),然后你就來(lái)了勁,把俄語(yǔ)、日語(yǔ)、阿拉伯語(yǔ)、拉丁語(yǔ),等等等等,都學(xué)習(xí)個(gè)遍,我只能說(shuō),有點(diǎn)BT。你忘了自己是個(gè)職業(yè)人,同一類(lèi)的東西工作中用得到才需學(xué)習(xí),太多太多的Coder們喜歡在一起比較和炫耀自己會(huì)掌握了幾種開(kāi)發(fā)工具,不信你看看招聘時(shí)的求職書(shū)就知道 了,sigh!他們中絕大多數(shù)人永遠(yuǎn)都只能停留在這個(gè)層次上,心浮氣躁,一生都再也當(dāng)不成真正的程序員了。總結(jié)一下,其實(shí)你在這時(shí)需要的是對(duì)自己掌握新開(kāi) 發(fā)環(huán)境的能力的自信,而不是一遍遍地重復(fù)來(lái)證明自己。第二個(gè)大挑戰(zhàn)就是你明白了只掌握VC是不夠的,你發(fā)現(xiàn)自己有點(diǎn)淺薄,有很多東東你會(huì)用但你不太懂,很 多方面支持VC編程的知識(shí)你都沒(méi)掌握,比如操作系統(tǒng)的源碼、網(wǎng)絡(luò)協(xié)議知識(shí)、Windows 的注冊(cè)表、進(jìn)程和線程的基礎(chǔ)知識(shí)、硬件驅(qū)動(dòng)方面的知識(shí)、ActiveX、Windows 龐大的 API,又是一個(gè)等等等等,這些基礎(chǔ)知識(shí)的學(xué)習(xí)和掌握可是要花費(fèi)大量時(shí)間的,你再一次深切地感到時(shí)間太不夠用了,因?yàn)檫@時(shí)的你大概有許多俗務(wù)纏身了,所以 有點(diǎn)沮喪,還不用提IT業(yè)每天不知有多少新東西在發(fā)布,KAO,永遠(yuǎn)都跟不上,越拉越遠(yuǎn)了。哎!別氣餒,振作一點(diǎn),你還是忘記了自己是個(gè)職業(yè)人,既然好多 東東在工作中你永遠(yuǎn)都沒(méi)機(jī)會(huì)用,那么干嘛要學(xué)呢?用什么才學(xué)什么,最多預(yù)測(cè)到馬上要用什么,先一步學(xué)什么好了,要知道沒(méi)有人是真正的、無(wú)所不精的全科大 夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個(gè)人嘛。
OK,一般工作后三五年,你經(jīng)歷了上述過(guò)程,經(jīng)受了誘惑和考驗(yàn),終于明白了一個(gè)道理:你要的是強(qiáng)勁的學(xué)習(xí)知識(shí)的能力,是對(duì)某種軟件知識(shí)/技能的有深 度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類(lèi)和數(shù)量。這時(shí)無(wú)論誰(shuí)用他掌握了多少種你不會(huì)的技能來(lái)嚇唬你都沒(méi)用,你對(duì)他的層次只有蔑視。通過(guò) 幾年的學(xué)習(xí)和工作,要記住最重要的一點(diǎn),永遠(yuǎn)最重要:對(duì)自己學(xué)習(xí)IT知識(shí)能力的自信,一個(gè)程序員一生都要不停地進(jìn)行高強(qiáng)度的學(xué)習(xí),用心問(wèn)問(wèn)自己,有沒(méi)有這 個(gè)自信?別用虛榮心來(lái)騙自己哦,如果沒(méi)有的話,那就不必花費(fèi)你寶貴的時(shí)間向下看了,作者在此感謝你有耐心看到這里,現(xiàn)在建議你關(guān)閉這篇文章,趁著年輕,當(dāng) 機(jī)立斷轉(zhuǎn)行吧!
三、注重邏輯:成為一名職業(yè)程序員
好,再前進(jìn)一點(diǎn)點(diǎn),你就要成為一名職業(yè)程序員了,讓我們繼續(xù)來(lái)完成這個(gè)任務(wù)吧!我們?cè)谇耙还?jié)提到過(guò),“你發(fā)現(xiàn)一些個(gè)別的demo是極品,它所展現(xiàn)的 程序邏輯結(jié)構(gòu)是你設(shè)計(jì)不出來(lái)的,你現(xiàn)在有點(diǎn)更關(guān)心它的程序設(shè)計(jì)構(gòu)架,甚于對(duì)你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注”,其實(shí)你是在關(guān)注這個(gè)demo程序 作者的思維邏輯,所有程序的本質(zhì)就是邏輯。技術(shù)你已經(jīng)較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業(yè)程序員。打一個(gè)比方吧,你會(huì)十八般武 藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠(yuǎn)都上不了戰(zhàn)場(chǎng),這個(gè)力氣對(duì)程序員而言就是邏輯能力(其本質(zhì)是一個(gè)人的數(shù)學(xué)修養(yǎng),注意,不是數(shù)學(xué)知識(shí))。邏 輯能力也是逐步提高的,開(kāi)始時(shí)你一定是用直觀的邏輯能力來(lái)編程的,怎么想就怎么編,不對(duì)就再改,在改進(jìn)中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏 輯能力,這是很正常的。提前說(shuō)一句吧,到達(dá)邏輯能力的至高境界,其表現(xiàn)是用數(shù)學(xué)語(yǔ)言來(lái)描述問(wèn)題和問(wèn)題的解決辦法,高度抽象!好,說(shuō)回來(lái)吧,你要提高邏輯能 力,最快的辦法就是讀別人寫(xiě)的結(jié)構(gòu)優(yōu)秀的程序。優(yōu)秀的代碼是百讀不厭的(這句話是我抄來(lái)的),暫時(shí)放放對(duì)其中某種技術(shù)和技巧的關(guān)注吧,你要推導(dǎo)和學(xué)習(xí)的是 這些好程序的邏輯結(jié)構(gòu),它們是被精心設(shè)計(jì)出來(lái)的。你可以先捂住這個(gè)demo程序,自己設(shè)計(jì)一個(gè)功能相同的程序結(jié)構(gòu),然后比較一下demo的程序結(jié)構(gòu),如果 差距較大,那你就不應(yīng)簡(jiǎn)單地改進(jìn)一下,而是要把demo作者設(shè)計(jì)的過(guò)程在心里復(fù)原一遍,做到這一點(diǎn)也許有點(diǎn)困難,但這種事干的多了,你就會(huì)越干越快,越來(lái) 越得心應(yīng)手,你的邏輯能力飛速提升,你能看得上的邏輯結(jié)構(gòu)優(yōu)秀的程序開(kāi)始不多了,下一步就是練習(xí)。從工作中開(kāi)始吧,如果你有空閑,你需要做至少兩類(lèi)練習(xí),一類(lèi)是算法練習(xí),所有的經(jīng)典算法都是經(jīng)典的邏輯,題目有的是,像個(gè)好學(xué)生一樣吧,每年的國(guó)內(nèi)國(guó)際編程競(jìng)賽都有邏輯要求非常高的題,你可以只選一兩道難題來(lái) 做做。當(dāng)你可以把復(fù)雜的單遞歸程序(只有A調(diào)A)變成非遞歸程序時(shí),已經(jīng)不錯(cuò)了,如果你能看得懂雙遞歸程序(A調(diào)A、A調(diào)B、B調(diào)A、B調(diào)B都有),我為 你鼓掌!你不必往下看了,我有點(diǎn)不好意思啦――班門(mén)弄斧,你快滾蛋吧!另一類(lèi)是把以前和當(dāng)前你工作中你不滿意的程序推倒重新設(shè)計(jì)一遍,這非常重要,省時(shí)省 力,因?yàn)槟闶煜ば枨螅夹g(shù)上也沒(méi)問(wèn)題,目的就是改進(jìn)程序的邏輯結(jié)構(gòu),很劃算哦,唯一要克服的就是:你對(duì)推翻以前工作中那點(diǎn)小小成就的心理障礙,如果你真想 優(yōu)秀,說(shuō)句粗話:這點(diǎn)心理障礙算個(gè)屁,一遍遍反復(fù)地推倒已有的成果只能使自己快速進(jìn)步,放手干吧,沒(méi)什么好可惜的,馬恩早就在《共.產(chǎn).黨宣言》里說(shuō)過(guò) 了:在這個(gè)過(guò)程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來(lái)總結(jié)一下,經(jīng)過(guò)自我否定后,再生的你盡管對(duì)過(guò)去的“業(yè)績(jī)”還有一些眷戀,但已是一個(gè)初步具備職業(yè)水準(zhǔn)的程序員了,掌握了相應(yīng)的技術(shù)和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺(jué)地自我否定,不斷地追求更高水平的邏輯能力。
在這個(gè)過(guò)程中,如果你能注意以下一些小的方面,你前進(jìn)的步伐也許會(huì)快一些。
l從編譯原理的角度來(lái)理解你工作中使用的高級(jí)語(yǔ)言,如果你做到這一點(diǎn),至少有兩個(gè)好處,第一個(gè)好處是避免一大堆低水平重復(fù)出現(xiàn)的編譯錯(cuò)誤。一名優(yōu)秀的 Coder平均在一個(gè)工作日中應(yīng)該完成200行以上的源碼,其編譯錯(cuò)誤應(yīng)該控制在5個(gè)以下,要知道這200行源碼不是一次完成的,所以大多數(shù)情況下你都要 追求一次編譯通過(guò),而一名職業(yè)水準(zhǔn)的程序員,應(yīng)該進(jìn)一步做到即使用purify這類(lèi)的工具來(lái)檢查源碼,也不會(huì)存在嚴(yán)重的內(nèi)存泄露。第二個(gè)好處是可以提高源 碼的可讀性和效率。規(guī)范地編寫(xiě)你的代碼使你自己的邏輯清晰,因?yàn)槟忝靼锥嗉訋讉€(gè)括號(hào)和空行、多換行對(duì)齊、多注釋?zhuān)幾g器是會(huì)自動(dòng)識(shí)別的,不影響程序執(zhí)行的 效率,反過(guò)來(lái),控制好遞歸調(diào)用和循環(huán)內(nèi)的if語(yǔ)句才是提高程序效率的關(guān)鍵,要全力避免遞歸,但要深刻理解遞歸,能通過(guò)自己建立堆棧來(lái)把遞歸程序轉(zhuǎn)換成非遞 歸程序,要求還是較高的哦!
l避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會(huì)表現(xiàn)在你的程序邏輯中,有時(shí)你就是從這個(gè)慣性中跳不出來(lái)(誰(shuí)都有這個(gè)時(shí)候),但要心里有數(shù)才 行,所以你需要幫助,如果你有幾個(gè)水平相若或更高的職業(yè)伙伴,太好了,當(dāng)遇到花30分鐘還打不下的bug時(shí),就別浪費(fèi)時(shí)間了,找他們吧,最要緊的是能思路 清晰明確地表述你的問(wèn)題,通常你自己在這個(gè)過(guò)程中或者伙伴中就有人把問(wèn)題解決了,又快又好。另外,有幾個(gè)可以良性競(jìng)爭(zhēng)的職業(yè)伙伴是人生的一件幸 事,1+1>2,大家各有所長(zhǎng),你最好做到及時(shí)公開(kāi)你的成果,技不壓身嘛,IT發(fā)展的這么快,你再優(yōu)秀,那點(diǎn)東東也沒(méi)有什么值得隱藏的,所以你可以 技術(shù)或水平不夠高,但千萬(wàn)不可以讓真正具有職業(yè)水準(zhǔn)的選手鄙視你的職業(yè)品質(zhì)和行為。
l有自己debug的特點(diǎn),下面的說(shuō)法作者不敢太肯定,只是經(jīng)驗(yàn)之談。即使在VC這種高度完善的開(kāi)放環(huán)境下,你仍然應(yīng)該要求自己僅憑打印語(yǔ)句就能 debug。這也有兩點(diǎn)好處,第一個(gè)好處是,遇到bug你會(huì)認(rèn)真想問(wèn)題所在,而不是用debug工具一步步簡(jiǎn)單地追蹤卡在哪兒了,你定位bug范圍的方式 是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應(yīng)該先看到森林,再看到樹(shù)木。我反復(fù)提及: 程序就是邏輯過(guò)程,大多數(shù)程序從main函數(shù)開(kāi)始,是由數(shù)據(jù)結(jié)構(gòu)和功能子程序組成的一個(gè)樹(shù)形結(jié)構(gòu)的邏輯過(guò)程(要認(rèn)清即使是面向?qū)ο蟮某绦蛘Z(yǔ)言也是一樣 的),它的執(zhí)行過(guò)程是深度優(yōu)先的,但你定位bug應(yīng)該是廣度優(yōu)先的,好好想想這一點(diǎn),嗯?第二個(gè)好處是強(qiáng)迫你思考并記住而不是用工具看到調(diào)用過(guò)程,你大腦 的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來(lái)的,如果你的bug是程序結(jié)構(gòu)上的邏輯錯(cuò)誤引起的,這一點(diǎn)就非常重要了,順便說(shuō)一句,最難打的 bug就是程序邏輯結(jié)構(gòu)錯(cuò)誤導(dǎo)致的bug。你要是真正明明白白地認(rèn)識(shí)到這兒了,那我就沒(méi)什么東西可以告訴你了。總之,程序員的職業(yè)水準(zhǔn):生產(chǎn)效率和程序質(zhì) 量,主要是取決于源碼中bug的數(shù)量和debug的速度,而不是取決于編寫(xiě)源碼的速度。給你一個(gè)我自己定義的考查一個(gè)職業(yè)程序員的指標(biāo):一個(gè)合格水準(zhǔn)的職 業(yè)程序員,編程的時(shí)間如果算一份的話,其累計(jì)debug的時(shí)間不能超過(guò)一份,真正職業(yè)高手累計(jì)debug的時(shí)間應(yīng)該控制在0.5份以下,如何?你關(guān)上門(mén)悄 悄問(wèn)問(wèn)自己,你花費(fèi)在編程和debug上的時(shí)間比例是多少?如果你把程序員作為自己一生的職業(yè),那么就永遠(yuǎn)都要牢記一點(diǎn):追求做一個(gè)0 bug的優(yōu)秀程序員!這是任何一個(gè)想成為職業(yè)程序員的人的理想,請(qǐng)相信:堅(jiān)忍不拔地追求實(shí)現(xiàn)這個(gè)理想將讓你出類(lèi)拔萃!
l做好程序的單元測(cè)試,這是另一項(xiàng)考查你是否是一名具有合格職業(yè)水準(zhǔn)的程序員的一個(gè)必要指標(biāo)。其實(shí)在你拿到需求的時(shí)候就要準(zhǔn)備單元測(cè)試用例了,并且這些用例 將直接影響你的詳細(xì)設(shè)計(jì)(有關(guān)軟件設(shè)計(jì)本來(lái)是該放在第四節(jié)講的)。我們還是打比方吧,當(dāng)你拿到一個(gè)需求時(shí),除了分析它靜態(tài)的功能外,還應(yīng)明確它動(dòng)態(tài)的操作 /執(zhí)行過(guò)程,把這個(gè)動(dòng)態(tài)過(guò)程明確地用流程圖畫(huà)出來(lái),比如分為A~Z的26步,其中A又可以進(jìn)一步分解為A1~A5的5步,直到不能再分解為止。又比如說(shuō) A3步不可分解了,那么你應(yīng)該把A3步的正常操作和所有五花八門(mén)的異常操作都列出來(lái),確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要 寫(xiě)好多好多的測(cè)試用例,說(shuō)句老實(shí)話,我也從來(lái)不寫(xiě)!但我一般會(huì)列一個(gè)提綱,比如A3步有正常的操作a、b、c、d、e共5項(xiàng),異常的操作有f、g、h、i、j、k、l、m、n共9項(xiàng),你在進(jìn)行單元測(cè)試時(shí)都應(yīng)該跑一遍,這樣的程序都還不敢說(shuō)質(zhì)量如何好,但起碼可以說(shuō)較穩(wěn)定吧!如果要想在進(jìn)行單元測(cè)試時(shí)干得 快、效率高,那么在進(jìn)行詳細(xì)設(shè)計(jì)時(shí),你就應(yīng)該把A3步中對(duì)所有正常操作和異常操作的判斷都設(shè)計(jì)好,在編程實(shí)現(xiàn)A3步時(shí),使得程序的結(jié)構(gòu)合理高效,對(duì)不對(duì)? 所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設(shè)計(jì)、編程、測(cè)試等各個(gè)環(huán)節(jié),恐怕水平很有限喔!但如果你在分析需求時(shí)就能看到測(cè)試的問(wèn)題,并 改進(jìn)設(shè)計(jì)和實(shí)現(xiàn),為此做好相應(yīng)的準(zhǔn)備工作,嘿嘿,整個(gè)軟件開(kāi)發(fā)過(guò)程你的效率會(huì)高很多,通常你在一個(gè)開(kāi)發(fā)團(tuán)隊(duì)中就會(huì)高度自信的,你已越過(guò)當(dāng)一名偏頗、露骨的 高手的境界,成為一個(gè)平靜的高手,這可是The best in the best!,用周星星的話說(shuō):是高手之高高手,因?yàn)閯e人看不出你高在哪兒,沒(méi)見(jiàn)你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關(guān)于進(jìn)行單元 測(cè)試還有很多復(fù)雜的方法,在此本文只提到了最基本的一點(diǎn),目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒(méi)有人能替你吃飽飯!
l如果你是用C++編程,我再簡(jiǎn)單談?wù)動(dòng)嘘P(guān)內(nèi)層釋放的一個(gè)小技巧,就是對(duì)所有你編寫(xiě)的類(lèi),在構(gòu)造和析構(gòu)函數(shù)中加打印語(yǔ)句,統(tǒng)計(jì)每個(gè)類(lèi)在運(yùn)行程序時(shí)構(gòu)造和析構(gòu) 的地方,如果是配對(duì)的,那么起碼沒(méi)有對(duì)象類(lèi)一級(jí)的內(nèi)層在程序運(yùn)行結(jié)束時(shí)沒(méi)有釋放,然后你就可以把打印語(yǔ)句刪掉了,招數(shù)雖土,但管用!
l還有其它一些好習(xí)慣,在這里我隨筆寫(xiě)一些,你要是有不同看法也請(qǐng)一笑過(guò)之吧。編程時(shí)應(yīng)該對(duì)齊縮進(jìn),一個(gè)縮進(jìn)用一個(gè)tab鍵,一般是4個(gè)空格,嚴(yán)格遵守開(kāi)發(fā) 團(tuán)隊(duì)的編程規(guī)范也是非常重要的。一個(gè)子程序不應(yīng)超過(guò)30行(不算空行),其內(nèi)多重循環(huán)不應(yīng)超過(guò)3層,否則都應(yīng)該分裂成兩個(gè)子程序,個(gè)別算法程序可以長(zhǎng)一 些,但也不宜超過(guò)200行。通常一個(gè)類(lèi)的所有成員函數(shù)總和不宜超過(guò)1500行,多了就應(yīng)該考慮分解成兩個(gè)類(lèi)(這個(gè)工作最好在設(shè)計(jì)時(shí)就完成)。每完成一小段 程序,比如15~30行,就立即編譯運(yùn)行,不要假裝高手,先敲它一大堆程序,再編譯運(yùn)行,妄想一次成功,體驗(yàn)一種假爽的、虛榮的快感,或炫耀給別人看,這 么做只能證明自己是一個(gè)不折不扣的傻瓜,裝酷而已。因?yàn)橹灰幸淮尾怀晒Γ憔蜁?huì)花費(fèi)大量的時(shí)間來(lái)調(diào)程序,別人的進(jìn)度在這時(shí)就遠(yuǎn)遠(yuǎn)地超過(guò)你了,平常心是 道,還是修煉真功夫吧!孫子兵法里關(guān)于這一點(diǎn)有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實(shí)就是這樣總是一次就成功的天才,那你還看這 篇文章干什么呢?我又不是寫(xiě)給你們這些天才們看的。再就是有學(xué)會(huì)買(mǎi)好書(shū)、讀好書(shū),關(guān)于計(jì)算機(jī)和軟件方面的書(shū)太多了,時(shí)間有限,比如有一個(gè)叫侯捷的家伙,幾 乎寫(xiě)的每本書(shū)都不錯(cuò),張國(guó)峰的C++編程也不錯(cuò),這只是我的個(gè)人意見(jiàn)啊,好書(shū)多著呢,列出來(lái)比這篇文章長(zhǎng)好多倍,我就不多說(shuō)了。還有一招,要是你運(yùn)氣好,能搞到一些著名軟件系統(tǒng)的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統(tǒng)的一些源碼不錯(cuò),是開(kāi)放的,你可以合法地搞到,其它的不要說(shuō)是我建議你 侵犯知識(shí)版權(quán)啊!
四、天生神力:成為系統(tǒng)分析員
本來(lái)就論述如何成為一名職業(yè)程序員而言,本文已基本完成任務(wù)了,但《菜根譚》有言:竭世機(jī)樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫(xiě)算了。
你要是運(yùn)氣好,直接進(jìn)入了一個(gè)嚴(yán)格規(guī)范生產(chǎn)的軟件企業(yè)就業(yè),剛開(kāi)始就應(yīng)該是按別人做好的軟件設(shè)計(jì)來(lái)實(shí)現(xiàn)編程,你可以有機(jī)會(huì)直接學(xué)習(xí)軟件設(shè)計(jì),當(dāng)你積 累的足夠多了,能夠?qū)ζ渲械囊恍┰O(shè)計(jì)提出好的改進(jìn)建議,而且干得又快又好,就會(huì)漸漸地展露頭角,我相信你終有一天成為一名軟件設(shè)計(jì)人員(注意,不是軟件產(chǎn) 品設(shè)計(jì)人員),步入系統(tǒng)分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個(gè)不規(guī)范的軟件企業(yè)工作,那也不錯(cuò),你很可能直接就有機(jī)會(huì)進(jìn)行軟件設(shè) 計(jì),然后開(kāi)發(fā)、測(cè)試,甚至還不得不自己定義需求,把軟件開(kāi)發(fā)過(guò)程的各個(gè)環(huán)節(jié)走一個(gè)遍,當(dāng)然這樣對(duì)你的要求更高,而且你也不容易得到及時(shí)有益的指點(diǎn),在正態(tài) 分布的情況下,你應(yīng)該是成長(zhǎng)的很慢。但不管就業(yè)的單位如何,如果你決心要成為頂尖軟件職業(yè)選手,通常什么客觀困難都阻擋不了你,然而你個(gè)人的因素可能會(huì)阻 止你的前進(jìn)。下面提出的觀點(diǎn)純屬一己之見(jiàn),傷人自尊之處作者在此提前道歉,并建議你除非對(duì)本文有強(qiáng)烈的興趣,否則就請(qǐng)直接看第五節(jié)或放下別看了。丑話已說(shuō) 在前頭了,在各種軟件開(kāi)發(fā)組織的發(fā)展過(guò)程中的事實(shí)也證明,只有少數(shù)程序員能成為系統(tǒng)分析員,我想這一點(diǎn)不是我杜撰的吧,因此你要是在看接下來(lái)的部分時(shí)感到 氣憤難當(dāng),那也實(shí)在沒(méi)著,純屬活該,因?yàn)樽髡咧皇窃谡f(shuō)明自己的觀點(diǎn)而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒(méi)有任何理由可以罵人!
作者自己沒(méi)有到微軟面試過(guò),但身處軟件行業(yè),關(guān)于微軟的許多東東當(dāng)然還是有耳聞的,據(jù)說(shuō)微軟招聘一名程序員要過(guò)五個(gè)已經(jīng)成為微軟程序員的面試關(guān),而 且是一票否決制,又據(jù)說(shuō)大多數(shù)面試題并非編程,而是一些有關(guān)邏輯和智力的題,作者私下也做過(guò)許多流傳的微軟面試題,并對(duì)此做法深以為然。程序的本質(zhì)就是邏 輯,所以幾十年前就有人提出編程是一門(mén)藝術(shù),而藝術(shù)是要靠天份的,這一點(diǎn)少有人反對(duì)。一個(gè)人的邏輯能力可以不斷提高,但其能到達(dá)的終極邏輯能力的層次必定 為其天生智力所限制,這一點(diǎn)就讓人不易接受了。好笑啊!人們可以公開(kāi)承認(rèn)自己沒(méi)有某種或全部的藝術(shù)天份,但要說(shuō)自己邏輯天份不夠,換句話說(shuō)承認(rèn)自己笨、IQ不夠高,往往是要怒發(fā)沖冠的,其實(shí)這又有什么區(qū)別呢?話都說(shuō)到這兒了,再次建議你如果不夠自信,就跳過(guò)這一節(jié)吧,直接看第五節(jié),好嗎?
好了,把話題說(shuō)回來(lái),你已經(jīng)成為一門(mén)合格的職業(yè)程序員了,如果要想成為從事軟件系統(tǒng)設(shè)計(jì)的職業(yè)系統(tǒng)分析員,第一件事就是悄悄找一個(gè)標(biāo)準(zhǔn)智商測(cè)試的網(wǎng) 站或其它渠道,嚴(yán)格認(rèn)真的測(cè)一測(cè)自己的智商,如果IQ低于130(正常智商是110),就請(qǐng)別費(fèi)勁了,打消掉成為系統(tǒng)分析員的念頭吧!好!好!先請(qǐng)你冷靜一下,好好想想,其實(shí)微軟面試時(shí)就是在測(cè)你的智商和邏輯數(shù)學(xué)素質(zhì) 呢,這就是本節(jié)的標(biāo)題為“天生神力”的原因,因?yàn)樵O(shè)計(jì)就是從無(wú)到有地進(jìn)行創(chuàng)造,無(wú)論是軟件還是其它行業(yè)都一樣,可以有借鑒的,沒(méi)有現(xiàn)成的,設(shè)計(jì)就是創(chuàng)造!如果你IQ在130以上,又決心要當(dāng)一名職業(yè)軟件系統(tǒng)分析員,其實(shí)你不過(guò)是要準(zhǔn)備好吃更大的苦而已,有什么好虛榮的呢?
修煉還是從基本功開(kāi)始的,過(guò)程和成為一名職業(yè)程序員差不多。必須使用設(shè)計(jì)工具這一點(diǎn)是不用多說(shuō)的。在工作中,你基本上遇到的是兩類(lèi)方式的設(shè)計(jì),一個(gè) 是結(jié)構(gòu)化設(shè)計(jì),另一個(gè)是面向?qū)ο笤O(shè)計(jì),就個(gè)人經(jīng)驗(yàn)而言,面向?qū)ο蟮脑O(shè)計(jì)更好。如果你工作中不得不采用結(jié)構(gòu)化的設(shè)計(jì),你必須熟練地掌握數(shù)據(jù)流圖和控制流圖的 分析和設(shè)計(jì),一般來(lái)講,如果你把一個(gè)軟件中用到的數(shù)據(jù)模型設(shè)計(jì)好了,針對(duì)功能化的流程,不難設(shè)計(jì)出數(shù)據(jù)流圖,但下一步設(shè)計(jì)控制流圖才是挑戰(zhàn),如果你按照需 求走不通設(shè)計(jì)好的控制
流圖,那么你或別人在按照這個(gè)設(shè)計(jì)編程實(shí)現(xiàn)時(shí),必定也走不通,沒(méi)有奇跡會(huì)發(fā)生,還是在設(shè)計(jì)階段嚴(yán)格要求吧,又有一點(diǎn)需要牢記:返工是 最慢的。當(dāng)你在進(jìn)行控制流圖的設(shè)計(jì)時(shí),也不要妄想得到需求人員提供給你明確的指點(diǎn),通常他們要是能夠把需求的功能和操作次序?qū)懲暾脑挘銘?yīng)該就感恩戴德 了,從需求中整理出功能、操作的拓?fù)浯涡蚝蜅l件是你作為系統(tǒng)分析員的職責(zé)。看看,要是沒(méi)有一點(diǎn)圖論的基礎(chǔ)和拓?fù)鋵W(xué)的入門(mén)知識(shí),你是當(dāng)不好一個(gè)職業(yè)系統(tǒng)分析 員的,即使你天賦不錯(cuò),必要的數(shù)學(xué)和邏輯素質(zhì)仍然不可或缺。也不用氣餒,永遠(yuǎn)沒(méi)有最好的設(shè)計(jì),只有更好的設(shè)計(jì),反復(fù)地進(jìn)行設(shè)計(jì)迭代,勇于推翻舊的設(shè)計(jì),你 將快速進(jìn)步。如果你在工作中是采用面向?qū)ο筮M(jìn)行設(shè)計(jì)的,那就更有利了,有關(guān)面向?qū)ο笤O(shè)計(jì)的書(shū)太多了,不用作者在此多費(fèi)口舌,建議精讀一本經(jīng)典的書(shū),比如北 大邵維忠等編譯的《面向?qū)ο蟮姆治觥罚行┓椒ê图记煽赡苓^(guò)時(shí),但其邏輯的基本原理是非常正確的,其本質(zhì)是,你在邏輯上是如何認(rèn)識(shí)這個(gè)世界的,你就是如何 設(shè)計(jì)軟件體系結(jié)構(gòu)的,然后讀讀其它書(shū),觸類(lèi)旁通,自己創(chuàng)造機(jī)會(huì)多實(shí)踐,成功自然會(huì)到來(lái)的,總之,不管是結(jié)構(gòu)化設(shè)計(jì)還是面向?qū)ο笤O(shè)計(jì),評(píng)價(jià)一下自己的軟件系 統(tǒng)設(shè)計(jì)方案吧,有好多指標(biāo)呢,比如是否均勻和平衡?局部獨(dú)立性強(qiáng)不強(qiáng)?有沒(méi)有歧異的結(jié)構(gòu)?有沒(méi)有層次太多或太少?有沒(méi)有某個(gè)層次太大、太廣?是不是邏輯結(jié) 構(gòu)先復(fù)雜了再化簡(jiǎn)的?還是只會(huì)設(shè)計(jì)簡(jiǎn)單的,復(fù)雜不起來(lái)(這一點(diǎn)是笨哦,如果出現(xiàn)多次,請(qǐng)你不要意氣用事,轉(zhuǎn)行吧)?最重要的一點(diǎn),是否容易理解、實(shí)現(xiàn)和改 進(jìn)?你自己會(huì)得出評(píng)價(jià)的。如果有機(jī)會(huì)看到別人的設(shè)計(jì),一定不要錯(cuò)過(guò)學(xué)習(xí)的機(jī)會(huì),自己推導(dǎo)一遍,認(rèn)真比較比較,獲益會(huì)較多。
走到這一步,你就應(yīng)該關(guān)注設(shè)計(jì)模式了,首先還是學(xué)習(xí),這方面的好書(shū)有的是,但一般在工作中用到的設(shè)計(jì)模式較為單一,應(yīng)該多嘗試一下其它的設(shè)計(jì)模式。其次必須要明白設(shè)計(jì)模式不是設(shè)計(jì)思路,也不能代替設(shè)計(jì)思路,比方你要從A到B修一條路,設(shè)計(jì)模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通 的,但線路必須你自己定,而線路就是設(shè)計(jì)思路,模式對(duì)思路是有影響,但不能代替,所以如果你的智商高達(dá)250,我相信你直接用匯編語(yǔ)言也能寫(xiě)出面向?qū)ο蟮?程序來(lái)。第三在此有一個(gè)陷阱,很多系統(tǒng)分析員生搬硬套設(shè)計(jì)模式,全然不懂如何融會(huì)貫通,在你的一項(xiàng)具體工作中,往往是以一種設(shè)計(jì)模式為主,其它模式為輔 的,思維不拘泥于形式才是關(guān)鍵,而且也為你到達(dá)更高的軟件設(shè)計(jì)的境界做好準(zhǔn)備。
唉!都不知該怎么向下寫(xiě)好了,因?yàn)橐堰_(dá)到作者水平的極限了,我胡亂說(shuō)一點(diǎn),你湊合看吧。軟件設(shè)計(jì)最終的層次是:以無(wú)法為有法、以無(wú)限為有限,這句話 是李小龍說(shuō)的,不是我說(shuō)的。再拾人牙慧一把,類(lèi)比一個(gè)故事吧,金大俠在《倚天屠龍記》里講到張無(wú)忌初學(xué)太極,學(xué)會(huì)的標(biāo)志是把剛學(xué)的招數(shù)全忘了,記住的是太 極的道理和精神,和李小龍有些相似喔,軟件設(shè)計(jì)也一樣,忘記所有的設(shè)計(jì)模式,隨心所欲進(jìn)行設(shè)計(jì)才是至高境界,所以你能到達(dá)多高的軟件設(shè)計(jì)的境界最終將取決 于你的哲學(xué)素質(zhì),這一點(diǎn)實(shí)在是不好寫(xiě)啊,你自己領(lǐng)悟吧!作者只有祝福了!
五、職業(yè)人的終極目標(biāo):全面修煉,成為L(zhǎng)eader
這一節(jié)更不好寫(xiě),涉及到太多其它非技術(shù)方面的因素,特別是個(gè)人人生觀和世界觀的修煉,如果本帖的點(diǎn)擊率超過(guò)作者私下期望的一個(gè)數(shù)值,那我就爭(zhēng)取盡力 厚著臉皮再補(bǔ)上吧。我只說(shuō)一句,雖然大家都知道軟件開(kāi)發(fā)是一個(gè)團(tuán)隊(duì)性的工作,但追求參與一個(gè)大型軟件系統(tǒng)的成功開(kāi)發(fā),是一名軟件人員的本能,就像拿破侖說(shuō) 的不想當(dāng)元帥的士兵不是好士兵,所以不追求實(shí)現(xiàn)大系統(tǒng)的軟件人員,也不是一個(gè)好的職業(yè)軟件人員,但你只有成為L(zhǎng)eader,領(lǐng)導(dǎo)一個(gè)優(yōu)秀的軟件開(kāi)發(fā)團(tuán)隊(duì),才有機(jī)會(huì)實(shí)現(xiàn)這個(gè)終極職業(yè)目標(biāo),對(duì)不對(duì)?
好吧,不管你現(xiàn)在的感受如何,我都謝謝你能讀到這里!我不習(xí)慣假歉虛,就不說(shuō)什么作者水平有限,本文拋磚引玉,歡迎大家批評(píng)斧正之類(lèi)的客套話了,雖 然作者水平確實(shí)有限。所以我認(rèn)為你盡管有權(quán)砸磚,但實(shí)在沒(méi)必要搞回帖、或回罵、或頂之類(lèi)的玩意兒,我只是盡興寫(xiě)一點(diǎn)多年從事軟件開(kāi)發(fā)工作的體驗(yàn),因此接下 來(lái)我就高掛免戰(zhàn)牌,不回復(fù)任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對(duì)你有所裨益,祝你成功!再見(jiàn)!
第二篇:程序員修煉 收藏
程序員修煉 收藏
程序就是一系列按步驟進(jìn)行的操作序列,它有好多種級(jí)別,比如最低級(jí)的微程序、次低級(jí)的匯編程序、高級(jí)的各種編程語(yǔ)言程序、最高級(jí)的腳本語(yǔ)言程序,也許我列的不對(duì),但沒(méi)關(guān)系,我要說(shuō)的是不管是那個(gè)級(jí)別的程序,其本質(zhì)都是操作的邏輯序列。大多數(shù)系統(tǒng)和應(yīng)用程序都是建立在高級(jí)編程語(yǔ)言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就讓我們只關(guān)注這一級(jí)的編程能力吧。因此如果一個(gè)程序員的邏輯能力不高,他永遠(yuǎn)都不能成為一名具有合格職業(yè)水準(zhǔn)的程序員,我們?cè)谙旅娴挠懻撚嘘P(guān)編程能力的方方面面,最終都是為了最大程度地提高和實(shí)現(xiàn)一名程序員的邏輯能力。
一、掌握基礎(chǔ)知識(shí):十六年寒窗的持續(xù)積累
從7歲讀小學(xué)起,經(jīng)過(guò)16年的學(xué)習(xí),你從軟件專(zhuān)業(yè)本科畢業(yè)后,必須完成以下幾門(mén)專(zhuān)業(yè)課程的學(xué)習(xí):計(jì)算機(jī)組成、操作系統(tǒng)原理、匯編語(yǔ)言、數(shù)據(jù)結(jié)構(gòu)、編譯原理、數(shù)據(jù)庫(kù)原理、軟件工程、結(jié)構(gòu)性設(shè)計(jì)語(yǔ)言(PASCAL、C)、面向?qū)ο笤O(shè)計(jì)語(yǔ)言(C++、C#)、計(jì)算機(jī)網(wǎng)絡(luò)等,你最好還懂一些算法分析、分布式系統(tǒng)、計(jì)算機(jī)圖形學(xué)、形式邏輯、人工智能原理、軟件設(shè)計(jì)模式、軟件構(gòu)架/框架等研究生的課程,16年來(lái),你積累的除了知識(shí),更重要的是形成最適合自己的學(xué)習(xí)方法和工作方法。這些是你具備程序員職業(yè)水準(zhǔn)的基礎(chǔ)能力,不要受什么計(jì)算機(jī)軟件怪杰之類(lèi)傳奇的影響,那不過(guò)是小概率事件,而且這些怪杰們就算沒(méi)有讀過(guò)軟件本科和研究生,也往往自學(xué)了大多數(shù)專(zhuān)業(yè)課程,很可能比在校學(xué)習(xí)的學(xué)生對(duì)這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現(xiàn)在你只需要問(wèn)問(wèn)自己,那些課程和知識(shí)都學(xué)會(huì)并掌握了嗎?如果是,那就準(zhǔn)備好進(jìn)行實(shí)踐了。
二、在實(shí)踐中提高:成為一名高水平的Coder
好了,你畢業(yè)了,在校功課都不錯(cuò),也找了一個(gè)專(zhuān)業(yè)對(duì)口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說(shuō)來(lái)看看。
通常,你在工作中都會(huì)用到某一種單位/公司固定的操作系統(tǒng)和編程語(yǔ)言開(kāi)發(fā)環(huán)境,比如Windows、UNIX、LINUX等操作系統(tǒng),又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語(yǔ)言和開(kāi)發(fā)環(huán)境,我們?cè)诤竺姘阉鼈兒戏Q(chēng)為開(kāi)發(fā)環(huán)境。就在校學(xué)習(xí)的有關(guān)開(kāi)發(fā)環(huán)境的知識(shí)而言,大概你距工作需要的差距是不小的,當(dāng)某個(gè)操作系統(tǒng)和編程語(yǔ)言環(huán)境成為你的飯碗時(shí),就不應(yīng)也不能用通過(guò)課程/認(rèn)證考試之類(lèi)的眼光和要求來(lái)評(píng)價(jià)你的能力,即使你能考100分。你需要深入地學(xué)習(xí)該操作系統(tǒng)和編程語(yǔ)言環(huán)境的各類(lèi)開(kāi)發(fā)手冊(cè)的所有內(nèi)容,你會(huì)說(shuō)大多數(shù)你都用不上,其實(shí)你既對(duì)又不對(duì),對(duì)的是單從使用的角度而言,你確實(shí)用不上開(kāi)發(fā)手冊(cè)的大多數(shù)內(nèi)容,比如龐大的VC開(kāi)發(fā)類(lèi)庫(kù)和復(fù)雜的開(kāi)發(fā)環(huán)境,你在實(shí)際工作中能用到的不到總數(shù)的1/10或1/5,不對(duì)的地方在于,你用到的部分不是孤立存在的,它們是整個(gè)體系中的一部分,只有對(duì)整個(gè)體系有了一個(gè)較完整的了解,才能得心應(yīng)手、隨心所欲地用好你用到的部分,你才算初步具備在這種開(kāi)發(fā)環(huán)境下進(jìn)行Coding的職業(yè)水準(zhǔn)(還遠(yuǎn)不夠程序員的職業(yè)水準(zhǔn)呢),而這只是剛開(kāi)始。如何才能真正掌握一種開(kāi)發(fā)環(huán)境的全面的知識(shí)呢,最原始的辦法就是讀開(kāi)發(fā)指南/教程、參考手冊(cè),一般來(lái)講,學(xué)習(xí)開(kāi)發(fā)指南/教程時(shí),你如果是一個(gè)認(rèn)真的人,都會(huì)完成5/10~7/10左右內(nèi)容的學(xué)習(xí)和練習(xí),如果你想成為職業(yè)選手,就應(yīng)該完成9/10以上內(nèi)容的學(xué)習(xí)和練習(xí)。參考手冊(cè)不同,大多數(shù)所謂的“程序員”們只是用到了才翻翻,這差的太遠(yuǎn)了,你應(yīng)該象讀開(kāi)發(fā)指南/教程一樣,每個(gè)環(huán)節(jié)都要讀,比如VC,參考手冊(cè)中的每個(gè)類(lèi),類(lèi)的每個(gè)函數(shù),都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開(kāi)始時(shí)讀得你毫無(wú)頭緒、心煩意亂,不要緊,還有一手呢,如果你開(kāi)發(fā)環(huán)境安裝的全面,它們往往都有開(kāi)發(fā)商做的demo例子可看,你就進(jìn)入另一個(gè)境界了,開(kāi)始時(shí)你關(guān)注demo中的具體技術(shù),后來(lái)你發(fā)現(xiàn)這些demo的程序?qū)懙亩歼€算不錯(cuò),結(jié)構(gòu)簡(jiǎn)單但合理,如果你真的用心,就一定能發(fā)現(xiàn)一些個(gè)別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計(jì)不出來(lái)的,你現(xiàn)在有點(diǎn)更關(guān)心它的程序設(shè)計(jì)構(gòu)架,甚于對(duì)你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注,這時(shí)的你,開(kāi)始了從一名Coder向一名Programmer的轉(zhuǎn)變,你會(huì)忍不住要看看開(kāi)發(fā)商提供的源程序,比如.h和.cpp,通常你會(huì)找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊(cè)中都沒(méi)提到,你要學(xué)的太多了,沒(méi)時(shí)間顧及其它的業(yè)余愛(ài)好了,現(xiàn)在知道為什么程序員是年輕人的職業(yè)了吧,你要有足夠多的時(shí)間才行,即使你的智商有160。如果你走到這一步,在你工作的團(tuán)隊(duì)中,已經(jīng)是經(jīng)常有人向你請(qǐng)教技術(shù)問(wèn)題,經(jīng)常有人請(qǐng)求你幫忙debug,你已是公認(rèn)的“高手”了,別得意,因?yàn)槟闳匀皇莻€(gè)Coder,為什么這么說(shuō)呢,你想想,你已深入了解了這個(gè)開(kāi)發(fā)環(huán)境中的各種技能,知道一名Coder如何用好這些東西,可是你能設(shè)計(jì)的出提供給Coder們用的東西嗎?唔??,你想了想,可能還不太行。對(duì)了,就是這樣,你還是一名小我境界的程序員呢,本質(zhì)是個(gè)Coder,當(dāng)然已是一名高水平的Coder了,然而你需要進(jìn)一步登堂入室才能成為一名真正的程序員。
讓我們繼續(xù)吧,通常你都是從精通一種編程環(huán)境開(kāi)始的,假設(shè)你已經(jīng)較為精通在Windows下用VC開(kāi)發(fā)軟件了,這時(shí)在技術(shù)和技巧方面你將面臨一小一大兩個(gè)挑戰(zhàn),第一個(gè)小挑戰(zhàn)是如果公司/單位改換了開(kāi)發(fā)環(huán)境,比如用LINUX下的QT交互語(yǔ)言工具進(jìn)行開(kāi)發(fā),你不過(guò)是把前面掌握VC的過(guò)程再來(lái)一遍,由于在主觀上經(jīng)歷了VC工具的學(xué)習(xí)過(guò)程,在客觀上各種開(kāi)發(fā)環(huán)境都有太多相似的方面,這回你掌握的應(yīng)該較快。要小心,在這時(shí)第一次誘惑之門(mén)打開(kāi)了,因?yàn)槟愀杏X(jué)良好,看!這回這么快,我就這么好地掌握了新的開(kāi)發(fā)環(huán)境,你開(kāi)始關(guān)注其它暫時(shí)還用不到的同類(lèi)環(huán)境,比如VB、Delph、JAVA,如饑似渴地掌握各種開(kāi)發(fā)工具,證明自己的學(xué)習(xí)能力和價(jià)值,但你忘了一點(diǎn),你仍然是個(gè)Coder,只不過(guò)是一個(gè)在好多開(kāi)發(fā)環(huán)境下都能編程的Coder,就像你生活在中國(guó),因而精通了漢語(yǔ),工作需要你又掌握了英語(yǔ),然后你就來(lái)了勁,把俄語(yǔ)、日語(yǔ)、阿拉伯語(yǔ)、拉丁語(yǔ),等等等等,都學(xué)習(xí)個(gè)遍,我只能說(shuō),有點(diǎn)BT。你忘了自己是個(gè)職業(yè)人,同一類(lèi)的東西工作中用得到才需學(xué)習(xí),太多太多的Coder們喜歡在一起比較和炫耀自己會(huì)掌握了幾種開(kāi)發(fā)工具,不信你看看招聘時(shí)的求職書(shū)就知道了,sigh!他們中絕大多數(shù)人永遠(yuǎn)都只能停留在這個(gè)層次上,心浮氣躁,一生都再也當(dāng)不成真正的程序員了。總結(jié)一下,其實(shí)你在這時(shí)需要的是對(duì)自己掌握新開(kāi)發(fā)環(huán)境的能力的自信,而不是一遍遍地重復(fù)來(lái)證明自己。第二個(gè)大挑戰(zhàn)就是你明白了只掌握VC是不夠的,你發(fā)現(xiàn)自己有點(diǎn)淺薄,有很多東東你會(huì)用但你不太懂,很多方面支持VC編程的知識(shí)你都沒(méi)掌握,比如操作系統(tǒng)的源碼、網(wǎng)絡(luò)協(xié)議知識(shí)、Windows 的注冊(cè)表、進(jìn)程和線程的基礎(chǔ)知識(shí)、硬件驅(qū)動(dòng)方面的知識(shí)、ActiveX、Windows 龐大的 API,又是一個(gè)等等等等,這些基礎(chǔ)知識(shí)的學(xué)習(xí)和掌握可是要花費(fèi)大量時(shí)間的,你再一次深切地感到時(shí)間太不夠用了,因?yàn)檫@時(shí)的你大概有許多俗務(wù)纏身了,所以有點(diǎn)沮喪,還不用提IT業(yè)每天不知有多少新東西在發(fā)布,KAO,永遠(yuǎn)都跟不上,越拉越遠(yuǎn)了。哎!別氣餒,振作一點(diǎn),你還是忘記了自己是個(gè)職業(yè)人,既然好多東東在工作中你永遠(yuǎn)都沒(méi)機(jī)會(huì)用,那么干嘛要學(xué)呢?用什么才學(xué)什么,最多預(yù)測(cè)到馬上要用什么,先一步學(xué)什么好了,要知道沒(méi)有人是真正的、無(wú)所不精的全科大夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個(gè)人嘛。
OK,一般工作后三五年,你經(jīng)歷了上述過(guò)程,經(jīng)受了誘惑和考驗(yàn),終于明白了一個(gè)道理:你要的是強(qiáng)勁的學(xué)習(xí)知識(shí)的能力,是對(duì)某種軟件知識(shí)/技能的有深度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類(lèi)和數(shù)量。這時(shí)無(wú)論誰(shuí)用他掌握了多少種你不會(huì)的技能來(lái)嚇唬你都沒(méi)用,你對(duì)他的層次只有蔑視。通過(guò)幾年的學(xué)習(xí)和工作,要記住最重要的一點(diǎn),永遠(yuǎn)最重要:對(duì)自己學(xué)習(xí)IT知識(shí)能力的自信,一個(gè)程序員一生都要不停地進(jìn)行高強(qiáng)度的學(xué)習(xí),用心問(wèn)問(wèn)自己,有沒(méi)有這個(gè)自信?別用虛榮心來(lái)騙自己哦,如果沒(méi)有的話,那就不必花費(fèi)你寶貴的時(shí)間向下看了,作者在此感謝你有耐心看到這里,現(xiàn)在建議你關(guān)閉這篇文章,趁著年輕,當(dāng)機(jī)立斷轉(zhuǎn)行吧!
三、注重邏輯:成為一名職業(yè)程序員
好,再前進(jìn)一點(diǎn)點(diǎn),你就要成為一名職業(yè)程序員了,讓我們繼續(xù)來(lái)完成這個(gè)任務(wù)吧!我們?cè)谇耙还?jié)提到過(guò),“你發(fā)現(xiàn)一些個(gè)別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計(jì)不出來(lái)的,你現(xiàn)在有點(diǎn)更關(guān)心它的程序設(shè)計(jì)構(gòu)架,甚于對(duì)你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注”,其實(shí)你是在關(guān)注這個(gè)demo程序作者的思維邏輯,所有程序的本質(zhì)就是邏輯。技術(shù)你已經(jīng)較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業(yè)程序員。打一個(gè)比方吧,你會(huì)十八般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠(yuǎn)都上不了戰(zhàn)場(chǎng),這個(gè)力氣對(duì)程序員而言就是邏輯能力(其本質(zhì)是一個(gè)人的數(shù)學(xué)修養(yǎng),注意,不是數(shù)學(xué)知識(shí))。邏輯能力也是逐步提高的,開(kāi)始時(shí)你一定是用直觀的邏輯能力來(lái)編程的,怎么想就怎么編,不對(duì)就再改,在改進(jìn)中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏輯能力,這是很正常的。提前說(shuō)一句吧,到達(dá)邏輯能力的至高境界,其表現(xiàn)是用數(shù)學(xué)語(yǔ)言來(lái)描述問(wèn)題和問(wèn)題的解決辦法,高度抽象!好,說(shuō)回來(lái)吧,你要提高邏輯能力,最快的辦法就是讀別人寫(xiě)的結(jié)構(gòu)優(yōu)秀的程序。優(yōu)秀的代碼是百讀不厭的(這句話是我抄來(lái)的),暫時(shí)放放對(duì)其中某種技術(shù)和技巧的關(guān)注吧,你要推導(dǎo)和學(xué)習(xí)的是這些好程序的邏輯結(jié)構(gòu),它們是被精心設(shè)計(jì)出來(lái)的。你可以先捂住這個(gè)demo程序,自己設(shè)計(jì)一個(gè)功能相同的程序結(jié)構(gòu),然后比較一下demo的程序結(jié)構(gòu),如果差距較大,那你就不應(yīng)簡(jiǎn)單地改進(jìn)一下,而是要把demo作者設(shè)計(jì)的過(guò)程在心里復(fù)原一遍,做到這一點(diǎn)也許有點(diǎn)困難,但這種事干的多了,你就會(huì)越干越快,越來(lái)越得心應(yīng)手,你的邏輯能力飛速提升,你能看得上的邏輯結(jié)構(gòu)優(yōu)秀的程序開(kāi)始不多了,下一步就是練習(xí)。從工作中開(kāi)始吧,如果你有空閑,你需要做至少兩類(lèi)練習(xí),一類(lèi)是算法練習(xí),所有的經(jīng)典算法都是經(jīng)典的邏輯,題目有的是,像個(gè)好學(xué)生一樣吧,每年的國(guó)內(nèi)國(guó)際編程競(jìng)賽都有邏輯要求非常高的題,你可以只選一兩道難題來(lái)做做。當(dāng)你可以把復(fù)雜的單遞歸程序(只有A調(diào)A)變成非遞歸程序時(shí),已經(jīng)不錯(cuò)了,如果你能看得懂雙遞歸程序(A調(diào)A、A調(diào)B、B調(diào)A、B調(diào)B都有),我為你鼓掌!你不必往下看了,我有點(diǎn)不好意思啦――班門(mén)弄斧,你快滾蛋吧!另一類(lèi)是把以前和當(dāng)前你工作中你不滿意的程序推倒重新設(shè)計(jì)一遍,這非常重要,省時(shí)省力,因?yàn)槟闶煜ば枨螅夹g(shù)上也沒(méi)問(wèn)題,目的就是改進(jìn)程序的邏輯結(jié)構(gòu),很劃算哦,唯一要克服的就是:你對(duì)推翻以前工作中那點(diǎn)小小成就的心理障礙,如果你真想優(yōu)秀,說(shuō)句粗話:這點(diǎn)心理障礙算個(gè)屁,一遍遍反復(fù)地推倒已有的成果只能使自己快速進(jìn)步,放手干吧,沒(méi)什么好可惜的,馬恩早就在《共.產(chǎn).黨宣言》里說(shuō)過(guò)了:在這個(gè)過(guò)程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來(lái)總結(jié)一下,經(jīng)過(guò)自我否定后,再生的你盡管對(duì)過(guò)去的“業(yè)績(jī)”還有一些眷戀,但已是一個(gè)初步具備職業(yè)水準(zhǔn)的程序員了,掌握了相應(yīng)的技術(shù)和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺(jué)地自我否定,不斷地追求更高水平的邏輯能力。
在這個(gè)過(guò)程中,如果你能注意以下一些小的方面,你前進(jìn)的步伐也許會(huì)快一些。
l 從編譯原理的角度來(lái)理解你工作中使用的高級(jí)語(yǔ)言,如果你做到這一點(diǎn),至少有兩個(gè)好處,第一個(gè)好處是避免一大堆低水平重復(fù)出現(xiàn)的編譯錯(cuò)誤。一名優(yōu)秀的Coder平均在一個(gè)工作日中應(yīng)該完成200行以上的源碼,其編譯錯(cuò)誤應(yīng)該控制在5個(gè)以下,要知道這200行源碼不是一次完成的,所以大多數(shù)情況下你都要追求一次編譯通過(guò),而一名職業(yè)水準(zhǔn)的程序員,應(yīng)該進(jìn)一步做到即使用purify這類(lèi)的工具來(lái)檢查源碼,也不會(huì)存在嚴(yán)重的內(nèi)存泄露。第二個(gè)好處是可以提高源碼的可讀性和效率。規(guī)范地編寫(xiě)你的代碼使你自己的邏輯清晰,因?yàn)槟忝靼锥嗉訋讉€(gè)括號(hào)和空行、多換行對(duì)齊、多注釋?zhuān)幾g器是會(huì)自動(dòng)識(shí)別的,不影響程序執(zhí)行的效率,反過(guò)來(lái),控制好遞歸調(diào)用和循環(huán)內(nèi)的if語(yǔ)句才是提高程序效率的關(guān)鍵,要全力避免遞歸,但要深刻理解遞歸,能通過(guò)自己建立堆棧來(lái)把遞歸程序轉(zhuǎn)換成非遞歸程序,要求還是較高的哦!
l 避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會(huì)表現(xiàn)在你的程序邏輯中,有時(shí)你就是從這個(gè)慣性中跳不出來(lái)(誰(shuí)都有這個(gè)時(shí)候),但要心里有數(shù)才行,所以你需要幫助,如果你有幾個(gè)水平相若或更高的職業(yè)伙伴,太好了,當(dāng)遇到花30分鐘還打不下的bug時(shí),就別浪費(fèi)時(shí)間了,找他們吧,最要緊的是能思路清晰明確地表述你的問(wèn)題,通常你自己在這個(gè)過(guò)程中或者伙伴中就有人把問(wèn)題解決了,又快又好。另外,有幾個(gè)可以良性競(jìng)爭(zhēng)的職業(yè)伙伴是人生的一件幸事,1+1>2,大家各有所長(zhǎng),你最好做到及時(shí)公開(kāi)你的成果,技不壓身嘛,IT發(fā)展的這么快,你再優(yōu)秀,那點(diǎn)東東也沒(méi)有什么值得隱藏的,所以你可以技術(shù)或水平不夠高,但千萬(wàn)不可以讓真正具有職業(yè)水準(zhǔn)的選手鄙視你的職業(yè)品質(zhì)和行為。
l 有自己debug的特點(diǎn),下面的說(shuō)法作者不敢太肯定,只是經(jīng)驗(yàn)之談。即使在VC這種高度完善的開(kāi)放環(huán)境下,你仍然應(yīng)該要求自己僅憑打印語(yǔ)句就能debug。這也有兩點(diǎn)好處,第一個(gè)好處是,遇到bug你會(huì)認(rèn)真想問(wèn)題所在,而不是用debug工具一步步簡(jiǎn)單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應(yīng)該先看到森林,再看到樹(shù)木。我反復(fù)提及:程序就是邏輯過(guò)程,大多數(shù)程序從main函數(shù)開(kāi)始,是由數(shù)據(jù)結(jié)構(gòu)和功能子程序組成的一個(gè)樹(shù)形結(jié)構(gòu)的邏輯過(guò)程(要認(rèn)清即使是面向?qū)ο蟮某绦蛘Z(yǔ)言也是一樣的),它的執(zhí)行過(guò)程是深度優(yōu)先的,但你定位bug應(yīng)該是廣度優(yōu)先的,好好想想這一點(diǎn),嗯?第二個(gè)好處是強(qiáng)迫你思考并記住而不是用工具看到調(diào)用過(guò)程,你大腦的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來(lái)的,如果你的bug是程序結(jié)構(gòu)上的邏輯錯(cuò)誤引起的,這一點(diǎn)就非常重要了,順便說(shuō)一句,最難打的bug就是程序邏輯結(jié)構(gòu)錯(cuò)誤導(dǎo)致的bug。你要是真正明明白白地認(rèn)識(shí)到這兒了,那我就沒(méi)什么東西可以告訴你了。總之,程序員的職業(yè)水準(zhǔn):生產(chǎn)效率和程序質(zhì)量,主要是取決于源碼中bug的數(shù)量和debug的速度,而不是取決于編寫(xiě)源碼的速度。給你一個(gè)我自己定義的考查一個(gè)職業(yè)程序員的指標(biāo):一個(gè)合格水準(zhǔn)的職業(yè)程序員,編程的時(shí)間如果算一份的話,其累計(jì)debug的時(shí)間不能超過(guò)一份,真正職業(yè)高手累計(jì)debug的時(shí)間應(yīng)該控制在0.5份以下,如何?你關(guān)上門(mén)悄悄問(wèn)問(wèn)自己,你花費(fèi)在編程和debug上的時(shí)間比例是多少?如果你把程序員作為自己一生的職業(yè),那么就永遠(yuǎn)都要牢記一點(diǎn):追求做一個(gè)0 bug的優(yōu)秀程序員!這是任何一個(gè)想成為職業(yè)程序員的人的理想,請(qǐng)相信:堅(jiān)忍不拔地追求實(shí)現(xiàn)這個(gè)理想將讓你出類(lèi)拔萃!
l 做好程序的單元測(cè)試,這是另一項(xiàng)考查你是否是一名具有合格職業(yè)水準(zhǔn)的程序員的一個(gè)必要指標(biāo)。其實(shí)在你拿到需求的時(shí)候就要準(zhǔn)備單元測(cè)試用例了,并且這些用例將直接影響你的詳細(xì)設(shè)計(jì)(有關(guān)軟件設(shè)計(jì)本來(lái)是該放在第四節(jié)講的)。我們還是打比方吧,當(dāng)你拿到一個(gè)需求時(shí),除了分析它靜態(tài)的功能外,還應(yīng)明確它動(dòng)態(tài)的操作/執(zhí)行過(guò)程,把這個(gè)動(dòng)態(tài)過(guò)程明確地用流程圖畫(huà)出來(lái),比如分為A~Z的26步,其中A又可以進(jìn)一步分解為A1~A5的5步,直到不能再分解為止。又比如說(shuō)A3步不可分解了,那么你應(yīng)該把A3步的正常操作和所有五花八門(mén)的異常操作都列出來(lái),確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要寫(xiě)好多好多的測(cè)試用例,說(shuō)句老實(shí)話,我也從來(lái)不寫(xiě)!但我一般會(huì)列一個(gè)提綱,比如A3步有正常的操作a、b、c、d、e共5項(xiàng),異常的操作有f、g、h、i、j、k、l、m、n共9項(xiàng),你在進(jìn)行單元測(cè)試時(shí)都應(yīng)該跑一遍,這樣的程序都還不敢說(shuō)質(zhì)量如何好,但起碼可以說(shuō)較穩(wěn)定吧!如果要想在進(jìn)行單元測(cè)試時(shí)干得快、效率高,那么在進(jìn)行詳細(xì)設(shè)計(jì)時(shí),你就應(yīng)該把A3步中對(duì)所有正常操作和異常操作的判斷都設(shè)計(jì)好,在編程實(shí)現(xiàn)A3步時(shí),使得程序的結(jié)構(gòu)合理高效,對(duì)不對(duì)?所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設(shè)計(jì)、編程、測(cè)試等各個(gè)環(huán)節(jié),恐怕水平很有限喔!但如果你在分析需求時(shí)就能看到測(cè)試的問(wèn)題,并改進(jìn)設(shè)計(jì)和實(shí)現(xiàn),為此做好相應(yīng)的準(zhǔn)備工作,嘿嘿,整個(gè)軟件開(kāi)發(fā)過(guò)程你的效率會(huì)高很多,通常你在一個(gè)開(kāi)發(fā)團(tuán)隊(duì)中就會(huì)高度自信的,你已越過(guò)當(dāng)一名偏頗、露骨的高手的境界,成為一個(gè)平靜的高手,這可是The best in the best!,用周星星的話說(shuō):是高手之高高手,因?yàn)閯e人看不出你高在哪兒,沒(méi)見(jiàn)你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關(guān)于進(jìn)行單元測(cè)試還有很多復(fù)雜的方法,在此本文只提到了最基本的一點(diǎn),目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒(méi)有人能替你吃飽飯!
l 如果你是用C++編程,我再簡(jiǎn)單談?wù)動(dòng)嘘P(guān)內(nèi)層釋放的一個(gè)小技巧,就是對(duì)所有你編寫(xiě)的類(lèi),在構(gòu)造和析構(gòu)函數(shù)中加打印語(yǔ)句,統(tǒng)計(jì)每個(gè)類(lèi)在運(yùn)行程序時(shí)構(gòu)造和析構(gòu)的地方,如果是配對(duì)的,那么起碼沒(méi)有對(duì)象類(lèi)一級(jí)的內(nèi)層在程序運(yùn)行結(jié)束時(shí)沒(méi)有釋放,然后你就可以把打印語(yǔ)句刪掉了,招數(shù)雖土,但管用!
l 還有其它一些好習(xí)慣,在這里我隨筆寫(xiě)一些,你要是有不同看法也請(qǐng)一笑過(guò)之吧。編程時(shí)應(yīng)該對(duì)齊縮進(jìn),一個(gè)縮進(jìn)用一個(gè)tab鍵,一般是4個(gè)空格,嚴(yán)格遵守開(kāi)發(fā)團(tuán)隊(duì)的編程規(guī)范也是非常重要的。一個(gè)子程序不應(yīng)超過(guò)30行(不算空行),其內(nèi)多重循環(huán)不應(yīng)超過(guò)3層,否則都應(yīng)該分裂成兩個(gè)子程序,個(gè)別算法程序可以長(zhǎng)一些,但也不宜超過(guò)200行。通常一個(gè)類(lèi)的所有成員函數(shù)總和不宜超過(guò)1500行,多了就應(yīng)該考慮分解成兩個(gè)類(lèi)(這個(gè)工作最好在設(shè)計(jì)時(shí)就完成)。每完成一小段程序,比如15~30行,就立即編譯運(yùn)行,不要假裝高手,先敲它一大堆程序,再編譯運(yùn)行,妄想一次成功,體驗(yàn)一種假爽的、虛榮的快感,或炫耀給別人看,這么做只能證明自己是一個(gè)不折不扣的傻瓜,裝酷而已。因?yàn)橹灰幸淮尾怀晒Γ憔蜁?huì)花費(fèi)大量的時(shí)間來(lái)調(diào)程序,別人的進(jìn)度在這時(shí)就遠(yuǎn)遠(yuǎn)地超過(guò)你了,平常心是道,還是修煉真功夫吧!孫子兵法里關(guān)于這一點(diǎn)有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實(shí)就是這樣總是一次就成功的天才,那你還看這篇文章干什么呢?我又不是寫(xiě)給你們這些天才們看的。再就是有學(xué)會(huì)買(mǎi)好書(shū)、讀好書(shū),關(guān)于計(jì)算機(jī)和軟件方面的書(shū)太多了,時(shí)間有限,比如有一個(gè)叫侯捷的家伙,幾乎寫(xiě)的每本書(shū)都不錯(cuò),張國(guó)峰的C++編程也不錯(cuò),這只是我的個(gè)人意見(jiàn)啊,好書(shū)多著呢,列出來(lái)比這篇文章長(zhǎng)好多倍,我就不多說(shuō)了。還有一招,要是你運(yùn)氣好,能搞到一些著名軟件系統(tǒng)的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統(tǒng)的一些源碼不錯(cuò),是開(kāi)放的,你可以合法地搞到,其它的不要說(shuō)是我建議你侵犯知識(shí)版權(quán)啊!
四、天生神力:成為系統(tǒng)分析員
本來(lái)就論述如何成為一名職業(yè)程序員而言,本文已基本完成任務(wù)了,但《菜根譚》有言:竭世機(jī)樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫(xiě)算了。
你要是運(yùn)氣好,直接進(jìn)入了一個(gè)嚴(yán)格規(guī)范生產(chǎn)的軟件企業(yè)就業(yè),剛開(kāi)始就應(yīng)該是按別人做好的軟件設(shè)計(jì)來(lái)實(shí)現(xiàn)編程,你可以有機(jī)會(huì)直接學(xué)習(xí)軟件設(shè)計(jì),當(dāng)你積累的足夠多了,能夠?qū)ζ渲械囊恍┰O(shè)計(jì)提出好的改進(jìn)建議,而且干得又快又好,就會(huì)漸漸地展露頭角,我相信你終有一天成為一名軟件設(shè)計(jì)人員(注意,不是軟件產(chǎn)品設(shè)計(jì)人員),步入系統(tǒng)分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個(gè)不規(guī)范的軟件企業(yè)工作,那也不錯(cuò),你很可能直接就有機(jī)會(huì)進(jìn)行軟件設(shè)計(jì),然后開(kāi)發(fā)、測(cè)試,甚至還不得不自己定義需求,把軟件開(kāi)發(fā)過(guò)程的各個(gè)環(huán)節(jié)走一個(gè)遍,當(dāng)然這樣對(duì)你的要求更高,而且你也不容易得到及時(shí)有益的指點(diǎn),在正態(tài)分布的情況下,你應(yīng)該是成長(zhǎng)的很慢。但不管就業(yè)的單位如何,如果你決心要成為頂尖軟件職業(yè)選手,通常什么客觀困難都阻擋不了你,然而你個(gè)人的因素可能會(huì)阻止你的前進(jìn)。下面提出的觀點(diǎn)純屬一己之見(jiàn),傷人自尊之處作者在此提前道歉,并建議你除非對(duì)本文有強(qiáng)烈的興趣,否則就請(qǐng)直接看第五節(jié)或放下別看了。丑話已說(shuō)在前頭了,在各種軟件開(kāi)發(fā)組織的發(fā)展過(guò)程中的事實(shí)也證明,只有少數(shù)程序員能成為系統(tǒng)分析員,我想這一點(diǎn)不是我杜撰的吧,因此你要是在看接下來(lái)的部分時(shí)感到氣憤難當(dāng),那也實(shí)在沒(méi)著,純屬活該,因?yàn)樽髡咧皇窃谡f(shuō)明自己的觀點(diǎn)而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒(méi)有任何理由可以罵人!
作者自己沒(méi)有到微軟面試過(guò),但身處軟件行業(yè),關(guān)于微軟的許多東東當(dāng)然還是有耳聞的,據(jù)說(shuō)微軟招聘一名程序員要過(guò)五個(gè)已經(jīng)成為微軟程序員的面試關(guān),而且是一票否決制,又據(jù)說(shuō)大多數(shù)面試題并非編程,而是一些有關(guān)邏輯和智力的題,作者私下也做過(guò)許多流傳的微軟面試題,并對(duì)此做法深以為然。程序的本質(zhì)就是邏輯,所以幾十年前就有人提出編程是一門(mén)藝術(shù),而藝術(shù)是要靠天份的,這一點(diǎn)少有人反對(duì)。一個(gè)人的邏輯能力可以不斷提高,但其能到達(dá)的終極邏輯能力的層次必定為其天生智力所限制,這一點(diǎn)就讓人不易接受了。好笑啊!人們可以公開(kāi)承認(rèn)自己沒(méi)有某種或全部的藝術(shù)天份,但要說(shuō)自己邏輯天份不夠,換句話說(shuō)承認(rèn)自己笨、IQ不夠高,往往是要怒發(fā)沖冠的,其實(shí)這又有什么區(qū)別呢?話都說(shuō)到這兒了,再次建議你如果不夠自信,就跳過(guò)這一節(jié)吧,直接看第五節(jié),好嗎?
好了,把話題說(shuō)回來(lái),你已經(jīng)成為一門(mén)合格的職業(yè)程序員了,如果要想成為從事軟件系統(tǒng)設(shè)計(jì)的職業(yè)系統(tǒng)分析員,第一件事就是悄悄找一個(gè)標(biāo)準(zhǔn)智商測(cè)試的網(wǎng)站或其它渠道,嚴(yán)格認(rèn)真的測(cè)一測(cè)自己的智商,如果IQ低于130(正常智商是110),就請(qǐng)別費(fèi)勁了,打消掉成為系統(tǒng)分析員的念頭吧!好!好!先請(qǐng)你冷靜一下,好好想想,其實(shí)微軟面試時(shí)就是在測(cè)你的智商和邏輯數(shù)學(xué)素質(zhì)呢,這就是本節(jié)的標(biāo)題為“天生神力”的原因,因?yàn)樵O(shè)計(jì)就是從無(wú)到有地進(jìn)行創(chuàng)造,無(wú)論是軟件還是其它行業(yè)都一樣,可以有借鑒的,沒(méi)有現(xiàn)成的,設(shè)計(jì)就是創(chuàng)造!如果你IQ在130以上,又決心要當(dāng)一名職業(yè)軟件系統(tǒng)分析員,其實(shí)你不過(guò)是要準(zhǔn)備好吃更大的苦而已,有什么好虛榮的呢?
修煉還是從基本功開(kāi)始的,過(guò)程和成為一名職業(yè)程序員差不多。必須使用設(shè)計(jì)工具這一點(diǎn)是不用多說(shuō)的。在工作中,你基本上遇到的是兩類(lèi)方式的設(shè)計(jì),一個(gè)是結(jié)構(gòu)化設(shè)計(jì),另一個(gè)是面向?qū)ο笤O(shè)計(jì),就個(gè)人經(jīng)驗(yàn)而言,面向?qū)ο蟮脑O(shè)計(jì)更好。如果你工作中不得不采用結(jié)構(gòu)化的設(shè)計(jì),你必須熟練地掌握數(shù)據(jù)流圖和控制流圖的分析和設(shè)計(jì),一般來(lái)講,如果你把一個(gè)軟件中用到的數(shù)據(jù)模型設(shè)計(jì)好了,針對(duì)功能化的流程,不難設(shè)計(jì)出數(shù)據(jù)流圖,但下一步設(shè)計(jì)控制流圖才是挑戰(zhàn),如果你按照需求走不通設(shè)計(jì)好的控制流圖,那么你或別人在按照這個(gè)設(shè)計(jì)編程實(shí)現(xiàn)時(shí),必定也走不通,沒(méi)有奇跡會(huì)發(fā)生,還是在設(shè)計(jì)階段嚴(yán)格要求吧,又有一點(diǎn)需要牢記:返工是最慢的。當(dāng)你在進(jìn)行控制流圖的設(shè)計(jì)時(shí),也不要妄想得到需求人員提供給你明確的指點(diǎn),通常他們要是能夠把需求的功能和操作次序?qū)懲暾脑挘銘?yīng)該就感恩戴德了,從需求中整理出功能、操作的拓?fù)浯涡蚝蜅l件是你作為系統(tǒng)分析員的職責(zé)。看看,要是沒(méi)有一點(diǎn)圖論的基礎(chǔ)和拓?fù)鋵W(xué)的入門(mén)知識(shí),你是當(dāng)不好一個(gè)職業(yè)系統(tǒng)分析員的,即使你天賦不錯(cuò),必要的數(shù)學(xué)和邏輯素質(zhì)仍然不可或缺。也不用氣餒,永遠(yuǎn)沒(méi)有最好的設(shè)計(jì),只有更好的設(shè)計(jì),反復(fù)地進(jìn)行設(shè)計(jì)迭代,勇于推翻舊的設(shè)計(jì),你將快速進(jìn)步。如果你在工作中是采用面向?qū)ο筮M(jìn)行設(shè)計(jì)的,那就更有利了,有關(guān)面向?qū)ο笤O(shè)計(jì)的書(shū)太多了,不用作者在此多費(fèi)口舌,建議精讀一本經(jīng)典的書(shū),比如北大邵維忠等編譯的《面向?qū)ο蟮姆治觥罚行┓椒ê图记煽赡苓^(guò)時(shí),但其邏輯的基本原理是非常正確的,其本質(zhì)是,你在邏輯上是如何認(rèn)識(shí)這個(gè)世界的,你就是如何設(shè)計(jì)軟件體系結(jié)構(gòu)的,然后讀讀其它書(shū),觸類(lèi)旁通,自己創(chuàng)造機(jī)會(huì)多實(shí)踐,成功自然會(huì)到來(lái)的,總之,不管是結(jié)構(gòu)化設(shè)計(jì)還是面向?qū)ο笤O(shè)計(jì),評(píng)價(jià)一下自己的軟件系統(tǒng)設(shè)計(jì)方案吧,有好多指標(biāo)呢,比如是否均勻和平衡?局部獨(dú)立性強(qiáng)不強(qiáng)?有沒(méi)有歧異的結(jié)構(gòu)?有沒(méi)有層次太多或太少?有沒(méi)有某個(gè)層次太大、太廣?是不是邏輯結(jié)構(gòu)先復(fù)雜了再化簡(jiǎn)的?還是只會(huì)設(shè)計(jì)簡(jiǎn)單的,復(fù)雜不起來(lái)(這一點(diǎn)是笨哦,如果出現(xiàn)多次,請(qǐng)你不要意氣用事,轉(zhuǎn)行吧)?最重要的一點(diǎn),是否容易理解、實(shí)現(xiàn)和改進(jìn)?你自己會(huì)得出評(píng)價(jià)的。如果有機(jī)會(huì)看到別人的設(shè)計(jì),一定不要錯(cuò)過(guò)學(xué)習(xí)的機(jī)會(huì),自己推導(dǎo)一遍,認(rèn)真比較比較,獲益會(huì)較多。
走到這一步,你就應(yīng)該關(guān)注設(shè)計(jì)模式了,首先還是學(xué)習(xí),這方面的好書(shū)有的是,但一般在工作中用到的設(shè)計(jì)模式較為單一,應(yīng)該多嘗試一下其它的設(shè)計(jì)模式。其次必須要明白設(shè)計(jì)模式不是設(shè)計(jì)思路,也不能代替設(shè)計(jì)思路,比方你要從A到B修一條路,設(shè)計(jì)模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設(shè)計(jì)思路,模式對(duì)思路是有影響,但不能代替,所以如果你的智商高達(dá)250,我相信你直接用匯編語(yǔ)言也能寫(xiě)出面向?qū)ο蟮某绦騺?lái)。第三在此有一個(gè)陷阱,很多系統(tǒng)分析員生搬硬套設(shè)計(jì)模式,全然不懂如何融會(huì)貫通,在你的一項(xiàng)具體工作中,往往是以一種設(shè)計(jì)模式為主,其它模式為輔的,思維不拘泥于形式才是關(guān)鍵,而且也為你到達(dá)更高的軟件設(shè)計(jì)的境界做好準(zhǔn)備。
唉!都不知該怎么向下寫(xiě)好了,因?yàn)橐堰_(dá)到作者水平的極限了,我胡亂說(shuō)一點(diǎn),你湊合看吧。軟件設(shè)計(jì)最終的層次是:以無(wú)法為有法、以無(wú)限為有限,這句話是李小龍說(shuō)的,不是我說(shuō)的。再拾人牙慧一把,類(lèi)比一個(gè)故事吧,金大俠在《倚天屠龍記》里講到張無(wú)忌初學(xué)太極,學(xué)會(huì)的標(biāo)志是把剛學(xué)的招數(shù)全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟件設(shè)計(jì)也一樣,忘記所有的設(shè)計(jì)模式,隨心所欲進(jìn)行設(shè)計(jì)才是至高境界,所以你能到達(dá)多高的軟件設(shè)計(jì)的境界最終將取決于你的哲學(xué)素質(zhì),這一點(diǎn)實(shí)在是不好寫(xiě)啊,你自己領(lǐng)悟吧!作者只有祝福了!
五、職業(yè)人的終極目標(biāo):全面修煉,成為L(zhǎng)eader
這一節(jié)更不好寫(xiě),涉及到太多其它非技術(shù)方面的因素,特別是個(gè)人人生觀和世界觀的修煉,如果本帖的點(diǎn)擊率超過(guò)作者私下期望的一個(gè)數(shù)值,那我就爭(zhēng)取盡力厚著臉皮再補(bǔ)上吧。我只說(shuō)一句,雖然大家都知道軟件開(kāi)發(fā)是一個(gè)團(tuán)隊(duì)性的工作,但追求參與一個(gè)大型軟件系統(tǒng)的成功開(kāi)發(fā),是一名軟件人員的本能,就像拿破侖說(shuō)的不想當(dāng)元帥的士兵不是好士兵,所以不追求實(shí)現(xiàn)大系統(tǒng)的軟件人員,也不是一個(gè)好的職業(yè)軟件人員,但你只有成為L(zhǎng)eader,領(lǐng)導(dǎo)一個(gè)優(yōu)秀的軟件開(kāi)發(fā)團(tuán)隊(duì),才有機(jī)會(huì)實(shí)現(xiàn)這個(gè)終極職業(yè)目標(biāo),對(duì)不對(duì)? 好吧,不管你現(xiàn)在的感受如何,我都謝謝你能讀到這里!我不習(xí)慣假謙虛,就不說(shuō)什么作者水平有限,本文拋磚引玉,歡迎大家批評(píng)斧正之類(lèi)的客套話了,雖然作者水平確實(shí)有限。所以我認(rèn)為你盡管有權(quán)砸磚,但實(shí)在沒(méi)必要搞回帖、或回罵、或頂之類(lèi)的玩意兒,我只是盡興寫(xiě)一點(diǎn)多年從事軟件開(kāi)發(fā)工作的體驗(yàn),因此接下來(lái)我就高掛免戰(zhàn)牌,不回復(fù)任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對(duì)你有所裨益,祝你成功!再見(jiàn)!
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/carefree31441/archive/2008/07/10/2635287.aspx
第三篇:程序員內(nèi)功修煉篇
進(jìn)入專(zhuān)業(yè)的編程領(lǐng)域,算法、數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)模型、計(jì)算機(jī)原理等這樣的計(jì)算機(jī)科學(xué)專(zhuān)業(yè)需要學(xué)習(xí)的理論知識(shí)是必須要學(xué)習(xí)的。下面我們先來(lái)講述數(shù)據(jù)結(jié)構(gòu)和算法。
數(shù)據(jù)結(jié)構(gòu)和算法
算法是比較難學(xué)習(xí)的,而且學(xué)習(xí)“ 算法 ” 是需要智商的。數(shù)組、鏈表、哈希表、二叉樹(shù)、排序算法等一些基礎(chǔ)知識(shí),對(duì)大多數(shù)人來(lái)說(shuō)是沒(méi)什么問(wèn)題的。但是一旦進(jìn)入到路徑規(guī)劃、背包問(wèn)題、字符串匹配、動(dòng)態(tài)規(guī)劃、遞歸遍歷等一些比較復(fù)雜的問(wèn)題上,就會(huì)讓很多人跟不上了,不但跟不上,而且還會(huì)非常痛苦。是的,解決算法問(wèn)題的確是可以區(qū)分人類(lèi)智商的一個(gè)比較好的方式,這也是為什么好些公司用算法題當(dāng)面試題來(lái)找到智商比較高的程序員。
然而,在很多時(shí)候,我們?cè)诠ぷ髦袇s發(fā)現(xiàn)根本用不到算法,或是一些基本的算法也沒(méi)有必要實(shí)現(xiàn),只需要使用一下第三方的庫(kù)就好了。于是,導(dǎo)致社會(huì)上出現(xiàn)很多 “ 算法無(wú)用論 ” 的聲音。
對(duì)此,我想說(shuō),算法真的很重要。我這 20 年的經(jīng)歷告訴我,無(wú)論是做業(yè)務(wù)還是做底層系統(tǒng),經(jīng)常需要使用算法處理各種各樣的問(wèn)題。比如,業(yè)務(wù)上我需要用算法比較兩個(gè)數(shù)組中差異的布隆過(guò)濾器,或是在做監(jiān)控系統(tǒng)時(shí)實(shí)時(shí)計(jì)算過(guò)去一分鐘的 P99 統(tǒng)計(jì)時(shí)的蓄水池算法,或是數(shù)據(jù)庫(kù)的 B+ 樹(shù)索引,還有 Linux 內(nèi)核中的 epoll 的紅黑樹(shù),還有在做服務(wù)調(diào)度里的 “ 背包問(wèn)題 ” 等都會(huì)用算法,真的是會(huì)本質(zhì)上幫助到你,也是會(huì)讓你非常有成就感的一件事。
雖然算法很難,需要智商,但我還是想鼓勵(lì)你,這其中是有很多的套路是可以學(xué)習(xí)的,一旦學(xué)會(huì)這些套路,你會(huì)受益無(wú)窮的。這里有幾本書(shū)著重推薦一下。
?
基礎(chǔ)知識(shí)。《算法》,是算法領(lǐng)域經(jīng)典的參考書(shū),不但全面介紹了關(guān)于算法和數(shù)據(jù)結(jié)構(gòu)的必備知識(shí),還給出了每位程序員應(yīng)知應(yīng)會(huì)的 50 個(gè)算法,并提供了實(shí)際代碼。最不錯(cuò)的是,其深入淺出的算法介紹,讓一些比較難的算法也變得容易理解,尤其是書(shū)中對(duì)紅黑樹(shù)的講解非常精彩。其中,還有大量的圖解,詳盡的代碼和講解,也許是最好的數(shù)據(jù)結(jié)構(gòu)入門(mén)圖書(shū)。不好的是不深,缺乏進(jìn)一步的算法設(shè)計(jì)內(nèi)容,甚至連動(dòng)態(tài)規(guī)劃都未提及。另外,如果你覺(jué)得算法書(shū)比較枯燥的話,你可以看看這本有趣的《算法圖解》。
?
?
理論加持。如果說(shuō)上面這本書(shū)偏于實(shí)踐和工程,而你看完后,對(duì)算法和數(shù)據(jù)結(jié)構(gòu)的興趣更濃了,那么你可以再看看另一本也是很經(jīng)典的偏于理論方面的書(shū)——《算法導(dǎo)論》。雖然其中的一些理論知識(shí)在《算法》那本書(shū)中也有提過(guò),但《算法導(dǎo)論》這本書(shū)更為專(zhuān)業(yè)一些,是美國(guó)計(jì)算機(jī)科學(xué)本科生的教科書(shū)。
?
?
思維改善。還有一本叫《編程珠璣》的書(shū),寫(xiě)這本書(shū)的人是世界著名計(jì)算機(jī)科學(xué)家喬恩·本特利(Jon Bentley),被譽(yù)為影響算法發(fā)展的十位大師之一。你可能不認(rèn)識(shí)這個(gè)人,但是你知道他的學(xué)生有多厲害嗎?我例舉幾個(gè),一個(gè)是 Tcl 語(yǔ)言設(shè)計(jì)者約翰·奧斯德奧特(John Ousterhout),另一個(gè)是 Java 語(yǔ)言設(shè)計(jì)者詹姆斯·高斯林(James Gosling),還有一個(gè)是《算法導(dǎo)論》作者之一查爾斯·雷斯?fàn)柹–harles Leiserson),還有好多好多。這本書(shū)也是很經(jīng)典的算法書(shū),其中都是一些非常實(shí)際的問(wèn)題,并以其獨(dú)有的洞察力和創(chuàng)造力,來(lái)引導(dǎo)讀者理解并學(xué)會(huì)解決這些問(wèn)題的方法,也是一本可以改善你思維方式的書(shū)。
?
然后,你需要去做一些題來(lái)訓(xùn)練一下自己的算法能力,這里就要推薦 LeetCode 這個(gè)網(wǎng)站了。它是一個(gè)很不錯(cuò)的做算法訓(xùn)練的地方。現(xiàn)在也越做越好了。基本上來(lái)說(shuō),這里會(huì)有兩類(lèi)題。
?
基礎(chǔ)算法題。其中有大量的算法題,解這些題都是有套路的,不是用遞歸(深度優(yōu)先 DFS,廣度優(yōu)先 BFS),就是要用動(dòng)態(tài)規(guī)劃(Dynamic Programming),或是折半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),還有大量的對(duì)樹(shù)、數(shù)組、鏈表、字符串和 hash 表的操作。通過(guò)做這些題能讓你對(duì)這些最基礎(chǔ)的算法的思路有非常扎實(shí)的了解和訓(xùn)練。對(duì)我而言,Dynamic Programming 是我的短板,尤其是一些比較復(fù)雜的問(wèn)題,在推導(dǎo)遞推公式上總是有思維的缺陷(數(shù)學(xué)是我的硬傷)。做了這些題后,我能感到我在動(dòng)態(tài)編程的思路上受到了很大的啟發(fā)。
?
?
編程題。比如:atoi,strstr,add two nums,括號(hào)匹配,字符串乘法,通配符匹配,文件路徑簡(jiǎn)化,Text Justification,反轉(zhuǎn)單詞等,這些題的 Edge Case 和 Corner Case 有很多。這些題需要你想清楚了再干,只要你稍有疏忽,就會(huì)有幾個(gè) case 讓你痛不欲生,而且一不小心就會(huì)讓你的代碼寫(xiě)得又臭又長(zhǎng),無(wú)法閱讀。通過(guò)做這些題,可以非常好地訓(xùn)練你對(duì)各種情況的考慮,以及你對(duì)程序代碼組織的掌控(其實(shí)就是其中的狀態(tài)變量)。
?
我覺(jué)得每個(gè)程序員都應(yīng)該花時(shí)間和精力做這些題,因?yàn)槟銜?huì)從這些題中得到很大的收益。我在 Leetcode 上做的一些題的代碼在這——我的 Github 上,可以給你一些參考。
如果能夠把這些算法能力都掌握了,那么你就有很大的概率可以很容易地通過(guò)這世界上最優(yōu)的公司的面試,比如:Google、Amazon、Facebook 之類(lèi)的公司。對(duì)你來(lái)說(shuō),如果能夠進(jìn)入到這些公司里工作,那么你未來(lái)的想像空間也會(huì)大得多得多。
最后,我們要知道這個(gè)世界上的數(shù)據(jù)結(jié)構(gòu)和算法很多很多,下面給出了兩個(gè)網(wǎng)站。
? List of Algorithms,這個(gè)網(wǎng)站羅列了非常多的算法,完全可以當(dāng)成一個(gè)算法字典,或是用來(lái)開(kāi)闊眼界。? 還有一個(gè)數(shù)據(jù)結(jié)構(gòu)動(dòng)畫(huà)圖的網(wǎng)站 Data Structure Visualizations。
其它理論基礎(chǔ)知識(shí)
下面這些書(shū),基本上是計(jì)算機(jī)科學(xué)系的大學(xué)教材。如果你想有科班出生的理論基礎(chǔ),那么這些書(shū)是必讀的。當(dāng)然,這些理論基礎(chǔ)知識(shí)比較枯燥,但我覺(jué)得如果你想成為專(zhuān)業(yè)的程序員,那么應(yīng)該要找時(shí)間讀一下。
?
《數(shù)據(jù)結(jié)構(gòu)與算法分析》,這本書(shū)曾被評(píng)為 20 世紀(jì)頂尖的 30 部計(jì)算機(jī)著作之一,作者 Mark Allen Weiss 在數(shù)據(jù)結(jié)構(gòu)和算法分析方面卓有建樹(shù),他在數(shù)據(jù)結(jié)構(gòu)和算法分析等方面的著作尤其暢銷(xiāo),并廣受好評(píng),已被世界 500 余所大學(xué)用作教材。
?
?
《數(shù)據(jù)庫(kù)系統(tǒng)概念》,它是數(shù)據(jù)庫(kù)系統(tǒng)方面的經(jīng)典教材之一。國(guó)際上許多著名大學(xué)包括斯坦福大學(xué)、耶魯大學(xué)、德克薩斯大學(xué)、康奈爾大學(xué)、伊利諾伊大學(xué)、印度理工學(xué)院等都采用本書(shū)作為教科書(shū)。這本書(shū)全面介紹了數(shù)據(jù)庫(kù)系統(tǒng)的各種知識(shí),透徹闡釋數(shù)據(jù)庫(kù)管理的基本概念。不僅討論了數(shù)據(jù)庫(kù)查詢語(yǔ)言、模式設(shè)計(jì)、數(shù)據(jù)倉(cāng)庫(kù)、數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)、基于對(duì)象的數(shù)據(jù)庫(kù)和 XML、數(shù)據(jù)存儲(chǔ)和查詢、事務(wù)管理、數(shù)據(jù)挖掘與信息檢索以及數(shù)據(jù)庫(kù)系統(tǒng)體系結(jié)構(gòu)等方面的內(nèi)容,而且對(duì)性能評(píng)測(cè)標(biāo)準(zhǔn)、性能調(diào)整、標(biāo)準(zhǔn)化以及空間與地理數(shù)據(jù)、事務(wù)處理監(jiān)控等高級(jí)應(yīng)用主題進(jìn)行了廣泛討論。
?
?
《現(xiàn)代操作系統(tǒng)》,這本書(shū)是操作系統(tǒng)領(lǐng)域的經(jīng)典之作,書(shū)中集中討論了操作系統(tǒng)的基本原理,包括進(jìn)程、線程、存儲(chǔ)管理、文件系統(tǒng)、輸入 / 輸出、死鎖等,同時(shí)還包含了有關(guān)計(jì)算機(jī)安全、多媒體操作系統(tǒng)、掌上計(jì)算機(jī)操作系統(tǒng)、微內(nèi)核、多核處理機(jī)上的虛擬機(jī)以及操作系統(tǒng)設(shè)計(jì)等方面的內(nèi)容。
?
? 《計(jì)算機(jī)網(wǎng)絡(luò)》,這本書(shū)采用了獨(dú)創(chuàng)的自頂向下方法,即從應(yīng)用層開(kāi)始沿協(xié)議棧向下講解計(jì)算機(jī)網(wǎng)絡(luò)的基本原理,強(qiáng)調(diào)應(yīng)用層范例和應(yīng)用編程接口,內(nèi)容深入淺出,注重教學(xué)方法,理論與實(shí)踐相結(jié)合。新版中還增加了無(wú)線和移動(dòng)網(wǎng)絡(luò)一章,并擴(kuò)充了對(duì)等網(wǎng)絡(luò)、BGP、MPLS、網(wǎng)絡(luò)安全、廣播選路和因特網(wǎng)編址及轉(zhuǎn)發(fā)方面的材料。是一本不可多得的教科書(shū)。
?
?
《計(jì)算機(jī)程序的構(gòu)造和解釋》,這本書(shū)也很經(jīng)典,是 MIT 的計(jì)算機(jī)科學(xué)系的教材。這本書(shū)中主要證實(shí)了很多程序是怎么構(gòu)造出來(lái)的,以及程序的本質(zhì)是什么。整本書(shū)主要是使用 Scheme/Lisp 語(yǔ)言,從數(shù)據(jù)抽象、過(guò)程抽象、迭代、高階函數(shù)等編程和控制系統(tǒng)復(fù)雜性的思想,到數(shù)據(jù)結(jié)構(gòu)和算法,到編譯器 / 解釋器、編程語(yǔ)言設(shè)計(jì)。
?
?
《編譯原理》,這本書(shū)又叫 “ 龍書(shū) ”,其全面、深入地探討了編譯器設(shè)計(jì)方面的重要主題,包括詞法分析、語(yǔ)法分析、語(yǔ)法制導(dǎo)定義和語(yǔ)法制導(dǎo)翻譯、運(yùn)行時(shí)刻環(huán)境、目標(biāo)代碼生成、代碼優(yōu)化技術(shù)、并行性檢測(cè)以及過(guò)程間分析技術(shù),并在相關(guān)章節(jié)中給出大量的實(shí)例。與上一版相比,本書(shū)進(jìn)行了全面的修訂,涵蓋了編譯器開(kāi)發(fā)方面的最新進(jìn)展。每章中都提供了大量的系統(tǒng)及參考文獻(xiàn)。
?
小結(jié)
好了,最后我們來(lái)總結(jié)一些今天分享的內(nèi)容。在這篇文章中,我建議想進(jìn)入專(zhuān)業(yè)編程領(lǐng)域的人,一定要算法、數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)模型、計(jì)算機(jī)原理等理論知識(shí),并推薦了相應(yīng)的學(xué)習(xí)素材,給出了我的思考和建議。
我認(rèn)為,雖然這些理論知識(shí)枯燥難學(xué),而且通常學(xué)完了在工作中也并不是馬上就能用上,但這些知識(shí)是必須要學(xué)好的。這些理論知識(shí)可以說(shuō)是計(jì)算機(jī)科學(xué)這門(mén)學(xué)科最精華的知識(shí)了,認(rèn)真學(xué)習(xí),理解其背后的邏輯和思維方式,會(huì)令你受益匪淺。不管是未來(lái)學(xué)習(xí)新知識(shí),還是解決什么疑難問(wèn)題,都能在這些知識(shí)中獲得靈感或者啟發(fā)。
第四篇:Java程序員修煉之道
從2002開(kāi)始接觸Java學(xué)會(huì)HelloWorld這么經(jīng)典的程序到如今不知不覺(jué)已經(jīng)十年啦,十年中
親耳聽(tīng)到過(guò)不少大牛的演講,見(jiàn)到過(guò)項(xiàng)目中的神人在鍵盤(pán)上運(yùn)指如飛的編程速度,當(dāng)時(shí)就
被震撼了。當(dāng)編程越來(lái)越成體力活,我們還能有自己的思想,還能修煉為Java系統(tǒng)級(jí)別的
程序員嘛?學(xué)習(xí)與修煉以下知識(shí)與技能,幫你早日達(dá)成愿望。
一:Java語(yǔ)言學(xué)習(xí)
對(duì)線程(thread),串行化,反射,網(wǎng)絡(luò)編程,JNI技術(shù),容器(Map,List, Iterator), 類(lèi)加載器
(ClassLoader),輸入輸出流,垃圾回收機(jī)制,有比較深入的了解,最起碼做過(guò)項(xiàng)目應(yīng)用。有
過(guò)Java項(xiàng)目的性能優(yōu)化經(jīng)驗(yàn),最起碼掌握一種性能監(jiān)視工具的使用,熟悉JVM參數(shù),最起
碼知道可以在JVM啟動(dòng)時(shí)指定不同垃圾回收機(jī)制,以及不同垃圾回收機(jī)制之間的
差別,熟悉JVM參數(shù)優(yōu)化。
二:J2EE方面
最好知道JDBC規(guī)范是怎么回事情,面對(duì)Oracle數(shù)據(jù)庫(kù)如果告訴你JDBC驅(qū)動(dòng)不能用了,你
還知道有OCI驅(qū)動(dòng)可以。掌握常見(jiàn)的SQL語(yǔ)句,熟悉JMS,JNDI等組件,掌握一套web開(kāi)
發(fā)模式,從前臺(tái)到后臺(tái),有能力整合好這樣的框架。理解并掌握MVC思想,像SSH已經(jīng)實(shí)
現(xiàn)了MVC的分層,幾乎不需要你自己再實(shí)現(xiàn),假設(shè)你開(kāi)發(fā)一個(gè)簡(jiǎn)單的Swing程序,你能MVC
就說(shuō)明你真的掌握了MVC的精髓。有能力在J2EE前端開(kāi)發(fā)中構(gòu)建自己的MVC模式,知道
什么是WEB2.0,知道什么是SOA,SaaS,SaaP等含義
三:理解并能合理運(yùn)用設(shè)計(jì)模式,UML建模
知道并理解設(shè)計(jì)模式中蘊(yùn)含的幾種基本原則如:里氏替換原則,開(kāi)閉原則,合成復(fù)用原則,依賴倒置原則有很好的理解,并能舉例說(shuō)明。對(duì)常用的設(shè)計(jì)模式如工廠模式,單例模式,觀
察者模式,責(zé)任鏈模式,橋接模式等知道靈活運(yùn)用,明白什么是回調(diào)(Callback)。最后用一位
高人話來(lái)總結(jié)設(shè)計(jì)模式,它是為了讓軟件更容易被別人讀懂,更容易維護(hù)而產(chǎn)生,設(shè)計(jì)模
式本質(zhì)是程序員之間的交流,如果A用工廠模式設(shè)計(jì)一個(gè)模塊B來(lái)接替,A只要說(shuō)該模塊是
工廠模式實(shí)現(xiàn),B維護(hù)起來(lái)應(yīng)該容易得多,所以設(shè)計(jì)模式是關(guān)于交流,不關(guān)于代碼。切忌濫
用設(shè)計(jì)模式。學(xué)會(huì)使用UML建模工具至少熟悉一種URL建模工具。
四:注重用戶體驗(yàn),掌握KISS原則,知道歐卡姆剃刀原則
顧客就是上帝這個(gè)口號(hào)我們已經(jīng)喊了N年了,程序員的勞動(dòng)成果最終也需要轉(zhuǎn)換為服務(wù)提
供給客戶,用戶體驗(yàn)至關(guān)重要,常常看到的場(chǎng)景是功能實(shí)現(xiàn)了,軟件很難使用,程序員有個(gè)
很充足的理由我不是美工,其實(shí)注重用戶體驗(yàn)跟美工八桿子也打不到一起,F(xiàn)oxMail的成功
在很大程度是用戶體驗(yàn)的成功,友好,清晰的用戶提示,強(qiáng)的容錯(cuò)與糾錯(cuò)設(shè)計(jì)是獲得好的
用戶體驗(yàn)的不二法門(mén)。傻瓜相機(jī)顧名思義傻子都會(huì)使用,這個(gè)就著名的KISS原則(Keep it
simple and stupid)意思是UI設(shè)計(jì)要簡(jiǎn)單明了,傻子一看就知道怎么用,想想我們做出來(lái)的
東西,對(duì)照說(shuō)明書(shū)都不知道怎么用。另外一個(gè)就是最著名的例子IPhone手機(jī)外觀設(shè)計(jì),是 典型的歐卡姆剃刀設(shè)計(jì)原則來(lái)完成人機(jī)交互。
五:自動(dòng)測(cè)試與軟件配置管理(SCM)實(shí)現(xiàn)
知道什么是軟件配置管理,知道Hudson微機(jī)原理鬧危機(jī),匯編語(yǔ)言不會(huì)變,實(shí)變函數(shù)學(xué)
十遍。計(jì)算機(jī)基礎(chǔ)知識(shí)被大家普遍忽視。從今天開(kāi)始好好學(xué)習(xí)吧……
十一:Java代碼反編譯與代碼保護(hù)
Java編譯產(chǎn)生字節(jié)碼,因而可以被輕松的逆向工程(反編譯),微軟的C#生產(chǎn)的DLL也一樣可
以被輕松反編譯。正式由于這個(gè)原因產(chǎn)生了許多Java開(kāi)源的代碼保護(hù)工具,而Proguard是
其中佼佼者,已經(jīng)被google集成在android之中用于Java代碼保護(hù),訪問(wèn)這里了解更多:
http://proguard.sourceforge.net/
十二:努力成為某個(gè)行業(yè)或者領(lǐng)域骨干
面對(duì)漫長(zhǎng)的職業(yè)生涯,要想不被淘汰,必須具備一招鮮吃遍天下的能力,選擇自己感興趣的
方向,努力而深入的研究,計(jì)算機(jī)技術(shù)發(fā)展到今天已經(jīng)細(xì)分很細(xì),努力研究一種Java開(kāi)源
框架或者開(kāi)源HTTP服務(wù)器源碼或者研究過(guò)網(wǎng)絡(luò)爬蟲(chóng)源碼或者WEBKIT內(nèi)核,不愁沒(méi)有人要
你。如果你是非常了解金融,企業(yè)ERP,證券,保險(xiǎn),移動(dòng)應(yīng)用行業(yè)的應(yīng)用開(kāi)發(fā)業(yè)務(wù)的人,一樣不用愁工作。這些知識(shí)不隨語(yǔ)言而改變,努力做一個(gè)有核心競(jìng)爭(zhēng)力的Java程序員。
十三:提高語(yǔ)言與書(shū)面表達(dá)能力,掌握基礎(chǔ)的項(xiàng)目管理知識(shí)
文檔與語(yǔ)言表達(dá)能力是最好的向外界展現(xiàn)自己能力的方式,很多程序員編程能力很高,表達(dá)
能力一般,Linux能夠成功,除了歸功于網(wǎng)絡(luò)社區(qū)的力量之外,也得益于Linux作者本人給各
大基金會(huì)寫(xiě)信,宣傳推廣,試想如果沒(méi)有良好的書(shū)面語(yǔ)言表達(dá)能力,即使Linux系統(tǒng)再優(yōu)秀,卻無(wú)法被準(zhǔn)確表達(dá),失去各大基金會(huì)的支持,Linux還會(huì)像今天這么好的局面嘛。所以重視
文檔,重視提升溝通與表達(dá)能力,才有可能成為Java系統(tǒng)程序員。掌握基本的2/8原則,學(xué)
會(huì)將模塊細(xì)化分配給不同的人,預(yù)見(jiàn)并控制項(xiàng)目風(fēng)險(xiǎn),把握項(xiàng)目進(jìn)度,優(yōu)化流程,合理的時(shí)
間管理,了解TDD,熟悉敏捷開(kāi)發(fā)模式,常規(guī)軟件開(kāi)發(fā)模式。
十四:掌握英語(yǔ),良好的讀寫(xiě)能力
英語(yǔ)是計(jì)算機(jī)的母語(yǔ),掌握好英語(yǔ)對(duì)于閱讀英文資料學(xué)習(xí)新技術(shù)大有幫助,我的建議是盡量
讀英文原版書(shū),如果是算法方面的可能會(huì)困難一點(diǎn),但是其它像設(shè)計(jì)模式,軟件工程,OO
編程思想等盡量讀原版,提高自己的英文水平,多多訪問(wèn)開(kāi)發(fā)者,code project,程序員天堂,Pc-magazine等英文IT網(wǎng)站。英語(yǔ)絕對(duì)是你必須修煉與提高的技能。此外英語(yǔ)好在外資企業(yè)
尤其重要,只有外語(yǔ)足夠好才可能在外資企業(yè)中突破職業(yè)瓶頸,向上發(fā)展。
第五篇:Java程序員修煉十大過(guò)程
Java程序員修煉十大過(guò)程
學(xué)習(xí)java這么久,見(jiàn)到過(guò)項(xiàng)目中的神人在鍵盤(pán)上運(yùn)指如飛的編程速度,當(dāng)時(shí)就被震撼了。當(dāng)編程越來(lái)越成體力活,我們還能有自己的思想,還能修煉為Java系統(tǒng)級(jí)別的程序員嘛?學(xué)習(xí)與修煉以下知識(shí)與技能,幫你早日達(dá)成愿望。
一、努力成為某個(gè)行業(yè)或者領(lǐng)域骨干
面對(duì)漫長(zhǎng)的職業(yè)生涯,要想不被淘汰,必須具備一招鮮吃遍天下的能力,選擇自己感興趣的方向,努力而深入的研究,計(jì)算機(jī)技術(shù)發(fā)展到今天已經(jīng)細(xì)分很細(xì),努力研究一種Java開(kāi)源框架或者開(kāi)源HTTP服務(wù)器源碼或者研究過(guò)網(wǎng)絡(luò)爬蟲(chóng)源碼或者WEBKIT內(nèi)核,不愁沒(méi)有人要你。如果你是非常了解金融,企業(yè)ERP,證券,保險(xiǎn),移動(dòng)應(yīng)用行業(yè)的應(yīng)用開(kāi)發(fā)業(yè)務(wù)的人,一樣不用愁工作。這些知識(shí)不隨語(yǔ)言而改變,努力做一個(gè)有核心競(jìng)爭(zhēng)力的Java程序員。
二、保持謙虛,三人行必有我?guī)?/p>
喬幫主說(shuō)他要保持初心,努力學(xué)習(xí),我等更應(yīng)該保持謙虛,IT技術(shù)發(fā)展日新月異,在你眼中不可能實(shí)現(xiàn)的技術(shù),也許別人早已經(jīng)有思路。保持謙虛就有機(jī)會(huì)吸取別人身上的長(zhǎng)處,古人有云:滿招損,謙受益。一個(gè)得道的高人更是說(shuō)出了“下下人,上上智”的禪語(yǔ)。永遠(yuǎn)不要拒絕幫助你周?chē)娜私鉀Q難題,解決難題是進(jìn)步最快途徑。不要放棄任何一次可以提升自己技術(shù)與能力的機(jī)會(huì)。
三、熟悉常見(jiàn)的網(wǎng)絡(luò)通信協(xié)議
對(duì)HTTP協(xié)議,知道POST, GET的區(qū)別是什么,閱讀過(guò)HTTP相關(guān)的RFC文檔。學(xué)會(huì)使用sniffer工具查看數(shù)據(jù)包,幫助查找與調(diào)試程序,知道TCP與UDP的區(qū)別,知道并理解E-Mail發(fā)送與接受的協(xié)議如SMTP,POP3,IMAP等協(xié)議,了解MIME與Base64編碼。知道組播是怎么回事情。
四、理解并能合理運(yùn)用設(shè)計(jì)模式,UML建模
知道并理解設(shè)計(jì)模式中蘊(yùn)含的幾種基本原則如:里氏替換原則,開(kāi)閉原則,合成復(fù)用原則,依賴倒置原則有很好的理解,并能舉例說(shuō)明。對(duì)常用的設(shè)計(jì)模式如工廠模式,單例模式,觀察者模式,責(zé)任鏈模式,橋接模式等知道靈活運(yùn)用,明白什么是回調(diào)(Callback)。最后用一位高人話來(lái)總結(jié)設(shè)計(jì)模式,它是為了讓軟件更容易被別人讀懂,更容易維護(hù)而產(chǎn)生,設(shè)計(jì)模式本質(zhì)是程序員之間的交流,如果A用工廠模式設(shè)計(jì)一個(gè)模塊B來(lái)接替,A只要說(shuō)該模塊是工廠模式實(shí)現(xiàn),B維護(hù)起來(lái)應(yīng)該容易得多,所以設(shè)計(jì)模式是關(guān)于交流,不關(guān)于代碼。切忌濫用設(shè)計(jì)模式。學(xué)會(huì)使用UML建模工具至少熟悉一種URL建模工具。
五、自動(dòng)測(cè)試與軟件配置管理(SCM)實(shí)現(xiàn)
知道什么是軟件配置管理,知道Hudson-http://java.net/projects/hudson/運(yùn)用該工具SCM,知道怎么獲取測(cè)試代碼覆蓋率,Java有效代碼行數(shù)(NCSS),完成firebug,JDepend等工具集成ant/maven.熟悉并注重在開(kāi)發(fā)過(guò)程中使用JUnit單元測(cè)試,理解白盒測(cè)試規(guī)范。
六、Java語(yǔ)言學(xué)習(xí)
對(duì)線程(thread),串行化,反射,網(wǎng)絡(luò)編程,JNI技術(shù),容器(Map,List, Iterator),類(lèi)加載器(ClassLoader),輸入輸出流,垃圾回收機(jī)制,有比較深入的了解,最起碼做過(guò)項(xiàng)目應(yīng)用。有過(guò)Java項(xiàng)目的性能優(yōu)化經(jīng)驗(yàn),最起碼掌握一種性能監(jiān)視工具的使用,熟悉JVM參數(shù),最起碼知道可以在JVM啟動(dòng)時(shí)指定不同垃圾回收機(jī)制,以及不同垃圾回收機(jī)制之間的差別,熟悉JVM參數(shù)優(yōu)化。
七、掌握英語(yǔ),良好的讀寫(xiě)能力
英語(yǔ)是計(jì)算機(jī)的母語(yǔ),掌握好英語(yǔ)對(duì)于閱讀英文資料學(xué)習(xí)新技術(shù)大有幫助,我的建議是盡量讀英
文原版書(shū),如果是算法方面的可能會(huì)困難一點(diǎn),但是其它像設(shè)計(jì)模式,軟件工程,OO編程思想等盡量讀原版,提高自己的英文水平,多多訪問(wèn)開(kāi)發(fā)者,code project,程序員天堂,Pc-magazine等英文IT網(wǎng)站。英語(yǔ)絕對(duì)是你必須修煉與提高的技能。此外英語(yǔ)好在外資企業(yè)尤其重要,只有外語(yǔ)足夠好才可能在外資企業(yè)中突破職業(yè)瓶頸,向上發(fā)展。
八、養(yǎng)成總結(jié)的習(xí)慣,不斷反思
上學(xué)的時(shí)候老師常讓寫(xiě)小結(jié),也沒(méi)總結(jié)出來(lái)所以然,以至于工作以后再也不提這檔子事情,建議每個(gè)項(xiàng)目做完以后對(duì)自己都有個(gè)小結(jié),總結(jié)自己在項(xiàng)目里面學(xué)到了什么,反問(wèn)自己能不能完成在不需要?jiǎng)e人幫助的情況下自己完成這樣的系統(tǒng)搭建,是否熟悉與掌握項(xiàng)目中所用到的技術(shù),即使有些東西不是你負(fù)責(zé)完成的但是什么也不能阻擋一顆求知的心,總結(jié)要盡量詳細(xì)記錄你遇到那些難題是怎么一個(gè)一個(gè)的解決的,下次再遇到你是否可以很快解決或者避免這樣的問(wèn)題。有總結(jié)才有提高,孔子曰:學(xué)而不思則罔,如果我們只是coding到吐血,不思考,不總結(jié)提高,永遠(yuǎn)不可能有能有本質(zhì)提高,秦相李斯有云:“泰山不讓土壤,故能成其大,河海不擇細(xì)流,故能就其深”,點(diǎn)滴積累不斷總結(jié)方能量變導(dǎo)致質(zhì)變。
九、Java代碼反編譯與代碼保護(hù)
Java編譯產(chǎn)生字節(jié)碼,因而可以被輕松的逆向工程(反編譯),微軟的C#生產(chǎn)的DLL也一樣可以被輕松反編譯。正式由于這個(gè)原因產(chǎn)生了許多Java開(kāi)源的代碼保護(hù)工具,而Proguard是其中佼佼者,已經(jīng)被google集成在android之中用于Java代碼保護(hù)。
十、面向市場(chǎng),永遠(yuǎn)對(duì)新技術(shù)保持渴望
計(jì)算機(jī)技術(shù)的發(fā)展日新月異,做為IT行業(yè)的軟件開(kāi)發(fā)人員要不斷的給自己充電,更新自己的技術(shù)與時(shí)代保持同步,同時(shí)還要面向市場(chǎng),華為總裁任正非說(shuō)過(guò)-“華為的技術(shù)革新必須面向市場(chǎng)”,作為程序員同樣要有市場(chǎng)意識(shí),很多人都后悔沒(méi)有在android剛出來(lái)的時(shí)候加以關(guān)注學(xué)習(xí)。那些很早關(guān)注android開(kāi)發(fā)技術(shù)的很多程序員因此獲得豐厚回報(bào)。如今HTML5得到越來(lái)越多的瀏覽器廠家
支持,你是否已經(jīng)跟上腳步,開(kāi)始學(xué)習(xí)。