ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

软件设计师考试高频失分点与核心知识框架拆解

软件设计师考试高频失分点与核心知识框架拆解

1. 软件设计师考试的核心知识框架拆解

软件设计师考试走到第9篇笔记这个节点,基本上已经把计算机组成原理、操作系统、数据库、计算机网络这些硬骨头啃得差不多了。但很多人复习到后面会发现一个尴尬的问题:前面学的知识点像散落的珠子,串不起来。考试的时候题目稍微换个角度,就不知道考的是哪个模块的内容了。这篇笔记的核心目的,就是帮你把软件设计师考试里最容易混淆、最容易丢分的几个知识板块重新梳理一遍,尤其是那些“看起来会了、一做题就错”的部分。

软件设计师考试的全称是计算机技术与软件专业技术资格(水平)考试中的中级资格,它考察的是你能不能独立完成一个软件模块的设计和开发。上午题75道选择题,下午题5道大题,总分都是75分,各需45分及格。很多人上午题能考60多分,下午题却卡在40分上下,问题往往出在数据流图、数据库设计、UML图这些实操性强的题目上。这篇笔记会重点围绕这些高频失分点展开,同时把面向对象设计、算法分析、设计模式这些核心内容重新串一遍。

适合谁来参考这篇笔记?如果你已经过了一遍教材,做了一些真题,但正确率忽高忽低,或者你是在职备考时间碎片化,需要一份能快速定位薄弱环节的复习指南,那这篇内容就是为你准备的。我会尽量用从业者的视角,把每个知识点的“为什么这么考”和“怎么答才得分”讲清楚,而不是照本宣科地复述教材。

1.1 从考试大纲反推复习优先级

软件设计师的考试大纲把内容分成六大模块:计算机与软件工程基础知识、程序设计语言、数据结构与算法、操作系统、软件工程、数据库与网络。但大纲只是告诉你考什么,没告诉你哪些是必考、哪些是选考、哪些是送分题。我自己的经验是,把近五年的真题按知识点分类统计一遍,你会发现几个规律。

数据结构与算法部分,上午题稳定在10到12分,下午题必有一道算法设计题,分值15分。这道题通常是动态规划、贪心、分治或者回溯中的一种,题目会给出算法描述和伪代码,让你填空并分析时间复杂度。很多人看到算法题就慌,其实这道题的套路非常固定,后面我会专门拆解。

软件工程部分,上午题8到10分,下午题必有一道数据流图或UML图题,分值15分。数据流图考的是分层分解和平衡原则,UML图考的是用例图、类图、序列图、状态图之间的转换和语义。这两类题目的共同特点是:有标准答案,但标准答案的表述方式有讲究,写得不规范就扣分。

数据库部分,上午题6到8分,下午题通常和软件工程题合并出现,或者单独出一道数据库设计题。重点在ER图转关系模式、范式判断、SQL查询填空。网络部分上午题5到7分,下午题偶尔出现,重点在IP地址计算、子网划分、协议层次。

提示:复习时间有限的情况下,优先保证数据结构和算法、软件工程、数据库这三个板块的得分率,它们占了下午题60%以上的分值。

1.2 上午题和下午题的复习策略差异

上午题是选择题,考察的是知识面的广度,很多题目你不需要完全理解,靠排除法和常识就能选对。但下午题是主观题,考察的是表达的准确性和逻辑的严密性。这两者的复习方法完全不同。

上午题的复习,我建议用“刷题+错题归因”的方式。每做完一套真题,把错题按知识点分类,看看是哪个模块的问题。如果同一个知识点连续错三次,那就回去把教材对应章节重新看一遍。上午题不需要背太多东西,但需要你对概念有清晰的边界认知。比如“耦合”和“内聚”这两个概念,很多人知道耦合越低越好、内聚越高越好,但具体到题目里给出一段代码让你判断是哪种耦合,就容易懵。

下午题的复习,核心是“动手写”。数据流图要自己画一遍,UML图要自己画一遍,SQL要自己写一遍。光看答案觉得会了,一上手就发现不是漏了数据流就是画错了关系。下午题的评分标准是按点给分,所以答题时要尽量把关键步骤写清楚,哪怕最终结果不对,过程对了也能拿分。

2. 数据结构与算法的高频考点拆解

数据结构与算法是软件设计师考试里分值最高、也最容易拉开差距的模块。上午题考选择题,下午题考算法设计。很多人觉得算法难,是因为没有抓住考试的重点。软件设计师考试不是算法竞赛,它考察的是你对经典算法的理解和应用能力,而不是让你发明新算法。

2.1 下午算法题的固定套路

下午的算法题通常是一道15分的大题,题目会给出一个实际问题的描述,然后给出算法的伪代码,其中留出几个空让你填。最后还会问算法的时间复杂度和空间复杂度。这道题的出题范围非常集中,基本上就是排序、查找、动态规划、贪心、回溯、分治这几类。

我统计过近几年的真题,动态规划出现的频率最高,其次是贪心和分治。动态规划的题目通常是最长公共子序列、背包问题、最短路径的变种。贪心通常是活动安排、哈夫曼编码、最小生成树。分治通常是归并排序、快速排序、二分查找的变种。

做这类题的关键是:先看题目描述,判断它属于哪一类算法。然后看伪代码的结构,通常会有初始化部分、循环部分、递归部分。填空的位置往往在循环的边界条件、递归的返回条件、状态转移方程这几处。

举个例子,如果题目描述里出现了“最优解”“最大值”“最小值”这样的词,而且问题可以分解成子问题,那大概率是动态规划。动态规划的核心是找到状态转移方程,也就是当前状态和之前状态的关系。伪代码里通常会有一个二维数组或者一维数组来存储中间结果,填空的位置往往就是状态转移方程的那一行。

注意:算法题的时间复杂度分析,不要只写O(n)或O(n²),要写出具体的推导过程。比如“外层循环执行n次,内层循环执行n次,所以时间复杂度为O(n²)”。阅卷时是按点给分,推导过程本身也是得分点。

2.2 上午题里的数据结构陷阱

上午题的数据结构部分,考察的是你对基本概念的理解,但出题人很喜欢在细节上设陷阱。比如二叉树的遍历,前序、中序、后序的定义大家都清楚,但题目给出一棵树的图形,让你写出某种遍历的结果,很多人会因为看错左右子树的顺序而丢分。

还有哈希表的冲突处理,线性探测法和链地址法的区别,平均查找长度的计算。这些知识点在教材上都有,但考试时会结合具体的哈希函数和装填因子来考。你需要记住的是:线性探测法在删除元素时不能直接删除,否则会断开探测链,通常需要标记为“已删除”。链地址法在查找时,如果链表过长,查找效率会退化。

图论部分,最小生成树的Prim算法和Kruskal算法,最短路径的Dijkstra算法和Floyd算法,这些算法的适用条件和时间复杂度是必考的。Prim算法适合稠密图,时间复杂度O(n²);Kruskal算法适合稀疏图,时间复杂度O(eloge)。Dijkstra算法不能处理负权边,Floyd算法可以处理负权边但不能有负权环。

排序算法的稳定性也是一个高频考点。稳定的排序算法有:冒泡排序、插入排序、归并排序、基数排序。不稳定的排序算法有:选择排序、快速排序、堆排序、希尔排序。这个知识点几乎每年都考,而且经常和具体场景结合,比如“要对学生的成绩排序,要求相同分数的学生保持原来的顺序”,那就必须选稳定的排序算法。

2.3 算法设计题的答题模板

下午的算法题,答题时有一个固定的模板可以套用。第一步,用一两句话说明算法的基本思想。第二步,填写伪代码中的空缺。第三步,分析时间复杂度。第四步,如果有要求,分析空间复杂度。

填写伪代码时,要注意变量名的对应关系。题目给出的伪代码通常会用一些有意义的变量名,比如max_value、min_cost、dp数组等。填空时尽量使用题目已经定义的变量,不要自己发明新的变量名,否则容易引起歧义。

时间复杂度的分析,要写出具体的计算过程。比如一个双重循环,外层循环从1到n,内层循环从1到i,那么总的执行次数是n(n+1)/2,时间复杂度是O(n²)。如果是一个递归算法,要写出递归方程,比如T(n)=2T(n/2)+O(n),然后解出T(n)=O(nlogn)。

实操心得:算法题的最后一步通常是问“如果输入规模增大,算法是否仍然适用”,这时候你要结合时间复杂度来回答。如果时间复杂度是指数级的,那输入规模增大时算法会变得不可行,需要考虑用动态规划或贪心来优化。

3. 软件工程与UML图的得分技巧

软件工程是下午题的另一大重点,通常是一道数据流图题和一道UML图题,各15分。这两类题目有很强的规律性,掌握了套路之后,得分率可以稳定在12分以上。

3.1 数据流图的平衡原则与分层分解

数据流图(DFD)考的是结构化分析方法,核心是自顶向下、逐层分解。题目通常会给出一个顶层图和一个0层图,让你补充0层图中缺失的数据流,或者让你判断父图和子图之间是否平衡。

数据流图的平衡原则是:父图中某个加工的输入输出数据流,必须和子图中对应加工的输入输出数据流一致。也就是说,父图中有几条输入输出,子图中就要有几条对应的输入输出。这个原则是考试的重点,几乎每年都考。

答题时,先看父图中有哪些外部实体、哪些数据存储、哪些加工。然后看子图,找出子图中缺少的数据流。通常缺少的数据流是那些在父图中存在但在子图中没有体现的。补充数据流时,要注意数据流的方向和名称。方向错了或者名称不对,都不得分。

还有一个常见的考点是数据流的命名。数据流应该是一个名词短语,表示在系统中流动的数据。比如“用户信息”“订单详情”“支付结果”都是合格的数据流名称。而“处理订单”“查询用户”这种动词短语就不是数据流,而是加工的名称。

注意:数据流图中不允许出现控制流。控制流表示的是条件的判断和循环,数据流图只关注数据的流动。如果题目中出现了“如果...则...”这样的描述,不要把它画成数据流,而是要在加工的描述中体现。

3.2 UML图之间的转换与语义

UML图部分,考察的是面向对象分析方法。常见的图有用例图、类图、序列图、状态图、活动图。考试中经常出现的是用例图和类图,偶尔会考序列图和状态图。

用例图考的是参与者、用例、关系。参与者通常是外部实体,用例是系统提供的功能。关系包括关联、包含、扩展、泛化。包含关系表示一个用例必然包含另一个用例的行为,扩展关系表示一个用例在特定条件下才会执行另一个用例的行为。这两个关系很容易混淆,记住一点:包含是“必须做”,扩展是“可能做”。

类图考的是类、属性、方法、关系。关系包括关联、聚合、组合、泛化、依赖。聚合和组合的区别是:聚合是“整体和部分可以分离”,组合是“整体和部分不能分离”。比如“班级和学生”是聚合,因为班级解散了学生还在;“人和心脏”是组合,因为人没了心脏也就没了。

序列图考的是对象之间的交互顺序,重点是消息的发送和接收。状态图考的是对象的状态变化,重点是状态之间的转换条件和转换动作。

答题时,要注意UML图的语法规范。比如类图中的类名要写在最上面,属性写在中间,方法写在最下面。序列图中的生命线要用虚线表示,激活条要用矩形表示。这些细节虽然小,但阅卷时都是得分点。

3.3 软件工程上午题的易错点

上午题的软件工程部分,考察的是软件开发模型、软件过程、软件测试、软件维护这些概念。开发模型包括瀑布模型、原型模型、螺旋模型、增量模型、敏捷模型。每种模型的适用场景和优缺点都要清楚。

瀑布模型适合需求明确的项目,缺点是文档驱动、风险后置。原型模型适合需求不明确的项目,通过快速构建原型来澄清需求。螺旋模型结合了瀑布和原型的优点,强调风险分析,适合大型复杂项目。增量模型把软件分成多个增量,逐步交付,适合需要快速看到部分成果的项目。敏捷模型强调个体和互动、可工作的软件、客户合作、响应变化。

软件测试部分,黑盒测试和白盒测试的区别是必考的。黑盒测试关注功能,不考虑内部结构,常用的方法有等价类划分、边界值分析、因果图。白盒测试关注内部逻辑,常用的方法有语句覆盖、判定覆盖、条件覆盖、路径覆盖。其中路径覆盖最强,语句覆盖最弱。

软件维护部分,纠错性维护、适应性维护、完善性维护、预防性维护的区别要清楚。纠错性维护是修复bug,适应性维护是适应环境变化,完善性维护是增加新功能,预防性维护是提高可维护性。这四种维护中,完善性维护占的比例最大,通常超过50%。

4. 数据库设计与SQL的实操要点

数据库是软件设计师考试的另一个重点模块,上午题考概念和SQL,下午题考ER图转关系模式和SQL填空。这个模块的特点是:概念不难,但细节容易出错。

4.1 ER图转关系模式的规则

ER图转关系模式是下午题的常客。转换规则其实很简单:每个实体转成一个关系模式,实体的属性变成关系的属性,实体的主键变成关系的主键。如果是1:1联系,可以把联系合并到任意一端的关系中;如果是1:n联系,把联系合并到n端的关系中,把1端的主键作为外键;如果是m:n联系,必须单独转成一个关系模式,主键是两端主键的组合。

转换过程中最容易出错的地方是:忘记把联系的主键加到关系模式中,或者把外键加错了位置。比如“部门和员工”是1:n联系,部门是1端,员工是n端,那么员工关系中要加上部门的主键作为外键。如果反过来把员工的主键加到部门关系中,就错了。

还有一个常见的考点是弱实体。弱实体没有自己的主键,它的主键由所属实体的主键和自身的部分键组成。转换时,弱实体的关系模式中要包含所属实体的主键作为外键,并且这个外键和弱实体的部分键一起构成主键。

提示:转换完成后,要检查每个关系模式是否满足第三范式。如果存在传递依赖,需要进一步分解。比如“员工(员工号, 姓名, 部门号, 部门名)”,部门名依赖于部门号,部门号依赖于员工号,存在传递依赖,应该分解成“员工(员工号, 姓名, 部门号)”和“部门(部门号, 部门名)”。

4.2 SQL查询填空的常见题型

下午题的SQL部分,通常是给出一个数据库模式,然后让你写出几个查询语句。常见的题型有:单表查询、多表连接查询、嵌套查询、分组查询、更新语句。

单表查询考的是SELECT、FROM、WHERE的基本用法,以及ORDER BY、GROUP BY、HAVING的配合。多表连接查询考的是INNER JOIN、LEFT JOIN、RIGHT JOIN的区别。嵌套查询考的是IN、EXISTS、ANY、ALL的用法。分组查询考的是GROUP BY和聚合函数的配合,以及HAVING和WHERE的区别。

写SQL时,要注意几个细节。第一,字符串要用单引号括起来,不要用双引号。第二,日期格式要符合数据库的规范,通常是'YYYY-MM-DD'。第三,NULL值的判断要用IS NULL或IS NOT NULL,不能用=NULL。第四,聚合函数不能直接出现在WHERE子句中,要用HAVING。

举个例子,如果要查询“选修了课程号为C01的学生的姓名”,可以写成:

SELECT 姓名 FROM 学生 WHERE 学号 IN ( SELECT 学号 FROM 选课 WHERE 课程号 = 'C01' );

也可以用连接查询:

SELECT 学生.姓名 FROM 学生 INNER JOIN 选课 ON 学生.学号 = 选课.学号 WHERE 选课.课程号 = 'C01';

两种写法都可以,但嵌套查询更符合“先找学号再找姓名”的思维过程,考试时不容易出错。

4.3 范式判断的快速方法

范式判断是上午题的必考内容。第一范式要求每个属性都是原子的,不可再分。第二范式要求在第一范式的基础上,非主属性完全依赖于主键,不能只依赖于主键的一部分。第三范式要求在第二范式的基础上,非主属性不传递依赖于主键。

判断一个关系模式属于第几范式,可以按以下步骤来:第一步,找出所有的候选键。第二步,找出所有的非主属性。第三步,检查是否存在部分依赖。如果存在,就是1NF;如果不存在,就是2NF。第四步,检查是否存在传递依赖。如果存在,就是2NF;如果不存在,就是3NF。

BCNF是在3NF的基础上,要求主属性也不传递依赖于主键。也就是说,所有的决定因素都必须是候选键。BCNF的判断比较严格,考试中出现的频率不高,但一旦出现,往往是拉开差距的题目。

实操心得:判断范式时,先把关系模式写成“关系名(属性1, 属性2, ...)”的形式,然后在属性下面标出主键和非主属性。这样看起来一目了然,不容易出错。

5. 操作系统与网络的送分题怎么拿稳

操作系统和网络在上午题中占15分左右,这部分题目难度不大,但知识点比较碎,需要记忆的内容多。复习时要把重点放在进程管理、存储管理、文件管理、网络协议、IP地址计算这几个方面。

5.1 进程管理的PV操作与死锁

PV操作是操作系统的经典考点,几乎每年都考。P操作是申请资源,V操作是释放资源。信号量的值表示当前可用的资源数。P操作把信号量减1,如果减完后小于0,则进程阻塞;V操作把信号量加1,如果加完后小于等于0,则唤醒一个阻塞的进程。

考试中常见的题型是:给出一个并发程序的描述,让你填写PV操作的位置,或者判断某个信号量的取值范围。做这类题的关键是:先找出哪些是互斥资源,哪些是同步关系。互斥资源用互斥信号量,初值为1;同步关系用同步信号量,初值根据具体情况确定。

死锁的四个必要条件是:互斥、请求与保持、不可剥夺、循环等待。这四个条件必须同时满足才会发生死锁。死锁的处理策略有:预防、避免、检测、解除。预防是破坏四个条件之一,避免是使用银行家算法,检测是定期检查是否有死锁,解除是终止进程或剥夺资源。

银行家算法是考试的重点,但很多人觉得难。其实银行家算法的核心就是:在分配资源之前,先判断分配后系统是否处于安全状态。安全状态是指存在一个安全序列,按照这个序列分配资源,所有进程都能顺利完成。判断安全序列的方法是:找出一个进程,它的剩余需求小于等于系统当前可用资源,然后假设它完成并释放资源,再找下一个,直到所有进程都能完成。

5.2 存储管理的页面置换算法

页面置换算法是存储管理部分的重点,常见的算法有:最佳置换算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)、时钟算法(Clock)。

OPT算法是理论上的最优算法,它选择未来最长时间不被访问的页面淘汰。但实际中无法预知未来,所以OPT只是用来做性能比较的基准。FIFO算法选择最早进入内存的页面淘汰,实现简单,但可能出现Belady异常,即增加物理块数反而导致缺页率上升。LRU算法选择最近最长时间未被访问的页面淘汰,性能接近OPT,但实现开销较大。Clock算法是LRU的近似实现,用循环队列和访问位来判断。

考试中常见的题型是:给出一组页面访问序列和物理块数,让你计算某种置换算法的缺页次数和缺页率。做这类题时,要画一个表格,逐行记录每次访问后的内存状态。表格的列是物理块,行是访问序列。每次访问时,先看页面是否在内存中,如果在,则命中;如果不在,则缺页,需要置换。

注意:计算缺页率时,缺页次数除以总访问次数。如果题目中给出了“预调页”或“请求调页”的条件,要区分对待。预调页是提前把页面调入内存,请求调页是访问时才调入。

5.3 IP地址计算与子网划分

IP地址计算是网络部分的必考内容,也是很多人觉得头疼的地方。其实只要掌握了二进制的转换方法,这类题目就是送分题。

IP地址由32位二进制组成,通常写成点分十进制,比如192.168.1.1。子网掩码也是32位,用来区分网络号和主机号。子网掩码中连续的1对应网络号,连续的0对应主机号。

子网划分的核心是:借用主机号的前几位作为子网号。比如一个C类地址192.168.1.0/24,默认子网掩码是255.255.255.0,有8位主机号。如果借用3位作为子网号,那么子网掩码变成255.255.255.224,可以划分出2³=8个子网,每个子网有2⁵-2=30个可用主机地址。

计算网络地址的方法是:IP地址和子网掩码进行按位与运算。计算广播地址的方法是:网络地址的主机号部分全部置1。计算可用主机地址范围的方法是:网络地址加1到广播地址减1。

举个例子,IP地址192.168.1.100,子网掩码255.255.255.224。先把IP地址和子网掩码转成二进制,然后按位与:

192.168.1.100 = 11000000.10101000.00000001.01100100 255.255.255.224 = 11111111.11111111.11111111.11100000 按位与结果 = 11000000.10101000.00000001.01100000 = 192.168.1.96

所以网络地址是192.168.1.96,广播地址是192.168.1.127,可用主机地址范围是192.168.1.97到192.168.1.126。

实操心得:做IP地址计算题时,先把子网掩码的最后一段转成二进制,看看借了几位。比如224是11100000,借了3位。然后根据借的位数计算子网数和主机数。这样比直接做二进制运算要快得多。

6. 面向对象设计与设计模式的复习方法

面向对象设计和设计模式是软件设计师考试中比较抽象的部分,但也是下午题的重要考点。这部分内容不需要死记硬背,关键是理解每种设计模式的意图和适用场景。

6.1 面向对象的基本原则

面向对象有五大基本原则:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则。这些原则是设计模式的基础,理解了它们,设计模式就很容易掌握了。

单一职责原则要求一个类只负责一个功能。开闭原则要求对扩展开放、对修改关闭。里氏替换原则要求子类可以替换父类而不影响程序的正确性。依赖倒置原则要求高层模块不依赖低层模块,两者都依赖抽象。接口隔离原则要求使用多个专门的接口而不是一个总接口。

考试中经常给出一个设计场景,让你判断它违反了哪个原则,或者让你选择一个合适的设计模式来改进。比如“一个类负责了多个不相关的功能”,违反了单一职责原则;“每次增加新功能都要修改原有代码”,违反了开闭原则。

6.2 常用设计模式的意图与结构

软件设计师考试中常见的设计模式有:工厂模式、单例模式、适配器模式、观察者模式、策略模式、装饰器模式。这些模式的意图和结构要清楚。

工厂模式用于创建对象,把对象的创建和使用分离。单例模式保证一个类只有一个实例,并提供全局访问点。适配器模式用于转换接口,让不兼容的类可以一起工作。观察者模式定义对象间的一对多依赖,当一个对象状态改变时,所有依赖它的对象都得到通知。策略模式定义一系列算法,把它们封装起来,并且使它们可以互相替换。装饰器模式动态地给对象添加职责,比继承更灵活。

考试中常见的题型是:给出一个场景描述,让你选择合适的模式,或者给出一个模式的结构图,让你填写缺失的类或方法。做这类题时,先看场景描述中的关键词。比如“创建对象”对应工厂模式,“只有一个实例”对应单例模式,“通知所有依赖对象”对应观察者模式,“动态添加功能”对应装饰器模式。

6.3 设计模式在下午题中的答题技巧

下午题的设计模式部分,通常是一道15分的大题,题目会给出一个场景和部分代码,让你补充代码并说明使用了哪些设计模式。答题时,先通读场景描述,判断它使用了哪些模式。然后看代码结构,找出模式中的关键角色。

比如工厂模式中,通常有一个抽象工厂类、多个具体工厂类、一个抽象产品类、多个具体产品类。代码中会有一个创建产品的方法,填空的位置往往就是具体工厂类中创建具体产品的那一行。

答题时要注意:类名和方法名要符合题目给出的命名规范。如果题目中已经定义了抽象类Product和具体类ConcreteProductA,那你在填空时就要用这些名字,不要自己发明新的名字。另外,设计模式的说明要简洁准确,不要写太多废话,把模式名称和意图写清楚就行。

提示:设计模式的题目,代码填空的分值通常占一半,说明部分占一半。所以即使代码填不出来,也要把模式名称和意图写清楚,能拿一分是一分。

7. 备考节奏与考场时间分配

软件设计师考试是一整天,上午9:00到11:30考基础知识,下午2:00到4:30考应用技术。两场考试之间有两个半小时的休息时间,可以用来调整状态。

7.1 考前一个月的复习计划

考前一个月是冲刺阶段,重点应该放在真题和错题上。我建议的节奏是:前两周每天做一套上午题和一套下午题,做完后认真分析错题。后两周重点复习错题涉及的知识点,同时保持每天做一套题的手感。

做真题时,要严格按照考试时间来。上午题控制在120分钟内完成,下午题控制在150分钟内完成。做完后给自己打分,看看离45分的及格线还有多远。如果上午题稳定在55分以上,下午题稳定在50分以上,那基本上就稳了。

错题分析是冲刺阶段最重要的环节。每道错题都要搞清楚:考的是哪个知识点,为什么错了,正确的思路是什么。如果同一个知识点反复错,那就把这个知识点相关的教材章节重新看一遍,然后找几道类似的题目练手。

7.2 考场上的时间分配与答题顺序

上午题的时间比较充裕,75道选择题,平均每道题不到2分钟。但有些计算题比较耗时,比如IP地址计算、页面置换算法、时间复杂度分析。遇到这种题,如果2分钟内算不出来,先标记一下跳过去,等做完其他题再回来算。

下午题的时间比较紧张,5道大题,平均每道题30分钟。但每道题的难度不一样,数据流图和UML图通常比较简单,算法题和设计模式题比较难。我建议的答题顺序是:先做数据流图和UML图,再做数据库题,然后做设计模式题,最后做算法题。这样可以把能拿的分先拿到手,避免在难题上卡太久导致后面简单的题没时间做。

下午题的答题纸是空白的,需要自己写答案。写答案时要注意字迹工整、条理清晰。数据流图和UML图要用铅笔先画一遍,确认无误后再用签字笔描一遍。SQL语句要写完整,不要省略关键字。算法题的时间复杂度分析要写出推导过程。

注意:下午题的评分是按点给分,所以答题时要尽量多写关键点。比如问“算法的基本思想是什么”,你可以从“分治”“动态规划”“贪心”这几个角度分别写一句,只要沾边就能得分。

7.3 常见失分点与避坑清单

根据我自己的考试经验和带过的考生的反馈,软件设计师考试有几个常见的失分点,这里整理成一个清单,考前可以对照检查。

失分点具体表现避坑方法
数据流图不平衡父图和子图的输入输出不一致画完后逐条核对父图和子图的数据流
UML图关系混淆包含和扩展分不清记住“包含必须做,扩展可能做”
SQL语法错误字符串用双引号、NULL用等号字符串用单引号,NULL用IS NULL
范式判断错误把部分依赖当成传递依赖先找候选键,再找非主属性,逐步判断
算法填空变量名不对自己发明变量名使用题目已定义的变量名
时间复杂度分析不写过程只写O(n²)写出循环次数的计算过程
IP地址计算粗心二进制转换出错先转二进制,再按位与,最后转十进制
设计模式名称写错把策略模式写成状态模式记住每种模式的关键词和意图

这个清单里的每一条,都是我在实际做题中踩过的坑。尤其是数据流图的平衡原则,我一开始总是忘记核对父图和子图的数据流,导致明明会做的题却拿不到满分。后来养成了画完就核对的习惯,这类题就再也没丢过分。

最后再分享一个小技巧:考试前一天不要熬夜复习,把错题本翻一遍就行。考试当天早上吃一顿正常的早餐,带一块巧克力进考场,下午题做到一半的时候吃一口,能提神。这些细节看起来不重要,但考试是持久战,状态好才能发挥好。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进