歡迎來到問題解決:分解與抽象!

大家好!這一章旨在學習計算機科學家如何面對龐大且複雜的問題,並將其轉化為小巧、易於管理的任務。
如果你曾對巨大的專案感到不知所措,別擔心——這兩種技巧:分解(Decomposition)抽象(Abstraction),就是你的秘密武器!

為什麼這很重要? 因為每一款軟體,從簡單的計算機應用程式到大型的電子遊戲,最初都只是一個單一且複雜的想法。我們需要這些技巧將想法拆解成電腦(以及程式設計師!)能夠實際執行的步驟。


第一節:分解(Decomposition,拆解問題)

什麼是分解?

分解是指將一個龐大且複雜的問題或系統,拆解成更小、更簡單且易於管理的子問題。

把它想像成吃一個巨大的披薩:你不會想一口氣把它吃掉!你會先把它切成一片一片的。每一片就是一個更小、更容易處理的任務。

類比:烘焙蛋糕

想像你的大問題是「烤一個三層的婚禮蛋糕」。這任務太巨大了!

如果你進行分解,子問題會變成:

  • 子問題 1:烘焙底層(大蛋糕)。
  • 子問題 2:烘焙中間層(中蛋糕)。
  • 子問題 3:烘焙頂層(小蛋糕)。
  • 子問題 4:製作糖霜。
  • 子問題 5:組裝並裝飾蛋糕。

現在,你不需要糾結於一項令人恐懼的大任務,而是有五個明確的小任務,可以逐一解決。

為什麼我們在計算機科學中要使用分解?

分解至關重要,原因如下:

  1. 易於管理: 小任務更容易理解和編寫程式。
  2. 測試與除錯: 如果一個小程式(例如「子問題 3:烘焙頂層」)失敗了,你可以精確地知道錯誤在哪裡。要在一個巨大的程式中找出錯誤會困難得多。
  3. 團隊合作: 不同的程式設計師可以同時處理不同的子問題,加快開發速度。
  4. 可重用性: 有時一個子問題(例如「計算稅額」)可以在整體程式的不同部分使用,甚至可以在未來完全不同的專案中重複使用。

記憶小撇步: 當你進行 Decompose(分解) 時,你就是在 Divide(分割) 任務。

快速回顧:分解

分解是將複雜問題拆解為更小、獨立的子問題的過程。
目標是讓整個問題變得更易於管理且更容易解決。


第二節:抽象(Abstraction,聚焦精髓)

什麼是抽象?

抽象是隱藏系統所有複雜細節,僅向使用者或程式設計師呈現必要且相關資訊的過程。

抽象讓我們能夠專注於系統「做什麼」,而不是「如何做」。它簡化了對問題的看法。

類比:駕駛汽車

當你開車時,你會使用方向盤、油門和煞車踏板。這些是基本細節(抽象視圖)。

你不需要知道:

  • 引擎內部的確切化學反應。
  • 燃油泵如何傳送汽油。
  • 變速箱的具體齒輪比。
這些是隱藏起來的不必要細節(已被抽象化)。

如果為了換車道,你還必須考慮所有內部機制,那根本不可能開車!抽象簡化了你的操作。

計算機科學中的抽象

在計算機科學中,我們不斷地使用抽象。

範例 1:使用手機 App
當你點擊手機上的圖示開啟 App 時,你不需要知道手機執行了多少百萬行的機器碼,也不需要知道硬體如何讀取你的觸控輸入。你只需要知道:點擊圖示 -> App 開啟。
複雜的內部過程已被抽象化,留給你一個簡單、好用的介面。

範例 2:編寫程式
當你撰寫 PRINT("Hello") 這樣的代碼時,你就在使用抽象。你不需要編寫低階的機器指令來告訴 CPU 如何逐個點亮螢幕上的畫素。程式語言(如 Python 或 JavaScript)提供了抽象後的指令 PRINT,它為你處理了所有複雜的操作。

抽象的目的

其目標永遠是簡化:

  • 過濾: 過濾掉與當前任務無關的細節。
  • 清晰: 讓系統更容易設計、使用和維護,因為你只看到重要的部分。
  • 效率: 程式設計師可以專注於高階邏輯,而不是低階硬體問題。

常見誤區

別將抽象與概括(Generalisation)混淆。

  • 抽象意味著隱藏細節以簡化視圖(例如:隱藏引擎運作機制)。
  • 概括意味著在多個問題中找出共同特徵(例如:意識到所有汽車都需要輪子)。
針對 International GCSE,請主要將抽象理解為隱藏不必要的細節

快速回顧:抽象

抽象意味著透過只專注於基本細節,並忽略或隱藏不必要的複雜性,來簡化問題。


分解與抽象攜手合作

雖然分解將問題拆解成碎片,但抽象簡化了這些碎片。它們在解決問題的過程中通常相輔相成。

問題: 設計火車站的新售票機。

  1. 分解: 將整個機器設計拆解為模組:
    • 模組 A:使用者介面 (UI)。
    • 模組 B:付款處理。
    • 模組 C:車票列印。
  2. 抽象: 簡化每個模組:
    • 對於模組 A (UI),我們只關心按鈕和螢幕輸入(隱藏顯示技術的細節)。
    • 對於模組 B (付款),我們只關心最終結果(付款成功/失敗),隱藏連接銀行的複雜網路協定。

你知道嗎? 抽象是現代程式設計的基礎思想之一。當你在代碼中使用函式庫或預先編寫好的函式時,你正受益於他人所做的抽象!

重點總結:
Decomposition(分解) = Dividing(分割)任務。
Abstraction(抽象) = Actually(實質上)透過忽略無用細節來簡化任務。

祝你好運!掌握這兩種強大的問題解決技巧後,你已經走在成為真正計算機科學家的道路上了!