學完你會得到什麼
- 會用 VS Code 加上 AI 助手 Codex,指揮 AI 寫出能跑的 Python 網站
- 會把腦中模糊的想法,寫成 AI 看得懂、照著就能做的規格
- 親手做出有會員登入、購物車、訂單、管理後臺的完整網站
- 做出一個 AI 客服,客人用一般講話的方式就能找書、查訂單
- 會用測試確認程式真的能用,而不是「看起來好像可以」
教你把 AI 當隊友寫程式。你負責把「要做什麼」講清楚、檢查 AI 做得對不對;AI 負責動手寫。30 小時、15 堂課,從零做出一個會聊天、會推薦書的網路書店網站,最後真的部署上線。
一句話記住:AI 寫程式很快,但規格講得清不清楚,決定了做出來的東西好不好。
每一課都是一張圖配一段白話,點圖可以放大。課程大綱、講義整理、這個網站怎麼做出來的,都放在最後的「附錄」分頁。
十二堂課分兩段:第 1 到第 6 課是全局課,先看懂整套方法與交付標準;第 7 課之後是逐個 Session 的實作課,照順序跟著做。下面每張卡點「開始這一課」就直接進去,想記住看到哪裡就在那一課按書籤。
先看清楚這 30 小時要交出什麼:六個工具怎麼分工、傳統寫法與 AI 協同寫法差在哪、最後那個網站長什麼樣、要練的四種能力。
把工具鏈攤開來看:VS Code、Codex、OpenSpec、Flask、資料庫、Git 怎麼串成一條生產線,以及一個請求進來要經過幾道關卡。
15 堂課怎麼分成五個階段、每堂兩小時實際在做什麼,還有進度落後時可以從哪一堂接著做。
一個功能從提案到上線要走的四步,以及跟 AI 下指令時一定要講清楚的三件事。
選網路書店還是咖啡店其實底層邏輯一樣;每堂課結束都留一份可以直接載入的快照,不怕中途跟不上。
期末要做到什麼程度才算過,以及這門課真正要換掉的身分——從寫程式的人變成主導開發的架構師。
S01 上半場。建立專案的基礎工作區,看懂 AI Agent 的六階段自主循環、五個角色怎麼分工,並把網路書店的願景與範圍先講清楚。
S01 下半場。README 與 AGENTS.md 是給兩種讀者看的;接著打地基、用三段式 Prompt 實跑一次,最後完成第一次提交。
S02 上半場。為什麼一句話的需求不夠、specs/ 與 openspec/changes/ 各管什麼、需求怎麼拆成五層,以及用 Given/When/Then 與 INVEST 六問檢查一條 User Story。
S02 下半場。Propose → Validate → Apply → Archive 的完整流程、四份文件各自回答什麼問題,還有提案階段絕對不可以改程式碼這條紅線。
S03 上半場,只講觀念:為什麼要用虛擬環境、App Factory 與 Blueprint、MVC 為何要拆成五層、樣板與靜態檔案怎麼管理、健康檢查的請求流程,以及統一 API 回應格式長什麼樣。
S03 下半場,動手把上一堂的觀念寫成程式:分層實作健康檢查 API、用 Mock 測試資料庫斷線、走完 Apply → Verify → Archive → Commit 的協作循環,最後對照產出檢核表與常見問題排除。
投影片原題:規格驅動 × AI 協同:次世代軟體開發實戰
這是整門課的標題頁,先看四個角落的方塊,代表四個核心角色,各自負責什麼、彼此怎麼連。
四個方塊之間用線連起來,代表它們要協同運作,不是各自獨立作業。下方四個標籤 Python 3.12、Flask MVC、Codex Agent、OpenSpec 是課程會用到的具體技術,其中 Flask 是 Python 的網站框架,OpenSpec 是一套先把需求寫成規格文件、再讓 AI 依規格實作的工作方法。
副標「從需求到部署,30 小時打造具備 AI 客服的網路書店」,就是整門課的終點目標。
一句話記住:這門課用 Python + Flask 寫網站、VS Code 當工作台、Codex 當會寫程式的 AI 隊友、Git 記錄每一步,四個角色缺一不可。
對應課堂:S00
投影片原題:典範轉移:重塑開發心態
這張是一張左右對照表,把「傳統模式」跟「新範式」放在一起比,由上往下比四件事。
下方那句「你不是寫程式的機器,你是會下指令、會審查的 AI 指揮官」點出這門課真正要練的是「指揮」跟「驗證」的能力,不是打字速度。
一句話記住:這門課判斷「做完了沒」不是看畫面順不順眼,而是看驗收條件對不對得上、測試過不過得了。
對應課堂:S00
投影片原題:最終交付物:專案藍圖預覽
這張投影片用三張示意畫面預覽最終成果:左邊是手機版首頁、中間是電腦版首頁、右邊是書籍列表頁。
下面三張圖是範例網站實際跑起來的畫面:首頁的 Hero 區(網頁最上方那塊搶眼的大標題與行動按鈕區域)、書籍目錄頁,以及手機版的三種畫面。
一句話記住:同一套後端 API、同一套資料,前端要能同時撐起電腦版、手機版,還要留一個接口給會自己找書的 AI 客服。
對應課堂:S04、S06
投影片原題:核心能力養成:四大知識支柱
這四張卡片其實就是後面十五堂課的四條主軸,彼此穿插進行,不是分開四段各上各的。
一句話記住:規格、AI 協作、網站開發、品質交付這四件事,會在十五堂課裡反覆交織出現,不是各上各的。
投影片原題:工具生態系與協作關係
這張用一個循環圖說明六個核心工具怎麼互相搭配。
底部那句「核心運作法則」把整張圖濃縮成一句話:從 OpenSpec 輸入規格,Codex 執行實作,測試通過後才用 Git 提交——這個順序是固定的,不會跳過規格直接叫 AI 寫程式。
一句話記住:規格先進、AI 才動手、測試過了才進版控,這個順序顛倒不得。
對應課堂:S01、S02
投影片原題:分層系統架構(Layered System Architecture)
這張是一個由上而下的五層堆疊圖,說明使用者的一個操作(例如點「加入購物車」)在程式裡要經過哪幾層才會真正碰到資料庫。
右上角的警示標語是這張圖的重點:「嚴禁越級打怪」,意思是相依方向只能由上往下——舉例來說 Controller 絕對不能跳過 Service 直接查資料庫,每一層只能呼叫自己正下方那一層,不能跳關,也不能反過來被下層呼叫。
一句話記住:畫面、控制、商業邏輯、資料存取、資料表這五層各管各的事,誰都不能跳過中間層直接動資料庫。
對應課堂:S03
投影片原題:課程五大里程碑:對應 SDLC 生命週期
這張流程圖把 15 堂課依序拆成五個里程碑,由左到右、由上到下走。
整張圖其實就是把軟體工程教科書上的 SDLC 五階段,對照到這門課實際的堂數安排。
一句話記住:前兩堂打地基(規格)、中間九堂蓋骨架跟功能、最後三堂收尾驗收,順序不能反過來。
對應課堂:S00
投影片原題:15 堂課相依拓撲圖(Session Dependency Map)
這張用節點跟箭頭畫出 15 堂課之間誰要先完成、誰才能開始的關係。
兩條支線互不相依,可以並行,但兩條都做完之後才會匯流到最右邊的 S13(測試)→S14(部署)→S15(期末整合)。右下角那句提示很實用:「進度落後免擔心!切換至對應堂數的 Git Tag 快照,一秒同步環境,直接接續實作」——也就是說如果卡在某一堂沒做完,不必從頭重做,直接載入上一堂課結束時的快照就能接著做下一堂的任務。
一句話記住:S01 到 S06 一定要照順序做,S06 之後兩條支線可以分頭並行,但要兩條都完成才能進入最後三堂收尾。
對應課堂:S00
投影片原題:每堂課微循環:2 小時標準節奏
這張甜甜圈圖把每一堂課固定的 2 小時拆成六個階段,圖上的弧形大小就是時間長短的比例。
六個階段合起來剛好是「回顧 → 理解 → 看示範 → 自己做 → 檢查 → 交代」的完整循環,每一堂課都用同一套節奏跑一次。
一句話記住:一半時間(50 分鐘)花在看老師怎麼指揮 AI 做事,另一半平均分給回顧、講解、自己動手跟收尾。
對應課堂:S00
投影片原題:OpenSpec 規格驅動工作流(Spec-Driven Workflow)
這張用四個方塊由左到右畫出 OpenSpec 的標準流程。
圖的上方有一條紅色回頭箭頭,標著「pytest 或人工驗證未通過 ⇒ 退回審查與實作」——意思是如果測試沒過或人工檢查發現問題,流程會被打回第二、三步重做,不會硬著頭皮往下走。每個方塊角落還畫了一個鎖頭圖示,暗示這是一套有紀律、一步一步鎖住的流程,不能跳步驟。
一句話記住:先寫規格、規格先過關、再動手實作、測試過了才歸檔,四步驟不能跳著做。
對應課堂:S02
投影片原題:駕馭 AI 的 Prompt 三要素(The Prompting Formula)
這張投影片列出跟 Codex 協作時,一個好的 Prompt(下給 AI 的指令)要包含的三個要素,由上到下排列。
每一要素旁邊都用不同顏色的方框裝著一句範例句,方便直接照著套用。下方那句結語「AI 產碼極快,但『規格清晰度』決定了程式碼品質」呼應第一張投影片的結尾——講清楚要什麼,比會不會打字更重要。
一句話記住:情境、限制、預期產出三個都講清楚,Codex 產出的品質才穩。
對應課堂:S04
投影片原題:雙軌專案選擇:領域模型映射表
這張是一張左右對照表,中間欄是抽象的架構概念,左右兩欄是網路書店(預設專案)跟咖啡店(彈性替換專案)各自的具體做法,由上到下比四件事。
下方提示「底層架構不變!先改 vision.md(願景文件)與 Specs,再讓 AI 依規格調整程式」點出這張圖真正的重點:換專案主題不代表要重寫整套系統,只要規格文件寫清楚,分層架構、API 規範跟測試方法都能直接沿用。
一句話記住:換成咖啡店主題,改的是資料模型跟規格文件,不是整個系統的骨架。
對應課堂:S00
投影片原題:時光機:Git Tag 與快照管理
這張投影片上半部是一條時間軸,由左到右排出 s01 到 s07 七個節點,每個節點就是一個 Git Tag,代表課程進行到那一堂結束時的狀態;下方括號註明這些是「無 .git 的獨立資料夾純淨快照」——意思是每個快照資料夾本身不含版本歷史,只是那一刻的程式碼原貌,要看完整歷史得回到主要的 Git 儲存庫。
一句話記住:每堂課結束都是一個可以直接跳回去的存檔點,重開一份快照就是走一次固定的四步驟。
對應課堂:S00
投影片原題:期末驗收 12 大檢核點(Final Acceptance Criteria)
這張用三欄表格列出期末驗收的 12 個檢核點,分成三大類。
三欄前面都打了綠色勾勾,代表這是範例專案 bookstore-agent 實際做到的完成狀態,同時也是學員自己專案最後要對照檢查的清單。
一句話記住:期末不是只看網站能不能跑,基礎功能、AI 協同、工程品質三個面向都要各自過關。
對應課堂:S15
投影片原題:結語畫面
這張是模擬終端機(命令列視窗)畫面的結語。
這張畫面呼應開場第一、第二張投影片提到的典範轉移——整門課想傳達的角色轉變,從頭到尾說的是同一件事。
一句話記住:這門課練的終極目標不是打字速度,是「會下指令、會審查、能主導」的能力。
這堂課是 Session 01 教學講義(26 頁教案講義+15 張投影片)的前半段,先講觀念:AI Agent 怎麼協作、傳統開發跟 AI 協同開發差在哪、五個角色怎麼分工,以及網路書店 bookstore-agent 這個導引專案的願景與範圍。動手操作的部分在下一堂「S01 下」。
投影片原題:Session 01|AI Agent 開發與專案導入
海報用樂高積木比喻這堂課:一個學員和一個 AI 機器人角色,一起把導引專案 bookstore-agent(網路書店)打好地基,分成開發工具與專案基礎兩疊積木。
另一張標題投影片把四個角色畫成圓角方塊:Python 寫程式、VS Code 當工作台、Codex 是會主動動手做事的 AI 隊友、OpenSpec(規格驅動開發工具)先寫規格再實作。
一句話記住:這堂課不寫任何 Flask 程式,而是先把「專案工作區」與「讓 AI 能正確工作的文件」準備好,後面 14 堂課的每一次協同開發都會回頭讀這些文件。
對應課堂:S01
投影片原題:The Paradigm Shift:從實作者到架構師
這張左右對照表,把「傳統開發」跟「AI 協同開發」放在一起比,由上往下比四件事,看開發者的角色怎麼從實作者變成架構師。
一句話記住:AI 協同開發不是「把工作丟給 AI」,而是開發者的角色從親手打每一行程式,轉變為定義問題、提供上下文、設定規則、審查與驗收。
對應課堂:S01
投影片原題:AI Agent 協作流程:自主循環與人類審查
一般聊天式 AI 只會回答問題;AI Agent(AI 代理)會為了完成任務自己決定下一步、呼叫工具,並依工具回傳結果調整做法,這張圖畫出它的六個階段。
一句話記住:AI Agent 不只是「回答問題」,而是能在工作區內自主探索、執行指令並修正錯誤的協作者,但最後永遠要經過人類審查。
對應課堂:S01
投影片原題:(分工協作示意圖)
這張圖由上往下畫出協作關係:開發者站在最上層,底下依序是規格與規則、Codex Agent,最下層是三支實際做事的基礎建設。
一句話記住:開發者始終位於這個迴圈的起點與終點:Codex 產生的內容一定要經過開發者審查,才會進入 Git 的版本紀錄。
對應課堂:S01
投影片原題:Vision:打造一個「會聊天、懂推薦」的網路書店
在寫任何程式之前,這門課先用一份系統願景文件回答三個問題:為什麼要做、為誰而做、這一期做到哪裡,答案取自範例專案的 docs/vision.md。
為什麼要特別寫「暫不處理」清單?因為把界線寫清楚,Codex 在後續實作時才不會自作主張加上金流或多語系功能,Session 02 拆解需求時也會拿它排除不需要的需求。
一句話記住:「暫不處理」清單和「本期範圍」一樣重要:範圍寫得越清楚,AI 產生的程式碼才不會虛構出課程沒打算做的功能。
對應課堂:S01
接續上一堂的概念,這堂課走完講師示範的 7 個操作步驟:安裝檢查環境、建立 Git 倉庫、設定 VS Code、下指令請 Codex 產生 README.md 與 AGENTS.md、撰寫系統願景文件,最後完成第一次 Git 提交,並附上學員實作任務與產出檢核表。
投影片原題:(README.md 與 AGENTS.md 對照表)
兩份文件都放在專案根目錄,但讀者完全不同:README.md 是給人看的專案說明,AGENTS.md 是給 AI Agent 看的工作規則。
AI 的行為準則必須被「硬編碼」(hardcoded,寫死在檔案裡)在工作區中,不要寫空泛口號,要寫可以驗證的規則。
一句話記住:可以想像,如果明天有一位新同學和一個 AI Agent 同時加入專案,他們各自第一個要讀的是哪份文件,答案就是這兩份文件的分工。
對應課堂:S01
投影片原題:Groundwork Steps 1 & 2(對應步驟 1~3)
終端機示範執行 python tools/check_env.py(範例專案內建的環境檢查程式),一次列出各工具版本;畫面上的版本號只是示範截圖,不是硬性規定。
extensions.json 裡的 openai.chatgpt 套件,就是在 VS Code 裡直接使用 Codex Agent 的入口;settings.json 則預先綁定 UTF-8 編碼,避免中文註解變亂碼。
一句話記住:第一次用 Git 的電腦要先設定 git config user.name,否則之後提交會出現「Author identity unknown」錯誤,動手前先做這一步。
對應課堂:S01
投影片原題:The Anatomy of a Codex Prompt(對應步驟 4)
課程規定跟 Codex 對話要用三段式 Prompt:【Context】背景、【Constraint】限制、【Expected Output】預期產出,把 AI 當成執行特定邏輯的編譯器,而不是用聊的碰運氣。
右邊的終端機示範畫面裡,Codex 先執行 ls -a 跟 git status 確認專案是空的,再打開 README.md 開始編輯,正好對應理解任務、規劃、使用工具三個階段。
一句話記住:驗證方式看兩個地方:功能範圍表格有沒有寫「期末目標」而不是當成已完成;快速開始那段有沒有出現目前還不存在的指令。
對應課堂:S01
投影片原題:Human Review Checklist(對應步驟 5~6)
產生 AGENTS.md 前的 Prompt 要求說明分層架構、規定工作流程(先讀規格、先說計畫、小步提交、驗證結果),並包含命名規範、常用指令、安全規範與完成定義。
接著以 README.md 為基礎,產出這堂課真正的正式產出 docs/vision.md(系統願景文件),內容包含問題與機會、目標使用者、本期範圍與里程碑,作為 Session 02 拆解需求規格的依據。
一句話記住:AGENTS.md 的每一條規則都應該能回答「要怎麼檢查它有沒有被遵守」,答不出來就代表這條規則寫得太空泛。
對應課堂:S01
投影片原題:Atomic Commits(小步提交,對應步驟 7)
最後一步把工作目錄裡的檔案,經過 git add . 送進暫存區,再用 git commit 提交進本機儲存庫,畫面上示範的提交訊息是 chore: 專案初始化。
完成這堂課後達成三項產出:開發環境驗證、專案規則確立、系統願景鎖定,下一堂 Session 02 會把願景拆解成 Epic、Feature、User Story 與可測試的驗收條件。
一句話記住:指揮中心已經建置完畢:這堂課的重點不是打字速度,是讓 Codex 產生的每一步都留下看得見、退得回的紀錄。
對應課堂:S01
依教案講義六、講師示範:操作步驟整理(示範以 Windows PowerShell 為例)
這堂課的講師示範共 7 個步驟,範例路徑是 C:\course\bookstore-agent;macOS/Linux 的建立資料夾指令略有不同,內容以下方各步驟為準。
npm install -g @openai/codex 與 npm install -g @fission-ai/openspec 安裝,登入後跑 python tools/check_env.py 檢查全部工具。git init -b main,第一次用 Git 的電腦要先 git config user.name "你的名字",再建立 .gitignore。code . 開啟資料夾,依提示安裝八個建議擴充套件。git status --short 看清楚有哪些檔案,再執行 git add . && git commit -m "chore: 專案初始化",最後用 git log --oneline --decorate 確認。一句話記住:每一步都遵守同一個節奏:Codex 完成一個小任務,人工檢視差異,再提交,不要讓 Agent 連續改完一大堆檔案才回頭檢查。
對應課堂:S01
依教案講義七、學員實作任務與八、產出檢核表整理
動手做之前先看完成標準:以下是課堂會實際檢查的 4 項任務(進階挑戰為第 5 項),以及本堂全部產出的檢核清單。
產出檢核表共 8 個項目,全部打勾才算這堂課真正做完:
一句話記住:這堂課「Session 實作任務」佔總評量 30%,是全部 6 項評量裡比重最高的一項,docs/vision.md 也會直接影響 Session 02 的規格分數。
對應課堂:S01
這堂課是 Session 02 教學講義(29 頁教案+14 張投影片)的前半段,只講一件事:為什麼「先寫規格」不是拖慢進度,而是唯一能讓 AI 做對的方法。內容涵蓋一句話 Prompt 會產生什麼盲點、三種開發方式的差異、specs/ 與 openspec/ 的分工、需求怎麼從 Epic 一路拆到 Task,以及怎麼判斷一條 User Story 寫得夠不夠好。動手操作與四份文件的寫法在下一堂「S02 下」。
海報原題:Python AI Agent 實戰課程|Session 02 OpenSpec 與需求規格驅動開發
海報用樂高場景把整堂課畫成一條生產線。左上角的人腦子裡一團亂線:想做線上書店、加上 AI 客服、可以推薦書籍嗎、還要會員與訂單。右邊的機器人拿著規格在寫程式。中間那句話就是本堂主軸——先寫清楚,再開始開發。
一句話記住:這堂課的產出是一疊文件,不是一個能跑的網站——但下一堂課 Codex 會照著這疊文件把網站做出來,寫得好不好直接決定它做得對不對。
對應課堂:S02
投影片原題:規格即合約:OpenSpec 需求驅動開發
標題頁下方掛著三個標籤:Session 02、Spec-Driven Development(規格驅動開發)、SDLC(軟體開發生命週期)。副標是「Python AI Agent × VS Code × Codex 的精準協同作戰」。
依教案第一章,這堂課在整個課程裡的位置是把上一堂的系統願景變成可以驗收的需求,再用 OpenSpec 把下一步要做的事寫成 Codex 能執行、人能審查的變更提案。授課時數 2 小時(課程第 3–4 小時),先備知識是 Session 01 的專案初始化與 AGENTS.md。
一句話記住:Session 01 產出的 docs/vision.md 是這堂課拆 Epic 的依據,兩堂課是接續的,不是各自獨立的主題。
對應課堂:S02
投影片原題:The Prompt / AI's Blind Spots
這張圖左右對照。左邊是一支手機,上面只有一則訊息:「幫我做購物車」。右邊是一張爆炸開來的網狀圖,代表 AI 收到這句話之後在腦內展開的所有可能性,其中三個節點被特別拉出來標成問題:
教案 5.1 節把這件事講得更直白:Codex 一定會產生程式碼,但必須自己猜,每個猜測都可能與你的想法不同,而且很難在大量程式碼裡發現。圖下方那句結論是:只給一句話,它不會做出你要的系統。
一句話記住:問題不是 AI 不聽話,而是你沒講的部分它一定要自己補,補錯了還不會舉手。
對應課堂:S02
投影片原題:Dimensions|傳統開發 / 純 Prompt 開發 / OpenSpec 規格驅動
這是一張三欄對照表,左欄是比較面向,右邊三欄分別是傳統開發(灰)、純 Prompt 開發(橘)、OpenSpec 規格驅動(綠)。四個面向由上往下:
教案同一張表還多一列「主要風險」:傳統是溝通落差、純 Prompt 是幻覺與範圍失控、規格驅動則是規格品質不佳時會照錯的合約施工。
一句話記住:規格驅動不是零風險,它把風險從「AI 亂做」搬到「規格寫錯」——而規格寫錯,人看得出來。
對應課堂:S02
投影片原題:人類與產品視角 / AI 與執行視角
圖的正中央是兩個咬合的齒輪,左右各一疊資料夾,代表同一份需求的兩種寫法。
教案補充 OpenSpec 的資料夾慣例還有第三塊:openspec/specs/ 放已歸檔的正式規格,變更做完之後會歸檔進去。
一句話記住:specs/ 回答「系統現在長什麼樣」,openspec/changes/ 回答「這一次只准動哪裡」——把兩件事混在一起寫,AI 就會把整個系統都當成這次的工作範圍。
對應課堂:S02
投影片原題:Epic → Feature → User Story → Acceptance Criteria → Task
這張圖畫成五個由大到小、一層包一層的方塊,右邊各給一個購物車的實際編號當範例:
EP-03 購物車。F-03.1 加入購物車。US-03.1.1 加入書籍到購物車。AC-3 庫存不足回應 409。T-03.1.2 CartService。圖最下方那句是這一頁的重點,也是最容易搞混的地方:Task 是「怎麼做」(可變),User Story 是「做到什麼」(驗收合約,不可變)。
一句話記住:實作方式可以跟 AI 討論,驗收條件不行——那是合約,改它等於改需求。
對應課堂:S02
投影片原題:只寫「成功路徑」是無效規格!
畫面是 VS Code 開著 specs/03-shopping-cart.md,左側檔案樹列出 00-project-overview 到 05-admin-management 六份規格檔,加上 AGENTS.md 與 README.md。右側用三個編號氣泡標出一條驗收條件的三段:
POST /api/v1/cart/items 數量 2。下方黃黑警示條是這一頁真正的重點——只寫成功路徑是無效規格,錯誤情境也要寫進去,投影片列了四個常用狀態碼:
一句話記住:Then 要寫得能直接翻成一行測試——寫「正常回應」不算,寫「回應 409 且訊息為庫存不足」才算。
對應課堂:S02
投影片原題:評估故事質量的 INVEST 原則
六個拼圖塊圍成一個六角形,每一塊是一個自我檢查的問題:
教案把這六問放進學員實作 2「以 QA 角度互評驗收條件」:跟隔壁組交換規格,扮演 QA 審查對方的驗收條件,每份規格至少要收到 3 項具體意見,不可以只寫「很好」或「不夠清楚」。
一句話記住:INVEST 的每一個字母都是一個「如果答不出來就別急著往下做」的停損點,尤其是 T——寫不成測試的條件,等於沒有驗收標準。
對應課堂:S02
前一堂講「為什麼要先寫規格」,這堂講「怎麼寫、怎麼驗、誰負責哪一段」。內容涵蓋 OpenSpec 的四階段流程、四份規劃文件各自回答什麼問題、config.yaml 怎麼約束 Agent、spec.md 的精確語法(含本課程最容易踩的驗證錯誤)、提案階段絕對不能越的那條線,以及交件前的檢核表。最後一張卡是教案裡的學員實作任務、產出檢核表與評分規準。
投影片原題:Cyan = AI 執行,Emerald = 人類介入
四個方塊由左到右串成一條流水線,顏色本身就是分工說明:青色(Cyan)= AI 執行,綠色(Emerald)= 人類介入。上方還有一條橘色回頭箭頭,寫著「格式錯誤則退回重議」。
$openspec-propose,產生 4 份規劃文件。openspec validate --strict。$openspec-apply-change)。本堂課只做到第 1、2 階段——Apply 是下一堂 Session 03 的事。
一句話記住:四階段裡唯一綠色的那一格是 Validate,代表這條流水線設計上就要求人必須停下來看一次,不是全自動。
對應課堂:S02
投影片原題:proposal.md / spec.md / design.md / tasks.md
四宮格,每一格是一份文件加上它負責的問題:
一句話記住:四份缺一不可,而且最容易被寫糊的是 spec.md——它只能寫「系統會有什麼行為」,一旦寫進「用哪個函式做」就跨進 design.md 的地盤了。
對應課堂:S02
投影片原題:Context 與 Rules 是約束 Agent 的「隱含提示詞」
畫面中央是一段 YAML 設定,左右兩個氣泡各解釋一半:
Language: zh-TW、Tech stack: Flask 3 / Vue 3, MVC、API conventions: prefix /api/v1。proposal: 必須引用需求編號、tasks: 必須依照分層排序。教案提醒一個實務坑:初始化時若沒有加 --language zh-TW,Codex 產生的 OpenSpec 文件會是英文,要回到 context 補設定。
一句話記住:你不必每次下指令都重講一次技術棧——寫進 config.yaml,它就變成每一份文件都自動帶上的背景。
對應課堂:S02
投影片原題:spec.md (Delta / 系統行為) – 精確的約束語法
中間是一段 delta spec 的實際內容,三個箭頭各指出一個重點:
系統 SHALL 提供 GET /api/health…。教案補充:若描述寫成「系統提供…」而缺少 SHALL/MUST,--strict 會回 WARNING 並驗證失敗。#### Scenario: 名稱。投影片直接標明這是本課程最易踩坑的驗證錯誤點;只寫三個 ### 會得到「must include at least one scenario」。THEN 系統回應 503… 且回應 MUST NOT 包含例外細節。一句話記住:井字號數錯這件事不會給你好懂的錯誤訊息,它只會說「找不到 scenario」——看到這句話先去數井字號,不要先懷疑內容寫錯。
對應課堂:S02
投影片原題:不可越界的 Agent(Planning Boundary)
圖用一條被扯斷的鎖鏈把兩件事隔開,外面纏著黃黑警示膠帶:
$openspec-propose)。app/、requirements.txt)。下方還有一個處理方式:如果發現提案階段 AI 動到了 Code,立即 Git 捨棄變更,修正 Prompt 重新提案——不是手動把它改回來,是整個丟掉重來。
教案把這條線寫成可機檢的驗收:提案完成後跑 git status --short,只准列出 specs/、openspec/、.agents/、docs/ 底下的異動。
一句話記住:這條紅線之所以要用 git status 檢查而不是用眼睛看,是因為 Agent 越界的時候不會告訴你——你只會在下一堂課發現規格跟程式對不起來。
對應課堂:S02
投影片原題:終端機 — 檢查變更提案 / 最後一哩路(人類 QA)
左邊是終端機畫面,三個氣泡標出三個步驟:
openspec list。openspec status --change add-flask-skeleton。openspec validate add-flask-skeleton --strict。右邊是一顆發光的腦,標題「最後一哩路(人類 QA)」,列出三件指令做不到的事:
一句話記住:validate 綠燈只代表格式沒錯,不代表需求對——綠燈之後還有一段只有人做得了的審查。
對應課堂:S02
投影片原題:The Spec-Driven Checklist
五條打勾清單,全部通過才蓋下右下角那枚印章「git commit — 合約鎖定,準備實作!」:
$openspec-propose 產生了 4 份規劃文件且絕對未動到程式碼。openspec validate --strict 綠燈通過,並通過人類邏輯審查。一句話記住:這五條的最後一條寫著「並通過人類邏輯審查」——清單本身也在提醒你,機器檢查不能當成最後一關。
對應課堂:S02
依教案第七章「學員實作任務」整理
這堂課分五組,分別負責 specs/01~specs/05。四項任務如下:
openspec init --tools codex --language zh-TW .,補上 config.yaml 的 context 與 rules,用 Prompt 4 建立 add-flask-skeleton 提案。完成標準:status 顯示 4/4 artifacts complete、validate --strict 回報 valid、delta spec 至少包含一個錯誤情境 Scenario、以一個 commit 提交。#### Scenario: 改成 ### Scenario:、故意刪掉一個 SHALL,記錄兩種錯誤各自的訊息等級(ERROR 或 WARNING)與修正方式後還原。一句話記住:實作 2 特別限制「Codex 只能提意見不能改檔」,因為這一項要練的是人的審查判斷,不是讓 AI 把規格改到能過。
對應課堂:S02
依教案第八章「產出檢核表」與第九章「評量方式與評分規準」整理
本堂共 10 個產出項目,全部打勾才算做完:
specs/00-project-overview.md:含 Epic 清單、編號規則、INVEST、NFR、API 共通規範。specs/01~05 各 Feature 下的 US 皆為「身為…我想要…以便…」格式,編號符合規則。openspec/config.yaml 的 context 含技術棧與架構、rules 含 proposal 與 tasks 規則,六個 skill 存在。openspec/changes/add-flask-skeleton/ 四份文件齊全。openspec status 為 4/4、openspec validate --strict 回報 valid。docs/prompts/s02-spec-prompts.md 保留本堂 Prompt 與人工審查清單。git status --short 工作區乾淨,提交訊息說明本堂產出。評分規準分三個面向:驗收條件(25 分)——優良是全部可寫成自動化測試、錯誤情境與邊界值完整並附狀態碼與訊息,待加強是條件模糊(「正常」「快速」)或只有成功路徑;OpenSpec 變更提案(25 分)——待加強包含「提案階段修改了程式碼」;審查與提交(10 分)——優良是互評意見具體且被採納、Prompt 紀錄完整。
一句話記住:評分規準把「提案階段改了程式碼」直接列進待加強——那條紅線不只是流程建議,是會扣分的硬規定。
對應課堂:S02
依教案第十章「常見問題與排除」整理
npm install -g @fission-ai/openspec,關閉並重新開啟終端機,以 openspec --version 確認。$openspec-propose——未以 --tools codex 初始化,或 Codex 在 init 之前就已開啟。確認 .agents/skills/openspec-propose/SKILL.md 存在,於專案根目錄重新開啟 Codex 工作階段。#### Scenario: 名稱,每個 Requirement 至少一個。specs/能力名稱/spec.md,或沒有使用 ## ADDED Requirements 等標題。依 proposal 的 Capabilities 補上 delta spec;只有純文件或重構、沒有行為變更時,才在 .openspec.yaml 設定 skip_specs: true。一句話記住:五個問題裡有三個是格式細節(井字號、SHALL、delta),不是觀念錯誤——遇到 validate 紅字先照這三項對一次,通常兩分鐘就解決。
對應課堂:S02
這堂課是 Session 03 教學講義(28 頁教案+12 張投影片)的前半段,只講觀念:為什麼要用虛擬環境、App Factory 與 Blueprint、MVC 為何要拆成五層、樣板與靜態檔案怎麼管理、健康檢查的請求流程,以及統一 API 回應格式長什麼樣。動手把這些觀念寫成程式的部分在下一堂「S03 下」。
投影片原題:Python Web 系統骨架與 MVC 嚴格分層架構
標題頁背景是一組互鎖的深藍立方積木,彼此卡合、找不到一條直通的縫——用來比喻這堂課要蓋的嚴格分層架構:每一層都卡進上下層,不能單獨抽掉。下方副標寫「打造具備高測試性、AI Agent 準備就緒的 Flask 企業級基礎」,四個標籤 [Flask 3.1]、[App Factory]、[MVC]、[Pytest] 就是本堂的四個關鍵字。
補充海報把同一件事畫成一疊樂高積木,由上到下正好是 View → MVC Controller → Service → Repository → Model → Database 六層,中間特別標註「商業邏輯集中 Service 層:讓業務邏輯保持純粹、可測試、可擴充、可維護」。海報右側是實際畫面:一個 bookstore-agent 書店首頁,以及一段 GET /api/health 回傳 {"status": "ok", ...} 的終端機截圖。
一句話記住:標題已經把整堂課的驗收標準寫出來了——不是「網站能動」,而是「AI Agent 準備就緒」,也就是分層乾淨到 AI 接手時也不會誤判一段程式該放哪一層。
對應課堂:S03
投影片原題:一個穩健的企業級專案,不只是一堆程式碼的集合,而是由四道防線緊密扣合的系統建築。
圖中是一疊由下往上堆的方塊,四道防線由下到上分別是:
.venv 虛擬環境,阻絕外部干擾。這四道防線正好對應接下來 5.1 到 5.7 節要講的內容:虛擬環境(5.1)、App Factory(5.2)與 Blueprint(5.3)合起來是彈性核心、MVC 分層(5.4)是嚴謹紀律、健康檢查與回應格式(5.6、5.7)是自動驗證。
一句話記住:四道防線由下往上疊,地基如果是隔離環境沒做好,上面三層的穩健都無從談起。
對應課堂:S03
投影片原題:為什麼我們需要 .venv?為了徹底消滅「在我的電腦上可以跑」的噩夢。
左邊一團纏繞的紅線代表「全域環境」,右邊整齊的藍色積木代表「專屬虛擬環境 (.venv)」,中間對照表:
.venv 是專案內專屬。.venv 各專案獨立、互不干涉。.venv 憑 requirements.txt 一鍵還原。下方 AI 協作守則氣泡:「明確的虛擬環境與 tools/check_env.py 腳本,能確保 AI Agent 執行指令時,絕對不會用錯直譯器。」教案補充 tools/check_env.py 的最後一列會檢查虛擬環境:未啟用時顯示「尚未啟用(Session 03 建立)」,啟用後顯示「使用中」,可以請學員啟用前後各跑一次直接看差異。
右下角終端機截圖顯示實際指令:python -m venv .venv、.venv\Scripts\activate、pip install -r requirements.txt,最後一行 Successfully installed Flask-3.1.0 Flask-Migrate-4.0.7 Flask-SQLAlchemy-3.1.1 …。macOS/Linux 的啟用指令則是 source .venv/bin/activate。
一句話記住:虛擬環境不只是「隔離套件」而已——AGENTS.md 把啟用方式寫清楚之後,AI 執行指令時才不會誤用錯的直譯器。
對應課堂:S03
投影片原題:拋棄全域 app = Flask(__name__),改用工廠模式延遲建立,獲得測試隔離的最大彈性。
圖中畫成一條「Assembly Pipeline(組裝生產線)」:左邊 Dev/Test/Prod 三個輸入方塊,匯入中間的 create_app() 方塊,內部依序是「1. 載入設定 → 2. 設定 JSON 格式」與「3. init_extensions(延遲綁定資料庫)→ 4. register_blueprints」兩條並行的步驟,最後輸出一個「客製化 App 實體」。
下方對照表:單一全域 App 是「測試時與開發環境共用同一個實體資料庫,易互相污染」;App Factory 是「呼叫才建立,測試時可隨洗隨用獨立的記憶體資料庫 sqlite:///:memory:」。教案補充這個決策記錄在變更提案 design.md(D1);run.py 與測試用的 tests/conftest.py 都透過同一個 create_app() 取得 app,差別只在傳入的設定名稱。
一句話記住:App Factory 真正的好處不是少寫一行程式,是讓 pytest 每次呼叫 create_app("testing") 都能拿到一個全新、互不污染的記憶體資料庫 app。
對應課堂:S03
投影片原題:App 核心不必知道所有路由細節。透過 Blueprint 將路由邏輯下放,實現真正的模組化。
圖中央是一個菱形「Blueprint 路由器」,三條路徑往下分流:
/(無前綴)→ main_bp → 導向首頁 HTML 視圖。/api(URL 前綴)→ health_api_bp → 導向 JSON 格式的後端 API。/static(內建)→ 導向前端離線資源(CSS/JS)。教案補充完整對照:main_bp 變數對應名稱 main、檔案 app/controllers/main_controller.py,路由 GET / → endpoint main.index;health_api_bp 變數對應名稱 health_api、檔案 app/api/controllers/health_api.py、url_prefix="/api",路由 GET /api/health → endpoint health_api.health。變數命名遵守 AGENTS.md 的「模組名_bp」規範。下方實務守則:「樣板中的連結一律使用 url_for('blueprint_name.endpoint')。未來若需修改路由前綴,系統將自動適應,全身而退。」
一句話記住:main.index 這種 endpoint 名稱不是巧合,是 Blueprint("main", __name__) 裡的第一個參數決定的,樣板裡也要用同一個名字呼叫 url_for()。
對應課堂:S03
投影片原題:傳統三層 MVC 已不足應付複雜邏輯。我們將 Model 細分,並強制規定:相依方向只能由上往下。
五層堆疊由上到下:
request 網路物件。教案對照表把每一層落到本堂實例:app/controllers/(main_controller.py)、app/api/controllers/(health_api.py)、app/services/(health_service.py)、app/repositories/(health_repository.py),Model 這一層本堂尚未建立,要等 Session 05 才會放入資料模型。design.md 的 Risks 已預期「骨架目錄在初期看起來過度設計」,先把位置訂好,是為了讓 Codex 在後續課程產生程式時不會各自決定放置位置。
一句話記住:三個紅色禁止圈都指向同一件事——相依只能往下,Repository 永遠不知道 Service 在做什麼,Service 永遠不碰 request。
對應課堂:S03
投影片原題:透過 Jinja2 版型繼承實踐 DRY 原則,並以「離線第一」策略確保網路不穩時的絕對穩定性。
左邊是繼承關係圖:base.html(定義骨架與 block 區塊)被 index.html(繼承並填入專屬內容)以 extends 繼承,另外 partials/navbar.html(共用元件)以 {% include %} 引入到 base.html。右邊是 app/static/ 資料夾,裡面放了四個離線函式庫:Bootstrap 5、Vue 3、Axios、SweetAlert2。下方寫著:「為何不依賴 CDN?確保網路不穩時前端依然可用,且版本絕對固定不變。」
投影片沒有畫出設定檔管理的部分,以下依教案 5.5 節文字補充:設定集中在 app/config.py,以三個繼承 Config 的類別區分環境——DevelopmentConfig(DEBUG = True,本機開發預設值)、TestingConfig(TESTING = True,資料庫改為 sqlite:///:memory:,由 conftest.py 指定)、ProductionConfig(DEBUG = False)。敏感設定(SECRET_KEY、DATABASE_URL)一律從環境變數讀取,開發時可寫在不提交 Git 的 .env。
一句話記住:離線第一不是圖方便,是 design.md D5 寫明的規格要求——首頁 MUST NOT 依賴任何外部 CDN。
對應課堂:S03
投影片原題:健康檢查不能只回傳 Hello,必須真實觸碰底層資料庫,且系統必須具備自我保護機制。
GET /api/health 進來後依序經過 API → Service check() → Repo ping(),最後對資料庫執行真實的 SELECT 1。
status ok/database ok → 回 HTTP 200(success_response),服務正常。SQLAlchemyError → Service 攔截例外並用 logger.exception 寫入 Server Log → 組成 status degraded/database error → 回 HTTP 503(error_response),資料庫無法連線。下方安全規範:「失敗時,API 回應絕不拋出給前端,嚴禁洩漏資料庫連線字串或例外詳細訊息!」這條對應 design.md D4 與 AGENTS.md 第 6 節安全規範。
一句話記住:狀態是 degraded 不是 error,因為服務本身還活著、只是資料庫這一項壞了——status 與 database 分成兩個欄位講的就是這件事。
對應課堂:S03
投影片原題:統一生產回應格式,讓前端與 AI Agent 都能用同一套標準邏輯解析所有結果。
JSON 範例與五個欄位的說明各自用箭頭標出:
code——HTTP 狀態碼,與標頭一致。success——布林值,提供最直覺的成功/失敗判斷依據。message——繁體中文,給人類開發者與 UI 顯示的摘要。data——實際資料載體,包含 app、version、status、database、time 等系統狀態與時間戳。errors(選用)——表單驗證失敗時的詳細明細,只有傳入時才出現。教案附上實作:app/api/response.py 的 success_response(data=None, message="成功", code=200) 與 error_response(message, code=400, errors=None, data=None) 兩個函式,統一用 jsonify() 包裝。講師提示:大綱 Session 12 列出的統一回應格式是 code、message、data 三個欄位,本專案依 openspec/config.yaml 的 API 慣例多加 success 欄位,屬於相容的擴充。
一句話記住:success 是給程式判斷用的布林值,message 是給人看的中文——兩個欄位分工不同,不要只看 message 的字串內容就當成程式邏輯的判斷依據。
對應課堂:S03
前一堂講觀念,這堂動手把觀念寫成程式:跟著教案第六節的 10 個操作步驟,從 $openspec-apply-change 開始,建立虛擬環境、App Factory、Blueprint 首頁,再分層實作健康檢查 API、用 Mock 測試資料庫斷線,最後走完 Archive 與 Commit。最後三張卡是學員實作任務、產出檢核表與常見問題排除,以及下次課程預告。
$openspec-apply-change 到可執行的 App Factory依教案第六節「講師示範:操作步驟」步驟 1–4 整理
步驟 1(開始實作):Prompt 給 Codex——$openspec-apply-change add-flask-skeleton,請它依 tasks.md 的順序一次完成一組任務(先做「1. 開發環境」與「2. App Factory 與設定」),每完成一項就勾選 tasks.md,並回報驗證指令與結果,遵守 AGENTS.md 的分層規範。本變更共 5 組 9 項任務:開發環境、App Factory 與設定、首頁 Blueprint 與版型、健康檢查 API、整合驗證。
步驟 2(虛擬環境與套件,任務 1.1、1.2):指令(PowerShell)依序是 python -m venv .venv、.venv\Scripts\activate、pip install -r requirements.txt(macOS/Linux 用 source .venv/bin/activate)。requirements.txt 固定版本:Flask==3.1.0、Werkzeug==3.1.3、Flask-SQLAlchemy==3.1.1、SQLAlchemy==2.0.49、Flask-Migrate==4.0.7、marshmallow==3.21.3、PyJWT==2.8.0、python-dotenv==1.0.1、pytest==8.2.0;任務 1.2 把常用指令補進 AGENTS.md 第 5 節。
步驟 3(設定檔與擴充套件,任務 2.1):app/config.py 用三個繼承 Config 的類別區分環境,敏感設定一律從環境變數讀取;app/extensions.py 集中建立 db = SQLAlchemy() 與 migrate = Migrate(),用 init_extensions(app) 以 init_app 模式延遲綁定,避免循環匯入。db 物件在模組層級建立但尚未綁定任何 app,因此 Repository 可以安全地 from app.extensions import db,不必匯入 app 本身。
步驟 4(create_app() 與 run.py,任務 2.2):create_app(config_name) 依設定名稱建立 Flask app,設定 app.json.ensure_ascii = False 與 app.json.sort_keys = False 讓 JSON 回應保留中文且欄位順序固定為 code、success、message、data,接著呼叫 init_extensions(app) 與 register_blueprints(app)。register_blueprints() 在函式內才匯入 Blueprint,避免 app 套件與 Controller 互相匯入。
一句話記住:步驟 3 裡 db 物件先建立、後綁定的寫法,就是為了讓 Repository 可以直接匯入 db 而不必先匯入整個 app,避開 Python 常見的循環匯入陷阱。
對應課堂:S03
依教案第六節「講師示範:操作步驟」步驟 5–6 整理
步驟 5(首頁與版型,任務 3.1、3.2):main_controller.py 建立 main_bp = Blueprint("main", __name__),定義 LAYERS 清單(Controller/Service/Repository/Model 四層各自的名稱、圖示、路徑與職責),index() 函式用 render_template("main/index.html", layers=LAYERS)。base.html 定義共用版型並離線引入 Bootstrap 5、Bootstrap Icons 與自訂 CSS,用 {% include %} 帶入 partials/navbar.html 與 footer.html;index.html extends base.html,用 {% for layer in layers %} 迴圈產生四張分層卡片,不必為每一層重複寫一次 HTML。導覽列用 url_for('main.index') 與 url_for('health_api.health') 產生連結。驗證方式:任務 3.2 用瀏覽器開啟 / 看到網站名稱驗證;任務 3.1 用開發者工具 Network 分頁確認沒有外部網路請求。
步驟 6(分層實作健康檢查 API,任務 4.1、4.2):依 Repository → Service → API Controller 的順序實作 GET /api/health。health_repository.py 的 HealthRepository.ping() 只執行 db.session.execute(text("SELECT 1")),不判斷結果代表什麼。health_service.py 的 HealthService.check() 呼叫 repo.ping(),成功則 database = "ok",遇到 SQLAlchemyError 就 logger.exception 記錄並把 database 設為 "error",回傳 status、database、time 三個欄位。health_api.py 的 health() 呼叫 _health_svc.check(),資料庫正常回 success_response(data, "服務正常"),否則回 error_response("資料庫無法連線", 503, data=data)。Prompt 給 Codex 的三個 Constraint:①依分層實作;② API Controller 不可直接使用 db,資料庫錯誤只寫 Log、不可回傳例外細節;③回應一律使用 app/api/response.py 的 success_response/error_response。
一句話記住:三層各自的職責寫得很死——Repository 不判斷、Service 不碰 request、Controller 不碰 db;對照 AGENTS.md 檢查一段程式碼該放哪一層,答案通常一看職責描述就能判斷。
對應課堂:S03
投影片原題:規格要求 4 個 Scenario,我們用 Pytest 來證明。如何測試資料庫斷線?不要拔網路線,用 Mocking!
左邊「真實環境」畫 App 直接連 Database;右邊「測試沙盒(Test Sandbox)」畫 create_app('testing') 指向記憶體資料庫 sqlite:///:memory:,下方一個 Mock 叉叉圖示旁寫著:「強制替換 HealthRepository.ping,主動拋出假例外(OperationalError),精準驗證 Service 是否如預期攔截並回傳 503。」右下角終端機截圖是 pytest -v 的實際執行結果,4 個測試全部 PASSED:test_home_page_shows_site_name、test_home_page_uses_local_static_assets、test_health_returns_unified_response、test_health_reports_database_error_without_details,最後一行 4 passed in 0.05s。
教案補充:tests/conftest.py 的 app fixture 用 create_app("testing") 建立 app,並在 app_context() 內 db.create_all()/結束後 db.drop_all()。Mock 的原理是用 unittest.mock.patch 把 HealthRepository.ping 換成「一呼叫就拋出 OperationalError」的假方法,OperationalError 是 SQLAlchemyError 的子類別,所以會被 Service 捕捉。注意事項:若直接執行 pytest 出現 ModuleNotFoundError: No module named 'app',代表 pytest 找不到專案根目錄的 app 套件,要改用 python -m pytest -v -p no:cacheprovider,或使用 VS Code 的測試面板。
一句話記住:測試資料庫斷線不是真的去關掉資料庫服務,而是用 patch 把 ping() 換成一個保證拋例外的假方法——這樣測試才能穩定重現、不受真實環境影響。
對應課堂:S03
投影片原題:系統地基並非一蹴可幾。我們如何與 AI 協作完成這一切?
圓形圖分四個階段,順時針走一圈:
tasks.md 小步實作,指令 $openspec-apply-change。flask routes。spec.md,指令 openspec archive。git commit。教案把這四格展開成實際步驟:步驟 8(驗證)執行 flask --app run.py routes 列出 health_api.health(/api/health)、main.index(/)與內建的 static,再用瀏覽器開啟首頁與 /api/health 確認結果。步驟 9(歸檔)對 Codex 下 Prompt:「請執行 pytest 與 flask --app run.py routes,確認所有 Scenario 都有對應測試,全部通過後勾選 tasks.md 剩餘項目並執行 $openspec-archive-change add-flask-skeleton」;歸檔會把變更中 ADDED Requirements 的 2 個 Requirement 寫入 openspec/specs/system-health/spec.md,再把整個變更資料夾移到 openspec/changes/archive/2026-09-14-add-flask-skeleton/。步驟 10(提交)依序執行 git status --short(清單中不應出現 .venv/、instance/ 或 __pycache__/)、git add .、git commit -m "feat(s03): Flask App Factory、MVC 分層骨架與健康檢查 API"、git log --oneline --decorate。
一句話記住:這張圖把步驟 1–10 濃縮成四個動作,但順序不能跳——沒有 Verify 綠燈就去 Archive,合併進正式規格的會是一段沒驗證過的行為。
對應課堂:S03
依教案第七章「學員實作任務」整理
學員實作 1:建立虛擬環境並啟動 Flask 骨架——任務:在自己的 bookstore-agent 專案中建立虛擬環境與 App Factory,並以 Blueprint 顯示首頁。完成標準:flask --app run.py routes 列出 main.index 與 static;瀏覽器開啟 http://127.0.0.1:5000/ 可看到網站名稱、導覽列與頁尾,且 Network 分頁沒有外部請求。
學員實作 2:自行完成健康檢查 API 並通過測試——任務:依分層實作 GET /api/health,並撰寫 tests/test_health.py 驗證 4 個 Scenario。步驟提示:先寫 HealthRepository.ping(),再寫 HealthService.check(),最後寫 health_api,每層只做自己的事;資料庫失敗情境以 unittest.mock.patch 替換 HealthRepository.ping,讓它拋出 OperationalError。完成標準:pytest 結果為 4 passed;/api/health 回傳 200,欄位順序為 code、success、message、data,中文正常顯示;API Controller 中沒有出現 db;失敗時回應 503 且不含例外訊息;勾選 tasks.md 並完成 openspec archive,最後 commit。
進階挑戰(二選一):選項 A 新增 GET /api/version,回傳 data 包含 app 與 version(取自 current_app.config),使用 success_response();選項 B 在首頁 LAYERS 加入一筆新資料(例如 API Controller 或 View),選用一個 Bootstrap Icons 圖示,確認卡片在寬螢幕仍排列整齊。完成標準:新增至少 1 個測試,pytest 全數通過。
一句話記住:實作 2 特別要求「每層只做自己的事」——先寫 Repository、再寫 Service、最後寫 Controller,這個順序本身就是在練習分層思考,不是隨便先寫哪一個都一樣。
對應課堂:S03
依教案第八章「產出檢核表」與第九章「評量方式與評分規準」整理
本堂共 8 個產出項目,全部打勾才算做完:虛擬環境與套件(.venv/、requirements.txt,提示字元出現 (.venv)、安裝結果為 Successfully installed)、App Factory 與設定(app/__init__.py、config.py、extensions.py、run.py,測試以 create_app("testing") 建立 app 並使用記憶體 SQLite)、Blueprint 首頁與版型(瀏覽器開啟 / 顯示網站名稱與分層卡片)、離線靜態檔(樣板沒有 CDN 網址,Network 分頁沒有外部請求)、健康檢查 API(/api/health 回傳 200 與統一回應格式)、測試(pytest 結果 4 passed)、文件更新(AGENTS.md、README.md 含建立虛擬環境、啟動網站、執行測試指令)、OpenSpec 歸檔與 Git 提交(openspec list --specs 顯示 system-health,git log 可看到 commit)。
評量方式:本堂對應大綱評量比例——Session 實作任務 30%(學員實作 1、2 與產出檢核表)、OpenSpec 需求與設計文件 15%(tasks.md 勾選正確、變更已歸檔並產生正式規格)、Flask 網站功能 25%(首頁與 /api/health 可正常運作)、AI Agent 與 Skill 15%(本堂僅觀察 openspec-apply-change/openspec-archive-change 的使用過程,不單獨計分)、測試與部署 10%(pytest 4 個測試通過,含 mock 失敗情境)。
評分規準(滿分 100 分)五個項目:虛擬環境與啟動(15 分,優良是 .venv 正確建立且未提交、能說明為何需要虛擬環境,待加強是使用全域套件或 .venv 被提交到 Git)、App Factory 與設定(20 分,優良是能以 create_app("testing") 切換設定並說明 init_app 用途)、分層與 Blueprint(20 分,優良是各層職責正確、Controller 不碰 db、連結全部使用 url_for(),待加強是在 Controller 直接查資料庫或撰寫商業判斷)、健康檢查 API(20 分,優良是正常與失敗兩種回應都符合規格、失敗時不洩漏例外細節)、測試(15 分,優良是 4 個 Scenario 皆有測試、含 mock 失敗情境並能解釋原理)、OpenSpec 與 Git(10 分,待加強是未歸檔或未提交)。
一句話記住:評分規準把「在 Controller 直接查資料庫」和「.venv 被提交到 Git」都列進待加強——這兩條看起來是小事,卻都是分層紀律的具體檢查點。
對應課堂:S03
依教案第十章「常見問題與排除」整理
flask 出現「無法辨識」,或 ModuleNotFoundError: No module named 'flask'——虛擬環境未啟用,或 VS Code 使用全域直譯器。解法:執行 .venv\Scripts\activate;在 VS Code 選擇 .venv 的直譯器後開啟新的終端機。.venv\Scripts\activate 時出現「因為這個系統上已停用指令碼執行」——PowerShell 執行原則禁止執行 .ps1 腳本。解法:在 VS Code 選擇 .venv 直譯器後開新終端機(settings.json 已設定自動啟用),或改用命令提示字元;仍無法解決時請講師協助。pytest 出現 ImportError while loading conftest 與 No module named 'app'——pytest 主控台程式不會把專案根目錄加入匯入路徑,pytest.ini 未設定。解法:在專案根目錄改用 python -m pytest -v -p no:cacheprovider,或使用 VS Code 測試面板。Error: Could not import 'run'——終端機目前不在專案根目錄,找不到 run.py。解法:切換到 run.py 所在的專案根目錄再執行。BuildError: Could not build url for endpoint 'index'——url_for() 少了 Blueprint 名稱前綴。解法:改為 url_for('main.index');可用 flask --app run.py routes 查 endpoint 名稱。jinja2.exceptions.TemplateNotFound: index.html——樣板路徑少了子資料夾,或樣板不在 app/templates/。解法:改為 render_template("main/index.html"),確認檔案位於 app/templates/main/。KeyError: 'staging'——環境變數 FLASK_CONFIG 的值不在 config_by_name 中。解法:只能使用 development、testing、production。\u服務...,欄位順序變成 code、data、message、success——create_app() 缺少 app.json.ensure_ascii = False 與 app.json.sort_keys = False。解法:補上兩行設定後重新啟動。/api/health 回應 503「資料庫無法連線」——.env 中的 DATABASE_URL 錯誤,或資料庫檔案位置無法寫入。解法:查看伺服器終端機 Log 中「資料庫健康檢查失敗」後的例外內容,修正連線設定。app/static/ 檔案缺漏,例如沒有複製 fonts/。解法:開發者工具 Network 分頁找出 404 的檔案並補齊。一句話記住:十個問題裡有一半以上(ModuleNotFoundError、BuildError、TemplateNotFound、KeyError 等)都在講同一件事——路徑或名稱對不上,先核對檔案位置與 Blueprint/設定名稱,不要先懷疑邏輯寫錯。
對應課堂:S03
投影片原題:建築完成:一座具備工業標準的軟體地基,準備迎接商業挑戰。
五個綠色打勾項目:乾淨絕對隔離的 .venv 虛擬環境、具備動態靈活切換能力的 App Factory、職責分明嚴格限制相依的 5 層 MVC 結構、真實資料庫 Ping 與統一 JSON 格式的 Health API、100% 覆蓋核心情境的 Pytest 自動化測試。右下角是 bookstore-agent 網頁截圖,顯示分層架構的四張卡片(Controller/Service/Repository/Model)。投影片下方寫著「Next Step:迎接 AI Agent 協同開發與完整的電子書目錄功能!」
教案第十一章課後作業:①完成學員實作 1、2 與進階挑戰(二選一),commit 並附上 pytest 結果與瀏覽器畫面截圖;②在 tests/test_health.py 新增一個測試——資料庫失敗時 data.status 應為 degraded,並思考這個行為是否該補進 system-health 規格;③閱讀 specs/02-book-catalog.md,列出「書籍目錄」功能在 Controller、Service、Repository、Model 各層可能出現的類別與方法名稱(各至少 1 個),作為 Session 04、05 的準備。
第十二章下次課程預告:Session 04|Codex Agent 協同開發方法——學習以 Context、Constraint、Expected Output 三要素撰寫 Prompt,分階段要求 Codex 產生程式碼並進行 AI 程式碼審查與人工驗證;實作任務是在本堂骨架上建立首頁版型(導覽列與 Hero 區域、書籍展示卡片、RWD 基礎設計),起點是講師事先建立並審查通過的 OpenSpec 變更 add-homepage-layout(capability:homepage)。
一句話記住:投影片講的「Next Step 迎接 AI Agent 協同開發」不是空話——下一堂 S04 要學的就是怎麼把 Context/Constraint/Expected Output 寫進 Prompt,直接接在這堂打好的骨架上動工。
對應課堂:S03
課程定位(講義原文整理):說明課程以 AI 協同軟體開發為核心,用 Python Flask 建立網路書店(或咖啡店)網站,結合 VS Code、Codex、OpenSpec 規格驅動開發、SDLC、RESTful API、資料庫、測試與部署,共 30 小時 15 個 Session。以「規格是否清楚」與「結果是否被驗證」決定程式品質,培養具備下指令、審查、驗證能力的次世代開發者。
這一區把講義②的 15 張投影片逐張翻成白話文,搭配圖一起看,不必死記英文縮寫。這門課的核心邏輯很單純:先把「要做什麼」寫清楚成規格,再指揮 AI 工具 Codex 依規格動手實作,最後用測試把關——這套流程貫穿 30 小時、15 堂課,從打地基一路做到把一個具備 AI 客服的網路書店部署上線。以下每張投影片附一段白話解讀、一句記憶重點,能對應到具體課堂的也會標出來。
這門課的圖解內容已經拆成 8 堂小課,逐堂看完可以更輕鬆吸收;前 6 堂是課程總覽的主題導覽,第 7、8 堂是 Session 01 正式課堂內容(分「上:概念與願景」「下:實作與提交」兩堂)。下面先給整體地圖與補充講義,想直接上課請切到上方分頁的「第 1 課」開始。
說明課程以 AI 協同軟體開發為核心,用 Python Flask 建立網路書店(或咖啡店)網站,結合 VS Code、Codex、OpenSpec 規格驅動開發、SDLC、RESTful API、資料庫、測試與部署,共 30 小時 15 個 Session。以表格對照「傳統程式設計課程」與「本課程」在開發起點、AI 角色、專案規則、需求變更、完成判斷、版本紀錄、最終成果七個面向的差異,強調學員要扮演會下指令、會審查、會驗證的開發者。講師提示:第一堂課就要建立「規格是否清楚」與「結果是否被驗證」決定品質的觀念。
列出大綱 11 項學習目標原文與編號,依五個能力面向分組(開發環境與工具、規格驅動與 SDLC、AI 協同與 Agent、Flask 網站與 API、品質與交付),並標示每項目標主要培養的對應 Session(例如目標 2 對應 Session01、03、13;目標 7 對應 Session04–12)。
3.1 兩個導引專案:介紹網路書店(主要範例)與咖啡店(彈性替換)兩個導引專案各自的功能範圍:網路書店含使用者註冊登入、書籍分類搜尋、購物車、訂單、後臺管理與 AI 書籍推薦 Agent;咖啡店含菜單瀏覽搜尋、外帶訂單或內用訂位、門市選擇、後臺菜單管理與 AI 點餐推薦 Agent。
3.2 網路書店的願景與範圍:引用範例專案 docs/vision.md 的願景陳述(「打造一個會聊天、懂推薦的網路書店」),列出訪客、一般會員、管理員三種角色,並說明線上金流(以模擬付款代替)、物流、電子發票、多語系暫不處理。以 6 個 Epic(EP-01~EP-06)拆解本期範圍,附對應規格文件與預計 Session。
3.3 咖啡店替換對照表:提供網路書店資料表(User、Category、Book、Cart/CartItem、Order/OrderItem)與商業流程(主要交易、狀態流轉、檢查規則、Agent 意圖、Agent Skill)對照咖啡店的替換建議,供選擇咖啡店的學員自行改寫規格與資料模型,並提醒實際設計以自己在 specs/ 中撰寫並通過審查的規格為準。
3.4 成果預覽:以三張截圖預覽範例專案課程前段的畫面:Session 04 版本的首頁 Hero 區與手機版首頁(漢堡選單、單欄書籍卡片),以及 Session 06 版本由 Vue 3 呼叫 GET /api/v1/books 取得資料的書籍目錄頁,並說明網站會隨課程推進陸續加入登入、購物車、訂單、後臺與 AI 客服功能。
4.1 五大階段與 SDLC 對應:說明 15 個 Session 依 docs/vision.md 的里程碑分為五大階段(M1–M5),分別對應 SDLC 的需求分析、系統設計與開發、測試部署與驗收。
4.2 15 個 Session 一覽:以完整表格列出 15 個 Session 的主題、教學內容重點、實作任務、產出與範例資料夾名稱,並附講師提示:範例快照對應 Git tag s01~s15,每堂課實際完成的內容與差異以各 Session 講義為準。
說明每堂課採用相同的六階段循環:回顧與任務說明(15 分)、概念講解與架構示範(25 分)、講師示範與 Codex 協同開發(50 分)、學員實作與問題排除(25 分)、成果檢查與提交(5 分)、任務交代與文件更新(5 分)。並說明每堂課的功能都以一個 OpenSpec 變更完成並歸檔、最後 Git 提交並標 tag,例如 Session 03 歸檔 add-flask-skeleton、Session 04 歸檔 add-homepage-layout、Session 05 歸檔 add-data-model、Session 06 歸檔 add-book-api。
6.1 六個核心工具:以表格列出六個核心工具(Python、Flask、VS Code、Codex、OpenSpec、Git)在課程中的角色、開始使用時機與檢查指令,並補充資料庫(SQLite/SQL Server、PostgreSQL)、ORM(SQLAlchemy 2 + Flask-SQLAlchemy + Flask-Migrate)、前端(Jinja2、Bootstrap 5.3、Vue 3、Axios、SweetAlert2,全離線)、測試(pytest)、部署(Docker、gunicorn、GitHub Actions)等技術選型,以及 Codex CLI 與 OpenSpec 的安裝與登入指令。
6.2 工具之間的關係:以循環圖說明六個工具的協作關係:specs/ 與 OpenSpec(proposal、design、tasks)驅動 Codex Agent 依 tasks.md 實作,過程中需先讀 AGENTS.md 專案規則、在 Python 虛擬環境 .venv 中執行,最終產出 Flask 應用程式 app/ 套件,pytest 全數通過後以 Git commit 與 tag 提交,VS Code 是學員下指令、審查、驗證的介面。
7.1 分層架構:說明 AGENTS.md 規定的分層架構(View → MVC Controller/API Controller → Service → Repository → Model)相依方向只能由上往下,並以表格列出各層的位置(如 app/controllers/、app/services/)、職責與禁止事項(例如 Controller 禁止撰寫商業邏輯、直接查資料庫)。
7.2 大綱建議架構與範例專案實際架構:對照大綱建議架構(app.py、controllers/ 等直接放專案根目錄)與範例專案實際架構(應用程式碼集中到 app/ 套件),以表格列出啟動程式、設定檔、分層程式、API 專區、樣板靜態檔、共用機制、規格位置、範例新增項目的大綱建議與範例專案實際位置對照,並標示各項加入時機(多數已存在,容器化與 Agent Skill 分別於 Session 14、08–09 加入)。
7.3 為何採用 app/ 套件分層:列出採用 app/ 套件分層的五個理由:App Factory 需要可匯入的套件(測試時可切換記憶體 SQLite)、避免 app.py 與 app/ 資料夾同名衝突(入口改名 run.py)、程式與專案資料分開、網頁與 API 分開、對 AI Agent 更友善(Codex 能精準找到該修改的檔案)。並附 app/__init__.py(Session 06 快照)的 create_app() 與 register_blueprints() 程式碼片段示範。
8.1 課程核心流程:說明大綱第九節定義的核心流程(需求分析 → OpenSpec 規格 → 系統架構設計 → Codex 協同開發 → Skill 與 Tool 整合 → 測試與 Code Review → 部署與成果驗收)是整門課反覆練習的主軸,也可延伸至電商、咖啡店、飯店訂位、會議室預約、客服系統與企業內部管理平台,並列出各步驟的代表產出。
8.2 OpenSpec:propose → apply → archive:說明範例專案的兩種規格:specs/(給人閱讀的產品需求)與 openspec/(給 Agent 執行的變更規格,經提案、實作、歸檔後合併為正式規格)。以表格列出提案、驗證、實作、歸檔四階段使用的 Skill/指令與產出,並附 Session 02 建立第一個變更提案的 Prompt 範例,以及 Session 06 add-book-api 變更歸檔的實際執行輸出(openspec archive 指令結果)。
8.3 與 Codex 協作的三要素:列出範例專案 docs/prompts/prompt-template.md 規定任務描述要包含的三要素:Context 情境、Constraint 限制、Expected Output 預期產出,各附要回答的問題與範例句。並提醒 Codex 並非每次都產生相同結果,應以驗收條件與測試判斷成果,不以畫面是否相同判斷。
以表格列出六項評量項目(Session 實作任務 30%、OpenSpec 需求與設計文件 15%、Flask 網站功能 25%、AI Agent 與 Skill 15%、測試與部署 10%、期末成果展示 5%)的評量內容、主要對應 Session 與佐證資料,並附優良/合格/待加強三級的共通評分規準。
說明 Session 15 期末至少完成 12 項(首頁與商品目錄、使用者註冊與登入、書籍搜尋與分類、購物車、訂單建立與查詢、管理員後臺、一個 AI Agent、三個 Agent Skill 或 Tool、API 文件、測試案例、OpenSpec 規格文件、系統架構圖),並提供「基礎功能」「AI Agent 功能」「SDLC 與 OpenSpec」三張檢核表,逐項列出驗收項目、對應 Session、檢核方式與完成欄位(☐)。
11.1 範例資料夾與 Git tag:說明教材由講義、範例快照與完整 Git 儲存庫三部分組成,每份講義章節順序相同(課程資訊、學習目標、課前準備、教學流程、概念講解、講師示範、學員實作、產出檢核表、評量方式、常見問題、課後作業、下次課程預告,以及附錄「本堂課範例專案變更」)。附 15 個 Git tag(s01~s15)的提交訊息列表(Session 13 另有 3 個修正提交,tag 指向最後一個)。
11.2 如何啟動任一快照:列出不同階段快照可執行的指令差異(S01–02 尚無網站;S03–04 可建虛擬環境並啟動測試;S05 起需建資料庫並匯入範例資料;S07 起需複製 .env.example 為 .env;S14 起安裝指令改用 requirements-dev.txt 或用 Docker 啟動),並列出啟動四步驟指令(檢查環境、建立虛擬環境、建立資料庫、啟動網站並測試)。附注意事項:快照不含 .venv/、instance/ 與資料庫檔案;執行測試須用 python -m pytest(Session 03–07 快照的 pytest.ini 未設定 pythonpath,直接執行 pytest 會出現 ModuleNotFoundError,此問題於 Session 08 修正)。
11.3 示範帳號與截圖標示:列出 flask seed(Session 05 起可重複執行)匯入的示範帳號清單:管理員 [email protected]/Admin1234,會員 [email protected]/Alice1234 與 [email protected]/Bob12345(登入功能於 Session 07 實作)。並說明講義截圖依畫面性質標示三種圖說(模擬畫面、實際執行畫面、實際執行結果)。
說明課程內容環環相扣,Session 01–06 是一條必經的主線;Session 06 的 API 之後分成「會員與交易」(07 → 11 → 12)與「AI Agent」(08 → 09 → 10)兩條支線,兩條支線都完成後才進入 Session 13–15 的品質與交付。舉例:Session 03 實作的 add-flask-skeleton 變更提案在 Session 02 建立;Agent 工具 Schema 以 Session 06 的內部 API 為基礎;購物車、訂單與後臺都需要 Session 07 的會員與管理員權限。附拓撲圖,並提醒進度落後時不必重做前面所有步驟,以上一堂課的範例快照為起點即可從本堂課的實作任務開始。
p1|規格驅動 × AI 協同:次世代軟體開發實戰:標題頁,副標「從需求到部署,30 小時打造具備 AI 客服的網路書店」,列出四個技術標籤 Python 3.12、Flask MVC、Codex Agent、OpenSpec;圖示呈現 Python Runtime、IDE Platform、AI Agent、Version Control 四個互相連接的元件。
p2|典範轉移:重塑開發心態:以左右對照表比較「傳統模式(Traditional Paradigm)」與「新範式(Modern Paradigm)」在開發起點、AI 的角色、專案規則、完成判斷四個面向的差異;新範式強調先寫系統願景、User Story 與驗收條件,Codex 參與需求分析、實作、測試與 Review,規則寫在 AGENTS.md 由人與 AI 共同遵守,完成判斷是驗收條件逐對照+pytest 全數通過。結語:「你不是寫程式的機器,你是會下指令、會審查的 AI 指揮官。」
p3|最終交付物:專案藍圖預覽:以電腦版首頁、手機版首頁、書籍列表頁三張示意畫面預覽最終交付物,標註三個重點:①MVC 與 RESTful API 架構(Vue 3 透過 GET /api/v1/books 取得資料);②具備 Tool Calling 的 AI Agent(即將上線的書店客服,能用自然語言找書);③RWD 響應式設計(漢堡選單與單欄書籍卡片完美適配行動裝置)。
p4|核心能力養成:四大知識支柱:以四張卡片呈現課程的四大知識支柱:規格驅動(SDLC)——將需求拆解為 Epic/Feature/User Story、精通 OpenSpec 規格驅動工作流;AI Agent 協同——設計專案規則(AGENTS.md)與 Agent Skill、掌握 Codex 協作與 Prompt 指令技巧;Flask Web & API——建構 MVC 網站與 SQLAlchemy ORM 資料庫、實作 RESTful API 與商業邏輯(登入/購物車/後臺);品質與交付——透過 pytest 確保程式碼品質、使用 Git 快照與 Docker 進行 CI/CD 部署。
p5|工具生態系與協作關係:以循環圖說明六個工具的協作關係:OpenSpec 提供 Proposal、Design、Tasks 驅動實作,VS Code 是學員下指令、審查、驗證的核心,與 Codex Agent(CLI 擴充套件,遵守 AGENTS.md 專案規則)雙向互動,向下驅動 Python/Flask(虛擬環境 .venv 與 app/ 套件),完成後由 Git 儲存 Commit 快照與 Tag。核心運作法則:「從 OpenSpec 輸入規格 → Codex 執行實作 → 測試通過後 Git 提交。」
p6|分層系統架構(Layered System Architecture):以五層堆疊圖說明分層架構:View(視圖層,Jinja2 樣板/Vue 3 頁面)→ Controller(控制層,app/controllers/ 與 app/api/controllers/,AI 客服 Agent 透過 Tool Calling 由此接入)→ Service(服務層,app/services/,商業規則、交易管理)→ Repository(資料存取層,app/repositories/,ORM 查詢)→ Model(資料模型層,app/models/,資料表定義:SQLite/SQL Server)。並以警示標語提醒「嚴禁越級打怪!(例如 Controller 絕對不可繞過 Service 直接查詢資料庫)。相依方向只能由上往下」。
p7|課程五大里程碑:對應 SDLC 生命週期:以流程圖呈現 M1 需求與規格(S01-02,SDLC:需求分析)→ M2 系統骨架(S03-06,SDLC:系統設計與整合)→ M3 會員與 Agent(S07-09,SDLC:系統開發)→ M4 商業功能(S10-12,SDLC:系統開發)→ M5 品質與交付(S13-15,SDLC:測試與部署),內容與講義①「4.1 五大階段與 SDLC 對應」一致。
p8|15 堂課相依拓撲圖(Session Dependency Map):以節點與箭頭呈現 S01 至 S15 的相依關係:主線 S01(專案導入)→S02(OpenSpec)→S03(Flask MVC)→S04(Codex 協同)→S05(資料庫 ORM)→S06(RESTful API),之後分為上方「AI Agent」支線(S08 Agent Skill→S09 Agent 整合→S10 搜尋推薦)與下方「會員與交易」支線(S07 登入權限→S11 購物車訂單→S12 後臺管理),兩支線在 S13(測試)→S14(部署)→S15(期末整合)匯流。並提示「進度落後免擔心!切換至對應堂數的 Git Tag 快照,一秒同步環境,直接接續實作」。
p9|每堂課微循環:2 小時標準節奏:以甜甜圈圖拆解每堂課六階段的時間配比:回顧與任務說明(15 分)、概念講解與架構示範(25 分)、講師示範與 Codex 協同(50 分)、學員實作與問題排除(25 分)、成果檢查與提交(5 分)、任務交代與文件更新(5 分),內容與講義①「五、每堂課 2 小時標準流程」一致。
p10|OpenSpec 規格驅動工作流(Spec-Driven Workflow):以四方塊流程圖說明:1. 提案 Propose($openspec-propose,產出 tasks.md 與 design.md,不可修改程式碼)→ 2. 驗證 Validate(openspec validate,嚴格規格格式檢查,通過才放行)→ 3. 實作 Apply($openspec-apply-change,依任務清單小步開發)→ 4. 歸檔 Archive($openspec-archive-change,成為正式規格並 Commit);標示 pytest 或人工驗證未通過時會退回審查與實作。
p11|駕馭 AI 的 Prompt 三要素(The Prompting Formula):說明 Prompt 三要素:Context 情境——給予 AI 先備知識(例:「請閱讀 AGENTS.md 與 specs/02-book-catalog.md 的 F-02.1」);Constraint 限制——畫出界線、什麼不能做(例:「只修改 templates 與 custom.css,不可使用 CDN」);Expected Output 預期產出——定義完成與驗收標準(例:「列出修改檔案,執行 pytest 並貼上結果」)。結語:「AI 產碼極快,但『規格清晰度』決定了程式碼品質。」
p12|雙軌專案選擇:領域模型映射表:以表格對照網路書店(預設)與咖啡店(彈性)在 Model 資料(Book vs Menu Item)、Workflow 流程(購物車→宅配訂單 vs 點餐車→外帶訂單/內用時段訂位)、AI Agent Intent 意圖(找書查書推薦 vs 推薦飲品點餐)、Agent Skill 技能(book-search、order-query vs menu-search、reservation)四個面向的對應關係。提醒:「底層架構不變!先改 vision.md 與 Specs,再讓 AI 依規格調整程式。」
p13|時光機:Git Tag 與快照管理:以時間軸呈現 s01 至 s07 的快照節點(標示皆為無 .git 的獨立資料夾純淨快照概念),並列出「啟動四部曲(Boot Sequence)」:1. 檢查環境 python tools/check_env.py;2. 隔離環境 python -m venv .venv → pip install -r requirements.txt(每次切換快照皆須重建);3. 資料庫就緒 flask db upgrade → flask seed(S05 起適用);4. 啟動與測試 flask --app run.py run → python -m pytest。
p14|期末驗收 12 大檢核點(Final Acceptance Criteria):以三欄表格列出:基礎系統(Infrastructure)6 項——正常啟動(首頁與 /api/health)、前後端 API 正常通訊、會員註冊登入與權限控管、關鍵字與分類書籍搜尋、購物車與訂單建立、管理員後臺維護;AI 協同(AI Integration)3 項——準確判斷搜尋/推薦/查詢意圖、正確呼叫 API 與 Tool Calling、安全處理錯誤輸入與例外;工程品質(Engineering Quality)3 項——OpenSpec 規格與驗收條件完整、Pytest 測試案例全數通過、Git 歷程完整與 Docker 部署文件。
p15|結語畫面:模擬終端機輸出:「準備好啟動你的專案了嗎?」→ python tools/check_env.py → [System Check] ... All systems GO. → 「從今天起,你不再只是寫程式的人,而是主導產品與 AI 協同開發的架構師。」→ 「Let's Code!」
| 講義①章節 | 講義②頁碼 | 對應 Session |
|---|---|---|
| 一、課程定位與特色 | p1–2 | S00 |
| 二、學習目標 | — | S00(各項目標已於原表標主要對應 Session) |
| 三、導引專案(3.1–3.4) | p3、p12 | S00(3.2 的 Epic 對照另貫穿 S07–S12、S08–10) |
| 四、課程地圖(4.1–4.2) | p7、p8 | S00 |
| 五、每堂課 2 小時標準流程 | p9 | S00(適用每一堂課) |
| 六、開發環境與工具角色(6.1–6.2) | p5 | S00–S02(S01 安裝工具、S02 起用 OpenSpec) |
| 七、系統架構與專案結構(7.1–7.3) | p6 | S03(Flask MVC 分層骨架建立)、S00 總覽引入 |
| 八、規格驅動與 AI 協同開發流程(8.1–8.3) | p10、p11 | S02(OpenSpec propose 起)、S04(Codex 協同開發方法/Prompt 三要素) |
| 九、評量方式 | — | S00–S15(全程;各項比例對應 Session 見原表) |
| 十、期末驗收標準 | p14 | S15 |
| 十一、講義與範例專案使用說明(11.1–11.3) | p13 | S00(並伴隨每一個 Session 的範例快照使用) |
| 十二、各 Session 先備關係 | p8 | S00(總覽),內容貫穿 S01–S15 規劃 |