如何评测软件工程知识技能水平?

软件工程师应该具备的知识:
  1. 了解基本计算机基础知识,包含但不限于数据结构与算法、数据库、计算机网络、操作系统的基本知识。
  2. 了解基本的项目管理知识,开发软件的过程就是参与项目管理的过程。
  3. 掌握一门面向对象的编程语言。
  4. 了解一个软件项目开发的全过程。
  5. 基本的工作技能,如基本沟通能力和团队合作精神等。
 
一、软件生命周期各阶段的基本任务
  1.问题定义:必须回答“要解决的问题是什么?”系统分析员写出问题性质、工程目标、工程规模的书面报告并得到客户的确认。
  2.可行性研究:必须回答“对于问题定义阶段所确定的问题,有行得通的解决办法吗?”研究问题的范围,探索这个问题是否值得去解决,是否有可行的解决办法。
  3.需求分析:必须准确地确定“为了解决这个问题,目标系统必须做什么?”用需求规格说明书准确地记录对目标系统的需求。
  4.总体设计:必须回答“概括地说,应该如何实现目标系统?”描述和分析每种方案,推荐最佳方案并制定出详细计划。另一项主要任务是设计程序的体系结构。
  5.详细设计:必须回答“应该如何具体地实现这个系统?”把解法具体化,详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。
  6.编码和单元测试:写出正确的、容易理解的、容易维护的程序模块。程序员把详细设计的结果翻译成用选定语言书写的程序,并且仔细测试每个模块。
  7.综合测试:通过各种类型的测试及相应的调试,使软件达到预定的要求。
  8.软件维护:通过各种必要的维护活动使系统持久地满足用户的需要。
 
1. 软件生存周期的含义是表明软件的演化和发展具有周期性,每过一段时间就需要更新。(错)
2. 基本的软件过程包括需求分析、概要设计、详细设计、编码、测试、运行和维护等几个阶段。 其中,(C) 阶段对每个模块要完成的工作进行具体描述,为源程序编写打下基础。
A.需求分析  
B.概要设计
C.详细设计
D.编码
解析:详细设计:必须回答“应该如何具体地实现这个系统?”把解法具体化,详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。
3.软件需求是软件生命周期的第一个阶段。成功地开发软件产品,首先需要深入理解待用软件解决的问题----软件需求。需求分析中,开发人员要从用户那里解决的最重要的问题是(C)。
A.让软件具有何种结构
B.要给软件提供哪些信息
C.让软件做什么
D.要求软件工作效率怎样
解析:需求分析就是确定软件是做什么的。
4. 为了保证开发进度,软件只需要在最终完成后再进行确认即可。(错)
5.软件开发要从客户的需求出发,在满足用户要求的前提下,功能开发的越多越好。(错)
 
二、软件过程(使用生命周期模型/过程模型描述)
1、瀑布模型(文档驱动,线性顺序开发)
瀑布模型是将软件生存周期的各项活动规定为按线性顺序而连接的若干阶段工作,形如瀑布流水,最终得到软件产品。
特点
1.阶段间具有顺序性和依赖性:前一阶段完成,后一阶段才能开始;前一阶段输出文档作为后一阶段的输入文档,所以前一阶段输出文档正确,后一阶段的工作才会有结果。
2.推迟实现的观点:在编码前进行系统分析和系统设计,清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现。
3.质量保证的观点:每个阶段都必须完成规定的文档,每个阶段结束前都要对完成的文档进行评审,以便尽早发现问题,改正错误。
优点
1.采用规范的方法
2.严格规定每个阶段必须提交的文档
3.每个阶段结束前必须进行严格的技术审查和管理
4.对文档的约束,使软件维护变得容易一些,并且能降低预算。
缺点
1.客户往往很难清楚地给出所有需求
2.软件的实际情况必须到项目开发后期客户才能看到
3.开发过程逆转代价太大
4.实际的项目开发很难严格地按照该模型进行
适用范围
1.用户的需求清楚明确,且开发工程中很少变化。
2.开发人员对软件的应用领域很熟悉。
3.用户的使用环境非常稳定。
4.开发工作对用户参与的要求很低。
2. 增量模型
使用增量模型时,把软件产品作为一系列增量构件来设计编码、集成和测试。
优点
1.可以在短时间内向用户提交部分产品
2.开发的软件具有良好的扩充性,方便逐步增加产品功能
3.使用户有时间适应新产品,减少全新软件带来的冲击
缺点
1.使软件具有开放的架构是使用这种模式的困难,软件工程师必须具有较高要求
2.把每个新的增量构件集成到现有的软件体系结构中,不能破坏已开发的产品
3. 统一过程(Unified Process)
统一过程模型是一种“用例驱动、以体系结构为核心、迭代及增量”的软件 过程框架,由 UML 方法和工具支持。它是一种增量模型,定义了五个阶段:
1.起始阶段,包括用户沟通和计划活动,强调定义和细化用例
2.细化阶段,包括用户沟通和建模活动,重点是创建分析和设计模型。
3.构件阶段,细化模型设计,并将设计模型转化为软件构件实现
4.转化阶段,将软件从开发人员传递给最终用户,并由用户完成 beta 测试和验 收测试
5.生产阶段,持续地监控软件的运行,并提供技术支持。
优点:
1. 任何功能开发后就进入测试过程,及早进行验证
2. 早期风险识别,采取预防措施
缺点:
1. 需求必须在开始之前完全弄清楚,否怎有可能在架构上出现错误
2. 必须有严格的过程管理,以免使过程退化为原始的试→错→改模式
3.如果不加控制的让用户过早接触没有测试完全,版本不稳定的产品可能对用 户和开发团队都带来负面的影响。
4.敏捷过程
1.极限编程(XP)是最著名的敏捷过程。
2.适用于开发可用资源及开发时间都比较苛刻约束的小型项目。
  3.敏捷宣言
1.个人和这些个人之间的交流胜过了开发过程和工具
2.可运行的软件胜过了宽泛的文档
3.客户合作胜过了合同谈判
4.对变更的良好响应胜过了按部就班地遵循计划
 
1.瀑布模型的关键不足在于(B)
A.过于简单
B.不能适应需求的动态变更
C.过于灵活
D.各个阶段需要进行评审
解析:瀑布模型各个阶段的划分完全固定、模型是线性的,用户只有等到整个过程的末期才能见到开发成果,不适应需求的变化。
2.What is agile development manifesto ?(敏捷宣言)
1.个人和这些个人之间的交流胜过了开发过程和工具
2.可运行的软件胜过了宽泛的文档
3.客户合作胜过了合同谈判
4.对变更的良好响应胜过了按部就班地遵循计划
3.假设你被任命为一家软件公司的项目负责人,你的工作是管理该公司已被广泛应用的字处理软件的新版本开发。由于市场竞争激烈,公司规定了严格的完成期限并且已对外公布。你打算使用哪种软件生命周期模型?请说明作出选择的理由。
1.旧版本相当于一个原型,由此较容易确定对新版本的需求,故不必要建立原型系统来分析用户需求。
2.该公司软件工程师具有开发字处理软件的丰富经验,有采用增量模型开发新版字处理软件的技术水平。
3.该软件深受用户喜爱,故将其体系结构设计成开放式的,以利于今后的改进和扩充。
4.用增量模型开发软件时可以并行完成开发工作,因此能够加快开发进度。
4.采用瀑布模型的开发过程是一种自顶向下的开发方法,而软件构件复用的开发过程是一种自底向上的开发方法。(对)
  5.统一过程是用例驱动以架构为中心,(增量)且(迭代)的过程。
 
三、各种概念
1.抽象:抽出事物的本质特性而暂时不考虑它们的细节
多态:在面向对象语言中,接口的多种不同的实现方式即为多态
重构:重构是使用这样一种方式改变软件系统的过程:不改变代码的外部行为而是改进其内部结构
模块化:是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性
可修改性:可修改性描述了程序能够被正确修改的难易程度
2.逐步求精:为了解决主要问题而推迟对问题细节的考虑,是一种把一个时期内要解决的问题按优先级排序的技术。逐步求精是人类解决复杂问题时采用的基本方法。
3.信息隐藏:一个模块内包含的信息对于不需要这些信息的模块来说,是不能访问的。注意:隐藏的不是有关模块的一切信息,而是模块的实现细节。
4.局部化:把关系密切的软件元素物理地放得彼此靠近。
5.模块独立:开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,可以使用耦合和内聚来衡量独立程度。
6.耦合:耦合是对软件不同模块之间的相互依赖程度的度量。软件设计追求松散耦合。
强弱排序:内容耦合> 公共环境耦合> 控制耦合> 特征耦合> 数据耦合。
设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。
7.内聚:内聚衡量一个模块内部各个元素彼此结合的紧密程度。模块内聚性越高,独立性越强,越有利于软件重用。
强弱排序:功能内聚> 顺序内聚> 通信内聚> 过程内聚> 时间内聚> 逻辑内聚> 偶然内聚
高内聚:
1.顺序内聚:模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行。(例如:一个处理元素的输出数据作为下一个处理元素的输入数据)
2.功能内聚:模块内所有处理元素属于一个整体,完成一个单一的功能。
8.结构化程序设计是面向数据流的软件设计方法,主要强调的是程序的易读性。基本思想有:
1.采用自顶向下,逐步求精的程序设计方法
2.使用3种基本控制结构、单入口、单出口来构造程序
3.采用工作方式为主程序员组的组织形式,突出了主程序员的领导
 
1.耦合是对软件不同模块之间的依赖性,我们编程时应该尽量减少耦合,下列选项中那种耦合的强度最低(C)
A 内容耦合
B 控制耦合
C 数据耦合
D 公共环境耦合
解析:耦合是对软件不同模块之间的相互依赖程度的度量。软件设计追求松散耦合。强弱排序:内容耦合> 公共环境耦合> 控制耦合> 特征耦合> 数据耦合。
2.模块的内聚性最高的是( D)
A.逻辑内聚
B.时间内聚
C.偶然内聚
D.功能内聚
解析:内聚衡量一个模块内部各个元素彼此结合的紧密程度。模块内聚性越高,独立性越强,越有利于软件重用。强弱排序:功能内聚> 顺序内聚> 通信内聚> 过程内聚> 时间内聚> 逻辑内聚> 偶然内聚
3.程序的三种基本控制结构是(A)。
A.顺序、分支和循环
B.过程、子程序和分程序
C.调用、返回和转移
D.递归、堆栈和队列
四、测试
程序的质量主要取决于软件设计的质量,软件测试是保证软件质量的关键步骤,是对软件规格说明、设计和编码的最后复审,占软件开发总共工作量的40%以上。
测试定义是“为了发现程序中的错误而执行程序的过程”。但测试不能证明程序是正确的。
关于测试的一些规则:
1.测试是为了发现程序中的错误而执行程序的过程。
2.好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案。
3.成功的测试是发现了至今为止尚未发现的错误的测试。
编码风格
1.程序内部应该有良好的文档
2.数据说明应该易于理解和查阅
3.语句构造应该简单直观
4.输入输出风格遵守人机界面设计准则
5.效率满足用户需求
软件测试准则
1.所有测试都应该能追溯到用户需求
2.应该远在测试开始之前就制定出测试计划
3.把Pareto原理应用到软件测试中
4.应该从“小规模”测试开始,并逐步进行“大规模”测试
5.穷举测试是不可能的
6.应该由独立的第三方从事测试工作
测试方法
1.静态测试:被测试的程序不在机器运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。
2.动态测试:指通过运行程序发现错误,测试方法主要有白盒法和黑盒法:
1.白盒测试(又称结构测试)
把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。
2.黑盒测试(又称功能测试)
把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。黑盒测试是在程序接口进行的测试,只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性。
测试:
1.单元测试:测试软件设计的最小单元--模块,侧重于构件的内部处理逻辑和数据结构,执行控制结构中的所有独立路径(基本路径)以确保模块中的所有语句至少执行一次。测试边界条件确保模块在到达边界值得极限或受限处理的情形下仍能正确执行。
驱动模块:接收测试用例数据,将这些数据传递给被测模块,并输出结果。
桩:替换那些从属于被测模块的模块
2.集成测试:测试组装后的模块以及模块间接口。
模块集成的方法
1.非渐增式测试:对每个模块分别进行单元测试,再把所有模块按设计要求组装在一起进行测试。
2.渐增式测试(普遍采用):逐个把未经测试的模块组装到已经测试的模块上,进行集成测试,每加入一个新模块进行一次集成测试,重复此过程直至程序组装完成。
实际上此法同时完成单元测试和集成测试
3.混合法:对软件结构中较上层使用的自顶向下方法与对软件结构中较下层使用的自底向上方法相结合。当被测试的软件中关键模块比较多时,这种混合法可能是最好的折衷方法。
3.确认测试:测试可运行的目标软件系统,通常使用黑盒测试法,确认测试必须有用户积极参与,或以用户为主进行。
Alpha测试:由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试,开发者负责记录发现的错误和遇到的问题,即α测试是在受控的环境中进行的。
Beta测试:由软件的最终用户们在一个或多个客户场所进行,开发者通常不在β测试的现场,即β测试是软件在开发者不能控制的环境中的“真实”应用。
4.回归测试:是指重新执行已经做过的测试的某个子集,以保证在集成测试过程中,每当一个新模块结合进来时,没有带来非预期的副作用。它可以用于保证由于调试或其他原因引起的变化,不会导致非预期的软件行为或额外错误的测试活动。
 
1.软件测试的目的是(B)。
A 评价软件的质量
B 发现软件的错误
C 找出软件的所有错误
D 证明软件是正确的
2.软件的质量是诸多质量属性的综合体现,质量属性包括:(B)
A.易用性
B.所有其他选项所述质量属性及其它
C.可维护性
D.可移植性
3. 软件测试的主要方法有 白盒法和(黑盒法)。
 
五、面向对象
基本概念
1.对象:问题域某个实体的抽象
2.类:对具有相同数据和相同操作的一组相似对象的定义。
3.实例:以某个特定的类为模板而建立的一个具体的对象。
4.消息:要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。
5.属性:类中所定义的数据,即对客观世界实体所具有的性质的抽象。
6.方法:对象所能执行的操作,即类中所定义的服务。
7.封装:把数据和实现操作的代码集中起来放在对象内部。
8.继承:子类自动地共享基类中定义的数据和方法的机制。
9.多态:子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。
10.重载:函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;运算符重载是指同一个运算符可以施加于不同类型的操作数上面。
UML(统一建模语言)作为基于面向对象技术的标准建模语言。
类图:类图是一切面向对象方法的核心建模工具。该图描述了系统中对象的类型以及它们之间存在的各种静态关系。
主要的关系:
简单关联Simple Association:代表类型之间的关系(一个人为公司工作,一间公司有多个办事处)。
泛化Generalization(继承):专为将实例关系图 (ERD) 应用于面向对象设计而设的一种关系。它在面向对象设计中的继承概念互相呼应。表示“is-a”关系。
聚合Aggregation:特殊类型的关联。它代表关系的“part of”。
组成 Composition: 一种特殊的聚合,其无法单独存在,随整体消亡而消亡。
依赖 Dependency:如果对一个类的定义的更改可能导致对另一个类的更改(但反之则不行),则在两个类之间存在依赖。
 
面向对象设计准则6个
1.模块化
2.抽象(规格说明抽象、参数化抽象)
3.信息隐藏
4.弱耦合(松散交互耦合、提高继承耦合)
5.强内聚(服务内聚、类内聚、一般-特殊内聚)
6.可重用(类构件的重用方式:实例重用、继承重用、多态重用)
面向对象程序设计风格
1.提高可重用性
提高方法的内聚、减少方法的规模、保持方法的一致性、把策略和实现分开、全面覆盖、尽量不使用全局信息、充分利用继承机制。
2.提高可扩充性
封装实现策略、不用一个方法遍历多条关联链、避免使用多分支语句、精心确定公有方法。
3.提高健壮性
预防用户的错误操作、检查参数的合法性、不要预先确定限制条件、先测试后优化。
 
1 UML是软件开发中的一个重要工具,它主要应用于哪种软件开发方法(C )
A.基于瀑布模型的结构化方法
B.基于需求动态定义的原型化方法
C.基于对象的面向对象的方法
D.基于数据的数据流开发方法
解析:UML(统一建模语言)作为基于面向对象技术的标准建模语言,是基于对象的面向对象的方法。
2.在E-R模型中,包含以下基本成分(C)。
A.数据、对象、实体
B.控制、联系、对象
C.实体、联系、属性
D.实体、属性、操作
3.将下面的关系按泛化/继承关系、聚合关系或简单关联进行分类。
教职工——教师 (泛化/继承关系)
教室——学生 (简单普通关联)
学校——学生(聚合关系 )
4.将下列各项分为类或类的实例
我的汽车(实例)
交通工具 (类)
六、项目管理
关键路径
1.最早时刻和最迟时刻相同的事件定义了关键路径,EET = LET称为关键事件。关键路径上的事件(关键事件)必须准时发生,组成关键路径的作业(关键作业)的实际持续时间不能超过估计的持续时间,否则工程就不能准时结束。
2.推迟关键路径上的任务会延迟整个项目的原因:关键任务决定了完成项目所需要的最短时间。如果位于关键路径上的一个关键任务的完成时间被推迟,则关键路径上的下一个任务的开始时间和结束时间也要相应地延迟,这样依次传递,会波及关键路径上的最后一个任务,从而延迟整个项目。
3.一个项目活动图中可以有多个关键路径。
软件质量
概念:软件质量就是“软件与明确地和隐含地定义的需求相一致的程度”。即软件质量是软件与明确地叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。
能力成熟模型(CMM)
1.概念:CMM是用于评价软件机构的软件过程能力成熟度的模型。
2.思想:由于问题是由人们管理软件过程的方法不当引起的,所以新软件技术的运用并不会自动提高软件的生产率和质量。
3.作用:提高软件生产率和质量的关键是改进对软件过程的管理,能力成熟度模型有助于软件开发机构建立一个有规律的、成熟的软件过程。
等级:对软件过程的改进不可能一蹴而就,CMM以增量的方式引入变化,明确地定义了5个成熟度等级:
1.初始级:软件过程无序甚至混乱。
2.可重复级:已经建立了基本的项目管理过程,可跟踪成本、进度、功能和质量。
3.已定义级:已经定义了完整的软件过程,并且该软件过程已经文档化和标准化。
4.已管理级:可以定量地管理软件过程和软件产品。
5.优化级:可以使用定量的信息来管理并不断改进软件过程。
 
 
1. 在影响项目成本的因素中,下列表述不正确的是(D)。
A.项目完成的活动越复杂,则项目的成本就会越大。
B.在项目所消耗资源的数量和单价两个要素中,资源的数量对项目成本的影响较大。
C.项目质量的要求越高,则项目的成本就会越大。
D.延长项目的工期会减少项目的成本。
2. 在项目管理的过程中,将项目任务与相应的责任人对应关系的图表,叫做(A)。
A.责任分配矩阵。
B.优先网络图。
C.关键路径。
D.工作分解结构。
3.模型一定是在某种特定意图下、从某种特定的角度对物理环境的抽象。(对)
4.软件工程的目的是倡导以工程的原理、原则和方法进行软件开发。(对)
5.Kristie想获得能支持她的决定的证据。她目前打算重新安排办公室的空间,以使得她组内成员的工作环境更加舒适。她认为除了应该仔细考虑改变的客观方面以外,为她工作的人的想法也很重要。Kristie组里的员工认为她是一个好的倾听者,当他们有问题的时候,他们经常会询问她的意见。Kristie的工作方式属于 (D)
A.理性的外向的
B.理性的内向的
C.感性的外向的
D.感性的内向的
 
  6. What the difference between software and hardware?
  1.软件是设计开发的,而不是传统意义上生产制造的。
  2.软件不会“磨损”。
  3.大多数软件根据实际的顾客需求定制的。
  7. 什么是软件危机?(软件危机的概念)
  软件危机是指在计算机软件开发和维护的过程中所遇到的一系列严重问题,包含下面两方面的问题:
  1. 如何开发软件,以满足对软件日益增长的需求;
  2. 如何维护数量不断膨胀的现有软件;