歡迎來到程序化思維的世界!
你好!歡迎踏入電腦科學旅程中最重要的一個章節。你有沒有試過面對一項艱巨的任務——例如打掃整個屋子或撰寫一篇兩千字的論文——而感到不知所措?程序化思維(Thinking Procedurally)就像是一項「超能力」,能幫助你擺脫焦慮,直接開始行動。在本章中,我們將學習如何將大問題拆解成電腦能夠理解的小步驟。如果起初覺得有些抽象也不用擔心,只要看看生活中的實際例子,你很快就能豁然開朗!
快速回顧:甚麼是計算思維(Computational Thinking)?
在深入探討之前,請記住,計算思維並不是要你「像電腦一樣」思考;而是要以一種能讓我們「明確告訴」電腦該做甚麼的方式來思考。程序化思維正是這一套工具箱中的關鍵組成部分。
1. 識別問題的組成部分
解決任何大型問題的第一步就是識別其組成部分,這通常被稱為分解(Decomposition)。我們不再將問題看作一團混亂的「大雜燴」,而是找出構成問題的各個獨立部分。
現實生活中的例子:策劃生日派對
如果你的「問題」是「籌辦派對」,那麼組成部分可能包括:
1. 賓客名單
2. 食物與飲料
3. 音樂/娛樂
4. 場地(位置)
在電腦科學中,我們也做同樣的事情。如果你被要求為應用程式設計一個登入系統,你首先要識別其組成部分:獲取用戶名稱、核對密碼,以及處理「忘記密碼」的請求。
你知道嗎?
將問題拆解可以讓分工變得更加容易。在現實工作中,一位程式設計師可以負責「登入」組件,而另一位可以同時負責「用戶個人資料」組件!
重點提示: 永遠從提問開始,「這個問題是由哪些較小的部分組成的?」
2. 識別解決方案的組成部分
一旦你知道了問題的組成部分,就可以開始構建解決方案。問題中的每一個組件,都需要對應的解決方案來應對。
你可以將這視為「如何做」階段。如果問題的組件是「我們需要知道誰會出席派對」,那麼解決方案的組件就是「建立一個網上 RSVP 回覆表格」。
當你為電腦程式識別解決方案組件時,你要找的是:
• 數據結構(Data structures)(我們要如何儲存資訊?)
• 輸入(Inputs)(用戶需要輸入甚麼?)
• 輸出(Outputs)(螢幕上應該顯示甚麼?)
• 處理過程(Processes)(幕後會進行甚麼運算或檢查?)
常見錯誤:
不要試圖一次解決所有問題!如果你嘗試一次寫完整個解決方案的代碼,你很可能會遇到難以發現的錯誤(bugs)。請專注於每次只處理一個解決方案組件。
3. 確定步驟的順序
電腦雖然運算速度極快,但它們其實很「笨」——它們會嚴格地按照你寫下的順序執行指令,哪怕這個順序毫無邏輯!程序化思維涉及精確地決定每一個步驟應該在甚麼時候發生。
「穿鞋與穿襪」原則
想像一下,如果你編寫了一個穿衣程式:
步驟 1:穿上鞋子。
步驟 2:穿上襪子。
你雖然識別了正確的組成部分,但因為順序錯了,結果會是一場災難!在程式設計中,這種順序被稱為序列(Sequence)。
步驟邏輯:
在確定順序時,請問自己:
1. 先決條件(Pre-conditions):步驟 B 是否需要在步驟 A 完成後獲取資訊才能開始?(例如:在用戶輸入密碼之前,你無法檢查密碼是否正確)。
2. 依賴關係(Dependencies):哪些部分是獨立的,哪些部分又依賴於其他部分?
重點提示: 解決方案不僅僅是一份清單,它是一系列經過精心編排的序列。
4. 識別子程序(Sub-procedures)
隨著解決方案越來越龐大,我們會使用子程序。子程序是一個包含在主程式中,能執行特定任務的獨立「小程式」。
為甚麼要使用子程序?
• 可重用性(Reusability):如果你寫好了一個完美的「計算稅款」子程序,你可以在程式的不同部分使用它 100 次,而無需重寫代碼。
• 可讀性(Readability):閱讀寫著「執行登入(Perform Login)」的程式,要比閱讀在主介面中間夾雜 50 行混亂代碼的程式容易得多。
• 測試(Testing):你可以測試一個小小的子程序,確保它運作完美後,再將它整合到其餘代碼中。
記憶輔助:電視遙控器
想想電視遙控器。當你按下「音量增加」按鈕時,你並不需要關心內部的電子元件是如何運作的,你只需要「呼叫」VolumeUp 這個子程序。遙控器的設計者將「控制電視」這個問題拆解成了無數個可重用的小型子程序(即按鈕)。
快速回顧欄
• 程序化思維:將問題拆解並按順序排列步驟。
• 分解(Decomposition):將大問題拆解為更小、更易於處理的組件。
• 序列(Sequence):指令執行的具體順序。
• 子程序(Sub-procedure):執行特定任務並可透過名稱「呼叫」的程式碼小區塊。
總結清單
在繼續學習之前,請確保你對以下四點充滿信心:
1. 我能否觀察一項任務並列出問題的不同組成部分?(例如:計算機需要接收數字、選擇運算符,並顯示結果)。
2. 我能否識別解決方案的組成部分?(例如:使用變數 \(x\) 來儲存第一個數字)。
3. 我能否將這些步驟按邏輯順序排列?(例如:先輸入,再處理,最後輸出)。
4. 我能否看出哪裡可以使用子程序?(例如:每當用戶按下按鈕時就會被調用的「儲存檔案」常式)。
做得好!程序化思維是所有優秀程式設計的基石。請繼續透過觀察日常生活中的任務(例如製作三明治或過馬路)並嘗試識別其組成部分及所需的正確執行順序來進行練習吧!