第一道料理完成後(PRD → Spec → 積木程式),我心裡有種雀躍。
就像第一次能把菜切好端上桌一樣,雖然只是小菜,但那是我的成果。
然而,師父並沒有讓我沉浸太久。
「會切菜的人很多,但能掌握火候的才是廚師。」
這句話像風一樣吹過我的耳邊。
我知道,積木程式就像調理包,雖然快速、方便,但如果要站上真正的舞台,
我必須開始學會 真實的 Python,脫離積木編輯器的保護。
這一次的挑戰不是簡單的「按下按鈕 → 顯示箭頭」。
師父給了我一份新的 PRD:
PRD 項目 | 說明 |
---|---|
使用者故事 | 「我希望小車能自己避開障礙物,不會一直撞牆。」 |
需求編號 | PRD-002 |
驅動因素 | 使用者需要小車在自動模式下具備基本安全性 |
驗收條件 | 小車遇到障礙物時,必須停止或繞過 |
這是一份「真正有意義」的需求。
因為它不再只是單純的「顯示圖案」,而是涉及到感測器輸入、狀態判斷、動作回饋。
師父提醒我:
「PRD 是食材,Spec 才是料理的食譜。」
我開始把 PRD 轉換成可以執行的 Spec:
Spec 編號 | 條件 | 行為 |
---|---|---|
SPEC-201 | 前方無障礙 | 小車前進 |
SPEC-202 | 前方有障礙 | 小車停止 |
SPEC-203 | 障礙消失 | 小車繼續前進 |
這次,條件變得複雜了。因為「有障礙 / 無障礙」不是按鈕輸入,而是感測器判斷。
在沒有真實感測器的情況下,我選擇用 按鈕模擬障礙物:
這樣即使在模擬器裡,我也能測試邏輯。
我先打開 micro:bit 的 MakeCode 編輯器,像上一道料理一樣,用積木拼出流程。
這樣的積木程式,就像調理包一樣:快速、可食用,但我知道,這還不是「真正的料理」。
因為每次邏輯要修改,我都得重新堆積木,效率並不高。
我切換到 Python 模式,MakeCode 幫我自動生成了程式碼。
obstacle = False
def on_button_pressed_a():
global obstacle
obstacle = True
basic.show_icon(IconNames.NO)
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_b():
global obstacle
obstacle = False
basic.show_icon(IconNames.YES)
input.on_button_pressed(Button.B, on_button_pressed_b)
def on_forever():
if obstacle:
basic.show_string("STOP")
else:
basic.show_string("GO")
basic.forever(on_forever)
一開始我心裡竊喜:「啊,這不就是 Python 了嗎?」
但師父搖頭:
「這還是調理包的味道,能吃,卻不算你炒的。
真正的 Python,就像你自己下鍋,沒有保護欄,沒有捷徑。」
我這才明白:
師父說:「寫程式,先要會下鍋。」
對 Python 來說,下鍋的第一步就是 起手式。
一個最基本的 micro:bit Python 程式,通常會長這樣:
from microbit import * # 匯入 micro:bit 函式庫
while True: # 主迴圈,永遠執行
display.show(Image.HEART) # 顯示愛心
sleep(500) # 停 0.5 秒
display.clear() # 清除畫面
sleep(500) # 再停 0.5 秒
這就是「真實的起手式」。有幾個關鍵:
from microbit import *
→ 就像打開瓦斯爐,讓你能使用 micro:bit 的所有功能。while True:
→ 表示「永遠持續執行」,相當於積木裡的 重複無限次
(forever
) 迴圈。display.show()
→ 控制顯示,類似積木裡的「顯示圖案」。sleep(500)
→ 程式暫停 0.5 秒,就像料理要停火一下。這樣的程式,已經無法再轉回積木。
它是真正意義上的 Python 程式碼。
有了起手式,我開始動手寫避障小車的邏輯。
這次不用 on_forever
,也不用自動產生的函式,
而是自己動手,像廚師一樣掌握火候:
from microbit import *
# 狀態變數:是否有障礙
obstacle = False
while True:
# A 鍵 = 模擬障礙物出現
if button_a.is_pressed():
obstacle = True
# B 鍵 = 模擬障礙物消失
if button_b.is_pressed():
obstacle = False
# 判斷狀態
if obstacle:
display.scroll("STOP")
else:
display.scroll("GO")
這一刻,我第一次感覺到程式真的「在我手裡」。
沒有積木幫我兜底,沒有調理包,
只有我和螢幕上的字母,一行行對話。
當我按下 A,看到畫面滾動「STOP」;
當我按下 B,顯示「GO」時,
我知道自己已經邁出了 學徒到廚師 的一步。
我先在模擬器裡測試:
接著,把程式下載到實體 micro:bit 裡測試,效果與模擬器一致。
這一刻,我覺得自己真的「煮了一道完整的料理」。
回顧這次挑戰,我明白了:
而這種能力,正是 Program Manager 需要的。因為當工程師交付一份程式時,我能看懂其中的邏輯,甚至指出哪裡可能會出錯。
完成第二道挑戰後,我知道,程式邏輯我已經能獨立掌握。
但師父的話再度響起:
「廚師不只是會煮飯,還要會設計菜單。」
下一步,我要挑戰的不只是寫程式,而是 設計完整的 PRD 與 Spec,並與 AI 協作,讓我能成為一位能領導全局的 Program Manager。
這將是我第三篇的故事:《與風同行》。