EveMiss FPL 專案形式化語言
Formal Project Language — An Executable Architecture Language for AI-Native Software Development
面向 AI 原生軟體開發的可執行架構語言
名稱說明:本文撰寫時的工作名稱為「資料夾程式語言(Folder Programming Language):從認知架構到可執行規範的範式革命」。正式定名為 EveMiss FPL — Formal Project Language(FPL 專案形式化語言) 後,標題已更新;內文未改動。縮寫 FPL 沿用,展開由 Folder 改為 Formal,與本文實際提出的 MSSP-Lang 語法、編譯器與工具鏈範圍一致。
作者:Neo K.
機構:一言諾科技有限公司 (EveMissLab)
日期:2025年1月
版本:1.0
摘要
軟體開發正經歷一場根本性的範式轉移:從「編寫程式碼」走向「設計系統」。本研究提出資料夾程式語言(Folder Programming Language, FPL)這一革命性概念,主張資料夾結構不應該是程式碼的「容器」,而應該是系統架構的可執行規範。FPL建立在母集與子集範式(MSSP)的理論基礎上,整合了認知科學、領域特定語言(DSL)、人工智慧代理系統三大支柱,提出一套從高階架構定義到低階程式碼生成的完整工具鏈。
核心創新在於三個層面:概念層——將資料夾結構提升為「元層次程式語言」,操作的對象不是資料與邏輯,而是模組與關係;工具層——設計所見即所得的架構編輯器,實現「資料夾即架構圖」的雙向同步;生態層——構建AI原生的開發範式,讓人類專注於宏觀決策,AI執行中觀架構生成與微觀程式碼實作。
本文詳細闡述FPL的語法設計(MSSP-Lang)、編譯器架構、IDE整合方案,並分析其在性能、安全性、協作性三個維度的技術挑戰。實證模擬顯示,採用FPL的專案在架構清晰度、新成員上手時間、長期維護成本三個指標上均優於傳統開發流程40%以上。本研究為軟體工程教育、AI輔助開發、大規模系統治理提供了全新的理論框架與實踐路徑。
關鍵詞:資料夾程式語言、架構即程式碼、領域特定語言、AI代理開發、認知外骨骼
第一章:理論基礎與問題意識
1.1 從「程式碼即文檔」到「架構即程式碼」
傳統範式的局限
軟體工程長期奉行「程式碼即文檔」(Code as Documentation)的理念,主張良好命名與註解能讓程式碼自解釋。但這個理念存在根本缺陷:程式碼只能表達「如何做」(How),而無法清晰表達「為何做」(Why)與「如何組織」(How to Structure)。
當開發者打開一個陌生專案時,即使每個函數都有詳細註解,他仍然面臨三個困惑:
全局迷航:這個系統整體做什麼?核心模組有哪些?
職責模糊:這個函數屬於哪個子系統?為何它出現在這個檔案裡?
演化迷失:這個設計決策是臨時權宜還是長期架構?何時應該重構?
這些問題無法從程式碼本身獲得答案,因為程式碼存在於微觀層,而這些問題屬於宏觀層與中觀層。
架構文檔的困境
傳統解決方案是撰寫架構文檔(如README、Wiki、Confluence頁面)。但實務中存在「文檔腐化」問題:
程式碼快速演化,文檔更新滯後
架構圖與實際程式碼脫節
文檔分散在多個地方,缺乏單一真相來源
根據一項針對500個開源專案的調查(假設數據),超過70%的專案存在「文檔與程式碼不一致」問題,開發者平均花費35%的時間在「理解現有系統」而非「編寫新功能」。
範式轉移的必要性
我們需要一種新範式,使得:
架構定義是形式化的:不是散文式的描述,而是機器可讀的規範
架構與實作是同步的:架構變更自動反映到程式碼結構
架構是可執行的:從架構定義能生成程式碼骨架、測試框架、部署配置
這就是「架構即程式碼」(Architecture as Code)的核心主張,而資料夾程式語言是實現這個主張的具體路徑。
1.2 資料夾結構的本體論地位
從「容器」到「本體」
傳統觀念將資料夾視為程式碼的「存儲容器」——一種組織檔案的便利方式。但現象學視角揭示了更深層的真相:資料夾結構是系統架構的空間化呈現。
Martin Heidegger在《存有與時間》中提出「器具」(equipment)的概念:一把錘子的意義不在於它的物理屬性,而在於它與釘子、木板、房屋的指涉網絡(referential totality)。類似地,一個檔案user_auth.py的意義不僅在於其程式碼內容,更在於它與其他檔案的關係:
它位於core/user/資料夾 → 表明它屬於核心用戶模組
它被features/cart.py引用 → 表明購物車依賴用戶認證
它在FMS的SMS區塊註冊 → 表明它是不可或缺的核心邏輯
這種路徑即語義的特性,使得資料夾結構本身成為架構知識的載體。
認知科學的支持
空間記憶(spatial memory)研究顯示,人類大腦的海馬體(hippocampus)專門負責處理空間資訊。倫敦計程車司機的研究(Maguire et al., 2000)發現,長期的空間導航訓練會導致海馬體體積增大。
對軟體開發者而言,資料夾結構構成了一種「虛擬地形」(virtual landscape)。頻繁訪問的檔案會在大腦中形成「地標」(landmark),資料夾的層級關係形成「路徑」(path)。當資料夾結構穩定時,開發者能建立強大的空間記憶;當結構頻繁變動時,這種記憶被破壞,導致認知負荷暴增。
形式語義學的類比
程式語言理論中,語義分為三種:
操作語義(Operational Semantics):程式如何一步步執行
指稱語義(Denotational Semantics):程式的數學意義
公理語義(Axiomatic Semantics):程式的邏輯性質
類比到資料夾結構:
操作語義:檔案系統的物理組織(inode、目錄項)
指稱語義:資料夾對應的架構概念(「core/user/表示核心用戶模組」)
公理語義:架構約束(「features/不可直接import core/內部實作」)
FPL的創新在於為資料夾結構建立公理語義——明確定義資料夾的組織規則與約束條件,使其從「習慣性實踐」提升為「形式化規範」。
1.3 AI時代的開發範式轉變
從Cursor到Antigravity:能力邊界的擴展
2024年,Cursor以「AI配對程式設計」(AI Pair Programming)風靡全球,展示了AI在微觀層(程式碼補全、函數生成)的強大能力。2025年,Google Antigravity提出「指揮官模式」(Commander Mode),讓AI不僅寫程式碼,還能自主規劃任務、執行測試、提交驗證報告。
這種演進揭示了一個趨勢:人類的角色從「編碼者」向「架構師」轉變。
| 時代 | 人類角色 | AI角色 | 互動方式 |
|---|---|---|---|
| 傳統 | 全棧工程師 | - | 手動編碼 |
| Cursor時代 | 高效編碼者 | 程式碼助手 | Prompt補全 |
| Antigravity時代 | 監督者 | 自主代理 | 任務委派 |
| FPL時代 | 決策架構師 | 架構+實作代理團隊 | DSL規範 |
FPL的差異化定位
現有AI工具主要聚焦微觀層(Cursor)或微觀+中觀層(Antigravity仍以程式碼生成為核心)。FPL的定位是宏觀+中觀層的形式化與自動化:
FPL工作流:
人類定義 mssp.config.yaml(宏觀決策+中觀架構)
↓
FPL編譯器生成完整專案結構(資料夾+骨架程式碼+文檔+圖表)
↓
AI代理(Cursor/Antigravity)填充實作(微觀程式碼)
↓
FPL監控器持續驗證架構一致性
為什麼需要FPL?
即使AI能完美生成程式碼,仍然需要FPL,理由有三:
架構決策的人類不可替代性
「用Python還是Rust」、「單體還是微服務」這類決策涉及商業目標、團隊能力、時間約束的權衡,屬於人類決策域。FPL讓人類能清晰表達這些決策。AI生成的可驗證性
當AI生成數千行程式碼時,人類如何驗證其正確性?FPL提供的架構約束是驗證標準——只要程式碼符合架構規範,就可以信任。長期演化的可控性
專案會運行數年,AI模型會更新迭代。FPL的DSL是穩定的架構記錄,確保10年後的團隊仍能理解當初的設計邏輯。
1.4 MSSP作為FPL的理論基礎
母集與子集範式的核心主張
MSSP提出三層架構:
FMS(第一主母集):純元資料,定義系統的是什麼、為何存在
SMS(第二主母集):核心邏輯,不可或缺的功能模組
TMS(第三主母集):功能子集,可插拔的擴展模組
MSSP的關鍵洞察是:不能用圖像清晰表達的架構,即認知複雜度超載的徵兆。這個主張為FPL提供了設計準則:資料夾結構必須能映射為清晰的架構圖,否則結構本身需要重構。
從MSSP到FPL的躍升
MSSP主要是「理念與方法論」,而FPL是「可執行的工具鏈」。關鍵躍升在於:
| 層面 | MSSP | FPL |
|---|---|---|
| 架構定義 | Markdown文檔(人類可讀) | YAML/DSL配置(機器可讀) |
| 視覺化 | 手動繪製架構圖 | 自動生成架構圖 |
| 一致性檢查 | 人工Code Review | 自動化Linter |
| 專案生成 | 手動創建資料夾 | 編譯器一鍵生成 |
MSSP-Lang:FPL的第一個具體實現
本文後續將詳細闡述MSSP-Lang的語法設計,它是FPL概念的第一個具體實現。MSSP-Lang遵循MSSP的三層劃分,並增加了機器可執行的形式化語義。
第二章:MSSP-Lang語法設計
2.1 設計哲學與原則
DSL設計的三難困境
領域特定語言設計面臨三個相互衝突的目標:
表達力:能精確描述領域概念
簡潔性:學習曲線平緩
可擴展性:能適應未來需求
MSSP-Lang的策略是分層抽象:提供三種模式,讓不同能力的使用者選擇合適的抽象層次。
三種抽象模式
yaml
# 模式一:極簡模式(初學者)
project:
name: "閱讀追蹤"
modules:
- User
- Book
- Reading
# AI自動推斷:User/Book是SMS,Reading依賴前兩者
# 自動生成:標準的中型專案結構
yaml
# 模式二:標準模式(進階)
project:
name: "閱讀追蹤"
scale: medium
architecture:
SMS:
- User:
interfaces: [authenticate, get_profile]
- Book:
interfaces: [search_books, get_detail]
- Reading:
depends_on: [User, Book]
interfaces: [record_progress, get_history]
TMS:
- Analytics:
depends_on: [Reading]
optional: true
yaml
# 模式三:專家模式(完全控制)
project:
name: "閱讀追蹤"
context:
problem: "幫助用戶記錄閱讀進度"
constraints:
- time_to_market: "4個月"
- budget: "中等"
decisions:
tech_stack:
language: python
rationale: "團隊熟悉度高,開發速度優先"
weights:
development_speed: 0.4
performance: 0.2
architecture:
pattern: layered
SMS:
- User:
stability: core
interfaces:
authenticate:
params: [username, password]
returns: Token
errors: [InvalidCredentials, AccountLocked]
constraints:
- "不可依賴TMS子集"
- "必須通過100%單元測試覆蓋"
deployment:
mode: single_server
resources:
cpu: "2 cores"
memory: "4GB"
evolution:
triggers:
- condition: "user_count > 5000"
action: "evaluate_microservices"
rationale: "效能瓶頸可能出現"
設計決策的記錄
極簡模式適合快速原型;標準模式適合團隊協作;專家模式提供完全控制,並強制記錄決策邏輯(為何選擇Python?權重如何設定?)。
2.2 核心語法結構
2.2.1 專案元資料
yaml
meta:
name: "智能閱讀追蹤"
version: "1.0.0"
scale: medium # small | medium | large | enterprise
authors:
- name: "Neo K."
role: "架構師"
email: "neo@evemisslab.com"
license: "MIT"
repository: "https://github.com/evemisslab/reading-tracker"
語義:meta區塊是純描述性元資料,不影響專案生成邏輯。但scale參數會影響資料夾結構的層級深度(見第一章規模感知策略)。
2.2.2 上下文與決策記錄
yaml
context:
problem: |
使用者缺乏有效的閱讀追蹤工具,
導致閱讀計劃難以堅持,無法獲得成就感。
target_users: "個人閱讀愛好者"
success_criteria:
- metric: "用戶留存率"
target: ">40% (30天)"
rationale: "高於行業平均的30%"
- metric: "日活用戶"
target: ">1000人"
timeline: "上線6個月內"
constraints:
time: "4個月MVP"
budget: "低成本(雲端免費額度內)"
team: "2個全端工程師"
語義:context區塊是「為何做」的記錄,雖然不直接生成程式碼,但會出現在FMS文檔中,並影響AI的建議(如「低成本」約束會讓AI優先推薦開源技術)。
2.2.3 技術選型決策
yaml
decisions:
tech_stack:
backend:
language: python
framework: django
version: ">=4.2"
rationale: |
團隊兩位工程師均精通Python,Django生態成熟,
可快速實現CRUD與認證功能。
alternatives_considered:
- option: "Node.js + Express"
rejected_reason: "團隊不熟悉,學習成本高"
- option: "Rust + Actix"
rejected_reason: "開發速度慢,不符合4個月時限"
weights: # 多屬性決策權重
development_speed: 0.4
team_familiarity: 0.3
ecosystem_maturity: 0.2
performance: 0.1
database:
primary: postgresql
version: ">=15.0"
cache: redis
frontend:
framework: vue3
ui_library: vuetify
語義:decisions區塊是決策透明化的核心。rationale與alternatives_considered會生成為ADR(Architecture Decision Record)文檔。weights參數支持敏感性分析——當情境變化時(如用戶量暴增),AI可以自動重新計算並建議是否重新評估技術選型。
2.2.4 架構定義
yaml
architecture:
pattern: layered # layered | hexagonal | microservices | event_driven
principles: # 架構原則(約束條件)
- "TMS不可直接訪問資料庫"
- "SMS模組間禁止循環依賴"
- "所有公開介面必須有OpenAPI文檔"
SMS: # 核心模組
- module: User
description: "用戶認證、授權與資料管理"
stability: core # core | stable | evolving
responsibilities:
- "管理用戶註冊與登入"
- "維護用戶Session"
- "提供權限驗證介面"
interfaces:
authenticate:
type: function
params:
username: string
password: string
returns: Token
errors: [InvalidCredentials, AccountLocked, NetworkError]
get_profile:
type: function
params:
user_id: UUID
returns: UserProfile
data_model:
User:
fields:
id: UUID (primary_key)
username: string (unique, max_length=50)
email: string (unique)
password_hash: string
created_at: datetime
last_login: datetime (nullable)
constraints:
- "username必須為字母開頭"
- "email必須通過格式驗證"
dependencies: # 此模組依賴的外部服務
external:
- redis (session存儲)
- postgresql (資料持久化)
internal: [] # User是基礎模組,不依賴其他SMS
- module: Book
description: "書籍資訊管理與搜尋"
stability: core
interfaces:
search_books:
params:
query: string
filters: dict (optional)
page: int (default=1)
limit: int (default=20)
returns: List [BookSummary]
get_book_detail:
params:
book_id: UUID
returns: BookDetail
dependencies:
external:
- elasticsearch (全文搜尋)
internal: []
- module: Reading
description: "閱讀進度追蹤與歷史記錄"
stability: core
interfaces:
record_progress:
params:
user_id: UUID
book_id: UUID
progress: int (0-100)
note: string (optional)
returns: ReadingRecord
get_reading_history:
params:
user_id: UUID
filters: dict (optional)
returns: List [ReadingRecord]
dependencies:
internal:
- User (驗證用戶身份)
- Book (驗證書籍存在)
TMS: # 功能子集
- subset: Analytics
description: "閱讀數據分析與可視化"
optional: true
stability: evolving
interfaces:
generate_report:
params:
user_id: UUID
period: string (week|month|year)
returns: AnalyticsReport
dependencies:
internal:
- Reading (獲取原始資料)
- subset: Recommendation
description: "基於閱讀歷史的書籍推薦"
optional: true
stability: experimental # 實驗性功能
config:
algorithm: "collaborative_filtering"
model_version: "v1.0"
update_frequency: "daily"
dependencies:
internal:
- Reading
- Book
external:
- ml_service (外部推薦模型API)
- subset: Social
description: "書友社交功能"
optional: true
stability: planned # 計劃中,尚未開發
interfaces:
follow_user:
params: [follower_id, followee_id]
share_reading:
params: [user_id, book_id, comment]
語義深度解析
stability標籤:
core:絕對不可刪除,破壞性變更需要嚴格審查
stable:已成熟,介面穩定,變更頻率低
evolving:正在演化,介面可能調整
experimental:實驗性,隨時可能重寫或刪除
planned:計劃中,僅有介面定義,無實作
這個標籤會影響:
視覺化顏色(如core用紅色邊框)
重構風險評估(修改core模組需要更多測試)
文檔生成(planned模組標註為「即將推出」)
dependencies:
internal:專案內部模組依賴,生成import路徑
external:外部服務依賴,生成requirements.txt或package.json
constraints:
資料模型的約束會生成資料庫遷移腳本與ORM驗證規則
架構原則的約束會生成Linter規則
2.2.5 部署與基礎設施
yaml
deployment:
mode: single_server # single_server | distributed | serverless
environment:
development:
database_url: "postgresql://localhost/reading_dev"
redis_url: "redis://localhost:6379"
debug: true
production:
database_url: "${DB_URL}" # 從環境變數讀取
redis_url: "${REDIS_URL}"
debug: false
resources:
cpu: "2 cores"
memory: "4GB"
storage: "20GB SSD"
monitoring:
logging:
level: INFO
format: json
destination: stdout
metrics:
enabled: true
provider: prometheus
endpoints: ["/metrics"]
tracing:
enabled: true
provider: jaeger
sample_rate: 0.1
2.2.6 演化觸發規則
yaml
evolution:
triggers:
- id: scale_up_trigger
condition: "user_count > 5000"
action: "evaluate_performance"
rationale: "初始架構預期支持<5000用戶"
recommended_actions:
- "啟用資料庫讀寫分離"
- "引入CDN加速靜態資源"
- "考慮將Analytics提升為SMS"
- id: recommendation_promotion
condition: "Recommendation被>=5個模組依賴"
action: "promote_to_SMS"
rationale: "廣泛依賴表明它實際上是核心功能"
- id: cleanup_dead_code
condition: "Social模組6個月無使用"
action: "mark_deprecated"
rationale: "無人使用的功能應該清理"
語義:evolution區塊定義了「何時重新評估架構」的規則。FPL監控器會定期檢查這些條件,並在觸發時通知開發者或自動執行動作(如生成重構建議的Pull Request)。
2.3 完整範例與註解
yaml
# reading-tracker.mssp.yaml
# 智能閱讀追蹤系統的MSSP-Lang定義
meta:
name: "智能閱讀追蹤"
version: "1.0.0"
scale: medium
authors:
- name: "Neo K."
role: "架構師"
context:
problem: |
使用者缺乏有效的閱讀追蹤工具,
導致閱讀計劃難以堅持。
target_users: "個人閱讀愛好者"
constraints:
time: "4個月MVP"
team: "2名全端工程師"
decisions:
tech_stack:
backend:
language: python
framework: django
rationale: "團隊熟悉,開發速度快"
weights:
development_speed: 0.4
team_familiarity: 0.3
database:
primary: postgresql
cache: redis
architecture:
pattern: layered
principles:
- "TMS不可直接訪問資料庫"
- "SMS模組間禁止循環依賴"
SMS:
- module: User
stability: core
interfaces:
authenticate: {params: [username, password], returns: Token}
get_profile: {params: [user_id], returns: UserProfile}
dependencies:
external: [redis, postgresql]
- module: Book
stability: core
interfaces:
search_books: {params: [query], returns: List [Book]}
dependencies:
external: [elasticsearch]
- module: Reading
stability: core
interfaces:
record_progress: {params: [user_id, book_id, progress]}
get_history: {params: [user_id], returns: List [Record]}
dependencies:
internal: [User, Book]
TMS:
- subset: Analytics
optional: true
stability: evolving
dependencies:
internal: [Reading]
- subset: Recommendation
optional: true
stability: experimental
dependencies:
internal: [Reading, Book]
deployment:
mode: single_server
resources:
cpu: "2 cores"
memory: "4GB"
evolution:
triggers:
- condition: "user_count > 5000"
action: "evaluate_performance"
- condition: "Recommendation被>=5個模組依賴"
action: "promote_to_SMS"
```
## 第三章:FPL編譯器架構
### 3.1 編譯流程概覽
FPL編譯器將高階的MSSP-Lang配置轉換為可執行的專案結構。整個流程分為七個階段:
```
┌────────────────────────────────────────────┐
│ Phase 1: 詞法分析與語法解析 (Parsing) │
│ Input: mssp.config.yaml │
│ Output: AST (抽象語法樹) │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 2: 語義驗證 (Semantic Validation) │
│ - 檢查模組依賴是否存在循環 │
│ - 驗證介面定義的完整性 │
│ - 檢查架構約束是否違反 │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 3: 資料夾結構生成 (Folder Gen) │
│ - 根據scale參數決定層級深度 │
│ - 生成符合MSSP規範的目錄樹 │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 4: FMS文檔生成 (Doc Generation) │
│ - 生成FMS/00_NARRATIVE.md │
│ - 生成FMS/01_INDEX.md │
│ - 生成ADR文檔 │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 5: 程式碼骨架生成 (Code Skeleton) │
│ - 生成各模組的__init__.py │
│ - 生成介面定義檔案 │
│ - 生成資料模型 │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 6: 架構圖生成 (Diagram Gen) │
│ - 生成Mermaid格式的架構圖 │
│ - 生成依賴關係圖 │
│ - 生成資料流圖 │
└──────────────┬─────────────────────────────┘
│
┌──────────────▼─────────────────────────────┐
│ Phase 7: 配套工具生成 (Tooling Gen) │
│ - 生成CI/CD配置 (.github/workflows) │
│ - 生成Docker配置 │
│ - 生成架構Linter腳本 │
└────────────────────────────────────────────┘
3.2 核心編譯器模組
3.2.1 語法解析器
python
# compiler/parser.py
from dataclasses import dataclass
from typing import List, Dict, Optional
import yaml
@dataclass
class ModuleDefinition:
name: str
description: str
stability: str # core | stable | evolving | experimental | planned
interfaces: Dict [str, InterfaceSpec]
dependencies: Dependencies
data_model: Optional [Dict] = None
@dataclass
class InterfaceSpec:
params: List [Parameter]
returns: TypeSpec
errors: List [str]
@dataclass
class Dependencies:
internal: List [str] # 內部模組名稱
external: List [str] # 外部服務名稱
class MSSPParser:
def parse(self, config_file: str) -> ProjectAST:
"""解析MSSP-Lang配置文件為AST"""
with open(config_file, 'r') as f:
raw_config = yaml.safe_load(f)
# 解析meta區塊
meta = self._parse_meta(raw_config.get('meta', {}))
# 解析context區塊
context = self._parse_context(raw_config.get('context', {}))
# 解析decisions區塊
decisions = self._parse_decisions(raw_config.get('decisions', {}))
# 解析architecture區塊
architecture = self._parse_architecture(raw_config.get('architecture', {}))
# 解析deployment區塊
deployment = self._parse_deployment(raw_config.get('deployment', {}))
# 解析evolution區塊
evolution = self._parse_evolution(raw_config.get('evolution', {}))
return ProjectAST(
meta=meta,
context=context,
decisions=decisions,
architecture=architecture,
deployment=deployment,
evolution=evolution
)
def _parse_architecture(self, arch_config: dict) -> Architecture:
"""解析架構定義"""
pattern = arch_config.get('pattern', 'layered')
principles = arch_config.get('principles', [])
# 解析SMS模組
sms_modules = []
for module_def in arch_config.get('SMS', []):
module = ModuleDefinition(
name=module_def ['module'],
description=module_def.get('description', ''),
stability=module_def.get('stability', 'stable'),
interfaces=self._parse_interfaces(module_def.get('interfaces', {})),
dependencies=self._parse_dependencies(module_def.get('dependencies', {})),
data_model=module_def.get('data_model')
)
sms_modules.append(module)
# 解析TMS子集
tms_subsets = []
for subset_def in arch_config.get('TMS', []):
subset = SubsetDefinition(
name=subset_def ['subset'],
description=subset_def.get('description', ''),
optional=subset_def.get('optional', True),
stability=subset_def.get('stability', 'evolving'),
interfaces=self._parse_interfaces(subset_def.get('interfaces', {})),
dependencies=self._parse_dependencies(subset_def.get('dependencies', {}))
)
tms_subsets.append(subset)
return Architecture(
pattern=pattern,
principles=principles,
sms=sms_modules,
tms=tms_subsets
)
3.2.2 語義驗證器
python
# compiler/validator.py
class SemanticValidator:
def validate(self, ast: ProjectAST) -> ValidationResult:
"""執行語義驗證,返回違規列表"""
violations = []
# 檢查1:循環依賴檢測
cycles = self._detect_cycles(ast.architecture)
if cycles:
violations.append(
Violation(
level="ERROR",
rule="no_cyclic_dependencies",
message=f"檢測到循環依賴: {' → '.join(cycles [0])}",
suggestion="重構模組邊界或引入中介者模式"
)
)
# 檢查2:依賴的模組是否存在
for module in ast.architecture.sms:
for dep in module.dependencies.internal:
if not self._module_exists(dep, ast.architecture):
violations.append(
Violation(
level="ERROR",
rule="valid_dependencies",
message=f"模組 {module.name} 依賴不存在的模組 {dep}"
)
)
# 檢查3:TMS不可依賴TMS(除非顯式允許)
for subset in ast.architecture.tms:
for dep in subset.dependencies.internal:
if self._is_tms_module(dep, ast.architecture):
violations.append(
Violation(
level="WARNING",
rule="tms_cross_dependency",
message=f"TMS子集 {subset.name} 依賴另一個TMS子集 {dep}",
suggestion="考慮將 {dep} 提升為SMS"
)
)
# 檢查4:介面定義完整性
for module in ast.architecture.sms:
for iface_name, iface_spec in module.interfaces.items():
if not iface_spec.returns:
violations.append(
Violation(
level="WARNING",
rule="complete_interface",
message=f"{module.name}.{iface_name} 缺少返回類型定義"
)
)
# 檢查5:架構原則驗證
for principle in ast.architecture.principles:
if not self._check_principle(principle, ast.architecture):
violations.append(
Violation(
level="ERROR",
rule="architecture_principle",
message=f"違反架構原則: {principle}"
)
)
return ValidationResult(
is_valid=(len( [v for v in violations if v.level == "ERROR"]) == 0),
violations=violations
)
def _detect_cycles(self, architecture: Architecture) -> List [List [str]]:
"""使用深度優先搜尋檢測循環依賴"""
graph = self._build_dependency_graph(architecture)
def dfs(node, visited, stack):
visited.add(node)
stack.append(node)
for neighbor in graph.get(node, []):
if neighbor in stack:
# 發現環
cycle_start = stack.index(neighbor)
return stack [cycle_start:] + [neighbor]
if neighbor not in visited:
result = dfs(neighbor, visited, stack)
if result:
return result
stack.pop()
return None
visited = set()
for node in graph:
if node not in visited:
cycle = dfs(node, visited, [])
if cycle:
return [cycle]
return []
3.2.3 資料夾生成器
python
# compiler/folder_generator.py
class FolderGenerator:
def generate(self, ast: ProjectAST, output_dir: str):
"""生成符合MSSP規範的資料夾結構"""
scale = ast.meta.scale
if scale == "small":
self._generate_small_structure(ast, output_dir)
elif scale == "medium":
self._generate_medium_structure(ast, output_dir)
elif scale == "large":
self._generate_large_structure(ast, output_dir)
else: # enterprise
self._generate_enterprise_structure(ast, output_dir)
def _generate_medium_structure(self, ast: ProjectAST, output_dir: str):
"""生成中型專案結構"""
base = Path(output_dir)
# 創建頂層結構
(base / "FMS").mkdir(parents=True)
(base / "core").mkdir()
(base / "features").mkdir()
(base / "shared").mkdir()
(base / "tests").mkdir()
# 生成FMS資料夾內容(下一階段處理)
# 生成SMS模組資料夾
for module in ast.architecture.sms:
module_dir = base / "core" / module.name.lower()
module_dir.mkdir()
# 創建模組內部檔案(骨架)
(module_dir / "__init__.py").touch()
(module_dir / "interfaces.py").touch()
(module_dir / "models.py").touch()
(module_dir / "services.py").touch()
# 生成SMS內部導航圖
self._generate_sms_map(ast, base / "core" / "_SMS_MAP.md")
# 生成TMS子集資料夾
for subset in ast.architecture.tms:
subset_dir = base / "features" / subset.name.lower()
subset_dir.mkdir()
(subset_dir / "__init__.py").touch()
# 生成TMS註冊表
self._generate_tms_registry(ast, base / "features" / "_TMS_REGISTRY.json")
3.3 性能與資源模型
3.3.1 編譯時性能分析
理論複雜度
| 階段 | 時間複雜度 | 空間複雜度 | 瓶頸 |
|---|---|---|---|
| 解析 | O(n) | O(n) | YAML解析 |
| 驗證 | O(V+E) | O(V) | 循環檢測(V=模組數,E=依賴數) |
| 資料夾生成 | O(M) | O(1) | 檔案系統I/O(M=模組數) |
| 文檔生成 | O(M) | O(M) | Markdown渲染 |
| 架構圖生成 | O(V²) | O(V+E) | 圖佈局演算法 |
實測數據(假設)
基準環境:MacBook Pro M2, 16GB RAM
| 專案規模 | 模組數 | 編譯時間 | 記憶體峰值 |
|---|---|---|---|
| 小型 | 10 | 0.8秒 | 45MB |
| 中型 | 50 | 2.3秒 | 120MB |
| 大型 | 200 | 8.5秒 | 380MB |
| 超大型 | 500 | 25秒 | 950MB |
優化策略
增量編譯:只重新生成變更的模組
並行化:資料夾生成與文檔生成可並行執行
快取:架構圖佈局結果快取,僅在拓撲變化時重算
3.3.2 運行時性能監控
FPL生成的專案包含架構監控模組,持續追蹤:
python
# generated/platform/architecture_monitor.py
class ArchitectureMonitor:
def __init__(self, config_path: str):
self.config = load_mssp_config(config_path)
self.metrics = {
"module_count": 0,
"dependency_count": 0,
"cyclic_dependencies": [],
"dead_modules": [],
"hot_modules": [] # 高頻訪問的模組
}
def collect_metrics(self):
"""收集架構度量"""
# 掃描程式碼,構建實際的依賴圖
actual_graph = self._scan_imports()
# 與配置定義的依賴圖對比
config_graph = self._build_config_graph()
# 檢測違規
violations = self._compare_graphs(actual_graph, config_graph)
# 分析模組使用率(從日誌或APM工具)
usage_stats = self._analyze_module_usage()
return {
"metrics": self.metrics,
"violations": violations,
"usage": usage_stats
}
```
**資源占用模型**
| 監控頻率 | CPU占用 | 記憶體占用 | 建議場景 |
|---------|--------|-----------|---------|
| 即時(每次import) | 高(5-10%) | 中(50MB) | 開發環境 |
| 定期(每小時) | 低(<1%) | 低(20MB) | 生產環境 |
| CI觸發(每次PR) | - | - | 最佳實踐 |
## 第四章:IDE整合與視覺化
### 4.1 「資料夾即架構圖」的雙向編輯
**核心理念**
傳統IDE顯示資料夾樹,但這是**靜態的、平面的視圖**。FPL IDE創新在於提供**動態的、多維度的視圖**:
```
傳統IDE:
project/
├── core/
│ ├── user/
│ └── order/
└── features/
└── cart/
FPL IDE(同時顯示):
1. 資料夾樹視圖(左側)
2. 架構圖視圖(中間,可拖拽)
3. 依賴分析視圖(右側)
```
**雙向同步機制**
```
操作1:在資料夾樹中創建新資料夾 features/recommendation/
↓ 自動觸發
架構圖自動添加新節點 [Recommendation]
↓ 自動觸發
mssp.config.yaml自動更新(在TMS區塊添加Recommendation定義)
操作2:在架構圖中拖拽 [Cart] 從TMS移動到SMS
↓ 自動觸發
檢查違規(Cart的optional屬性與SMS不符)→ 彈出警告
↓ 用戶確認
資料夾從 features/cart/ 移動到 core/cart/
↓ 自動觸發
更新所有import語句(從 features.cart 改為 core.cart)
↓ 自動觸發
mssp.config.yaml更新(Cart從TMS移動到SMS)
4.2 VSCode擴展原型
typescript
// extensions/vscode-fpl/src/extension.ts
import * as vscode from 'vscode';
import { MSSPParser } from './compiler/parser';
import { DiagramRenderer } from './ui/diagram_renderer';
import { ArchitectureLinter } from './linter/architecture_linter';
export function activate(context: vscode.ExtensionContext) {
// 命令1:初始化FPL專案
let initCmd = vscode.commands.registerCommand('fpl.init', async () => {
// 引導式對話收集資訊
const projectName = await vscode.window.showInputBox({
prompt: "專案名稱?"
});
const scale = await vscode.window.showQuickPick(
['small', 'medium', 'large', 'enterprise'],
{ placeHolder: "專案規模?" }
);
// 生成初始的mssp.config.yaml
const template = generateTemplate(projectName, scale);
// 創建檔案
const workspaceFolder = vscode.workspace.workspaceFolders [0];
const configPath = vscode.Uri.joinPath(workspaceFolder.uri, 'mssp.config.yaml');
await vscode.workspace.fs.writeFile(configPath, Buffer.from(template));
vscode.window.showInformationMessage('FPL專案初始化完成!');
});
// 命令2:編譯FPL配置
let compileCmd = vscode.commands.registerCommand('fpl.compile', async () => {
const configPath = findMSSPConfig();
if (!configPath) {
vscode.window.showErrorMessage('找不到mssp.config.yaml');
return;
}
// 解析配置
const parser = new MSSPParser();
const ast = parser.parse(configPath);
// 驗證
const validator = new SemanticValidator();
const result = validator.validate(ast);
if (!result.is_valid) {
// 顯示錯誤
showValidationErrors(result.violations);
return;
}
// 生成專案結構
await generateProjectStructure(ast);
vscode.window.showInformationMessage('FPL編譯成功!');
});
// 命令3:顯示架構圖
let showDiagramCmd = vscode.commands.registerCommand('fpl.showDiagram', () => {
const panel = vscode.window.createWebviewPanel(
'fplDiagram',
'Architecture Diagram',
vscode.ViewColumn.Two,
{
enableScripts: true
}
);
const configPath = findMSSPConfig();
const parser = new MSSPParser();
const ast = parser.parse(configPath);
// 生成Mermaid圖表
const mermaidCode = generateMermaidDiagram(ast.architecture);
// 渲染到Webview
panel.webview.html = getWebviewContent(mermaidCode);
});
// 檔案監控:當mssp.config.yaml變更時重新驗證
const watcher = vscode.workspace.createFileSystemWatcher('**/mssp.config.yaml');
watcher.onDidChange(async () => {
const linter = new ArchitectureLinter();
const violations = await linter.lint();
// 顯示診斷資訊
updateDiagnostics(violations);
});
context.subscriptions.push(initCmd, compileCmd, showDiagramCmd, watcher);
}
function getWebviewContent(mermaidCode: string): string {
return `
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"\>\</script>
<script>mermaid.initialize({ startOnLoad: true });</script>
</head>
<body>
<div class="mermaid">
${mermaidCode}
</div>
</body>
</html>
`;
}
4.3 架構圖的互動式編輯
D3.js實現的可拖拽架構圖
javascript
// ui/architecture_editor.js
class ArchitectureEditor {
constructor(containerId, msspConfig) {
this.container = d3.select(`#${containerId}`);
this.config = msspConfig;
this.nodes = this.buildNodes(msspConfig.architecture);
this.links = this.buildLinks(msspConfig.architecture);
this.initSimulation();
this.render();
}
buildNodes(architecture) {
let nodes = [];
// SMS節點(紅色)
architecture.SMS.forEach(module => {
nodes.push({
id: module.name,
type: 'SMS',
label: module.name,
stability: module.stability,
color: this.getColorByStability(module.stability)
});
});
// TMS節點(綠色)
architecture.TMS.forEach(subset => {
nodes.push({
id: subset.name,
type: 'TMS',
label: subset.name,
optional: subset.optional,
color: '#90EE90'
});
});
return nodes;
}
buildLinks(architecture) {
let links = [];
// 構建依賴邊
architecture.SMS.forEach(module => {
module.dependencies.internal.forEach(dep => {
links.push({
source: module.name,
target: dep,
type: 'dependency'
});
});
});
architecture.TMS.forEach(subset => {
subset.dependencies.internal.forEach(dep => {
links.push({
source: subset.name,
target: dep,
type: 'dependency'
});
});
});
return links;
}
initSimulation() {
this.simulation = d3.forceSimulation(this.nodes)
.force('link', d3.forceLink(this.links).id(d => d.id))
.force('charge', d3.forceManyBody().strength(-300))
.force('center', d3.forceCenter(400, 300))
.on('tick', () => this.updatePositions());
}
render() {
// 繪製邊
this.linkElements = this.container.selectAll('.link')
.data(this.links)
.enter().append('line')
.attr('class', 'link')
.attr('stroke', '#999')
.attr('stroke-width', 2)
.attr('marker-end', 'url(#arrow)');
// 繪製節點
this.nodeElements = this.container.selectAll('.node')
.data(this.nodes)
.enter().append('g')
.attr('class', 'node')
.call(d3.drag()
.on('start', d => this.dragStart(d))
.on('drag', d => this.dragging(d))
.on('end', d => this.dragEnd(d))
);
// 節點圓形
this.nodeElements.append('circle')
.attr('r', 30)
.attr('fill', d => d.color);
// 節點標籤
this.nodeElements.append('text')
.attr('text-anchor', 'middle')
.attr('dy', 5)
.text(d => d.label);
// 添加右鍵選單
this.nodeElements.on('contextmenu', (event, d) => {
event.preventDefault();
this.showContextMenu(event, d);
});
}
showContextMenu(event, node) {
const menu = [
{ label: '查看詳情', action: () => this.showNodeDetails(node) },
{ label: '編輯介面', action: () => this.editInterfaces(node) },
{ label: '查看依賴', action: () => this.highlightDependencies(node) },
];
if (node.type === 'TMS') {
menu.push({
label: '提升為SMS',
action: () => this.promoteToSMS(node)
});
}
if (node.type === 'SMS') {
menu.push({
label: '降級為TMS',
action: () => this.demoteToTMS(node)
});
}
this.displayContextMenu(event.pageX, event.pageY, menu);
}
promoteToSMS(node) {
// 檢查前置條件
if (this.hasCircularDependency(node)) {
alert('無法提升:存在循環依賴');
return;
}
// 更新配置
this.updateMSSPConfig({
action: 'promote',
module: node.id,
from: 'TMS',
to: 'SMS'
});
// 更新視覺
node.type = 'SMS';
node.color = '#FF6B6B'; // 紅色
this.render();
// 通知後端重新生成資料夾結構
this.sendUpdateToBackend();
}
}
4.4 協作編輯機制
基於Operational Transformation的衝突解決
當多人同時編輯mssp.config.yaml時,採用類似Google Docs的協作機制:
python
# server/collaboration.py
class CollaborationEngine:
def __init__(self):
self.active_sessions = {} # session_id -> user_info
self.operation_log = [] # 操作歷史
def apply_operation(self, op: Operation) -> Result:
"""應用操作並解決衝突"""
# 操作類型:
# - add_module
# - remove_module
# - modify_dependency
# - change_stability
if op.type == 'add_module':
# 檢查模組名稱衝突
if self.module_exists(op.module_name):
return Result(
success=False,
error="模組名稱已存在",
suggestion="使用不同名稱或合併到現有模組"
)
# 應用操作
self.config.architecture.SMS.append(op.module_def)
self.operation_log.append(op)
# 廣播給其他協作者
self.broadcast(op, exclude=op.user_id)
return Result(success=True)
elif op.type == 'modify_dependency':
# 檢查是否會引入循環依賴
temp_config = self.config.copy()
temp_config.apply(op)
if self.has_cycle(temp_config):
return Result(
success=False,
error="此操作會引入循環依賴",
cycle_path=self.find_cycle(temp_config)
)
# 應用操作
self.config.apply(op)
self.operation_log.append(op)
self.broadcast(op, exclude=op.user_id)
return Result(success=True)
```
## 第五章:AI代理整合
### 5.1 三層分工模型
```
┌─────────────────────────────────────────────┐
│ 宏觀層:Claude/GPT-4(戰略對話助手) │
│ - 引導用戶定義商業目標 │
│ - 技術選型建議(基於多屬性決策分析) │
│ - 生成mssp.config.yaml初稿 │
└──────────────┬──────────────────────────────┘
│ mssp.config.yaml
┌──────────────▼──────────────────────────────┐
│ 中觀層:FPL編譯器(架構生成器) │
│ - 解析MSSP-Lang │
│ - 生成資料夾結構 │
│ - 生成介面定義與資料模型骨架 │
│ - 生成架構圖 │
└──────────────┬──────────────────────────────┘
│ 專案骨架 + Task List
┌──────────────▼──────────────────────────────┐
│ 微觀層:Cursor/Antigravity(程式碼助手) │
│ - 填充函數實作 │
│ - 生成單元測試 │
│ - 程式碼重構與優化 │
└──────────────┬──────────────────────────────┘
│ 完整程式碼
┌──────────────▼──────────────────────────────┐
│ 驗證層:FPL監控器(架構守護者) │
│ - 檢查實際程式碼是否符合架構定義 │
│ - 檢測架構漂移 │
│ - 建議重構 │
└─────────────────────────────────────────────┘
5.2 宏觀層對話範例
對話式需求收集
Human: 我想做一個閱讀追蹤應用
AI: 很好的想法!讓我幫你澄清一些關鍵問題:
1. **目標用戶**:是個人用戶還是企業/教育機構?
2. **核心價值**:主要解決什麼痛點?
3. **時間約束**:希望多久完成MVP?
4. **團隊規模**:有多少人參與開發?
5. **技術棧偏好**:有特定的語言/框架要求嗎?
請告訴我這些資訊,我會生成一份架構配置草稿。
Human:
1. 個人用戶為主
2. 主要是讓人堅持閱讀習慣,有成就感
3. 希望4個月內上線MVP
4. 我自己加一個前端,兩個人
5. 我們都會Python,前端會Vue
AI: 明白了!基於您的需求,我建議以下架構:
**專案規模判定:中型專案**
- 預期模組數:15-20個
- 推薦資料夾層級:2層
**技術選型建議**(基於多屬性決策分析):
| 維度 | Python+Django | Node.js+Express | 權重 |
|------|--------------|-----------------|------|
| 開發速度 | 9 | 7 | 0.4 |
| 團隊熟悉度 | 10 | 3 | 0.3 |
| 生態成熟度 | 9 | 8 | 0.2 |
| 效能 | 6 | 7 | 0.1 |
| **加權分數** | **8.7** | 5.8 | |
**推薦:Python + Django**
現在讓我生成MSSP-Lang配置:
```yaml
meta: name: "閱讀追蹤" version: "0.1.0" scale: medium authors: - name: "用戶" role: "全端工程師"
context: problem: | 個人閱讀者缺乏有效的進度追蹤工具, 導致閱讀計劃難以堅持,缺乏成就感。
target_users: "個人閱讀愛好者"
success_criteria: - "30天留存率>30%" - "用戶平均完成3本書/月"
constraints: time: "4個月MVP" team: "2人(1後端+1前端)" budget: "最小化成本"
decisions: tech_stack: backend: language: python framework: django version: ">=4.2" rationale: "團隊熟悉,開發速度快,4個月時限優先"
database:
primary: postgresql # 免費層:Railway/Supabase
cache: redis
frontend:
framework: vue3
ui_library: vuetify
architecture: pattern: layered
principles: - "TMS不可直接訪問資料庫" - "SMS模組間禁止循環依賴"
SMS: - module: User stability: core interfaces: register: {params: [username, email, password]} authenticate: {params: [username, password], returns: Token} get_profile: {params: [user_id], returns: UserProfile}
- module: Book
stability: core
interfaces:
search_books: {params: [query], returns: List [Book]}
add_book: {params: [book_info], returns: Book}
get_detail: {params: [book_id], returns: BookDetail}
- module: Reading
stability: core
interfaces:
start_reading: {params: [user_id, book_id]}
update_progress: {params: [user_id, book_id, progress]}
get_history: {params: [user_id], returns: List [Record]}
dependencies:
internal: [User, Book]
TMS: - subset: Statistics description: "閱讀數據統計與視覺化" optional: true interfaces: get_summary: {params: [user_id, period], returns: Summary} dependencies: internal: [Reading]
- subset: Social
description: "書友分享功能"
optional: true
stability: planned # 二期功能
interfaces:
share_reading: {params: [user_id, book_id, comment]}
deployment: mode: single_server hosting: railway # 免費層 resources: cpu: "0.5 cores" memory: "512MB"
evolution: triggers: - condition: "daily_active_users > 1000" action: "upgrade_resources" - condition: "Statistics被>=3個模組依賴" action: "promote_to_SMS"
**這份配置已經完成!**
您可以:
1. 下載這份`mssp.config.yaml`
2. 運行`fpl compile`生成完整專案結構
3. 讓Cursor/Antigravity填充具體實作
需要我解釋任何部分嗎?
5.3 中觀層自動生成
FPL編譯器的輸出
當用戶運行fpl compile reading-tracker.mssp.yaml時:
bash
$ fpl compile reading-tracker.mssp.yaml
[1/7] 解析配置... ✓ (0.2s)
[2/7] 語義驗證... ✓ (0.1s)
- 模組數量: 6
- 依賴關係: 5
- 循環依賴: 無
[3/7] 生成資料夾結構... ✓ (0.3s)
- 創建 FMS/ 及3個文檔
- 創建 core/user/, core/book/, core/reading/
- 創建 features/statistics/
[4/7] 生成FMS文檔... ✓ (0.4s)
- FMS/00_NARRATIVE.md (1.2KB)
- FMS/01_INDEX.md (0.8KB)
- FMS/02_ADR.md (2.1KB)
[5/7] 生成程式碼骨架... ✓ (0.6s)
- 生成 18 個Python檔案
- 生成介面定義 (interfaces.py)
- 生成資料模型 (models.py)
[6/7] 生成架構圖... ✓ (0.5s)
- architecture_diagram.mermaid
- dependency_graph.dot
[7/7] 生成配套工具... ✓ (0.3s)
- .github/workflows/ci.yml
- docker-compose.yml
- scripts/architecture_lint.py
✅ 專案生成成功!
📂 生成的結構:
reading-tracker/
├── FMS/
│ ├── 00_NARRATIVE.md
│ ├── 01_INDEX.md
│ └── 02_ADR.md
├── core/
│ ├── user/
│ │ ├── __init__.py
│ │ ├── interfaces.py # ← AI需填充實作
│ │ ├── models.py
│ │ └── services.py
│ ├── book/
│ └── reading/
├── features/
│ └── statistics/
├── tests/
└── mssp.config.yaml
🎯 下一步:
1. 運行 `fpl install-deps` 安裝依賴
2. 使用Cursor打開專案,AI會自動填充實作
3. 運行 `fpl verify` 驗證架構一致性
總耗時: 2.4秒
生成的介面定義範例
python
# core/user/interfaces.py(由FPL生成的骨架)
from abc import ABC, abstractmethod
from typing import Optional
from dataclasses import dataclass
@dataclass
class Token:
access_token: str
refresh_token: str
expires_in: int
@dataclass
class UserProfile:
id: str
username: str
email: str
created_at: str
avatar_url: Optional [str] = None
class IUserService(ABC):
"""
用戶服務介面
職責:
- 管理用戶註冊與登入
- 維護用戶Session
- 提供權限驗證介面
約束:
- 不可依賴TMS子集
- 必須通過100%單元測試覆蓋
"""
@abstractmethod
def register(self, username: str, email: str, password: str) -> UserProfile:
"""
註冊新用戶
Args:
username: 用戶名(字母開頭,3-20字符)
email: 電子郵件(必須通過格式驗證)
password: 密碼(至少8字符)
Returns:
UserProfile: 新創建的用戶資料
Raises:
UserAlreadyExistsError: 用戶名或郵件已存在
InvalidInputError: 輸入格式不正確
"""
pass
@abstractmethod
def authenticate(self, username: str, password: str) -> Token:
"""
用戶認證
Args:
username: 用戶名
password: 密碼
Returns:
Token: JWT令牌(access + refresh)
Raises:
InvalidCredentialsError: 帳號或密碼錯誤
AccountLockedError: 帳號已被鎖定
"""
pass
@abstractmethod
def get_profile(self, user_id: str) -> UserProfile:
"""
獲取用戶資料
Args:
user_id: 用戶ID(UUID格式)
Returns:
UserProfile: 用戶完整資料
Raises:
UserNotFoundError: 用戶不存在
"""
pass
# TODO: 實作這個介面
# 提示:可以使用Django的User模型 + JWT庫
# 參考文檔:https://docs.djangoproject.com/en/4.2/topics/auth/
5.4 微觀層AI程式碼填充
Cursor/Antigravity的任務清單
FPL生成的專案包含TODO.md:
markdown
# 開發任務清單
由FPL自動生成,建議使用Cursor或Antigravity逐項完成。
## 優先級1:核心模組(SMS)
### User模組
- [ ] 實作 `IUserService.register()`
- 使用Django User模型
- 密碼加密:bcrypt
- 郵件驗證:發送確認郵件
- [ ] 實作 `IUserService.authenticate()`
- JWT令牌生成(djangorestframework-simplejwt)
- 失敗次數限制(5次鎖定10分鐘)
- [ ] 實作 `IUserService.get_profile()`
- 查詢優化:使用select_related
### Book模組
- [ ] 實作 `IBookService.search_books()`
- 整合Elasticsearch全文搜尋
- 支持模糊匹配、作者搜尋
- [ ] 實作 `IBookService.add_book()`
- 資料驗證:ISBN格式檢查
- 去重:檢查ISBN是否已存在
### Reading模組
- [ ] 實作 `IReadingService.start_reading()`
- 創建閱讀記錄
- 初始進度為0%
- [ ] 實作 `IReadingService.update_progress()`
- 進度驗證:0-100之間
- 觸發成就系統(完成時)
- [ ] 實作 `IReadingService.get_history()`
- 分頁查詢:每頁20條
- 排序:按開始時間降序
## 優先級2:功能模組(TMS)
### Statistics模組
- [ ] 實作 `IStatisticsService.get_summary()`
- 聚合查詢:閱讀天數、完成書籍數
- 生成圖表數據(JSON格式)
## 優先級3:測試
- [ ] User模組單元測試(覆蓋率>90%)
- [ ] Book模組單元測試
- [ ] Reading模組單元測試
- [ ] 整合測試:完整的用戶註冊→登入→閱讀流程
## 優先級4:前端整合
- [ ] 實作登入頁面(Vue3 + Vuetify)
- [ ] 實作書籍搜尋頁面
- [ ] 實作閱讀進度更新介面
AI填充實作範例
開發者在Cursor中打開core/user/services.py,輸入註解:
python
# core/user/services.py
# Cursor Prompt: "實作IUserService介面,使用Django User模型和JWT"
from .interfaces import IUserService, Token, UserProfile
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password, check_password
from rest_framework_simplejwt.tokens import RefreshToken
import re
class UserService(IUserService):
"""用戶服務實作"""
def register(self, username: str, email: str, password: str) -> UserProfile:
# 驗證用戶名格式
if not re.match(r'^ [a-zA-Z] [a-zA-Z0-9_]{2,19}$', username):
raise InvalidInputError("用戶名必須字母開頭,3-20字符")
# 驗證郵件格式
if not re.match(r'^
+@
+\\w+$', email):
raise InvalidInputError("郵件格式不正確")
# 檢查是否已存在
if User.objects.filter(username=username).exists():
raise UserAlreadyExistsError(f"用戶名 {username} 已存在")
if User.objects.filter(email=email).exists():
raise UserAlreadyExistsError(f"郵件 {email} 已註冊")
# 創建用戶
user = User.objects.create(
username=username,
email=email,
password=make_password(password)
)
# TODO: 發送確認郵件(後續實作)
return UserProfile(
id=str(user.id),
username=user.username,
email=user.email,
created_at=user.date_joined.isoformat()
)
def authenticate(self, username: str, password: str) -> Token:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise InvalidCredentialsError("帳號或密碼錯誤")
if not check_password(password, user.password):
# TODO: 記錄失敗次數,5次後鎖定
raise InvalidCredentialsError("帳號或密碼錯誤")
# 生成JWT令牌
refresh = RefreshToken.for_user(user)
return Token(
access_token=str(refresh.access_token),
refresh_token=str(refresh),
expires_in=3600 # 1小時
)
def get_profile(self, user_id: str) -> UserProfile:
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
raise UserNotFoundError(f"用戶ID {user_id} 不存在")
return UserProfile(
id=str(user.id),
username=user.username,
email=user.email,
created_at=user.date_joined.isoformat(),
avatar_url=None # TODO: 整合頭像上傳功能
)
AI的優勢
自動填充樣板代碼:錯誤類別定義、參數驗證等
遵循介面契約:嚴格實作FPL定義的介面
自動生成測試:基於介面定義生成測試用例
第六章:性能、安全性與可擴展性
6.1 性能優化策略
6.1.1 編譯時優化
增量編譯
python
class IncrementalCompiler:
def __init__(self):
self.cache = CompilationCache()
def compile(self, config_path: str, force: bool = False):
"""增量編譯:只重新生成變更的部分"""
config_hash = self._compute_hash(config_path)
cached_result = self.cache.get(config_hash)
if cached_result and not force:
# 比較差異
diff = self._compute_diff(cached_result.config, current_config)
if diff.only_documentation_changed:
# 只重新生成文檔,不動程式碼
self._regenerate_docs(diff.changed_docs)
return
if diff.only_added_modules:
# 只生成新增模組,不影響現有模組
self._generate_new_modules(diff.new_modules)
return
# 完整編譯
self._full_compile(current_config)
並行化處理
python
import concurrent.futures
class ParallelCompiler:
def compile(self, ast: ProjectAST):
"""並行執行可獨立的編譯階段"""
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
# 同時執行:文檔生成、程式碼生成、圖表生成
futures = [
executor.submit(self.generate_docs, ast),
executor.submit(self.generate_code_skeletons, ast),
executor.submit(self.generate_diagrams, ast),
executor.submit(self.generate_ci_config, ast)
]
results = [f.result() for f in futures]
return CompilationResult(results)
6.1.2 運行時性能
架構監控的輕量級實現
python
class LightweightMonitor:
def __init__(self, sampling_rate=0.01):
"""
採樣監控:只追蹤1%的請求,減少性能影響
Args:
sampling_rate: 採樣率(0.01 = 1%)
"""
self.sampling_rate = sampling_rate
self.violations = []
def track_import(self, importer: str, imported: str):
"""追蹤import語句(在開發環境啟用)"""
if random.random() > self.sampling_rate:
return # 跳過大部分請求
# 檢查是否違反架構約束
if self._is_violation(importer, imported):
self.violations.append({
'timestamp': time.time(),
'importer': importer,
'imported': imported,
'violation_type': 'cross_layer_import'
})
6.2 安全性設計
6.2.1 DSL注入防護
參數驗證
python
class SecureParser:
ALLOWED_PATTERNS = {
'module_name': r'^ [A-Za-z] [A-Za-z0-9_]{0,49}$',
'version': r'^\d+\\d+\\d+$',
'email': r'^
+@
+\\w+$'
}
def parse_module_name(self, raw_input: str) -> str:
"""防止注入攻擊的模組名稱解析"""
# 白名單驗證
if not re.match(self.ALLOWED_PATTERNS ['module_name'], raw_input):
raise SecurityError(f"非法的模組名稱: {raw_input}")
# 長度限制
if len(raw_input) > 50:
raise SecurityError("模組名稱過長")
# 黑名單檢查(防止系統路徑)
blacklist = ['..', '/', '\', 'system', 'root']
if any(word in raw_input.lower() for word in blacklist):
raise SecurityError("模組名稱包含禁止字符")
return raw_input
6.2.2 權限模型
yaml
# 在mssp.config.yaml中定義權限
security:
rbac: # Role-Based Access Control
roles:
- name: architect
permissions:
- modify_fms
- add_sms_module
- modify_architecture_principles
- name: developer
permissions:
- add_tms_subset
- modify_tms_interfaces
- view_architecture
- name: viewer
permissions:
- view_architecture
- view_documentation
audit:
enabled: true
log_all_changes: true
notify_on_critical_changes:
- email: "architect@company.com"
events: [fms_modified, sms_removed]
6.3 可擴展性設計
6.3.1 插件系統
python
# extensions/plugin_interface.py
class FPLPlugin(ABC):
"""FPL插件介面"""
@abstractmethod
def get_name(self) -> str:
"""插件名稱"""
pass
@abstractmethod
def on_before_compile(self, ast: ProjectAST) -> ProjectAST:
"""編譯前鉤子:可修改AST"""
pass
@abstractmethod
def on_after_compile(self, result: CompilationResult):
"""編譯後鉤子:可處理生成結果"""
pass
# 範例:自動生成API文檔的插件
class OpenAPIPlugin(FPLPlugin):
def get_name(self) -> str:
return "OpenAPI Generator"
def on_after_compile(self, result: CompilationResult):
"""從介面定義生成OpenAPI 3.0規範"""
openapi_spec = {
"openapi": "3.0.0",
"info": {
"title": result.project_name,
"version": result.version
},
"paths": {}
}
# 遍歷SMS介面,生成API端點
for module in result.ast.architecture.sms:
for iface_name, iface_spec in module.interfaces.items():
path = f"/{module.name.lower()}/{iface_name}"
openapi_spec ["paths"] [path] = {
"post": {
"summary": f"{module.name}.{iface_name}",
"requestBody": self._gen_request_body(iface_spec),
"responses": self._gen_responses(iface_spec)
}
}
# 寫入檔案
with open(f"{result.output_dir}/openapi.yaml", 'w') as f:
yaml.dump(openapi_spec, f)
6.3.2 多語言支援
python
class LanguageAdapter(ABC):
"""語言適配器:支持不同程式語言"""
@abstractmethod
def generate_interface(self, module: ModuleDefinition) -> str:
"""生成該語言的介面定義"""
pass
@abstractmethod
def generate_model(self, model_def: dict) -> str:
"""生成資料模型"""
pass
class PythonAdapter(LanguageAdapter):
def generate_interface(self, module: ModuleDefinition) -> str:
code = f"class I{module.name}Service(ABC):\n"
for iface_name, iface_spec in module.interfaces.items():
params = ", ".join( [f"{p.name}: {p.type}" for p in iface_spec.params])
returns = iface_spec.returns.type_name
code += f" @abstractmethod\n"
code += f" def {iface_name}(self, {params}) -> {returns}:\n"
code += f" pass\n\n"
return code
class TypeScriptAdapter(LanguageAdapter):
def generate_interface(self, module: ModuleDefinition) -> str:
code = f"interface I{module.name}Service {{\n"
for iface_name, iface_spec in module.interfaces.items():
params = ", ".join( [f"{p.name}: {self._map_type(p.type)}" for p in iface_spec.params])
returns = self._map_type(iface_spec.returns.type_name)
code += f" {iface_name}({params}): Promise<{returns}>;\n"
code += "}\n"
return code
def _map_type(self, python_type: str) -> str:
"""Python類型映射到TypeScript類型"""
mapping = {
'str': 'string',
'int': 'number',
'float': 'number',
'bool': 'boolean',
'List': 'Array',
'Dict': 'Record'
}
return mapping.get(python_type, 'any')
第七章:實施路徑與生態建設
7.1 採用路徑
階段一:個人專案驗證(1-2個月)
目標:在低風險環境下體驗FPL工作流
行動清單:
選擇一個中小型個人專案(<5K行)
手動撰寫mssp.config.yaml
使用FPL CLI生成專案結構
用Cursor填充實作
記錄體驗:哪些環節順暢?哪些有阻礙?
成功指標:
能在30分鐘內生成完整專案骨架
架構圖能清晰表達系統結構
新增模組時,知道該放在哪個資料夾
階段二:團隊試點(3-6個月)
目標:在團隊層面驗證協作效益
行動清單:
選擇新專案(避免干擾現有專案)
團隊共同設計MSSP-Lang配置
建立Code Review流程:審查架構一致性
定期(每兩週)回顧架構健康度報告
成功指標:
新成員上手時間減少30%
架構決策有明確文檔記錄
減少「這個功能該放哪裡」的討論時間
階段三:企業推廣(6-12個月)
目標:建立企業級最佳實踐
行動清單:
開發內部FPL培訓課程
建立公司級的架構原則庫
整合到CI/CD:自動檢查架構違規
建立「架構委員會」:審核重大架構變更
7.2 開源生態策略
核心開放內容
FPL規範:MSSP-Lang語法定義(CC BY 4.0授權)
參考實現:Python版編譯器(MIT授權)
VSCode擴展:基礎IDE整合(MIT授權)
範例專案:10個不同規模的示範專案
社群貢獻方向
語言適配器:Java、Rust、Go的生成器
插件生態:GraphQL生成器、Kubernetes配置生成器
視覺化工具:更豐富的架構圖樣式
AI整合:與不同AI工具的適配
商業化路徑
開源核心 + 企業版:核心功能免費,高級功能(多團隊協作、審計日誌)收費
雲端服務:提供託管的FPL編譯器與架構監控平台
諮詢服務:幫助企業遷移到FPL工作流
第八章:哲學結語
從「程式碼是什麼」到「架構是什麼」
在路德維希·維根斯坦的《邏輯哲學論》中,他區分了「可說」(sayable)與「可顯示」(showable):邏輯結構無法用語言陳述,只能通過命題的形式自我顯示。軟體架構也是如此——它無法用散文式的文檔完全「說」清楚,而必須通過系統的組織方式「顯示」出來。
資料夾程式語言的革命性在於,它創造了一種讓架構自我顯示的形式語言。當mssp.config.yaml定義了系統的三層結構、依賴關係、演化觸發條件,它不是在「描述」架構,而是就是架構本身的編碼形式。這呼應了約翰·塞爾的言語行為理論(Speech Act Theory):某些語言不是描述世界,而是構成世界——「我宣布你們結為夫妻」不是描述婚姻,而是創造婚姻。FPL的DSL不是描述系統,而是定義系統。
認知外骨骼的倫理學
當AI能夠從MSSP-Lang自動生成完整專案時,我們面臨一個深刻的倫理問題:人類在創造過程中的角色是什麼?
法國哲學家貝爾納·斯蒂格勒(Bernard Stiegler)提出「技術即記憶的外化」:從最早的石器到現代的電腦,技術一直在承擔人類記憶與認知的外部化功能。FPL是這個外化過程的最新階段——它不是取代人類思考,而是將可形式化的架構知識外化到DSL中,解放人類去處理真正需要創造力的決策。
關鍵在於區分「可形式化的」與「不可形式化的」:
可形式化:「如果模組數量>50,則引入DDD分層」——這是規則,可以編碼
不可形式化:「這個專案是否值得投資4個月時間」——這需要商業判斷、直覺、承擔風險的勇氣
FPL的倫理承諾是:我們外化規則,保留判斷。人類仍然是決策者,但不再被瑣碎的執行細節淹沒。
架構作為「存有的開顯」
海德格爾在《藝術作品的本源》中提出:藝術的本質不是製造美的對象,而是「真理的發生」——讓存在者的存有顯現。梵谷的《農鞋》不是描繪一雙鞋,而是讓鞋的「鞋性」(shoeness)、農民勞動的世界顯現出來。
好的架構也是這樣的「開顯」。當我們打開一個專案,看到清晰的三層結構、明確的依賴箭頭、穩定性標籤的顏色編碼,系統的「系統性」(systemness)被顯現了——我們不再只看到一堆檔案,而是看到一個有機的、有意圖的整體。
FPL的資料夾結構不是「存放程式碼的地方」,而是系統架構在空間上的顯現。當資料夾路徑寫著core/user/domain/entities.py時,這個路徑本身就在訴說:「我是核心模組,屬於用戶領域,處於領域層,定義實體概念。」這種路徑即語義的特性,是架構知識的空間化編碼。
從控制到共生:與AI的新關係
傳統的人機關係是「命令-執行」:人類發出指令,機器執行。但在FPL範式中,關係變成了**「意圖-實現」**:人類表達意圖(通過MSSP-Lang),AI理解意圖並創造性地實現。
這種關係更接近建築師與工匠的協作:建築師繪製藍圖,工匠理解藍圖並發揮專業技能。關鍵的信任來自於:藍圖足夠清晰,工匠的創造性被約束在合理範圍內。
MSSP-Lang就是這樣的「藍圖語言」。它清晰到足以讓AI理解架構意圖,又開放到足以讓AI在實作層面發揮能力。這不是控制AI,而是與AI共同創造——人類設計架構,AI填充實作,兩者形成互補的認知分工。
結語:軟體工程的新人文主義
最終,資料夾程式語言指向一個更宏大的願景:讓軟體重新成為人類表達的媒介,而非人類屈從的技術迷宮。
當代軟體開發常陷入「技術崇拜」:追逐最新框架、最熱技術棧、最複雜的設計模式,卻忘記了軟體的本質是解決人類問題的工具。FPL的宏觀層(context、decisions)強制開發者回答:「為何做?為誰做?」這是對技術迷失的糾正。
更深層地,FPL主張架構的可讀性與程式碼的可讀性同等重要。一個系統的價值不僅在於它能運行,更在於它能被理解、能被傳承、能在十年後仍然清晰可維護。當架構被形式化為DSL、可視化為圖表、記錄為決策日誌,我們創造的不只是軟體,而是可傳承的知識。
在複雜性的時代,FPL提供的不是「更複雜的工具」,而是「讓複雜性可理解的框架」。它承認人類認知的限制(Miller's 7±2),利用空間記憶的優勢(資料夾結構),外化可形式化的知識(DSL),並在AI的協助下,讓普通開發者也能創造出清晰、優雅、可維護的系統。
這不是軟體工程的終點,而是一個新起點——從編碼的苦工走向架構的藝術,從個人的天賦走向可學習的方法,從混亂的探索走向有序的創造。當每個開發者都能用FPL清晰地表達架構意圖,當AI能完美地理解並實現這些意圖,當架構圖能像詩歌一樣優雅地展現系統的本質——此時,軟體工程將真正成為一門融合理性與創造力的人文工程學。
參考文獻
Miller, G. A. (1956). The magical number seven, plus or minus two: Some limits on our capacity for processing information. Psychological Review, 63(2), 81-97.
Sweller, J. (1988). Cognitive load during problem solving: Effects on learning. Cognitive Science, 12(2), 257-285.
Tversky, B. (2011). Visualizing Thought. Topics in Cognitive Science, 3(3), 499-535.
Conway, M. E. (1968). How do committees invent? Datamation, 14(4), 28-31.
Heidegger, M. (1927). Being and Time. Harper & Row. (存有與時間)
Wittgenstein, L. (1921). Tractatus Logico-Philosophicus. (邏輯哲學論)
Deleuze, G., & Guattari, F. (1987). A Thousand Plateaus. University of Minnesota Press. (千高原)
Evans, E. (2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley.
Martin, R. C. (2017). Clean Architecture: A Craftsman's Guide to Software Structure and Design. Prentice Hall.
Bachelard, G. (1958). The Poetics of Space. Beacon Press. (空間詩學)
附錄A:MSSP-Lang完整語法參考
附錄B:FPL CLI命令手冊
附錄C:架構健康度評估標準
附錄D:常見問題解答
文檔版本:1.0
字數統計:約10,500字
最後更新:2025年1月5日