以我的體會,弄懂了散離數(shù)學之后,我的編程能力就開始突飛猛進了。如果發(fā)現(xiàn)看數(shù)據(jù)結(jié)構(gòu)看不下去,請自學一下離散數(shù)學。
CS專業(yè)的能力不在于編程能力源碼,而是在于計算機科學本身的理論。如果僅僅是為了做一個coder,那就白費了四年的專業(yè)課程了。
數(shù)字邏輯、計算機組成原理、微機接口、計算機體系結(jié)構(gòu)、操作系統(tǒng)。
如果只談狹義的編程,以上專業(yè)完全用不上。這就難怪現(xiàn)在的coder整天只跑去寫js和php。現(xiàn)在能定制Android的人為什么能吃香?能編譯和優(yōu)化內(nèi)核的人為什么能超越99%的程序員?為什么現(xiàn)在很火的如機器人、無人機等領(lǐng)域急需要軟硬雙修的人做系統(tǒng)設(shè)計師?如果沒有弄懂以上專業(yè),連門都摸不到。
離散數(shù)學、數(shù)據(jù)結(jié)構(gòu)、算法分析、編譯原理、數(shù)據(jù)庫原理。
上述五門課是寫好程序的重要基礎(chǔ)理論。如果發(fā)現(xiàn)自己的程序怎么寫也寫不好,原因就是理論不過關(guān)。對著別人的開源項目,照貓畫虎也許能改出不錯的代碼,但人家為什么要這樣設(shè)計,這樣的代碼結(jié)構(gòu)為什么會很優(yōu)秀,優(yōu)秀在哪里。就說各種數(shù)據(jù)的關(guān)系,人家高手設(shè)計的數(shù)據(jù)表關(guān)系清晰,不會有冗余,而專業(yè)不過關(guān)的孩子,可能同樣的數(shù)據(jù)在程序中有N份,更新起來不僅慢源碼,而且常常因為訪問沖突導(dǎo)致程序死掉。
計算機科學專業(yè)之所以稱為計算機相關(guān)諸多專業(yè)設(shè)置中的“科班”,原因就是在于它的系統(tǒng)性,它是專門研究“計算機”本身的,而編程能力僅僅是其中之一。對于科班出身的程序員,完全不用擔心要學習一個全新的編程語言,完全不用擔心接觸一個全新的系統(tǒng)平臺。以上十門課程就是萬變不離其宗的“宗”。所有的API都可以查手冊,所有的平臺技術(shù)和缺陷都可以通過網(wǎng)絡(luò)加以學習,但唯獨系統(tǒng)分析和設(shè)計能力是沒辦法的。想要有精巧高效的設(shè)計,沒有對計算機硬件系統(tǒng)和軟件系統(tǒng)的原理有深刻的理解,是完全做不出來的。
像計算機圖形學、網(wǎng)絡(luò)技術(shù)等則屬于細分專業(yè),應(yīng)用面較窄,屬于那種用到才學也不遲的專業(yè),相對而言不太會影響對計算機系統(tǒng)的理解,因此可以稍微放低一點優(yōu)先級。
而對于軟件工程這一課程,這門課程跟個人的編程能力沒有什么關(guān)系。可能大多數(shù)程序員不會覺得有什么意思。對于沒有在大型團隊中有過經(jīng)歷的講師,能講好這一課程是有困難的,更不用說學生了。至于我當年學這門課程的時候,是一直心里犯嘀咕的,有很多問題是直到進入了企業(yè),接觸了CMM才得到解決。
計算機科學本身帶了”計算“兩字,如果往深處研究,其實一切都離不開數(shù)學。往往有很多應(yīng)用的問題,到了最后都歸結(jié)為抽象建模的問題,數(shù)學模型有了,算法也就有了。所以如果發(fā)現(xiàn)某些人的程序特別簡潔,可能要研究一下人家的數(shù)學水平是不是比較高。這也是回應(yīng)本文前面的答案:數(shù)學很重要,想要程序?qū)懙煤?,請學一下離散數(shù)學。