築夢角落

致力於用最生活化的例子讓所有人都能懂程式,也喜歡分享動漫、小說心得,以及自己的所見所聞、所思所想。

抽象化是什麼?淺談概念轉換跟降低相關性的程式哲學

最後更新時間 : 2022-08-10 | viewed : 77

賦予0跟1的組合一個意義,稱它們為檔案。

 

寫程式有過一段時間的人,應該或多或少都聽過抽象化這個詞。

但是要談論程式中的抽象化不是一件容易的事,因為抽象化這個名詞本身帶有歧義,當我們在談論不同層面的問題時,它可以具有不同的意思。

這次我想嘗試從概念轉換降低相關性兩個方面來討論,因為這也是程式抽象化的主要目的

 

 

什麼是抽象?


如果去問不同的人「抽象是什麼意思?」,我相信會得到很多不同的答案,就像莎士比亞說的「一千個讀者,一千個哈姆雷特。」

但可以肯定的是,抽象並不意味著模糊,這是兩種完全不同的概念。(模糊理論是一門學問,也被運用於人工智慧中。)

經過抽象的事物依然是可以具體描述的,抽象化大多時候只是想轉換事物的概念,或是將一句話的意思變得更廣義

 

比如我說「我要去吃飯」,這時候你不需要知道我是要用筷子吃還是用湯匙吃,也不需要知道我是要吃飯、吃麵,還是吃水餃。

雖然具體細節你都不知道,但是「我要去吃飯」這件事依然能讓你理解我具體要做什麼,這就是一種抽象表達用較廣義的文字來傳達一件事

 

又比如我們會將一群生長於同一個區域的「樹」稱為「森林」,而不會用「很多樹」來形容,這就是一種概念轉換

因為有很多樹的地方可以稱為森林,但是被稱為森林的地方不一定有很多樹,也不一定只有樹。

「森林」對我們而言是一種更高層次的概念,森林就是森林,不能跟「很多樹」直接畫上等號。

 

概念轉換


在電腦裡,能直觀感受到的抽象型式有很多,比如當我開啟一個圖片檔時,傳統硬碟(HDD)的碟片會開始高速旋轉,硬碟的讀寫頭會在碟片上來回移動,把一堆0跟1的組合讀取出來,最後讓我能在螢幕上看到一張圖片。

要求電腦做出這一連串的機械化動作,才是我們真正對電腦下達的指令,但是在感受上我們只會覺得自己是在開啟一個檔案

就是因為有了這種概念轉換,我們才能以「檔案」的概念來使用電腦,用鍵盤跟滑鼠來操作電腦,而不用理解一堆0跟1的組合、機械原理、電信號。

概念轉換讓這堆0跟1的組合有了另一個層次的意義。(就像前面說的「森林」與「樹」的概念一樣)

假如過去的工程師沒有把電腦裡的0跟1抽象化,以現在這種檔案系統的概念呈現出來,那我們就無法以「檔案」來思考事情。

 

從這裡我們可以知道,抽象化的目的之一,是為了改變人類對事物的認知方式,如此才能用更符合直覺的概念來進行思考跟操作

「檔案」的概念是人類透過上帝視角才能認知到的,對電腦而言,它的視野裡只有一堆的0跟1,無法察覺到檔案的存在,可說是見樹不見林。

 

降低相關性


隨著科技進步,固態硬碟(SSD)也變得越來越普及。有別於傳統硬碟,SSD沒有磁片跟讀寫頭,存取資料的方式跟記憶體比較接近。

然而,我們並沒有因為硬碟的硬體結構改變了,操作電腦的方式就有了什麼變化

對使用者來說,我們依然能用「檔案」的概念操作電腦。

這主要是歸功於抽象化降低了事物之間的相關性(或者說依賴性)

就像「吃飯」是抽象的,你不需要管我具體吃什麼、怎麼吃。

「檔案」也是抽象的,我們不需要管電腦硬體具體是依靠什麼方式來定義0跟1、處理0跟1

 

這裡我想舉汽車的例子會更淺顯易懂。

 

汽車有引擎、輪軸、懸吊系統......,但無論這些硬體設備之間是如何協同工作的,想讓車子在行進中轉彎,都能以符合直覺的方向盤來操作,這也是一種抽象化的結果。

方向盤降低了駕駛人與汽車轉向系統的相關性,駕駛人只要知道怎麼使用方向盤就好。

即使未來這台車的設備更換了,機械原理改變了,也不能影響到方向盤的操作結果,這樣才能算是成功的抽象化。

 

程式的抽象化怎麼做?


抽象化並沒有具體的做法,並不是一定要怎麼寫才叫作抽象化,也並非用了abstract或interface之類的關鍵字,就代表運用了抽象化。

因為與其說抽象化是一種程式寫法,或許說它是一種認知事物的看法會更為合適。

 

以「美化」的例子來說,美化的意思很好理解,就是要讓一個東西、一個地方變得比現在更美,謂之美化。

可是,什麼是「美」?如果不知道「美」的定義,要如何進行「美化」呢

我相信每個人對「美」的理解都不同,讓不同的人來做美化的工作,得到的結果也會有所不同。

這是因為「美」是一種看法,而不是一種做法,所以我們無法完美定義「美」的意思,「美化」也就不存在一種標準做法。

但無論如何,只要一個人的心中存在對「美」的感覺,他就會知道如何進行他的美化工作,至於別人能不能接受這種美感就是另一件事了。

 

抽象化其實也是相同道理,抽象是一種看法,不是一種做法

一個人看待一件事物的眼光,會影響他對抽象機制的理解,而他的理解會決定他將用什麼方式進行抽象化的工作。

 

能在程式碼中看見「森林」,就表示寫程式的人運用了抽象概念,看程式的人也能認知到抽象概念

而沒有經過抽象表達的程式碼,無論寫法再怎麼高端、程式碼再怎麼簡潔,看起來可能也只會像「很多樹」,無法表達「森林」的概念。

也就是看起來會像只有一連串的邏輯推演,但看不出這麼做的目的是什麼。

 

什麼是高階概念?


舉例來說,我們都知道人體是由細胞組成的,但是當我們在談論「某某某是個怎麼樣的人?」的時候,我們關心的可能是他的外貌、個性、興趣、內涵,而不會去思考他的細胞運作得怎麼樣。

在這個例子裡,細胞是底層資訊,外貌、個性等等的是高階抽象概念

如果沒有細胞在活動,就不可能產生外貌、個性等等的表徵。

但即使細胞在活動,如果我們的關注點是放在細胞身上,那就會無法察覺到「人」這個整體概念的存在,也就無法用外貌、個性等等與「人」有關的資訊來思考「人」的問題。

這就是細胞之所以是底層資訊,人、外貌、個性等等的是高階抽象概念的理由。

 

程式碼就如同細胞,是底層資訊。

而透過程式碼表達出來的「思想」、「意圖」,就屬於高階抽象概念。

 

總結


如果你看完這篇文章,還是不太明白什麼是抽象化,請不要認為一定是自己的問題

事實上,我覺得要把抽象化講清楚真的不容易,所以也可能只是我的表達方式不好。

 

其實人類的思考方式本身就是很抽象又高階的,這意味著我們能在不清楚具體細節的情況下進行思考

想像一下,如果今天被人問到「快樂是什麼?」,你也許會跟我一樣,不知道該怎麼描述快樂的定義(而且也不會簡單接受字典的釋義)。

但如果問題是「某件事情令你感到快樂嗎?」,可能就容易回答得多了,即使我們還是無法回答快樂是什麼。

換句話說,我們平常就在運用抽象思考,所以反而很難解釋什麼是抽象

 

話說回來,我在這篇文章裡沒有提到任何程式碼的實作,這是因為程式碼想怎麼寫都可以,重點在於你能否用程式碼描述出你心中所想的那個抽象概念

反過來說,並不是用了abstract或interface之類的關鍵字,或是用了很高端的寫法,就表示進行了抽象化。

因為抽象是一種看法,不是一種做法

雖然抽象化帶給我們很多好處,但也不必為了抽象而抽象,如果能在不進行抽象化的情況下就完美解決問題,那會比過度抽象化來得更好。

 

 

最後還是希望這篇文章多少有幫助到你!

有任何問題歡迎留言討論~

 

 
我要留言!
 

X
暱稱(選填)
email(選填,僅站長可見。)
留言 To:#