考软考中级软件设计师的朋友建议把下午第一题数据流图当成保底题来对待。它不是最难的但绝对是最讲究方法的。很多考生这道题拿12分、13分也有人只拿5分、6分差距不在智商而在有没有把数据流图和数据字典当成一套完整的方法论来练。这篇文章我尽量把考法、原理、答题套路、踩坑点一次讲透目标是让你看到任何一道DFD题都能稳定输出。1. 数据流图下午卷里少见的努力就有回报的题1.1 15分不算少但比算法题友好太多下午卷一共几道题数据流图通常稳稳占着第一题的位置分值一般是15分。别看它排在试卷最前面就以为它难度也最低——实际上它的友好好在规则固定。算法题你背不出代码就是写不出来C语言题语法不过关就是过不了但数据流图题不一样它考的是读题、归纳和检查能力这三样东西完全可以通过短时间集中训练快速提上去。历年真题翻下来题型变化非常小给你一段系统功能描述再给一张缺了某些元素的上下文数据流图或0层数据流图让你补外部实体、补数据存储、补数据流偶尔加一问数据字典或父子图平衡的判断。也就是说这道题的知识点一共就那么几个比下午其他题目容易形成肌肉记忆。我见过不少备考时间紧张的人直接放弃这道题去死磕算法结果算法没啃下来数据流图的保底分也丢了。如果你现在离考试还有两到三周正确的策略恰恰相反把数据流图放在复习优先级最高的一档因为它是短期投入、确定回报的典型。1.2 这道题到底在考什么能力表面上看你只是在补图实际上出题人考的是三件事。第一需求分析能力。给你一段半页纸的文字描述你要能从中识别出哪些是加工、哪些是数据存储、哪些是外部实体、哪些是数据流。这其实就是软件工程里需求分析的基本功只不过用图的方式考出来。第二分层抽象能力。系统在最顶层是一个黑盒子往下拆成一堆功能再往下每个功能还能继续拆。你能不能理解不同层级的图之间保持信息一致是解平衡类题目的关键。第三严谨性。数据流图里每条线都不能凭空出现每个加工不能只有输入没有输出每条数据流都要在题干里找到依据。很多丢分不是不会而是想当然——自己脑补了一条题面根本没提到的数据流或者把方向画反了。理解了这三点你再看后面所有技巧就会清楚地知道它们在解决哪一类问题。2. 把四个元素记成一个口诀画图就不会乱2.1 加工、数据流、数据存储、外部实体怎么一眼分辨数据流图的四个基本元素是整道题的根基。很多新手一上来就纠结图形符号其实先要把这个元素到底是不是它判断对。加工是对数据执行变换或处理的功能单元判断标准就一句话它干了事。题干里出现登记查询统计修改验证计算这类动词对应到图上往往就是加工。一个加工必须至少有一条输入数据流和一条输出数据流只进不出或者只出不进都不合理。数据流是正在流动的数据它带着数据从一头流向另一头。判断标准是看数据有没有位置变化读者提交了一张借书单借书单从读者那里流到系统里这就是数据流。要注意数据流不等于控制流也不等于调用关系它只表示数据本身的传输。数据存储是静止的数据是系统运行时需要保存的地方。题干里出现记录保存存储表档案库存这些词后面往往跟着数据存储。例如系统保存读者信息那么读者表或者叫读者信息文件就是一个数据存储。外部实体是系统边界之外但和系统有数据交互的人、组织或其他系统。它的核心特征是在系统外面。管理员、读者、客户、供应商、银行系统、教务系统这些只要不是本系统内部功能模块一律算外部实体。简单记法矩形是人开口矩形是库存圆角矩形是干活箭头是流转。先把这层判断练熟再看图形细节。2.2 两种符号体系别被图形束缚教材里存在两套常见的DFD符号一套是Gane-Sarson加工用圆角矩形数据存储用开口矩形另一套是Yourdon加工用圆圈数据存储用双横线。很多同学一看图形不一样就慌其实没必要。软考真题通常会在题目中给出图例或者题目自带的图本身就能看出来用哪套体系。你答题的时候直接沿用图里已有的符号画就行不需要额外标注。更重要的是阅卷看的是元素类型对不对、位置对不对、数据流方向对不对而不是纠结圆角矩形比圆圈多了两个圆角。真正要花精力记的符号不是图形的美观问题而是数据流的箭头方向和命名。箭头方向代表数据流向一旦画反整个逻辑就反了数据流的名字要能看出这是什么数据不能只写数据信息这种没有任何信息量的词。3. 分层图与父子平衡出题人最喜欢在这挖坑3.1 顶层图、0层图、子图的俄罗斯套娃关系数据流图是分层的这是整个DFD题最容易出综合大题的地方。顶层图也叫上下文图它把整个系统看成一个加工图中只有这一个加工周围是外部实体外部实体和加工之间有数据流。顶层图回答的问题是系统边界在哪里系统跟外部世界交换了什么。0层图把顶层那个大加工拆成若干个主要功能加工画出这些加工之间、加工和数据存储之间、加工和外部实体之间的数据流。软考下午题让你补的往往就是这一层。再往下0层图里的某个加工如果太复杂还可以继续拆成一张子图。子图内部的细粒度加工继续承担更小的功能。理解子图不是为了让你去画而是为了理解一条铁律父图里的一个加工对应子图里的一组加工这组加工合起来的对外输入输出必须和父图里那个加工的输入输出一模一样。3.2 父图子图平衡从哪里进就得从哪里出父图子图平衡是数据流图最重要的检查原则也是历年真题反复挖坑的地方。打个比方你把一个公司看成一个加工公司对外接收订单、发出产品那么在公司内部拆分成销售部、生产部时销售部对外接收订单、生产部对外发出产品两者合起来还是接收订单、发出产品。你不能在公司内部图里突然多出一条接收原材料——除非父图里那条接收原材料本来就存在。软考里常见的考法是题目给了上下两层图让你找出子图里多出的或缺失的数据流。做这种题你先别急着填空先把父图中该加工的所有输入数据流和输出数据流分别列出来再把子图边界上的输入输出列出来两边对比少一条就多一条答案自然浮出水面。很多考生栽在这里是因为只看子图内部逻辑通顺不通顺忽略了父子一致性。记住子图内部可以任意拆但子图边界上的接口一条都不能多、一条都不能少。3.3 加工的输入输出守恒少了一条线都要扣分除了父子平衡单个加工本身也要满足守恒。所谓守恒不是指数据量守恒而是指每一个加工都应该有理由存在。一个加工应该有输入否则它处理什么一个加工也应该有输出否则它处理完的结果去哪了如果某道题让你补一条数据流旁边的加工刚好没有输入或者没有输出那大概率缺的就是这条。还有一种情况是加工直接读写存储导致的残缺。比如读者提交查询请求这个数据流按理说查询加工应该先从图书表读取图书信息再把结果返回给读者。如果图上只有请求进来、结果出去没画加工和图书表之间的读写线那缺失的数据流就藏在存储和加工之间。补充数据流时多问自己一句这条数据流是凭空多出来的还是题干本来就有、图上漏了的标准答案一定属于后者。4. 下午题四类问法拆成标准答题动作4.1 补充外部实体抓系统边界外的人外部实体题是最简单的但再简单也有一半人丢分原因是分不清系统的一部分和系统外部的人。比如一个图书管理系统读者信息管理是系统内部的一个加工但读者本身是外部实体。很多人一看到题干写读者就直接画到外部实体其实要看你是在哪一层画。在顶层图里读者必然是外部实体在0层图里读者能不能出现在图中取决于加工是否直接和读者交互。判断技巧有三个。第一外部实体一般是可以直接交互的角色名词后面能加上员者系统中心等后缀。第二看已有数据流如果一条数据流的一个端点连着矩形符号那这个矩形大概率是外部实体。第三结合题干最后一句系统为用户提供的服务中用户这个词到底指谁常常就是要求补充的外部实体。答题的时候不用想得太复杂从题干第一句话某某系统面向XX用户找候选人再从第二段以后的功能描述里找XX可以做什么、XX提交XX的名词列出来对照图中已有矩形缺哪个补哪个。4.2 补充数据存储找记录、保存、存储这些词数据存储题也比数据流简单因为它经常藏在题干里的固定句式后面系统将……存入系统记录…………信息保存到……。看到这些词把后面那个名词找出来通常就是数据存储。比如将读者信息保存到读者信息表那么读者信息表就是存储借阅记录保存在借阅记录表那么借阅记录表就是存储。但要注意两个坑。第一存储的名字要跟题干保持一致别自己改名字。题干叫图书信息表你写图书库存表严格来说也算错。第二存储和数据流的区别。比如图书信息是一条数据流代表正在传输的图书数据图书信息表是一个存储代表静止存放图书数据的地方。一字之差在图上位置完全不同。补充完后记得检查一下存储至少要和一个加工有连线。如果一个存储孤零零地在图上没有任何加工读写它那这条线多半也是要补的。4.3 补充数据流三步法把题干变成画图清单补数据流是下午题最核心、也最容易丢分的一问通常占6到8分。我习惯用三步法屡试不爽。第一步圈动词。通读题干把每个功能描述里的动词圈出来登记、修改、删除、查询、统计、生成、发送、计算。每个动词几乎都对应一条或一组数据流。第二步列清单。把谁给谁传输了什么数据整理成一个清单。举例管理员向系统提交图书信息系统向管理员返回登记结果读者向系统提交借书请求系统向读者返回借书结果。不用管图上有没有先把题干能推导出的所有数据流写全。第三步比对找差。把清单里的数据流和图上已有的数据流逐一核对图上没有的就是答案。核对的时候要注意两点一是方向不能反二是部分数据流是双向的比如修改操作往往是提交修改数据和返回修改结果两条不能只补一条。方向判断也有规律查询类操作通常是加工向存储发查询条件存储向加工返回查询结果新增类操作通常是加工向存储写新增数据修改类操作加工和存储之间需要读出原数据、写入新数据所以常常两两成对。4.4 查找并修改错误高频错误自查表有些年份不考补充改考图中存在错误请指出并改正。这种题与其说是考画图不如说是考你知不知道DFD的禁忌。我整理了一份高频错误自查表做题时逐条过一遍一个加工没有任何输入数据流只有输出会扣分一个加工只有输入没有输出同理。数据流直接连在两个外部实体之间或者直接连在外部实体和数据存储之间都是典型错误——数据流的两端必须至少有一端是加工。数据流没有名字或者名字叫数据信息属于命名不规范。同一个数据流名字被多条不同含义的线使用说明设计有冲突。加工没有编号或编号不连续子图编号没有对应父图加工编号也是常见的规范错误。父图子图的数据流不一致属于结构性错误。上面这张表建议你打印下来贴在桌前。每次做完一道DFD题用这张表做一次体检错误题基本能拿满分。5. 数据字典别背定义背这个翻译规则5.1 数据字典五大条目各是什么数据流图和数据字典是一对搭档数据流图描述系统的骨架数据字典描述每个零件的精确含义。软考考数据字典很少让你默写概念更多是让你根据数据流图补全某一条目或者用数据字典符号表示数据组成。数据字典有五个条目数据项、数据结构、数据流、数据存储、处理逻辑。数据项是最小的不可再分的数据单位比如借书证号书名数据结构是若干数据项的有序集合比如读者记录借书证号姓名联系方式数据流描述数据在系统中的传输路径比如借书单这个数据流的组成数据存储描述数据在哪里停留比如读者表的组成处理逻辑描述加工做什么常用结构化语言、判定表、判定树来表示。理解这五者的关系可以想成一个快递包裹数据项是你买的每件商品数据结构是打包后的包裹数据流是快递车运输的过程数据存储是快递仓库处理逻辑是分拣员干活的分拣规则。这样一想五条目的边界就很清楚了。5.2 六个运算符号用借书单一次讲明白数据字典定义数据组成时会用到一套类似数学表达式的符号。常见的有六个用借书单举例子特别容易记。等号表示定义为比如借书单借书证号图书编号借书日期。加号表示与表示几项同时出现。方括号加竖线表示或表示从若干项中选择一项比如读者类型[学生|教师|校外人员]意思是读者类型只能是三者之一。花括号表示重复如果有上下限写作1{图书编号}5表示至少重复1次、最多5次。小括号表示可选可以有也可以没有比如联系方式(手机号邮箱)。我见过不少人把这套符号当数学公式来背其实不需要背。做题时遇到没见过的符号先看它是要不要都行还是选一个还是多选一语义判断远比记忆符号重要。软考考来考去就是这几个练两三道真题就熟了。5.3 数据字典的三类考法与答题要点第一种考法给一条数据流或一个数据存储要求用数据字典符号写出它的构成。这类题一般题干会给出说明你只需要把有什么字段逐项列出来注意字段顺序按题干描述来不要自己重新排序。第二种考法给出处理逻辑要求用结构化语言或判定表描述。比如还书时如果超期则计算罚款否则不计算写成结构化语言就是IF 还书日期应还日期 THEN 计算罚款 ELSE 不计算罚款。关键词要写完整条件判断要覆盖所有分支。第三种考法判断数据字典描述是否正确。这种题容易在可选和必选上设坑。举个例子题目写借书单借书证号图书编号但实际借书单里图书编号可能不止一本正确写法就应该是借书单借书证号1{图书编号}3。看到没有重复符号的描述多留个心眼。数据字典和后面的数据库设计题也有联系字段名、主键、外键这些概念在下午第二题经常出现。你在复习数据流图时顺便把数据字典基础打好等于给后面的题也铺了路。6. 一道贴近真题风格的题目完整推导一遍理论说再多不如完整走一遍。下面这道题是我按历年真题风格整理的模拟题题型、问题设置和真实考试很接近。建议你先别看答案自己做一遍再对照推导过程。6.1 题目描述与图文字示意某图书管理系统面向读者和管理员主要功能描述如下管理员对读者信息进行登记、修改和删除并将读者信息保存到读者信息表管理员对图书信息进行新增和修改图书信息包括书名、作者、ISBN、库存数量保存在图书信息表读者输入借书证号申请借书系统验证读者身份和借书权限验证通过后登记借阅记录同时修改图书库存读者归还图书时系统根据借阅记录计算是否超期若超期则计算罚款金额并更新借阅记录和图书库存读者可以按书名或作者查询图书信息管理员可以统计各类图书的借阅次数并生成统计报表。图1-1为顶层图图1-2为0层图图中缺失了部分外部实体、数据存储和数据流。问题一补充外部实体A和B。问题二补充数据存储D1和D2。问题三补充三条缺失的数据流。问题四用数据字典符号定义数据流借阅登记信息。6.2 推导过程从题干到答案的每一步先看问题一。题干第一句就点明系统面向读者和管理员顶层图只有外部实体和系统交互所以两个外部实体就是读者和管理员。这是整道题最快速的两分。再看问题二。题干里出现了两个明显的存储词汇读者信息表和图书信息表。题目只让补D1和D2大概率就是这两个。注意题干后面还提到了借阅记录但这里只有两个存储空位说明借阅记录对应的存储可能已经在图里出现不用你补。这也是一个判断技巧题目让你补几个存储你就优先数题干里出现了几个表/记录/档案。第三问是重头戏补三条数据流。先把题干所有功能拆出来管理员登记、修改、删除读者信息管理员新增、修改图书信息读者借书读者还书读者查询图书管理员统计报表。逐一比对这些功能所需的数据流再假设图上已有的线最可能缺失的三条是读者查询图书时系统从图书信息表读取图书信息这条图书信息表到查询加工的读数据流还书时系统读取借阅记录以判断是否超期这条借阅记录表到还书加工的读数据流管理员新增图书后系统将图书信息写入图书信息表这条图书信息管理加工到图书信息表的写数据流。你可能会问为什么不是读者信息管理到读者信息表的线因为题目功能描述里保存读者信息这句话提示了这条线很可能已存在。补数据流的本质是补题干有依据、但图上没有画的线而不是补你想象应该有的线。第四问数据字典定义。借阅登记信息包含借书证号、图书编号、借书日期、应还日期。如果一次可以借多本书则写成借阅登记信息借书证号1{图书编号}3借书日期应还日期。题目没给借阅数量上限可以写1{图书编号}表示至少一本也可以按题目给定的规则写上下限核心是别漏掉重复符号和必填字段。6.3 参考答案与典型错误分析参考答案的要点A是读者B是管理员D1是读者信息表D2是图书信息表缺失数据流是查询操作从图书信息表读取图书信息、还书操作从借阅记录表读取借阅记录、图书信息管理向图书信息表写入图书信息借阅登记信息的定义包含借书证号、图书编号和日期等。再展示三种典型错误。第一种把B写成图书管理员题目原文是管理员多一个字不会判全错但最好保持一致。第二种第三问只补了两条线漏了还书操作读取借阅记录这条原因是题干里根据借阅记录计算是否超期的根据二字没有引起注意——当你看到根据XX做YY时XX往往是一条输入数据流。第三种数据字典里把应还日期漏了或者没加重复符号说明对数据组成理解不完整。这一套推导流程就是你在考场上应该走的心智路径先读题干划关键词再分层看接口最后把根据XX将XX保存到XX这类句式翻译成图上的线。7. 最后冲刺DFD题的自查清单与复习方案7.1 按基础选复习路径如果你的基础偏薄弱现在才第一次认真看数据流图建议按这个顺序来先花半天把四个元素和五类数据字典条目看懂再找近五年的真题数据流图题只做补外部实体和补存储两问拿分容易、建立信心。补数据流的题放到第二天做每天两到三道做完后用前面那张高频错误表自查。如果你已经有一定基础但每次补数据流都会漏一条建议专门做题干划词训练不看图只读题干把每句话翻译成候选数据流清单再拿图和清单对比。这个训练连续做五天每天一小时漏线问题基本能解决。如果你主要担心数据字典就集中刷题干里带根据计算判断的题目把结构化语言和判定表练熟。数据字典题考来考去就是一个条件分支翻译的能力练出语感后非常稳定。7.2 考前必过的自查清单最后一天晚上把这份清单过一遍看到根据二字先确认是否缺一条输入数据流。一个加工只有输入没有输出或只有输出没有输入直接标错。外部实体和数据存储之间如果有直接连线必错。数据流两端至少要有一端是加工否则必错。数据流命名必须能看出数据内容不能叫数据信息。数据字典里是否出现集合类概念比如多本若干记得加重复符号。可选字段有没有用小括号括起来。处理逻辑描述是否覆盖所有条件分支特别是ELSE分支。备考软考有时候会有一种错觉某个知识点听懂了就等于会了。数据流图是少数能让你立刻验证是否真会的题型——拿一套真题限时25分钟不翻资料做一遍对答案分数不会骗你。只要把上面这套方法练透下午第一题的15分就是你上考场前已经装进口袋的分。