面试准备-软件工程

参考:

  1. 《程序员面试笔试宝典》(何昊、叶向阳)

标准的软件开发过程:

1)可行性分析:要确定开发目标和总要求,一般要考虑技术是否可行,收益是否可行、用户操作是否可行,是否有法律风险。战略专家→《可行性分析报告》

2)需求分析:领域专家+系统架构师→《需求分析说明书》

3)设计:概要设计(结构)+详细设计→设计说明书、业务用例文档、技术用例文档

4)编码与实现:接口文档、关键算法文档

5)测试:贯穿整个开发过程。白盒/黑盒测试→单元测试报告、集成测试报告、系统测试报告

6)运行与维护:修改、维护、再开发

常见的软件开发过程模型:

1)瀑布模型

瀑布模型将软件生命周期划分为可行性分析、需求分析、设计、代码实现、测试、安装与维护6个基本活动,并且规定了它们自上而下的固定次序,形如瀑布流水,逐层下落。上一个环节完成后,进行验证,如果验证通过,则该结果可以作为下一环节的输入并继续进行,否则需要返回修改。它的优点 是有按阶段划分的检查点,开发者每次只需要关注一个阶段,可以保证最终按时交付,缺点是:a)大量文档 b)用户只有在开发末期才能看到结果,难以调整 c)早期的错误(比如设计上的)要在最后才能发现,导致放大问题。

2)原型模型

原型模型是增量模型的一种形式。在开发真实系统之前,首先要构建一个简单的系统模型,实现客户与系统的交互。客户在使用过程中,不断发现问题,进而细化系统要求。开发者在已有模型的基础上,通过调整原型来满足客户需求,进而开发出客户满意的系统。它的重点是必须快速建立原型,并快速修改。

3)螺旋模型

综合了瀑布模型与原型模型的特点,强调风险分析。每一轮原型都要做风险分析,因此缺点是要求客户接受风险分析,因此需要相关知识,也需要用户参与平价,同时过多的迭代次数也会增加开发成本和时间。

4)增量模型

软件被视作一些列的构件来设计、实现、集成和测试。每次交付的是部分可运行的子系统。优点是较好地适应用户需求的变化;缺点是每次加入新子系统时,可能破坏已构建好的部分;也容易破坏整体性。第一个增量是核心产品。

5)RUP模型

Rational Unified Process,是Rational公司提出的一个通用框架。每个阶段都可以分解、迭代,每一个迭代都是完整的开发循环,都会产生可运行版本。

横轴是时间组织,纵轴是开发中的活动。前者常用属于有cycle,phase,iteration,milestone;后者有activity,artifact,worker,workflow.

1)初始阶段Inception:以需求分析为主,建立整体结构,确定项目边界,结束时候milestone是生命周期目标里程碑,用于评价项目基本的生存能力。

2)细化阶段Elaboration:设计及确定体系结构,制定工作计划与资源要求。结束时候的milestone是生命周期结构里程碑,为系统的结构建立了管理基准并使项目能在构建阶段中进行衡量。

3)构建阶段Construction:构建产品并继续演进需求、结构、计划直到提交。它的milestone是初始功能里程碑,决定了是否可以在测试环境中部署。

4)交付阶段Transition:交付客户,综合测试。milestone是产品发布里程碑。

几种模型的比较

模型 特点 适用范围
瀑布模型 分阶段,每个阶段完成后有评审,允许反馈,要求提前确定需求 需求定义完善,不易变更的系统
原型模型 不需要完备定义,支持用户参与,能适应用户需求的变化 需求复杂、动态变化、难以确定的系统
螺旋模型 综合了瀑布和原型,引进了风险分析 需求难以获取和确定,开发风险较大
增量模型 增量式开发,允许开发活动并行 技术风险较大,用户需求较为稳定的系统
RUP模型 可改造、扩展和建材,可设计、开发、维护 复杂、需求不确定的系统,开发组拥有丰富的软件开发和管理经验

敏捷开发

是将一个大项目分成多个相互联系,但也可以独立运行的小项目并分别完成,在此过程中软件一直处于可使用状态。强调团队合作及与业务专家之间的协作、面对面交流、频繁交付新软件、紧凑而自我组织型的团队、能很好地适应需求变化的代码编写和团队组织方法,更注重软件开发中人的作用。

常见的敏捷开发方法:

自适应软件开发Adaptive Software Development、水晶方法Crystal Method、特性驱动开发Feature Driven Development、动态系统开发方法Dynamic Systems Development Method、极限编程Extreme Programming

敏捷开发的12条原则:

1)按优先级安排,尽早、持续地交付有价值的软件给用户。通过用户故事来罗列需求,虽然编写文档但是工作重点在口头交流

2)即使到了系统开发的后期,也欢迎改变需求

3)经常性地交付可以工作的软件

4)开发期间,业务人员和开发人员要一起工作

5)激励个人构建项目,提供必须的环境和支持

6)采用面对面交谈

7)使用可以工作的软件作为首要的进度度量标准

8)敏捷过程要保持可持续的开发进度

9)不断地关注优秀的技能、设计

10)简单的方式完成

11)使用自组织团队。管理者不发号指令,而是让团队自己寻找最佳工作方式

12)每隔一段时间,团队要反思如何梗有效地工作,改进工作

UML中最常用的图:类图、对象图、用例图、交互图(时序图、协作图)、状态图、活动图、构件图、部署图

SCM(Software Configuration Management)

软件配置管理贯穿于整个软件生命周期,是一种标识、组织和控制修改的技术,用于界定软件的组成项目,对每个项目的变更进行管控,并维护不同项目之间的版本关联,使得项目可以被追溯。包括标识、版本控制、变更控制、配置审计、配置报告几个部分

常见工具:SourceSafe, CVS,ClearCase

使用SCM的好处:

1)解决了由于经费和时间有限带来的问题,减少升级次数

2)使得开发过程得到规范化管理,节约人力和时间

3)能有效管理人员流动,减少人工错误

4)避免了未经测试的软件加入到产品中

5)使得用户与开发商之间能有效沟通,保障用户的利益

6)使得软件生产规模化、构件化,降低成本

CMMI (Capability Maturity Model Integration)

由美国国防部、美国国防工业协会、卡内基梅隆大学共同开发的一项标准。CMMI共有5个级别,级别越高,风险越低,效率和质量越高。

1)初始级

也称无政府状态anarchy或混乱状态chaos。指没有规范过程的项目

2)可重复级

有需求管理、项目规划、项目监督与控制,也有审查等,可以保证项目实施取得成功

3)定义级

不仅对项目实施有整套的管理措施,也能将其制度化,因此可以在不同类的项目上取得成功

4)管理级

在定义级的基础上还实现了数字化管理,能通过量化实现流程的稳定。

5)优化级

在管理级的基础上,能主动改善流程,能根据实际不断调整软件生产过程以求达到最佳。

如何提高软件质量?

软件质量不是一个纯技术问题,而是一个系统的工程性问题。包括:

1)符合目标:开发者是否在做客户要求做的事情

2)符合需求:软件产品是不是在做客户需要做的事情

3)符合实际需求:包括客户明确说的和隐含的

提升软件质量的方向

1)规范产品开发过程

2)做好需求分析→面向对象设计、UML等

3)做好设计

4)加强规范:编程规范、版本控制

5)全面的质量控制:每个步骤上做严格的验证与确认

6)加强文档管理

7)加强代码管理:走读、评审

8)进行简单的度量分析活动

9)进行软件测试:全流程的测试,包括开发前期的静态测试

相关推荐
时差95326 分钟前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
CXDNW2 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
嚣张农民2 小时前
JavaScript中Promise分别有哪些函数?
前端·javascript·面试
阑梦清川6 小时前
在鱼皮的模拟面试里面学习有感
学习·面试·职场和发展
劲夫学编程7 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展
鱼跃鹰飞15 小时前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
钱钱钱端17 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
程序员清风18 小时前
浅析Web实时通信技术!
java·后端·面试
测试199818 小时前
外包干了2年,快要废了。。。
自动化测试·软件测试·python·面试·职场和发展·单元测试·压力测试
mingzhi6119 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展