AI 時代的前端:哪些技能會被塗灰,哪三個不會

文字解析 · 1 支影片 · 產生於 2026-10-01 00:54

🎧 語音解析📝 筆記✍️ 練習

🎧 語音解析 22m28s · TTS 講解與作者原聲交錯;點章節可跳。
邊聽邊看逐句講稿,點任一句從那裡開始
章節(13)

1. Outline

  1. 起點 · 3 Frontend Skills AI Can't Replace (become AI-proof)
    從一張技能白板出發,把 AI 已經做得夠好的格子塗灰,剩下的三塊——system design、code quality、state & data——用架構圖、程式碼截圖與靜態分析報告逐一證明為什麼 AI 目前接不住。

2. YouTuber 的思維推導

3 Frontend Skills AI Can't Replace (become AI-proof)

theSeniorDev · 15m15s · 字幕 en · vision=on (整支影片是對著一塊技能白板與程式碼截圖講解:架構對比圖、被塗灰的技能、28px 寫死的 CSS、靜態分析報告、畢卡索公牛,講者多次說「looks like this」「here she used 28px」「as you can see」,不看畫面接不上。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 5s
segment 1m00s –
shot 43s 8s
analyze 6m15s –
render 5s –

作者的推導從一個分類問題出發:與其問「AI 會不會取代前端」,不如問「哪一種前端工作的成功條件是可以被寫清楚的」。他在白板上畫出一張《The AI-Proof Frontend Engineer》技能圖,然後當著鏡頭把其中幾塊塗成灰色——design into code、web performance、automated testing——因為它們都有明確目標與可量測的成功標準(設計稿長這樣、Core Web Vitals 要達標、覆蓋率要多少),而 LLM 在這種任務上已經夠好。剩下沒被塗灰的是 system design、code quality、state & data,理由一致:它們的判準是「跨功能、跨時間的取捨」,而 LLM 的訓練與使用方式都讓它為當下這一個 prompt 做極大化。

他用兩組畫面把這個抽象論點釘住:一組是纏繞成一團的實體圖 vs.有 Auth Client、Theme Service、Routing 等清楚邊界的架構圖;另一組是把架構畫成散點圖上的迴歸線——好架構不是通過某一個點的線,而是穿過所有功能的那條最適線。接著他把同一個機制往下推到程式碼層次:因為模型只為眼前目標最佳化,所以會寫死 28px、會把元件內嵌在 render 裡,於是重複與死程式碼累積成靜態分析報告上的 8.9% 重複與 153 個未使用檔案。

最後他把出口指回人:能同時在高層談架構、又能鑽進瀏覽器與狀態細節的人,AI 只會放大他的產出——這也正是資深面試在問的東西。

推理鏈:每段留給下一段的線索

每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。

  1. 怕被 AI 取代?先看這三個技能 → 留下的問題是:既然 AI 已經能產出可運作的前端,那它產出的東西到底缺了什麼,才輪得到 system design 上場?
  2. AI 給你漂亮介面,不給你邊界 → 邊界只是靜態的一張圖;下一段要問的是:當你不斷加新功能,這張圖會怎麼被 AI 一次次改壞?
  3. 每加一個功能就重塑一次架構 → 如果架構層的判斷仍屬於人,那另一端呢——把設計稿變成程式碼的那些日常工作,是不是已經整塊被交出去了?
  4. design into code:受衝擊最大的那一塊 → 既然「目標明確就會被塗灰」是判準,那網站效能這種公認的硬功夫,是不是也符合這個判準?
  5. 網站效能:被塗灰的技能 → 如果效能因為判準明確而被塗灰,那同樣有明確判準的自動化測試,理當也會被塗灰——但測試品質真的能交出去嗎?
  6. 自動化測試:規格給對,AI 就交得出來 → 到目前為止被塗灰的都是判準清楚的工作;接下來要看的是判準最模糊、也最沒被塗灰的那一塊——程式碼品質。
  7. code quality 之一:寫死的 CSS 值 → 同一段程式碼裡還有第二個氣味沒講——那個被圈起來的 const text,為什麼不該長在函式裡面?
  8. code quality 之二:內嵌元件與重複 → 既然出路是「人來設計模組、AI 來填內容」,那這個人到底需要具備什麼樣的能力組合?
  9. 兩端都要:高層架構 + 鑽到細節 → 話說回來,如果放著不管、兩端都不做,代價具體會長成什麼樣子?
  10. 放著不管的代價:8.9% 重複、153 個死檔案 → 既然無人看管會出事,那有沒有哪一塊是判準夠清楚、交給 agent 反而比人做得更整齊的?
  11. 無障礙:定義清楚,所以大多能自動化 → 無障礙可以交給規則,但有一件事沒有規則可循:介面背後那份資料到底該怎麼設計?
  12. state 與資料:收斂成 essential state → 三個技能都講完了;剩下最後一個問題——面對這麼多東西,一個人該從哪裡開始?
  13. 從哪裡開始:看你的產品環境

3. 逐段說明

3 Frontend Skills AI Can't Replace (become AI-proof)

1. 怕被 AI 取代?先看這三個技能 0:00–0:26

主持人開場:如果你是害怕 AI 的前端工程師,有三個關鍵技能可以讓你免疫。Bogdan 直接點名第一個——system design,而且是前端的 system design,不必碰資料庫分片或負載平衡。

承上 承接前情提要裡「AI coding agent 已經能一個 prompt 產出可運作介面」這個現況:讀者已經看過 AI 生出漂亮畫面,問題是接下來自己還剩什麼。

推理因為讀者的焦慮是「整個職能會不會消失」,所以作者先把問題縮小成「哪三個技能值得投資」,並立刻點名第一個是 frontend system design,同時劃掉範圍——不必碰 database sharding 或 load balancer。

AI 補充開場就把後端 system design 排除,是這支影片的第一個關鍵決定。一般講 system design 指的是資料庫分片、快取、負載平衡;前端的 system design 問的是另一組問題:模組怎麼切、狀態放哪裡、哪些東西該被封裝成服務、元件之間用什麼介面溝通。這個區分讓後面所有論證都站在同一個層次上——他要比較的不是「AI 會不會寫 SQL」,而是「AI 會不會替你決定邊界」。

frontend system design

前端系統設計

在前端範圍內決定模組邊界、服務職責、狀態放置與元件間介面的設計工作。

和後端 system design 共用「拆解與取捨」的方法,但關心的對象不同:後端關心資料一致性、吞吐量與容錯,前端關心的是使用者互動的狀態怎麼流動、哪些功能該被封裝成可重用的服務、跨團隊的模組怎麼不互相踩線。作者強調前端工程師不需要為了學 system design 去啃 sharding,這也是很多人誤以為自己不需要 system design 的原因——他們以為那是後端的題目。

相關術語: database sharding (被排除在外)

出處:第 1 段「怕被 AI 取代?先看這三個技能」

database sharding

資料庫分片

把一張大表或一個資料庫水平切成多份、分散到不同節點的擴展手法。

這裡出現只是作為對照:它是後端 system design 的典型題目。作者用它來界定「前端 system design」的邊界,避免讀者把兩者混為一談而覺得門檻太高。

出處:第 1 段「怕被 AI 取代?先看這三個技能」

留給下一段 留下的問題是:既然 AI 已經能產出可運作的前端,那它產出的東西到底缺了什麼,才輪得到 system design 上場?

2. AI 給你漂亮介面,不給你邊界 0:26–1:36

現在的模型被大量優化在「prompt 進、介面出」,所以畫面很漂亮,但底下是一堆定義不清、互相纏繞的實體。能跑、沒錯誤,卻極貴又難維護。好的前端長得不一樣:清楚的邊界、各司其職的服務、隱藏實作細節、對介面而不是對實作寫程式;邊界清楚時,用 AI agent 擴充同樣的功能會花掉明顯更少的 token。

白板上 AI 產出的架構圖:實體互相纏繞、沒有明確邊界,是整支影片的反例基準
0:45 · 白板上 AI 產出的架構圖:實體互相纏繞、沒有明確邊界,是整支影片的反例基準
對照組:有清楚邊界、各自負責的服務所組成的架構圖
1:02 · 對照組:有清楚邊界、各自負責的服務所組成的架構圖
承上 上一段留下的問題是「AI 產出的前端缺了什麼」。這一段直接把那個缺口畫出來:缺的是邊界。

推理因為要說明缺口,所以作者拿出兩張對照圖:一張是 AI 產出的樣子——一堆沒有定義清楚的實體互相箭頭連來連去;另一張是好的前端——Auth Client、Theme Service、Sign Up、Routing 各自是一個有介面接點的方塊。他接著補上一個很少人講的理由:邊界清楚不只是為了人好維護,也是為了讓 AI 便宜。

AI 補充畫面上那三行字是這段的濃縮:Clear Boundaries、Programming to Interfaces、Context Engineering & Token Efficiency。前兩項是傳統軟體工程的老話,第三項才是 AI 時代新增的:當每個模組對外只暴露介面,agent 要改一個功能時,需要被讀進 context 的程式碼就少,token 花得少、幻覺也少;反過來,纏成一團的 codebase 會逼 agent 讀進整片檔案才敢動手。也就是說,架構品質從「可維護性」這個長期指標,變成了一個每天都會被結帳的短期成本。順帶一提,字幕把模型名稱轉錄成「Oppo models」,從上下文與後面畫面上的模型標註看,指的是當時最新的旗艦模型,不是某個叫 Oppo 的產品。

clear boundaries

清楚的邊界

每個模組有明確的職責範圍,內部實作不外流、外部只能透過約定的介面互動。

邊界是所有架構討論的地基:沒有邊界就沒有「哪裡該改」這個問題的答案。畫面上的好架構圖裡,每個方塊邊上都畫了一個小接點,代表對外只開這個口。判斷邊界是否存在的實用問題是:我能不能在不讀其他模組原始碼的情況下,正確地使用它?

相關術語: programming to interfaces (由它實現)、token efficiency (帶來)

出處:第 2 段「AI 給你漂亮介面,不給你邊界」

programming to interfaces

對介面寫程式

呼叫方只依賴對方公開的介面約定,不依賴它內部怎麼實作。

老原則「Program to an interface, not an implementation」的前端版。實務上表現為:元件之間傳的是定義好的 props 與事件,而不是互相伸手拿對方的內部狀態;服務對外給的是函式簽章,換掉底下的 fetch 或 SDK 不影響呼叫方。它讓模組可以被替換,也讓 AI agent 改一邊時不會被迫理解另一邊。

出處:第 2 段「AI 給你漂亮介面,不給你邊界」

token efficiency

token 效率

完成同一項修改所需要餵給模型的 token 量;越少代表越便宜、也越不容易出錯。

這是作者把架構品質和 AI 成本連起來的關鍵詞。同一個需求,在邊界清楚的專案裡 agent 只要讀一個模組,在纏繞的專案裡可能要讀十幾個檔案。除了錢,還有品質問題:塞進 context 的東西越多,模型越容易抓錯重點。

相關術語: context window (受限於)

出處:第 2 段「AI 給你漂亮介面,不給你邊界」

見仁見智 0:27
「most of these models, including the latest Oppo models, have been heavily optimized for the "prompt- to-interface" principle」
「模型被刻意優化成 prompt 直接產介面」是對訓練目標的推測,各家實驗室並未公開這樣的目標函式。他觀察到的現象(agent 傾向產出視覺完成度高、結構鬆散的程式碼)確實常見,但成因更可能是評測與使用者偏好回饋偏向可見成果,而不是有一條叫 prompt-to-interface 的最佳化原則。
依據: 各主要模型的訓練目標未公開;此處為作者的推論而非引用文件
留給下一段 邊界只是靜態的一張圖;下一段要問的是:當你不斷加新功能,這張圖會怎麼被 AI 一次次改壞?

3. 每加一個功能就重塑一次架構 1:36–2:43

用 LLM 寫程式的第二個問題:每實作一個新功能,它就為那個功能重新調整架構,因為模型被設計成「一個 prompt 展示最大成果」,代價是推翻你之前做的一切。好架構從不為單一功能量身訂做,而是所有功能折衷後的那條中線——更穩定、更好擴充、也更好解釋。因此和 AI 一起寫程式時,你要能避開 code smell,並替除錯與測試設定對的基準。

白板上「各功能的線」與中間那條折衷線,說明什麼叫穩定架構
2:20 · 白板上「各功能的線」與中間那條折衷線,說明什麼叫穩定架構
承上 上一段留下「加新功能時這張架構圖會怎麼被改壞」的問題。這一段給出機制:模型會為當下這一個功能重寫架構。

推理因為模型被設計成用一個 prompt 展示最大成果,所以它每次都會把周圍改成最適合這個功能的樣子,代價是推翻你之前的決定。作者於是把架構畫成一張散點圖:橫軸是各種功能,縱軸是結果,好架構是穿過所有點的那條迴歸線,而不是精準通過某一個點的線。

AI 補充這張迴歸線的圖是整支影片最好用的心智模型。單一功能的最佳解,對整個系統來說通常是過擬合;穩定的架構是所有功能的折衷,對每個功能都不是最好,但對全部都夠好。這也解釋了為什麼 AI 產出的程式碼「當下看起來很合理」——它確實對那一個點做了最佳化。要對抗它,你需要的不是更會寫 prompt,而是能認出 code smell、並且事先替除錯與測試設好基準:這些基準就是你替那條線釘下的錨點。

code smell

程式碼異味

程式碼裡不一定是錯、但通常預示著設計問題的徵兆。

命名來自 Kent Beck 與 Martin Fowler:它不是編譯錯誤,也不會讓測試變紅,而是「看起來不太對」的訊號,例如重複、過長的函式、寫死的數值、內嵌宣告。在 AI 產出的程式碼裡它特別重要,因為程式能跑、畫面也對,唯一的預警就是這些氣味。作者後面會拿兩個具體例子來示範。

相關術語: technical debt (累積成)

出處:第 3 段「每加一個功能就重塑一次架構」

overfitting

過擬合

把模型(或架構)調成完全貼合手上這批樣本,反而對新的情況失去預測力。

作者沒有講出這個詞,但白板上的散點圖與迴歸線正是它:為單一功能量身訂做的架構,就是對那一個資料點過擬合。借用這個詞的好處是它給出一個可操作的問句——我這次的改動,是讓線更貼合所有點,還是只讓一個點落在線上?

相關術語: code smell (表現為)

出處:第 3 段「每加一個功能就重塑一次架構」

留給下一段 如果架構層的判斷仍屬於人,那另一端呢——把設計稿變成程式碼的那些日常工作,是不是已經整塊被交出去了?

4. design into code:受衝擊最大的那一塊 2:43–4:05

第二個技能是「把設計稿變成程式碼」——它受 AI 衝擊最深,現在多半只剩檢查 AI 的輸出。這件事以前佔前端工作的八成,如今幾乎消失,所以很多人以為前端沒了;但前端不是消失,是劇烈改變。主持人補充:以前團隊裡專門把版型貼成按鈕、改樣式的那種工作,本來就沒有累積性,現在五個人的活一個人配 AI 加 design system 就做完了。

承上 上一段結束在「架構判斷仍屬於人」,這一段轉向另一端:哪一塊已經整塊被交出去。

推理因為要盤點技能,作者把 design into code 拿出來當第一個被塗灰的格子:它的成功條件最明確——長得跟設計稿一樣就對了——所以 AI 做得好,人只剩檢查。他接著把結論拉回職涯:消失的是工作內容,不是職位。

AI 補充白板上的做法值得注意:他不是把格子刪掉,而是塗成灰色。灰色的意思是「仍然需要有人懂,但不再是你的差異化」。主持人補的那句「五個人的活變成一個人加 AI 加 design system」點出真正的變化是槓桿而不是消失——同一個人要能同時決定 design system 的規則、驅動 agent、再驗收產出。反過來說,如果一個人的履歷只由『照版型貼元件』組成,他和模型比的正好是模型最強的那一項。

design into code

設計稿轉程式碼

把 UX/UI 設計師的視覺產出實作成 HTML 與可運作元件的工作。

過去前端職缺的主要內容之一,成功標準非常清楚:與設計稿一致、在各斷點下不跑版。正因為判準清楚且可以用截圖直接對照,它成為 AI 最先吃下的一塊。留下來的部分是需要決策的那些:設計稿沒畫到的狀態、極端內容長度、互動細節與可及性。

相關術語: design system (產出被規範於)

出處:第 4 段「design into code:受衝擊最大的那一塊」

design system

設計系統

一整套被規範好的視覺與互動元件、樣式代號與使用規則。

它是「一個人放大成五個人」的前提:有了 design system,agent 產出的東西才有可以對齊的標準,也才有辦法在 review 時說出「這裡不該用寫死的數值,該用既有的 token」。沒有它,AI 每次都會自己發明一套。

相關術語: atomic CSS class (實作為)

出處:第 4 段「design into code:受衝擊最大的那一塊」

見仁見智 3:10
「which used to account for 80% of our frontend work, it's almost disappeared」
八成這個比例是作者的個人估計,沒有資料來源,而且高度取決於團隊型態:以產品互動、狀態管理或資料視覺化為主的團隊,切版本來就佔不到這麼高。說它「幾乎消失」也偏強——複雜互動、動畫、極端內容與可及性細節仍需要人手調整。
依據: 影片中未提供任何調查或統計來源
留給下一段 既然「目標明確就會被塗灰」是判準,那網站效能這種公認的硬功夫,是不是也符合這個判準?

5. 網站效能:被塗灰的技能 4:05–5:39

很多人說「做快的網站 AI 辦不到」,但只要目標明確——例如打到 Core Web Vitals——最新的模型做得相當好,甚至會提出架構層的建議,所以效能在白板上被塗成灰色。你仍然要懂瀏覽器與關鍵渲染路徑,但那不再是競爭優勢;它的價值是併進 system design:讓你判斷這是設計問題還是最佳化問題。因為效能工作是 5% 診斷、90% 實作,而那 90% 正好是 AI 擅長的無聊活。

白板上「website performance」被塗成灰色的那一刻,是整套技能分類的視覺主軸
4:35 · 白板上「website performance」被塗成灰色的那一刻,是整套技能分類的視覺主軸
承上 上一段確立了「成功條件明確 → 會被塗灰」這條判準,這一段拿網站效能來檢驗它。

推理因為 Core Web Vitals 給了模型一個可量測的目標,所以作者說最新模型在這類任務上表現不錯,甚至會提出架構層建議,於是他當場把白板上的 Web Performance 塗成灰色。但他立刻補一個條件:你仍要懂,因為懂了才判斷得出這是設計問題還是最佳化問題。

AI 補充他給的比例是這段的重點:診斷佔 5%、實作佔 90%,而被自動化的正是那 90%。這代表效能知識的價值位置整個移動了——它從「你會不會壓縮圖片、會不會設快取」變成「你能不能在 Lighthouse 報告出來之前,就說出這個慢是架構造成的」。畫面上他把 Web Performance 從紅色改成灰色的那一刻,也順手示範了這張圖的讀法:彩色 = 你的差異化,灰色 = 你要懂但不再靠它勝出。

Core Web Vitals

核心網頁指標

Google 定義的一組使用者體驗量測指標,用來衡量載入、互動與版面穩定度。

目前的三項是 LCP(最大內容繪製)、INP(互動到下一次繪製,2024 年取代了原本的 FID)與 CLS(累積版面位移)。它們的關鍵性質是「可量測、有門檻」,所以正好落在 LLM 擅長的區間:目標清楚、回饋可自動取得、改法有既定套路。

相關術語: Lighthouse (量測工具)

出處:第 5 段「網站效能:被塗灰的技能」

Lighthouse

Lighthouse

Chrome 內建的網頁品質稽核工具,會產出效能、可及性等分項報告與建議。

作者說他會指揮 agent「跑 Lighthouse、看 Core Web Vitals、然後最佳化」,這是一個典型的自動化迴圈:工具給出可機讀的分數與建議,模型照著改,再量一次。要注意它量的是實驗室環境,真實使用者的體驗還要看現場資料。

出處:第 5 段「網站效能:被塗灰的技能」

critical rendering path

關鍵渲染路徑

瀏覽器從收到 HTML 到畫出第一個畫面所必經的解析、樣式計算與繪製步驟。

它是效能診斷的骨架知識:知道哪些資源會擋住渲染、哪些可以延後,才能判斷一個慢是資源順序問題還是元件設計問題。作者主張這類知識仍要有,只是它現在的用途是判斷方向,而不是動手優化。

出處:第 5 段「網站效能:被塗灰的技能」

留給下一段 如果效能因為判準明確而被塗灰,那同樣有明確判準的自動化測試,理當也會被塗灰——但測試品質真的能交出去嗎?

6. 自動化測試:規格給對,AI 就交得出來 5:39–7:01

測試是被自動化得最多的一塊,也被塗灰:只要你知道自己在做什麼、清楚需要的覆蓋率、懂一點測試金字塔,你會快很多,Bogdan 說他現在做的東西測試覆蓋率遠高於以前。面對「AI 寫的測試沒在測東西」的批評,他的回答是:你只需要給出測試的本質、指定要測什麼;那些無聊的苦工——造假資料、組裝元件——正好可以交出去。以前要十天的事現在是幾小時。

白板上 automated testing 同樣被塗灰,和效能並列成為「AI 可接手」那一類
5:47 · 白板上 automated testing 同樣被塗灰,和效能並列成為「AI 可接手」那一類
承上 上一段留下「判準明確的技能會被塗灰,測試呢」這個問題,這一段把 automated testing 也塗成灰色。

推理因為測試的判準同樣可以寫清楚——要測什麼、覆蓋率多少、測試金字塔怎麼分層——所以作者說只要你知道自己在做什麼,AI 會讓你快很多,他自己現在的專案覆蓋率比以前高。面對「AI 寫的測試在測空氣」的批評,他把責任放回規格:你要給出測試的本質,苦工才交出去。

AI 補充這裡有個容易被略過的轉折:他承認過去大家其實都沒怎麼寫測試——不是不會,是永遠排不進時間。所以 AI 在測試上的真正貢獻不是取代誰,而是把一件長年被砍掉的工作變得便宜到值得做。這也給了一個具體的驗收方式:與其爭論 AI 寫的測試好不好,不如檢查它有沒有測到你指定的行為,而不是測到實作細節。

testing pyramid

測試金字塔

把測試依成本與範圍分層的比例原則:大量單元測試、較少整合測試、最少端對端測試。

它給的是一個配比直覺,不是硬規則:越上層的測試越像真實使用者、但越慢越脆;越下層越快越穩、但離真實體驗越遠。在 AI 代寫測試的情境下它更重要了——模型很樂意生成一大堆低價值的單元測試,是你要決定哪一層該厚、哪一層該薄。

相關術語: test coverage (配比依據)

出處:第 6 段「自動化測試:規格給對,AI 就交得出來」

test coverage

測試覆蓋率

被測試執行到的程式碼比例,常用來衡量測試的完整程度。

它是個好用但危險的指標:覆蓋率高只代表程式碼被跑過,不代表行為被驗證過。作者說他現在的覆蓋率比以前高,這在 AI 情境下要配合一個檢查——那些測試有沒有真的斷言行為,還是只是呼叫過就算。

出處:第 6 段「自動化測試:規格給對,AI 就交得出來」

留給下一段 到目前為止被塗灰的都是判準清楚的工作;接下來要看的是判準最模糊、也最沒被塗灰的那一塊——程式碼品質。

7. code quality 之一:寫死的 CSS 值 7:01–8:20

程式碼品質是 LLM 最不擅長、除非你明講的一塊。第一個典型的 code smell 是寫死、沒有規範的 CSS 值:你丟一張截圖叫它做介面,它一開始會用你的 design system,例如 Tailwind,但為了滿足這個 prompt 就開始寫死數值,例如 28px 的字級。問題有兩個:不能自適應(該用 rem 這種相對單位),以及跟應用程式其他地方不一致——而一致性正是 text-2xl、3xl 這些原子 class 存在的理由:使用者看到一致的介面,認知負荷才低。

AI 產出的元件原始碼,接下來兩個 code smell 都指著它講
7:32 · AI 產出的元件原始碼,接下來兩個 code smell 都指著它講
寫死的 28px 字級,對照 Tailwind 應有的 text-2xl,是最具體的一張證據
7:58 · 寫死的 28px 字級,對照 Tailwind 應有的 text-2xl,是最具體的一張證據
承上 上一段結束在「判準模糊的程式碼品質還沒被塗灰」,這一段給出第一個具體證據。

推理因為要證明 LLM 在品質上的失手是有規律的,所以作者直接秀出一段自己用最新模型產出的元件程式碼,並標上「#1 Code Smell:Hardcoded Non Relative CSS values」。畫面上被紅框圈起來的正是 sm:text-[28px]——在一行本來用 text-2xl 的 Tailwind class 裡,突然插進一個寫死的像素值。

AI 補充這個例子的說服力來自它的具體:同一個 className 字串裡,前半是設計系統的語彙(text-2xl),後半是模型為了滿足這次 prompt 硬塞的數字(28px)。兩個後果他都講了——不能隨裝置縮放,以及和其他頁面不一致;但第二個後果他往下推了一層很值得記住的推論:一致性之所以重要,是因為使用者的大腦在一致的介面上耗費較少,能把注意力留給真正在變的東西。也就是說,這不是潔癖,是認知負荷的問題。順帶一提,這張截圖右下角標了它出自哪個模型,作者刻意讓你知道這不是舊模型的老毛病。

術語:hardcoded valueatomic CSS class

hardcoded value

寫死的數值

直接寫在程式碼裡的具體常數,沒有透過設計代號或變數集中管理。

在樣式裡它特別容易發生,因為模型只要「看起來對」就會塞一個數字。判斷方法很簡單:這個數字如果之後要全站一起改,你得改幾個地方?答案不是一個地方,它就是寫死的。

相關術語: atomic CSS class (相反)

出處:第 7 段「code quality 之一:寫死的 CSS 值」

rem

rem 相對單位

以根元素字級為基準的 CSS 相對長度單位。

用 rem 的好處不只是縮放:它讓使用者在瀏覽器裡調大字級時,整個版面會跟著等比放大,這是可及性的基本要求。寫死 px 會讓那個設定失效,等於替使用者做了決定。

相關術語: hardcoded value (取代它)

出處:第 7 段「code quality 之一:寫死的 CSS 值」

atomic CSS class

原子化 CSS class

一個 class 只負責一項樣式、由預先定義好的尺度組成的樣式系統,如 Tailwind 的 text-2xl。

它的價值在於把可用的數值收斂成一組有限的刻度,於是「一致」變成預設而不是靠自律。作者的例子剛好示範了它怎麼被破壞:Tailwind 允許用中括號寫任意值(text-[28px]),這個逃生口一旦被 agent 常態使用,設計系統就名存實亡。

相關術語: design system (實作)

出處:第 7 段「code quality 之一:寫死的 CSS 值」

cognitive load

認知負荷

使用者為了理解與操作介面所要花的心智資源。

把一致性連到認知負荷,是這段從程式碼跳回使用者的關鍵一步:介面元素每次都長得一樣時,大腦可以把它當成已知,只處理真正改變的部分。所以樣式不一致的成本不是難看,而是每個使用者每次都要多花一點力氣。

出處:第 7 段「code quality 之一:寫死的 CSS 值」

留給下一段 同一段程式碼裡還有第二個氣味沒講——那個被圈起來的 const text,為什麼不該長在函式裡面?

8. code quality 之二:內嵌元件與重複 8:20–9:27

第二個問題是巢狀/內嵌元件:那個 text 元件每次 render 都被重新建立,本該搬出去、必要時 memo 化或獨立成檔案再寫單元測試,AI 卻直接內嵌宣告——不能重用,於是到處都是重複的程式碼。因為 AI 面對小問題就地解決。有人問「那就叫它掃過整個 codebase 再實作啊」,但那要吃掉大量 context、超出視窗、結果更差又更貴——於是你就回到前端工程的本題:把共用功能抽成跨模組的 library,開始談模組,然後你就需要一個前端工程師。

內嵌在 render 裡的 text 元件,說明「每次 render 重建、無法重用」長什麼樣
8:50 · 內嵌在 render 裡的 text 元件,說明「每次 render 重建、無法重用」長什麼樣
承上 上一段最後指向同一張截圖裡被紅線標住的 const text,這一段解釋它為什麼是第二個 code smell。

推理因為那個 text 元件被宣告在 Spotlight 函式體內,所以每次 render 都會重新建立、而且無法被別處重用,於是重複程式碼開始增生。作者接著回應最直覺的反駁——「叫 AI 掃過整個 codebase 再實作不就好了」——用 context window 的限制擋回去:讀得越多越貴、結果越差。

AI 補充這個反駁與回應是全片最結構性的一段,值得慢讀:AI 之所以會重複造輪子,不是因為它笨,而是因為它的視野被 context 限制在你這次給它的東西裡。而擴大視野的成本是超線性的。於是問題自然被推回工程設計——把共用功能抽成模組間共享的 library,讓「該被重用的東西」在架構上就顯而易見,agent 不需要讀完全世界也能找到它。這正好繞回第二段的邊界:邊界不只是給人看的,也是給模型看的索引。要補一句作者跳過的:在 React 裡把元件定義在另一個元件內部,除了不能重用,還會讓每次 render 產生新的元件型別,導致子樹被卸載重建、內部狀態丟失——這是效能與正確性兩個層面的問題,不只是整潔問題。

術語:memoizationcode duplication

nested component

內嵌元件

把一個元件定義在另一個元件的函式體內部,隨每次 render 重新建立。

React 官方明確建議不要這樣寫:新的元件型別會讓 React 認為是不同的東西,於是卸載舊子樹、重建新子樹,內部狀態與 DOM 都被丟掉。加上無法被其他檔案匯入,它幾乎必然導致複製貼上式的重複。改法通常只是把它移到檔案外層或另一個檔案。

相關術語: memoization (常見補救)、code duplication (造成)

出處:第 8 段「code quality 之二:內嵌元件與重複」

memoization

記憶化

把運算結果快取起來,輸入沒變就直接沿用,避免重複計算或重複建立。

在 React 語境裡就是 memo、useMemo、useCallback 這一組。要注意作者只是把它列為選項之一:對內嵌元件來說,正確的第一步是搬出去,memo 化是搬出去之後才要考慮的最佳化,順序反了會變成替壞設計貼膏藥。

出處:第 8 段「code quality 之二:內嵌元件與重複」

code duplication

程式碼重複

同樣或幾乎同樣的邏輯散落在多個地方,各自維護。

它的代價不在硬碟,而在改動:一個行為要改,你得先找到全部的複本,漏掉一個就是一個 bug。AI 讓重複變得更容易發生,因為它每次都在局部解決問題,而且產生程式碼的邊際成本趨近於零。

出處:第 8 段「code quality 之二:內嵌元件與重複」

context window

上下文視窗

模型單次能一起處理的 token 上限,也是它這一次「能看到的世界」。

作者用它解釋為什麼「叫 AI 讀完整個專案」不是答案:塞越多,成本越高、越容易失焦,超過上限還會被截斷。實務上的對策不是加大視窗,而是讓需要被看到的東西更集中——這就是模組邊界與共用 library 的價值。

相關術語: token efficiency (上限)

出處:第 8 段「code quality 之二:內嵌元件與重複」

留給下一段 既然出路是「人來設計模組、AI 來填內容」,那這個人到底需要具備什麼樣的能力組合?

9. 兩端都要:高層架構 + 鑽到細節 9:27–10:20

怕被 AI 取代的話要做兩件事:談得了 system design,也能鑽到很低的層次去查清楚 codebase 是由什麼組成的。這同時是面試的解答——很多人被說「聽起來不夠資深」,就是因為只有其中一端。能同時掌握高層 system design 與瀏覽器、React 或 JavaScript 本身的細節,面試會過,工作產出會更高,也比別人更不需要擔心就業市場。重複性的前端工作會變少,但其他前端工作會變多。

承上 上一段把出路指向「人來設計模組」,這一段回答那個人需要什麼能力組合。

推理因為前面已經證明 AI 在中間層(照規格產出)最強,所以作者的結論是往兩端走:一端是 system design,另一端是鑽進 codebase、瀏覽器、框架的細節。他順手指出這正是資深面試在測的東西——很多人被評為「聽起來不夠資深」,就是因為只有其中一端。

AI 補充把技能光譜想成一條線會比較清楚:最上面是架構取捨,最下面是執行細節,中間是把規格轉成程式碼。AI 現在吃掉的是中間那段,而且會越吃越寬。只有上端的人講得出漂亮的架構卻驗收不了產出;只有下端的人能挑出 28px 卻說不出模組該怎麼切。作者說這兩端合起來會讓你在面試與市場上都更安全,理由是一樣的:面試官問的正是那些沒有標準答案、需要你解釋取捨的問題。

留給下一段 話說回來,如果放著不管、兩端都不做,代價具體會長成什麼樣子?

10. 放著不管的代價:8.9% 重複、153 個死檔案 10:20–10:59

他們拿自家系統做靜態分析:9% 的程式碼完全重複——不是功能相似,是一模一樣——加上 153 個沒有被用到的檔案。這對管理 context 極糟,也會讓 AI 給出更差的結果。放任 agent 無人看管、不檢查程式碼品質,你會得到一個外表符合期待、底下卻是技術債大山的應用;想改一點點,整個就可能垮掉。

靜態分析報告:9% 重複與 153 個未使用檔案,是「無人看管」最直接的量化證據
10:37 · 靜態分析報告:9% 重複與 153 個未使用檔案,是「無人看管」最直接的量化證據
承上 上一段以「兩端都不做的代價是什麼」作結,這一段用一份靜態分析報告把代價量化。

推理因為抽象的 code smell 說服力有限,所以作者秀出自家系統的掃描結果:Dead Code 區塊 153 個未使用檔案、220 個未使用匯出,總計 413 個問題;Duplication 區塊 9,760 行重複、重複率 8.9%。他強調那是靜態分析,代表這些片段一模一樣,不是功能相似而已。

AI 補充這份報告值得注意的是它的分類方式:dead code 與 duplication 是兩種不同的病。死程式碼是「沒人用卻還在」,它污染的是 context——你和 agent 都要花力氣分辨哪些檔案還算數;重複是「同一件事被寫了很多遍」,它污染的是改動成本。畫面下方還有一項健康度指標顯示 4,780 個函式裡有 367 個超過複雜度門檻,平均可維護性 89.7 分被標成 good——也就是說,整體分數好看,問題卻集中在特定幾百個地方。這正好呼應作者的主張:外表能跑、分數不差,技術債仍然在底下堆著。

dead code

死程式碼

專案裡不再被任何路徑使用、卻仍留在 codebase 的檔案、匯出或型別。

它的害處在 AI 時代被放大了:agent 搜尋時會讀到它、可能照著它寫、也可能把它當成現行慣例。清掉死程式碼因此不只是整潔,而是在整理模型的輸入。常用工具會一併報出未使用的匯出、相依與循環相依。

相關術語: static analysis (由它偵測)

出處:第 10 段「放著不管的代價:8.9% 重複、153 個死檔案」

static analysis

靜態分析

不執行程式、只從原始碼結構找出問題的自動化檢查。

作者特別強調「這是靜態分析」,是為了說明那 8.9% 不是靠語意判斷猜出來的,而是逐字比對出的完全相同片段——所以真實的重複只會更多,因為功能雷同但寫法不同的部分它抓不到。

相關術語: code duplication (量化)

出處:第 10 段「放著不管的代價:8.9% 重複、153 個死檔案」

technical debt

技術債

為了快速交付而累積下來、日後必須付出額外成本才能改動的設計妥協。

作者的比喻是「坐在一座技術債的山上」:應用看起來符合預期,但只要想改一點點就可能整個塌掉。和傳統技術債不同的是,AI 讓它累積得更快也更隱形——產出速度變高,而每一次局部最佳解都在增加後續的耦合。

出處:第 10 段「放著不管的代價:8.9% 重複、153 個死檔案」

留給下一段 既然無人看管會出事,那有沒有哪一塊是判準夠清楚、交給 agent 反而比人做得更整齊的?

11. 無障礙:定義清楚,所以大多能自動化 10:59–12:07

無障礙不會消失,但它定義得很清楚,所以能交代給 agent:優先用語意 HTML;真的必須用一堆 div 時,用 aria 標出角色;再確認 tab index 的順序和畫面上的順序一致——主要就這些。而且它是非功能需求,商業上會被推著「做完就好」。以前要辦兩週的無障礙衝刺,現在做平台、做全公司 design system 的人先把它做對,AI 就從那裡學,你只要輕量檢查。

承上 上一段問「有沒有哪一塊交給 agent 反而更整齊」,這一段回答:無障礙。

推理因為無障礙的規則定義得很清楚,所以作者說可以直接指示 agent:優先用語意 HTML;真的得用一堆 div 時用 aria 標出角色;再確認 tab 順序和畫面順序一致。他同時點出它是非功能需求,商業上總被推著趕快做完,所以自動化的誘因特別大。

AI 補充他描述的順序其實就是可及性的優先級:能用原生語意元素就別自己造。用 button 而不是加了 onClick 的 div,鍵盤操作、焦點、螢幕閱讀器的角色都免費拿到;aria 是補救,不是首選——標錯角色比不標更糟。他提到的第三點最容易被忽略:tab 順序取決於 DOM 順序,而 CSS 可以把視覺順序改掉,於是畫面上明明在上面的按鈕,鍵盤卻最後才走到。他說以前要辦兩週的無障礙衝刺,現在由做 design system 的人先做對、AI 從那裡學——這是把品質內建到來源,而不是事後補救。

術語:semantic HTMLtab order

semantic HTML

語意化 HTML

使用能表達內容意義的原生標籤,例如 button、nav、main,而不是一律用 div。

語意標籤自帶角色、鍵盤行為與焦點管理,等於免費取得一大半可及性。它也是 AI 能被指示遵守的典型規則:判準明確、可以被檢查工具驗證。

相關術語: ARIA (退而求其次)

出處:第 11 段「無障礙:定義清楚,所以大多能自動化」

ARIA

ARIA 無障礙屬性

用 role、aria-* 屬性替非語意元素補上角色、狀態與關係的規範。

第一守則是「不要用 ARIA」——能用原生元素就用原生元素,因為 ARIA 只改變輔助技術看到的描述,不會帶來鍵盤行為。它適用於原生元素表達不了的複合元件,例如 tab 列、樹狀選單。

相關術語: semantic HTML (補足)

出處:第 11 段「無障礙:定義清楚,所以大多能自動化」

tab order

Tab 焦點順序

使用者按 Tab 鍵在可聚焦元素之間移動的順序,預設由 DOM 順序決定。

問題幾乎都出在視覺順序和 DOM 順序不一致:flex 的 order、grid 的擺放、絕對定位都會讓畫面看起來是一個順序、鍵盤走的是另一個。檢查方法很土但有效:把滑鼠收起來,用 Tab 走一遍整個頁面。

出處:第 11 段「無障礙:定義清楚,所以大多能自動化」

non-functional requirement

非功能需求

不直接對應某項功能、而是規範系統品質的要求,如效能、可及性、安全性。

作者用這個詞解釋無障礙為什麼老是被壓縮:它不產生可展示的商業價值,於是永遠排在功能後面。這也說明為什麼「能自動化」對它特別重要——它多半不會拿到專門的時間。

出處:第 11 段「無障礙:定義清楚,所以大多能自動化」

留給下一段 無障礙可以交給規則,但有一件事沒有規則可循:介面背後那份資料到底該怎麼設計?

12. state 與資料:收斂成 essential state 12:07–13:44

最後一個技能是狀態與資料:看著一個介面就能判斷用什麼資料結構去模擬它,把一切收斂成必要狀態。用 AI 的話,local state 會到處都是而且大量冗餘,因為元件是各自孤立生出來的;沒有溝通、不懂架構,同一份後端資料會在兩個地方各取一次,變成兩個請求。設計過的應用裡狀態是有秩序的:不要多餘狀態、不要衍生狀態,愈小愈好。他用畢卡索的公牛比喻——從細節滿滿畫到最簡的線條——再加上單一寫入原則:每份資料在系統裡只存一次。

畢卡索公牛的簡化過程圖,是整段「把狀態收斂到最小」的視覺比喻
13:10 · 畢卡索公牛的簡化過程圖,是整段「把狀態收斂到最小」的視覺比喻
承上 上一段留下「介面背後那份資料該怎麼設計」的問題,這一段給出最後一個技能。

推理因為元件是被孤立地生出來的,所以用 AI 的專案會到處都是 local state,同一份後端資料在兩個地方各取一次、變成兩個請求。作者主張的能力是:看著一個介面就判斷得出用什麼資料結構模擬它,把狀態收斂到最小——不要多餘狀態、不要衍生狀態——並用畢卡索畫公牛的系列版畫當比喻,最後配上單一真相來源原則。

AI 補充畫面上那張圖是畢卡索的《公牛》石版畫系列:從細節完整的寫實公牛,一步步簡化到只剩幾條線仍然認得出是公牛。這裡要說的不是「越少越好」,而是「找出不能再少的那組線」——essential state 的意思正是:其他所有畫面上的東西,都能從它算出來。實務上的檢查很簡單:對每一個 state,問它能不能由別的 state 推導出來;能,就刪掉它、改成計算。旁邊那句 Single Source of Truth 是同一件事的另一面:同一份資料在系統裡只存一次,兩份就一定會有不同步的那一天。字幕把 bull 誤寫成 ball,看畫面就知道是公牛,不是球。

essential state

必要狀態

無法從其他狀態推導出來、必須被真正儲存的那一組最小資料。

判斷方式是逆推:畫面上每個元素,能不能由現有的 state 計算出來?能就不要另外存。常見的反例是把「篩選後的清單」也存成 state,於是每次篩選條件變動都要記得同步它。收斂 state 的好處不只是少寫程式,而是把「不同步」這個 bug 類別整個消滅。

相關術語: derived state (排除)、single source of truth (同一原則)

出處:第 12 段「state 與資料:收斂成 essential state」

derived state

衍生狀態

可以從其他狀態計算出來、卻被另外儲存了一份的資料。

它是最常見的多餘狀態:排序後的陣列、計數、格式化過的字串。存起來的當下沒問題,問題發生在來源改變而它沒跟著改的那一刻。正確做法是在 render 時計算,真的很貴再談 memo 化。

出處:第 12 段「state 與資料:收斂成 essential state」

single source of truth

單一真相來源

每一份資料在系統裡只被儲存一次,其他地方都引用它。

作者說的 single-write principle 就是它。它同時解決兩個問題:不同步(兩份資料各自被改)與職責不清(不知道該改哪一份)。在前端的具體表現是:伺服器資料交給資料層快取,元件不要各自 fetch 一份存進自己的 state。

出處:第 12 段「state 與資料:收斂成 essential state」

local state

區域狀態

存在單一元件內部、不與外部共享的狀態。

它本身是好東西——愈接近使用處愈好維護。作者批評的是它被濫用的樣子:每個元件各自持有一份其實屬於整個應用的資料。判準是資料的擁有者是誰,而不是誰先用到它。

出處:第 12 段「state 與資料:收斂成 essential state」

留給下一段 三個技能都講完了;剩下最後一個問題——面對這麼多東西,一個人該從哪裡開始?

13. 從哪裡開始:看你的產品環境 13:44–15:15

主持人問:三個技能都知道了,該從哪開始?答案取決於你在做的系統——有微前端、有規模的,投資 system design;只負責功能、不掌管大塊系統的,就往細節走:狀態、資料、程式碼品質。做法是每次和 agent 做完事就打開 pull request,做真正的 code review,不是 AI review,而是親眼看機器產出的程式碼。他用工廠烤蛋糕比喻:唯一知道好不好吃的方法就是自己去嘗一口。

承上 上一段結束在「三個技能都講完了,該從哪開始」,這一段給出取捨方式並收束整支影片。

推理因為起點取決於你能影響的範圍,所以作者的建議是照系統型態分流:碰得到微前端與規模的人投資 system design;只負責功能的人往細節走——狀態、資料、程式碼品質。做法很具體:每次和 agent 做完事,打開 pull request 做真正的 code review,親眼看機器產出的程式碼。

AI 補充那個工廠烤蛋糕的比喻其實是在回答一個很現實的問題:在 AI 產出量暴增的情況下,人要把有限的注意力放哪裡?他的答案是放在輸出的抽樣檢查上——你不可能讀完每一行,但你必須真的嘗過。把這件事接回整支影片:第二段的邊界、第七與第八段的 code smell、第十段的靜態分析,全部都是為了讓這個抽樣檢查變得可行——邊界讓你知道該看哪裡,氣味讓你知道要看什麼,掃描工具讓你知道漏了多少。

code review

程式碼審查

由人逐段閱讀改動、提出問題與修改建議的把關流程。

作者特別區分「真正的 code review」與「AI review」:後者能抓出模式化的問題,但抓不出「這個模組不該存在」這種判斷。在 agent 產出量變大的情況下,review 的重點也從找錯字轉向確認邊界、重複與狀態設計。

出處:第 13 段「從哪裡開始:看你的產品環境」

pull request

合併請求

把一組改動提出來、供人審查與討論後再併入主線的單位。

在 AI 協作的流程裡,它變成人唯一還會逐行看的地方,所以維持它的可讀性很重要:一次一個意圖、改動夠小、說明白為什麼。agent 一次改二十個檔案的 PR,實際上等於沒有被審查。

出處:第 13 段「從哪裡開始:看你的產品環境」

留給下一段 總結收束。

4. 總結

這支影片的推理鏈是一條:先把「AI 會不會取代前端」改寫成「哪一種工作的成功條件可以被寫清楚」(第 1 段),再用兩張對照圖指出 AI 產出的缺口是邊界,而邊界同時決定了 agent 要花多少 token(第 2 段)。接著給出機制——模型為單一 prompt 做極大化,所以每加一個功能就重塑一次架構,好架構其實是穿過所有功能的那條迴歸線(第 3 段)。有了這條判準,他開始分類:design into code、web performance、automated testing 因為目標明確與可量測而被塗灰(第 4–6 段);沒被塗灰的 code quality 則用同一段 AI 產出的程式碼示範兩個氣味——寫死的 28px 破壞設計系統與認知一致性(第 7 段),內嵌元件因為 context window 的限制而必然導致重複(第 8 段)。於是能力的出路被推向兩端:談得了架構、也鑽得進細節(第 9 段),否則代價會長成靜態分析報告上的 8.9% 重複與 153 個死檔案(第 10 段)。最後補上兩塊對照:無障礙因為規則清楚而適合交給 agent(第 11 段),狀態設計則因為沒有規則可循而成為第三個核心技能,用畢卡索公牛與單一真相來源收斂(第 12 段);結尾把方法落地成一句可執行的習慣——每次和 agent 做完事,親自打開 pull request 做真正的 code review(第 13 段)。

勘誤總整理

確定錯誤/已過時見仁見智(取決於版本或情境)

段落原話(transcript 逐字)說明
2. AI 給你漂亮介面,不給你邊界
0:27
「most of these models, including the latest Oppo models, have been heavily optimized for the "prompt- to-interface" principle」「模型被刻意優化成 prompt 直接產介面」是對訓練目標的推測,各家實驗室並未公開這樣的目標函式。他觀察到的現象(agent 傾向產出視覺完成度高、結構鬆散的程式碼)確實常見,但成因更可能是評測與使用者偏好回饋偏向可見成果,而不是有一條叫 prompt-to-interface 的最佳化原則。
依據: 各主要模型的訓練目標未公開;此處為作者的推論而非引用文件
4. design into code:受衝擊最大的那一塊
3:10
「which used to account for 80% of our frontend work, it's almost disappeared」八成這個比例是作者的個人估計,沒有資料來源,而且高度取決於團隊型態:以產品互動、狀態管理或資料視覺化為主的團隊,切版本來就佔不到這麼高。說它「幾乎消失」也偏強——複雜互動、動畫、極端內容與可及性細節仍需要人手調整。
依據: 影片中未提供任何調查或統計來源

5. 推薦三個下一步

1. 往下挖深:前端 system design 的實作方法

影片說「你得成為前端架構的高手」,但明確表示不在這支的範圍內;邊界怎麼畫、模組怎麼切、共用 library 怎麼抽,是整條推理鏈上最大的空白。

YouTube 搜尋:frontend system design interview micro frontends architecture feature sliced design react 前端架構 模組化

2. 往旁邊對照:狀態管理與 essential state 的實際做法

第 12 段給了原則(不要衍生狀態、單一真相來源)卻沒給工具層的做法;把它和伺服器狀態快取、狀態機這些既有方案對照,才知道原則怎麼落地。

YouTube 搜尋:derived state react react query server state xstate ui state machine single source of truth frontend

3. 往上應用:如何 review AI 產出的程式碼

結論落在「打開 pull request 做真正的 code review」,但沒說在 agent 產出量暴增時該怎麼抽樣、看什麼、用哪些工具把重複與死程式碼擋在合併之前。

YouTube 搜尋:reviewing ai generated code knip dead code typescript jscpd duplication detection code review checklist ai

📄 全部影片 · 主題區: 前端底層與系統設計