最近對「每個人的抽象化思考能力有所不同」蠻有感的。想轉貼之前 vgod 大大的這篇:
追求神乎其技的程式設計之道(七) - vgod’s blog

這個系列真的蠻好看的,但今天推的主要是文章中的這段:

我覺得所有的程式都可以看成一個巨大的金字塔,頂端是這個程式的最終目標,一個模糊的概念;底部是細節的程式碼。

而中間是一個經由不斷切割與抽象化所構成的高塔,每一個程式都是切割為許多的元件、模組,再切為更細的 class 和 function,再來是最底下的變數與邏輯判斷式。


接著讓我們看看像我這樣的菜鳥跟真正的專業人士,他們所看見的「金字塔」有什麼差別:

很有趣的是,不同的人看這個塔就會有不同的樣子。

初學者看到的塔只有兩層,他們和人溝通的方法是鉅細靡遺的描述程式碼:「我在這裡寫個 for,第一次把 i設成 0,在迴圈內每次檢查這個陣列的第 i 個元素…」

在他們眼中只有程式的目標和程式碼本身,所以還可能會寫出下面這種讓人哭笑不得的註解:

a = 1; // 把 a 設為 1


有些經驗後,會再多看到一層,利用 function 把一段程式碼包裝起來,賦予一個名字和獨特的意義。學會這個後,就可以利用抽象化後的 function 名稱來溝通,例如:「我在這個迴圈裡每次都用 isCaptial 來檢查這個字串是不是都是大寫…」

再接下去呢,可以再利用 class,利用 design patterns,利用更大的模組、子系統來溝通,認真說起來,這其實是一個無止境的切割。

隨著我們的經驗增長,我們漸漸可以切出更多的「層」或「模組」,從不同顆粒度的層次去檢視、溝通。這就是抽象化的力量。


最後再截一段我很喜歡的段落:

在資訊科學這個領域,抽象化是個無窮無盡的必要行為。因為世間萬物實在太多太複雜,我們只好不斷把東西歸類,並賦予一個名稱、一個意義,經由這樣的過程我們才能用抽象的語言和符號來溝通,避免每次都要從最底層的瑣碎細節開始說起。

而平凡和偉大的程式設計師,我覺得他們之間的差別就在於能看到多少這個高塔中間的分層

厲害的高手都很善於切換自己思考的高度,一下能跟你討論高階的系統架構設計,一下又能深入到最底下的組合語言和二進位除錯。他們腦中除了有這高塔每一層的詳盡平面圖,甚至也非常了解不同樓層之間的交互關係。

平凡的程式設計師大多只能專注於自己所開發的範圍,對於其上的架構或其下的細節都不一定能理清頭緒,萬一出現 bug 也會搞不清楚到底是哪一層出了錯,而被完全無關的細節絆住手腳。

希望我們都能擁有更多不同層次的視野,共勉之。


這篇文章的後半段聊了一些被語言的慣例限制了思考方式的故事。

對於這方面,我也推薦 1/10 轉貼過的這篇:
一個語言如果不改變你的思考方式,就不值得學?

每一種語言,其實都是一種對資訊的選擇

那麼,今天的轉貼就到這邊。我們明天見~