软件工程师的软件工程知识技能水平高低主要体现在哪些方面
软件工程师是从事软件开发相关工作的人员的统称。它是一个广义的概念,包括软件设计人员、软件架构人员、软件工程管理人员、程序员等一系列岗位,工作内容都与软件开发生产相关。和其他的工程师类似,作为软件工程师,不一定要样样精通,但对于软件开发生产的整个流程要有清晰的认识。
不论是做设计的软件工程师,还是软件工程管理人员,所需的技能都不仅限于某一项。
个人认为一名软件工程师的能力高低主要与以下三方面相关:
- 个人技术背景
- 项目开发经验
- 团队沟通能力
个人技术背景:
作为一名软件工程师,不论主要是负责团队管理,还是技术分工,都应该拥有一定的技术背景。比如项目经理,经常被吐槽代码写得不好的后来都去做项目经理了,虽然只是调侃,但可见即便是负责项目管理,也需要具有一定的技术背景,否则和真正实现软件的程序员之间就会产生很大的分歧。对于程序员来说往往并不是需求太难做,而是需求太奇葩。实际上对于软件工程师而言,对前端后端一整套稍加了解并不是很费神的事。如果不是技术岗,只需要大概会用就行。如果是技术岗,比如后台开发,那么了解前端的一些技术对实际开发也会有不小的帮助。总而言之,一个优秀工程师的技术栈不一定要很深,但一定不能太浅。
项目开发经验:
一名软件工程师如果只是对技术有了解,但并没有什么项目经历,那么他所掌握的很大一部分技术可能只是纸上谈兵,真正想要发挥出来还需要有优秀的项目经验。
团队沟通能力:
个人技术背景和项目开发经验主要是个人开发能力的体现,但是作为一名软件工程师,始终需要团队间的沟通。不论是分派技术任务,还是需求的共同讨论,都需要拥有良好的沟通能力。比如一些公司招到的实习生,不乏许多技术相当不错的,但是有时会出现一些纠结于技术实现,而耽误整个小组进度的技术呆子。对于公司而言,这种技术并不是他们需要的,作为一名软件工程师需要拥有良好的沟通能力,才能更好的与团队协调发挥出1+1>2的优势。
总而言之,软件工程师的能力应该体现于在一个项目中的参与度与执行力,而非理论上的研究。
期末试题整理
题目摘自本科学习时的课外资料,根据传统软工课程的一些重要章节,抽取了其中的重要知识点。
试题的选取主要侧重了实用性,即正常项目开发中可能会提及的一些知识概念,尽量避开了实际软件开发根本用不到的应试题。
题型分为选择题、判断题、代码分析题、简答题、需求分析题、设计题,总计100分。
- 选择判断题从不同角度考察对软工的认识
- 代码分析题考察基本的代码能力
- 简答题考察业务能力
- 改错题考察需求理解能力
- 设计题考察用例建模
因为软工更偏向于对整个工程流程的理解执行能力,所以选题侧重对软工实用知识点的理解,避免了日常项目中不常用的理论分析和关键词背诵。
一、选择题 15x2'=30'
-
( )因素促使计算机系统越来越复杂。(D)
A. 计算机内存和存储容量上的巨大增长
B. 外部输入/输出选项的更加多样性
C. 计算机体系结构方面的深刻变化
D. 以上所有选项 -
大多数软件仍然是定制开发的,其原因在于( )。(C)
A. 软件组件重用是十分普遍的
B. 可重用的组件太昂贵而无法使用
C. 软件在不使用其他组件的情况下很容易构造出来
D. 商业组件在很多应用领域中可以得到 -
软件工程的基本目标是( )。(B)
A. 消除软件固有的复杂性
B. 开发高质量的软件
C. 努力发挥开发人员的创造性潜能
D. 更好地维护正在使用的软件产品 -
需求导出后产生的工作制品将依赖于( )而不同。(B)
A. 预算多少
B. 将要构建的产品规模
C. 正在使用的软件过程
D. 利益相关者的需要 -
软件开发的增量模型是( )。 (B)
A. 适用于需求被清晰定义的情况
B. 一种需要快速构造核心产品的好方法
C. 适合于大规模团队开发的项目
D. 一种不适用于商业产品的创新模型 -
快速原型开发模型是( )。(B)
A. 适用于客户需求被明确定义的情况
B. 适用于客户需求难以清楚定义的情况
C. 适合于大规模团队开发的项目
D. 很难产生有意义产品的一种冒险模型 -
( )用于封装具体的平台,从而使应用程序可以在不同的平台上运行。(A)
A.抽象工厂模式 B.外观模式 C.观察者模式 D.以上选项都不是 -
逆向工程(Reverse Engineering)通常用在软件生命周期的( )阶段,它是从源代码或目标代码中提取设计信息。(D)
A.需求分析 B.软件设计 C.软件测试 D.软件维护 -
下面对提高程序编码效率没有影响的是( )。(D)
A.选择良好的设计方法
B.选择良好的算法
C.选择良好的数据结构
D.变量名的使用 -
下列的( )不是分析建模的目的。(C)
A. 定义可验证的软件需求
B. 描述客户需求
C. 开发一个简单的问题解决方案
D. 建立软件设计的基础 -
( )意味着一个操作在不同的类中可以有不同的实现方式。(A)
A. 多态性 B. 多继承 C. 消息 D. 封装 -
软件项目所需的人数应该( )。(D)
A. 在估计开发需要的努力之后决定
B. 由项目预算数量决定
C. 从评价系统复杂性来决定
D. 以上所有选项 -
下面的( )软件特性不是引起项目协调困难的一个因素。(B)
A. 互操作性 B. 性能 C. 规模 D. 不确定性 -
软件会逐渐退化而不会磨损,其原因在于( )。(C)
A. 软件通常暴露在恶劣的环境下
B. 软件错误通常发生在使用之后
C. 不断的变更使组件接口之间引起错误
D. 软件备件很难订购 -
在攻克技术难题时,最佳的开发团队组织模型是( )。(A)
A. 民主式结构
B. 主程序员式结构
C. 技术管理混合式结构
D. 以上所有选项都不是
二、判断题 10'
- 大多数软件系统是不容易变化的,除非它们在设计时考虑了变化。(√)
- 好的测试用例应能证明软件是正确的。(×)
- 在程序设计中应尽可能对程序代码进行优化。(×)
- 设计模式是从大量成功实践中总结出来且被广泛公认的实践和知识。 (√)
- 系统设计的主要任务是细化分析模型,最终形成系统的设计模型。(×)
- 在程序设计中使用括号以改善表达式的清晰性。(√)
- 良好的分层体系结构有利于系统的扩展与维护。(√)
- UML语言支持面向对象的主要概念,并与具体的开发过程相关。(×)
- 将开发团队人数增加一倍可以保证项目完成时间减少一半。(×)
- 目前存在一个很普遍的现象,即不同的客户提出的需求是相互矛盾的,但每个人都争辩自己是正确的。(√)
三、代码分析题 4'+9'=13'
1、请分析比较下面两个 for 循环的优缺点。4’
第一个 for 循环:
for (i = 0; i < N; i++)
{
if (condition)
DoSomething();
else
DoOtherthing();
}
第二个 for 循环:
if (condition)
{
for (i = 0; i < N; i++)
DoSomething();
}
else
{
for (i = 0; i < N; i++)
DoOtherthing();
}
参考答案:
第一个 for 循环的代码简练且结构清晰,但效率较低;
第二个 for 循环的执行效率较高,但结构不够紧凑。
2、下面三个程序运行时分别会产生什么结果?为什么?9’
程序 1:
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char), num);
return;
}
int main()
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, “Hello World.”);
printf(str);
return 0;
}
程序 2:
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char), num);
return;
}
int main()
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, “Hello World.”);
printf(str);
return 0;
}
程序 3:
int main()
{
char *str = (char *)malloc(100);
strcpy(str, “Hello ”);
free(str);
if (str != NULL)
{
strcpy(str, “World.”);
printf(str);
}
return 0;
}
参考答案:
程序 1:系统运行崩溃。
原因: GetMemory(str,100)并没有将申请到的内存传回到调用程序, str 一直是 NULL,从而导致非法内存访问,使程序崩溃。
程序 2:显示“Hello World.”,但将产生内存泄漏。
原因: GetMemory(&str, 100)申请到的内存没有被释放。
程序 3:显示“Hello World.”但有时系统运行异常。
原因: 在 free(str)释放内存空间后, str 仍然指向原来空间地址,成为“野指针”。如果这时系统将所释放的空间分配给其他程序使用,将会造成系统运行异常。
四、简答题 10'+5'=15'
1、某个软件项目需要 30 名开发人员,现有两种人员组织方案:10’
(1) 将 30 人划为一个开发组统一管理;
(2) 按每个小组 6 人的方式,将 30 人分为 5 个小组。
请分析比较上述两种方案的优缺点。
参考答案:
由于软件规模的增大,需要多人组成开发小组共同参与一个项目的开发。但是当多个人共同承担软件开发项目中的某一任务时,人与人之间必须通过交流来解决各自承担任务之间的接口问题,这就产生了所谓沟通复杂性的问题。沟通需要花费时间和代价,也会引起软件错误的增加,降低开发效率。
(1) 优点: 30 人集中在同一个开发小组,人员任务的分配和调度相对容易;缺点:沟通复杂性高,从而导致人员之间配合混乱,开发效率低。
(2) 优点: 30 人划分成 5 个小组,降低了沟通复杂性,提高开发效率;缺点:小组之间的协调配合难度大。
2、软件重构与正向工程的区别是什么?5’
参考答案:软件重构代表着软件再工程,正向工程代表着传统的软件开发。正向工程是从新的系统描述开始,通过设计和实现得到一个新的系统;软件重构是从现有系统开始,通过对该系统的理解和转换,最终得到一个再工程的系统。通常,软件重构不会改变系统的总体结构。
五、需求分析题 8'
请指出下面需求描述存在的问题,并进行适当的修改。
(1) 系统用户界面友好。
(2) 系统运行时应该占用尽量少的内存空间。
(3) 即使在系统崩溃的情况下,用户数据也不能受到破坏。
(4) ATM 系统允许用户查询自己银行帐户的现存余额。
(5) ATM 系统应该快速响应用户的请求。
(6) ATM 系统需要检验用户存取的合法性。
(7) 所有命令的响应时间小于 1 秒; BUILD 命令的响应时间小于 5 秒。
(8) 软件应该用 JAVA 语言实现。
答案要点:
(1) 问题:“友好”是不可验证的。
改正:具有一年计算机使用经验的用户经过 3 小时的培训就可以学会使用该系统。
(2) 问题:“尽量少”存在歧义。
改正:系统运行时所占用的最大内存空间是 256MB。
(3) 问题:“不能受到破坏”是不可验证的。
改正:如果系统发生崩溃,那么该系统重新正常启动后,可以将用户数据恢复到最后未完成操作执行前的状态。
(4) 该描述是正确的。
(5) 问题:“快速”是不可验证的。
改正: ATM 系统将在 1 秒钟之内响应用户的请求。
(6) 问题:“如何验证合法性”是存在歧义的。
改正: ATM 系统将通过用户名和口令验证其存取的合法性。
(7) 问题:所有命令中必然会包括 BUILD 命令,因此这两个需求描述是矛盾的。
改正:去掉关于 BUILD 命令的需求描述。
(8) 问题:该描述不是功能需求或非功能需求,应该是对设计实现的一个约束条件。
六、设计题 9'+15'=24'
1、请给出以下问题描述的用例模型。9’
一个新的音像商店准备采用计算机系统向比较广泛的人群销售或租借录像带和光碟。该音像商店将存有大约 1000 盘录像带和 500 张光碟,这些订购涉及多家订购商。所有的录像带和光碟都有一个条码,可以使用条码扫描仪来支持销售和返还,客户会员卡也同时条码化。客户可以预定录像带并在指定日期来取。系统必须拥有灵活的搜索机制来回答客户的询问,包括关于该音像商店还没有进货的电影(但可能是已经请求订购了)。
参考答案:
2、现有一个MinLibrary系统,自行分析系统的需求,给出系统用例图。15’
参考答案: