[{"data":1,"prerenderedAt":1185},["ShallowReactive",2],{"post:\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02":3,"posts:ordered":882},{"id":4,"title":5,"body":6,"category":865,"cover":866,"date":867,"description":868,"extension":869,"featured":870,"meta":871,"navigation":872,"path":873,"seo":874,"series":875,"seriesOrder":840,"stem":876,"tags":877,"__hash__":881},"posts\u002Fposts\u002FswDesign\u002Fsw-design-notes-02.md","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动",{"type":7,"value":8,"toc":835},"minimark",[9,16,25,30,35,38,43,46,50,61,68,74,78,85,101,104,109,145,148,152,155,162,169,173,177,180,187,199,203,206,232,238,242,246,249,255,266,270,273,299,303,310,314,321,327,334,338,399,405,409,412,438,444,451,455,458,465,472,475,479,482,514,521,524,547,550,606,609],[10,11,12],"blockquote",{},[13,14,15],"p",{},"这是我在学习软件分析与设计时整理的系列笔记。概念部分是我按自己的理解写的，场景与图示都是自己编、自己画的。理解有偏差的地方欢迎指出。",[10,17,18],{},[13,19,20,24],{},[21,22,23],"strong",{},"贯穿案例","：片区家电维修派单系统。这一篇是全系列的方法论底座 —— 后面 04 起的每一条需求，都遵循这里的判断方式。",[26,27,29],"h2",{"id":28},"_0-从一个翻车案例说起","0 从一个翻车案例说起",[31,32,34],"h3",{"id":33},"_01-客服要的是一张大表","0.1 客服要的是「一张大表」",[13,36,37],{},"贯穿案例里的第一次访谈，客服小林说：",[10,39,40],{},[13,41,42],{},"「我希望打开就能一眼看到所有工程师这周的排期，一张表全铺开，我一眼就知道谁有空。」",[13,44,45],{},"团队觉得这个诉求很具体、很合理，于是做了「全片区排期总览」页：一张表、40 行工程师 × 7 天、格子填满颜色。上线一周后，这个页面的使用率极低 —— 小林还是回去打电话了。",[31,47,49],{"id":48},"_02-数据里的真实行为","0.2 数据里的真实行为",[13,51,52,53,56,57,60],{},"而工单数据说的是另一件事：",[21,54,55],{},"小林的真实行为是每天只在早上一小时看排期","，而且她真正在找的不是「谁有空」，而是「",[21,58,59],{},"谁能修这个型号、且离客户最近","」。她平均要在 3–4 个候选人里挑一个，挑完还要打电话确认。",[13,62,63,64,67],{},"问题出在哪？小林没有说谎，团队也没有偷懒。问题在于：",[21,65,66],{},"她给出的是她想象中的解决方案，而不是她真正的问题","。她要解决的问题是「我怕派错人、派重了」，而「一张大表」只是她脑子里能想到的一种做法。",[13,69,70,71],{},"这个案例里藏着这一篇要讲的全部张力：",[21,72,73],{},"光听用户说不够，光看数据也不够。",[26,75,77],{"id":76},"_1-设计思维design-thinking在这里指什么","1 设计思维（Design Thinking）在这里指什么",[13,79,80,81,84],{},"先澄清一件事：设计思维不是「把界面做漂亮」。在这个语境下，它是一种",[21,82,83],{},"开发解决方案的整体方式","，共同点是：",[86,87,88,92,95],"ol",{},[89,90,91],"li",{},"先理解人和场景，再定义问题，最后才想方案；",[89,93,94],{},"整个过程是迭代的，允许回头推翻前面的结论；",[89,96,97,98],{},"它的核心主张是：",[21,99,100],{},"问题定义的质量，决定了方案的天花板。",[13,102,103],{},"第 3 条特别值得记住。上面那个案例里，团队不是缺创意，而是把问题定义错了 —— 定义成「需要一个总览页」，而不是「小林缺少一个『派对人』的把握」。",[13,105,106],{},[21,107,108],{},"问题定义改一个字，方案就完全不同：",[110,111,112,125],"table",{},[113,114,115],"thead",{},[116,117,118,122],"tr",{},[119,120,121],"th",{},"问题定义",[119,123,124],{},"会做出的方案",[126,127,128,137],"tbody",{},[116,129,130,134],{},[131,132,133],"td",{},"需要看全部排期",[131,135,136],{},"一张 40×7 的大表",[116,138,139,142],{},[131,140,141],{},"需要快速找到「能修这个型号、且最近」的人",[131,143,144],{},"一个按工单筛选候选人的面板（3 个候选，带距离与技能）",[13,146,147],{},"第二种方案正是后来真正被用起来的那个。",[26,149,151],{"id":150},"_2-关于左脑右脑分工那类说法我的保留意见","2 关于「左脑右脑分工」那类说法，我的保留意见",[13,153,154],{},"有一种很常见的分类把能力分成两边：一边是 Science \u002F Technology \u002F Engineering \u002F Mathematics，另一边是 UI Design \u002F UX Design \u002F People Skill \u002F Project Management，并暗示这是两种不同的人。",[13,156,157,158,161],{},"这个二分法在招聘语境里很常见，也容易被当成「我不擅长和人打交道」的借口。",[21,159,160],{},"我的看法是：它对做软件的人没有指导意义","。真实项目里这两边是同一件事的两面 —— 你要和技术讨论可行性（比如供应商接口超时 3 秒怎么办），也要和用户讨论他们到底在做什么（比如小林为什么宁可打电话），缺一边都会让方案悬空。",[13,163,164,165,168],{},"所以我在笔记里把它当作",[21,166,167],{},"两类关注点","，而不是两类人：一类关注「能不能做出来」，一类关注「做出来有没有用」。",[26,170,172],{"id":171},"_3-用户驱动设计从用户说了什么出发","3 用户驱动设计：从「用户说了什么」出发",[31,174,176],{"id":175},"_31-它能发现数据里没有的东西","3.1 它能发现数据里没有的东西",[13,178,179],{},"用户驱动设计（user-driven design）以用户的说法、感受和需求作为主要输入，常用手段是访谈、问卷（questionnaire）、观察和参与式设计（participatory design）。",[13,181,182,183,186],{},"它的价值在于",[21,184,185],{},"能发现数据里没有的东西","：",[188,189,190,193,196],"ul",{},[89,191,192],{},"尚未被满足的需求 —— 本例里，小林从没说过「我担心派重了」，因为那对她来说是常识；",[89,194,195],{},"用户行为背后的动机和顾虑 —— 她反复打电话的真实原因是「看不到工程师当下在不在路上」；",[89,197,198],{},"用户对现状的不满具体卡在哪一步（也就是痛点，pain point）—— 「不知道谁有空」这句话背后其实是「不知道谁现在能接」。",[31,200,202],{"id":201},"_32-它的四个盲点","3.2 它的四个盲点",[13,204,205],{},"它的盲点也很固定：",[188,207,208,214,220,226],{},[89,209,210,213],{},[21,211,212],{},"用户常把解决方案当成需求讲"," —— 就像上面那个「一张大表」；",[89,215,216,219],{},[21,217,218],{},"自我报告与实际行为常常对不上"," —— 人对自己行为的记忆和描述并不可靠。小林说她「一天有半天在打电话」，实际统计是 20% 的往外拨号；",[89,221,222,225],{},[21,223,224],{},"聚焦小组（focus group）会被少数声音带偏"," —— 房间里说话最大声的人，往往不是最能代表用户的人；",[89,227,228,231],{},[21,229,230],{},"用户描述不出他没见过的东西"," —— 问小林「你想要什么新功能」，得到的答案基本逃不出她已经见过的 Excel。",[13,233,234,235],{},"最后一条有个直接的推论：",[21,236,237],{},"不要指望用户帮你做设计，用户负责提供事实与感受，方案是你的工作。",[26,239,241],{"id":240},"_4-数据驱动设计从实际发生了什么出发","4 数据驱动设计：从「实际发生了什么」出发",[31,243,245],{"id":244},"_41-它的价值客观可量化可比较","4.1 它的价值：客观、可量化、可比较",[13,247,248],{},"数据驱动设计（data-driven design）以行为数据为主要决策依据，手段包括埋点（event tracking）、交易记录、日志、A\u002FB 测试、情感分析（sentiment mining）等。",[13,250,251,252,186],{},"它的价值是",[21,253,254],{},"客观、可量化、可比较",[188,256,257,260,263],{},[89,258,259],{},"能看出真实的行为分布，而不是回忆出来的分布 —— 本例：来电分类统计推翻「半天在打电话」这个自述；",[89,261,262],{},"改进前后可以对比，结论不靠争论；",[89,264,265],{},"规模大，能发现小样本访谈发现不了的规律 —— 本例：某个片区的缺料率是别处的三倍。",[31,267,269],{"id":268},"_42-它的四个盲点","4.2 它的四个盲点",[13,271,272],{},"它的盲点同样固定：",[188,274,275,281,287,293],{},[89,276,277,280],{},[21,278,279],{},"只记录已经发生的行为"," —— 那些「想报修但放弃了」的客户，数据里根本没有；",[89,282,283,286],{},[21,284,285],{},"能看出「是什么」，看不出「为什么」"," —— 数据会告诉你「全片区排期总览」被跳过了，但不会告诉你为什么被跳过；",[89,288,289,292],{},[21,290,291],{},"沉默的用户没有声音"," —— 流失客户、放弃注册的人，他们的动机几乎不会出现在数据里；",[89,294,295,298],{},[21,296,297],{},"数据本身可能是有偏的"," —— 埋点埋错、口径不一致这类问题，比想象中常见（06 篇专门讲这个）。",[26,300,302],{"id":301},"_5-两者的交集data-informed-design","5 两者的交集：data-informed design",[13,304,305],{},[306,307],"img",{"alt":308,"src":309},"用户驱动、数据驱动与 data-informed design 的对比：用户驱动以访谈、问卷、观察为输入，擅长回答为什么和还想要什么，盲点是用户把解决方案当成需求讲、自述与行为不一致；数据驱动以埋点、交易记录、日志为输入，擅长回答发生了什么和规模多大，盲点是只记录已发生的行为、看不出为什么；data-informed design 同时使用说法与行为两路输入，代价是两条腿都要有人做","\u002Fimages\u002Fsw-design-notes-02-user-vs-data.svg",[31,311,313],{"id":312},"_51-区别在数据是决策者还是输入之一","5.1 区别在「数据是决策者还是输入之一」",[13,315,316,317,320],{},"真正可用的落点是把两路输入合起来，通常叫 ",[21,318,319],{},"data-informed design（数据知情设计）","。",[13,322,323,324],{},"注意它和 data-driven 的区别：",[21,325,326],{},"data-driven 把数据当决策者，data-informed 把数据当输入之一。",[13,328,329,330,333],{},"本例里这个区别很具体。如果只看数据，结论会是「排期总览页没人用 → 砍掉它」；但如果把小林的话也听进去，结论会变成「",[21,331,332],{},"她不需要看全部，她需要在派单那一刻看到 3 个候选人","」。后者才是真正的需求。",[31,335,337],{"id":336},"_52-三者的分工对照","5.2 三者的分工对照",[110,339,340,355],{},[113,341,342],{},[116,343,344,346,349,352],{},[119,345],{},[119,347,348],{},"用户驱动",[119,350,351],{},"数据驱动",[119,353,354],{},"data-informed",[126,356,357,371,385],{},[116,358,359,362,365,368],{},[131,360,361],{},"主要输入",[131,363,364],{},"说法、感受、动机",[131,366,367],{},"行为、交易、日志",[131,369,370],{},"两者都看",[116,372,373,376,379,382],{},[131,374,375],{},"擅长回答",[131,377,378],{},"为什么、还想要什么",[131,380,381],{},"发生了什么、规模多大",[131,383,384],{},"现象 + 原因",[116,386,387,390,393,396],{},[131,388,389],{},"主要风险",[131,391,392],{},"被想象出来的方案带偏",[131,394,395],{},"看不到未被满足的需求",[131,397,398],{},"两边都要有人做，成本更高",[13,400,401,402],{},"一句话概括：",[21,403,404],{},"数据告诉你发生了什么，用户告诉你为什么，以及还可能想要什么。",[26,406,408],{"id":407},"_6-从数据到设计决策的一条做法","6 从数据到设计决策的一条做法",[13,410,411],{},"把上面这套落成可执行的步骤，大概是：",[86,413,414,420,426,432],{},[89,415,416,419],{},[21,417,418],{},"先问业务目标"," —— 做这件事是为了提升什么？本例：把「问进度」来电从 50% 降到 20%；",[89,421,422,425],{},[21,423,424],{},"找出哪些数据能反映这个目标"," —— 这一步会用到不同层次的 analytics（分析）：descriptive 回答发生了什么，diagnostic 回答为什么，predictive 回答可能会发生什么，prescriptive 回答应该怎么做（06 篇展开）；",[89,427,428,431],{},[21,429,430],{},"用定性方法解释数据里的异常"," —— 定量（quantitative）数据给出规模和分布，定性（qualitative）访谈给出原因，数据里冒出的「不合理」通常都能在访谈里找到解释。本例：「排期总览页使用率 3%」这个异常，访谈一次就解释清了；",[89,433,434,437],{},[21,435,436],{},"把结论写成可验证的假设，再回到数据里验证"," —— 比如「小林担心派错人 → 如果派单时直接给出 3 个候选人（按技能 + 距离排序），她的派单耗时会从 3 分钟降到 1 分钟」。",[13,439,440,441],{},"第 4 步是这套方法里最容易被跳过的：",[21,442,443],{},"没有写成假设的洞察，最后都只是意见。",[13,445,446,447,450],{},"注意第 4 步里那个「→ 后面」的半句 —— 它不是修辞，而是",[21,448,449],{},"验证条件","。没有它，这只是一句愿望。",[26,452,454],{"id":453},"_7-数字人才这个说法","7 「数字人才」这个说法",[13,456,457],{},"「数字人才（digital talent）」常被形容成「一种新物种」，意思是既理解技术、也理解业务和用户。",[13,459,460,461,464],{},"我的理解比较朴素：",[21,462,463],{},"这不是「什么都懂一点」，而是能在技术和用户之间做翻译","。能把用户的一句抱怨，翻译成一条可验证的需求；也能把一个技术限制，翻译成用户能听懂的说法。",[13,466,467,468,471],{},"本例里这个「翻译」有个具体的样子：供应商接口要 3 秒才返回库存 —— 技术上的说法是「外部依赖有延迟」，翻译成小林能懂的说法是「",[21,469,470],{},"如果查库存慢了，系统会先让你提交，标注『库存待确认』，不挡你","」。同一件事，第二种说法她才知道该怎么用。",[13,473,474],{},"前面那个翻车的真正失败点，就是中间缺了这个翻译 —— 小林的说法（一张大表）被直接当成了需求。",[26,476,478],{"id":477},"_8-有效提问几条能直接用的规则","8 有效提问：几条能直接用的规则",[13,480,481],{},"访谈的效果几乎完全取决于问出了「有效的问题」。我把它整理成几条能在访谈里直接执行的规则：",[188,483,484,490,496,502,508],{},[89,485,486,489],{},[21,487,488],{},"问过去的行为，不问未来的意愿。"," 「你昨天派单时是怎么找工程师的」远比「如果有个新功能你会用吗」有价值 —— 后者几乎所有人都会说「会」。",[89,491,492,495],{},[21,493,494],{},"问「为什么」，少问「是不是」。"," 封闭式问题（dichotomous question）省时间，但只能验证你已有的假设，不能发现新东西。",[89,497,498,501],{},[21,499,500],{},"不要问诱导性问题（leading question）。"," 「你是不是觉得现在派单很麻烦」已经给出了答案。",[89,503,504,507],{},[21,505,506],{},"一次只问一件事。"," 「你觉得派单时速度和质量哪个重要」是两件事被粘在一起，答案无法解释。",[89,509,510,513],{},[21,511,512],{},"用观察校验说法。"," 小林说她每次都会核对两遍时间，就去看看她实际操作 —— 常常对不上。",[13,515,516,517,520],{},"还有一条本例里特别有效的追问：",[21,518,519],{},"「如果不考虑任何技术限制，你最希望哪一步消失？」"," 这个问题的答案往往直接指向真正的痛点 —— 小林回答的是「打电话问谁有空」，而那正是后来被做掉的那一步。",[26,522,523],{"id":523},"本节自测",[86,525,526,529,532,535,538,541,544],{},[89,527,528],{},"用户说「我想要一个能一次看完所有排期的界面」，这句话里哪个部分是需求，哪个部分是解决方案？",[89,530,531],{},"用户驱动设计和数据驱动设计各自最容易忽略什么？各举本例中的一个例子。",[89,533,534],{},"data-driven 和 data-informed 的区别是什么？为什么后者更难执行？",[89,536,537],{},"为什么「如果有个新功能你会用吗」是一个坏问题？换成什么问题更好？",[89,539,540],{},"把「小林担心派错人」写成一个可验证的假设（要说清验证的数据和预期变化）。",[89,542,543],{},"问题定义从「需要看全部排期」改成「需要快速找到能修这个型号且最近的人」，方案会有什么不同？",[89,545,546],{},"「数字人才是能在技术和用户之间做翻译」——用供应商接口延迟 3 秒这件事，给出两种说法。",[31,548,549],{"id":549},"参考答案",[86,551,552,558,568,578,585,592,599],{},[89,553,554,557],{},[21,555,556],{},"需求是「我怕派错人、派重了」这个担心；「一张大表」是他想象出的解决方案","。用户给的是方案，不是问题（§0.2）。",[89,559,560,563,564,567],{},[21,561,562],{},"用户驱动最易忽略「自我报告与行为的偏差」","（小林说半天在打电话，实际是 20% 往外拨号）；",[21,565,566],{},"数据驱动最易忽略「为什么」与「没发生的事」","（总览页使用率低，但数据不会告诉你为什么，也看不到那些放弃报修的客户）（§3.2、§4.2）。",[89,569,570,573,574,577],{},[21,571,572],{},"data-driven 把数据当决策者，data-informed 把数据当输入之一","。后者更难是因为",[21,575,576],{},"两条腿都要有人做","（既要做数据，也要做访谈），成本更高（§5.1、§5.2）。",[89,579,580,581,584],{},"因为",[21,582,583],{},"几乎所有人都会回答「会」"," —— 它问的是未来意愿，不是过去行为。换成「你上次派单时是怎么找工程师的」，得到的是可验证的事实（§8）。",[89,586,587,588,591],{},"「小林担心派错人 → ",[21,589,590],{},"如果派单时直接给出 3 个候选人（按技能 + 距离排序），她的派单耗时会从 3 分钟降到 1 分钟","」。后半句是可测量的验证条件（§6 第 4 步）。",[89,593,594,595,598],{},"前者会做出「40×7 的大表」，后者会做出「按工单筛选出 3 个候选人的面板」。",[21,596,597],{},"问题定义改一个字，方案完全不同","（§1）。",[89,600,601,602,605],{},"技术说法：「外部依赖有延迟」。用户说法：「",[21,603,604],{},"查库存慢了，系统会先让你提交、标注『库存待确认』，不挡你","」。后者小林才知道该怎么用（§7）。",[26,607,608],{"id":608},"术语表",[110,610,611,624],{},[113,612,613],{},[116,614,615,618,621],{},[119,616,617],{},"术语",[119,619,620],{},"中文",[119,622,623],{},"一句话解释",[126,625,626,637,648,659,670,681,692,703,714,725,736,747,758,769,780,791,802,813,824],{},[116,627,628,631,634],{},[131,629,630],{},"Design Thinking",[131,632,633],{},"设计思维",[131,635,636],{},"以理解人和场景为起点、迭代推进的解法开发方式",[116,638,639,642,645],{},[131,640,641],{},"user-driven design",[131,643,644],{},"用户驱动设计",[131,646,647],{},"以用户的说法、感受与需求为主要输入",[116,649,650,653,656],{},[131,651,652],{},"data-driven design",[131,654,655],{},"数据驱动设计",[131,657,658],{},"以行为数据作为主要决策依据",[116,660,661,664,667],{},[131,662,663],{},"data-informed design",[131,665,666],{},"数据知情设计",[131,668,669],{},"数据只作为输入之一，与定性理解结合使用",[116,671,672,675,678],{},[131,673,674],{},"focus group",[131,676,677],{},"聚焦小组",[131,679,680],{},"小组讨论式定性调研，容易被少数声音带偏",[116,682,683,686,689],{},[131,684,685],{},"questionnaire",[131,687,688],{},"问卷",[131,690,691],{},"面向较大样本的结构化调查",[116,693,694,697,700],{},[131,695,696],{},"participatory design",[131,698,699],{},"参与式设计",[131,701,702],{},"让用户直接参与方案设计的做法",[116,704,705,708,711],{},[131,706,707],{},"leading question",[131,709,710],{},"诱导性提问",[131,712,713],{},"问题本身已暗示了预期答案，会污染结果",[116,715,716,719,722],{},[131,717,718],{},"dichotomous question",[131,720,721],{},"二选一问题",[131,723,724],{},"只能回答是\u002F否的封闭式问题",[116,726,727,730,733],{},[131,728,729],{},"qualitative \u002F quantitative",[131,731,732],{},"定性 \u002F 定量",[131,734,735],{},"解释性的理解信息 \u002F 可量化的规模信息",[116,737,738,741,744],{},[131,739,740],{},"analytics",[131,742,743],{},"分析",[131,745,746],{},"从数据中提取结论的方法总称",[116,748,749,752,755],{},[131,750,751],{},"descriptive analytics",[131,753,754],{},"描述性分析",[131,756,757],{},"回答「发生了什么」",[116,759,760,763,766],{},[131,761,762],{},"diagnostic analytics",[131,764,765],{},"诊断性分析",[131,767,768],{},"回答「为什么发生」",[116,770,771,774,777],{},[131,772,773],{},"predictive analytics",[131,775,776],{},"预测性分析",[131,778,779],{},"回答「可能会发生什么」",[116,781,782,785,788],{},[131,783,784],{},"prescriptive analytics",[131,786,787],{},"处方性分析",[131,789,790],{},"回答「应该怎么做」",[116,792,793,796,799],{},[131,794,795],{},"sentiment mining",[131,797,798],{},"情感挖掘",[131,800,801],{},"从文本中提取情绪倾向的分析方法",[116,803,804,807,810],{},[131,805,806],{},"event tracking",[131,808,809],{},"埋点",[131,811,812],{},"在界面上记录用户行为的做法，是行为数据的主要来源",[116,814,815,818,821],{},[131,816,817],{},"pain point",[131,819,820],{},"痛点",[131,822,823],{},"用户在当前流程中受阻或不满的地方",[116,825,826,829,832],{},[131,827,828],{},"digital talent",[131,830,831],{},"数字人才",[131,833,834],{},"能在技术、业务与用户之间做翻译的复合角色",{"title":836,"searchDepth":837,"depth":837,"links":838},"",3,[839,844,845,846,850,854,858,859,860,861,864],{"id":28,"depth":840,"text":29,"children":841},2,[842,843],{"id":33,"depth":837,"text":34},{"id":48,"depth":837,"text":49},{"id":76,"depth":840,"text":77},{"id":150,"depth":840,"text":151},{"id":171,"depth":840,"text":172,"children":847},[848,849],{"id":175,"depth":837,"text":176},{"id":201,"depth":837,"text":202},{"id":240,"depth":840,"text":241,"children":851},[852,853],{"id":244,"depth":837,"text":245},{"id":268,"depth":837,"text":269},{"id":301,"depth":840,"text":302,"children":855},[856,857],{"id":312,"depth":837,"text":313},{"id":336,"depth":837,"text":337},{"id":407,"depth":840,"text":408},{"id":453,"depth":840,"text":454},{"id":477,"depth":840,"text":478},{"id":523,"depth":840,"text":523,"children":862},[863],{"id":549,"depth":837,"text":549},{"id":608,"depth":840,"text":608},"学习",null,"2026-10-24","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","md",false,{},true,"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02",{"title":5,"description":868},"软件分析与设计笔记","posts\u002FswDesign\u002Fsw-design-notes-02",[633,878,879,880],"用户研究","需求分析","学习笔记","wr7DipVvb0XqhEER5x4r7qnyUflx2EdUT9hIblgIFS8",[883,889,895,901,907,913,919,925,931,937,943,949,955,961,967,973,979,985,991,997,1003,1009,1015,1021,1027,1033,1038,1039,1045,1051,1055,1059,1063,1067,1071,1075,1079,1083,1087,1091,1095,1101,1105,1111,1115,1119,1123,1127,1131,1135,1139,1144,1148,1152,1157,1162,1168,1172,1177,1181],{"path":884,"title":885,"description":886,"date":887,"series":875,"seriesOrder":888},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19",28,{"path":890,"title":891,"description":892,"date":893,"series":875,"seriesOrder":894},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":896,"title":897,"description":898,"date":899,"series":875,"seriesOrder":900},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":902,"title":903,"description":904,"date":905,"series":875,"seriesOrder":906},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":908,"title":909,"description":910,"date":911,"series":875,"seriesOrder":912},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":914,"title":915,"description":916,"date":917,"series":875,"seriesOrder":918},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":920,"title":921,"description":922,"date":923,"series":875,"seriesOrder":924},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":926,"title":927,"description":928,"date":929,"series":875,"seriesOrder":930},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":932,"title":933,"description":934,"date":935,"series":875,"seriesOrder":936},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",20,{"path":938,"title":939,"description":940,"date":941,"series":875,"seriesOrder":942},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",19,{"path":944,"title":945,"description":946,"date":947,"series":875,"seriesOrder":948},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",18,{"path":950,"title":951,"description":952,"date":953,"series":875,"seriesOrder":954},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",17,{"path":956,"title":957,"description":958,"date":959,"series":875,"seriesOrder":960},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",16,{"path":962,"title":963,"description":964,"date":965,"series":875,"seriesOrder":966},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",15,{"path":968,"title":969,"description":970,"date":971,"series":875,"seriesOrder":972},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",14,{"path":974,"title":975,"description":976,"date":977,"series":875,"seriesOrder":978},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",13,{"path":980,"title":981,"description":982,"date":983,"series":875,"seriesOrder":984},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",12,{"path":986,"title":987,"description":988,"date":989,"series":875,"seriesOrder":990},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",11,{"path":992,"title":993,"description":994,"date":995,"series":875,"seriesOrder":996},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",10,{"path":998,"title":999,"description":1000,"date":1001,"series":875,"seriesOrder":1002},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",9,{"path":1004,"title":1005,"description":1006,"date":1007,"series":875,"seriesOrder":1008},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",8,{"path":1010,"title":1011,"description":1012,"date":1013,"series":875,"seriesOrder":1014},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",7,{"path":1016,"title":1017,"description":1018,"date":1019,"series":875,"seriesOrder":1020},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",6,{"path":1022,"title":1023,"description":1024,"date":1025,"series":875,"seriesOrder":1026},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",5,{"path":1028,"title":1029,"description":1030,"date":1031,"series":875,"seriesOrder":1032},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",4,{"path":1034,"title":1035,"description":1036,"date":1037,"series":875,"seriesOrder":837},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":873,"title":5,"description":868,"date":867,"series":875,"seriesOrder":840},{"path":1040,"title":1041,"description":1042,"date":1043,"series":875,"seriesOrder":1044},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01","软件分析与设计笔记 01：课程地图与从需求到设计的主干","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","2026-10-23",1,{"path":1046,"title":1047,"description":1048,"date":1049,"series":1050,"seriesOrder":1044},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":1052,"title":1053,"description":1054,"date":1049,"series":1050,"seriesOrder":840},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":1056,"title":1057,"description":1058,"date":1049,"series":1050,"seriesOrder":837},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":1060,"title":1061,"description":1062,"date":1049,"series":1050,"seriesOrder":1032},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":1064,"title":1065,"description":1066,"date":1049,"series":1050,"seriesOrder":1026},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":1068,"title":1069,"description":1070,"date":1049,"series":1050,"seriesOrder":1020},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":1072,"title":1073,"description":1074,"date":1049,"series":1050,"seriesOrder":1014},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":1076,"title":1077,"description":1078,"date":1049,"series":1050,"seriesOrder":1008},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":1080,"title":1081,"description":1082,"date":1049,"series":1050,"seriesOrder":1002},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":1084,"title":1085,"description":1086,"date":1049,"series":1050,"seriesOrder":996},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":1088,"title":1089,"description":1090,"date":1049,"series":1050,"seriesOrder":990},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":1092,"title":1093,"description":1094,"date":1049,"series":1050,"seriesOrder":984},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":1096,"title":1097,"description":1098,"date":1099,"series":1100,"seriesOrder":1032},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":1102,"title":1103,"description":1104,"date":1099,"series":1100,"seriesOrder":837},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":1106,"title":1107,"description":1108,"date":1109,"series":1110,"seriesOrder":1032},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04","MySQL 学习笔记 04：数据操纵（增删改）","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。","2026-10-10","SQL 学习笔记",{"path":1112,"title":1113,"description":1114,"date":1109,"series":1110,"seriesOrder":1026},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":1116,"title":1117,"description":1118,"date":1109,"series":1110,"seriesOrder":1020},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06","MySQL 学习笔记 06：CREATE TABLE 与数据类型","MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。",{"path":1120,"title":1121,"description":1122,"date":1109,"series":1110,"seriesOrder":1014},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":1124,"title":1125,"description":1126,"date":1109,"series":1110,"seriesOrder":1008},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":1128,"title":1129,"description":1130,"date":1109,"series":1110,"seriesOrder":1002},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":1132,"title":1133,"description":1134,"date":1109,"series":1110,"seriesOrder":996},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":1136,"title":1137,"description":1138,"date":1109,"series":1110,"seriesOrder":990},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":1140,"title":1141,"description":1142,"date":1143,"series":1110,"seriesOrder":1044},"\u002Fposts\u002Fmysql\u002Fmysql-learning-01","MySQL 学习笔记 01：MySQL 基础知识","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。","2026-10-09",{"path":1145,"title":1146,"description":1147,"date":1143,"series":1110,"seriesOrder":840},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":1149,"title":1150,"description":1151,"date":1143,"series":1110,"seriesOrder":837},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03","MySQL 学习笔记 03：聚合、分组与输出控制","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。",{"path":1153,"title":1154,"description":1155,"date":1156,"series":1100,"seriesOrder":840},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":1158,"title":1159,"description":1160,"date":1161,"series":1100,"seriesOrder":1044},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":1163,"title":1164,"description":1165,"date":1166,"series":1167,"seriesOrder":1044},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":1169,"title":1170,"description":1171,"date":1166,"series":1167,"seriesOrder":840},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":1173,"title":1174,"description":1175,"date":1166,"series":1176,"seriesOrder":1044},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":1178,"title":1179,"description":1180,"date":1166,"series":1176,"seriesOrder":840},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":1182,"title":1183,"description":1184,"date":1166,"series":1176,"seriesOrder":837},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268151489]