这里记录我的技术学习与生活思考。
UML 建模
下面把 UML 建模(下午试题三)相关的知识点系统整理成一份完整文档,结构参照 DFD 和 ER,从 UML 整体定位、六大关系、类图、用例图、序列图,到考试题型、答题方法和检查清单,最后给出背诵口诀。 UML 建模 · 系统整理 一、UML 在软考中的定位 UML 建模是下午试题三(15 分必答),考法以补充类名、补充多重度、补充用例关系、补充消息名为主,极少要求从零画整张图。 软件设计师涉及的 UML 图按用途分为三类: 静态建模:类图、对象图、用例图。 动态建模:序列图(时序图/顺序图)、通信图、状态图、活动图。 物理建模:构件图、部署图。 下午题高频图种是类图和用例图,序列图次之;状态图和活动图偶尔出现,通常只要求补状态名或转换条件。上午选择题则可能涉及图的分类(静态/动态/物理)和接口、部署图的使用阶段等边角知识。 二、UML 类图的六大关系(核心考点) 类图是 UML 的核心,描述系统的静态结构——类的属性、方法以及类与类之间的关系。六大关系必须从符号、语义、代码表现、强度排序四个维度同时掌握。 1. 六种关系总表 关系 线条与端点符号 箭头/菱形方向 语义 代码表现 依赖 虚线 + 开口箭头 指向被依赖的类 临时使用,一方变化“波及”另一方 方法参数、局部变量、返回值 关联 实线(可带开口箭头) 有箭头时指向被关联类 长期结构关系,“知道并持有” 成员变量 聚合 实线 + 空心菱形 菱形在整体端 弱拥有,部分可脱离整体独立存在 成员变量,外部注入 组合 实线 + 实心菱形 菱形在整体端 强拥有,部分生命周期由整体控制 成员变量,整体内部创建 泛化(继承) 实线 + 空心三角 三角尖端指向父类 “is-a”,子类继承父类 extends(Java) 实现 虚线 + 空心三角 三角尖端指向接口 类实现接口契约 implements(Java) 符号速记:依赖虚线开口,关联实线直连;聚合空心菱,组合实心菱;泛化实线空心三角,实现虚线空心三角。菱形永远在整体端。 ...
数据库ER 实体-联系图
下面把 ER(实体-联系图)相关的所有知识点系统整理成一份完整文档,从概念、符号、联系类型、转换规则、范式到考试题型和答题方法,层层递进,最后给出检查清单和背诵口诀。 ER 实体-联系图 · 系统整理 一、ER 图是什么 ER 图(Entity-Relationship Diagram,实体-联系图)是概念设计阶段的工具,用图形方式描述业务中的实体、属性和联系。它回答三个问题:业务中有哪些对象、每个对象有哪些特征、对象之间是什么关系。 ER 图是下午试题二(15分必答)的核心,通常与“E-R 图转关系模式、判断主键外键、判断范式”结合考查。考试中很少要求从零画完整 ER 图,更多是补充缺失的联系或属性,然后把图转换成关系模式。 二、ER 图的三种基本元素 ER 图只有三种基本符号,形状必须标准,命名和标注规则必须遵守。 元素 标准图形 内部写什么 命名规则 连线方式 实体 封闭矩形 实体名称 名词(客户、订单、学生、课程) — 属性 椭圆 属性名称 名词(学号、姓名、成绩) 用无向边(不带箭头)连到所属实体或联系 联系 菱形 联系名称 动词(选修、预订、属于) 用无向边连到相关实体,连线旁标联系类型 各元素详解 实体 业务中需要长期管理的对象,用封闭矩形表示。 命名用名词,如“客户”“订单”“商品”“学生”“课程”。 矩形四边全封,与 DFD 的外部实体形状相同,但语义不同:ER 的实体是业务对象,DFD 的外部实体是系统边界之外的数据源点。 属性 描述实体或联系的特征,用椭圆表示。 用无向边(不带箭头的实线)连接到所属实体或联系。 主键标注:能唯一标识实体的属性(主键),在椭圆内属性名下方画一条实线下划线。例如“学号”加下划线表示它是学生实体的主键。 外键标注:通常用虚下划线标注(下午题关系模式填空时常用实下划线标主键)。 属性连线不能带箭头,带箭头是高频错误。 联系 表示实体之间的业务关联,用菱形表示。 命名用动词或动词短语,如“选修”“预订”“属于”“供应”。 用无向边分别连接到相关实体。 联系类型必须标在连线旁(不是写在菱形里),用 1:1、1:n、m:n 表示。 三、三种联系类型及画法 1:1(一对一) 标注方式:菱形两侧连线旁都标 1(或 1:1)。 示例:班级与班长——一个班只有一个班长,一个班长只在一个班。 画法:班级 —1— ◇属于◇ —1— 班长 1:n(一对多) 标注方式:连接到“1端”实体的线旁标 1,连接到“多端”实体的线旁标 n 或 m。 示例:部门与员工——一个部门有多名员工,一名员工只属于一个部门。部门旁标 1,员工旁标 n。 画法:部门 —1— ◇拥有◇ —n— 员工 注意:“1”端和“n”端不能反,“1”在少的一端,“n”在多的一端。 m:n(多对多) 标注方式:菱形两侧连线旁分别标 m 和 n。 示例:学生与课程——一个学生选多门课,一门课被多个学生选。学生旁标 m,课程旁标 n。 画法:学生 —m— ◇选修◇ —n— 课程 联系类型标注的三个关键 标在连线旁,不是写在菱形里面。 不用箭头,ER 图用无向边加数字标注,不用箭头表示方向。 两端都要标,不能只标一端。 四、联系自身的属性(高频丢分点) 属性不只能属于实体,联系本身也可以有属性。 ...
数据流图 DFD
下面把 DFD(数据流图)相关的所有知识点系统整理成一份完整文档,从概念、符号、分层、平衡、命名、连线到考试题型和答题方法,层层递进,最后给出背诵清单和速记口诀。 DFD 数据流图 · 系统整理 一、DFD 是什么 DFD(Data Flow Diagram,数据流图)是一种结构化分析工具,用图形方式描述系统的数据流动和加工过程。它回答四个问题:数据从哪里来、经过什么加工、存到哪里、最后输出给谁。 DFD 只关心数据流,不关心控制流、时序和判断条件。它是下午试题一(15分必答)的固定题型。 二、DFD 的四个基本元素 DFD 只有四种符号,必须条件反射地识别和画对。 元素 标准图形 内部写什么 命名规则 核心约束 外部实体 封闭矩形 实体名称 名词(客户、财务部门、银行系统) 系统边界之外,是数据源点或终点 加工 圆角矩形(推荐)或圆形 编号 + 加工名(P1 验证订单) 动词 + 名词,不能只写动词 必须有输入,必须有输出 数据存储 开口矩形(右边开口)或两条平行线 编号 + 名称(D1 订单表) 名词(表/文件/库/清单/档案) 只能与加工相连 数据流 带箭头的直线(单向) 流名称写在线上方 名词短语(订单数据、付款通知) 至少一端是加工,不能用动词命名 各元素详解 外部实体 系统边界之外的人、组织或外部系统。 同一实体可在图中不同位置多次出现,角落加斜线标记。 外部实体之间不能直连,必须经过加工中转。 顶层图中外部实体与系统加工之间的数据流,必须原样出现在0层图中(父子平衡)。 加工 对数据执行变换或处理的功能单元。 编号从 P1 开始(顶层图的整体系统加工为 P0)。 每个加工至少一条输入流和至少一条输出流。只有入没有出是“数据黑洞”,只有出没有入是“数据奇迹”,都是硬性错误。 更深层子图用父编号加点号:P1.1、P1.2,体现逐层分解。 数据存储 数据的静态存放处,本身不加工数据。 开口矩形三条边、右边不封口;左侧小格写 D 编号,右侧写名称。两条平行线是简化画法,左右都不封口。 不能画成封闭矩形(会和外部实体混淆),不能画成圆角矩形(会和加工混淆)。 数据存储只能与加工相连:箭头指向存储 = 写入;箭头从存储引出 = 读取。 数据存储之间不能直连,外部实体与数据存储之间也不能直连。 数据流 ...
结合真题的考点
以下是结合2022—2026年真题考点提炼的上午选择题背诵条目,共 510 条。每条给出结论/原理 + 真题考查形式或典型陷阱,按模块编号。 一、计算机组成与体系结构(1—65) 1. CPU由运算器、控制器、寄存器组和内部总线组成。真题常问“CPU核心部件不包括什么”,存储器不属于CPU核心部件。 2. 运算器核心部件:ALU(算术逻辑单元)、AC(累加器)、DR(数据缓冲寄存器)、PSW(状态条件寄存器) 。 3. 控制器核心部件:PC(程序计数器)、IR(指令寄存器)、指令译码器、时序部件。 4. PC存下一条指令地址,IR存当前指令。2024—2025反复考“PC存当前指令”为错误选项。 5. IR对用户完全透明,用户程序不能直接访问;PC用户可见(可编程访问)。透明性辨析是常考点。 6. 补码的作用:将减法转化为加法,简化运算器设计。2024下半年考过“求补码真值”。 7. 已知X的补码,求−X的补码:连同符号位一起按位取反,末位加1。2025下半年直接考查。 8. 移码:只把补码的符号位取反,其余位不变。常用于浮点数的阶码。 9. 正数的原码、反码、补码三者相同;负数的反码是原码数值位按位取反(符号位不变),补码是反码末位加1。 10. 机器字长为n时,补码表示范围:−2ⁿ⁻¹ 到 2ⁿ⁻¹−1;原码和反码范围:−(2ⁿ⁻¹−1) 到 2ⁿ⁻¹−1。 11. 浮点数:阶码决定范围,尾数决定精度。阶码越长范围越大,尾数越长精度越高。 12. 浮点数运算步骤:对阶→尾数运算→规格化→舍入→溢出判断。 13. 海明校验码:可检错也可纠错,校验位公式 2^r ≥ r + m + 1(m数据位,r校验位)。连续多年考查。 14. 奇偶校验:只能检错,不能纠错。 15. CRC循环冗余校验:可检错,不可纠错,用模2除法计算。 16. 流水线周期:等于各段中最慢的那一段时间。2025下半年给出取指2ns、分析2ns、执行1ns,周期为2ns。 17. 流水线执行时间:单条指令完整时间 +(指令数n−1)× 流水线周期。注意第1条走完全部工段。 18. 流水线吞吐率 = 1 / 流水线周期(指令不重叠时),或按“指令数 / 总时间”计算。 19. 流水线加速比 = 不使用流水线的时间 / 使用流水线的时间。 20. 寻址方式快慢排序:立即寻址 > 寄存器寻址 > 直接寻址 > 间接寻址。立即最快(操作数在指令中),间接最慢(多次访存)。 ...
应用技术科目
下午应用技术科目共 5 道大题,每题 15 分,合计 75 分。前 4 题必答(数据流图、数据库设计、UML 建模、C 语言算法),第 5/6 题二选一(Java 或 C++ 设计模式)。整体难度分层很明显:数据流图、数据库、UML 是“套路题”,背熟规则就能拿 12 分以上;算法是“稳分题”,目标 7—10 分;设计模式是“送分题”,模板背熟可以冲满分。下面按题型逐一展开,每条都落在可背诵、可套用的规则上。 一、数据流图(DFD)—— 15 分必拿题 数据流图考的是“把业务文字翻译成图,再把图里的错误找出来”。四个元素必须条件反射地识别: 外部实体:系统边界之外的“人/组织/外部系统”。题干中的“用户、客户、管理员、银行、供应商”都是实体词。注意:如果系统本身是中间件,后台数据库反而应识别为外部实体。 数据存储:名字带“文件、表、库、清单、档案”的,基本就是存储。找到存储后,看哪个加工需要读写它,补连线。 加工:命名必须是“动词 + 名词”(如“生成报告”“验证借书证”),不能只有一个动词。 数据流:命名必须是名词短语(如“工资数据”“付款通知”),不能写成“计算工资” ——用加工名命名数据流是最高频的扣分点之一。 答题顺序:先读题干圈出所有实体词和存储词 → 对比顶层图与 0 层图的输入输出是否一致 → 逐句读题干,看哪个加工“提到要读某存储但图上没有入线/出线” → 补全缺失的数据流。 三大铁律(违反必扣分) :数据存储之间不能直连;外部实体之间不能直连;每个加工必须有入有出,不能是“数据黑洞”或“数据奇迹”。 采分要点:补充数据流时用题干原词,不要自己发明口语化名称;答案写成“在加工 Y 与存储 Z 之间添加数据流‘XX 信息’”,方向要明确。 二、数据库设计 —— 15 分必拿题 先找实体,不要先想表。实体通常是业务中需要长期管理的对象(客户、订单、商品、学生、课程)。 E-R 转关系模式三规则(直接背) : 1 : 1:任一方主键放入另一方作外键(或两表合并)。 1 : N:1 端的主键放入 N 端作外键。例如客户和订单,订单表里保存客户编号。 M : N:必须单独建一张联系表,字段 = 双方主键 + 联系自身的属性(如选课成绩、选课时间)。不能把课程编号直接塞进学生表。 主键与外键判定:题干出现“唯一标识”“编号”“身份证号”的,基本是主键候选。A 表里出现了 B 表的主键,它就是外键。M:N 联系表中,双方主键的组合是主键,同时各自也是外键。 ...
软件设计师考点背诵
下面把前面三块内容合并去重、按“上午选择题必背 → CPU 组成专题 → 下午应用题必背 → 优先级与速记”四部分完整整理。通俗解释和记忆抓手保留,便于直接背诵。 一、上午选择题必背清单 (一)计算机组成与体系结构(约12分) 1. 流水线计算 背熟:流水线周期 = 各段中最慢的那段时间。执行时间 = 单条指令完整时间 +(指令数 − 1)× 流水线周期。吞吐率 = 指令数 / 总时间。 通俗:像工厂装配线,速度由最慢工位决定;第1条走完全程,之后每条只再等“最慢工位”那么久。 2. 浮点数 背熟:阶码决定范围,尾数决定精度。阶码越长范围越大,尾数越长精度越高。 3. Cache 背熟:Cache 是除寄存器外最快的存储层次,缓解 CPU 与主存之间的速度矛盾,依据是局部性原理。 4. 校验码 背熟:奇偶校验只检错不纠错;CRC 可检错不可纠错;海明码可检错也可纠错,校验位公式 2^r ≥ r + m + 1(m 数据位,r 校验位)。 5. 码制转换 背熟:正数原码、反码、补码相同;负数反码 = 原码数值位按位取反(符号位不变),补码 = 反码末位加1;移码 = 补码符号位取反。 通俗:补码存在的唯一目的,是让减法能用加法电路完成,省掉一套减法硬件。 常考:问“补码的作用”,选“将减法转化为加法,简化运算器设计”。 6. 寻址方式(高频辨析) 背熟:立即寻址最快(操作数写在指令里,不访存);间接寻址最慢(多次访存);寄存器寻址也快;直接寻址指令中放的是操作数地址。 通俗:立即=答案写在题目里;直接=题目给房间号;间接=题目给信封,信封里才是房间号。 7. 总线分类 背熟:数据总线双向,地址总线单向(CPU发出地址),控制总线双向。 8. 系统可靠性计算 背熟:串联可靠度 = 各部件相乘;并联可靠度 = 1 − 各部件失效率相乘(即 1 − (1−R)ⁿ)。 通俗:串联像铁链,一环断全断,所以乘;并联像多条备份路线,全断才断,所以算“全坏”再1减。 易错:并联不是直接相乘可靠度,是先求全失效概率再1减。 9. I/O 数据传输方式 ...
CSP(Communicating Sequential Processes)详解
CSP(通信顺序进程)详解 CSP(通信顺序进程)是由图灵奖得主托尼·霍尔提出的并发系统代数理论,核心思想是通过独立进程间的显式消息通信替代共享内存,从根源上降低并发编程的复杂度。 📜 理论起源与发展 1978年,英国计算机科学家 托尼·霍尔 首次正式阐述CSP理论,1985年出版同名专著《Communicating Sequential Processes》。 1984年,霍尔与合作者提出TCSP理论,扩展出事件隐蔽、递归等核心算子,形成完整的基于事件的代数演算系统。 CSP 是 Tony Hoare(图灵奖得主,快速排序的发明者)在 1978 年发表的一篇同名论文中提出的并发编程理论模型。它的核心主张极其简洁: 不要通过共享内存来通信,而应该通过通信来共享内存。 “Do not communicate by sharing memory; instead, share memory by communicating.” 这句话后来成为 Go 语言并发哲学的灵魂,也是 Go 官方文档里反复强调的设计原则。理解 CSP,才能理解为什么 Go 的并发原语长成 goroutine + channel + select 这个样子。 一、CSP 要解决什么问题 在 CSP 出现之前,并发编程的主流范式是共享内存 + 锁。多个线程读写同一块内存,靠互斥锁、信号量、条件变量保证正确性。这种范式的问题在实践中暴露得非常充分: 问题 表现 竞态条件(Race Condition) 结果依赖线程调度的时序,偶发、难复现 死锁(Deadlock) 两个线程各持一把锁、互相等对方的锁 锁粒度难把握 锁太粗性能差,锁太细正确性难保证 可读性差 锁的获取/释放散落在各处,逻辑不连贯 CSP 提出的思路是从根本上取消共享内存这个媒介:每个并发实体(在 CSP 里叫"进程",在 Go 里叫 goroutine)拥有私有的状态,它们之间只能通过消息传递来交换数据。既然没有共享内存,就不需要锁,竞态和死锁问题在模型层面被大幅消解。 二、CSP 的核心抽象 CSP 理论模型里有三个基本要素: ...
Template text/template 完全学习
Go 语言 text/template 完全指南 text/template 是 Go 标准库自带的模板引擎,专门用于生成任意文本输出(HTML、配置文件、代码、Prompt 等)。下面从零讲到进阶,每个知识点都配可运行代码。 一、为什么需要模板引擎? 假设你要生成一段 Prompt: 1 2 // 字符串拼接 prompt := "你是一个" + role + "助手。请用" + style + "风格回答。" 一旦需求变复杂——要根据条件加 few-shot 示例、要循环生成示例、要做 A/B 实验——字符串拼接就变得难以维护。 模板引擎把"文案"和"逻辑"分离: 你是一个{{ .Role }}助手。请用{{ .Style }}风格回答。 代码只负责提供数据,模板负责渲染。 二、最小可运行示例 main.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import ( "os" "text/template" ) func main() { tmpl := template.Must(template.New("hello").Parse("你好,{{ .Name }}!你今年 {{ .Age }} 岁。\n")) data := map[string]any{ "Name": "小明", "Age": 18, } if err := tmpl.Execute(os.Stdout, data); err != nil { panic(err) } } 运行: ...
Template 系统性学习
Go Template 系统性学习指南 Go 标准库的模板引擎是服务端渲染和数据驱动的文本生成工具,核心设计理念是将表现层与数据模型分离。Go 用同一套语法提供了两个包:text/template 用于通用文本生成,html/template 用于 HTML 输出并自带上下文感知的自动转义安全机制。网络服务中生成 HTML 必须使用 html/template。 一、基础用法:三步流程 模板使用的核心流程固定为三步:定义/解析模板 → 准备数据 → 执行渲染。 1.1 从字符串解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package main import ( "os" "text/template" ) type Inventory struct { Material string Count uint } func main() { // 步骤1:解析模板 tmpl := template.Must(template.New("test"). Parse("{{.Count}} items are made of {{.Material}}")) // 步骤2:准备数据 sweaters := Inventory{"wool", 17} // 步骤3:执行渲染 tmpl.Execute(os.Stdout, sweaters) // 输出:17 items are made of wool } template.Must 是对 Parse 错误的 panic 包装,适合在包初始化阶段使用。模板中只能访问结构体的导出字段(首字母大写),小写字段在模板侧不可达,会导致执行期报错或呈现零值。 ...
Goroutine sync.Mutex 互斥锁详解
Go 语言 sync.Mutex 互斥锁详解 sync.Mutex 是 Go 标准库 sync 包提供的互斥锁,用来保护共享资源,防止多个 goroutine 同时读写导致数据竞争。 一、为什么需要互斥锁? 先看一个没有锁的经典问题: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "fmt" "sync" ) func main() { counter := 0 var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter++ // ⚠️ 数据竞争 }() } wg.Wait() fmt.Println("counter =", counter) } 多次运行,输出经常小于 1000,比如 987、993、1000 不固定。原因: ...