打開網(wǎng)易新聞 查看精彩圖片

編程高手必備的思維模式:為什么抽象在計算機科學中如此重要?

一、沒有抽象的世界。

想象這樣一種場景,如果我們的語言中沒有代詞這種形式,那么我們想表達“張三是個好人“該怎么說呢?可能是這樣的:

”你還記得我說過的人吧,穿著邋邋遢遢的,公司在中關(guān)村,整天背著個雙肩包,寫代碼的,天天996,這個人是個好人“,看到了吧,在沒有代詞的情況下我們想表達一件事是非常困難的,因為我們需要具體的描述清楚所有細節(jié),但是有了”張三“這種抽象后,一切都簡單了,我們只需要針對張三這種抽象進行交流,再也不需要針對一堆細節(jié)進行交流了,抽象大大增強了表現(xiàn)力,這就是抽象的力量。

二、接下來回到計算機世界。

1、編程語言層面。

我們在使用計算機時其實抽象就在發(fā)揮作用,在Word中編輯文檔時我們不會去考慮CPU是如何處理這些字符的,這些字符是如何被保存到磁盤的。在瀏覽網(wǎng)頁時我們不需要關(guān)心網(wǎng)頁中的數(shù)據(jù)是如何在網(wǎng)絡(luò)中傳輸?shù)摹g覽器是怎樣把這些數(shù)據(jù)適當?shù)匿秩境鰜淼?,我們需要做的僅僅就是在Word中簡單的輸入字符,用鼠標或者手指滑動網(wǎng)頁。因此只要在使用計算機,那么抽象就在發(fā)揮作用,只不過是我們沒有意識到而已,而之所以我們沒有意識到是因為抽象工作得太好了。

1、編程語言層面。

程序員也可以從抽象中獲得極大好處,因為軟件是復(fù)雜的,但程序員可以通過抽象來控制復(fù)雜度,方法就是抽象。比如一個好的設(shè)計就是對某項功能抽象出一組簡單的API,這樣其他程序員在使用這個模塊時只需要關(guān)注這幾個簡單的API而不是一堆內(nèi)部實現(xiàn)細節(jié)。不同的編程語言提供了不同的機制來讓程序員實現(xiàn)這種抽象。比如面向?qū)ο笳Z言(OOP)的一大優(yōu)勢就是讓程序員方便進行抽象,這樣類的使用者就無需關(guān)心類的實現(xiàn)了,更不用提OOP中的多態(tài)、抽象類等,有了這些程序員可以只針對抽象而不是具體實現(xiàn)進行編程,這樣的程序會有更好的可擴展性,也能更好的應(yīng)對需求的變化。

3、系統(tǒng)設(shè)計層面。

計算機從本質(zhì)上將就是在抽象的基礎(chǔ)上建立起來的。計算機科學中的一大主題其實就是在不同層面提供抽象表示從而對外屏蔽實現(xiàn)細節(jié)。對于CPU來說,其對外提供的是一堆指令集,程序員只需要使用這些指令就可以指揮CPU工作了,這樣就無需從細節(jié)上知道CPU是如何取出指令、執(zhí)行指令的。在操作系統(tǒng)層面,我們將I/O設(shè)備抽象成了文件、把程序的運行抽象成了進程、把程序運行時占用的內(nèi)存抽象成了虛擬內(nèi)存、又把進程和進程運行以來的環(huán)境抽象成了容器、最后把所有的一切包括操作系統(tǒng)、進程、CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)抽象成了虛擬機?,F(xiàn)在虛擬機技術(shù)是云計算的基石,實際上這種技術(shù)在上世紀60年代就出現(xiàn)了,并在當前火熱的云計算中大放異彩。難怪計算機科學中有一句名言,“計算機科學中沒有什么是不能通過增加一層抽象解決的”,當然后面還有半句,“除了存在太多抽象層這個問題”。

總結(jié)。

抽象的目的其實就是通過移除不必要的信息從而減少復(fù)雜度,因此抽象可以讓我們更加關(guān)注重點。在這里沒有用太多編程語言中的示例來講解,其實這也是一種抽象,那就是學習編程也好其它領(lǐng)域也罷,最好理解“頂層原理”,這個是通用的。個人一直有這樣一種觀點,那就是學計算機不是學一堆語言語法,那不過就是一些文法規(guī)則的實現(xiàn)細節(jié)罷了,編程高手之所以是高手不在于比別人又多了解一門編程語言有什么用法,最重要的還是這所說的“頂層原理”,那么頂層原理在哪里呢?就存在于我們常說的基礎(chǔ)中:操作系統(tǒng)、編譯原理、網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)算法等。

打開網(wǎng)易新聞 查看精彩圖片