[{"data":1,"prerenderedAt":1496},["ShallowReactive",2],{"post:\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01":3,"posts:ordered":1194},{"id":4,"title":5,"body":6,"category":1175,"cover":1176,"date":1177,"description":1178,"extension":1179,"featured":1180,"meta":1181,"navigation":1182,"path":1183,"seo":1184,"series":1185,"seriesOrder":1186,"stem":1187,"tags":1188,"__hash__":1193},"posts\u002Fposts\u002FswDesign\u002Fsw-design-notes-01.md","软件分析与设计笔记 01：课程地图与从需求到设计的主干",{"type":7,"value":8,"toc":1144},"minimark",[9,16,21,26,29,42,50,54,57,78,81,85,88,150,157,161,167,174,178,207,211,214,240,244,319,326,330,334,337,577,583,587,594,598,602,605,659,662,666,670,677,691,694,714,721,725,728,765,769,776,778,801,803,863,865],[10,11,12],"blockquote",{},[13,14,15],"p",{},"这是我在学习软件分析与设计时整理的系列笔记。概念部分是我按自己的理解写的，场景与图示都是自己编、自己画的，参考的主要是 UML 规范、敏捷宣言、Scrum Guide、ER 模型与规范化相关的公开文献这类一手资料。理解有偏差的地方欢迎指出。",[17,18,20],"h2",{"id":19},"_0-先说清楚这门课要解决的问题","0 先说清楚这门课要解决的问题",[22,23,25],"h3",{"id":24},"_01-三句没法直接开工的话","0.1 三句没法直接开工的话",[13,27,28],{},"只要参与过一点实际项目，大概都听过这几句话：",[30,31,32,36,39],"ul",{},[33,34,35],"li",{},"「需求先做起来，细节以后再补。」",[33,37,38],{},"「这里加个按钮就行。」",[33,40,41],{},"「性能要快。」",[13,43,44,45,49],{},"这些话没法直接开工，因为它们都缺同一样东西：",[46,47,48],"strong",{},"可以被验证的判断标准","。",[22,51,53],{"id":52},"_02-三个要回答的问题","0.2 三个要回答的问题",[13,55,56],{},"所谓软件分析与设计，就是把这类模糊的期望，一步步变成有边界、可验证、能被实现的东西。整个过程可以拆成三个问题：",[58,59,60,66,72],"ol",{},[33,61,62,65],{},[46,63,64],{},"要做什么"," —— 需求从哪里来？谁说了算（也就是利益相关者，stakeholder）？怎么判断它真实、完整、在范围内？",[33,67,68,71],{},[46,69,70],{},"怎么表达"," —— 用什么模型把需求写清楚，让用户、分析师、开发看到的是同一件事？",[33,73,74,77],{},[46,75,76],{},"结构怎么定"," —— 这些模型怎么变成能写代码、能建表、能长期维护的结构？",[13,79,80],{},"后面 27 篇笔记，都是围绕这三个问题展开的。这一篇先把地图铺开。",[22,82,84],{"id":83},"_03-这份系列怎么读三种读法","0.3 这份系列怎么读（三种读法）",[13,86,87],{},"不同的人来读这份笔记，目的不一样，所以入口也不一样：",[89,90,91,107],"table",{},[92,93,94],"thead",{},[95,96,97,101,104],"tr",{},[98,99,100],"th",{},"你是",[98,102,103],{},"建议读法",[98,105,106],{},"要花多久",[108,109,110,124,137],"tbody",{},[95,111,112,118,121],{},[113,114,115],"td",{},[46,116,117],{},"考前突击",[113,119,120],{},"直接读 27（整份卷子演算）→ 28（draw.io 作图手册）→ 07、08、21、22",[113,122,123],{},"一天",[95,125,126,131,134],{},[113,127,128],{},[46,129,130],{},"跟着课程学",[113,132,133],{},"按 §3 的 21 个单元顺序读，每篇末尾的自测做完再看答案",[113,135,136],{},"三到四周",[95,138,139,144,147],{},[113,140,141],{},[46,142,143],{},"工作中查",[113,145,146],{},"用 §1 那张链路表定位环节，跳到对应篇目；每篇的「画这一笔」和自查清单可直接用",[113,148,149],{},"按需",[13,151,152,153,156],{},"三者的共同点是：",[46,154,155],{},"每篇末尾都有带答案的自测题","，读完做题才算过了一遍。",[17,158,160],{"id":159},"_1-主干链路从需求到设计","1 主干链路：从需求到设计",[13,162,163,164,49],{},"这张图是整份系列的骨架。它有一条重要性质：",[46,165,166],{},"每一环的输出就是下一环的输入",[13,168,169],{},[170,171],"img",{"alt":172,"src":173},"从需求到设计的主干链路：第一阶段把需求变成模型，包含事实调查、范围界定、用户故事、用例建模、实体与工作流、前端设计、非功能需求、测试；第二阶段把模型变成软件结构，包含数据库分析与 ERD、规范化、逻辑数据模型、面向对象概念、UML 类图与顺序图、分析建模、设计建模、设计原则、重构","\u002Fimages\u002Fsw-design-notes-01-main-path.svg",[22,175,177],{"id":176},"_11-第一阶段的九个环节","1.1 第一阶段的九个环节",[30,179,180,183,186,189,192,195,198,201,204],{},[33,181,182],{},"事实调查（Fact Finding）产出的是访谈记录、观察结论这类原始材料；",[33,184,185],{},"范围界定（Scoping）把这些材料收成「做什么、不做什么」；",[33,187,188],{},"用户故事（User Story）把范围拆成一条条能验收的语句；",[33,190,191],{},"用例建模（Use Case Model）再把用户故事翻译成「谁、在什么条件下、对系统做什么」，一个用例下通常还挂着几条具体走法（scenario）；",[33,193,194],{},"活动图（Activity Diagram）把用例的流程画到能看清分支和例外；",[33,196,197],{},"实体与工作流（Entity \u002F Workflow）从流程里抽出业务概念，形成领域模型（Domain Model）；",[33,199,200],{},"前端设计（UI \u002F UX Design）把流程落到具体的界面与屏幕流程；",[33,202,203],{},"非功能需求（Non-Functional Requirement, NFR）补上「做得多好」；",[33,205,206],{},"测试（Testing）给出「怎么证明它做到了」。",[22,208,210],{"id":209},"_12-第二阶段的八个环节","1.2 第二阶段的八个环节",[13,212,213],{},"第二阶段换了一个视角：",[30,215,216,219,222,225,228,231,234,237],{},[33,217,218],{},"数据库分析（Database Analysis）把业务概念变成实体、关系与基数（Cardinality），最后画成实体关系图（Entity Relationship Diagram, ERD）；",[33,220,221],{},"规范化（Normalization）把表结构调整到减少冗余、避免更新异常；",[33,223,224],{},"逻辑数据模型（Logical Data Model, LDM）在第三范式之上补出完整的关系；",[33,226,227],{},"面向对象（Object Orientation）提供另一套组织方式：对象、类、封装、继承、多态；",[33,229,230],{},"UML 的类图（Class Diagram）与顺序图（Sequence Diagram）是这套方式的表达工具；",[33,232,233],{},"分析建模（Analysis Modelling）回答「每个用例由哪些对象协作完成」；",[33,235,236],{},"设计建模（Design Modelling）回答「这些对象怎么落到数据库、数据访问层和框架上」；",[33,238,239],{},"设计原则（Design Principles）与重构（Refactoring）负责让结构长期不烂。",[17,241,243],{"id":242},"_2-两个阶段分别在做什么","2 两个阶段分别在做什么",[89,245,246,258],{},[92,247,248],{},[95,249,250,252,255],{},[98,251],{},[98,253,254],{},"第一阶段 · 需求与分析",[98,256,257],{},"第二阶段 · 设计与结构",[108,259,260,271,282,293,308],{},[95,261,262,265,268],{},[113,263,264],{},"核心问题",[113,266,267],{},"这个系统为谁解决什么问题",[113,269,270],{},"这个系统怎么组织成能实现的代码与数据",[95,272,273,276,279],{},[113,274,275],{},"主要动作",[113,277,278],{},"获取、界定、建模、确认",[113,280,281],{},"抽象、映射、取舍、整理",[95,283,284,287,290],{},[113,285,286],{},"典型产出",[113,288,289],{},"用户画像、客户旅程图、用户故事、用例模型、活动图、领域模型、非功能需求",[113,291,292],{},"ERD、逻辑数据模型、类图、顺序图、分析模型、设计模型、重构后的代码",[95,294,295,298,303],{},[113,296,297],{},"由谁验收",[113,299,300],{},[46,301,302],{},"用户\u002F业务方能不能看懂并确认",[113,304,305],{},[46,306,307],{},"开发能不能直接照着实现",[95,309,310,313,316],{},[113,311,312],{},"出错代价",[113,314,315],{},"做出来的东西没人用",[113,317,318],{},"能跑，但改不动",[13,320,321,322,325],{},"最后两行是我自己的总结，也是这份笔记反复会回到的判断口径：",[46,323,324],{},"需求阶段用「用户能不能确认」验收，设计阶段用「开发能不能实现」验收","。很多项目出问题，是拿错了尺子 —— 比如用「代码能跑」去验收需求。",[17,327,329],{"id":328},"_3-学习节奏21-个单元怎么走","3 学习节奏：21 个单元怎么走",[22,331,333],{"id":332},"_31-21-个单元与-27-篇笔记的对应","3.1 21 个单元与 27 篇笔记的对应",[13,335,336],{},"课程本身是按天推进的，每天一个主题加一次动手练习。我把它们整理成 21 个单元，对应到这份系列的笔记，方便你按顺序跟踪自己的进度：",[89,338,339,355],{},[92,340,341],{},[95,342,343,346,349,352],{},[98,344,345],{},"单元",[98,347,348],{},"主题",[98,350,351],{},"对应笔记",[98,353,354],{},"这一步你应该产出什么",[108,356,357,371,385,399,413,427,441,455,469,483,496,510,523,537,550,563],{},[95,358,359,362,365,368],{},[113,360,361],{},"1",[113,363,364],{},"建立共同语言：设计思维、敏捷与 Scrum",[113,366,367],{},"01–03",[113,369,370],{},"能说清需求、迭代、backlog 之间的关系",[95,372,373,376,379,382],{},[113,374,375],{},"2",[113,377,378],{},"界定范围（用户侧）",[113,380,381],{},"04–05",[113,383,384],{},"问题清单、用户画像、客户旅程图",[95,386,387,390,393,396],{},[113,388,389],{},"3",[113,391,392],{},"界定范围（数据侧）",[113,394,395],{},"06",[113,397,398],{},"「业务目标 → 分析手段 → 所需数据」的映射",[95,400,401,404,407,410],{},[113,402,403],{},"4",[113,405,406],{},"需求结构化",[113,408,409],{},"07",[113,411,412],{},"一组句式规范、可验收的用户故事",[95,414,415,418,421,424],{},[113,416,417],{},"5–6",[113,419,420],{},"功能建模",[113,422,423],{},"08–11",[113,425,426],{},"用例模型、活动图、领域模型",[95,428,429,432,435,438],{},[113,430,431],{},"7",[113,433,434],{},"界面设计",[113,436,437],{},"12",[113,439,440],{},"线框图与屏幕流程",[95,442,443,446,449,452],{},[113,444,445],{},"8–9",[113,447,448],{},"需求获取方法",[113,450,451],{},"13",[113,453,454],{},"访谈脚本与访谈记录",[95,456,457,460,463,466],{},[113,458,459],{},"10",[113,461,462],{},"质量属性：测试",[113,464,465],{},"14",[113,467,468],{},"测试用例与测试数据",[95,470,471,474,477,480],{},[113,472,473],{},"11",[113,475,476],{},"质量属性：非功能需求",[113,478,479],{},"15",[113,481,482],{},"性能、安全、可靠性需求",[95,484,485,487,490,493],{},[113,486,437],{},[113,488,489],{},"阶段收口：需求规格说明书",[113,491,492],{},"16",[113,494,495],{},"一份完整的用户需求规格说明书（URS）",[95,497,498,501,504,507],{},[113,499,500],{},"13–14",[113,502,503],{},"数据建模",[113,505,506],{},"18–19",[113,508,509],{},"ERD 与规范化后的表结构",[95,511,512,514,517,520],{},[113,513,479],{},[113,515,516],{},"面向对象与 UML",[113,518,519],{},"20–21",[113,521,522],{},"类图、顺序图",[95,524,525,528,531,534],{},[113,526,527],{},"16–17",[113,529,530],{},"分析建模与设计建模",[113,532,533],{},"22–23",[113,535,536],{},"分析模型、设计模型",[95,538,539,541,544,547],{},[113,540,506],{},[113,542,543],{},"设计质量",[113,545,546],{},"24–25",[113,548,549],{},"设计原则与重构手法",[95,551,552,554,557,560],{},[113,553,519],{},[113,555,556],{},"阶段收口：完整设计文档",[113,558,559],{},"26",[113,561,562],{},"一份能交给开发的设计文档",[95,564,565,568,571,574],{},[113,566,567],{},"加餐",[113,569,570],{},"应试专项",[113,572,573],{},"27–28",[113,575,576],{},"一份完整答卷 + 五类图的作图能力",[13,578,579,582],{},[46,580,581],{},"最后一行是加餐","。27、28 两篇不是课程内容，是考前的专项训练：27 拿一份完整案例把整份卷子从头走到尾，28 讲每个 UML 符号在 draw.io 里怎么落笔。它们不属于主链，但考试前最值得看。",[22,584,586],{"id":585},"_32-怎么用这份节奏表","3.2 怎么用这份节奏表",[13,588,589,590,593],{},"如果你是跟着课程走的，建议把「同样的练习自己重做一遍」当成标准动作：",[46,591,592],{},"读笔记只需要一小时，把练习做出来才真正掌握","。为此每篇末尾都留了带答案的自测题。",[17,595,597],{"id":596},"_4-一个完整交付物里有什么","4 一个完整交付物里有什么",[22,599,601],{"id":600},"_41-九项交付物清单","4.1 九项交付物清单",[13,603,604],{},"一门分析与设计课程最后要交的东西，通常叫用户需求规格说明书（User Requirement Specification, URS）—— 其实就是把上面那些环节的产出装订在一起。清单大致固定：",[58,606,607,612,618,624,630,636,642,648,653],{},[33,608,609,611],{},[46,610,454],{}," —— 你问了什么，对方怎么答；",[33,613,614,617],{},[46,615,616],{},"关键用户画像 + 客户旅程图（Customer Journey Map）"," —— 你选定的代表性用户是谁，他走完一件事要经过哪些步骤、在哪里受挫；",[33,619,620,623],{},[46,621,622],{},"一组用户故事"," —— 通常 10 条左右，覆盖主流程；",[33,625,626,629],{},[46,627,628],{},"用例模型"," —— 系统的功能边界，参与者（Actor）与用例（Use Case）的对应关系；",[33,631,632,635],{},[46,633,634],{},"活动图"," —— 每个重要用例一张，包含分支与例外；",[33,637,638,641],{},[46,639,640],{},"屏幕设计"," —— 关键用例的界面草图与页面之间的跳转；",[33,643,644,647],{},[46,645,646],{},"非功能需求"," —— 性能、安全、可靠性；",[33,649,650,652],{},[46,651,468],{}," —— 不止一条，要覆盖异常输入；",[33,654,655,658],{},[46,656,657],{},"一份面向决策者的提案"," —— 讲清楚现状问题、引入的技术、以及对用户的理解。",[13,660,661],{},"这份清单可以直接当自查表用：哪一项写不出来，说明对应的环节没做到位。",[17,663,665],{"id":664},"_5-这份系列笔记的固定结构","5 这份系列笔记的固定结构",[22,667,669],{"id":668},"_51-贯穿全系列的那一个案例","5.1 贯穿全系列的那一个案例",[13,671,672,673,676],{},"为了让概念落地，从 04 篇起，整个系列用的是",[46,674,675],{},"同一个案例","：",[10,678,679,685,688],{},[13,680,681,684],{},[46,682,683],{},"片区家电维修派单系统（派单宝）"," —— 客户报修 → 客服派单 → 工程师接单上门 → 回填工单 → 仓管备料 → 片区经理看板。",[13,686,687],{},"角色：客户、客服（小林）、工程师（老陈）、仓管（小周）、片区经理（王姐），以及外部的「配件供应商库存系统」。",[13,689,690],{},"痛点：派单靠电话、工程师到现场才发现没配件、客户不知道几点上门、经理月底手工汇总。",[13,692,693],{},"选它的理由有三个：",[30,695,696,702,708],{},[33,697,698,701],{},[46,699,700],{},"四类图都能自然生成","：有判断分支、有外部系统、有 CRUD 界面、有可量化痛点；",[33,703,704,707],{},[46,705,706],{},"贴近真题的形态","：真题就是「一个长案例串起四五个小问」；",[33,709,710,713],{},[46,711,712],{},"每一步都能算","：电话量、缺料率、上门时长都有具体数字，可以被数据验证。",[13,715,716,717,720],{},"案例覆盖不到的地方，各篇会",[46,718,719],{},"另起一个补充案例","（比如 23 篇讲继承映射时就换成了「维修单 \u002F 保修单」）。这是故意的 —— 一个案例讲不了所有情况。",[22,722,724],{"id":723},"_52-每篇的固定骨架","5.2 每篇的固定骨架",[13,726,727],{},"为了让你能按节奏跟踪，每篇都是同一套结构：",[30,729,730,736,742,748],{},[33,731,732,735],{},[46,733,734],{},"开头","：这一环要解决什么具体麻烦（从场景讲起，不从定义讲起）；",[33,737,738,741],{},[46,739,740],{},"中间","：概念、判断标准、可操作的做法，配自绘图示；",[33,743,744,747],{},[46,745,746],{},"「画这一笔」引用块","（涉及作图的篇目）：这个知识点在 draw.io 里具体怎么落笔；",[33,749,750,676,753,757,758,761,762,49],{},[46,751,752],{},"末尾",[754,755,756],"code",{},"本节自测","（6–8 题）+ ",[754,759,760],{},"参考答案","（每题标出对应小节）+ ",[754,763,764],{},"术语表",[22,766,768],{"id":767},"_53-术语的写法约定","5.3 术语的写法约定",[13,770,771,772,775],{},"专业英语名词第一次出现时写作 ",[754,773,774],{},"English（中文）","，之后统一用英文，方便你在读英文文档和 UML 工具时对得上号。",[17,777,756],{"id":756},[58,779,780,783,786,789,792,795,798],{},[33,781,782],{},"需求阶段和设计阶段，「做完了」的验收标准有什么本质区别？",[33,784,785],{},"「系统要快」为什么不能算一条合格的需求？要补上哪些信息才成立？",[33,787,788],{},"用户画像（persona）和用户故事（user story）是什么关系？",[33,790,791],{},"用例模型（use case model）和活动图（activity diagram）分别回答什么问题？",[33,793,794],{},"一份交付物里同时有 ERD 和类图，它们的关注点差别在哪？",[33,796,797],{},"这份系列为什么坚持用同一个贯穿案例？它的代价是什么？",[33,799,800],{},"如果你只有一天准备考试，按 §0.3 的读法应该先读哪两篇？为什么？",[22,802,760],{"id":760},[58,804,805,810,821,828,836,846,857],{},[33,806,807,809],{},[46,808,324],{},"。很多项目出问题是拿错尺子 —— 用「代码能跑」去验收需求（§2）。",[33,811,812,813,816,817,820],{},"因为它缺",[46,814,815],{},"可验证的判断标准","：要补上",[46,818,819],{},"指标 + 条件 + 阈值","三样，例如「早高峰查进度 95 分位 ≤ 2 秒」（§0.1，详见笔记 15）。",[33,822,823,824,827],{},"画像回答「他是谁」（目标、行为、环境、痛点、限制），故事是从画像的某一栏推出来的",[46,825,826],{},"一条可验收的诉求","。每条故事都应该能指回画像的某一栏（笔记 05、07）。",[33,829,830,832,833,835],{},[46,831,628],{},"回答「系统做什么、谁在用」（功能边界）；",[46,834,634],{},"回答「一个用例的流程怎么走」（分支、并行、泳道）（§1.1，笔记 08）。",[33,837,838,841,842,845],{},[46,839,840],{},"ERD 关注数据怎么组织","（实体、关系、基数，为建表服务）；",[46,843,844],{},"类图关注行为怎么归属","（类、属性、操作、关系，为代码服务）。同一个业务概念在两边可能长得不一样（笔记 09 §6、18）。",[33,847,848,849,852,853,856],{},"因为一个案例能让读者看到",[46,850,851],{},"同一条信息在十几个环节里怎么被反复使用"," —— 从一条投诉到一张表、一个类。代价是",[46,854,855],{},"有些知识点这个案例天然没有","（比如继承），所以各篇会另起补充案例（§5.1）。",[33,858,859,862],{},[46,860,861],{},"先读 27 和 28","。因为 27 是一整份卷子的完整演算（读案例→列角色→画图→填表→自检），28 是符号在 draw.io 里怎么落笔。这两篇把「会什么」直接转成「能拿多少分」，突击效率最高（§0.3）。",[17,864,764],{"id":764},[89,866,867,880],{},[92,868,869],{},[95,870,871,874,877],{},[98,872,873],{},"术语",[98,875,876],{},"中文",[98,878,879],{},"一句话解释",[108,881,882,893,904,914,925,936,947,958,969,980,990,1001,1012,1023,1034,1045,1056,1067,1078,1089,1100,1111,1122,1133],{},[95,883,884,887,890],{},[113,885,886],{},"requirement",[113,888,889],{},"需求",[113,891,892],{},"系统必须满足的条件或必须具备的能力",[95,894,895,898,901],{},[113,896,897],{},"functional requirement",[113,899,900],{},"功能需求",[113,902,903],{},"系统要「做什么」",[95,905,906,909,911],{},[113,907,908],{},"non-functional requirement（NFR）",[113,910,646],{},[113,912,913],{},"系统「做得多好」，如性能、安全、可靠性",[95,915,916,919,922],{},[113,917,918],{},"scoping",[113,920,921],{},"范围界定",[113,923,924],{},"明确哪些进范围、哪些明确不做",[95,926,927,930,933],{},[113,928,929],{},"fact finding",[113,931,932],{},"事实调查",[113,934,935],{},"访谈、观察、问卷等获取需求手段的总称",[95,937,938,941,944],{},[113,939,940],{},"stakeholder",[113,942,943],{},"利益相关者",[113,945,946],{},"对系统有影响或被系统影响的角色",[95,948,949,952,955],{},[113,950,951],{},"actor",[113,953,954],{},"参与者",[113,956,957],{},"与系统交互的外部角色，可以是人也可以是外部系统",[95,959,960,963,966],{},[113,961,962],{},"use case",[113,964,965],{},"用例",[113,967,968],{},"一个参与者通过系统达成某个目标的过程",[95,970,971,974,977],{},[113,972,973],{},"scenario",[113,975,976],{},"场景",[113,978,979],{},"用例的一条具体走法",[95,981,982,985,987],{},[113,983,984],{},"activity diagram",[113,986,634],{},[113,988,989],{},"描述流程步骤、分支与并行的图",[95,991,992,995,998],{},[113,993,994],{},"persona",[113,996,997],{},"用户画像",[113,999,1000],{},"一个虚构但典型的用户档案",[95,1002,1003,1006,1009],{},[113,1004,1005],{},"customer journey map",[113,1007,1008],{},"客户旅程图",[113,1010,1011],{},"用户完成目标的步骤、触点与情绪记录",[95,1013,1014,1017,1020],{},[113,1015,1016],{},"user story",[113,1018,1019],{},"用户故事",[113,1021,1022],{},"从使用者视角描述一条功能的一句话",[95,1024,1025,1028,1031],{},[113,1026,1027],{},"domain model",[113,1029,1030],{},"领域模型",[113,1032,1033],{},"业务概念及其关系的模型",[95,1035,1036,1039,1042],{},[113,1037,1038],{},"entity relationship diagram（ERD）",[113,1040,1041],{},"实体关系图",[113,1043,1044],{},"数据实体、关系与基数的图形表示",[95,1046,1047,1050,1053],{},[113,1048,1049],{},"cardinality",[113,1051,1052],{},"基数",[113,1054,1055],{},"关系两端各自可以有多少个实例",[95,1057,1058,1061,1064],{},[113,1059,1060],{},"normalization",[113,1062,1063],{},"规范化",[113,1065,1066],{},"按规则调整表结构，减少冗余与更新异常",[95,1068,1069,1072,1075],{},[113,1070,1071],{},"logical data model（LDM）",[113,1073,1074],{},"逻辑数据模型",[113,1076,1077],{},"规范化之上、补齐关系的详细数据模型",[95,1079,1080,1083,1086],{},[113,1081,1082],{},"class diagram",[113,1084,1085],{},"类图",[113,1087,1088],{},"用类、属性、操作与关系描述静态结构",[95,1090,1091,1094,1097],{},[113,1092,1093],{},"sequence diagram",[113,1095,1096],{},"顺序图",[113,1098,1099],{},"用对象之间的消息往来描述交互，纵向是时间",[95,1101,1102,1105,1108],{},[113,1103,1104],{},"analysis modelling",[113,1106,1107],{},"分析建模",[113,1109,1110],{},"把用例分摊到协作的对象上",[95,1112,1113,1116,1119],{},[113,1114,1115],{},"design modelling",[113,1117,1118],{},"设计建模",[113,1120,1121],{},"把对象模型落到数据库、访问层与框架上",[95,1123,1124,1127,1130],{},[113,1125,1126],{},"refactoring",[113,1128,1129],{},"重构",[113,1131,1132],{},"不改变外部行为的前提下改善内部结构",[95,1134,1135,1138,1141],{},[113,1136,1137],{},"user requirement specification（URS）",[113,1139,1140],{},"用户需求规格说明书",[113,1142,1143],{},"汇总用户需求的正式交付文档",{"title":1145,"searchDepth":1146,"depth":1146,"links":1147},"",3,[1148,1154,1158,1159,1163,1166,1171,1174],{"id":19,"depth":1149,"text":20,"children":1150},2,[1151,1152,1153],{"id":24,"depth":1146,"text":25},{"id":52,"depth":1146,"text":53},{"id":83,"depth":1146,"text":84},{"id":159,"depth":1149,"text":160,"children":1155},[1156,1157],{"id":176,"depth":1146,"text":177},{"id":209,"depth":1146,"text":210},{"id":242,"depth":1149,"text":243},{"id":328,"depth":1149,"text":329,"children":1160},[1161,1162],{"id":332,"depth":1146,"text":333},{"id":585,"depth":1146,"text":586},{"id":596,"depth":1149,"text":597,"children":1164},[1165],{"id":600,"depth":1146,"text":601},{"id":664,"depth":1149,"text":665,"children":1167},[1168,1169,1170],{"id":668,"depth":1146,"text":669},{"id":723,"depth":1146,"text":724},{"id":767,"depth":1146,"text":768},{"id":756,"depth":1149,"text":756,"children":1172},[1173],{"id":760,"depth":1146,"text":760},{"id":764,"depth":1149,"text":764},"学习",null,"2026-10-23","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","md",false,{},true,"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01",{"title":5,"description":1178},"软件分析与设计笔记",1,"posts\u002FswDesign\u002Fsw-design-notes-01",[1189,1190,1191,1192],"软件工程","需求分析","软件设计","学习笔记","IyyMEeneit7VbmFFucLwXqj536uIDmDJRlJo24JVkSo",[1195,1201,1207,1213,1219,1225,1231,1237,1243,1249,1255,1261,1267,1273,1279,1285,1291,1297,1303,1309,1315,1321,1327,1333,1339,1345,1350,1355,1356,1362,1366,1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1412,1416,1422,1426,1430,1434,1438,1442,1446,1450,1455,1459,1463,1468,1473,1479,1483,1488,1492],{"path":1196,"title":1197,"description":1198,"date":1199,"series":1185,"seriesOrder":1200},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19",28,{"path":1202,"title":1203,"description":1204,"date":1205,"series":1185,"seriesOrder":1206},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":1208,"title":1209,"description":1210,"date":1211,"series":1185,"seriesOrder":1212},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":1214,"title":1215,"description":1216,"date":1217,"series":1185,"seriesOrder":1218},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":1220,"title":1221,"description":1222,"date":1223,"series":1185,"seriesOrder":1224},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":1226,"title":1227,"description":1228,"date":1229,"series":1185,"seriesOrder":1230},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":1232,"title":1233,"description":1234,"date":1235,"series":1185,"seriesOrder":1236},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":1238,"title":1239,"description":1240,"date":1241,"series":1185,"seriesOrder":1242},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":1244,"title":1245,"description":1246,"date":1247,"series":1185,"seriesOrder":1248},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",20,{"path":1250,"title":1251,"description":1252,"date":1253,"series":1185,"seriesOrder":1254},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",19,{"path":1256,"title":1257,"description":1258,"date":1259,"series":1185,"seriesOrder":1260},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",18,{"path":1262,"title":1263,"description":1264,"date":1265,"series":1185,"seriesOrder":1266},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",17,{"path":1268,"title":1269,"description":1270,"date":1271,"series":1185,"seriesOrder":1272},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",16,{"path":1274,"title":1275,"description":1276,"date":1277,"series":1185,"seriesOrder":1278},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",15,{"path":1280,"title":1281,"description":1282,"date":1283,"series":1185,"seriesOrder":1284},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",14,{"path":1286,"title":1287,"description":1288,"date":1289,"series":1185,"seriesOrder":1290},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",13,{"path":1292,"title":1293,"description":1294,"date":1295,"series":1185,"seriesOrder":1296},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",12,{"path":1298,"title":1299,"description":1300,"date":1301,"series":1185,"seriesOrder":1302},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",11,{"path":1304,"title":1305,"description":1306,"date":1307,"series":1185,"seriesOrder":1308},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",10,{"path":1310,"title":1311,"description":1312,"date":1313,"series":1185,"seriesOrder":1314},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",9,{"path":1316,"title":1317,"description":1318,"date":1319,"series":1185,"seriesOrder":1320},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",8,{"path":1322,"title":1323,"description":1324,"date":1325,"series":1185,"seriesOrder":1326},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",7,{"path":1328,"title":1329,"description":1330,"date":1331,"series":1185,"seriesOrder":1332},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",6,{"path":1334,"title":1335,"description":1336,"date":1337,"series":1185,"seriesOrder":1338},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",5,{"path":1340,"title":1341,"description":1342,"date":1343,"series":1185,"seriesOrder":1344},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",4,{"path":1346,"title":1347,"description":1348,"date":1349,"series":1185,"seriesOrder":1146},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":1351,"title":1352,"description":1353,"date":1354,"series":1185,"seriesOrder":1149},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","2026-10-24",{"path":1183,"title":5,"description":1178,"date":1177,"series":1185,"seriesOrder":1186},{"path":1357,"title":1358,"description":1359,"date":1360,"series":1361,"seriesOrder":1186},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":1363,"title":1364,"description":1365,"date":1360,"series":1361,"seriesOrder":1149},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":1367,"title":1368,"description":1369,"date":1360,"series":1361,"seriesOrder":1146},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":1371,"title":1372,"description":1373,"date":1360,"series":1361,"seriesOrder":1344},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":1375,"title":1376,"description":1377,"date":1360,"series":1361,"seriesOrder":1338},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":1379,"title":1380,"description":1381,"date":1360,"series":1361,"seriesOrder":1332},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":1383,"title":1384,"description":1385,"date":1360,"series":1361,"seriesOrder":1326},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":1387,"title":1388,"description":1389,"date":1360,"series":1361,"seriesOrder":1320},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":1391,"title":1392,"description":1393,"date":1360,"series":1361,"seriesOrder":1314},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":1395,"title":1396,"description":1397,"date":1360,"series":1361,"seriesOrder":1308},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":1399,"title":1400,"description":1401,"date":1360,"series":1361,"seriesOrder":1302},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":1403,"title":1404,"description":1405,"date":1360,"series":1361,"seriesOrder":1296},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":1407,"title":1408,"description":1409,"date":1410,"series":1411,"seriesOrder":1344},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":1413,"title":1414,"description":1415,"date":1410,"series":1411,"seriesOrder":1146},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":1417,"title":1418,"description":1419,"date":1420,"series":1421,"seriesOrder":1344},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04","MySQL 学习笔记 04：数据操纵（增删改）","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。","2026-10-10","SQL 学习笔记",{"path":1423,"title":1424,"description":1425,"date":1420,"series":1421,"seriesOrder":1338},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":1427,"title":1428,"description":1429,"date":1420,"series":1421,"seriesOrder":1332},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06","MySQL 学习笔记 06：CREATE TABLE 与数据类型","MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。",{"path":1431,"title":1432,"description":1433,"date":1420,"series":1421,"seriesOrder":1326},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":1435,"title":1436,"description":1437,"date":1420,"series":1421,"seriesOrder":1320},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":1439,"title":1440,"description":1441,"date":1420,"series":1421,"seriesOrder":1314},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":1443,"title":1444,"description":1445,"date":1420,"series":1421,"seriesOrder":1308},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":1447,"title":1448,"description":1449,"date":1420,"series":1421,"seriesOrder":1302},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":1451,"title":1452,"description":1453,"date":1454,"series":1421,"seriesOrder":1186},"\u002Fposts\u002Fmysql\u002Fmysql-learning-01","MySQL 学习笔记 01：MySQL 基础知识","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。","2026-10-09",{"path":1456,"title":1457,"description":1458,"date":1454,"series":1421,"seriesOrder":1149},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":1460,"title":1461,"description":1462,"date":1454,"series":1421,"seriesOrder":1146},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03","MySQL 学习笔记 03：聚合、分组与输出控制","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。",{"path":1464,"title":1465,"description":1466,"date":1467,"series":1411,"seriesOrder":1149},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":1469,"title":1470,"description":1471,"date":1472,"series":1411,"seriesOrder":1186},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":1474,"title":1475,"description":1476,"date":1477,"series":1478,"seriesOrder":1186},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":1480,"title":1481,"description":1482,"date":1477,"series":1478,"seriesOrder":1149},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":1484,"title":1485,"description":1486,"date":1477,"series":1487,"seriesOrder":1186},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":1489,"title":1490,"description":1491,"date":1477,"series":1487,"seriesOrder":1149},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":1493,"title":1494,"description":1495,"date":1477,"series":1487,"seriesOrder":1146},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268151473]