抽象化思維簡介

歡迎!你即將深入了解計算機科學中最關鍵的技能之一:抽象化 (Abstraction)。別讓這個名稱嚇倒你——其實你每天都在無意中運用抽象化!在本章中,我們將學習如何「像計算機科學家一樣思考」,即剔除現實世界中繁雜的細節,從而找出隱藏其下的簡單邏輯。這是解決任何大型難題的第一步。

如果起初覺得這些文字有點抽象,不用擔心。只要看過例子,你就會豁然開朗!

1. 抽象化的本質

從核心來說,抽象化就是刪除不必要的細節,只專注於問題中最重要部分的過程。

想像你在看一棵樹。
植物學家看到的是物種、葉片的結構和養分水平。
藝術家看到的是顏色、光線照射枝葉的方式以及樹皮的紋理。
計算機科學家如果正在製作一款電子遊戲,他可能只看到一個簡單的形狀(一個頂部有綠色圓形的圓柱體)。

這位計算機科學家已經對這棵樹進行了抽象化。他們忽略了數以百萬計對其特定目標無關緊要的微小細節。

現實世界的類比:倫敦地鐵圖

著名的倫敦地鐵圖是抽象化的完美範例。
現實:隧道蜿蜒曲折,站與站之間的距離大不相同。
抽象化:地鐵圖使用了直線和相等的間距。
為什麼?因為作為乘客,你不在乎隧道有多深,也不在乎你確切行駛了多少米。你只在乎你身處哪條路線以及在哪裡轉乘。通過剔除「真實」的地理資訊,地鐵圖變得更易於使用。

重點總結:抽象化就是篩除對解決當前問題無用的資訊。

2. 為何需要抽象化

為什麼我們不能把所有細節都包括進去?為什麼我們需要抽象化?主要有三個原因:

1. 降低複雜度
現實世界極其複雜。如果你試圖通過計算引擎中每一個原子的運動來編寫汽車模擬器,電腦將會當機!抽象化讓我們能夠一次專注於一個可管理的部分。

2. 節省時間與資源
在計算領域,更多細節意味著需要更多的記憶體 (RAM)處理能力 (CPU)。通過使用抽象模型,程式運行速度更快,佔用的空間也更少。

3. 更專注於目標
如果你正在編寫一個管理學校時間表的程式,你需要的是學生的姓名和課程。你不需要知道他們喜歡什麼顏色或鞋子的尺碼。包含這些額外的數據只會讓程式更難編寫,且更容易出錯。

快速複習:
• 抽象化 = 簡化。
• 它使問題變得可解決
• 它節省了計算資源

3. 抽象化與現實

了解抽象化是現實的「呈現」,而非現實本身,這一點非常重要。兩者之間永遠存在著「差距」。

讓我們看看在不同情境下,「客戶」是如何被看待的:

現實:一個有性格、有家庭、有住址、有銀行存款、有購物紀錄和當下情緒的人。

抽象化(數據庫模型):
客戶 ID (CustomerID)(用於識別)
姓氏 (Surname)(用於稱呼)
電子郵件地址 (EmailAddress)(用於聯絡)
最近購買日期 (LastPurchaseDate)(用於追蹤活躍度)

應避免的常見錯誤:
學生常認為「細節越多越好」。在計算機科學中,這是錯誤的!最佳的抽象化是為了正確完成任務而保留最少量必要細節的模型。

重點總結:現實是無限的;而抽象化則是有限且聚焦的

4. 設計抽象模型

在考試中,你可能會被問到如何為特定情況創建抽象模型。請遵循以下步驟:

步驟 1:確定目標

程式實際上要達到什麼目的?(例如:「我想模擬一次飛行。」)

步驟 2:確定需求

什麼資訊是必需的?(例如:「空速、海拔高度、燃油量、方向。」)

步驟 3:去除「噪音」

我們可以忽略什麼?(例如:「座椅套的顏色、乘客在吃什麼、飛行員養的狗叫什麼名字。」)

例子:為「圖書館書籍」建模

如果我們要構建一個圖書館管理系統,我們對一本書的抽象模型將包括:
ISBN(唯一識別碼)
書名
作者
是否外借 (IsOnLoan)(是/否)

我們會忽略紙張的厚度、內文使用的字體風格,或者封面上劃痕的數量。

你知道嗎?
電子遊戲會利用抽象化來製作「碰撞箱 (hitboxes)」。電腦通常不會去檢查劍是否擊中了角色複雜盔甲的每一個像素,而是簡單地在玩家周圍放置一個不可見、簡化的長方形框。如果劍進入了那個框,就判定為命中!這種簡單的抽象化使得遊戲能夠流暢地實時運行。

重點總結:要設計一個模型,只需保留有助於目標的資訊,丟棄其他所有東西。

總結:抽象化思考

基礎:抽象化是隱藏細節以專注於核心特徵。
目標:使複雜問題更易於編寫程式,且運行效率更高。
方法:確定特定目標,僅包含直接服務於該目標的數據點。
比較:現實是「本體」,而模型是該事物的「簡化地圖」。

你剛剛掌握了計算思維的第一個要素!下次當你使用地圖或查看天氣圖示時,請記住——你正在看的就是一種抽象化!