大學(xué)學(xué)計算機(jī)類哪個專業(yè)好點?
你好,非常榮幸為您解答!
我個人的一些經(jīng)歷和這個問題比較相關(guān), 打算詳細(xì)寫一寫, 希望能幫助到題主和其他有類似迷惑的朋友。
先講故事:2008年我進(jìn)入大學(xué)計算機(jī)系就讀本科。 剛來就震驚了,因為我和信息學(xué)奧賽圈內(nèi)出名的cqf是同班同學(xué)。 cqf嘛, 現(xiàn)在的后輩們估計不認(rèn)識, 但是在我們那個時候前三屆后三屆搞信息學(xué)奧賽或者關(guān)注一點點信息學(xué)奧賽的人都認(rèn)識他。此兄初中的時候參加高中的國家信息學(xué)奧賽就拿到了清華的保送名額,, 但是他沒去, 此后連年拿保送資格自然如探囊取物不在話下, 后來也順理成章拿到國際奧賽金牌。 他算法水平極強(qiáng), 16歲的時候就發(fā)明了一種很復(fù)雜的高效數(shù)據(jù)結(jié)構(gòu), 被后來的信息學(xué)奧賽選手廣為使用, 該數(shù)據(jù)結(jié)構(gòu)和相關(guān)算法至今我都沒看懂。在同齡的我對電腦的認(rèn)識還停留在“開開機(jī)就能玩WOW和WAR3了喲”的時候,他已經(jīng)寫過不少信息學(xué)奧賽的教材了。
總之我想說,剛進(jìn)大學(xué)的時候,我和cqf完全不在同一起跑線上。我只是那種"關(guān)注一點點信息學(xué)奧賽的人", 我全然不知道作為程序員要學(xué)什么、懂什么知識,也沒寫過一行C++代碼。而當(dāng)時cqf和一些同樣有信息學(xué)奧賽基礎(chǔ)的同學(xué)早就有成千上萬行代碼的積累了。大學(xué)第一年我還沒想明白自己該干什么,而在此期間cqf把一半的專業(yè)必修課都上完了(這些課我直到大三才上完)。大學(xué)第一年結(jié)束的時候,我想哎喲我這樣不行,得仔細(xì)想想自己該干啥。
在大二這一年我慢慢想清楚了自己的強(qiáng)項在哪里,然后轉(zhuǎn)系去了電子工程,后來學(xué)的不錯。如今我在大疆創(chuàng)新做程序員,寫無人飛行器的程序,參與一些很酷的產(chǎn)品的研發(fā),也有自己的團(tuán)隊做項目。自己覺得自己發(fā)展還不錯。深深覺得自己當(dāng)年做的選擇還算正確,對于“程序員怎么學(xué)數(shù)學(xué)”也有了一些自己的認(rèn)識。
故事先講到這里。順便說,后來cqf本科畢業(yè)的時候被一堆美國大學(xué)哄搶,最后去了斯坦福讀博士。
現(xiàn)在隨著計算機(jī)水平的進(jìn)步,各行業(yè)的自動化都在蓬勃進(jìn)展,計算機(jī)和代碼廣泛深入到了很多領(lǐng)域。現(xiàn)在誰罵“程序員是屌絲”,其實已經(jīng)是開了一個很大的地圖炮了,因為各行各業(yè)現(xiàn)在都有程序員。除了BAT(騰訊阿里百度)這類傳統(tǒng)互聯(lián)網(wǎng)公司之外,銀行、實業(yè)公司、研究機(jī)構(gòu)、政府機(jī)關(guān)等等組織和公司,都有做網(wǎng)站\分析數(shù)據(jù)\寫自動化輔助工具程序\寫組織管理程序等等多種需求。 那么種種程序員的工作,有多少工作需要數(shù)學(xué)呢?需要怎么樣的數(shù)學(xué)呢?
首先毫無疑問地,程序員,就是所有“對著電腦,用手敲下特定編程語言構(gòu)成的代碼的人”的總稱。我們要分析程序員的工作,也就是寫代碼。我個人把寫代碼的工作分為五類,不一定正確和全面啊,就是個概念性的分類:
1. 第一類是結(jié)構(gòu)性的工作。這類工作把特定的代碼、代碼段(函數(shù))、代碼庫構(gòu)成具有特定功能的程序,這些程序可以接受特定的數(shù)據(jù)、輸出特定的數(shù)據(jù)。例子如網(wǎng)站的界面、 軟件的界面、 軟件的一些可視化功能,再復(fù)雜一些有網(wǎng)站前端如何與后端通信、如何分配用戶請求給后端,如何處理兩個并行的程序、通信過程、計算機(jī)系統(tǒng)等等。結(jié)構(gòu)性工作需要的是經(jīng)驗以及對已有數(shù)據(jù)結(jié)構(gòu)的了解,并不需要特別高的數(shù)學(xué)水平。我說的經(jīng)驗指的是對于一個特定的想要實現(xiàn)的功能,如何選擇程序邏輯和數(shù)據(jù)結(jié)構(gòu)去實現(xiàn),這種選擇的過程需要程序員有大量讀寫代碼的基礎(chǔ),能夠把要實現(xiàn)的功能和自己以前實現(xiàn)過的或者看到過的功能聯(lián)系起來,設(shè)計出解決方案并實現(xiàn)。舉個例子,比如說網(wǎng)頁設(shè)計,通過HTML的元素構(gòu)建頁面,通過javascript給頁面元素以動態(tài),這個過程基本是“所見即所得的過程。
目前大部分的互聯(lián)網(wǎng)公司以及銀行系統(tǒng)需求的主要都是這類工作。為了實現(xiàn)特定功能,程序有非常復(fù)雜的結(jié)構(gòu),必須要很多人一同參與編寫和測試,因此才有了軟件工程這門學(xué)科的誕生。
結(jié)構(gòu)性工作的巔峰產(chǎn)物是計算機(jī)操作系統(tǒng)。計算機(jī)操作系統(tǒng)雖然復(fù)雜,但是其中涉及到的數(shù)學(xué)并不多,最復(fù)雜的數(shù)學(xué)就是如何處理多個任務(wù)的調(diào)度以及進(jìn)行內(nèi)存分配管理,都可以抽象成簡單的離散數(shù)學(xué)和排列組合問題。不過,1萬行的操作系統(tǒng)和100萬行的操作系統(tǒng)的數(shù)學(xué)理論復(fù)雜度是差不多的,他們主要的區(qū)別是結(jié)構(gòu)性的,而非數(shù)學(xué)上的。比如支持更多種CPU、硬件外設(shè)、網(wǎng)絡(luò)協(xié)議等等。
2. 第二類是效率性的工作。這類工作把特定的工程問題抽象成數(shù)學(xué)問題,然后發(fā)明新的數(shù)據(jù)結(jié)構(gòu)或者操作邏輯去優(yōu)化解決問題的效率。
最簡單的例子是排序,用冒泡排序或者快速排序給大批量數(shù)據(jù)做整理有顯著的時間差別,這個大家都知道的……計算機(jī)科學(xué)家們主要從事的就是這類工作,需要極高的組合數(shù)學(xué)和圖論等知識。早期的效率性問題通常依靠較為復(fù)雜的離散數(shù)學(xué),而近年來大部分問題都是應(yīng)用圖論來解決。
解決這類問題需要程序員對大部分的數(shù)據(jù)結(jié)構(gòu)都有深刻的理解,并且能夠進(jìn)行嚴(yán)格的理論分析,能夠清楚地指出某種數(shù)據(jù)結(jié)構(gòu)或操作邏輯的時間效率和內(nèi)存效率。上面談到的cqf 16歲發(fā)明的數(shù)據(jù)結(jié)構(gòu),就屬于這類工作……反正我對這類工作毫無天賦,繼離散數(shù)學(xué)敗了以后,后來的高級算法課成績也很差。
效率性工作的巔峰產(chǎn)物是一套書叫做《The Art of Computer Programming》,作者是斯坦福大學(xué)的教授Donald.E.Knuth。這部神書包含了人類已知的大部分計算機(jī)算法的理論分析和最優(yōu)形式, 50年來被公認(rèn)為算法領(lǐng)域的圣經(jīng)。吃透這套書,就可以拿到世界上最好的程序員的工作了(比爾蓋茨說如果誰看懂了這套書,就請把簡歷發(fā)給他……),當(dāng)然這很不容易。我至今只認(rèn)真看了第一本的前言
兼有前兩類工作的巔峰產(chǎn)物是淘寶網(wǎng),尤其是雙十一前后的淘寶網(wǎng)。不解釋太多Google這兩年在這方面做的不如淘寶,因為中國人實在太多了……
3. 第三類是邏輯性的工作。指的是用計算機(jī)模擬人類的認(rèn)知邏輯,這類工作包括語音識別、文字理解、信息檢索、數(shù)據(jù)分析等等。這類工作最早屬于高大上的人工智能、自然語言處理研究,后來隨著互聯(lián)網(wǎng)的興起開始逐步進(jìn)入大眾視野。這類工作的主要基礎(chǔ)是概率統(tǒng)計、機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的模型,包含的數(shù)學(xué)知識主要有概率、線性代數(shù)和圖論。由于互聯(lián)網(wǎng)公司和金融公司對于機(jī)器學(xué)習(xí)的需求,相關(guān)的基礎(chǔ)知識已經(jīng)發(fā)展得非常成熟,如何學(xué)習(xí)這類知識也已經(jīng)有很規(guī)范的教程。如今在硅谷,程序員不懂點機(jī)器學(xué)習(xí),都不好意思出門和人打招呼。
這類工作的應(yīng)用大約是這樣的:通過分析用戶在淘寶上買東西的數(shù)據(jù),推測他還會買啥;通過分析股市的變化以及一些市場信息,推測股市下一步漲還是跌。還有就是分析搜索關(guān)鍵詞給出搜索結(jié)果,分析語音信號轉(zhuǎn)化成文字等等。這些不同的應(yīng)用都是為了分析數(shù)據(jù),都有類似的處理模型和數(shù)學(xué)方法。 近年來在機(jī)器學(xué)習(xí)的基礎(chǔ)上人們發(fā)明了深度學(xué)習(xí)。這個我不是很懂,不好加以評論。但是我知道這類工作的主要目的是模仿人類的認(rèn)知能力。特別地,機(jī)器學(xué)習(xí)領(lǐng)域最基礎(chǔ)最出名的模型“神經(jīng)網(wǎng)絡(luò)”,已經(jīng)被生物學(xué)家證明是比較好的對于人類大腦邏輯的模擬。
這類工作說簡單也簡單,說難也可以很難。你只需要學(xué)過大學(xué)一年級的線性代數(shù),就可以理解神經(jīng)網(wǎng)絡(luò)、支持向量機(jī)等機(jī)器學(xué)習(xí)的模型,然后自己訓(xùn)練模型去分析數(shù)據(jù)了——這也是大部分硅谷公司的需求。百度新任首席科學(xué)家Andrew Ng在Coursera上有個機(jī)器學(xué)習(xí)的公開課,講完神經(jīng)網(wǎng)絡(luò)之后他就說:“Good,你現(xiàn)在已經(jīng)比大部分硅谷工程師更加了解機(jī)器學(xué)習(xí)了。”(真的不是黑么)然而機(jī)器學(xué)習(xí)的模型背后的數(shù)學(xué)非常深奧,比如說神經(jīng)網(wǎng)絡(luò)可以等效成一些復(fù)雜的高維拓?fù)浣Y(jié)構(gòu),網(wǎng)絡(luò)的訓(xùn)練實際上是這些拓?fù)浣Y(jié)構(gòu)做拓?fù)渥儞Q的過程。比如如果待訓(xùn)練的數(shù)據(jù)維數(shù)非常高,要選擇合適的函數(shù)降維。為了理解這些東西,需要深入學(xué)習(xí)線性代數(shù)、拓?fù)鋵W(xué)、數(shù)學(xué)分析等數(shù)學(xué)知識。其實我說的我也不是很懂,我沒系統(tǒng)學(xué)過拓?fù)洹?/p>
兼有前三類工作的巔峰產(chǎn)物是IBM的計算機(jī)waston。2011年Waston在美國的智力問答比賽“Jeopardy!” 中擊敗了兩位經(jīng)驗老道的人類選手。這件事之所以令人震驚,是因為Jeopardy中主持人提出的問題大部分無法直接理解,而是隱藏在英語俚語和雙關(guān)語當(dāng)中的巧妙語言。Waston在人工智能史上的地位遠(yuǎn)遠(yuǎn)超過當(dāng)年擊敗國際象棋大師的Deep Blue。
4. 第四類是仿真性的工作。這類工作主要集中在游戲和動畫領(lǐng)域,其他邊緣一點但是更加高要求的有飛行器設(shè)計、氣象、天文等。仿真意味著在電腦的環(huán)境中虛擬出現(xiàn)實世界,這就需要程序員理解力學(xué)和光學(xué)等物理學(xué)理論。比如最簡單的,任何3D游戲引擎開發(fā)的第一步都是學(xué)習(xí)剛體變換等力學(xué)知識,用來把模擬出來的小人或者飛船等物體進(jìn)行移動。剛體變換有很多種表示方法(茴香豆的茴字有四種寫法……),背后有不少數(shù)學(xué)理論。此外為了仿真毛發(fā)、浪花、濺起的塵土等等這類細(xì)小的物體,也有自己相關(guān)的物理和數(shù)學(xué)知識。
不同的行業(yè)對于仿真的需求不一樣,因此要求的專業(yè)知識也不同。游戲和動畫的需求是盡可能地真實表現(xiàn)場景,而飛行器設(shè)計上用的仿真更強(qiáng)調(diào)空氣動力學(xué)和結(jié)構(gòu)力學(xué),因為要用仿真分析飛行器飛行時的受力情況。天文、氣象和其他需求仿真的行業(yè)又有各自的側(cè)重點和知識領(lǐng)域,各個行業(yè)應(yīng)該也都有自己暫時解決不了的問題。這些具體的知識區(qū)別我也不是很清楚,按照我對某些行業(yè)的理解,可能無非就是牛頓力學(xué)、動力學(xué)、微積分、微分方程和線性代數(shù),因為都是在經(jīng)典力學(xué)范疇內(nèi)的物理,就那么點東西,從本科畢業(yè)開始算,把數(shù)學(xué)認(rèn)真學(xué)個三年左右之后就能進(jìn)入某個行業(yè)了。
這類工作的巔峰產(chǎn)物隱藏在大眾視線之外。比方說美軍號稱在海灣戰(zhàn)爭開始之前,就已經(jīng)通過仿真軟件把戰(zhàn)斗推演過好多次了,最后真打起來的時候“就像打電腦游戲一樣”(語出《失控》)。再比如說,現(xiàn)在很多超級計算機(jī)都被用在氣象預(yù)測上。2008年北京奧運(yùn)會前夕,北京氣象局就購買了一臺計算能力排全球前十的計算機(jī),用來在奧運(yùn)會期間提供氣象預(yù)測。當(dāng)然,這些巔峰產(chǎn)物依然有很大的局限性。美國人預(yù)測不出他們會陷入伊拉克和阿富汗的戰(zhàn)爭泥潭,北京氣象局預(yù)測不出幾年后北京常常會有霧霾。當(dāng)然我們也不能太強(qiáng)求,畢竟這種工作有點奪取上帝視角的傾向。這都說明了在仿真計算領(lǐng)域,人類還有很長的路要走。
5. 第五類是物理性的工作。“物理”指的是這類工作中產(chǎn)生的代碼要直接與物理世界發(fā)生接觸,比如從傳感器獲取世界的信息,控制執(zhí)行器進(jìn)行特定的運(yùn)動等等。這類工作主要集中在航空航天工業(yè)以及機(jī)器人產(chǎn)業(yè)當(dāng)中,是我現(xiàn)在主要從事的工作。 這類工作主要分為兩部分,一部分是觀測(如何通過傳感器數(shù)據(jù)了解自身和世界的狀態(tài)),另一部分是控制(如何根據(jù)自身和世界的狀態(tài)規(guī)劃自身的下一步運(yùn)動),兩者都需求很多物理學(xué)和數(shù)學(xué)的知識,控制需要剛體力學(xué)和運(yùn)動學(xué)、系統(tǒng)理論、控制論等,觀測需要信號處理、系統(tǒng)建模、機(jī)器視覺、概率統(tǒng)計、優(yōu)化等等。
物理性工作的一個主要特點是,代碼與硬件以及機(jī)械緊密耦合,測試很困難(想想該怎么給一顆導(dǎo)彈debug……),所以通常這類工作要和仿真類工作同步展開,先在仿真平臺上做測試,然后再移植到真的機(jī)械上面去。而且程序員要深刻理解運(yùn)行自己代碼的平臺的硬件和機(jī)械的性能和極限,一行錯誤的代碼很有可能會導(dǎo)致嚴(yán)重的事故(一個小數(shù)點點錯導(dǎo)致火箭發(fā)射失敗這種故事我們小時候應(yīng)該都聽說過)。
這類工作近年來也開始進(jìn)入普通行業(yè),比如任何安卓手機(jī)現(xiàn)在都內(nèi)置慣性導(dǎo)航元件,上面說的“觀測”中的算法就可以寫在手機(jī)里,用來獲取手機(jī)相對于世界的位置。 這類工作的巔峰產(chǎn)物是Boston Dynamics公司制造的大狗機(jī)器人和Petman機(jī)器人,可以自行百度了解一下。
好,接著說故事。
后來我自己想明白的問題是。大學(xué)的計算機(jī)科學(xué)系主要教育人學(xué)習(xí)如何從事第二類工作,但是世界上還有其他幾類程序員的工作是大學(xué)不教授的,而我的天賦和興趣主要在第三類和第五類工作上。其中物理性的工作所需要的知識,主要是電子工程、物理和機(jī)械系才能學(xué)到。所以我后來轉(zhuǎn)去了電子系,學(xué)得還不錯。而且通過對控制論和機(jī)器人學(xué)的學(xué)習(xí),我對數(shù)學(xué)也有了全新的認(rèn)識。
(下面是很個人的觀點,不一定正確啊,請輕拍)
我們高中學(xué)的數(shù)學(xué),以及大學(xué)一年級學(xué)的微積分,其實都不是數(shù)學(xué)的本質(zhì),而是數(shù)學(xué)工具。數(shù)學(xué)的本質(zhì)是建立一套嚴(yán)密的體系來描述世界,揭示世界本身的嚴(yán)格表示形式。當(dāng)我在學(xué)習(xí)了機(jī)器人運(yùn)動學(xué)之后,再回頭去看代數(shù)與幾何,就明白了人們?yōu)槭裁匆⒎N種復(fù)雜的代數(shù)結(jié)構(gòu)并且去分析他們的性質(zhì)。在學(xué)習(xí)了概率機(jī)器人理論以后,再回頭去看概率和統(tǒng)計,就明白了期望和方差這些不知道是確定還是不確定的玩意到底有什么用。我感覺其實學(xué)習(xí)大部分的數(shù)學(xué)知識都不存在有沒有天賦這樣一個說法,目前好的數(shù)學(xué)教材非常多,而且都把知識解釋得非常清楚,這本書看不懂了完全可以換一本再看。任何智力正常的人,在系統(tǒng)的訓(xùn)練和合理的時間投入之后,都可以學(xué)會數(shù)學(xué)系本科涵蓋的一切數(shù)學(xué)知識。學(xué)習(xí)數(shù)學(xué)的關(guān)鍵在于有沒有興趣去欣賞它抽象的美,以及是不是愿意投入時間。 一開始我是不太會欣賞數(shù)學(xué)的,我高中數(shù)學(xué)很差,高考數(shù)學(xué)只有100多幾分。大學(xué)一開始學(xué)微積分也學(xué)得很差。但是我在大二大三期間寫機(jī)器人程序的時候發(fā)現(xiàn)了代數(shù)的重要性,學(xué)會了欣賞數(shù)學(xué),于是就能學(xué)好數(shù)學(xué)了。大四的時候到美國交換,在一個還算不錯的大學(xué)的數(shù)學(xué)系上了兩門數(shù)學(xué)課,都比許多數(shù)學(xué)專業(yè)的同學(xué)學(xué)得好。研究生的時候項目比較多,不太專心上課,成績都一般,但是我能感覺出自己數(shù)學(xué)水平的進(jìn)步。我沒有再回頭去學(xué)離散數(shù)學(xué)和算法,所以不知道現(xiàn)在自己在這方面進(jìn)步如何,不過反正我不再搞相關(guān)的工作了,也沒時間去探究。借用一個名言,我覺得,以大部分程序員所需的數(shù)學(xué)的難易程度,根本沒到拼天賦的時候。
總而言之,我想說,題主還年輕,你既不太了解數(shù)學(xué)是什么,也不太了解程序員是什么。這個時候也不用擔(dān)心太多,安心把功課學(xué)好,多了解了解技術(shù)新聞,有時間的話嘗試一些編程的訓(xùn)練,比如去coursera上找公開課聽一聽。除了學(xué)寫C/C++,Java這類程序之外,也可以嘗試學(xué)習(xí)HTML和網(wǎng)頁編程,兩者的思路不太相同。你對數(shù)學(xué)和編程的認(rèn)識會不斷改變,在幾年之后才完全定形的。