天天看點

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

計算科學中的所有問題都可以通過增加一層抽象來解決。

All problems in computer science can be solved by another level of indirection.

沒有抽象的世界

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

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

接下來回到計算機世界。

計算機使用層面

我們在使用計算機時其實抽象就在發揮作用,在Word中編輯文檔時我們不會去考慮CPU是如何處理這些字元的,這些字元是如何被儲存到磁盤的。在浏覽網頁時我們不需要關心網頁中的資料是如何在網絡中傳輸的、浏覽器是怎樣把這些資料适當的渲染出來的,我們需要做的僅僅就是在Word中簡單的輸入字元,用滑鼠或者手指滑動網頁。

是以隻要在使用計算機,那麼抽象就在發揮作用,隻不過是我們沒有意識到而已,而之是以我們沒有意識到是因為抽象工作的太好了。

程式設計語言層面

程式員也可以從抽象中獲得極大好處,因為軟體是複雜的,但程式員可以通過抽象來控制複雜度,方法就是抽象。

比如一個好的設計就是對某項功能抽象出一組簡單的API,這樣其它程式員在使用這個子產品時隻需要關注這幾個簡單的API而不是一堆内部實作細節。

不同的程式設計語言提供了不同的機制來讓程式員實作這種抽象。

比如面向對象語言(OOP)的一大優勢就是讓程式員友善進行抽象,這樣類的使用者就無需關心類的實作了,更不用提OOP中的多态、抽象類等,有了這些程式員可以隻針對抽象而不是具體實作進行程式設計,這樣的程式會有更好的可擴充性,也能更好的應對需求的變化。

系統設計層面

計算機從本質上将就是在抽象的基礎上建立起來的。計算機科學中的一大主題其實就是在不同層面提供抽象表示進而對外屏蔽實作細節。

對于CPU來說,其對外提供的是一堆指令集,程式員隻需要使用這些指令就可以指揮CPU工作了,這樣就無需從細節上知道CPU是如何取出指令、執行指令的。

在作業系統層面,我們将I/O裝置抽象成了檔案、把程式的運作抽象成了程序、把程式運作時占用的記憶體抽象成了虛拟記憶體、又把程序和程序運作以來的環境抽象成了容器、最後把所有的一切包括作業系統、程序、CPU、記憶體、磁盤、網絡抽象成了虛拟機。現在虛拟機技術是雲計算的基石,實際上這種技術在上世紀60年代就出現了,并在目前火熱的雲計算中大放異彩。

難怪計算機科學中有一句名言,“計算機科學中沒有什麼是不能通過增加一層抽象解決的”,當然後面還有半句,“除了存在太多抽象層這個問題”。

總結

抽象的目的其實就是通過移除不必要的資訊進而減少複雜度,是以抽象可以讓我們更加關注重點。

在這裡沒有用太多程式設計語言中的示例來講解,其實這也是一種抽象,那就是學習程式設計也好其它領域也罷,最好了解“頂層原理”,這個是通用的。個人一直有這樣一種觀點,那就是學計算機不是學一堆語言文法,那不過就是一些文法規則的實作細節罷了,程式設計高手之是以是高手不在于比别人有多了解一門程式設計語言有什麼稀奇古怪的用法,更重要的還是這所說的“頂層原理”,那麼頂層原理存在哪裡呢?就存在于我們常說的基礎中:作業系統、編譯原理、網絡、資料結構算法等。

更多精彩内容,歡迎關注公衆号“碼農的荒島求生”。

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