如何评测软件工程知识技能水平?
一、软件工程师的知识技能
1、软件设计
在进行具体的软件开发工作之前,需要在宏观角度上对项目进行分析。这部分要求软件工程师所掌握的知识技能,不仅具备完整的基础知识体系,还对项目工作整体布局、抽象业务需求实现有一定的要求。
(1)慎于说Yes
在没有搞清楚开发需求、任务工作量、团队期望值之前,有前途的程序员不会轻易答应。特别是对于新人来说,比较急于表现自己,对于同事或者老板的工作安排来者不拒,精神可嘉,方法不可取。承诺太多,会出现自己无法按时完成的情况,即使按时完成,也可能没有达到别人的期望值,长期以往别人对你的失望会越来越多。
(2)敢于说No
看起来和第一条雷同,其实细究起来不一样。第二条执行起来比第一条难得多。当遇到明显不合理的要求时,可以考虑拒绝,前提是准备好了全面充分的理由。不要经常说No,但是一旦说了,就要切中要害。有前途的程序员不会闷头干活,知道自己的定位和团队期望,分清楚哪些是不合理的要求,哪些是合理的要求,然后把明显不合理的要求和领导沟通下,取得支持。
(3)构建自己的知识体系
在信息爆炸的年代,碎片化的知识很多,系统学习的时间越来越少,如果没有自己的知识体系,很容易被淹没在知识的海洋中,而且难以记忆。100分程序员推荐的做法,通过Wiki或者其他知识管理工具构建一个知识框架,大的分类可以包括软技能、架构、语言、前端、后端等,小的分类可以更细化。
(4)培养大局观
程序员比较容易陷入的困境是专注于自己的一亩三分地,不关心团队的进度和业绩,也不关心软件的整体架构和其他模块。这种状态长期下去没有好处,特别是在大公司中,逐渐成长为一颗螺丝钉。100分程序员会在工作之余,多看看其他在做什么,看看团队的整体规划,看看软件系统的架构和说明文档。对自己的工作更理解,而且知道为什么这个产品应该这样设计,为什么领导应该这样做规划,这种大局观非常有利于自己的职业生涯。
(5)深入理解客户需求
仅仅了解单一用户的表面意思是远远不够的。一个伟大的程序员应该具备能把繁琐的要求理解并分解成项目的技术任务或子任务的能力,并且最后拿到的成果应精确满足客户的需求。
2、软件开发
经过详细的工作规划部署,软件工程项目将进入具体实施落地阶段。这部分工作更加注重软件工程师的硬件素质。优秀的编码素养,不仅会使团队工作中协同工作的效率大幅提升,也会增加项目的可复用性、降低代码重构的工作量。
(1)代码规范
程序员在新手时期需要培养良好的代码规范。最直接的办法,遵循公司已有的代码规范(如果没有类似的规定,也是醉了),从简单的变量命名到模块划分,有些规则可以导入到编码工具中,更多的部分需要自己体会和遵守。关于此方面的知识,最权威的书籍是《代码大全》,别误会,书名是个美丽的错误,里面不是代码集锦。对于新手来说,养成一个统一的编码风格非常重要,是基础一步。
(2)代码审查
把这个单独拎出来说,是因为对于程序员来说很重要。很多快速成长的公司没有这个步骤,建议大家能够坚持下来。让别人审查自己的代码,可以得到更多的反馈,也是和同事交流的好机会;审查别人的代码,可以借鉴别人的经验和思路。通常情况下,代码审查比自己写代码的收获更大,对于新手来说更有价值。只要你想做,不论形式是不是正规,都可以执行下去,最好形成团队的习惯。
(3)通过注释来写逻辑
说到编码,我有坚持很多原则和想法。其中一个就是,代码中95%都是逻辑。另一个就是从人类语言到编程语言,逻辑并没有改变。这也就是意味着,如果你能在代码中写出来,也就可以用英语或者其他语言写下来。
(4)在编程之前准备好全套算法
案例、伪代码和流程图统统都是非常重要的软件开发手段。一个伟大的程序员如果没有先准备好算法,那么他是不会像傻小子一样兴冲冲地开工写代码的。写代码实际上只是一个编码任务。
(5)理解并帮助定义验收标准
是否需要高层次测试脚本是由产品所有者决定的,但是一个伟大的程序员必须能够编写技术测试脚本,并且深刻认识到跳过这些步骤可能会带来的后果。
二、水平评测试卷
1、选择题(每题2分,共20题)
(1)程序的三种基本控制结构是( B )。
A.过程、子程序和分程序 B.顺序、选择和重复
C.递归、迭代和回溯 D.调用、返回和转移
(2)软件的特点包括(A)。
A.软件具有抽象性
B.在软件的运行和使用期间,也存在类似硬件的老化问题
C.软件的开发与维护对硬件存在依赖性
D.软件的开发费用在逐渐下降
(3)可行性分析是在系统开发的早期所做的一项重要的论证工作,它是决定该系统是否开发的决策依据,因必须给出( B )的回答。
A.确定 B.行或不行 C.正确 D.无二义
(4)需求分析的基本原则包括(A)。
A.必须能够表达和理解问题的数据域和功能域
B.自顶向下、逐层分解问题
C.修正系统开发计划
D.要给出系统的逻辑视图和物理视图
(5)面向对象的分析方法主要是建立三类模型,即( D )。
A.系统模型、ER 模型、应用模型
B.对象模型、动态模型、应用模型
C.E-R模型、对象模型、功能模型
D.对象模型、动态模型、功能模型
(6)需求分析最终结果是产生( B )。
A.项目开发计划 B.需求规格说明书
C.设计说明书 D.可行性分析报告
(7)决定软件系统中各个模块的外特性,即其输入输出和功能是( B ) 的任务。
A.需求分析 B.概要设计
C.详细设计 D.编程阶段
(8)在概要设计的设计文档中,对每个模块的描述内容包括( D ) 。
A.功能、界面、输入、输出 B.界面、输入、输出、过程
C.界面、过程、限制和约束 D.功能、界面、过程、注释
(9)软件详细设计的主要任务是确定每个模块的( C )。
A.功能 B.外部接口
C.算法和使用的数据结构 D.编程
(10)面向对象技术中,对象是类的实例。对象有三种成份:( A )、属性和方法(或操作)。
A.标识 B.规则 C.封装 D.消息
(11)在考察系统的一些涉及时序和改变的状态时,要用动态模型来表示。动态模型着重于系统的控制逻辑,它包括两个图:一个是事件追踪图,另一个是( A )。
A.状态图 B.数据流图 C.系统结构图 D.时序图
(12)UML是软件开发中的一个重要工具,它主要应用于哪种软件开发方法( C ) 。
A.基于瀑布模型的结构化方法
B.基于需求动态定义的原型化方法
C.基于对象的面向对象的方法
D.基于数据的数据流开发方法
(13)数据耦合、公共耦合、标记耦合、控制耦合的耦合性从低到高的顺序是( B )
A.数据、公共、标记、控制 B.数据、标记、控制、公共
C.控制、数据、标记、公共 D.控制、数据、公共、标记
(14)耦合的强弱取决于( A )。
A.模块间接口的复杂程度 B.调用模块的方式
C.通过接口的信息 D.模块内部各个元素彼此之间的紧密结合程度
(15)内聚程度最低的是( A )内聚。
A.偶然 B.过程 C.顺序 D.时间
(16)为了提高软件的可维护性,在编码阶段应注意( D )
A.保存测试用例和数据 B.提高模块的独立性
C.文档的副作用 D.养成好的程序设计风格
(17)提高程序可读性的有力手段是( D ) 。
A.选好一种程序设计语言 B.显式说明一切变量
C.使用三种标准控制语句 D.给程序加注释
(18)确定测试计划是在( A )阶段制定的。
A.总体设计 B.详细设计 C.编码 D.测试
(19)提高测试的有效性非常重要,成功的测试是指( D )
A.证明了被测试程序正确无误 B.说明了被测试程序符合相应的要求
C.未发现被测程序的错误 D.发现了至今为止尚未发现的错误
(20)在软件生命期中,占工作量比例最大的是( D ) 。
A.可行性研究 B.建立系统的结构
C.编写程序 D.维护
2、判断题(每题2分,共10题)
( × )(1)开发软件就是编写程序。
( √ )(2)快速原型模型可以有效地适应用户需求的动态变化。
( × )(3)软件需求分析的任务是建立软件模块结构图。
( × )(4)进行总体设计时加强模块间的联系。
( √ )(5)尽可能使用高级语言编写程序。
( × )(6)编程序时应尽可能利用硬件特点以提高程序效率。
( × )(7)数据字典是对数据流图中的数据流,加工、数据存储、数据的源和终点进行详细定义。
( √ )(8)模块化,信息隐藏,抽象和逐步求精的软件设计原则有助于得到高内聚,低耦合度的软件产品。
( × )(9)系统测试的主要方法是白盒法,主要进行功能测试、性能测试、安全性测试及可靠性等测试。
( × )(10)软件测试是要发现软件中的所有错误。
3、简答题(每题4分,共5题)
(1)什么软件?软件按功能进行划分,可以划分成哪几类?按工作方式进行分类,可以划分成哪几类?
答:软件是由计算机程序、程序使用的数据以及说明的各种文档组成。按功能进行划分可以分为:系统软件、支撑软件、应用软件;按软件工作方式进行分类可以分为:实时处理软件、分时处理软件、交互式软件和批处理软件。
(2)请根据下面的任务安排表,画出任务网络图、甘特图、标识关键路径和阶段里程碑位置。
|
任务名称 |
起始日期 |
结束日期 |
|
需求分析 |
2020.3.1 |
2020.3.13 |
|
测试计划 |
2020.3.13 |
2020.3.15 |
|
概要设计 |
2020.3.13 |
2020.3.16 |
|
详细设计 |
2020.3.16 |
2020.3.20 |
|
编码 |
2020.3.20 |
2020.3.26 |
|
测试方案设计 |
2020.3.16 |
2020.3.19 |
|
产品测试 |
2020.3.26 |
2020.3.30 |
|
文档整理 |
2020.3.28 |
2020.3.30 |
答:任务网络图:


任务网络图3分,甘特图3分,标识关键路径2分,阶段里程碑位置2分。
(3)需求分析的主要方法是什么?用这种方法进行需求分析的主要步骤有哪些?
答:需求分析的方法有面向数据流的分析方法、面向数据结构的分析方法、面向对象分析方法和动态分析方法等,主要采用面向数据流的分析方法。主要步骤包括:(1)分析数据流图;(2)用户审查;(3)细化数据流图;(4)修订开发计划;(5)复审开发计划。
(4)面向对象方法学的优点有哪些?
答:面向对象方法学的优点:①多角度模拟客观世界;②具有较高的稳定性;③重用性好;④适合开发大型软件。
(5)简述软件质量三要素及其具体包括的内容。
答:软件质量要素可以分为三类,第一类要素表现软件的运行特征,包括正确性、可靠性、有效性、安全性和可用性;第二类要素表现软件承受修改的能力,包括可维护性、灵活性和可测试性;第三类要素表现软件对新环境的适应程度,包括可移植性、可重用性和可互操作性。
4、编程题(每题10分,共1题)
请完整写出快速排序的代码实现,并简述其使用的算法思想。
5、阅读代码题(每题10分,共1题)
下面为数组 A(1)~ A(6) 中找最大数算法的 PDL 描述,请画出 N-S 图(盒图)。


三、总结
经过一学期的《高级软件工程》这门课程的学习,我从一个跨考的小白成为现在初探软件开发门径的学生,学到了很多专业知识,获益匪浅。结合在本课程的学习以及自身的知识和经验,针对这半年来遇到的问题和走过的弯路,我做出了一些需要解决的问题和可以优化的方向,引以为戒。
(1)一个时间段内只专注于一种类型的语言
如果你正在设计或开发网站,你将需要同时熟悉多种不同的语言。你可能会想同时学习所有的这些语言,特别是考虑到它们是如何相互关联的。
我想,在某种程度上,这是不可避免的。但如果你真的想快速提高,我建议你专注于一个特定领域的专业知识。你想更好地利用CSS?把你的重点放在这一点。尝试使用一个单一的HTML文档只使用CSS实现不同的布局。
举个例子来说,你熟悉CSS2,但想提升对 CSS3 的理解,你可以学习CSS3属性并逐一的实现它们。你可以阅读当前的 CSS3规范 ,还可以通过每个模块的学习来了解它在浏览器上能(或不能)做什么。
(2)良好的时间管理
迟到对于任何一家公司都是个头痛的问题。作为一个程序员,有时候为了完成任务常常不得不熬夜,从而导致第二天上班就迟到了。
但是我们忽略了这一点,我们的工作时间至关重要,因为在这段时间里我们要和客户同步,也要与团队其他成员一齐协作。
(3)绞尽脑汁还是“NO”
假如抓耳挠腮还是找不出解决办法,我们该如何是好?一个伟大的程序员应该足智多谋,能灵活应对困境。
他们会去询问同学,或者是向指导老师请教;在互联网上面搜索,然后耐下心来一遍又一遍地试验。相信山穷水尽疑无路,柳暗花明又一村,投降两个字从未出现在他们的字典上。
参考文献:
[1] https://wenku.baidu.com/view/adf7f013e55c3b3567ec102de2bd960590c6d9a0.html
[2] https://wenku.baidu.com/view/7694f5eb9b6648d7c1c746d1.html
[3] 《软件工程》 伊恩·萨默维尔
[4] 《软件工程导论》 张海藩、牟永敏

浙公网安备 33010602011771号