:從需求拆分到可驗(yàn)收交付的完整實(shí)踐)
1. 切片開發(fā)切的是什么先對齊定義1.1 垂直切片和水平切片別搞混一說“切片開發(fā)”很多人的第一反應(yīng)是數(shù)據(jù)庫分片、視頻文件切片或者監(jiān)控?cái)?shù)據(jù)的采樣切片。這些都對但我要講的“切片開發(fā)”指的是軟件交付過程中的需求切片更準(zhǔn)確地說是敏捷迭代里的垂直切片Vertical Slice。這個(gè)詞我在帶迭代和做技術(shù)管理時(shí)反復(fù)提因?yàn)樗鼛缀鯖Q定了一個(gè)團(tuán)隊(duì)能不能穩(wěn)定交付、能不能快速響應(yīng)變化。垂直切片的意思很簡單每次交付一個(gè)從用戶操作到系統(tǒng)反饋都完整可運(yùn)行的小功能滿足一個(gè)具體的業(yè)務(wù)場景而不是按“數(shù)據(jù)庫層—接口層—界面層”這樣水平地切。水平切片也有人說成“按技術(shù)層次切”比如第一周做建表第二周做接口第三周做界面最后三天聯(lián)調(diào)。這種切法在PPT上很好講實(shí)際開發(fā)中卻是坑人的。為什么垂直切片是“最核心方法”因?yàn)樗苯踊卮鹆塑浖?xiàng)目中兩個(gè)最致命的問題這個(gè)功能什么時(shí)候才能給人看和哪些需求可以先不做水平切片會(huì)把所有風(fēng)險(xiǎn)堆到最后那個(gè)“集成階段”而垂直切片把風(fēng)險(xiǎn)分散到每一次交付里。說白了垂直切片追求的是“每一切完用戶和產(chǎn)品都能看到點(diǎn)東西、能點(diǎn)一點(diǎn)、能驗(yàn)收”。1.2 為什么大家習(xí)慣按“層”切以及這個(gè)習(xí)慣從哪來按層切幾乎是工程師的本能因?yàn)榇a結(jié)構(gòu)本來就是分層的。我見過很多團(tuán)隊(duì)需求下來第一反應(yīng)是“先畫表結(jié)構(gòu)”“先把DTO定了”“先把接口定義出來”。這種習(xí)慣不能說錯(cuò)它是技術(shù)分解邏輯但它不是交付邏輯。用交付邏輯看研發(fā)唯一標(biāo)準(zhǔn)是這一個(gè)周期結(jié)束時(shí)有沒有什么東西可以部署到線上讓用戶用按層切的問題在于前幾周產(chǎn)出的表結(jié)構(gòu)、接口都沒有獨(dú)立價(jià)值用戶看不到、驗(yàn)證不了只有到聯(lián)調(diào)階段才第一次出現(xiàn)“可運(yùn)行的整體”一旦有問題所有模塊一起返工壓力特別大。按層切的另一個(gè)誘因是團(tuán)隊(duì)協(xié)作模式。前端團(tuán)隊(duì)、后端團(tuán)隊(duì)、DBA各自有職責(zé)范圍大家下意識就把工作按角色劃分了。但垂直切片并不要求所有人同時(shí)圍著一個(gè)切片轉(zhuǎn)而是要求每一個(gè)切片都跨越這些角色一個(gè)需求切片可能涉及一張新表、兩個(gè)接口、一個(gè)頁面、一個(gè)狀態(tài)流轉(zhuǎn)。它是橫著跨學(xué)科協(xié)作的不是縱著按專業(yè)分的。很多團(tuán)隊(duì)切換不過來是因?yàn)榻M織協(xié)作方式?jīng)]跟著變不是方法論不行。1.3 一個(gè)合格的切片要長成什么樣我自己判斷切片合不合格用四個(gè)問題這個(gè)切片交付后用戶能完成一個(gè)完整的動(dòng)作嗎比如“選一件商品加入購物車并看到合計(jì)金額”。這個(gè)切片能不能獨(dú)立測試、獨(dú)立部署、獨(dú)立回滾哪怕其他切片還沒做完。這個(gè)切片有沒有明確的驗(yàn)收標(biāo)準(zhǔn)驗(yàn)收標(biāo)準(zhǔn)是不是可以被寫成自動(dòng)化測試或手動(dòng)測試步驟這個(gè)切片切完之后是否讓整個(gè)系統(tǒng)更接近最終目標(biāo)而不是產(chǎn)生需要后續(xù)重構(gòu)的臨時(shí)邏輯如果四個(gè)問題里有任何一個(gè)答不上來切片就是不合格的。很多人把“一個(gè)功能的一個(gè)步驟”叫作切片比如“用戶能點(diǎn)擊登錄按鈕”——這是界面行為不是完整動(dòng)作。一個(gè)最小切片至少要形成“輸入—處理—輸出”閉環(huán)中間可以有簡化邏輯但不能是半成品。2. 切片的核心方法與完整策略2.1 切片的前置動(dòng)作先把需求講到“能演示”很多人問“怎么切片”其實(shí)第一步不是切是把需求整理成能講清“誰、在什么場景下、要做什么、結(jié)果是什么”的一句話。這句話是切片的前提也是后續(xù)驗(yàn)收標(biāo)準(zhǔn)的地基。我常用的要求是每次開切片會(huì)前產(chǎn)品經(jīng)理至少要把需求描述到“我能閉著眼描述這個(gè)功能給不相關(guān)的人聽他能理解用戶在干什么”的程度。如果需求本身是模糊的切出來的每個(gè)切片也會(huì)是模糊的。舉個(gè)例子“做一個(gè)訂單管理后臺”這話沒法切因?yàn)楣芾韱T、客服、財(cái)務(wù)看訂單的角度完全不同涉及的操作也完全不同。先把它拆成“客服希望快速檢索訂單并修改地址”“財(cái)務(wù)希望導(dǎo)出特定時(shí)間段的結(jié)算單”切片才有抓手。這一步做扎實(shí)了后面所有切片都是在“用戶故事/業(yè)務(wù)步驟”上做文章而不是在技術(shù)空想上做文章。我甚至建議產(chǎn)品經(jīng)理把需求寫成“用戶故事補(bǔ)充條件”的格式作為某類角色我想要某項(xiàng)能力以便實(shí)現(xiàn)某個(gè)目的。這句話寫完之后下一步才是切片。2.2 五種實(shí)戰(zhàn)切片方法含具體案例第一種按用戶完整旅程的關(guān)鍵節(jié)點(diǎn)切拿出一張紙把用戶從進(jìn)入功能到離開功能的每一步都寫下來。比如“優(yōu)惠券功能”完整旅程是查看領(lǐng)券入口—領(lǐng)取一張券—在訂單結(jié)算頁看到可用券—勾選抵扣—支付成功后核銷—過期前收到提醒。這里每一步都可以形成一個(gè)獨(dú)立切片越靠前入口的越優(yōu)先做因?yàn)橛脩魶]入口的話后面的流程都無法驗(yàn)證。我做過一個(gè)案例團(tuán)隊(duì)原本的計(jì)劃是把優(yōu)惠券的創(chuàng)建、發(fā)放、核銷、對賬全做完再上線那是一個(gè)月的工作量。按旅程拆分后第一周只做了“后臺創(chuàng)建一張固定優(yōu)惠券 用戶直接在個(gè)人中心看到并領(lǐng)取”第二周再做結(jié)算頁的抵扣。第一周的東西雖然簡陋但確實(shí)讓用戶在真實(shí)環(huán)境里跑通了“領(lǐng)券”動(dòng)作產(chǎn)品驗(yàn)收和運(yùn)營推廣可以提前啟動(dòng)。第二種按數(shù)據(jù)字段的從簡到繁切一個(gè)功能如果有很多字段先只做核心字段再做外圍字段?!坝脩糇浴笔墙?jīng)典例子完整注冊有手機(jī)號、驗(yàn)證碼、密碼、昵稱、頭像、興趣標(biāo)簽、邀請碼。第一刀只做手機(jī)號驗(yàn)證碼和密碼昵稱不填默認(rèn)為“用戶隨機(jī)數(shù)”頭像不給上傳入口。這樣注冊流程在上線當(dāng)天就能用。下一個(gè)迭代再加昵稱修改再下一個(gè)迭代加頭像上傳。這種切法特別適合表單類、配置類功能它能保證每次交付都具備可用性同時(shí)數(shù)據(jù)模型還能平滑演進(jìn)。第三種按業(yè)務(wù)規(guī)則分支切業(yè)務(wù)規(guī)則多的時(shí)候按“主干流程 分支流程”來切。主干流程是用戶成功率最高的路徑分支是例外和異常情況。以“退款”為例主干是“發(fā)起申請—審核通過—原路退回—系統(tǒng)通知”分支包括“部分退款”“余額不足導(dǎo)致退款失敗”“已發(fā)貨狀態(tài)下的退款申請”。第一刀只做全額退款不做部分退款因?yàn)槿~退款的金額計(jì)算最簡單第二刀才做“部分退款 按比例分?jǐn)們?yōu)惠”第三刀再做“退款失敗自動(dòng)重試”。這里有個(gè)容易被忽略的點(diǎn)盡量把異常分支做成獨(dú)立的“小切片”不要讓它們在主干切片里以“邏輯分支”的形式混雜存在否則主干切片的驗(yàn)收會(huì)變得異常復(fù)雜。第四種按用戶角色切同一個(gè)模塊如果服務(wù)多個(gè)角色按角色拆是最穩(wěn)的?!绊?xiàng)目看板”這東西項(xiàng)目經(jīng)理要的是進(jìn)度統(tǒng)計(jì)執(zhí)行人要的是自己的任務(wù)清單老板要的是跨項(xiàng)目匯總。這三個(gè)角色的使用場景、頁面信息密度、操作權(quán)限都不一樣。切片時(shí)不要讓三個(gè)角色共用一個(gè)大而全的頁面而是一個(gè)角色一個(gè)切片。第一個(gè)切片先做執(zhí)行人視角的任務(wù)清單至少真實(shí)用戶能用了再逐步給其他角色加視角。這類切片還有一個(gè)額外好處權(quán)限模型是隨著角色切片漸次引入的而不是第一個(gè)版本就把完整的RBAC模型做完。第五種按外部系統(tǒng)依賴的強(qiáng)弱切很多需求離不開外部系統(tǒng)支付、短信、第三方登錄、電子簽章。按“可模擬—真對接—深度打通”三個(gè)階段切是降低風(fēng)險(xiǎn)最有效的做法。第一刀用Mock數(shù)據(jù)或沙箱環(huán)境把完整流程先跑通第二刀接真實(shí)環(huán)境的只讀/基礎(chǔ)能力第三刀再做狀態(tài)回調(diào)、失敗對賬等深度集成。我見過太多團(tuán)隊(duì)一開始就追求接真實(shí)支付結(jié)果參數(shù)對不上、回調(diào)不通整個(gè)版本卡了兩個(gè)星期。如果第一刀先用沙箱把“下單—喚起收銀臺—支付成功回跳—訂單狀態(tài)變?yōu)橐阎Ц丁闭麠l鏈路跑通業(yè)務(wù)方和研發(fā)都能盡早看到真實(shí)交互真實(shí)對接的風(fēng)險(xiǎn)就被隔離了。2.3 切片顆粒度怎么定三個(gè)硬指標(biāo)顆粒度沒有標(biāo)準(zhǔn)公式但有三條硬指標(biāo)可以檢查。第一個(gè)指標(biāo)切片時(shí)長不超過一個(gè)迭代周期的三分之一。如果團(tuán)隊(duì)迭代是兩周一個(gè)切片最好控制在兩到三天最長不超過一周。超過這個(gè)時(shí)長說明切片太大需要繼續(xù)切。低于半天則可能切得太碎產(chǎn)生大量管理成本。第二個(gè)指標(biāo)每個(gè)切片必須能回答“誰在用、用來干嘛”的問題。如果一個(gè)切片只能回答“這里加了三個(gè)表”那它就不是切片是技術(shù)任務(wù)。技術(shù)任務(wù)不是不能排而是不要假裝它是用戶可感知的需求切片。第三個(gè)指標(biāo)切片之間可以并行但不強(qiáng)依賴。兩個(gè)切片如果必須按順序做那么它們其實(shí)屬于同一個(gè)更大的切片。我通常用“如果B還沒做A能不能獨(dú)立上線”來判斷這兩個(gè)切片的耦合度。到這里就能回答顆粒度問題的核心了切片粒度是“價(jià)值”和“技術(shù)風(fēng)險(xiǎn)”博弈的結(jié)果不是按工作量平均分配的。價(jià)值密度高的部分切小點(diǎn)盡早驗(yàn)證技術(shù)風(fēng)險(xiǎn)高的部分也切小點(diǎn)盡早試錯(cuò)純粹的后臺數(shù)據(jù)遷移或重構(gòu)可以單獨(dú)列技術(shù)切片但一定要標(biāo)注出它對用戶價(jià)值的貢獻(xiàn)在哪。3. 實(shí)操手記從需求到切片的完整流程3.1 實(shí)操示例購物車結(jié)算的一刀一刀我用一個(gè)幾乎所有團(tuán)隊(duì)都做過的需求“購物車結(jié)算”來演示完整切法。原始需求是這樣一句話“用戶在購物車勾選商品點(diǎn)擊結(jié)算完成支付后生成訂單。”注意這就是典型的“能看懂但沒法直接開發(fā)”的需求因?yàn)槔锩娌刂\(yùn)費(fèi)計(jì)算、優(yōu)惠、庫存、支付回調(diào)、訂單狀態(tài)、超時(shí)取消一堆邏輯。拿到這個(gè)需求我做的第一步是列全量業(yè)務(wù)規(guī)則比如只有選中商品才能結(jié)算運(yùn)費(fèi)按地區(qū)模板計(jì)算部分商品不支持優(yōu)惠券庫存不足要在結(jié)算時(shí)提示支付成功后并發(fā)扣庫存超時(shí)未支付自動(dòng)取消。列完后我用主干優(yōu)先法切出了下面這幾刀第1切片勾選商品后顯示合計(jì)金額純前端計(jì)算這個(gè)切片只做金額展示不接支付不生成訂單。它的價(jià)值是讓用戶看到購物車選品反饋?zhàn)屒岸税堰x中態(tài)和金額聯(lián)動(dòng)調(diào)通。第2切片生成草稿訂單后端點(diǎn)擊“去結(jié)算”后后端根據(jù)勾選商品生成訂單算出商品總額訂單狀態(tài)為“待支付”但不喚起任何支付。這個(gè)切片驗(yàn)證了訂單表結(jié)構(gòu)、金額計(jì)算邏輯、購物車到訂單的數(shù)據(jù)轉(zhuǎn)換。第3切片接入支付沙箱并回調(diào)接上支付平臺的沙箱環(huán)境用戶點(diǎn)擊支付后跳轉(zhuǎn)支付成功回調(diào)把訂單狀態(tài)改為“已支付”庫存可以在這一步先不做扣減只記錄支付時(shí)間。第4切片庫存校驗(yàn)與扣減支付成功后扣庫存并在結(jié)算前校驗(yàn)庫存不足的提示。這一步開始涉及并發(fā)單獨(dú)一個(gè)切片便于做壓力測試。第5切片運(yùn)費(fèi)模板與優(yōu)惠疊加這是規(guī)則最復(fù)雜的部分放到最后。因?yàn)榍懊嫠牡兑呀?jīng)把主鏈路走通了運(yùn)費(fèi)和優(yōu)惠屬于“加條件”相對獨(dú)立。這套切法最關(guān)鍵的點(diǎn)是每一刀都能獨(dú)立驗(yàn)證每一刀上線之后用戶在大部分情況下都能正常使用。第2切片做完后用戶可以生成訂單只是支付不了這個(gè)狀態(tài)對后臺演示、運(yùn)營了解流程已經(jīng)足夠友好。第3切片做完后用戶能完整走完一筆支付但對賬報(bào)表和庫存還不準(zhǔn)團(tuán)隊(duì)知道這些是已知風(fēng)險(xiǎn)。3.2 切片之后的產(chǎn)出物與驗(yàn)收標(biāo)準(zhǔn)一個(gè)切片在進(jìn)入開發(fā)前需要準(zhǔn)備好四樣?xùn)|西需求描述、UI原型哪怕手繪、數(shù)據(jù)影響范圍、驗(yàn)收標(biāo)準(zhǔn)。我在團(tuán)隊(duì)里最常強(qiáng)調(diào)的是驗(yàn)收標(biāo)準(zhǔn)而且要求寫成“可執(zhí)行的測試場景”不寫“實(shí)現(xiàn)XX功能”這種話。切片驗(yàn)收標(biāo)準(zhǔn)可執(zhí)行版本第1切片勾選兩個(gè)商品后合計(jì)金額等于兩個(gè)商品價(jià)格之和并展示取消勾選后合計(jì)變少不勾選時(shí)結(jié)算按鈕置灰第2切片點(diǎn)擊結(jié)算生成訂單數(shù)據(jù)庫中有記錄且狀態(tài)為待支付返回訂單號訂單金額與前端展示一致第3切片點(diǎn)擊支付跳轉(zhuǎn)沙箱支付成功回調(diào)后訂單狀態(tài)變?yōu)橐阎Ц吨貜?fù)回調(diào)不重復(fù)修改狀態(tài)第4切片庫存為1、用戶買2時(shí)提示庫存不足不可生成訂單支付成功后庫存扣減1超賣數(shù)量為0第5切片不同地區(qū)地址展示不同運(yùn)費(fèi)符合滿減條件的訂單自動(dòng)減價(jià)與優(yōu)惠券同時(shí)生效的順序正確這些驗(yàn)收標(biāo)準(zhǔn)既是研發(fā)的自測清單也是測試人員的用例來源還是產(chǎn)品驗(yàn)收時(shí)的打勾清單。寫驗(yàn)收標(biāo)準(zhǔn)有一個(gè)心法從用戶能觀察到的行為出發(fā)描述不要從代碼實(shí)現(xiàn)出發(fā)描述。比如“狀態(tài)變?yōu)榇Ц丁北取安迦胗唵伪韘tate字段置為0”更容易對齊各方認(rèn)知技術(shù)細(xì)節(jié)留在研發(fā)自測里。3.3 在迭代計(jì)劃里怎么排切片切片排進(jìn)迭代還要注意順序背后的邏輯。我用的原則是“先通后優(yōu)、先驗(yàn)證后完善”第一個(gè)切片一定要是最能驗(yàn)證整體方案可行性的通常是主鏈路的打通哪怕界面丑、邏輯簡陋第二個(gè)切片補(bǔ)上最常用的異常分支第三個(gè)才開始做錦上添花的部分。永遠(yuǎn)不要第一個(gè)迭代就去做報(bào)表導(dǎo)出、數(shù)據(jù)大屏這種邊緣功能等核心鏈路跑通再上不遲。另外切片之間還有一個(gè)容易忽略的點(diǎn)——依賴順序要與團(tuán)隊(duì)能力匹配。如果前端資源緊張第1切片這種純前端任務(wù)可能要延后讓后端先做第2切片如果后端資源緊張第1切片可以先上。不要為了保證“用戶旅程的完整性”而強(qiáng)行保持切片順序迭代節(jié)奏和資源約束同樣重要。4. AI能幫你切片嗎邊界與配合方式4.1 現(xiàn)在的大模型能做到什么程度回到項(xiàng)目標(biāo)題里那個(gè)問題“是人工切片還是AI切片”我直接用實(shí)測結(jié)論回答AI可以參與切片而且是個(gè)不錯(cuò)的助手但真正拍板的一定是人。我在實(shí)際項(xiàng)目里試過用大模型切需求。把一段產(chǎn)品需求丟給它問“請幫我拆成最小可交付的垂直切片并給出每個(gè)切片的驗(yàn)收標(biāo)準(zhǔn)”它在以下方面表現(xiàn)確實(shí)不錯(cuò)需求描述比較清晰時(shí)能快速列出功能點(diǎn)清單能基于常識識別出一些業(yè)務(wù)分支比如注冊流程需要手機(jī)號校驗(yàn)、密碼強(qiáng)度限制能生成看起來像模像樣的驗(yàn)收標(biāo)準(zhǔn)能把模糊的大需求拆成更多小句子提供拆分的候選思路。對于從未接觸過該業(yè)務(wù)的人來說AI的輸出作為“初稿參考”完全合格。但AI的問題也很明顯。它不知道你們系統(tǒng)的現(xiàn)狀不知道哪些表已經(jīng)存在、哪些接口已經(jīng)能復(fù)用、哪些第三方的聯(lián)調(diào)成本很高。它不清楚團(tuán)隊(duì)的技術(shù)能力邊界一個(gè)切片在A團(tuán)隊(duì)可能兩天做完在B團(tuán)隊(duì)可能兩周做完。它對業(yè)務(wù)價(jià)值的判斷是局部的它會(huì)關(guān)注功能完整性但不會(huì)主動(dòng)思考“這個(gè)切片對業(yè)務(wù)策略、用戶留存、后續(xù)運(yùn)營意味著什么”。最關(guān)鍵的一點(diǎn)是它容易把“邏輯上的拆分”當(dāng)成“交付上的切片”結(jié)果切出來的東西是一個(gè)個(gè)相互交織的模塊而不是可以獨(dú)立上線的閉環(huán)。4.2 我日常用的AI輔助切片提示詞我不會(huì)直接讓AI替我切而是用它做**“信息擴(kuò)充 候選方案生成”**然后我再人工畫邊界。我常用的提示詞是這樣的你是一個(gè)資深敏捷教練。下面是我的一條產(chǎn)品需求。請完成三件事第一列出這個(gè)需求涉及到的全部用戶操作步驟第二識別其中的主干流程、異常分支、復(fù)雜規(guī)則第三按“每個(gè)部分都讓用戶獲得一個(gè)可感知結(jié)果”的原則給出3到5個(gè)候選切片方案。最后對每個(gè)候選切片說明它的獨(dú)立價(jià)值、潛在風(fēng)險(xiǎn)和被拆分的理由。用這套提示詞得到的結(jié)果通常比我直接問“怎么切”要靠譜得多。原因是它引導(dǎo)AI先做“場景拆解”再做“切片建議”而不是讓它一上來就生成結(jié)構(gòu)。得到AI的候選方案后我會(huì)把它當(dāng)成一個(gè)“急于表現(xiàn)的初級產(chǎn)品經(jīng)理”的輸出逐條和團(tuán)隊(duì)過哪些切片在技術(shù)上沒法獨(dú)立部署哪些切片的驗(yàn)證成本太高哪些可以合并哪些因?yàn)橐蕾囈粋€(gè)還沒約定的接口而必須重排這個(gè)過程里人做的事情是對齊現(xiàn)實(shí)約束AI做的事情是提供結(jié)構(gòu)化信息。4.3 為什么最終“拍板”還是要以人為主我把切片的決策權(quán)始終保留在人工一側(cè)原因有三個(gè)。第一切片不僅是任務(wù)劃分還是產(chǎn)品優(yōu)先級判斷。哪一部分先讓用戶看到這通常涉及業(yè)務(wù)策略和運(yùn)營節(jié)奏AI理解不了。比如一個(gè)商城系統(tǒng)先做購物車還是先做收藏夾取決于當(dāng)前業(yè)務(wù)重點(diǎn)是轉(zhuǎn)化率還是用戶留存這些背景只有懂業(yè)務(wù)的人知道。第二切片必須考慮現(xiàn)有系統(tǒng)的技術(shù)債。AI不知道你的訂單表已經(jīng)有三個(gè)狀態(tài)字段不可更改不知道公司統(tǒng)一登錄SDK二月份才升級過不知道某個(gè)老系統(tǒng)的接口調(diào)用成功率只有90%。一旦進(jìn)入這些約束的討論AI的結(jié)構(gòu)化能力就不夠用了需要靠人來協(xié)調(diào)。第三切片背后是團(tuán)隊(duì)的協(xié)作承諾。把一個(gè)切片分配下去意味著相關(guān)職能的人要在同一時(shí)間段投入這是組織和資源決策不是文本分析能替代的。AI可以輸出完美的切片方案但如果團(tuán)隊(duì)現(xiàn)有的后端力量都在忙另一個(gè)項(xiàng)目方案就執(zhí)行不了。所以我的最終答案很明確這個(gè)“切”的動(dòng)作人來做主AI來查漏和提速。項(xiàng)目標(biāo)題問“是人來切片還是用AI來切片”我給的答案是“人機(jī)協(xié)作人做最終決策”。成熟的團(tuán)隊(duì)可以把AI當(dāng)“先遣偵察兵”用它先掃一遍需求產(chǎn)生候選人再基于現(xiàn)實(shí)情報(bào)劃定最終邊界效率比純粹人工從零開會(huì)高不少。5. 常見問題與避坑指南5.1 問題一切太細(xì)交付碎片化切片切得越細(xì)每個(gè)切片的獨(dú)立價(jià)值就越低這是很多團(tuán)隊(duì)從“切不細(xì)”掉進(jìn)“切太碎”的典型軌跡。切太細(xì)的表現(xiàn)是每個(gè)切片只含有一兩個(gè)前端控件或一兩個(gè)接口研發(fā)半天完成但產(chǎn)品驗(yàn)收時(shí)要反復(fù)看“這個(gè)碎片和另一個(gè)碎片之間連不上”測試人員也難以下手。更麻煩的是切片之間往往存在隱式的數(shù)據(jù)依賴比如第3切片假設(shè)第2切片已經(jīng)把某個(gè)狀態(tài)字段寫好了一旦第2切片延期第3切片連開發(fā)都無法開始。應(yīng)對辦法是回到我在2.3節(jié)提的硬指標(biāo)切片必須能回答“用戶能完成一個(gè)什么閉環(huán)動(dòng)作”。如果只差一個(gè)“去重校驗(yàn)”就能讓切片閉環(huán)那就把它并進(jìn)來一起做不要為了追求體積小而強(qiáng)行切開。另外我建議每個(gè)切片排期不少于一天杜絕半天級切片累積大量管理開銷。5.2 問題二切太粗集成地獄其實(shí)沒躲掉有些團(tuán)隊(duì)名義上做垂直切片實(shí)際上還是把一個(gè)完整功能當(dāng)成一個(gè)切片里面塞了三張表、五個(gè)接口、兩個(gè)頁面、一次第三方對接美其名曰“一個(gè)用戶故事”。這種情況下切片時(shí)長往往會(huì)超過一周研發(fā)一半時(shí)間在寫代碼一半時(shí)間在等待其他模塊的聯(lián)調(diào)產(chǎn)品想提前驗(yàn)收也找不到入口其實(shí)又回到了水平切片的集成地獄。我的判斷標(biāo)準(zhǔn)是如果切片過程中出現(xiàn)“這個(gè)接口要等XX完成后才能聯(lián)調(diào)”“這個(gè)頁面依賴XX團(tuán)隊(duì)的新接口”就說明需要繼續(xù)下切。這時(shí)候不是把任務(wù)拆小而是把外部依賴隔離出來用Mock或者預(yù)定義契約先推進(jìn)讓主鏈路保持可運(yùn)行。5.3 問題三驗(yàn)收標(biāo)準(zhǔn)寫成“待辦任務(wù)”而不是“可測試場景”這個(gè)問題常見得讓人驚訝。很多團(tuán)隊(duì)寫的驗(yàn)收標(biāo)準(zhǔn)是“完成訂單列表功能”“實(shí)現(xiàn)優(yōu)惠金額計(jì)算”這種描述既不可測試也無法約束開發(fā)邊界驗(yàn)收時(shí)全靠雙方自由裁量。我要求團(tuán)隊(duì)把驗(yàn)收標(biāo)準(zhǔn)全部改成“當(dāng)……時(shí)系統(tǒng)應(yīng)該……”的行為句式并明確列出可觀察的輸入和輸出。比如“當(dāng)未登錄用戶訪問結(jié)算頁時(shí)跳轉(zhuǎn)登錄頁并在登錄后返回原結(jié)算頁”這句話任何人都能驗(yàn)收開發(fā)也知道寫完是什么樣。寫驗(yàn)收標(biāo)準(zhǔn)還有一個(gè)技巧每個(gè)切片至少寫一條異常場景。通常大家會(huì)先寫正常路徑異常路徑容易被忽略這導(dǎo)致開發(fā)做完正常路徑后測試才開始發(fā)現(xiàn)異常分支完全沒實(shí)現(xiàn)。提前寫出來等于提前把邊界條件暴露給研發(fā)測試階段少一輪來回。5.4 問題四把“切分”當(dāng)“排序”以為只是在排優(yōu)先級切片和優(yōu)先級排序是兩件事但很容易混在一起。切片解決的是“一個(gè)需求如何分解交付”排序解決的是“這些交付物哪個(gè)先做”。有些團(tuán)隊(duì)開會(huì)時(shí)只討論“先做什么后做什么”根本不做結(jié)構(gòu)拆解結(jié)果是優(yōu)先做完的“優(yōu)先級高的部分”本身還是一個(gè)無法獨(dú)立交付的大模塊。正確動(dòng)作是先做切片再對切片排序排序依據(jù)是依賴關(guān)系、風(fēng)險(xiǎn)、業(yè)務(wù)緊急度三者的加權(quán)。6. 關(guān)于切片我最后想說的幾句實(shí)在話做了這么多年交付我越來越覺得切片開發(fā)真正難的不是技術(shù)而是克制??酥谱 耙淮涡园阉羞壿嬜鐾辍钡臎_動(dòng)克制住“按自己專業(yè)領(lǐng)域舒服地切”的沖動(dòng)克制住“把重構(gòu)和技術(shù)優(yōu)化都塞進(jìn)同一個(gè)切片”的沖動(dòng)??酥频幕貓?bào)就是每兩周你都能拿得出一個(gè)看得見摸得著的東西每個(gè)迭代結(jié)束時(shí)團(tuán)隊(duì)都知道自己做了什么產(chǎn)品經(jīng)理能向老板演示的不再是PPT而是真實(shí)功能。如果讓我給團(tuán)隊(duì)定幾條紀(jì)律第一條是“任何切片都必須打通主鏈路再做優(yōu)化”第二條是“驗(yàn)收標(biāo)準(zhǔn)先寫異常場景再寫正常場景”第三條是“AI可以幫你做初稿但每個(gè)切片的邊界人要有能力解釋為什么這樣切”。這三條拿著就能用至于切片切出來的東西到底好不好只有一個(gè)檢驗(yàn)方式——把它上線然后看用戶是否買賬。