歡迎來到抽象化與自動化的世界!

在本章中,我們將探索計算機科學家的思維方式。你有沒有想過,編程人員是如何編寫像飛行模擬器或全球社交網絡這樣複雜的程式呢?其中的秘訣不僅僅是「數學要好」,而是掌握抽象化(Abstraction)自動化(Automation)。我們將學習如何從問題中剔除「冗餘資訊」,並將其轉化為電腦可以處理的一系列指令。這些技能正是計算理論(Theory of Computation)的基石。

1. 掌握解題與演算法

在告訴電腦該做什麼之前,我們需要一個計劃。這個計劃就稱為演算法(Algorithm)。

什麼是演算法?

演算法是一系列為了完成特定任務而遵循的步驟。最重要的一點是,演算法必須總是會終止(它不能無限地運行下去!)。

演算法的建構區塊

如果剛開始覺得很困難也不用擔心;大多數演算法都是由以下四種簡單的結構建構而成的:

  • 序列(Sequence):將指令按正確的順序排列。
  • 賦值(Assignment):為變數賦予數值(例如:score = 0)。
  • 選擇(Selection):使用 IF 語句進行決策。
  • 迭代(Iteration):使用 FORWHILE 迴圈重複步驟。

手動跟蹤與邏輯

為了檢查演算法是否有效,我們使用手動跟蹤(Hand-tracing)。這就像你自己扮演電腦的角色,使用「追蹤表(Trace table)」來記錄每個步驟中變數的值。這能幫助你利用邏輯推理(Logical reasoning)來證明你的程式是正確且高效的。

快速複習:演算法就像電腦的食譜。它必須清晰、有序,並且必須要有終點!

重點總結:解題涉及將邏輯問題拆解為使用標準編程結構、且能最終結束的一系列步驟。

2. 抽象化的藝術

抽象化是一種簡化複雜現實的過程,讓我們能專注於真正重要的事物。試想倫敦地鐵的路線圖;它不會顯示軌道的每一個彎曲,也不會標示樹木在哪裡。它只顯示車站和路線。這就是抽象化!

表徵抽象化(Representational Abstraction)

這是指透過移除所有不必要的細節來建立問題的表徵。如果你正在製作一個賽車遊戲,你需要知道汽車的速度和位置,但你不需要模擬車門烤漆的化學成分!

概括抽象化(分類)

這是根據共同特徵將事物分組。我們經常使用一種稱為「是一種(is a kind of)」的階層關係

例子:『黃金獵犬』『狗』的一種,而『狗』又『哺乳類動物』的一種。

資訊隱藏(Information Hiding)

這是一個隱藏所有與本質特徵無關的物件細節的過程。這就像程式碼的「必要知情」原則。如果程式的某一部分不需要知道某個數值是如何計算出來的,我們就會隱藏該複雜性。

你知道嗎?使用抽象化會讓你的程式碼更容易維護。如果你更改了某個隱藏的細節,你不需要修復整個程式!

重點總結:抽象化就是「減少細節」以使問題易於管理,並透過「分組」來掌握大局。

3. 功能抽象化的層次

抽象化不僅僅關於物件,也關於我們如何使用程式碼和資料。

程序抽象化(Procedural Abstraction)

這涉及抽象化運算中所使用的實際數值,從而建立一種計算模式。我們將特定的任務轉化為一個程序(Procedure)
例子:與其每次寫程式來計算半徑為 5 的圓面積,我們寫一個 Area(radius) 程序,這樣就能適用於任何數字。

功能抽象化(Functional Abstraction)

這更進一步:具體的計算方法被隱藏起來了。你不需要關心函數「如何」計算出結果;你只關心當你給它輸入時,它能給你正確的輸出。這是將程序抽象化作為「黑盒(Black box)」來處理的結果。

資料抽象化(Data Abstraction)

這是一種隱藏資料實際表示方式的方法論。新的資料物件可以由先前定義的類型建構而成。
例子:你可能會在程式中使用堆疊(Stack)。你知道你可以對它進行「推入(push)」和「彈出(pop)」操作,但你不需要知道電腦在底層是否使用陣列(Array)指標(Pointer)來實現它。

常見錯誤:學生經常混淆程序抽象化與功能抽象化。請記住:程序抽象化是關於建立可重複使用的模式;功能抽象化是關於完全隱藏「如何運作」的過程,並將其視為一種數學對映。

重點總結:我們可以透過抽象化程序(模式)、函數(黑盒)和資料(隱藏儲存細節)來簡化工作。

4. 拆解、合成與歸約

我們該如何建立龐大且複雜的系統呢?我們使用三種具體策略:

拆解(Decomposition)

這意味著將問題拆解為子問題。每個子問題都應完成一個可識別的任務。你可以不斷地細分,直到每一塊都變得容易解決。

合成(Composition)

這是拆解的相反!它是結合多個程序以形成複合程序,或是結合多個資料物件以形成複合資料結構(例如樹狀資料結構)。

問題抽象化(歸約,Reduction)

這是一個聰明的技巧:透過移除問題細節,直到它看起來像是一個已經被解決過的問題。如果你能證明你的新問題只是舊問題的一種變體,那麼你就可以直接使用舊的解決方案!

重點總結:拆解(Decomposition)與合成(Composition)讓我們能系統化地解決大型問題。

5. 自動化

最後是自動化(Automation)。這是計算機科學的「行動」階段。自動化是將我們的抽象模型投入實作以解決問題。

我們如何實現自動化?
  1. 建立演算法來解決模型。
  2. 實作模型於資料結構中。
  3. 編寫程式碼執行指令。
  4. 運行程式碼。

記憶小撇步:自動化視為建模 + 實作。計算機科學不僅僅是編寫程式碼,它更在於為「混亂的」現實世界建立「簡潔的」模型,並讓機器執行這些模型。

快速複習:
- 拆解(Decomposition):拆解它。
- 合成(Composition):建立它。
- 自動化(Automation):讓它運作。

重點總結:自動化是最後一個步驟,透過電腦將我們的模型和演算法轉化為現實運作的成果。