Portfolio
今日主軸:用 SDD 把「該做什麼、怎麼驗證、有沒有達到」講清楚
一、產品願景(Why / Outcome)
二、使用者與場景(For Whom / When)
Persona
關鍵場景
三、功能範圍(Scope)
*Next
* 搜尋 / 標籤交叉篩選
* 中/英語言
四、領域詞彙(Domain Glossary)
五、資料模型(Single Source of Truth, SSOT)
模組 | 功能 | 資料來源(Single Source of Truth) |
---|---|---|
後台資料管理腳本 | 產生/更新作品資料 | data/portfolio.json |
前台網站展示 | 讀取資料並渲染 | 也是 data/portfolio.json |
自動更新排程(n8n / GitHub Actions) | 每日抓 GitHub / API 數據後覆寫 | 還是那份 data/portfolio.json |
Schema 驗證器 | 驗證資料格式 | 驗證那份 data/portfolio.json |
六、API 規格(可選)
七、頁面與元件規格(UI Spec)
頁面
元件
七、Pipeline Spec
核心:每天 09:00(台北時間)跑一次收斂腳本 → 產生 /data/portfolio.json → 觸發重建 → 部署。
資料來源(可擇一或混用)
流程(Mermaid)
flowchart TD
CRON[每日 09:00] --> COLLECT[收斂腳本: fetch sources]
COLLECT --> VALIDATE[以 JSON Schema 驗證]
VALIDATE -->|pass| WRITE[/更新 data/portfolio.json/]
VALIDATE -->|fail| ALERT[開 Issue or 發 Slack 通知]
WRITE --> COMMIT[Git commit & push]
COMMIT --> BUILD[CI 觸發 SSG 重建]
BUILD --> DEPLOY[部署上線]
九、驗收規格(Acceptance Criteria)
項目 | 目的 | 使用時機 |
---|---|---|
TDD | 以程式邏輯測試為核心 | 單元測試階段 |
BDD | 以使用者行為為核心 | 驗收測試階段、跨部門溝通 |
SDD | 以規格為核心 | 產品規劃階段到開發全程 |
* SDD 定義規格 → BDD 轉成行為場景 → TDD 驗證程式邏輯
Given 有3個作品且各自有 sortWeight
When 使用者開啟首頁
Then 作品應按 sortWeight 高→低顯示
And 首屏每張卡片至少含:標題、oneLiner、至少1個 CTA
Given 使用者開啟 /p/{id}
Then 頁面至少包含「問題 / 解法 / 結果」三段
And 若有 demo 連結,CTA 可點擊且 HTTP 200
And 若 evidence.gif 存在,於首屏顯示
Given 到了每日 09:00 台北時間
When Pipeline 觸發
Then 若 sources 有變更 -> 10 分鐘內網站更新
Else 不進行部署
Given 有新的 portfolio.json
When 以 JSON Schema 驗證
Then 必須通過驗證方可合併
十、非功能性需求(NFR)
十一、版本與治理(Governance)
十二、CI/CD 規格(範例,偽 YAML)
name: portfolio-pipeline
on:
schedule: [{ cron: "0 1 * * *" }] # 每日 09:00 台北(= UTC+8 -> 01:00 UTC)
workflow_dispatch: {}
jobs:
collect-and-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with: { node-version: 20 }
- name: Collect sources
run: node scripts/collect.mjs # 產出 data/portfolio.json
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
N8N_API_KEY: ${{ secrets.N8N_API_KEY }}
- name: Validate schema
run: node scripts/validate.mjs
- name: Commit if changed
run: |
git config user.name "bot"
git config user.email "bot@example.com"
git add data/portfolio.json
git diff --staged --quiet || git commit -m "chore: data update"
- name: Build
run: npm run build
- name: Deploy
run: npx vercel deploy --prod --token ${{ secrets.VERCEL_TOKEN }}
十三、內容撰寫規格(Copy Spec)
十四、監測與成功指標(Analytics Spec)
十五、風險與對策