要想成為一名頂尖的程序員?
是的,筆者認(rèn)為:要想成為一名頂尖的程序員,學(xué)習(xí)高等數(shù)學(xué)是必不可少的。
下面筆者從網(wǎng)絡(luò)上整理出一篇文章,供需要的讀者參考。
本篇文章是作者多年來(lái)的一些感受,主要寫(xiě)給那些想學(xué)習(xí)程序設(shè)計(jì)而又很迷惘的朋友,希望可以帶來(lái)一點(diǎn)幫助。 我第一次接觸電腦是在小學(xué)二年級(jí)的時(shí)候。那時(shí)純粹是因?yàn)橄矚g打電子游戲,聽(tīng)別人說(shuō)電腦上的游戲十分好玩,于是就漫漫開(kāi)始與之接觸了。在三年級(jí)時(shí)父母出于我對(duì)計(jì)算機(jī)濃厚的興趣送我去了一個(gè)BASIC編程學(xué)習(xí)班,從那時(shí)起我才真正開(kāi)始走上編程這條不歸之路。雖然說(shuō)現(xiàn)在程序設(shè)計(jì)這門(mén)專業(yè)在社會(huì)上很熱,競(jìng)爭(zhēng)十分激烈,但是這只是學(xué)習(xí)編程的人比較多而已。真正能夠掌握以至于精通的人實(shí)際上很少,畢竟中國(guó)的軟件業(yè)才剛剛起步不久。現(xiàn)在社會(huì)對(duì)優(yōu)秀的程序設(shè)計(jì)人員的需求量還是相當(dāng)大的,但是前提是必須要優(yōu)秀。我自己雖然也談不上優(yōu)秀,但多少還是有些感觸。
在這里想講述自己對(duì)于一般程序員和優(yōu)秀程序員之間在技術(shù)上的一些認(rèn)識(shí)(什么敬業(yè)精神生活態(tài)度我就不多說(shuō)了): 首先作為一個(gè)優(yōu)秀的程序員,數(shù)學(xué)是十分重要的。數(shù)學(xué)是自然科學(xué)的基礎(chǔ),計(jì)算機(jī)科學(xué)實(shí)際上是數(shù)學(xué)的一個(gè)分支。數(shù)學(xué)主要能讓人懂得一種分析問(wèn)題的方法,然后再通過(guò)編程去實(shí)現(xiàn)它。計(jì)算機(jī)內(nèi)部的許多原理也都牽涉到比較復(fù)雜的數(shù)學(xué)知識(shí)。它是我們用來(lái)解決現(xiàn)實(shí)問(wèn)題的最高效的工具。很多學(xué)習(xí)編程的朋友對(duì)數(shù)學(xué)覺(jué)得不屑一顧,覺(jué)得對(duì)于編程沒(méi)有什么關(guān)系。實(shí)際上優(yōu)秀程序員和一般程序員拉開(kāi)檔次很大一個(gè)程度上就是取決于對(duì)數(shù)學(xué)的能力。一些項(xiàng)目有時(shí)需要很復(fù)雜的數(shù)學(xué)建模和利用數(shù)學(xué)對(duì)于系統(tǒng)效率進(jìn)行分析,而這些項(xiàng)目對(duì)于一般的程序員是很困難的。正確應(yīng)用數(shù)學(xué)知識(shí)有時(shí)候能使你的程序的效率產(chǎn)生質(zhì)的飛躍。現(xiàn)在的程序員在數(shù)學(xué)上普遍是薄弱環(huán)節(jié),這點(diǎn)是大家應(yīng)該引起足夠重視的。當(dāng)別人對(duì)于這些項(xiàng)目感到無(wú)從下手,而你卻能夠完成,這個(gè)時(shí)候你的價(jià)值也就表現(xiàn)出來(lái)了。真正優(yōu)秀的程序員是能夠最基本的一點(diǎn)就是要能夠通過(guò)自己的知識(shí)來(lái)解決一般程序員所無(wú)法完成的問(wèn)題。而數(shù)學(xué)能力就是一個(gè)很重要的環(huán)節(jié)。
其次就是要對(duì)數(shù)據(jù)結(jié)構(gòu)引起足夠的重視。如果說(shuō)計(jì)算機(jī)專業(yè)的學(xué)生與非計(jì)算機(jī)專業(yè)的最根本的差別絕對(duì)是數(shù)據(jù)結(jié)構(gòu)(數(shù)學(xué)大家都一樣學(xué)了,主要看你自己學(xué)得好壞)。對(duì)數(shù)據(jù)結(jié)構(gòu)的掌握與運(yùn)用能力是衡量你編程能力的一個(gè)很重要的指標(biāo)。有的人對(duì)于看了鏈表,棧,樹(shù),廣義表這些東西就頭痛。然而這些東西往往能使你的程序的效率比別人高出百倍。由于一直搞信息學(xué)競(jìng)賽,到了大學(xué)又搞ACM,所以我對(duì)數(shù)學(xué)和數(shù)據(jù)結(jié)構(gòu)都掌握得相對(duì)較好。這使我在應(yīng)聘與工作中明顯感到勝人一酬。記得自己大學(xué)時(shí)去一家公司應(yīng)聘的經(jīng)歷,當(dāng)時(shí)去應(yīng)憑的還有3個(gè)人,有2個(gè)大學(xué)畢業(yè),有個(gè)也工作了一段時(shí)間了。他們幾個(gè)都在大講自己的能力如何之強(qiáng),會(huì)使用的語(yǔ)言及編程工具如何之多,經(jīng)驗(yàn)如何之豐富。按理說(shuō)我應(yīng)該是資質(zhì)最淺的。當(dāng)時(shí)也是初生牛X不怕虎,也就硬著頭皮去了。當(dāng)時(shí)面試的題目是一個(gè)公司的資金管理項(xiàng)目的一個(gè)問(wèn)題,要求每個(gè)人都在思考后給出自己的設(shè)計(jì)方案。其中比較核心的一個(gè)問(wèn)題就是要計(jì)算一個(gè)資金最小波動(dòng)值的問(wèn)題,給出的數(shù)據(jù)量相當(dāng)大,對(duì)效率要求很高。
對(duì)于整個(gè)程序的面向?qū)ο蠡姆治鑫覀儙讉€(gè)都是差不多的,畢竟這些東西在學(xué)校里是很重視的,而且不是真正的難點(diǎn)。然而到了最關(guān)鍵的問(wèn)題時(shí)其余的人都卡殼了,有兩個(gè)是用簡(jiǎn)單的雙重循環(huán),時(shí)間復(fù)雜度(N^2),慘不忍睹。還有一個(gè)在冥思苦想了好一陣以后說(shuō)用樹(shù),具體技術(shù)細(xì)節(jié)又講不清楚,效率分析也很馬虎。只有我當(dāng)時(shí)很快就給出了采取AVL樹(shù)的方案,并且利用高等數(shù)學(xué)推導(dǎo)作出了很詳細(xì)的效率分析和時(shí)空換算,并提出了引入?yún)R編的方法。很自然的我得到了這分工作。在這里大家顯然可以看到數(shù)學(xué)和數(shù)據(jù)結(jié)構(gòu)對(duì)于一個(gè)優(yōu)秀程序員是多么重要,它們是和一般的程序員打開(kāi)檔次的最關(guān)鍵的地方。這樣向“棗子”碰到的那種情況應(yīng)該很輕松的就可以想到。
如果你是一位想學(xué)習(xí)編程的朋友,我經(jīng)過(guò)多年的學(xué)習(xí)總結(jié)出來(lái)了一個(gè)學(xué)習(xí)的線路希望對(duì)你有所幫助。要學(xué)習(xí)編程是要有很大恒心和毅力的,首先你要明確自己的目標(biāo),想好自己編程是為了干什么。如果你學(xué)習(xí)僅僅只是一時(shí)想編出QUAKE和成為比爾蓋次的沖動(dòng),那么我勸你還是應(yīng)該還是不要開(kāi)始學(xué)習(xí),應(yīng)為這樣的目標(biāo)很難支持你日后大量的學(xué)習(xí)。而且你的年齡不能太大(最好是中學(xué)或者大學(xué)生)。如果你想好目標(biāo)并決定開(kāi)始奮斗,那就讓我們開(kāi)始吧。如果你一開(kāi)始對(duì)電腦一無(wú)所知,那么你應(yīng)該先熟悉一些電腦的一些最基本的原理和操作,這個(gè)不需要特別細(xì)致的學(xué)習(xí),只要大概知道二進(jìn)制和一些基本操作就可以了。接下來(lái)你應(yīng)該先學(xué)習(xí)BASIC語(yǔ)言,這個(gè)語(yǔ)言并不會(huì)耽誤你太多的時(shí)間,學(xué)習(xí)它完全是為了入門(mén),讓你對(duì)電腦編程有一個(gè)比較初步的認(rèn)識(shí)。這時(shí)候你應(yīng)該多編一些小的程序,知道一些最基本每條語(yǔ)句的功能,搞清楚一些基本的數(shù)據(jù)結(jié)構(gòu)(尤其是數(shù)組)對(duì)于一些其余用途的函數(shù)最好不要做任何學(xué)習(xí),因?yàn)檫@樣只會(huì)分散你的注意力。當(dāng)你能夠可以熟練的運(yùn)用BASIC編出猴子選大王,以及電腦出題考試之類的程序時(shí),你就可以開(kāi)始后面的學(xué)習(xí)了。接下來(lái)如果覺(jué)得自己接受能力強(qiáng)的話就可以開(kāi)始學(xué)C了(注意不是C++),如果感覺(jué)有困難也可以先學(xué)Pascal過(guò)度一下。還有很重要的一點(diǎn)就是千萬(wàn)不要一開(kāi)始就學(xué)VB,DELPHI,VC之類的東西,這些東西在一開(kāi)始學(xué)會(huì)對(duì)你造成很壞的影響。有可能會(huì)把你引入另外一個(gè)錯(cuò)誤的學(xué)習(xí)方向而忽略了真正應(yīng)該掌握的東西。學(xué)C主要是學(xué)過(guò)程話的程序設(shè)計(jì),學(xué)會(huì)把自己的程序分成許多的函數(shù)(或過(guò)程),養(yǎng)成良好的編程習(xí)慣。這時(shí)可以多看一下高人的程序,不一定要懂意思,主要是學(xué)會(huì)別人程序的格式(比如變量如何起名,怎么劃分函數(shù))。
除了掌握基本的控制流語(yǔ)句外,應(yīng)該學(xué)習(xí)一些很簡(jiǎn)單的I/O函數(shù)和數(shù)學(xué)函數(shù)。C的學(xué)習(xí)主要是你舍棄原來(lái)BASIC程序那種把所有語(yǔ)句積成一大堆的風(fēng)格,要學(xué)會(huì)使用函數(shù),提高代碼重用性。對(duì)于指針之類的東西如果實(shí)在看不懂可以先不去管,到后面會(huì)有辦法。當(dāng)你能夠比較自如的用C編寫(xiě)一些小的計(jì)算程序時(shí),你就可以開(kāi)始你的數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)了(數(shù)學(xué)的學(xué)習(xí)主要是在學(xué)校,自己要多用心)。數(shù)據(jù)結(jié)構(gòu)你可以一點(diǎn)一點(diǎn)漫漫看,并不需要專門(mén)空出一段時(shí)間來(lái)專門(mén)研究,這樣的目的是讓你能夠很好的掌握它,要學(xué)會(huì)用數(shù)據(jù)結(jié)構(gòu)的知識(shí)來(lái)規(guī)范自己的程序設(shè)計(jì)和提高程序的效率。學(xué)完C我認(rèn)為接著最好學(xué)習(xí)匯編。這個(gè)或許有許多人都會(huì)反對(duì),然而我個(gè)人認(rèn)為這樣是很好的。從最基本的DOS匯編開(kāi)始,買(mǎi)本《IBM PC匯編程序設(shè)計(jì)》(清華黃皮)一定要一點(diǎn)一點(diǎn)吃透,實(shí)在看不懂就跳,反復(fù)的嚴(yán)讀是一定可以看懂的。匯編是一定要掌握的,因?yàn)樗婕暗胶芏嘧罨镜闹R(shí)。掌握了匯編和對(duì)I/O有了個(gè)很徹底的認(rèn)識(shí)后,應(yīng)該去學(xué)編譯原理。這個(gè)東西并不要精通,但是一定要知道,在大腦里要有一個(gè)這樣的概念,這對(duì)你對(duì)程序語(yǔ)言的控制能力都有很大的幫助。這樣最基本的學(xué)習(xí)就算完成了。一般智力正常的人前一段東西應(yīng)該都是可以掌握的。接著后面的學(xué)習(xí)就要看你自身的造化了。這個(gè)時(shí)候你應(yīng)該研究一下數(shù)據(jù)結(jié)構(gòu),不要分散自己學(xué)習(xí)的注意力,要知道數(shù)據(jù)結(jié)構(gòu)是異常重要的(相信我,絕對(duì)沒(méi)錯(cuò))如果你覺(jué)得自己已經(jīng)對(duì)于樹(shù),連表,堆棧之類的東西和排序,遞歸之類的算法已經(jīng)十分清楚,就可以開(kāi)始學(xué)習(xí)C++了。學(xué)習(xí)前一定要有個(gè)正確的認(rèn)識(shí),那就是C和C++是兩個(gè)不同的東西。學(xué)習(xí)C++是為了學(xué)習(xí)面向?qū)ο蟮某绦蛟O(shè)計(jì),這個(gè)時(shí)候你對(duì)于指針應(yīng)該也能夠掌握了(有匯編的基礎(chǔ)),主要抓住C++和C相比的一些新特性,對(duì)于多態(tài)之類的特性要注意理解掌握,如果沒(méi)有搞懂就堅(jiān)決不要往下學(xué)習(xí)。一些基本的概念掌握以后可以看一些別人設(shè)計(jì)的程序,學(xué)習(xí)別人怎么利用面向?qū)ο蟮姆椒▉?lái)設(shè)計(jì)程序的。這個(gè)東西也是人之間拉開(kāi)檔次的一個(gè)環(huán)節(jié),可以和數(shù)據(jù)結(jié)構(gòu)放在同等重要的地位。
我就見(jiàn)過(guò)有的人都大學(xué)畢業(yè)了還搞不懂virtual到底是怎么一回事情。其實(shí)我認(rèn)為學(xué)到這里你已經(jīng)為你成為一個(gè)優(yōu)秀的程序員打下了很好的基礎(chǔ),你已經(jīng)能夠應(yīng)用C++,懂得面向?qū)ο蟪绦蛟O(shè)計(jì),對(duì)數(shù)據(jù)結(jié)構(gòu)掌握很好,掌握匯編和編譯原理。接下來(lái)的學(xué)習(xí)就是基于操作平臺(tái)的了,一般是先學(xué)windows(Microsoft畢竟是老大),先學(xué)win32 api,搞請(qǐng)windows基本消息機(jī)制和原理,有匯編基礎(chǔ)基本上不會(huì)碰到什么困難。其實(shí)只要會(huì)了API,其余什么MFC,VCL都是囊中之物了,都不過(guò)是對(duì)于API的封裝而已。VC,C++Builder都可輕松拿下,這只是開(kāi)發(fā)工具的問(wèn)題。以后的OLE(ActiveX),.NET,數(shù)據(jù)庫(kù)就要看自己的發(fā)展方向而定了。我在這里強(qiáng)調(diào)的是前面的基本能力的學(xué)習(xí),后面操作平臺(tái)雖然知識(shí)體系龐大,然而畢竟比較死,更好掌握。最后編程能力的高低主要還是有以下幾點(diǎn)決定:1.編程的習(xí)慣 。2.數(shù)學(xué)能力(包括邏輯思維,分析問(wèn)題的能力) 。3.對(duì)數(shù)據(jù)結(jié)構(gòu)的認(rèn)識(shí)能力 。4.經(jīng)驗(yàn)的多少(包括多使用語(yǔ)言的掌握能力) 以上只是本人一些愚見(jiàn),希望大家指出不正確的地方并與我多多交流。
(內(nèi)容整理于網(wǎng)絡(luò)) (頭條號(hào)/許興華數(shù)學(xué))