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