如果讓我大學(xué)再來一遍,我也還是想做軟件,那我應(yīng)該在大學(xué)里學(xué)點(diǎn)什么?
最終我決定把想到的東西寫下來,希望能對在校的人有點(diǎn)幫助。
首先我們得知道這問題的答案是個(gè)變量,他依賴于你的目標(biāo)和天資能力,絕不唯一。當(dāng)然大學(xué)的課程設(shè)置往往是唯一的,所以會有點(diǎn)矛盾。
這里最關(guān)鍵的東西是目標(biāo),大學(xué)學(xué)習(xí)只是達(dá)成最終目標(biāo)高度的一個(gè)環(huán)節(jié),他應(yīng)該為最終目標(biāo)服務(wù)。
當(dāng)然大學(xué)生很難清楚的知道自己的目標(biāo)究竟在那里,但要總歸要大致知道自己的方向。
這個(gè)之所以關(guān)鍵是因?yàn),這直接決定你應(yīng)不應(yīng)該學(xué)習(xí)某個(gè)東西。我是在做了很多年軟件后,才發(fā)現(xiàn)軟件和軟件的差別其實(shí)比馬和牛的差別還要大。
用流行的分類方法比如:前端開發(fā)、后端開發(fā)、.net開發(fā),Java開發(fā)等會讓人迷失焦點(diǎn),
所以我一直覺得Barry W Boehm在《軟件成本估算:COCOMOII模型方法》里的分類方法對學(xué)習(xí)更有幫助。
在這個(gè)分類方法里軟件被分了三層:最底層是基礎(chǔ)結(jié)構(gòu)型(平臺)軟件的開發(fā);中間層次是開發(fā)工具、系統(tǒng)集成、中間件;最上層是終端用戶編程,也可以理解為一般應(yīng)用的開發(fā)。
同時(shí)作者還補(bǔ)充了份數(shù)據(jù)說:在2005年95%的美國程序員是在做終端用戶編程。
這似乎把話題扯開了,但其實(shí)不是,關(guān)鍵要大致定位下自己的方向。因?yàn)閷τ谀繕?biāo)是基礎(chǔ)結(jié)構(gòu)的程序員和目標(biāo)是一般應(yīng)用的程序員,他們要學(xué)習(xí)的東西差別很大。
Donald Knuth的《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》不是沒用,但如果你花了2年把他啃了一遍回頭專門做應(yīng)用開發(fā),那它真的用處不大。
至少和一個(gè)精通具體語言、框架、設(shè)計(jì)模式、面向?qū)ο、UML的人比只是鉆研了《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》的人反倒是在劣勢,雖然可能后者更花時(shí)間。
反過來講則是在算法密集型的工作里,那優(yōu)劣情形就會掉過來。
無疑的什么都精通最好,但人的時(shí)間是有限的,而軟件相關(guān)的知識是無限的,所以把學(xué)習(xí)聚焦在自己的目標(biāo)上非常關(guān)鍵。
而目標(biāo)是什么則要根據(jù)自己的實(shí)際情形來定。
假設(shè)說你真的感覺自己的能力挺好,就想做基礎(chǔ)結(jié)構(gòu)型的東西,去做MapReduce,去做操作系統(tǒng)等等,那首先要認(rèn)識到的是干這個(gè)的人很少,競爭很激烈。
如果說在2005年美國只有5%的程序員是干這個(gè)的,那我估計(jì)今天在中國也頂多是這么個(gè)比例。
個(gè)人感覺,大學(xué)的計(jì)算機(jī)課程還真都是往這個(gè)方向培養(yǎng)人的,一旦真的走這個(gè)方向,那么大學(xué)的計(jì)算機(jī)課程還真用的上。需要好好學(xué)習(xí),天天向上。
當(dāng)然只上課也不行,把課上學(xué)的東西實(shí)踐起來也很關(guān)鍵(比如開源項(xiàng)目)。
這里麻煩的事情是,干這個(gè)的可能只有5%,很多人即使很努力也不一定擠的上去。
那么假設(shè)說一個(gè)人很現(xiàn)實(shí),說:國內(nèi)排名靠前的幾所學(xué)校湊湊也就5%了,競爭太激烈,我不選這個(gè)目標(biāo)方向,我還是95%里做做吧,那這個(gè)時(shí)候我應(yīng)該學(xué)什么?
我個(gè)人認(rèn)為主要要學(xué)好一些比較硬的,需要大塊時(shí)間學(xué)習(xí)的東西,而不要在花里胡哨的東西上多費(fèi)時(shí)間。
硬的東西是指:
數(shù)據(jù)結(jié)構(gòu)和基本算法。
不管是不是做基礎(chǔ)結(jié)構(gòu)性軟件,基本的數(shù)據(jù)結(jié)構(gòu)和算法知識還是要有的。
很可能不太會有自己從頭寫數(shù)據(jù)結(jié)構(gòu)和算法的機(jī)會,但如果復(fù)雜度不知道怎么算,鏈表、紅黑樹、哈希表的差別都不知道,那就怎么都玄。
精通一門編程語言
具體是那個(gè)可以根據(jù)實(shí)際情形來選。但這里強(qiáng)調(diào)的是語言,不是IDE和框架?梢酝ㄋ桌斫鉃槊總(gè)關(guān)鍵字背后的含義要整清楚。
這里的陷阱是學(xué)一堆語言,但那個(gè)都不精。
精讀一個(gè)有點(diǎn)規(guī)模的開源項(xiàng)目(至少要超過2萬行)
要找那種規(guī)模不太大,又比較有名的項(xiàng)目,一定要精讀,爭取每行都懂。
累積一定的代碼量
不算IDE幫助生成的,爭取也在2萬行之上。
面向?qū)ο蠛驮O(shè)計(jì)模式
這點(diǎn)最好配合著下一點(diǎn)一起做。
從頭考察一下某個(gè)框架
考察某個(gè)框架的內(nèi)存機(jī)制、線程機(jī)制等。
整個(gè)學(xué)習(xí)過程中最常見的陷阱是學(xué)會操作一堆IDE和框架的使用,但實(shí)際上這事兒價(jià)值不大,程序員的價(jià)值符合反木桶原理,啥都知道一點(diǎn)的,大多時(shí)候不如某個(gè)上精通的。
同時(shí)除非很特別的公司,大一點(diǎn)的公司并不期望畢業(yè)生過來就能干活。
有上面的基礎(chǔ)后,再突擊下,應(yīng)該可以面對大部分公司的筆試和面試。