問題建構和分析

界定問題、分析問題、拆解問題、模式識別、抽象化與解難程序

1.1 界定問題(Define the problem)

解決問題的第一步並不是立即編寫程式,而是清楚界定問題及其範圍: 究竟要解決甚麼、目標對象是誰、涵蓋範圍到哪裡、哪些內容不包括在內。若問題描述欠清晰,即使程式編寫得再完美, 仍有可能「答非所問」。

例子:有人表示:「我經常煮食失敗。」

實際情況可能包括:

  • 不懂得調校火力;
  • 不清楚食材所需的烹調時間;
  • 未掌握正確的烹調步驟與先後次序;
  • 或食譜本身並不適合所使用的爐具或廚具。

若沒有進一步追問及釐清,便難以提供合適協助。程式設計中的問題界定亦是同一道理。

界定問題時可以如何思考?

5W1H 六何法

嘗試運用六何法整理相關構思。

按「下一題」開始。

請判斷題目屬於哪一類別:Who/What/When/Where/Why/How。

教學建議:可先安排學生以紙張繪畫 mind map,之後再透過本小遊戲檢查自己的構思是否已涵蓋六何要素。

1.2 分析問題與輸入 ‧ 處理 ‧ 輸出周期(IPO)

成功界定問題後,需進一步分析問題,並拆解出系統所需的輸入、處理步驟與輸出。 以身體質量指數(BMI)為例,示範「輸入 → 處理 → 輸出」周期。

BMI 計算器 IPO

  • 輸入:體重(kg)、身高(m)。
  • 處理:用公式 BMI = 體重 ÷ 身高² 計算,並判斷屬於過輕/正常/過重/肥胖。
  • 輸出:顯示 BMI 數值及對應類別。

循線機械車 IPO

  • 輸入:左右循線感應器讀取到「是否在黑線上」。
  • 處理:比較左右感應器結果,判斷車身偏向哪一邊。
  • 輸出:控制摩打轉向,令車身回到黑線上行走。

拖放練習:BMI 應用程式的 IPO

請將下列動作拖放至正確欄位(輸入/處理/輸出),然後按「檢查答案」。

輸入 Input

處理 Process

輸出 Output

題目銀行(請拖動到上面三欄)

IPO 是日後學習演算法與繪畫流程圖的重要基礎。每當遇上新問題,不妨先問自己:需要甚麼輸入?將如何處理?最後要向用戶輸出甚麼結果?

1.3 拆解問題(Decomposition)

拆解問題是指把一個複雜問題分拆為較細小而容易處理的子問題(sub-problems), 然後逐一解決。以「製作一份全日早餐」為例:先分拆為「煎蛋」、「煮茄汁豆」、「烘多士」、「沖咖啡」等模組, 每次專注處理其中一個部分。

為何要拆解?

  • 若嘗試一次過處理整個大型問題,往往難以入手,亦較容易混亂。
  • 拆成小模組後,可以分工合作或重用模組。
  • 方便測試:一旦出現錯誤,可較容易鎖定是哪一個模組出現問題。

由上而下(Top-down)

由整體目標開始,一級一級拆細:

  • 設計網上商店 → 切成「登入」、「商品瀏覽」、「購物車」、「付款」。
  • 「製作多士」再拆成「切麵包」、「烘多士」、「塗牛油/果醬」。

逐步求精(Stepwise refinement)

對每個模組再作「逐步求精」,直至每一步都簡單清晰,例如:

  • 「沖咖啡」→「煲水」、「加咖啡粉」、「加水」、「滴漏」、「倒出咖啡」。
按「下一題」開始。

1.4 辨別相似問題的共同元素(模式識別)

模式識別(pattern recognition)是從不同問題之間找出共同結構, 進而重用相似的解決方法,減少每次都從零開始設計。

例子:按身高 / 體重排隊

體育課上,同學可以按身高由矮至高排隊:

  • 列出所有同學身高。
  • 找出最矮的一位,抽出來排第一。
  • 從剩餘同學中再找最矮的,排第二;如此類推。

若老師改為按體重由輕至重排隊,實際上只是把「身高」換成「體重」,整體處理模式並沒有改變。

生活情境例子:計算購物總金額

在超級市場購物時,顧客可能先購買一件物品、再購買兩件,甚至購買更多不同商品。 每次結帳時,收銀員其實都會重複進行相同的步驟: 將每件商品的價格逐一加入總金額之中。 當我們比較多個實際情況後,便能發現這個重複出現的處理模式, 並歸納出一個通用做法:不論購買多少件商品, 只需重複「將商品價格加到總金額」這個步驟即可。 這正是透過觀察多個具體例子, 由下而上(bottom-up)歸納出解決方法的過程。

按「下一題」開始。

1.4 抽象化(Abstraction)

抽象化是指刪除不必要的細節,只保留關鍵資料,使問題更容易處理。 以兩張港鐵路線圖作比較:一張按真實地形繪畫,另一張則為大家熟悉的簡化路線圖。

真實地形地圖

  • 顯示海岸線、山脈、實際距離等。
  • 資訊量較多,但對「計劃乘車路線」而言未必全部必要。

簡化地鐵路線圖

  • 只保留車站名稱、線路及轉車站。
  • 地理位置未必完全準確,但更方便乘客選擇路線。

抽象化的日常例子

按「下一題」開始。

1.5 用戶界面設計(User Interface)

一個程式能否成功,不僅取決於演算法的效能,還取決於用戶界面(UI)是否容易使用。 表格、按鈕、下拉式選單等界面元素,並強調界面的整體一致性與清晰度。

清晰輸入欄位

  • 每個欄位要有標籤(Label),例如「姓名」、「電話」。
  • 適當使用 placeholder,提醒輸入格式。
  • 必填欄位可加上星號 * 標示。

易明的錯誤訊息

  • 不宜只顯示「Error」,而應清楚說明錯誤的原因與位置。
  • 例如:「電話號碼必須為 8 位數字」比單純顯示「輸入錯誤」更有幫助。

一致的版面設計

  • 按鈕顏色、字體、間距等,整個系統應保持一致。
  • 將相似功能置於相近位置,例如所有「儲存」按鈕均放在右下角。
按「下一題」開始。

1.X 計算思維四大元素

解難時常用的四種思維方式:

按「下一題」開始。

1.6 解難程序(Problem-solving Process)

常見的解難流程,可配合上述各種計算思維一併使用:

  1. 界定問題
  2. 分析問題
  3. 設計解決方案(包括演算法)
  4. 實施解決方案(例如寫程式)
  5. 測試及改善
  6. 評估結果
按「下一題」開始。