這個(gè)部分大概需要一段時(shí)間吧,打好基礎(chǔ)是挺重要的,熟話說厚積薄發(fā),大家都明白這個(gè)道理,明白學(xué)習(xí)算法,學(xué)習(xí)計(jì)算機(jī)理論的重要性,但是真要實(shí)踐起來實(shí)在是痛苦的事情,每天的學(xué)習(xí)覺得很盲目有很多東西都是用不上的,所以說練習(xí)內(nèi)功是一件漫長(zhǎng)而又艱險(xiǎn)的路途。可是要知道要想達(dá)到真正的境界,這是不可少的一步,曾經(jīng)看過GNU的掌門人,動(dòng)輒10年以上一線開發(fā)經(jīng)驗(yàn),8年的開發(fā)team管理經(jīng)驗(yàn),這是什么境界!在中國(guó)呢,大多數(shù)2B的所謂的項(xiàng)目經(jīng)理,技術(shù)經(jīng)理都是一群2B玩意兒,沒有堅(jiān)厚的理論功底,前幾年玩過什么VB,Delphi就說能開發(fā)了,這幾年寫過一陣子Java,就說掌握OO了,真是瘋子,沒有學(xué)術(shù)氣氛的一個(gè)大環(huán)境,只有自己努力了。我的一位很厲害的師傅給我講過老外為什么比現(xiàn)在的國(guó)人要厲害,那是因?yàn)樗麄兡?#8220;管理”的代碼比較多,什么意思呢?就是說我的大腦里面能控制5K行的代碼,比我厲害的老外能控制1W行的復(fù)雜度,而且在我的理解老外學(xué)習(xí)計(jì)算機(jī)的方式和我們也有很大不同,他們能把問題看的很透徹,甚至看穿了每個(gè)變量在內(nèi)存中的每一個(gè)行為,中國(guó)的互聯(lián)網(wǎng)很大程度上影響了國(guó)人的學(xué)習(xí)態(tài)度,有的計(jì)算機(jī)畢業(yè)的學(xué)生一直去寫一些爛代碼,美其名曰設(shè)計(jì)師,完全丟掉了計(jì)算機(jī)老祖宗的教導(dǎo),我覺得要是自己覺得自己是計(jì)算機(jī)系出來的那么要掌握很多東西后才能說自己是一位軟件工程師,否則連coder都不是,現(xiàn)在很多公司招人其實(shí)都是招coding的人,不是軟件工程師。四年至少學(xué)會(huì)和理解計(jì)算機(jī)和數(shù)學(xué)的大部分課程,為什么要學(xué)習(xí)一定的數(shù)學(xué)呢?這是個(gè)受爭(zhēng)議的問題,而我個(gè)人認(rèn)為真正的軟件工程師是需要數(shù)學(xué)的,起碼要數(shù)學(xué)的思維方式。
一門或者幾門語(yǔ)言是必須學(xué)會(huì)的,要不我們?cè)趺磳?shí)踐呢。過程的C和OO的Java最好都要會(huì),有C經(jīng)驗(yàn)是很重要的,十分重要,我之前C的經(jīng)驗(yàn)很少,所以被拒過一次,因此現(xiàn)在想靜下心來學(xué)習(xí)學(xué)習(xí),實(shí)踐實(shí)踐。
語(yǔ)言會(huì)了就是練內(nèi)功的基本了:算法和數(shù)據(jù)結(jié)構(gòu),這是兩個(gè)不同的東西,我曾經(jīng)去面一家公司,所有的大題都是鏈表,當(dāng)時(shí)狂暈!爆汗!只會(huì)考數(shù)據(jù)結(jié)構(gòu),連個(gè)查找都不考,呵呵,自然都很簡(jiǎn)單的搞定了。書多的是,我不推薦看TAOCP,除非你的數(shù)學(xué)有了5年以上的數(shù)學(xué)奧林匹克訓(xùn)練,并且數(shù)學(xué)知識(shí)面非常廣泛,沒看過的人以為很神奇,要是看完了很牛B,我當(dāng)時(shí)也是這樣想的,看看書皮上寫的,看會(huì)了就能給蓋茨發(fā)簡(jiǎn)歷了,真牛!不過看了不到半年,僅僅半年,我就明白了一個(gè)偉大的事情:我被打擊哭了!!不過第一卷我還是看完了,掌握的根本不到50%,我有11年的數(shù)學(xué)奧賽訓(xùn)練史,所以勉強(qiáng)讀完第一卷所謂的基本算法,感覺就是數(shù)學(xué)課本,雜七雜八的數(shù)學(xué)課本,各方面都有,高等數(shù)學(xué),代數(shù)學(xué),概率,級(jí)數(shù)都涵蓋了。后來明白了,需要看看他的基礎(chǔ)具體數(shù)學(xué),然后學(xué)一下組合數(shù)學(xué)才能駕馭這本東東。
后來明白了,我需要一定的C的基礎(chǔ)和牛B的C++ coding能力才能去搞搞一些我喜歡的地方,呵呵。因此該學(xué)習(xí)一下了,學(xué)好了C,在練練Algorithms In C的代碼能力,然后看看Algorithms Desgin,提高一下思維,最后才可以去看半數(shù)值了。
所謂“厚積薄發(fā)”,實(shí)在是有道理!
附上一下:我覺得要想去一些牛B的地方應(yīng)該復(fù)習(xí)一下以前學(xué)會(huì)的東西:
計(jì)算機(jī)理論基礎(chǔ):離散數(shù)學(xué),計(jì)算理論,數(shù)值計(jì)算,自動(dòng)機(jī)理論,計(jì)算機(jī)系統(tǒng),操作系統(tǒng),數(shù)據(jù)庫(kù)理論……
數(shù)學(xué)知識(shí)基礎(chǔ):統(tǒng)計(jì)學(xué),概率論,隨機(jī)過程,組合數(shù)學(xué),高等數(shù)學(xué),數(shù)學(xué)分析……
研究方向上基礎(chǔ):數(shù)據(jù)挖掘算法,機(jī)器學(xué)習(xí)算法,數(shù)學(xué)建模的東東……
語(yǔ)言上:C,Java,可以了。C++可是很難學(xué)的,唉……。
最后就是,aha,智力題了!
這是一個(gè)哥哥的建議:
一般要做到50行以內(nèi)的程序不用調(diào)試、100行以內(nèi)的二分鐘內(nèi)調(diào)試成功。
主要是考慮考慮算法,關(guān)鍵是思考算法上,不是花在寫程序與debug上。
練經(jīng)典常用算法,下面的每個(gè)算法給我打上十到二十遍,同時(shí)自己精簡(jiǎn)代碼,因?yàn)樘S茫砸毜綄憰r(shí)不用想,10-15分鐘內(nèi)打完,甚至關(guān)掉顯示器都可以把程序打出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個(gè)prim,kruscal要用并查集,不好寫)
3.大數(shù)(高精度)加減乘除
4.二分查找. (代碼可在五行以內(nèi))
5.叉乘、判線段相交、然后寫個(gè)凸包.
6.BFS、DFS,同時(shí)熟練hash表(要熟,要靈活,代碼要簡(jiǎn))
7.數(shù)學(xué)上的有:輾轉(zhuǎn)相除(兩行內(nèi)),線段交點(diǎn)、多角形面積公式.
8. 調(diào)用系統(tǒng)的qsort, 技巧很多,慢慢掌握.
9. 任意進(jìn)制間的轉(zhuǎn)換
練習(xí)復(fù)雜一點(diǎn),但也較常用的算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋。
2. 網(wǎng)絡(luò)流,最小費(fèi)用流。
3. 線段樹。
4. 并查集。
5. 熟悉動(dòng)態(tài)規(guī)劃的各個(gè)典型:LCS、最長(zhǎng)遞增子串、三角剖分、記憶化dp。
6.博弈類算法。博弈樹,二進(jìn)制法等。
7.最大團(tuán),最大獨(dú)立集。
8.判斷點(diǎn)在多邊形內(nèi)。
9. 差分約束系統(tǒng)。
10. 雙向廣度搜索、A*算法,最小耗散優(yōu)先。
前兩個(gè)階段是打基礎(chǔ),第三階段是鍛煉快速建立模型、想新算法。這就要平時(shí)積累了。
1. 論文看看,關(guān)于研究方向的主要看(大概幾百篇的,我只看了一點(diǎn)點(diǎn),呵呵)。
2. 做過的題要記好 :-)。
3. 主動(dòng)去看看這個(gè)方向上比較牛的人的研究方法和研究歷史。
引用一句廣告詞:“你有一個(gè)想法,一個(gè)很大的想法,這個(gè)想法如此之大!”。將理想變?yōu)楝F(xiàn)實(shí)的過程總是十分漫長(zhǎng)而又艱辛的。——IBM