软件设计师下午题:数据流图与数据字典答题全攻略
数据流图和数据字典是软件设计师下午题的常客基本年年考、场场不落。很多考生复习到这一块时总觉得“看得懂、画不出、填不对”明明几个概念都清楚一到真题里就丢分。这篇文章我就把这部分拆透了讲从考试逻辑到答题套路再到我自己踩过的坑一次性说清楚。1. 数据流图在下午题中的定位为什么它是兵家必争之地先搞明白一个事实软件设计师下午考试一共六道大题通常第一道就是数据流图相关的题目分值是15分左右。这15分在整张下午卷子里属于性价比极高的分数。原因很简单——它不考你写代码不需要你去理解复杂的算法逻辑它考的是“读图、补图、画图”的能力只要把规则摸清拿满分完全有可能。我当年备考的时候把近五年的真题翻了个遍发现数据流图题型的出题模式几乎可以用“模板化”来形容。它的考察核心就围绕两样东西一是数据流图本身的分层结构二是数据字典的规范表达。出题人让你做的无非是几件事给外部实体取个名字、给数据存储取个名字、找出缺失的数据流、补充加工处理的名字偶尔会考一两道关于数据字典条目是否正确的判断题。翻来覆去就这么几板斧。很多考生在复习时有个误区觉得下午题六道大题应该把精力放在算法、C语言、Java这些硬骨头上面数据流图简单看看就行。结果真上了考场发现这15分拿得并不轻松——原因在于数据流图虽然规则简单但它特别讲究“细节”和“逻辑一致”。你少补了一条数据流丢2分你再把加工名写得不规范又丢2分等到整道题下来15分可能只拿到了七八分。这时候再想靠后面的题目去追分压力就大了。所以我的建议非常明确数据流图这15分应当作为下午题保分的底线。它不需要你有多深的编程功底也不需要你背多少复杂的理论它考察的是缜密的逻辑思维和对系统数据流转的敏感度——这些完全可以通过短时间的强化训练快速提分。下午题的时间安排其实很紧150分钟做六道大题平均每题只有25分钟。数据流图的题目如果掌握了套路15到20分钟拿满分是可以做到的。省下来的时间分配到后面的算法题和程序设计题上整个下午的答题节奏就会从容得多。这就是所谓“保底分”的意义所在。2. 数据流图的核心要素与上下文图的分层之道既然要拿下这部分分数首先得把数据流图本身的基本功打牢。很多考生觉得数据流图简单但一问到“数据流图分几层”“每层之间什么关系”就含糊了。这不怪大家因为课本上讲的往往偏重理论而考试需要的偏重应用两者不是一回事。2.1 四种基本元素实体、加工、存储、流的角色数据流图DFD里边就四样东西外部实体、加工也叫处理、数据存储、数据流。按照传统画法外部实体用矩形表示加工用圆角矩形或圆圈表示数据存储用两条横线开口矩形表示数据流用带箭头的线段表示。现在考试题目一般不要求你用符号画图但你自己理解时这四样东西必须门清。外部实体就是系统之外的参与者它给系统提供输入也接收系统的输出。比如一个“图书馆管理系统”学生、图书管理员都是外部实体。这里的核心判断标准是这个对象在系统边界之外它只负责“递数据”和“收数据”不参与系统内部的加工处理。加工就是对数据实施的操作。一个“查询余额”操作就是一个加工一个“更新库存”也是一个加工。加工是数据流图里最容易出题的地方因为一个系统里加工的粒度可大可小完全取决于你在第几层图。上层图里一个粗粒度的“订单处理”在你往下画一层时可能会分解成“验证订单”“计算金额”“确认支付”三个子加工。数据存储是静止的数据。考生最容易混淆的是“数据存储”和“文件”的区别。在数据流图语境里数据存储就是一个逻辑容器它不关心数据在物理上存放在哪里只关心它保存了什么数据、谁在往里面写、谁从里面读。数据流就是箭头本身它代表一份数据的流动方向。这里有一个关键考点数据流上一定要写清楚名字并且这个名字必须是名词性质的数据比如“订单信息”“学生名单”不能是“查询”“更新”这样的动词。数据流的名称是判断数据流是否缺失的重要依据后面讲答题技巧时会细说。2.2 上下文图、0层图、子图三层结构如何衔接数据流图的分层非常像我们看地图。上下文图好比世界地图你只能看到各大洲的轮廓看不到具体的城市0层图好比国家地图能看到省会城市和主要公路子图好比城市交通图街道、路口一目了然。上下文图是顶层图它把整个系统视为一个加工只画一个大的加工节点然后用若干外部实体把它围起来外部实体和系统之间画上数据流。上下文图的作用是划定系统边界——什么在系统内什么在系统外对于考生来说最实用的价值在于补全外部实体。真题第一小问如果问“外部实体A是什么”基本上都可以在上下文图里通过观察谁在跟系统做数据交换来判断。0层图是对上下文中那一个大的加工进行分解后得到的图。在0层图中系统的多个主要功能模块变成了若干个加工节点外部实体仍然保留数据存储开始出现。0层图和上下文图之间的对应关系有个铁律父图和子图的输入输出数据流必须保持一致。也就是说上下文图中流入系统的数据流在0层图中必须能找到对应的流出终点的数据流上下文图中流出系统的数据流在0层图中也必须能找到对应的起点。这就是著名的“父子图平衡”规则。再往下就是子图。0层图中的每一个加工又可以单独展开成一张子图。例如0层图中的“库存管理”加工展开成一张子图后内部又包含“入库登记”“出库登记”“库存查询”等更细的加工。子图和0层图之间同样要满足父子平衡。在这个体系里最常考的一项技能就是“找缺失的数据流”。题目会给你一张不完整的0层图让你根据上下文图和题目的文字描述补出漏掉的那一两条数据流。要补得准核心就是用好题目里给出的语义描述——题干通常会以处理流程的形式交代数据的流转路径你把文字转换成图上的箭头答案自然就出来了。3. 数据字典数据流图的“词典”也是丢分重灾区很多人在复习数据流图时习惯性地跳过数据字典认为它不就是一堆定义嘛背一背就完事了。实际上数据字典在考试里出现的频率非常高而且它的出题方式远比想象中灵活。数据字典的核心作用是为数据流图里的每一个数据流、数据存储、加工提供精确的定义说明简单说它是数据流图的“配套说明书”。3.1 四个条目数据流条目、数据项条目、数据存储条目、加工条目按照软件工程教材的标准说法数据字典包含四类条目数据流条目、数据项条目、数据存储条目、加工条目。每类条目的关注点不一样考试中考察的方式也各不相同。数据流条目定义的是数据流的组成。一条数据流“学生选课信息”可能由“学号 姓名 课程编号 选课时间”四个数据项组成。数据流条目的典型写法是“数据流名学生选课信息组成学号 姓名 课程编号 选课时间流量约100份/小时峰值流量200份/小时。”数据项条目是最小的数据组成单位不可再分。它的描述包括数据项名、数据类型、长度、取值范围等。比如“学号字符型长度8由入学年份 学院代码 顺序号组成”。这里可能会出判断题让你判断某个数据项的定义是否有误。数据存储条目描述的是数据存储的结构和组成以及它被哪些加工引用。数据存储的组成通常用“数据项集合”的方式来表达比如“学生表学号 姓名 班级 联系电话 家庭住址”。加工条目用来说明加工的逻辑最常见的形式是结构化语言、判定表或判定树。考试中一般不会要求你写一段完整的结构化语言但可能让你判断一个加工条目描述得是否合理比如输入是否充分、输出是否完整、处理逻辑是否清晰。3.2 数据流守恒数据字典和数据流图的连心桥数据字典并不是孤立存在的它和数据流图之间有一条裁不断的纽带——数据流守恒。这个原则说的是一个加工的输入数据流和输出数据流在数据内容上必须守恒。也就是说加工可能对数据做计算、做过滤、做合并但不可能凭空生产出输入中不存在的核心数据。举个例子如果某个加工是“计算员工月薪”它的输入是“工作时长 时薪标准”那么它的输出应该是“月薪金额”。这里“月薪金额”可以由“工作时长”和“时薪标准”计算得到数据模型是说得通的。如果题目中这个加工的输出还包含“员工家庭住址”那就出问题了——“家庭住址”这个数据从哪儿来的输入流里根本没有。这就违背了数据流守恒。考试中关于数据字典的题目往往就是给了你几个数据流图上的元素和数据字典的片段让你找出不一致的地方。做这种题的方法就是拿着数据字典的条目一条一条去对照数据流图上流转的数据流看有没有哪个加工输出了自己输入中没有的数据或者有没有哪个数据存储里的数据项是从未在数据字典的任何数据流中出现过的。这种题本质上考的是逻辑验证能力难度不大但要求细心。4. 实操过程真题场景下的完整推演说了这么多理论很多人可能还是有点抽象。下面我用一个非常典型的考试场景把整个答题过程从头到尾串一遍。这个场景我参考了很多真题的出题思路不是说它就是某一年原题而是它覆盖了考试中最常出现的几个考点。4.1 场景设定网上书城购物系统题目描述了这样一个系统顾客通过浏览器访问网上书城系统支持注册、登录、浏览图书、查询图书、下单购买等操作。顾客下单后生成订单系统通知仓库发货仓库发货后更新订单状态。管理员负责图书信息的上架、下架、库存维护也可以查询销售统计报表。题目给了一张0层数据流图图中已有的外部实体有三个顾客、仓库、管理员。已有的加工包括用户管理、图书浏览与查询、订单处理、库存管理、销售统计。已有的数据存储包括用户表、图书表、订单表、库存表。图中已经画了一部分数据流但缺失了几条关键的数据流。题目通常有三到四个小问。第一小问通常是补充外部实体名。这个最简单上下文图里通常已经标了A、B、C三个代码让你填具体名字。通过读题干描述很容易判断A是顾客B是仓库C是管理员。实际上上下文图里会画出数据流的方向A向系统发请求并且接收系统的响应是那种“交互型”的外部实体B接收系统的发货通知向系统反馈发货结果属于“上下游协作型”C做管理维护是“管理型”。这样的名字基本都不会填错。第二小问一般是补充数据存储名。题目会给出数据流图中一个代号D1或D2让你判断它对应的存储是什么。这就需要结合数据流的输入输出判断。比如题干里提到“顾客注册时要将顾客信息保存起来”图里有一条从“用户管理”加工流出的数据流指向D1数据流名称是“新顾客信息”那D1自然就是用户表。第三小问往往是重点也是得分拉开差距的地方——补充缺失的数据流。答题思路是回到题干描述里找到图里还没画出来的动作。比如题干里有一句“顾客查询图书时系统需要从图书表中读取图书信息”那就在“图书浏览与查询”加工和“图书表”存储之间添加一条从存储指向加工的数据流名字是“图书信息”。又比如“订单支付成功后系统需要更新库存表”那就在“订单处理”加工和“库存表”存储之间加一条数据流方向是从加工指向存储名字是“更新库存量”。像这种根据文字描述来确定缺失数据流的方法屡试不爽。第四小问一般会比较灵活比如给出数据字典中对某个数据流条目或加工的描述让你判断是否有错并说明理由。考的还是前面讲的数据流守恒、加工输入输出是否匹配这些点。比如加工“销售统计”的输入如果只有“订单信息”输出却是“销售报表”和“畅销书排名”那你就得想想“畅销书排名”虽然可以基于“订单信息”算出来但如果题目的数据字典里对“销售报表”的定义里包含了“图书名称、销售数量、销售额”而这些数据项在输入中都没有明确提供那就有问题了。这时你就要结合数据字典里数据项的来源来分析指出加工输入不充分。4.2 参数计算与答案边界数据流命名的讲究在数据流图里数据流的名字不是随便起的。命名的基本原则我总结为四个字“名必达意”。数据流的名字必须准确反映这条流上承载的数据内容。很多考生失分不是因为找不到数据流而是因为给数据流起了个似是而非的名字比如“查询”两个字就画上去。你想想“查询”是一个动作不是数据数据流上应该是“查询条件”和“查询结果”而不是“查询”本身。再看数据流的方向。数据流的方向分成三类从外部实体到加工也就是输入流从加工到外部实体也就是输出流加工与数据存储之间有读和写两条方向从存储到加工是读从加工到存储是写。考试中最常见的坑就是方向填反了。比如“系统读取库存表”那箭头一定要从存储指向加工如果是“更新库存表”箭头则是从加工指向存储。数据流的通道特性也很重要——一条数据流必须是连续传递的中间不能“凭空消失”。比如有一条数据流标着“从订单处理加工到销售统计加工”那说明订单处理把订单数据直接传给销售统计。但如果在路径上出现一个数据存储“统计临时表”那么正确画法应该是订单处理写入统计临时表然后销售统计从统计临时表读取而不是中间直接跨过去。考试中的漏画题往往就是在这些“中转站”上做文章。为了让大家更有“手感”我特意把高频率出现的动词和数据流名做了一个对照类似“答题速查表”你可以对照着检查自己写的答案是否规范题干动词数据流方向推荐数据流名称查询/读取存储 → 加工某某信息保存/写入加工 → 存储更新某某信息 / 新某某信息提交/发送实体 → 加工某某请求 / 某某申请返回/下发加工 → 实体某某结果 / 某某通知审核/校验后传给加工 → 加工通过后的某某信息这个表不是标准答案但它可以帮助你在考场那种紧张的氛围里快速判断一条数据流该怎么命名、方向怎么画。用熟之后答题正确率会有很明显的提升。5. 实操过程的完整画法演示从一个空系统开始我在备考时养成一个习惯拿到数据流图题目先不急着填答案而是自己先在草稿纸上把题目描述的完整数据流图画一遍。这样做的好处是你对整个系统会有全局的理解后面填空时就不容易顾此失彼。下面我完整演示一个简化版系统的画法——就用上文提到的网上书城场景但精简到最核心的流程。首先是上下文图。把“网上书城系统”作为一个整体加工放在正中央三个外部实体围在周围。接下来梳理系统与外部实体的数据交换顾客提交注册信息、登录请求、查询条件、订单信息接收登录结果、图书列表、订单确认信息、支付结果。仓库接收发货通知单反馈发货确认。管理员提交图书信息、库存调整指令接收销售统计报表。把这些数据流在外面的大圆上标好上下文图就画完了。这张图的作用是确定系统的“边界感”它把系统内部的复杂度全部藏起来了只留外部交互。接下来是0层图。用题目给出的五个加工构成系统的骨架。从上下文图流入的数据流会被分配给具体的加工。比如“查询条件”这条数据流在0层图中终点应该是“图书浏览与查询”加工“订单信息”的终点是“订单处理”加工“入库请求”的终点是“库存管理”加工。同理流出系统的数据流也要对应到加工上“图书列表”的起点是“图书浏览与查询”加工“发货通知单”的起点是“订单处理”加工。再把数据存储加上。用户注册信息存到用户表图书信息由管理员维护存到图书表订单处理过程中会创建订单并存储到订单表库存管理负责库存表的读写销售统计从订单表读取数据并生成报表。数据存储与加工之间的数据流按照“读”和“写”的方向一一补全。画完这张0层图之后你要回头检查一遍和上下文图的平衡性。把0层图的所有外部实体边界上的数据流列出来再和上下文图里的数据流清单做比对——少一条就是漏画了多一条就是多余的。这个检查动作一定要养成习惯它虽然不能直接帮你得分但它能帮你发现很多潜在问题。我再强调一遍考试里给的那张图是不完整的你的任务不是画一整张图而是“修复”和“补全”这张图。但“修复”的前提是你脑中有完整的图景。如果你自己在草稿纸上能画出完整图再去填题目空缺难度会下降一大截。6. 常见失分点与考场实战策略全解析数据流图题目的坑就那么几个我把这些年看到的高频失分点归纳成了一张速查清单考前拿出来瞄一眼即可常见问题典型表现对症下药数据流方向画反把“写入”画成“读取”方向看动词写→存读→取漏画数据流题干有描述但图上没对应逐句扫描题干一句一对照数据流命名不合法用了动词或短语如“发送信息”改用名词性名称如“新订单信息”加工编号对不上子图加工编号与父图不一致父子图之间编号要统一子加工编号用父加工编号开头实体与存储混淆把数据存储错当成外部实体外部实体在系统外数据存储在系统内数据流上无名称光画箭头不标名字每条数据流必须有名称忽略父子平衡子图多了或少了输入输出对比相邻层边界数据流必须一致数据字典种类混淆数据流条目写成数据项条目抓住主要描述对象组成不同、条目类型不同除此之外我还想单独讲一下加工编号的问题。数据流图的规范里0层图中的加工一般用1、2、3来编号第二层子图中的加工则用1.1、1.2、2.1这种形式来编号。真题中偶尔会给出一个子图让你判断编号是否正确。这类题难度不大但恰恰因为简单很多考生反而容易掉以轻心。看到题目里写“1.3加工”你得敏感地意识到这是1号加工分解出来的子加工如果父图里的1号加工是“用户管理”那1.3就应该是用户管理内部的一个具体功能节点不能跑到其他加工的逻辑里去。关于答题顺序我个人建议是拿到数据流图的题先花一两分钟把题干完整读一遍然后直接做第一小问和第二小问因为这两问比较简单属于送分题稳住心态。第三小问补数据流花的时间稍长把题干中的动词部分标出来一条条核对宁可多想一步也不要漏答。第四小问如果考的是数据字典的判断题记住“守恒”和“充分”两个原则基本就能应付。考试时数据流图的答题区域比较小很多考生字写得比较大结果空间不够。我的做法是先在试卷空白处打草稿把要填的内容写在草稿上确认无误后再誊写到答题卡上。注意答题卡上是按空编号的一定要一一对应别把“外部实体”写到了“存储”的空格里。这种低级错误每年都有不少考生在犯丢得非常冤枉。还有一个很多人忽略的细节数据流图题目的题干描述往往包含了完整的业务操作流程这些流程描述不是给你凑字数的而是出题人故意埋下的信息。每句话几乎都对应着图上的一条数据流或者一个加工。你在读题的时候建议手上拿一支笔把动词和名词性的结果都圈出来比如“提交”“返回”“保存”“读取”“更新”这些词就直接提示了数据流的方向和名称。最后再说说时间预算。数据流图部分如果你已经掌握了方法15到20分钟是合理的时间区间。如果超过20分钟还没做完说明你在某个小问上卡住了这时候果断先跳过去做后面的题目。下午题一共六道在后面算法题和设计题上多花点时间收益往往比死磕数据流图里的某一个空要高。等所有题目做完一遍再回头来补。考试是统筹战分配时间也是能力的一部分。数据流图和数据字典这部分说难也难说不难也不难。难的是它要求你在短时间内把零散的文字描述转换成规范的数据模型不难的是它的方法论极其固定规则就那么多题目再怎么变也逃不出这个框架。在后面的复习中我建议你至少把近五年的真题全部做一遍每做完一套就把自己错误的地方记录下来归类到上面的速查表里。几次下来你会发现错的类型是高度重复的把这些类型一个一个消灭掉考试拿满分就不难了。