[{"data":1,"prerenderedAt":1768},["ShallowReactive",2],{"blog-taxonomies":3,"blog-stats":507,"post-2026\u002F2026-07-18-简谈sdd规范驱动开发-copy":1083},[4,11,16,21,25,29,36,39,44,47,52,58,63,66,71,76,80,84,87,93,96,101,105,110,113,117,122,127,132,136,141,143,146,151,155,157,162,165,169,173,176,179,183,186,190,193,197,200,205,208,211,214,219,222,228,234,237,239,245,249,253,256,260,266,271,276,281,283,287,290,293,298,301,304,306,308,311,314,316,318,321,327,332,337,342,347,352,354,356,358,361,365,367,369,371,374,376,378,381,386,390,393,396,400,404,407,411,413,415,417,421,423,425,428,431,433,435,437,439,441,443,446,448,450,454,456,459,461,463,465,467,469,471,473,477,483,486,488,491,493,495,497,499,501,503,505],{"category":5,"tags":6},"笔记",[7,8,9,10],"QQ","插件","LiteLoader","美化",{"category":12,"tags":13},"其他",[14,15,10],"博客","IP签名",{"category":17,"tags":18},"杂谈",[19,20],"互联网","观点",{"category":5,"tags":22},[14,23,24],"GitHub","数据可视化",{"category":5,"tags":26},[14,27,28],"访问统计","不蒜子",{"category":30,"tags":31},"工具",[32,33,34,35],"Python","爬虫","选课脚本","广州大学",{"category":5,"tags":37},[38,5],"数学分析",{"category":40,"tags":41},"算法",[42,40,43],"数据结构","线性表",{"category":40,"tags":45},[42,46],"复习",{"category":5,"tags":48},[49,50,51],"高等代数","线性代数","知识点",{"category":5,"tags":53},[14,54,55,56,57],"Typora","PicGo","图床","Markdown",{"category":30,"tags":59},[60,61,62],"Jupyter","工具配置","中文",{"category":30,"tags":64},[65,61,10],"VSCode",{"category":30,"tags":67},[68,69,70,35],"路由器","OpenWrt","校园网",{"category":12,"tags":72},[73,74,75],"网络协议","Wireshark","DEVP2P",{"category":5,"tags":77},[73,74,78,79],"Lua","解码器",{"category":5,"tags":81},[82,5,83],"常微分方程","数学",{"category":5,"tags":85},[86,5,83],"概率论",{"category":30,"tags":88},[89,90,91,92],"Docker","WSL","Windows","磁盘清理",{"category":30,"tags":94},[32,33,95,35],"课程表",{"category":5,"tags":97},[14,98,99,100],"Hexo","Gitalk","评论系统",{"category":5,"tags":102},[14,103,98,104],"Obsidian","写作工具",{"category":12,"tags":106},[107,108,109],"课题研究","泊松分布","参数估计",{"category":12,"tags":111},[107,108,109,112],"组会",{"category":12,"tags":114},[109,115,108,116],"IM模型","统计学",{"category":17,"tags":118},[119,120,121],"软考","网络规划","信息系统项目管理",{"category":30,"tags":123},[124,125,126],"Arch Linux","AppImage","Linux",{"category":5,"tags":128},[129,130,131],"编程语言","计算机科学","内存管理",{"category":5,"tags":133},[134,135],"Canvas","前端",{"category":5,"tags":137},[14,138,139,140],"GitHub Actions","Vite","部署",{"category":5,"tags":142},[135],{"category":5,"tags":144},[135,145],"系统设计",{"category":5,"tags":147},[135,148,149,150],"安全","XSS","CSRF",{"category":152,"tags":153},"项目",[134,154],"PixiJS",{"category":152,"tags":156},null,{"category":40,"tags":158},[42,159,160,161],"栈","队列","JavaScript",{"category":40,"tags":163},[42,164,161],"哈希表",{"category":5,"tags":166},[167,161,168],"ES6","Set",{"category":40,"tags":170},[40,171,172],"动态规划","背包问题",{"category":40,"tags":174},[40,175],"滑动窗口",{"category":40,"tags":177},[42,178,161],"链表",{"category":40,"tags":180},[40,181,161,182],"ACM","面试",{"category":40,"tags":184},[40,161,185],"数据类型转换",{"category":40,"tags":187},[42,188,178,189],"顺序表","TypeScript",{"category":5,"tags":191},[135,154,134,192],"渲染",{"category":5,"tags":194},[135,195,134,196],"富文本编辑","wangEditor",{"category":40,"tags":198},[199,40,178],"力扣",{"category":5,"tags":201},[202,203,204,91],"DNS","加密","网络安全",{"category":5,"tags":206},[135,207],"Axios",{"category":5,"tags":209},[135,207,189,210],"接口封装",{"category":5,"tags":212},[135,213,145],"JWT",{"category":152,"tags":215},[134,216,217,154,218],"画布","React","项目开发",{"category":17,"tags":220},[221],"日志",{"category":5,"tags":223},[224,225,226,227],"Neo4j","图数据库","中心度分析","PageRank",{"category":12,"tags":229},[230,231,232,233],"论文","机器学习","随机森林","保险欺诈",{"category":5,"tags":235},[236],"人工智能",{"category":5,"tags":238},[231,40,32],{"category":12,"tags":240},[241,242,243,244],"共识算法","最长链","区块链","算法设计",{"category":5,"tags":246},[161,247,248,135],"闭包","作用域",{"category":5,"tags":250},[14,138,251,252],"RSS","自动化",{"category":30,"tags":254},[89,90,91,255],"安装",{"category":30,"tags":257},[258,91,259],"MSYS2","开发环境",{"category":5,"tags":261},[262,263,264,265],"团队协作","Git","Commit规范","代码审查",{"category":30,"tags":267},[268,269,270],"oh-my-posh","终端美化","CLI",{"category":5,"tags":272},[273,274,275],"上下文工程","Agent","RAG",{"category":5,"tags":277},[278,279,280],"前端工程化","技术选型","工程基建",{"category":5,"tags":282},[275],{"category":5,"tags":284},[285,286],"SDD","规格驱动开发",{"category":5,"tags":288},[289],"neovim",{"category":5,"tags":291},[292],"技术写作",{"category":5,"tags":294},[295,32,296,89,297],"FastAPI","后端","工程实践",{"category":152,"tags":299},[274,300],"Harness Engineering",{"category":5,"tags":302},[303],"RFC",{"category":152,"tags":305},[274,300,275],{"category":152,"tags":307},[274],{"category":40,"tags":309},[199,40,161,310],"两数之和",{"category":40,"tags":312},[199,40,161,313],"双指针",{"category":40,"tags":315},[199,40,161,178],{"category":40,"tags":317},[199,40,161,175],{"category":40,"tags":319},[199,40,161,320],"回溯",{"category":5,"tags":322},[323,324,325,326],"分布式处理与计算","Spark","Scala","RDD",{"category":5,"tags":328},[323,329,330,331],"线性回归","逻辑回归","监督学习",{"category":5,"tags":333},[323,334,335,336],"数值优化","牛顿法","收敛性",{"category":5,"tags":338},[323,339,340,341],"PCA","数据降维","正则化",{"category":5,"tags":343},[323,344,345,346],"聚类","层次聚类","K-Means",{"category":5,"tags":348},[323,349,350,351],"随机模拟","统计推断","EM算法",{"category":5,"tags":353},[24],{"category":5,"tags":355},[24],{"category":5,"tags":357},[24],{"category":40,"tags":359},[42,360],"图论",{"category":40,"tags":362},[42,363,364],"树","二叉树",{"category":40,"tags":366},[42,160],{"category":40,"tags":368},[42],{"category":40,"tags":370},[42,159],{"category":40,"tags":372},[42,40,373],"复杂度分析",{"category":40,"tags":375},[42,43,178],{"category":40,"tags":377},[42,43,188],{"category":40,"tags":379},[42,380],"基础概念",{"category":17,"tags":382},[383,384,385],"随记","照片","高中",{"category":17,"tags":387},[383,388,389],"团建","战地",{"category":17,"tags":391},[383,392],"生活",{"category":17,"tags":394},[383,395],"文学",{"category":17,"tags":397},[383,398,399],"SCP","模因",{"category":17,"tags":401},[383,402,403],"画集","艺术",{"category":17,"tags":405},[14,406,383],"写作",{"category":17,"tags":408},[383,409,410],"音乐","摇滚",{"category":17,"tags":412},[383,392],{"category":17,"tags":414},[383,409],{"category":17,"tags":416},[383,35,392],{"category":17,"tags":418},[383,419,420],"同人","手书",{"category":17,"tags":422},[383,392],{"category":17,"tags":424},[383,392],{"category":17,"tags":426},[383,427],"植物",{"category":17,"tags":429},[383,430],"读书",{"category":17,"tags":432},[383,392],{"category":17,"tags":434},[383,392],{"category":17,"tags":436},[383,392],{"category":17,"tags":438},[383,392],{"category":17,"tags":440},[383,392],{"category":17,"tags":442},[383,392],{"category":17,"tags":444},[14,445,383],"一周年",{"category":17,"tags":447},[383,392],{"category":17,"tags":449},[383,392],{"category":17,"tags":451},[35,452,453],"开源组织","SITE-193",{"category":17,"tags":455},[383,392],{"category":17,"tags":457},[383,458],"年末",{"category":17,"tags":460},[383,392],{"category":17,"tags":462},[383,392],{"category":17,"tags":464},[14,17],{"category":17,"tags":466},[383,392],{"category":17,"tags":468},[383,392],{"category":17,"tags":470},[383,392],{"category":17,"tags":472},[383,392],{"category":17,"tags":474},[383,475,476],"游戏","Control",{"category":30,"tags":478},[479,480,481,482],"Quadim","图像处理","四叉树","Rust",{"category":17,"tags":484},[14,485],"上线纪念",{"category":17,"tags":487},[383,395],{"category":30,"tags":489},[203,490],"测试",{"category":17,"tags":492},[383],{"category":17,"tags":494},[383,392],{"category":17,"tags":496},[383],{"category":5,"tags":498},[40],{"category":5,"tags":500},[40],{"category":5,"tags":502},[40],{"category":5,"tags":504},[40],{"category":5,"tags":506},[40],[508,512,516,520,524,528,532,536,540,544,548,552,556,560,564,568,572,576,579,583,587,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646,650,654,658,662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754,758,762,766,770,774,778,782,786,790,794,798,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865,869,873,877,881,885,889,893,897,901,904,907,911,915,919,923,927,930,934,938,942,946,950,954,957,961,965,969,973,977,981,984,988,992,996,1000,1004,1007,1011,1015,1019,1023,1027,1031,1035,1039,1043,1047,1051,1055,1059,1063,1067,1071,1075,1079],{"path":509,"words":510,"published":511,"date":156},"\u002Fposts\u002F2024\u002F2024-06-25-liteloaderqqnt",1296,"2024-06-25 11:03:08",{"path":513,"words":514,"published":515,"date":156},"\u002Fposts\u002F2024\u002F2024-06-26-ip签名",0,"2024-06-26 22:53:53",{"path":517,"words":518,"published":519,"date":156},"\u002Fposts\u002F2024\u002F2024-06-29-何加盐中文互联网正在加速崩塌",4853,"2024-06-29 00:47:13",{"path":521,"words":522,"published":523,"date":156},"\u002Fposts\u002F2024\u002F2024-07-12-github-chart",270,"2024-07-12 20:02:50",{"path":525,"words":526,"published":527,"date":156},"\u002Fposts\u002F2024\u002F2024-07-14-访客数统计",192,"2024-07-24 01:34:28",{"path":529,"words":530,"published":531,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-广大选课脚本",110,"2024-07-26 01:34:28",{"path":533,"words":534,"published":535,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数学分析笔记其二",14,"2024-07-26 23:54:02",{"path":537,"words":538,"published":539,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数据结构复习其二",12856,"2024-07-26 02:48:08",{"path":541,"words":542,"published":543,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数据结构复习相关",32856,"2024-07-26 02:24:14",{"path":545,"words":546,"published":547,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-线性代数与空间解析几何知识点全汇总",6110,"2024-07-26 03:27:55",{"path":549,"words":550,"published":551,"date":156},"\u002Fposts\u002F2024\u002F2024-07-31-typora-picgo-兰空图床打造markdown写作环境",311,"2024-07-31 12:56:23",{"path":553,"words":554,"published":555,"date":156},"\u002Fposts\u002F2024\u002F2024-09-02-jupyter配置中文",441,"2024-09-02 23:49:05",{"path":557,"words":558,"published":559,"date":156},"\u002Fposts\u002F2024\u002F2024-09-02-自定义vscode背景图片",100,"2024-09-02 23:39:00",{"path":561,"words":562,"published":563,"date":156},"\u002Fposts\u002F2024\u002F2024-09-03-制作gzhu校园网路由器",1423,"2024-09-03 23:43:18",{"path":565,"words":566,"published":567,"date":156},"\u002Fposts\u002F2024\u002F2024-09-26-09-25-2024",136,"2024-09-26 00:49:26",{"path":569,"words":570,"published":571,"date":156},"\u002Fposts\u002F2024\u002F2024-11-04-创建一个网络包解码器分析devp2p协议",1943,"2024-11-04 16:45:19",{"path":573,"words":574,"published":575,"date":156},"\u002Fposts\u002F2024\u002F2025-03-09-2024一些笔记常微分",16,"2024-12-09 22:51:00",{"path":577,"words":574,"published":578,"date":156},"\u002Fposts\u002F2024\u002F2025-03-09-2024一些笔记概率论","2025-03-09 22:51:00",{"path":580,"words":581,"published":582,"date":156},"\u002Fposts\u002F2025\u002F2025-03-01-windows下释放docker占用的wsl空间",164,"2025-03-01 13:54:15",{"path":584,"words":585,"published":586,"date":156},"\u002Fposts\u002F2025\u002F2025-03-01-爬虫实战-爬取广州大学课程表",774,"2025-03-01 14:55:48",{"path":588,"words":530,"published":589,"date":156},"\u002Fposts\u002F2025\u002F2025-04-03-hexo集成gitalk的问题","2025-04-03 14:26:34",{"path":591,"words":592,"published":593,"date":156},"\u002Fposts\u002F2025\u002F2025-09-22-记一次配置obsidian配合hexo写博客",92,"2025-09-22 16:47:52",{"path":595,"words":596,"published":597,"date":156},"\u002Fposts\u002F2025\u002F2025-10-24-10-20课题",204,"2025-10-24 08:15:01",{"path":599,"words":600,"published":601,"date":156},"\u002Fposts\u002F2025\u002F2025-11-02-组会朝花夕拾",501,"2025-11-02 18:56:59",{"path":603,"words":604,"published":605,"date":156},"\u002Fposts\u002F2025\u002F2025-11-05-基于随机加权推断模型im的参数估计算法",481,"2025-11-05 20:51:41",{"path":607,"words":608,"published":609,"date":156},"\u002Fposts\u002F2025\u002F2025-11-09-关于软考高项网规",884,"2025-11-09 19:54:52",{"path":611,"words":612,"published":613,"date":156},"\u002Fposts\u002F2025\u002F2025-11-17-arch-linux运行appimage相关",365,"2025-11-17 09:59:59",{"path":615,"words":616,"published":617,"date":156},"\u002Fposts\u002F2025\u002F2025-11-19-相关概念",2058,"2025-11-19 11:06:20",{"path":619,"words":620,"published":621,"date":156},"\u002Fposts\u002F2025\u002F2025-11-21-web可视化实践canvas",6393,"2025-11-21 14:50:48",{"path":623,"words":624,"published":625,"date":156},"\u002Fposts\u002F2025\u002F2025-11-22-使用-github-actions-自动部署基于vite的项目到-github-pages",272,"2025-11-23 01:59:24",{"path":627,"words":628,"published":629,"date":156},"\u002Fposts\u002F2025\u002F2025-11-22-关于前端包管理器npmpnpmyarn和bun",4890,"2025-11-22 21:21:15",{"path":631,"words":632,"published":633,"date":156},"\u002Fposts\u002F2025\u002F2025-11-23-undo-redo-机制具体实现",7839,"2025-11-23 19:15:00",{"path":635,"words":636,"published":637,"date":156},"\u002Fposts\u002F2025\u002F2025-11-27-前端安全-关于xss与crsf",1866,"2025-11-28 02:05:25",{"path":639,"words":640,"published":641,"date":156},"\u002Fposts\u002F2025\u002F2025-12-05-现代协同-2d-画布编辑器pixijs-v8",4285,"2025-12-05 02:00:16",{"path":643,"words":644,"published":645,"date":156},"\u002Fposts\u002F2025\u002F2025-12-07-杂谈-课题组系统设计",3710,"2025-12-07 21:09:33",{"path":647,"words":648,"published":649,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-javascript中的数组方法与栈stack和队列queue的实现",474,"2025-11-29 16:58:15",{"path":651,"words":652,"published":653,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于javascript-实现哈希表",189,"2025-11-27 11:31:39",{"path":655,"words":656,"published":657,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于javascript的set方法",332,"2025-12-25 15:26:18",{"path":659,"words":660,"published":661,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于动态规划(背包问题为例)",1238,"2025-11-17 18:24:04",{"path":663,"words":664,"published":665,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于滑动窗口",712,"2025-11-20 15:04:40",{"path":667,"words":668,"published":669,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于链表(javascript)",500,"2025-11-25 13:00:48",{"path":671,"words":672,"published":673,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-面试算法acm模式构建构建输入输出模板",2051,"2025-12-25 23:09:45",{"path":675,"words":676,"published":677,"date":156},"\u002Fposts\u002F2025\u002F2025-12-26-javascript-数字数组字符串的处理",483,"2025-12-26 11:20:25",{"path":679,"words":680,"published":681,"date":156},"\u002Fposts\u002F2025\u002F2025-12-26-javascripttypescript-的顺序表链表实现",446,"2025-12-26 12:16:12",{"path":683,"words":684,"published":685,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-前端画布设计vol-1-实现基础yuan素渲染和状态控制",2136,"2025-12-28 01:23:08",{"path":687,"words":688,"published":689,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-前端画布设计vol-2-实现富文本编辑",1838,"2025-12-28 02:58:47",{"path":691,"words":692,"published":693,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-算法刷题-关于链表操作",2135,"2025-12-27 16:12:42",{"path":695,"words":696,"published":697,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-配置dnscrypt-proxy实现加密dns服务windows",1899,"2025-11-15 01:06:37",{"path":699,"words":700,"published":701,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-关于网络请求xhrajaxfetchaxios",7788,"2025-10-28 15:48:46",{"path":703,"words":704,"published":705,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-接口封装与请求规范axios为例",2373,"2025-12-29 01:01:18",{"path":707,"words":708,"published":709,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-身份验证管理-基于-jwt-token-的实现",2709,"2025-11-23 22:04:41",{"path":711,"words":712,"published":713,"date":156},"\u002Fposts\u002F2025\u002F2025-12-29-记canvas画布项目开发",6254,"2025-12-29 04:52:15",{"path":715,"words":716,"published":717,"date":156},"\u002Fposts\u002F2025\u002Fabout-site",116,"2025-03-31 16:44:24",{"path":719,"words":720,"published":721,"date":156},"\u002Fposts\u002F2025\u002F使用neo4j图数据科学库gds进行中心度分析",143,"2025-04-02 23:37:24",{"path":723,"words":724,"published":725,"date":156},"\u002Fposts\u002F2026\u002F2026-01-03-论文实训草稿",10445,"2026-01-03 14:10:49",{"path":727,"words":728,"published":729,"date":156},"\u002Fposts\u002F2026\u002F2026-01-06-人工智能导论",11461,"2026-01-07 03:25:49",{"path":731,"words":732,"published":733,"date":156},"\u002Fposts\u002F2026\u002F2026-01-07-机器学习相关算法",82,"2026-01-08 02:28:13",{"path":735,"words":736,"published":737,"date":156},"\u002Fposts\u002F2026\u002F2026-01-16-关于低复杂度最长链共识算法设计",4466,"2026-01-16 10:33:23",{"path":739,"words":740,"published":741,"date":156},"\u002Fposts\u002F2026\u002F2026-01-19-杂记2026-01-19",5754,"2026-01-20 01:03:26",{"path":743,"words":744,"published":745,"date":156},"\u002Fposts\u002F2026\u002F2026-01-22-github-action-自动同步博客到-github-主页",1069,"2026-01-22 16:31:47",{"path":747,"words":748,"published":749,"date":156},"\u002Fposts\u002F2026\u002F2026-03-01-windows-wsl安装docker",257,"2026-03-01 20:55:31",{"path":751,"words":752,"published":753,"date":156},"\u002Fposts\u002F2026\u002F2026-03-14-关于-msys2",701,"2026-03-15 03:05:04",{"path":755,"words":756,"published":757,"date":156},"\u002Fposts\u002F2026\u002F2026-03-28-团队项目协作规范随记",2419,"2026-03-29 05:33:50",{"path":759,"words":760,"published":761,"date":156},"\u002Fposts\u002F2026\u002F2026-03-29-oh-my-posh配置分享",104,"2026-03-29 16:34:43",{"path":763,"words":764,"published":765,"date":156},"\u002Fposts\u002F2026\u002F2026-06-13-从上下文工程到-agent-harness-engineering",8840,"2026-06-13 21:06:20",{"path":767,"words":768,"published":769,"date":156},"\u002Fposts\u002F2026\u002F2026-07-13-简谈前端基建质量标准与ai友好建设",3814,"2026-07-13 21:06:20",{"path":771,"words":772,"published":773,"date":156},"\u002Fposts\u002F2026\u002F2026-07-15-agentic-rag-系统实践",13357,"2026-07-15 21:06:20",{"path":775,"words":776,"published":777,"date":156},"\u002Fposts\u002F2026\u002F2026-07-18-简谈sdd规范驱动开发-copy",4476,"2026-07-18 11:06:20",{"path":779,"words":780,"published":781,"date":156},"\u002Fposts\u002F2026\u002F2026-07-20-个人neovim配置分享",366,"2026-07-22 13:46:50",{"path":783,"words":784,"published":785,"date":156},"\u002Fposts\u002F2026\u002F2026-07-20-关于技术写作-设计文档",6763,"2026-07-20 13:46:50",{"path":787,"words":788,"published":789,"date":156},"\u002Fposts\u002F2026\u002F2026-07-29-fastapi-工程实践随记",3417,"2026-07-29 04:58:34",{"path":791,"words":792,"published":793,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-06-19-rfc-liskin_code_agent",3563,"2026-06-19 15:18:20",{"path":795,"words":796,"published":797,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-07-25-rfc-glushkov_ogas",13461,"2026-07-28 23:46:50",{"path":799,"words":800,"published":793,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-08-03-adr-ogas-arkhiv",2698,{"path":802,"words":803,"published":804,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002Frag\u002F2026-08-12-arkhiv_rag-vol-1",4366,"2026-08-12 15:18:20",{"path":806,"words":807,"published":808,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-25-力扣百题速练javascripttypescriptvol-1",3108,"2025-12-25 13:57:08",{"path":810,"words":811,"published":812,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-26-力扣百题速练javascripttypescriptvol-2",3185,"2025-12-26 13:57:08",{"path":814,"words":815,"published":816,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-28-力扣百题速练javascripttypescriptvol-3",2533,"2025-12-29 02:15:44",{"path":818,"words":819,"published":820,"date":156},"\u002Fposts\u002Fleetcode\u002F2026-01-17-力扣百题速练javascripttypescriptvol-4",3024,"2026-01-17 22:53:01",{"path":822,"words":823,"published":824,"date":156},"\u002Fposts\u002Fleetcode\u002F2026-01-19-力扣百题速练javascripttypescriptvol-5",293,"2026-01-19 15:15:12",{"path":826,"words":827,"published":828,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算spark系统与scala语言",4320,"2026-07-06 14:10:49",{"path":830,"words":831,"published":832,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算分类与回归分析",2081,"2026-07-07 12:40:29",{"path":834,"words":835,"published":836,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算数值优化方法",2182,"2026-07-07 13:50:29",{"path":838,"words":839,"published":840,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算数据降维",1583,"2026-07-07 21:50:29",{"path":842,"words":843,"published":844,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算聚类分析",1882,"2026-07-07 16:50:29",{"path":846,"words":847,"published":848,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算随机模拟与统计推断",2433,"2026-07-06 22:40:29",{"path":850,"words":851,"published":852,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-14-数据可视化-基本图像",10011,"2026-06-14 20:18:20",{"path":854,"words":855,"published":856,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-14-数据可视化-概论",10030,"2026-06-14 15:18:20",{"path":858,"words":859,"published":860,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-15-数据可视化-可视化库",2032,"2026-06-15 20:18:20",{"path":862,"words":863,"published":864,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-图",5451,"2025-04-15 20:48:06",{"path":866,"words":867,"published":868,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-树",4211,"2025-04-30 02:19:06",{"path":870,"words":871,"published":872,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-队列",921,"2025-04-11 15:30:08",{"path":874,"words":875,"published":876,"date":156},"\u002Fposts\u002F数据结构\u002F关于数据结构的一些想法",456,"2025-04-04 19:13:49",{"path":878,"words":879,"published":880,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-栈",920,"2025-04-18 00:17:37",{"path":882,"words":883,"published":884,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-算法复杂度",2153,"2025-04-05 16:09:55",{"path":886,"words":887,"published":888,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-线性表链表",4572,"2025-04-06 00:24:40",{"path":890,"words":891,"published":892,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-线性表顺序表",4191,"2025-04-05 22:09:59",{"path":894,"words":895,"published":896,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-绪论",2881,"2025-04-05 11:31:22",{"path":898,"words":899,"published":156,"date":900},"\u002Fposts\u002F杂记\u002F2023-12-26-2023年12月26日",7,"2023-12-26 23:51:33",{"path":902,"words":899,"published":156,"date":903},"\u002Fposts\u002F杂记\u002F2024-01-01-2024团建","2024-01-01 01:51:27",{"path":905,"words":581,"published":156,"date":906},"\u002Fposts\u002F杂记\u002F2024-01-09-随记","2024-01-09 20:50:35",{"path":908,"words":909,"published":156,"date":910},"\u002Fposts\u002F杂记\u002F2024-03-12-花名",5275,"2024-03-12 16:04:23",{"path":912,"words":913,"published":156,"date":914},"\u002Fposts\u002F杂记\u002F2024-04-15-逆模因",1353,"2024-04-15 00:26:16",{"path":916,"words":917,"published":156,"date":918},"\u002Fposts\u002F杂记\u002F2024-05-03-艺作",27,"2024-05-03 00:01:00",{"path":920,"words":921,"published":156,"date":922},"\u002Fposts\u002F杂记\u002F2024-05-21-关于博客",1720,"2024-02-21 23:21:11",{"path":924,"words":925,"published":156,"date":926},"\u002Fposts\u002F杂记\u002F2024-06-20-dnvrc维克多崔专访-2023",2036,"2024-06-20 00:28:39",{"path":928,"words":760,"published":156,"date":929},"\u002Fposts\u002F杂记\u002F2024-06-25-6月25日随记","2024-06-25 12:46:36",{"path":931,"words":932,"published":156,"date":933},"\u002Fposts\u002F杂记\u002F2024-06-25-歌名-想見星星",148,"2024-06-25 22:47:59",{"path":935,"words":936,"published":156,"date":937},"\u002Fposts\u002F杂记\u002F2024-07-11-桂花岗",6,"2024-07-11 00:28:17",{"path":939,"words":940,"published":156,"date":941},"\u002Fposts\u002F杂记\u002F2024-07-15-rolling-bocci",9,"2024-07-15 21:25:56",{"path":943,"words":944,"published":156,"date":945},"\u002Fposts\u002F杂记\u002F2024-07-22-七月九日",34,"2024-07-09 17:54:23",{"path":947,"words":948,"published":156,"date":949},"\u002Fposts\u002F杂记\u002F2024-07-22-六月随记",1052,"2024-07-22 01:03:19",{"path":951,"words":952,"published":156,"date":953},"\u002Fposts\u002F杂记\u002F2024-07-22-石菖蒲",41,"2024-07-10 01:26:05",{"path":955,"words":514,"published":156,"date":956},"\u002Fposts\u002F杂记\u002F2024-07-23-新书","2024-07-23 01:05:49",{"path":958,"words":959,"published":156,"date":960},"\u002Fposts\u002F杂记\u002F2024-07-29-年前",74,"2024-07-29 23:59:07",{"path":962,"words":963,"published":156,"date":964},"\u002Fposts\u002F杂记\u002F2024-07-30-周边",138,"2024-07-30 02:03:23",{"path":966,"words":967,"published":156,"date":968},"\u002Fposts\u002F杂记\u002F2024-07-31-2024-7-31日",185,"2024-07-31 01:21:52",{"path":970,"words":971,"published":156,"date":972},"\u002Fposts\u002F杂记\u002F2024-08-02-八月",1710,"2024-08-30 00:31:02",{"path":974,"words":975,"published":156,"date":976},"\u002Fposts\u002F杂记\u002F2024-09-01-九月",1484,"2024-09-26 16:30:15",{"path":978,"words":979,"published":156,"date":980},"\u002Fposts\u002F杂记\u002F2024-09-08-2024年9月8日",97,"2024-09-08 13:59:36",{"path":982,"words":514,"published":156,"date":983},"\u002Fposts\u002F杂记\u002F2024-09-19-博客站的一周年","2024-09-18 23:36:24",{"path":985,"words":986,"published":156,"date":987},"\u002Fposts\u002F杂记\u002F2024-10-03-十月",1028,"2024-10-31 23:54:27",{"path":989,"words":990,"published":156,"date":991},"\u002Fposts\u002F杂记\u002F2024-11-04-十一月",2134,"2024-11-30 00:04:39",{"path":993,"words":994,"published":156,"date":995},"\u002Fposts\u002F杂记\u002F2024-11-10-gzhu-site-193",80,"2024-11-10 19:19:12",{"path":997,"words":998,"published":156,"date":999},"\u002Fposts\u002F杂记\u002F2024-12-01-十二月",455,"2024-12-30 23:13:47",{"path":1001,"words":1002,"published":156,"date":1003},"\u002Fposts\u002F杂记\u002F2024-12-21-年末",23,"2024-12-21 23:21:49",{"path":1005,"words":522,"published":156,"date":1006},"\u002Fposts\u002F杂记\u002F2025-01-30-一月","2025-01-30 23:44:41",{"path":1008,"words":1009,"published":156,"date":1010},"\u002Fposts\u002F杂记\u002F2025-03-01-二月",224,"2025-02-28 00:11:08",{"path":1012,"words":1013,"published":156,"date":1014},"\u002Fposts\u002F杂记\u002F2025-03-01-博客杂谈",344,"2025-03-01 16:03:18",{"path":1016,"words":1017,"published":156,"date":1018},"\u002Fposts\u002F杂记\u002F2025-03-05-三月",2090,"2025-03-05 19:17:28",{"path":1020,"words":1021,"published":156,"date":1022},"\u002Fposts\u002F杂记\u002F2025-07-10-七月",361,"2025-07-10 22:04:32",{"path":1024,"words":1025,"published":156,"date":1026},"\u002Fposts\u002F杂记\u002F2025-09-21-九月",781,"2025-09-21 20:53:37",{"path":1028,"words":1029,"published":156,"date":1030},"\u002Fposts\u002F杂记\u002F2025-10-09-十月",591,"2025-10-09 00:35:07",{"path":1032,"words":1033,"published":156,"date":1034},"\u002Fposts\u002F杂记\u002Fcontrol",13,"2023-09-25 13:03:59",{"path":1036,"words":1037,"published":156,"date":1038},"\u002Fposts\u002F杂记\u002Fquadim四叉树图像处理",1094,"2023-10-21 11:27:06",{"path":1040,"words":1041,"published":156,"date":1042},"\u002Fposts\u002F杂记\u002Fsuccess",24,"2023-09-22 15:59:07",{"path":1044,"words":1045,"published":156,"date":1046},"\u002Fposts\u002F杂记\u002F三光年",295,"2023-11-18 04:18:40",{"path":1048,"words":1049,"published":156,"date":1050},"\u002Fposts\u002F杂记\u002F加密测试",961,"2023-11-21 14:24:01",{"path":1052,"words":1053,"published":156,"date":1054},"\u002Fposts\u002F杂记\u002F啊啊啊啊啊啊啊",54,"2023-09-20 17:29:33",{"path":1056,"words":1057,"published":156,"date":1058},"\u002Fposts\u002F杂记\u002F杂谈",124,"2023-09-25 23:11:32",{"path":1060,"words":1061,"published":156,"date":1062},"\u002Fposts\u002F杂记\u002F艹",25,"2023-10-21 17:40:43",{"path":1064,"words":1065,"published":1066,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习卷积神经网络",3168,"2026-06-07 11:23:08",{"path":1068,"words":1069,"published":1070,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习循环神经网络",2348,"2026-06-07 11:33:08",{"path":1072,"words":1073,"published":1074,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习改进学习方法",3360,"2026-06-07 10:13:08",{"path":1076,"words":1077,"published":1078,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习深度生成模型",2727,"2026-06-07 11:43:08",{"path":1080,"words":1081,"published":1082,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习神经网络基础",3205,"2026-06-07 10:03:08",{"id":1084,"title":1085,"abbrlink":156,"body":1086,"category":5,"cover":1178,"date":156,"description":1757,"extension":1425,"mathjax":1758,"meta":1759,"navigation":1758,"path":775,"published":777,"readingMinutes":1763,"seo":1764,"stem":1765,"sticky":156,"swiper_index":156,"tags":1766,"updated":156,"words":776,"__hash__":1767},"posts\u002Fposts\u002F2026\u002F2026-07-18-简谈SDD（规范驱动开发） copy.md","2026-07-18-简谈SDD（规格驱动开发）",{"type":1087,"value":1088,"toc":1734},"minimark",[1089,1094,1098,1101,1130,1133,1137,1140,1143,1154,1157,1165,1168,1172,1179,1183,1195,1198,1202,1212,1215,1221,1247,1250,1265,1403,1406,1412,1415,1420,1428,1433,1439,1445,1451,1474,1483,1489,1495,1497,1501,1504,1511,1529,1544,1557,1560,1568,1572,1575,1585,1602,1608,1618,1622,1629,1632,1642,1645,1647,1651,1654,1658,1661,1664,1671,1674,1678,1681,1688,1695,1699,1702,1705,1711,1714,1717,1720,1723,1726,1729],[1090,1091,1093],"h2",{"id":1092},"关于规格驱动开发sdd","关于规格驱动开发（SDD）",[1095,1096,1097],"p",{},"规格驱动开发（SDD）是一种以“规范文档”为核心的工程方法论。它和普通的 AI Coding 最大的区别在于普通 AI Coding 更多是在“帮开发者写一段代码”，而 SDD 更接近于“让 Coding Agent 基于一份完整的规格说明，主动完成一项开发任务”。",[1095,1099,1100],{},"SDD的核心理念可以概括为：",[1102,1103,1104,1112,1118,1124],"ul",{},[1105,1106,1107,1111],"li",{},[1108,1109,1110],"strong",{},"规范第一，代码第二","：规范不再是代码的附属文档，而是开发的起点和核心",[1105,1113,1114,1117],{},[1108,1115,1116],{},"意图驱动","：开发活动应以“业务目标和用户需求”为基础",[1105,1119,1120,1123],{},[1108,1121,1122],{},"可执行规格","：规格文档可以自动生成代码、API合约和测试用例",[1105,1125,1126,1129],{},[1108,1127,1128],{},"持续精炼","：规格文档在整个生命周期中不断完善",[1095,1131,1132],{},"也就是说，SDD 的核心是先把需求、技术方案、边界条件、验收标准等内容先写清楚，再让 Coding Agent 基于这些上层信息去理解需求、拆分任务、修改代码，最终交付一个可以编译通过、主体功能可用的版本。与传统开发相比，SDD实现了权力反转：过去是“代码为王”，现在是“代码服务规格”。规格足够精确时，它可以直接生成计划与实现，减少意图与落地之间的鸿沟。",[1090,1134,1136],{"id":1135},"为什么推荐-sdd-工作模式","为什么推荐 SDD 工作模式",[1095,1138,1139],{},"当前大部分软件开发，本质上仍然是一种流水线模式。对很多研发来说，每天的工作流程大致是：从产品、设计或上游研发那里获取需求文档，理解需求之后进入开发阶段，最后再交付一个可以测试的版本给 QA。这个过程会不断循环，构成了日常研发工作的基本节奏。在这种模式下，研发真正追求的是两件事：",[1095,1141,1142],{},"第一，更快地处理需求。\n第二，同时处理更多事情。",[1095,1144,1145,1146,1149,1150,1153],{},"而 SDD 工作模式刚好能够提升这两点。其方法论主要有",[1108,1147,1148],{},"调研先行","（在“古法编程”里也有这个基本要求hhh）和",[1108,1151,1152],{},"并行开发","（开一堆shell，发挥 SDD 工作模式并行处理能力的优势）",[1095,1155,1156],{},"简单来说的话，SDD实践的话我觉得要做到两点：",[1102,1158,1159,1162],{},[1105,1160,1161],{},"先调研，先增加自己的 Context，再写 Spec，再指挥 Agent 开发。",[1105,1163,1164],{},"主需求 + 优化需求，或者 大需求 + 小需求的拆分，让主需求正在由 Agent 实现的时候，研发可以同时让另一个 Agent 做一些相对独立的事情",[1166,1167],"hr",{},[1090,1169,1171],{"id":1170},"sdd-主流程图","SDD 主流程图",[1095,1173,1174],{},[1175,1176],"img",{"alt":1177,"src":1178},"","https:\u002F\u002Fpica.zhimg.com\u002Fv2-7bbc59155421adef9344ea8319ff616c_r.jpg",[1090,1180,1182],{"id":1181},"spec-kit-框架-sdd-的实践工具","Spec Kit 框架: SDD 的实践工具",[1184,1185,1186],"blockquote",{},[1095,1187,1188,1189],{},"文档站点:",[1190,1191,1192],"a",{"href":1192,"rel":1193},"https:\u002F\u002Fgithub.github.io\u002Fspec-kit\u002F",[1194],"nofollow",[1095,1196,1197],{},"Spec Kit 是 GitHub 官方开源的 SDD 工具包，把 AI 辅助编程组织成一套可控的结构化流程。它做三件事:与 Copilot、Claude、Gemini 等主流 Agent 集成;把自然语言需求逐层解析成规格、方案和实现计划;内置一套\"宪法式\"架构原则约束整个开发流程。",[1199,1200,1201],"h3",{"id":1201},"安装与初始化",[1203,1204,1209],"pre",{"className":1205,"code":1207,"language":1208,"meta":1177},[1206],"language-bash","# 安装 CLI\nuv tool install specify-cli --from git+https:\u002F\u002Fgithub.com\u002Fgithub\u002Fspec-kit.git@vX.Y.Z\n\n# 初始化项目\nspecify init my-project --integration copilot\ncd my-project\n","bash",[1210,1211,1207],"code",{"__ignoreMap":1177},[1095,1213,1214],{},"升级相关命令:",[1203,1216,1219],{"className":1217,"code":1218,"language":1208,"meta":1177},[1206],"specify self check              # 只读检查是否有新版\nspecify self upgrade --dry-run  # 预览升级动作\nspecify self upgrade            # 就地升级到最新稳定版\nspecify self upgrade --tag vX.Y.Z[suffix]  # 锁定到指定发布标签\n",[1210,1220,1218],{"__ignoreMap":1177},[1095,1222,1223,1226,1227,1230,1231,1234,1235,1238,1239,1242,1243,1246],{},[1210,1224,1225],{},"specify self upgrade"," 会像 ",[1210,1228,1229],{},"pip install -U"," 一样直接执行，底层对 ",[1210,1232,1233],{},"uv tool"," 安装走 ",[1210,1236,1237],{},"uv tool install --force","，因此锁定 dev、alpha\u002Fbeta\u002Frc 等标签同样有效;",[1210,1240,1241],{},"uvx"," 临时运行和源码检出会被自动识别，只给建议不实际安装。需要限时可设 ",[1210,1244,1245],{},"SPECIFY_UPGRADE_TIMEOUT_SECS","。",[1199,1248,1249],{"id":1249},"完整工作流",[1095,1251,1252,1253,1256,1257,1260,1261,1264],{},"Spec Kit 把开发拆成七个前后衔接的步骤，每一步对应一个斜杠命令(大多数助手用 ",[1210,1254,1255],{},"\u002Fspeckit.*",";Codex CLI 技能模式用 ",[1210,1258,1259],{},"$speckit-*",";Copilot CLI 用 ",[1210,1262,1263],{},"\u002Fagents"," 选择助手)。",[1266,1267,1268,1287],"table",{},[1269,1270,1271],"thead",{},[1272,1273,1274,1278,1281,1284],"tr",{},[1275,1276,1277],"th",{},"步骤",[1275,1279,1280],{},"命令",[1275,1282,1283],{},"作用",[1275,1285,1286],{},"产物",[1288,1289,1290,1307,1323,1339,1355,1371,1387],"tbody",{},[1272,1291,1292,1296,1301,1304],{},[1293,1294,1295],"td",{},"1",[1293,1297,1298],{},[1210,1299,1300],{},"\u002Fspeckit.constitution",[1293,1302,1303],{},"确立代码质量、测试、体验、性能等全局准则",[1293,1305,1306],{},"constitution.md",[1272,1308,1309,1312,1317,1320],{},[1293,1310,1311],{},"2",[1293,1313,1314],{},[1210,1315,1316],{},"\u002Fspeckit.specify",[1293,1318,1319],{},"只描述\"做什么\"和\"为什么\"，不谈技术栈",[1293,1321,1322],{},"spec.md",[1272,1324,1325,1328,1333,1336],{},[1293,1326,1327],{},"3",[1293,1329,1330],{},[1210,1331,1332],{},"\u002Fspeckit.clarify",[1293,1334,1335],{},"自动追问不确定点，把返工前置为提问",[1293,1337,1338],{},"更新 spec.md",[1272,1340,1341,1344,1349,1352],{},[1293,1342,1343],{},"4",[1293,1345,1346],{},[1210,1347,1348],{},"\u002Fspeckit.plan",[1293,1350,1351],{},"给定技术栈，生成架构与实施计划",[1293,1353,1354],{},"plan.md \u002F data-model.md \u002F contracts\u002F",[1272,1356,1357,1360,1365,1368],{},[1293,1358,1359],{},"5",[1293,1361,1362],{},[1210,1363,1364],{},"\u002Fspeckit.tasks",[1293,1366,1367],{},"拆成带依赖关系的可执行任务清单",[1293,1369,1370],{},"tasks.md",[1272,1372,1373,1376,1381,1384],{},[1293,1374,1375],{},"6",[1293,1377,1378],{},[1210,1379,1380],{},"\u002Fspeckit.analyze",[1293,1382,1383],{},"实现前校验规格\u002F计划\u002F任务是否一致",[1293,1385,1386],{},"冲突报告",[1272,1388,1389,1392,1397,1400],{},[1293,1390,1391],{},"7",[1293,1393,1394],{},[1210,1395,1396],{},"\u002Fspeckit.implement",[1293,1398,1399],{},"按 TDD 节奏逐个执行任务、生成代码",[1293,1401,1402],{},"源码",[1095,1404,1405],{},"一个典型的照片管理应用，四条核心命令大致长这样:",[1203,1407,1410],{"className":1408,"code":1409,"language":1208,"meta":1177},[1206],"\u002Fspeckit.constitution Create principles focused on code quality， testing standards， UX consistency， and performance\n\u002Fspeckit.specify Build an app to organize photos into albums grouped by date， reorderable by drag-and-drop， no nested albums， tile preview inside each album.\n\u002Fspeckit.plan Use Vite with minimal libraries， vanilla HTML\u002FCSS\u002FJS， images stay local， metadata in a local SQLite DB.\n\u002Fspeckit.tasks\n\u002Fspeckit.implement\n",[1210,1411,1409],{"__ignoreMap":1177},[1199,1413,1414],{"id":1414},"各阶段产物示例",[1095,1416,1417,1419],{},[1108,1418,1306],{},"——把不可协商的规则固化下来，Agent 生成代码时自动遵守:",[1203,1421,1426],{"className":1422,"code":1424,"language":1425,"meta":1177},[1423],"language-md","### 代码质量\n\n- 每个 PR 必须通过自动化 lint \u002F 格式化，合并前强制检查\n- 公共 API 保持最小化，附带示例和输入\u002F输出文档\n- 复杂或跨文件的架构决策必须在 PR 里附简短设计说明\n\n### 测试标准\n\n- 鼓励测试优先;每个新功能至少含单元测试 + 跨组件集成测试\n- CI 跑单元\u002F集成\u002F冒烟测试，失败不得合并\n- 不稳定测试立即标记、隔离、修复，不得长期忽略\n","md",[1210,1427,1424],{"__ignoreMap":1177},[1095,1429,1430,1432],{},[1108,1431,1322],{},"——把需求规格化为带优先级和验收场景的用户故事:",[1203,1434,1437],{"className":1435,"code":1436,"language":1425,"meta":1177},[1423],"### 用户故事 1:按日期创建和查看相册 (P1)\n\n作为用户，我希望照片自动按日期分组，以便按日\u002F月浏览。\n验收场景:\n\n1. 给定 2025-11-06 和 2025-11-07 的照片，打开应用应看到两个对应日期的相册\n2. 无时间戳的照片归入\"未知日期\"相册，并支持手动指定\n",[1210,1438,1436],{"__ignoreMap":1177},[1095,1440,1441,1444],{},[1108,1442,1443],{},"plan.md","——产出项目结构与分阶段实施计划:",[1203,1446,1449],{"className":1447,"code":1448,"language":1425,"meta":1177},[1423],"specs\u002F1-organize-photos\u002F\n├── plan.md research.md spec.md\n├── data-model.md quickstart.md\n├── contracts\u002Fapi.md\n└── tasks.md (由 \u002Fspeckit.tasks 生成)\n\n## Phase 2:实施计划\n\n- [ ] T004 用 sql.js 实现数据库层 + 文件持久化垫片 [性能]\n- [ ] T010 主相册视图，支持拖放排序和键盘备用方案 [体验][测试]\n- [ ] T011 相册视图，平铺网格 + 虚拟化 + 增量加载 [性能][测试]\n",[1210,1450,1448],{"__ignoreMap":1177},[1095,1452,1453,1454,1457,1458,1461,1462,1465,1466,1469,1470,1473],{},"配套的 ",[1210,1455,1456],{},"contracts\u002Fapi.md"," 定义本地 IPC 接口(渲染进程 ↔ 主进程)，",[1210,1459,1460],{},"data-model.md"," 定义实体结构，例如 ",[1210,1463,1464],{},"Photo"," 含 ",[1210,1467,1468],{},"id \u002F source_path \u002F timestamp \u002F checksum"," 等字段，并在 ",[1210,1471,1472],{},"(checksum， user_id)"," 上加唯一约束去重。",[1095,1475,1476,1478,1479,1482],{},[1108,1477,1370],{},"——按阶段拆分、标注依赖和并行标记 ",[1210,1480,1481],{},"[P]",":",[1203,1484,1487],{"className":1485,"code":1486,"language":1425,"meta":1177},[1423],"## 阶段 1:设置\n\n- [x] T001 初始化项目骨架(package.json、Vite、Electron 入口)\n- [x] T002 CI 骨架 + lint\u002Ftest 步骤 [代码质量]\n- [x] T004 Vitest \u002F Playwright 配置 [测试]\n\n## 阶段 2:基础\n\n- [ ] T007 [P] 用 sql.js 实现数据库模式和迁移表，提供 initDb()\n",[1210,1488,1486],{"__ignoreMap":1177},[1095,1490,1491,1492,1494],{},"最后 ",[1210,1493,1396],{}," 按任务顺序逐个执行，严格走 TDD，把规格真正落成代码。",[1166,1496],{},[1090,1498,1500],{"id":1499},"monorepo中的-sdd-实践","monorepo中的 SDD 实践",[1095,1502,1503],{},"到了 monorepo——尤其是那种多运行时、web 和其他端共用一堆 packages 的仓库——第一个绕不开的问题就是:spec 到底该放哪。",[1095,1505,1506,1507,1510],{},"目前个人比较推荐的一种分法是按信息的",[1108,1508,1509],{},"归属维度","来切，全局 spec 集中存放，包级 README 就近归档。",[1095,1512,1513,1514,1517,1518,1521,1522,1521,1525,1528],{},"项目中spec文档描述的东西会有两种区分，「一个功能 \u002F 一次架构决策」或者「一个包的内部约定」。横跨多个包的功能规格，以及架构层面的决策，维度是「功能」和「架构」，不属于任何单一的包，集中放在根目录的 ",[1210,1515,1516],{},"specs\u002F"," 下。一个跨端分享功能会同时牵动 ",[1210,1519,1520],{},"apps\u002Fweb","、",[1210,1523,1524],{},"packages\u002Ffeatures",[1210,1526,1527],{},"packages\u002Fplatform","，没法「属于」其中哪一个，那就放在在中立的顶层。",[1095,1530,1531,1532,1535,1536,1539,1540,1543],{},"而单个包的内部契约，天然属于那个包，就近放进包内的 ",[1210,1533,1534],{},"README.md","。比如 ",[1210,1537,1538],{},"packages\u002Fplatform\u002FREADME.md"," 写清楚 PlatformAPI 的接口约定，",[1210,1541,1542],{},"packages\u002Fcore\u002FREADME.md"," 说明 store 的实体缓存规则。这些都可以作为包的说明，跟着包走，改包的人一眼就能看到，不用跑到十万八千里外的根目录去翻。",[1095,1545,1546,1547,1550,1551,1553,1554,1556],{},"两者之间用链接互相指过去就行:根目录的 ",[1210,1548,1549],{},"specs\u002Ffeatures\u002Fshare-page\u002Fdesign.md"," 里链到 ",[1210,1552,1520],{}," 和 ",[1210,1555,1524],{}," 的具体位置;包的 README 再反向链回相关的 spec。这样无论你是从功能视角还是从包视角进来，都能顺着链接摸到另一头。",[1095,1558,1559],{},"落到目录上大概是这样:",[1203,1561,1566],{"className":1562,"code":1564,"language":1565},[1563],"language-text","repo\u002F\n├── specs\u002F\n│   ├── features\u002F\n│   │   └── share-page\u002F\n│   │       ├── requirements.md   # 要做什么、验收标准\n│   │       ├── design.md         # 怎么做、涉及哪些包、关键接口\n│   │       └── tasks.md          # 可勾选的实现清单\n│   └── adr\u002F\n│       ├── 0001-ssr-only-in-web.md\n│       ├── 0002-platform-adapter.md\n│       └── 0003-pnpm-turborepo.md\n├── apps\u002F\n│   └── web\u002FREADME.md\n└── packages\u002F\n    ├── platform\u002FREADME.md        # PlatformAPI 接口约定\n    └── core\u002FREADME.md            # store 实体缓存规则\n","text",[1210,1567,1564],{"__ignoreMap":1177},[1090,1569,1571],{"id":1570},"关于治理-spec-腐化","关于治理 spec 腐化",[1095,1573,1574],{},"Spec会和代码悄悄漂移，比如代码改了三版，spec 还停在第一版，时间一长大家就都不信它了，于是彻底沦为摆设。\n防止这个问题有一些解决方案：",[1095,1576,1577,1580,1581,1584],{},[1108,1578,1579],{},"第一，把 spec 拆成三段，对应功能的生命周期。"," 这里可以直接借鉴 Kiro \u002F spec-kit 的 requirements → design → tasks 三件套:requirements 讲要做什么和验收标准，design 讲怎么做、涉及哪些包、关键接口长什么样，tasks 是一份能打勾的实现清单。关键在于 tasks 做完之后",[1108,1582,1583],{},"不要删","，让它作为「已交付」的历史存档留在那儿。这样 feature spec 本身就是一条完整的时间线，从提出到落地都有痕迹，而不是一个随时可能过期的静态文档。",[1095,1586,1587,1590,1591,1594,1595,1553,1598,1601],{},[1108,1588,1589],{},"第二，在 spec 里显式记下「影响的包」。"," 每个 feature 的 ",[1210,1592,1593],{},"design.md"," 顶部放一张「Affected packages」表，列清楚它落在哪几个 ",[1210,1596,1597],{},"apps\u002F*",[1210,1599,1600],{},"packages\u002F*"," 上。这张表是弥合「功能维度」和「包维度」错位的关键，能从一份 spec 反查出要动哪些代码，也能从一个 PR 反过来对照该改哪几份 spec。",[1203,1603,1606],{"className":1604,"code":1605,"language":1425,"meta":1177},[1423],"## Affected packages\n\n| 包 \u002F 应用         | 改动性质                   |\n| ----------------- | -------------------------- |\n| apps\u002Fweb          | 新增分享页路由与 SSR       |\n| packages\u002Ffeatures | 分享逻辑主体               |\n| packages\u002Fplatform | 新增分享相关的 PlatformAPI |\n",[1210,1607,1605],{"__ignoreMap":1177},[1095,1609,1610,1613,1614,1617],{},[1108,1611,1612],{},"第三，架构决策用 ADR，而且只增不改。"," 前面几轮定下来的那些决策——「SSR 只在 web 端」「platform adapter 负责吸收环境差异」「用 pnpm + Turborepo」——每一条都写成一份带编号、带日期的 ADR，结构固定为「背景 \u002F 决策 \u002F 后果」三段。ADR 的铁律是",[1108,1615,1616],{},"不修改历史",":决策变了不是去改旧文件，而是新增一条，并标明它 supersede(取代)了哪一条旧的。这样决策的演进是可追溯的，新人进来翻 ADR 就能看懂「为什么当初这么定、后来又为什么改了」，而不是面对一堆没有来由的约定。",[1199,1619,1621],{"id":1620},"更新和维护让改-spec变成流程的一部分","更新和维护:让「改 spec」变成流程的一部分",[1095,1623,1624,1625,1628],{},"monorepo 里的 SDD 能不能长期跑下去取决于",[1108,1626,1627],{},"有没有一套让 spec 跟着代码一起变的机制","，机制立起来之后，日常怎么让它活着，靠的是把维护动作嵌进已有的开发流程里，而不是额外开一摊。",[1095,1630,1631],{},"可以在 PR 模板里加一行强制勾选:「本次改动是否涉及 spec \u002F ADR?若是，已同步更新并贴出链接。」搭配前面那张 Affected packages 表，review 的人很容易判断这个 PR 该不该带上 spec 改动。改功能顺手改 spec，这件事只要进了 checklist，就不容易被漏掉。",[1095,1633,1634,1635,1637,1638,1641],{},"再往前一步，可以让 spec-kit 的 ",[1210,1636,1380],{}," 在实现前先跑一遍，校验 spec、plan、tasks 三者之间有没有互相矛盾——发现冲突时，规矩是",[1108,1639,1640],{},"先改文档再改代码","，而不是闷头把代码写完让文档去追，在动手之前把漂移掐掉。",[1095,1643,1644],{},"下面是可以接在文章后面的一节，把你列的几点局限整理成博客风格的连贯叙述。我在保留你原意和例子的基础上，把逻辑串得更顺了一些，也补了一两句收束。",[1166,1646],{},[1090,1648,1650],{"id":1649},"sdd-工作模式的局限","SDD 工作模式的局限",[1095,1652,1653],{},"SDD不是银弹，也有不擅长的场景，开发者也要知道它的边界在哪。",[1199,1655,1657],{"id":1656},"不适合多需求相互耦合且上下文没打通的场景","不适合多需求相互耦合、且上下文没打通的场景",[1095,1659,1660],{},"SDD 的天花板很大程度上取决于 Context 的组织程度。",[1095,1662,1663],{},"比如 A 需求里的某个需求点，其实在 B 需求中也应该生效。但产品没提，需求文档里也没写，可 QA 认为要实现，产品被问到时也觉得要实现。而如果只按正常的需求开发流程走，「不生效」才是最符合文档的结果。",[1095,1665,1666,1667,1670],{},"这本质上是",[1108,1668,1669],{},"上下文没打通","的问题，顺带也暴露了产品团队提需混乱。在传统开发里，这类隐性信息往往靠研发之间口头同步、产品临时补充、项目群里的一句话，或者某个老员工的经验判断来兜住。但在 SDD 模式下，只要这些信息没有显式写进 Spec，Agent 大概率不会主动发现——它没法替你去读那些散落在会议纪要和聊天记录里的\"潜规则\"。",[1095,1672,1673],{},"所以当多个需求之间存在交叉影响，而上下文又分散在不同文档、不同人、不同会议里时，SDD 的效果会明显下降。除非团队有一个部门级的 Context 仓库，能把所有需求决策、产品变更、技术方案和历史背景统一沉淀下来，再有一个 Agent 在开发前自动复核所有相关上下文——否则，单个需求级别的 SDD 很难稳定处理这种跨需求耦合。",[1199,1675,1677],{"id":1676},"不适合多团队协作的超大需求一次性写完","不适合多团队协作的超大需求\"一次性写完\"",[1095,1679,1680],{},"加入业务要新增一个模块，这种需求通常不是某个研发改几个文件就能搞定的，它往往横跨多个团队、多个模块、多个阶段，本身就是一个大型专项。这种情况下一次 Spec、一次 Agent 执行，肯定不能把整个需求端到端做完。",[1095,1682,1683,1684,1687],{},"推荐的做法是",[1108,1685,1686],{},"先把超大需求拆成多个阶段，再在每个阶段内部用 SDD","。比如第一阶段做技术调研和整体方案，第二阶段做 Demo 验证，第三阶段拆客户端基础能力，第四阶段接服务端协议，第五阶段完善体验和异常处理，第六阶段进测试和灰度。SDD 在每个阶段内部依然好用，但它不负责替你决定这些阶段该怎么切。",[1095,1689,1690,1691,1694],{},"尤其是超大需求的前期，真正难的地方往往不是写代码，而是",[1108,1692,1693],{},"达成共识","。光是整体技术方案就可能要讨论一周甚至更久，涉及模块边界、团队分工、风险评估、上线节奏、兜底策略——这些都不是 Coding Agent 一把梭能定下来的，得靠人拉齐。",[1199,1696,1698],{"id":1697},"不适合频繁变化缺乏稳定输入的产品需求","不适合频繁变化、缺乏稳定输入的产品需求",[1095,1700,1701],{},"如果产品需求本身就飘忽不定，文档想一出是一出、小巧思特别多，今天改交互、明天改路径、后天又推翻核心逻辑，那不管你用什么工作模式，研发效率都会被拖垮。",[1095,1703,1704],{},"而 SDD 在这种情况下甚至可能更吃亏——因为它的前置成本(写 Spec、定 plan、拆 tasks)是押注在\"需求相对稳定\"这个前提上的。需求一天变三回，开发者认真写的 Spec 就跟着一天报废三回。当产品团队还不是 AI First 的工作方式时，这个矛盾会格外明显。",[1095,1706,1707,1710],{},[1108,1708,1709],{},"SDD 把质量押在了\"输入\"上","。需求清晰、上下文完整、边界稳定——满足这些前提时，才能把人从逐行盯代码里解放出来（古法编程也这样其实）;可一旦前提不成立，再好的流程也救不回来。所以说 SDD 比起一套\"写代码的方法\"，更像一面镜子，照出的是团队在 Context 沉淀和需求管理上的水平。",[1090,1712,1713],{"id":1713},"写在最后",[1095,1715,1716],{},"回头看会发现一件挺有意思的事:SDD 听起来是个很\"新\"的东西，可它骨子里那些讲究，几乎全是软件工程几十年积累下来的老道理。先想清楚再动手、把需求和边界写明白、用文档沉淀决策、拆分任务、测试先行、对架构选择留下可追溯的记录——这些在\"古法编程\"时代就被反复强调的东西，换到 AI 时代非但没有过时，反而因为 Agent 的加入变得更重要了。",[1095,1718,1719],{},"原因也不难理解。过去这些规范之所以常常被当成\"最佳实践\"束之高阁，是因为人可以偷懒:需求没写清，靠脑子记;文档没更新，靠口头问;边界没定义，靠经验蒙。人有容错、有默契、有临场发挥，烂一点的流程也能靠人硬扛过去。但 Agent 不吃这一套——你喂给它多少清晰的 Context，它就还你多少确定的结果;你含糊，它就跟着含糊。于是那些原本\"最好要做\"的软件工程动作，在 SDD 里变成了\"不做就跑不动\"的硬约束。AI 没有淘汰这些方法论，而是把它们从可选项变成了必选项。",[1095,1721,1722],{},"所以真正的变化不在于工具，而在于对开发者的要求。当写代码这件事本身越来越多地交给 Agent，人的价值就上移到了\"想清楚\"这一层——怎么把模糊的需求拆成精确的规格，怎么在动手前识别出跨需求的耦合和风险，怎么判断一个技术方案的边界和兜底，怎么让整个团队的上下文沉淀得足够 Agent 能读懂。这些恰恰是最难自动化、也最需要经验和判断的部分。换句话说，AI 接管了\"体力活\"，却把对\"脑力活\"的门槛抬高了。",[1095,1724,1725],{},"这也是为什么在这样一个看似\"人人都能靠 AI 写代码\"的时代，持续学习反而比以往任何时候都不能停。今天要学的不只是某个新框架或某个 Agent 的用法——那些迭代得太快，追不过来也不必追（只要学得慢就不用学，毕竟很多概念活不过两个月纯营销）;更该沉下心去补的，是那些经久不衰的基本功:工程方法论、系统设计的取舍、对复杂度的敬畏，以及把一件事想透彻、说清楚的能力。工具会一茬一茬地换，但这些底层的东西，才能让开发者在现在浪潮里始终站得住，走得远（除非ai迭代到不需要任何harness了）。",[1095,1727,1728],{},"总之软件工程好啊，软件工程得学.jpg",[1095,1730,1731],{},[1175,1732],{"alt":1177,"src":1733},"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-19b1c081c11e7c3c067f8de7c5652e59_720w.webp?source=d16d100b",{"title":1177,"searchDepth":1735,"depth":1735,"links":1736},4,[1737,1739,1740,1741,1747,1748,1751,1756],{"id":1092,"depth":1738,"text":1093},2,{"id":1135,"depth":1738,"text":1136},{"id":1170,"depth":1738,"text":1171},{"id":1181,"depth":1738,"text":1182,"children":1742},[1743,1745,1746],{"id":1201,"depth":1744,"text":1201},3,{"id":1249,"depth":1744,"text":1249},{"id":1414,"depth":1744,"text":1414},{"id":1499,"depth":1738,"text":1500},{"id":1570,"depth":1738,"text":1571,"children":1749},[1750],{"id":1620,"depth":1744,"text":1621},{"id":1649,"depth":1738,"text":1650,"children":1752},[1753,1754,1755],{"id":1656,"depth":1744,"text":1657},{"id":1676,"depth":1744,"text":1677},{"id":1697,"depth":1744,"text":1698},{"id":1713,"depth":1738,"text":1713},"简谈规格驱动开发，比如说monorepo中spec的治理",true,{"uuid":1760,"abblink":1761,"slots":1762},"b8d70910-c4f4-11f4-21bd-26018b9748b8","f72231e451",{},15,{"title":1085,"description":1757},"posts\u002F2026\u002F2026-07-18-简谈SDD（规范驱动开发） copy",[285,286],"o_MwGWf5SePprlFzlskbROFviZNMDNJFQ8phNvW5Vyw",1790443282708]