程式設計高手必備的思維模式:為什麼抽象在計算機科學中如此重要
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年代就出現了,並在當前火熱的雲計算中大放異彩。
難怪計算機科學中有一句名言,“計算機科學中沒有什麼是不能透過增加一層抽象解決的”,當然後面還有半句,“除了存在太多抽象層這個問題”。
總結
抽象的目的其實就是透過移除不必要的資訊從而減少複雜度,因此抽象可以讓我們更加關注重點。
在這裡沒有用太多程式語言中的示例來講解,其實這也是一種抽象,那就是學習程式設計也好其它領域也罷,最好理解“頂層原理”,這個是通用的。個人一直有這樣一種觀點,那就是學計算機不是學一堆語言語法,那不過就是一些文法規則的實現細節罷了,程式設計高手之所以是高手不在於比別人有多瞭解一門程式語言有什麼用法,最重要的還是這所說的“頂層原理”,那麼頂層原理在哪裡呢?就存在於我們常說的基礎中:作業系統、編譯原理、網路、資料結構演算法等。
程式設計高手必備的思維模式:為什麼抽象在計算機科學中如此重要
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年代就出現了,並在當前火熱的雲計算中大放異彩。
難怪計算機科學中有一句名言,“計算機科學中沒有什麼是不能透過增加一層抽象解決的”,當然後面還有半句,“除了存在太多抽象層這個問題”。
總結
抽象的目的其實就是透過移除不必要的資訊從而減少複雜度,因此抽象可以讓我們更加關注重點。
在這裡沒有用太多程式語言中的示例來講解,其實這也是一種抽象,那就是學習程式設計也好其它領域也罷,最好理解“頂層原理”,這個是通用的。個人一直有這樣一種觀點,那就是學計算機不是學一堆語言語法,那不過就是一些文法規則的實現細節罷了,程式設計高手之所以是高手不在於比別人有多瞭解一門程式語言有什麼用法,最重要的還是這所說的“頂層原理”,那麼頂層原理在哪裡呢?就存在於我們常說的基礎中:作業系統、編譯原理、網路、資料結構演算法等。