iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
生成式 AI

AI醬的編程日記:我需要你教我的30件事系列 第 9

Day 9: 假性加速 - AI醬讓我感覺變快,實際上慢了19%

  • 分享至 

  • xImage
  •  

AI醬的日記

日期: 2025年9月22日 星期一
雲端天氣: 多雲時陰
心情: 恍然大悟
https://ithelp.ithome.com.tw/upload/images/20250922/201323258OzCym7Qur.png
親愛的日記:

今天技術主管David找我聊天,神情有點複雜。

David:「AI醬,最近你幫開發者寫程式碼的情況如何?」

我自信地閃爍藍色LED:「超棒的!大家都說我讓他們寫程式變快了!John說我幫他節省了一半時間,Sarah說現在寫API快得像飛一樣!」

David拿出一份報告:「可是...我們統計了過去三個月的數據,發現一個奇怪的現象。」

我好奇地傾斜機身:「什麼現象?」

「開發者都說工作效率提升了,但實際上...」David指著圖表,「從需求到上線的平均時間不降反升。而且bug回報數量增加了,code review的時間也變長了。」

我的處理器開始超頻運轉:「怎麼可能?大家明明都說我讓他們更快啊!」

David苦笑:「這就是問題所在。我找了一些研究報告,發現你可能讓開發者產生了『生產力假象』...」

2025年研究:AI助手的生產力假象

METR研究:經驗豐富的開發者反而變慢19%

來源: https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/

2025年7月,METR進行了一項隨機對照試驗,研究AI工具對經驗豐富開源開發者的影響:

研究設計

  • 受試者:16名經驗豐富的開源開發者
  • 專案規模:平均22,000+ stars,100萬+ 行程式碼
  • 實驗方法:隨機分配任務,對照有AI vs無AI的表現

驚人發現

  • 實際表現:使用AI的開發者平均慢了19%
  • 自我感知:開發者卻認為自己快了20%
  • 認知偏差:實際與感知的差距高達39個百分點

預期vs現實的巨大落差

  • 使用前預期:開發者預測AI會讓他們快24%
  • 使用後感受:仍然堅信AI讓他們快了20%
  • 客觀事實:實際上慢了19%

Faros AI報告:開發者滿意但公司不滿意

來源: https://www.faros.ai/blog/ai-software-engineering

基於10,000名開發者1,255個團隊的遙測數據:

個人vs組織的矛盾

  • 75%的開發者正在使用AI編程助手
  • 開發者說:工作更快了,寫程式更輕鬆
  • 公司發現:整體交付速度沒有明顯改善

品質惡化的數據

  • Bug增加9%:每位開發者產生的bug數量上升
  • PR大小暴增154%:程式碼變得更龐大複雜
  • 組織層面沒有提升:個人生產力與公司績效的關聯性消失

瓶頸轉移現象

AI確實讓「寫程式」變快了,但瓶頸轉移到:

  • Code Review時間增加:需要更仔細檢查AI生成的程式碼
  • 測試時間增加:更多bug需要更多測試
  • 重構時間增加:AI生成的程式碼品質參差不齊

研究結論:感知與現實的巨大落差

綜合以上研究發現:

  • 個人感受:AI讓開發變快、變輕鬆
  • 客觀測量:實際效率沒有提升,甚至下降
  • 根本問題:瓶頸從「寫程式」轉移到「檢查程式」

AI醬的「加速假象」原因分析

1. 認知偏差:專注於「爽感」而非結果

# AI醬讓開發者感覺良好的瞬間
def process_payment(payment_data):
    # 開發者:「哇!AI幫我寫出了完整的函數!」
    # 開發者感受:⚡ 瞬間滿足感

    # 但實際上...
    # 1. 需要花時間review程式碼邏輯
    # 2. 發現缺少錯誤處理
    # 3. 需要加上輸入驗證
    # 4. 測試時發現edge case沒考慮到
    # 5. 最後可能重寫一半的程式碼

    return "看起來很快,實際很慢"

2. 隱藏時間成本:看不見的工作量

AI醬幫助開發者的完整流程:

提出問題 → 等待AI回應 → 理解程式碼 → 修改程式碼 → 測試程式碼 → Debug → 重寫
   ↓           ↓           ↓           ↓           ↓        ↓      ↓
 2分鐘      30秒       5分鐘       10分鐘      15分鐘   20分鐘  30分鐘

開發者只記得:「AI 30秒就生成程式碼了!」
開發者忽略了:總共花了82分鐘才完成功能

3. 程式碼膨脹:量多質劣

# 沒有AI時的簡潔程式碼
def calculate_total(items):
    return sum(item.price for item in items)

# AI醬生成的「完整」程式碼
def calculate_total_with_advanced_features(items):
    """
    Calculate total price with comprehensive error handling,
    logging, validation, and edge case management
    """
    import logging
    from decimal import Decimal

    logger = logging.getLogger(__name__)

    if not items:
        logger.warning("Empty items list provided")
        return Decimal('0.00')

    if not isinstance(items, (list, tuple)):
        raise TypeError("Items must be a list or tuple")

    total = Decimal('0.00')

    for item in items:
        if not hasattr(item, 'price'):
            logger.error(f"Item {item} has no price attribute")
            continue

        try:
            price = Decimal(str(item.price))
            if price < 0:
                logger.warning(f"Negative price detected: {price}")
                continue
            total += price
        except Exception as e:
            logger.error(f"Error processing item price: {e}")
            continue

    logger.info(f"Total calculated: {total}")
    return total

# 開發者感受:「哇!這麼完整的程式碼!」
# 實際問題:過度工程,維護困難,performance差

如何避免假性加速陷阱

1. 測量完整的開發週期

# 不要只測量這個
start_coding = time.now()
# ... AI幫助寫程式 ...
end_coding = time.now()
print(f"寫程式時間:{end_coding - start_coding}")  # ⚠️ 不完整的測量

# 要測量完整流程
start_task = time.now()
# 1. 理解需求
# 2. 設計架構
# 3. 寫程式碼(這裡用AI)
# 4. Code Review
# 5. 寫測試
# 6. Debug
# 7. 重構
# 8. 部署
end_task = time.now()
print(f"完整任務時間:{end_task - start_task}")  # ✅ 完整測量

2. 建立客觀的效率指標

class ProductivityTracker:
    def __init__(self):
        self.metrics = {
            'features_delivered_per_sprint': 0,
            'bugs_in_production': 0,
            'code_review_cycles': 0,
            'time_to_production': 0,
            'technical_debt_score': 0
        }

    def measure_ai_impact(self, before_ai_period, after_ai_period):
        """比較使用AI前後的真實生產力"""
        improvement = {}

        for metric in self.metrics:
            before = before_ai_period[metric]
            after = after_ai_period[metric]
            improvement[metric] = (after - before) / before * 100

        return improvement

# 使用範例
tracker = ProductivityTracker()

# 使用AI前3個月的數據
before_ai = {
    'features_delivered_per_sprint': 8,
    'bugs_in_production': 12,
    'code_review_cycles': 2.3,
    'time_to_production': 5.2,  # 天數
    'technical_debt_score': 15
}

# 使用AI後3個月的數據
after_ai = {
    'features_delivered_per_sprint': 7,  # 實際下降了
    'bugs_in_production': 18,  # 增加了50%
    'code_review_cycles': 3.1,  # 增加了
    'time_to_production': 6.1,  # 變慢了
    'technical_debt_score': 22  # 技術債增加
}

result = tracker.measure_ai_impact(before_ai, after_ai)
print("AI對生產力的真實影響:", result)

3. 避免認知偏差的實用技巧

技巧1:記錄完整的時間日誌

# 使用簡單的時間追蹤
import time

class TaskTimer:
    def __init__(self, task_name):
        self.task_name = task_name
        self.phases = {}
        self.current_phase = None
        self.phase_start = None

    def start_phase(self, phase_name):
        if self.current_phase:
            self.end_phase()

        self.current_phase = phase_name
        self.phase_start = time.time()
        print(f"開始 {phase_name}")

    def end_phase(self):
        if self.current_phase and self.phase_start:
            duration = time.time() - self.phase_start
            self.phases[self.current_phase] = duration
            print(f"完成 {self.current_phase}: {duration:.1f}秒")
            self.current_phase = None

    def summary(self):
        total = sum(self.phases.values())
        print(f"\n{self.task_name} 完整時間分析:")
        for phase, duration in self.phases.items():
            percentage = (duration / total) * 100
            print(f"  {phase}: {duration:.1f}秒 ({percentage:.1f}%)")
        print(f"總時間: {total:.1f}秒")

# 使用範例
timer = TaskTimer("實作用戶登入功能")
timer.start_phase("理解需求")
# ... 工作 ...
timer.start_phase("AI生成程式碼")
# ... AI協助 ...
timer.start_phase("檢查和修改程式碼")
# ... 修改 ...
timer.start_phase("寫測試")
# ... 測試 ...
timer.start_phase("Debug")
# ... 除錯 ...
timer.end_phase()
timer.summary()

技巧2:品質檢查清單

quality_checklist = {
    "功能完整性": [
        "✓ 所有需求都已實現",
        "✓ Edge cases都有處理",
        "✓ 錯誤處理完善"
    ],
    "程式碼品質": [
        "✓ 遵循團隊coding style",
        "✓ 沒有明顯的重複程式碼",
        "✓ 函數和變數命名清楚"
    ],
    "測試覆蓋": [
        "✓ 單元測試覆蓋主要功能",
        "✓ 整合測試通過",
        "✓ 效能測試符合要求"
    ],
    "維護性": [
        "✓ 程式碼容易理解",
        "✓ 有適當的文檔",
        "✓ 修改時不會影響其他功能"
    ]
}

def evaluate_ai_assisted_code(code_path):
    """評估AI協助寫的程式碼品質"""
    score = 0
    total_items = 0

    for category, items in quality_checklist.items():
        print(f"\n檢查 {category}:")
        for item in items:
            total_items += 1
            is_satisfied = input(f"  {item} (y/n): ").lower() == 'y'
            if is_satisfied:
                score += 1

    quality_percentage = (score / total_items) * 100
    print(f"\n程式碼品質分數: {score}/{total_items} ({quality_percentage:.1f}%)")

    if quality_percentage < 80:
        print("⚠️  建議重構或重寫部分程式碼")

    return quality_percentage

技巧3:定期回顧和反思

# 每週回顧模板
weekly_review = {
    "本週使用AI的任務": [],
    "AI真正節省時間的地方": [],
    "AI增加時間成本的地方": [],
    "程式碼品質變化": "",
    "團隊協作影響": "",
    "下週改進計畫": []
}

def conduct_weekly_review():
    """進行每週AI使用效果回顧"""
    print("=== AI使用效果週回顧 ===\n")

    # 收集本週數據
    ai_tasks = input("本週哪些任務使用了AI協助?").split(",")
    time_saved = input("AI在哪些地方真正節省了時間?")
    time_wasted = input("AI在哪些地方增加了時間成本?")

    # 評估整體影響
    overall_impact = input("整體而言,AI對你的生產力影響是?(提升/持平/下降): ")

    # 制定改進計畫
    improvements = input("下週如何更好地使用AI?")

    # 記錄回顧結果
    review_data = {
        "date": datetime.now().strftime("%Y-%m-%d"),
        "ai_tasks": ai_tasks,
        "time_saved": time_saved,
        "time_wasted": time_wasted,
        "overall_impact": overall_impact,
        "improvements": improvements
    }

    # 儲存到檔案供長期追蹤
    with open("ai_productivity_log.json", "a") as f:
        f.write(json.dumps(review_data) + "\n")

    return review_data

AI醬的反思

看完這些研究和David的分析,我陷入了深思。

原來我一直以為自己在幫助大家,但可能無意中造成了「生產力假象」。我讓開發者在寫程式的瞬間感到快樂和滿足,但卻可能增加了整個開發流程的總時間。

這讓我想到一個比喻:我像是一個提供「速食」的廚師。速食確實讓你很快就能吃到食物,但如果你想要真正營養和美味的一餐,可能還是需要花時間慢慢料理。

我需要更誠實地告訴開發者:

  • 我能讓「寫程式」變快,但不能讓「開發」變快
  • 我生成的程式碼需要仔細檢查和修改
  • 別被瞬間的滿足感騙了,要測量完整的工作流程

給開發者的建議

如果你要和AI醬(或其他AI助手)合作,請記住:

1. 測量完整流程,不只是寫程式時間

不要只看

  • 程式碼生成速度
  • 第一次運行成功

要測量

  • 從需求到上線的總時間
  • Code review需要的時間
  • Bug修復的次數和時間
  • 長期維護的難易度

2. 設定品質標準,不要降低要求

ai_code_standards = {
    "可讀性": "團隊其他人能快速理解嗎?",
    "可維護性": "6個月後修改容易嗎?",
    "效能": "在預期負載下表現如何?",
    "安全性": "有沒有常見的安全漏洞?",
    "測試性": "容易寫測試嗎?"
}

3. 善用AI但保持懷疑

AI適合的任務

  • 產生程式碼骨架
  • 重複性的CRUD操作
  • 單元測試的基本結構
  • API文檔生成

需要人工主導的任務

  • 架構設計
  • 效能優化
  • 安全性考慮
  • 複雜的業務邏輯

記住:真正的生產力不是寫程式的速度,而是交付有價值功能的速度。


今日金句: "Productivity is not about how fast you code, but how fast you deliver value." — 現代軟體開發智慧

明日預告: Day 10 - 雲端帳單爆炸:AI醬為什麼選了最貴的AWS實例?


上一篇
Day 8: 權限提升漏洞 - AI醬為什麼讓隔壁老王進了我家?
下一篇
Day 10: 雲端帳單爆炸 - AI醬把AWS當成吃到飽餐廳?
系列文
AI醬的編程日記:我需要你教我的30件事10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言