據(jù)處理的最小方案)
數(shù)據(jù)處理的最小方案最小架構(gòu)不是組件越少越好而是每個(gè)組件的責(zé)任足夠清楚。在“pandas/NumPy/SciPy 數(shù)據(jù)處理高階技巧”里先把對(duì)象落到 數(shù)據(jù)類(lèi)型、索引對(duì)齊、缺失值處理和計(jì)算結(jié)果再?zèng)Q定工具和實(shí)現(xiàn)。本文只討論“最小可運(yùn)行架構(gòu)與組件職責(zé)拆分”這一件事沒(méi)有經(jīng)過(guò)驗(yàn)證的效果、成本或生產(chǎn)經(jīng)歷不把它們寫(xiě)成事實(shí)。先確認(rèn)當(dāng)前要解決的動(dòng)作把需求寫(xiě)成可以檢查的句子誰(shuí)在什么條件下提交什么輸入系統(tǒng)或腳本要返回什么結(jié)果由誰(shuí)確認(rèn)。若任務(wù)涉及數(shù)據(jù)變換還要寫(xiě)明數(shù)據(jù)口徑、可接受的延遲和失敗后的處理方式。標(biāo)題里的范圍不能替代這些約定。同一技術(shù)??梢苑?wù)很多目標(biāo)。把探索性分析、固定報(bào)表和自動(dòng)決策混在一條鏈路里往往會(huì)讓錯(cuò)誤處理和驗(yàn)收標(biāo)準(zhǔn)互相沖突。首輪只保留一個(gè)目標(biāo)其他需求先記錄為待確認(rèn)項(xiàng)。 若觀察無(wú)法復(fù)現(xiàn)應(yīng)把結(jié)論停在待驗(yàn)證狀態(tài)。圍繞“最小可運(yùn)行架構(gòu)與組件職責(zé)拆分”做判斷先保留完成單一任務(wù)所需的入口、業(yè)務(wù)處理、數(shù)據(jù)訪問(wèn)和結(jié)果呈現(xiàn)把配置、權(quán)限和外部調(diào)用放在明確邊界。不要為了預(yù)想的規(guī)模提前引入多套隊(duì)列、緩存或服務(wù)但也不要把所有邏輯寫(xiě)進(jìn)一個(gè)難以測(cè)試的入口。這里需要保留原始樣本、配置版本和判斷依據(jù)。出現(xiàn)異常時(shí)先區(qū)分輸入不完整、規(guī)則不適用、依賴(lài)不可用和實(shí)現(xiàn)缺陷不同原因需要不同處理不能用一條泛化結(jié)論蓋過(guò)去。 若觀察無(wú)法復(fù)現(xiàn)應(yīng)把結(jié)論停在待驗(yàn)證狀態(tài)。用可復(fù)查的檢查替代口頭保證可以把關(guān)鍵約束寫(xiě)成一個(gè)很小的檢查入口。它不替代業(yè)務(wù)實(shí)現(xiàn)只把不應(yīng)繼續(xù)執(zhí)行的情況明確擋在邊界外 若觀察無(wú)法復(fù)現(xiàn)應(yīng)把結(jié)論停在待驗(yàn)證狀態(tài)。def check_request(payload: dict) - tuple[bool, str]: if not payload.get(source): return False, 缺少輸入來(lái)源 if payload.get(dry_run) is False and not payload.get(approved): return False, 執(zhí)行前需要確認(rèn) return True, 可以進(jìn)入下一步實(shí)際項(xiàng)目里把檢查結(jié)果與請(qǐng)求標(biāo)識(shí)、版本和錯(cuò)誤類(lèi)別關(guān)聯(lián)起來(lái)。涉及寫(xiě)入、導(dǎo)出或外部調(diào)用時(shí)額外確認(rèn)權(quán)限、超時(shí)和重復(fù)執(zhí)行的處理方式。這樣問(wèn)題發(fā)生后可以回到具體記錄而不是猜測(cè)系統(tǒng)當(dāng)時(shí)做了什么。 若觀察無(wú)法復(fù)現(xiàn)應(yīng)把結(jié)論停在待驗(yàn)證狀態(tài)。驗(yàn)證后再擴(kuò)大范圍先準(zhǔn)備正常、邊界和失敗三類(lèi)輸入按同一份約定檢查輸出。每次只改變一個(gè)主要條件例如替換一個(gè)組件、調(diào)整一個(gè)規(guī)則或開(kāi)放一類(lèi)請(qǐng)求。若結(jié)果變化才能定位變化來(lái)自哪里多個(gè)改動(dòng)一起發(fā)生時(shí)觀察到的差異很難解釋。觀察無(wú)法復(fù)現(xiàn)時(shí)應(yīng)把結(jié)論停在待驗(yàn)證狀態(tài)。用一次成功和一次失敗請(qǐng)求走完整條鏈路檢查每段的輸入輸出是否可見(jiàn)。能替換、能測(cè)試、能定位就是首版架構(gòu)的合格標(biāo)準(zhǔn)。對(duì)該數(shù)據(jù)處理實(shí)踐而言結(jié)論應(yīng)說(shuō)明適用任務(wù)、依賴(lài)前提和失敗處理。將這些寫(xiě)進(jìn)文章和項(xiàng)目記錄比籠統(tǒng)宣稱(chēng)方案成熟更有用。最小方案先跑通一條閉環(huán)最小可用并不是把完整系統(tǒng)做得粗糙一些而是選擇一條真實(shí)任務(wù)把輸入、處理、輸出和失敗返回連起來(lái)。開(kāi)始前寫(xiě)出暫不處理的范圍避免演示過(guò)程中不斷加入新能力。接口應(yīng)盡早暴露限制輸入不合法怎樣返回依賴(lài)不可用是否降級(jí)任務(wù)能否取消重復(fù)請(qǐng)求會(huì)不會(huì)產(chǎn)生副作用。只有成功畫(huà)面而沒(méi)有錯(cuò)誤路徑的原型很難判斷后續(xù)成本。實(shí)現(xiàn)時(shí)優(yōu)先復(fù)用現(xiàn)有組件和簡(jiǎn)單的數(shù)據(jù)流讓每個(gè)階段都能單獨(dú)驗(yàn)證。外部調(diào)用設(shè)置超時(shí)寫(xiě)操作使用冪等標(biāo)識(shí)后臺(tái)任務(wù)保留狀態(tài)查詢(xún)和人工接管入口。驗(yàn)收用一條正常輸入和幾條受控失敗輸入檢查結(jié)果、日志與資源清理是否一致。等真實(shí)使用暴露出容量或維護(hù)問(wèn)題再?zèng)Q定是否增加緩存、隊(duì)列、并發(fā)池或更復(fù)雜的抽象。這樣得到的第一版未必功能多卻能回答這條任務(wù)是否值得繼續(xù)投入。