數(shù)學(xué)課程(線性代數(shù)、概率統(tǒng)計(jì)、離散數(shù)學(xué)、高等數(shù)學(xué)/數(shù)學(xué)分析)算法與數(shù)據(jù)結(jié)構(gòu)可計(jì)算理論構(gòu)成原理與架構(gòu)操作系統(tǒng)
另外,這個(gè)問題其實(shí)意義不大,因?yàn)槿绻阆氤蔀橐幻A(chǔ)扎實(shí)的CSer,其他課程即使不在TOP5你還是要學(xué)的,比如數(shù)字電子/模擬電子、編譯原理、數(shù)據(jù)庫、計(jì)算機(jī)網(wǎng)絡(luò)...
一個(gè)更有意義的問題是:學(xué)了這么多課后,如何把它們串聯(lián)起來? 在我的腦海里,這些教訓(xùn)不再是離散的點(diǎn),而是一個(gè)連成一體的圖表,帶著俯視的感覺,然后真正形成我自己的。 核心競爭力? 關(guān)鍵在于抽象能力。
第一次接觸抽象是在大三學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的時(shí)候。 我清楚地記得,我正在學(xué)習(xí)一個(gè)概念,叫做抽象數(shù)據(jù)類型,大致意思是數(shù)據(jù)結(jié)構(gòu)。 接口是一回事,實(shí)現(xiàn)又是另一回事。 比如棧,作為用戶你只需要知道它有push、pop等方法,但不需要知道它的底層實(shí)現(xiàn)是數(shù)組還是列表。
通俗地說,抽象就是你做好自己的事,知道別人能為你做什么。 至于別人如何幫你完成,你不需要知道。 這種簡單的想法極大地提高了開發(fā)人員的效率,讓開發(fā)人員只關(guān)注要解決的問題,而不是瑣碎的事情。
孟巖在文章中還提到了“抓住重點(diǎn)”的事情。 雖然他沒有明確提到抽象這個(gè)詞,但他的意思和抽象表達(dá)是一樣的:
我主張,掌握了基礎(chǔ)之后,學(xué)習(xí)任何新東西時(shí),一定要抓住主線,突出重點(diǎn)。 對(duì)于關(guān)鍵理論的研究,必須集中精力快速解決問題。 而那些瑣碎的、非必要的知識(shí)內(nèi)容可以留給零碎的練習(xí)。
原因是這樣的。 任何高深的知識(shí)內(nèi)容中,只有一小部分是創(chuàng)新的、具有重大影響力的,而其他很多東西都是瑣碎的、非本質(zhì)的。 所以,當(dāng)你專注學(xué)習(xí)的時(shí)候,一定要抓住真正重要的部分,其他的就交給練習(xí)吧。 對(duì)于關(guān)鍵知識(shí),只有集中研究其理論,才能保證系統(tǒng)性、連貫性、正確性。 對(duì)于那些側(cè)面的細(xì)節(jié),只有邊做邊學(xué),才能讓你知道它們真正的價(jià)值是大還是小,你能不能保留它。 創(chuàng)造更生動(dòng)的印象。 如果你把精力用在了錯(cuò)誤的地方,比如把大量的時(shí)間集中在學(xué)習(xí)那些手冊(cè)上查一下的小技巧上,而零碎地關(guān)注真正重要的思想性的東西,那么你一定會(huì)事半功倍。 甚至適得其反。
計(jì)算機(jī)專業(yè)課程可以通過抽象來連接:每一門課程要做的就是利用下層提供的接口來實(shí)現(xiàn)功能,然后向上層提供接口。 這樣的抽象層幾乎構(gòu)成了所有的專業(yè)課程。
讓我們首先看看頂層的問題。 當(dāng)我第一次學(xué)習(xí)編程時(shí),我會(huì)首先學(xué)習(xí)入門課程或編程入門課程。 我當(dāng)時(shí)選修的入門課程叫《編程》。 課程內(nèi)容是介紹一些問題,然后介紹一些編程語言的知識(shí)。 作業(yè)是一些編程問題。 ,比如八皇后、素性測試等比較常規(guī)的編程題。 本課程的目的一般是引入“問題”,引入計(jì)算機(jī)科學(xué)中具有挑戰(zhàn)性的問題,讓學(xué)生對(duì)計(jì)算機(jī)專業(yè)有一個(gè)感性的認(rèn)識(shí),而不是學(xué)習(xí)具體的編程語言或算法,所以這類課程 一般用于編程。
下一個(gè)層次是算法和數(shù)據(jù)結(jié)構(gòu)。 該層的目的是學(xué)習(xí)/實(shí)現(xiàn)各種算法/數(shù)據(jù)結(jié)構(gòu)并將其提供給上層功能。 比如對(duì)于排序,問題解決者只需要知道這里應(yīng)該使用快速排序而不是選擇排序,而快速排序的實(shí)現(xiàn)則留給本層的開發(fā)人員,這樣各種優(yōu)化就可以對(duì)上層透明層,例如小數(shù)組插入。 排序、中值樞軸、三路快速排序等等,這些優(yōu)化的調(diào)用者根本不需要知道。 他只需要知道:哇,這個(gè)庫提供的快速排序真快。
下一層是語言層。 畢竟,所有算法都必須用某種語言來實(shí)現(xiàn)。 這一層的存在使得算法的設(shè)計(jì)可以脫離特定的語言。 不同的語言提供不同的抽象。 例如,函數(shù)式語言比命令式語言具有更高的抽象級(jí)別。 更高的抽象級(jí)別意味著更多地關(guān)注問題本身(無需考慮內(nèi)存布局、CPU 使用情況等)和更少的代碼。 數(shù)量。
再往下一層,是編譯器/解釋器。 我們用高級(jí)語言編寫代碼,CPU上執(zhí)行的是機(jī)器碼,所以這個(gè)抽象層幫助我們做這個(gè)轉(zhuǎn)換。 這個(gè)抽象層的優(yōu)點(diǎn)是高級(jí)代碼的編寫者不需要知道程序運(yùn)行的操作系統(tǒng)和硬件平臺(tái)。 該程序可以在任何具有該語言的編譯器/解釋器的機(jī)器上運(yùn)行(從而實(shí)現(xiàn)跨平臺(tái))。 應(yīng)用層開發(fā)人員不需要知道高級(jí)語言到機(jī)器代碼的轉(zhuǎn)換是如何實(shí)現(xiàn)的。 畢竟編譯器優(yōu)化的編寫和優(yōu)化完全是一個(gè)團(tuán)隊(duì)的工作量。 開發(fā)人員專注于解決問題,編譯器負(fù)責(zé)轉(zhuǎn)換。 高效的機(jī)器代碼,各自做自己的事情,就是抽象點(diǎn)。
下一個(gè)層次是操作系統(tǒng)。 操作系統(tǒng)將硬件(CPU、內(nèi)存、磁盤、網(wǎng)卡等)抽象給開發(fā)者,并以...的形式向用戶提供服務(wù)。 操作系統(tǒng)的設(shè)計(jì)是最抽象的。 虛擬內(nèi)存和進(jìn)程讓程序認(rèn)為自己擁有對(duì)內(nèi)存和CPU的獨(dú)占訪問權(quán),同時(shí)隔離不同的進(jìn)程以防止惡意進(jìn)程。 文件系統(tǒng)可以讓用戶輕松讀取存儲(chǔ)的數(shù)據(jù),而無需直接操作底層硬盤; 文件描述符抽象了底層設(shè)備(管道/文件///...)。
下一層是 ISA(集),通常稱為軟件和硬件之間的接口。 這個(gè)俗名非常形象。 指令集架構(gòu),簡單來說就是機(jī)器代碼,也可以理解為協(xié)議。 ISA標(biāo)準(zhǔn)制定者指定了一組指令集(例如x86、SPARC),然后編譯器開發(fā)人員需要根據(jù)這個(gè)標(biāo)準(zhǔn)/協(xié)議編寫相應(yīng)的編譯器; CPU制造商需要根據(jù)這個(gè)標(biāo)準(zhǔn)/協(xié)議來創(chuàng)建支持該集合的產(chǎn)品。 ISA CPU(例如Intel CPU支持x86/)。 換句話說,如果軟件/硬件是按照這個(gè)ISA設(shè)計(jì)的,那么它們是可以連接的。
下一個(gè)層次是組成原則和架構(gòu)。 這一層要做的就是利用數(shù)字電路(組合電路和鎖存器)提供的功能來設(shè)計(jì)一個(gè)可以實(shí)現(xiàn)某種ISA的CPU網(wǎng)校頭條,讓編譯器生成的指令可以在這個(gè)CPU上運(yùn)行。 在大學(xué)里,通常有一門叫做“計(jì)算機(jī)組成原理”的課程。 一開始,他們學(xué)習(xí)單周期CPU的實(shí)現(xiàn)(取指、解碼、執(zhí)行……)。 為了提高效率,他們還提出實(shí)行管道化。 為了探索更高的效率,后面我會(huì)選修一門叫做“計(jì)算機(jī)體系結(jié)構(gòu)”的課程。 本課程的目的是探索更高的并行性并創(chuàng)建更快的 CPU。 那么這一層是如何使用數(shù)字電路提供的功能的呢? 舉兩個(gè)典型的例子:一是CPU有ALU模塊進(jìn)行計(jì)算,ALU模塊是一個(gè)組合電路(輸入確定,輸出確定); 其次,輸入值在時(shí)鐘的每個(gè)上升沿保存在流水線寄存器中。 在這個(gè)時(shí)鐘周期內(nèi),組合電路將根據(jù)這個(gè)新值計(jì)算結(jié)果,并將其傳送到下一級(jí)流水線寄存器的輸入,等待下一個(gè)時(shí)鐘上升沿的到來。 這里的流水線寄存器就是某個(gè)鎖存器的實(shí)現(xiàn),CPU開發(fā)者不需要知道這個(gè)數(shù)字電路模塊是如何實(shí)現(xiàn)的。
下一個(gè)層次是數(shù)字電路。 本課程的目的是教學(xué)生如何使用基本的門電路(NAND或門)來實(shí)現(xiàn)一些高級(jí)功能(解碼器、多路復(fù)用器、鎖存器、時(shí)序電路...),然后為上層提供功能。 上數(shù)字電路課就是一個(gè)搭磚砌房子的過程,從基本的門電路開始,慢慢搭建復(fù)雜的電路。 數(shù)字電路不需要關(guān)心基本門電路是如何實(shí)現(xiàn)的,因?yàn)檫@正是模擬電路向上層提供的功能。
下一層是模擬電路。 該層實(shí)現(xiàn)基本門電路,例如“與”或“非”。 例如,非門、與非門、或非門可以由多個(gè)p/n型MOS晶體管構(gòu)成,與門可以由與非門和非門連接構(gòu)成,或門可以由多個(gè)p/n型MOS晶體管構(gòu)成。通過連接或非門和非門。 門組成。 很多同學(xué)認(rèn)為模擬電子學(xué)不是計(jì)算機(jī)專業(yè)學(xué)生必須學(xué)習(xí)的計(jì)算機(jī)專業(yè),但我認(rèn)為恰恰相反,它是你構(gòu)建整個(gè)計(jì)算機(jī)抽象層次的基石。
再往下一層,就不是計(jì)算機(jī)領(lǐng)域的研究問題了。
當(dāng)然,還有很多專業(yè)課程我沒有提到,比如網(wǎng)絡(luò),它是操作系統(tǒng)提供的抽象之一,以文件的形式提供給用戶; 在網(wǎng)絡(luò)協(xié)議棧實(shí)現(xiàn)的細(xì)節(jié)中,有幾個(gè)抽象層。 就是著名的OSI七層網(wǎng)絡(luò)模型(有時(shí)抽象為五層:、、、、)。 你可以自己回憶一下你在大學(xué)里學(xué)過哪些專業(yè)課程以及它們應(yīng)該處于哪個(gè)抽象層次。
如果脫離計(jì)算機(jī)領(lǐng)域,看得更高一點(diǎn),你會(huì)發(fā)現(xiàn)整個(gè)計(jì)算機(jī)領(lǐng)域似乎都在為其他領(lǐng)域提供功能計(jì)算機(jī)專業(yè),而隱藏了細(xì)節(jié)。 技術(shù)應(yīng)用廣泛應(yīng)用于醫(yī)療、交通、餐飲、娛樂、安防等領(lǐng)域。