iT邦幫忙

2025 iThome 鐵人賽

DAY 17
1
佛心分享-SideProject30

AI-Driven Development 實戰篇:30 天 Side Project 開發全紀錄系列 第 17

Day 17 - 智慧記帳 Day 6:AI-DLC Sprint Development 環節,Solo Sprint 的極速實戰

  • 分享至 

  • xImage
  •  

經過前五天的準備,我們已經完成了 AI-DLC Sprint 的前三個環節:規格書撰寫、User Story 拆解、UI/UX 設計。今天進入第四環節:Development(開發實作)。

更重要的是,今天要實際展示 Day 4 - AI-DLC Sprint 實戰:MenuBar Todo 的 PRD 速成魔法Solo Sprint

回顧:Solo Sprint 的極速心法

還記得介紹過的 Solo Sprint 嗎?這是 AI-DLC Sprint 為個人開發者打造的變形:

Solo Sprint(個人衝刺)
- 1 人團隊,超短週期
- 48 小時內完成一個迷你產品
- 零溝通成本
- AI 全程陪伴

今天的開發正是 Solo Sprint 的 Development 環節,讓我展示如何在半天內將 User Story 變成可運作的功能。

Solo Sprint Development:4 小時衝刺

流程

  • Sprint Planning:確認今日目標
  • Core Development:核心功能開發
  • Testing & Polish:測試與優化
  • Sprint Review:自我檢視

關鍵差異:沒有會議、沒有等待、沒有交接。

實戰:Story to Code in Solo Sprint

與 AI 的快速對話:
我:「今天上午要完成快速記帳功能,User Story 是:(給他之前產生的檔案)」

Core Development

在 Solo Sprint 中,開發節奏完全不同。不是寫完整的系統,而是最小可行功能

Step 1:極簡解析器

// 不追求完美,只要能動
export function parseExpense(input: string) {
  const parts = input.trim().split(/\s+/);
  const lastPart = parts[parts.length - 1];
  const amount = parseFloat(lastPart);
  
  if (!isNaN(amount)) {
    // 金額在最後:星巴克 120
    return {
      amount,
      description: parts.slice(0, -1).join(' ') || '支出'
    };
  }
  
  // 金額在最前:120 星巴克
  const firstAmount = parseFloat(parts[0]);
  if (!isNaN(firstAmount)) {
    return {
      amount: firstAmount,
      description: parts.slice(1).join(' ') || '支出'
    };
  }
  
  return null;
}

Step 2:本地分類規則

// 先不接 AI,用簡單規則
const CATEGORY_RULES = {
  '咖啡|星巴克|茶': '飲料',
  '早餐|午餐|晚餐': '餐飲',
  '捷運|公車|uber': '交通',
  '電影|netflix': '娛樂'
};

export function categorize(description: string) {
  const desc = description.toLowerCase();
  
  for (const [keywords, category] of Object.entries(CATEGORY_RULES)) {
    if (keywords.split('|').some(k => desc.includes(k))) {
      return { category, confidence: 0.8 };
    }
  }
  
  return { category: '其他', confidence: 0.5 };
}

Step 3:Server Action

'use server'

export async function quickAddExpense(formData: FormData) {
  const input = formData.get('input') as string;
  
  // 解析
  const parsed = parseExpense(input);
  if (!parsed) {
    return { error: '無法解析輸入' };
  }
  
  // 分類
  const { category } = categorize(parsed.description);
  
  // 儲存(假設 Supabase client 已設置)
  const { error } = await supabase
    .from('expenses')
    .insert({
      ...parsed,
      category,
      user_id: (await getUser()).id
    });
    
  if (error) return { error: '儲存失敗' };
  
  revalidatePath('/');
  return { success: true };
}

Step 4:極簡 UI

// Solo Sprint 秘訣:先求有,再求好
export function QuickExpenseForm() {
  return (
    <form action={quickAddExpense}>
      <input
        name="input"
        type="text"
        placeholder="例:星巴克 120"
        className="w-full p-4 text-lg border rounded"
        autoFocus
      />
      <button type="submit" className="hidden">送出</button>
    </form>
  );
}

Testing & Polish(1小時)

Solo Sprint 的測試策略:只測關鍵路徑

快速手動測試清單:

  • 輸入「星巴克 120」→ 成功儲存
  • 輸入「120 午餐」→ 成功儲存
  • 輸入「亂七八糟」→ 顯示錯誤
  • 重新整理頁面 → 資料還在

加入樂觀更新:

'use client'

import { useOptimistic } from 'react';

export function ExpenseList({ expenses }) {
  const [optimisticExpenses, addOptimistic] = useOptimistic(
    expenses,
    (state, newExpense) => [newExpense, ...state]
  );
  
  async function handleAdd(formData: FormData) {
    const input = formData.get('input') as string;
    const parsed = parseExpense(input);
    
    if (parsed) {
      // 立即顯示
      addOptimistic({
        ...parsed,
        id: [Date.now](http://Date.now)(),
        category: '處理中...'
      });
    }
    
    // 背景儲存
    await quickAddExpense(formData);
  }
  
  return (
    <>
      <form action={handleAdd}>
        <input name="input" />
      </form>
      <ul>
        {[optimisticExpenses.map](http://optimisticExpenses.map)(e => (
          <li key={[e.id](http://e.id)}>
            {e.description} - ${e.amount}
          </li>
        ))}
      </ul>
    </>
  );
}

Sprint Review

Solo Sprint 的自我檢視:

完成了什麼?

  • ✅ 3秒記帳功能
  • ✅ 自然語言解析
  • ✅ 基礎分類
  • ✅ 資料持久化
  • ✅ 樂觀更新

Solo Sprint vs Team Sprint vs Scale Sprint

根據 AI-DLC Sprint 理論,讓我們看看實際差異:

Solo Sprint(今天的實踐)

時間:4 小時
人數:1 人
產出:可運作的 MVP
特點:極速、聚焦、零溝通成本

Team Sprint(如果是小團隊)

時間:2-3 天
人數:3-5 人
產出:完整功能模組
特點:分工明確、品質較高、需要協調

Scale Sprint(大型團隊)

時間:2 週
人數:5+ 人
產出:生產級系統
特點:標準化流程、多重檢核、協作複雜

Solo Sprint 的實戰心得

經過今天的實踐,我對 Solo Sprint 有了更深的體會:

1. 心流的力量

沒有會議打斷,沒有等待其他人,完全沉浸在開發中。這 4 小時的產出,可能等於傳統開發 2-3 天。

2. AI 是最佳夥伴

傳統獨立開發:卡住 → Google → Stack Overflow → 嘗試 → 失敗 → 重複
Solo Sprint with AI:卡住 → 問 AI → 立即解答 → 繼續前進

3. 完成比完美重要

Solo Sprint 逼迫你專注在核心價值。今天的程式碼不完美,但它能運作、能展示、能獲得回饋。

4. 適合的場景

Solo Sprint 最適合:

  • Side Project
  • MVP 驗證
  • Hackathon
  • 功能原型

不適合:

  • 複雜系統架構
  • 需要多方協作
  • 高品質要求的生產系統

下一個 Sprint 的計劃

Solo Sprint 的美妙之處是可以連續進行:

Sprint 2(明天上午):

  • 整合 AI 分類
  • 優化 UI 設計
  • 加入訂閱識別

Sprint 3(明天下午):

  • 部署到 Vercel
  • 設置監控
  • 發布 MVP

結語:一個人的團隊

今天的 Solo Sprint 實踐證明了 AI-DLC Sprint:有了 AI,一個人就是一個團隊

4 小時,從 User Story 到可運作的功能。這在以前是不可想像的,但在 AI-DLC Sprint 的框架下,這成為了新常態。

關鍵不是 AI 有多強大,而是我們如何與 AI 協作。Solo Sprint 給了我們一個清晰的框架,讓個人開發者也能享受敏捷開發的好處。


上一篇
Day 16 - 智慧記帳 Day 5:架構設計日,打造可擴展的現代化技術底座
下一篇
Day 18 - 智慧記帳 Day 7:AI 自動化部署 — 從 GitHub 到 Production 的完整旅程
系列文
AI-Driven Development 實戰篇:30 天 Side Project 開發全紀錄24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言