提高代码质量的三要素
项目管理核心三要素:时间、质量、成本

项目管理核心三要素:时间、质量、成本工期紧,活儿只能凑合了;超支,赶紧砍内容,别弄那么多;资源有限,人手奇缺,往后拖吧。
这就是我们身边项目运作时常发生的状况。
所有的项目经理都会做预算,都会设置检查点,都知道又要无休止的协调。
但真正执行起来,千变万化的现实让他们经常无所适从。
时间、质量、成本难平衡!在纸上画一个等边三角形。
在各个边上标上时间、质量、成本。
我们会看到,任何一方的移动必定带动其他的变形。
这个三角形中间又是什么呢?是范围管理,也就是项目范围。
这个三角也就是我们常说的“项目管理三角形”。
时间、成本、质量就是项目管理的三要素。
有一种比喻更能说明三要素之间的关系。
小高为了取悦新认识的女朋友,精心设计了欧洲8日游,旅游花光了他多年的积蓄,旅游结束后,他再也没有财力去继续下一步的发展了。
用项目管理的话说,这就是不计成本的恶果。
过了一段时间后,他又攒了一些钱,这次他不和新女朋友旅游了,他请这个姑娘看了场电影—《第一滴血》。
看完后,女朋友觉得小高有暴力倾向,又分手了。
这一次,小高败在不讲质量。
第三次,小高知道女孩子一般喜欢看歌舞剧,他准备请第三个女朋友去看半年后才上演的《天鹅湖》,战线一直拉着,女朋友爱上了别人——时间拖得太久了。
这个比喻形象地说明了项目管理中的难题:如何平衡三要素之间的关系?一般来说,管理者都希望项目完成的时间要快,完成的成本要低,完成后的质量要好。
可是这三个要素是彼此互斥的。
能够完美做到以上三个要素的项目,少之又少。
上世纪60年代初,肯尼迪总统下令要十年内把人送上月球,并安全带回来。
这个庞大的计划,要快,必须赶在前苏联之前完成;要好,绝不能出现任何差错;并且在预算上有限制。
结果,在各方为这个项目大开绿灯之后,美国果真抢先把人类送上月球,并平安带了回来。
当然,我们平常的项目不可能集所有人力、物力、财力等所有资源,并且得到至高无上的尚方宝剑。
因此,在一般的项目上,这三个要素,彼此之间是鱼与熊掌的关系。
计算机二级【公共基础知识】软件工程基础

3.软件的分类
根据应用目标的不同,软件可分应用软件、系 统软件和支撑软件(或工具软件)。
(1)应用软件。它是在特定领域内开发,为特定目 的服务的一类软件。
(2)系统软件。它能与计算机硬件紧密配合在一起, 使计算机系统各个部分、相关的软件和数据协调、 高效的工作的软件。例如:操作系统、数据库管理 系统。
3.4软件测试
软件测试的指用人工或自动手段来运行或测定
某个系统的过程,其目的在于检验它是否满足 规定的需求或是弄清预期结果与实际结果之间
的差别。简单地说,软件测试的目的是尽可能 多地发现程序中的错误。
考点2:软件测试方法
按是否要执行被测试软件的角度分为:静态测 试和动态测试。
静态测试包括代码检查、静态结构分析、代码 质量度量。不实际运行软件,主要通过人工进 行。
1. 详细设计为软件结构图中的每一个模块确定
实现算法和局部数据结构,用某种选定的表 达工具表示算法和数据结构的细节。
详细设计常用工具:
1. 图形工具(程序流程图、 PAD图 、N-S图、 HIPO图)
2. 表格工具(判定表)
3. 语言工具(PDL )
开始 输入R S=3.14 * R*R
输出S
结束
答案:D
例题:
软件工程的出现是由于 A)程序设计方法学的影响 B)软件产业化的需要 C)软件危机的出现 D)计算机的发展
答案:C
例题:
软件设计中,有利于提高模块独立性的一个准 则是
A)低内聚低耦合 B)低内聚高耦合 C)高内聚低耦合 D)高内聚高耦合
答案:C
例题:
下列不属于结构化分析的常用工具的是 A)数据流图 B)数据字典 C)判定树 D)PAD图
2023软件工程导论期末考试题库及参考答案

2023软件工程导论期末考试题库及参考答案一、选择题(每题2分,共20分)1. 以下哪个不是软件工程的三个基本目标?A. 可维护性B. 可用性C. 可靠性D. 高效性参考答案:D2. 软件生命周期中,以下哪个阶段是软件开发过程的核心阶段?A. 需求分析B. 设计C. 编码D. 测试参考答案:C3. 以下哪种编程范式主要用于降低软件复杂性?A. 面向对象编程B. 过程式编程C. 函数式编程D. 逻辑编程参考答案:A4. 在软件工程中,以下哪个方法用于估算软件项目的成本和进度?A. COCOMOB. WBSC. SDLCD. CASE参考答案:A5. 以下哪个是软件工程中的一个重要原则?A. 分而治之B. 一次性编写C. 重用D. 模块化参考答案:D6. 以下哪个不是软件工程的基本活动?A. 软件规格B. 软件开发C. 软件验证D. 软件测试参考答案:C7. 以下哪个是软件工程中用于提高软件质量的技术?A. 设计模式B. 重构C. 代码审查D. 单元测试参考答案:C8. 以下哪个不是软件工程的五大基本过程?A. 软件规格B. 软件开发C. 软件维护D. 软件项目管理参考答案:D9. 以下哪个是软件工程中的一个重要概念,用于描述软件系统中的各个组件之间的关系?A. 耦合B. 内聚C. 模块化D. 重用参考答案:A10. 以下哪个是软件工程中的一个重要原则,用于指导软件开发过程?A. 迭代B. 增量C.螺旋D. 模型驱动参考答案:A二、填空题(每题2分,共20分)11. 软件工程的三要素是:方法、工具和______。
参考答案:过程12. 软件生命周期包括:需求分析、设计、编码、______和软件维护。
参考答案:测试13. 软件工程中的面向对象方法包括:封装、继承和______。
参考答案:多态14. 软件工程中的 CASE 工具主要用于支持______。
参考答案:软件设计和开发15. 软件工程中的敏捷开发方法强调______、可维护性和可扩展性。
软件开发项目管理

管理目标1、所有关系人清晰明确地了解工程的需求和期望,努力做到满足工程所有关系人的不同需求;工程关系人包括:工程团队成员和工程团队外(内部/外部客户,内部/外部合作伙伴,经销商/客户等)。
2、工程管理三要素平衡(时间/成本/质量),即开发工程按需按时按质的完成。
3、目标:功能满足需求,设计支持变化,开发快速迭代,成果持续交付。
执行概述1、建立有效的工作流程保证工程的顺利进行,初期使用传统RUP过程,引入部分敏捷方法,团队磨合完成后逐步实现敏捷开发全流程管理。
2、明确工程目标,制定具有可行性的工程计划,有效明确的分解工程需求。
3、跟踪设计/开发/测试/回归/发布全流程,推动工程按预定计划执行。
4、解决工程过程中出现的问题和冲突,一般集中在需求不明/工作量或时长/开发难度/跨部门协调等几个方面。
5、调动开发团队的积极性,创造力,推动团队成员在工程过程中的学习成长。
6、风险识别、风险控制以及风险的预案。
工程管理1、需求阶段对工程进行技术可行性分析、技术评估、成本评估以及风险评估。
与需求提出方的代表进行需求讨论,明确工程的目标、价值。
确定工程范围、功能及优先级。
组建工程团队,特别要搞清楚工程的关键人。
工程启动会议,相关的关系人都必须参加。
2、设计阶段根据确认后的软件需求规格说明书,制定工程进度计划,工作任务分解(WBS);资源申请,工程涉及到的开发资源、测试资源、设计资源(包括人员和软硬件资源);数据库设计;系统设计;文档(包括系统用例、Demo、测试用例等);评审会议。
设计阶段结果交付一般为系统用例/系统原型/系统设计文档(概要设计和详细设计)/数据库设计文档等。
该阶段交付成果需要进行评审。
3、执行阶段(开发和测试)准备开发环境、测试环境。
跟踪,推动工程按计划进行。
工程成员以日报/工程负责人以周报的形式通报各关系人当前工程的进展情况。
按里程碑对阶段成果进行评估,以确保该阶段完成的质量。
代码审核,包括CS审核、SQL审核、WEB审核等。
软件工程复习资料

A、语句覆盖:选择测试用例使程序中每条语句至少被执行一次 B、判定覆盖:选择测试用例使程序中每个判定至少都获得一次“真”值和一次“假”值 C、条件覆盖:选择测试用例使每个条件都满足 D、条件组合覆盖:将所有的判定条件都组合起来执行 答案: A B
9. 以下()不属于结构化流程图
A、运行程序并分析运行结果 B、桌前检查与代码会审 C、数据流分析图 D、调用图
答案: B C D
15. 下面()属于可复用的软件级别。
A、代码的复用 B、设计结果的复用 C、分析结果的复用 D、测试信息的复用
答案: A B C D
16. 黑盒测试着重测试软件功能,下列测试法中属于黑盒测试技术的有()。
3. 面向对象方法学的出发点和基本原则是什么?
答案: 面向对象方法学的出发点和基本原则是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世 界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一 致。
3. 软件原型
答案: 软件原型是在软件系统开发过程中,可快速建立的,旨在演示目标系统主要功能的可运行的程序。
4. 继承
答案: 广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动 地共享基类中定义的数据和方法的机制。
5. 有穷状态机
答案: 在软件工程领域,有穷状态机可以准确地描述一个系统,它是表达规格说明的一种形式化说明方法。一个有穷状态机包含5 个部分:状态集、输入集、由当前状态和当前输入确定下一个状态的转换函数、初始态和终态集。
A、等价划分法 B、平行运行法 C、边界值分析法 D、错误推测法
组织机构代码信息质量改善浅析

组织 ,国际经济交往 日益频繁 ,国内已逐步建立起市场 经济体 制,跨地区、跨省的经济流转 日益增加 ,为促进 企业 间经济交往 , 保 障交易之安全 ,便于行政管理及信 息统计等 目的, 代码的工作愈显其重要 陛与不可替代性。
分中心的二级集 中赋码模式 , 通过全国联网的省级数据
库审核 ,申领单位确实没有办理过组织机构代码后 ,由 省中心将具体的组织代码直接赋予相应的组织机构 。从 技术上讲 , 可 以说是基本保证 了组织机构代码的唯一 陛,
张劲男 ,高祥涛 摘要 :本文首先介绍 了组织机构代码信 息质量 的内涵 ,并在此基础上讨论 了组织机构代码信 息质量的现状和存在 的问题 ,然后分析 了影响组织机构代码信 息质量的常见原 因,最后就改
善 组 织机构 代码 信 息 的质 量 提 出 了几点 思路 和做 法。
关键词:组织机构代码 信 息质量
a nd d i s c us s e s t h e i r s t a t us a nd t h e e x i s t i n g p r o bl e ms , a n d t h e n a na l y z e s t h e c omm o n r e a s o n s a f f e c t i n g t he or g a n i z a t i o n c o d e i n f o r ma t i o n q u a l i t y ,a n d f i na l l y p u t s f o r wa r d s o me i de a s a nd me t h o d s t o i mp r o v e t h e o r g a n i z a t i o n c o de i n f o r ma t i o n qu a l i w.
软件工程基础知识

软件工程基础知识考点指导考点 1 :软件工程和项目管理基础★★★考点点拨:本考点考查软件工程和软件生成周期的概念,常用的软件开发模型,以及软件开发项目管理基础知识。
【试题1】软件工程三要素是____________ 。
A)技术、方法和工具B)方法、工具和过程C)方法、对象和类D)过程、模型、方法答案:B 分析:软件工程三要素:方法、工具和过程。
软件工程方法为软件开发提供了“如何做” 的技术。
软件工具为软件工程方法提供了自动的或半自动的软件支撑环境。
软件工程过程定义了:方法使用的顺序、要求交付的文档资料、为保证质量和适应变化所需要的管理以及软件开发各个阶段完成的工作。
理论链接:软件工程概述1.软件危机软件危机是指计算机软件开发和维护过程中所遇到的一系列严重问题。
概括的说即为:能否满足对软件日益增长的需求?能否维护数量日益增长的现有软件?2.软件工程软件工程是一类求解软件的工程,它应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法,创建软件以达到提高质量、降低成本的目的。
其中,计算机科学、数学用于构造模型与算法,工程科学用于制定规、设计型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
软件工程是一门指导计算机软件开发和维护的工程学科。
软件工程准则可以概括为六条基本原理:(1 )用分阶段的生存周期计划严格管理;(2)坚持进行阶段评审;(3 )实行严格的产品控制;(4 )采用现代程序设计技术;(5)应能清楚地审查结果;(6 )合理安排软件开发小组的人员。
【试题2】软件开发的结构化生命周期方法将软件生命周期划分成__________________ 。
A )计划阶段、开发阶段、运行阶段B )计划阶段、编程阶段、测试阶段C)总体设计、详细设计、编程调试 D )需求分析、功能定义、系统设计答案:A【试题3】软件生命周期的最后的一个阶段是______________ 。
A)书写软件文档 B )软件维护C)稳定性测试D)书写详细用户说明答案:B理论链接:软件生存(生命)周期软件生存周期:软件的产生直到报废的生命周期。
高质量代码有三要素:可读性、可维护性、可变更性

⾼质量代码有三要素:可读性、可维护性、可变更性今天这堂培训课讲什么呢?我既不讲Spring,也不讲Hibernate,更不讲Ext,我不讲任何⼀个具体的技术。
我们抛开任何具体的技术,来谈谈如何提⾼代码质量。
如何提⾼代码质量,相信不仅是在座所有⼈苦恼的事情,也是所有软件项⽬苦恼的事情。
如何提⾼代码质量呢,我认为我们⾸先要理解什么是⾼质量的代码。
⾼质量代码的三要素 我们评价⾼质量代码有三要素:可读性、可维护性、可变更性。
我们的代码要⼀个都不能少地达到了这三要素的要求才能算⾼质量的代码。
1. 可读性强 ⼀提到可读性似乎有⼀些⽼⽣常谈的味道,但令⼈沮丧的是,虽然⼤家⼀⽽再,再⽽三地强调可读性,但我们的代码在可读性⽅⾯依然做得⾮常糟糕。
由于⼯作的需要,我常常需要去阅读他⼈的代码,维护他⼈设计的模块。
每当我看到⼤段⼤段、密密⿇⿇的代码,⽽且还没有任何的注释时常常感慨不已,深深体会到了这项⼯作的重要。
由于分⼯的需要,我们写的代码难免需要别⼈去阅读和维护的。
⽽对于许多程序员来说,他们很少去阅读和维护别⼈的代码。
正因为如此,他们很少关注代码的可读性,也对如何提⾼代码的可读性缺乏切⾝体会。
有时即使为代码编写了注释,也常常是注释语⾔晦涩难懂形同天书,令阅读者反复斟酌依然不明其意。
针对以上问题,我给⼤家以下建议: 1)不要编写⼤段的代码 如果你有阅读他⼈代码的经验,当你看到别⼈写的⼤段⼤段的代码,⽽且还不怎么带注释,你是怎样的感觉,是不是“嗡”地⼀声头⼤。
各种各样的功能纠缠在⼀个⽅法中,各种变量来回调⽤,相信任何⼈多不会认为它是⾼质量的代码,但却频繁地出现在我们编写的程序了。
如果现在你再回顾⾃⼰写过的代码,你会发现,稍微编写⼀个复杂的功能,⼏百⾏的代码就出去了。
⼀些⽐较好的办法就是分段。
将⼤段的代码经过整理,分为功能相对独⽴的⼀段⼜⼀段,并且在每段的前端编写⼀段注释。
这样的编写,⽐前⾯那些杂乱⽆章的⼤段代码确实进步了不少,但它们在功能独⽴性、可复⽤性、可维护性⽅⾯依然不尽⼈意。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提高面试代码质量的三要素作者:baiyuzhong分类:管理阅读:7,387 次添加评论作者总结自己多年面试他人以及被他人面试的经验,发现应聘者可以从代码的规范性、完整性和鲁棒性三个方面提高代码的质量。
程序员在职业生涯中难免要接受编程面试。
有些程序员由于平时没有养成良好的编程习惯,在面试时写出的代码质量不高,最终遗憾地与心仪的公司和职位失之交臂。
因此,如何在面试时能写出高质量的代码,是很多程序员关心的问题。
代码的规范性面试官是根据应聘者写出的代码来决定是否录用一个应聘者的。
应聘者首先要把代码写得规范,才可以避免很多低级错误。
如果代码写得不够规范,会影响面试官阅读代码的兴致,至少印象分会打折扣。
书写、布局和命名都决定着代码的规范性。
规范的代码书写清晰。
绝大部分面试都要求应聘者在白纸或者白板上书写。
由于现代人已经习惯了敲键盘打字,手写变得越发不习惯,因此写出来的字潦草难辨。
虽然应聘者没有必要为了面试特意去练字,但在面试过程中减慢写字速度、尽量把每个字母写清楚还是很有必要的。
不用担心没有时间去写代码。
通常编程面试的代码量都不会超过50行,书写不用花多少时间,关键是在写代码之前形成清晰的思路并能把思路用编程语言清楚地书写出来。
规范的代码布局清晰。
平时程序员在集成开发环境如Visual Studio里面写代码,依靠专业工具调整代码的布局,加入合理的缩进并让括号对齐成对呈现。
离开这些工具,应聘者就要格外注意布局问题。
当循环、判断较多逻辑较复杂时,缩进的层次可能比较多。
如果布局不够清晰,缩进也不能体现体现代码的逻辑,这样的代码将会让人头晕脑胀。
规范的代码命名合理。
很多初学编程的人在写代码时总是习惯用最简单的名字来命名,变量名是i、j、k,函数名是f、g、h。
由于这样的名字不能告诉读者对应的变量或者函数的意义,代码一长就会变得非常晦涩难懂。
强烈建议应聘者在写代码时,用完整的英文单词组合命名变量和函数,比如函数需要传入一个二叉树的根结点作为参数,则可以把该参数命名为BinaryTreeNode* pRoot。
不要因为这样会多写几个字母而觉得麻烦。
如果一眼能看出变量、函数的用途,应聘者就能避免自己搞混淆而犯一些低级的错误。
同时合理的命名也能让面试官一眼就能读懂代码的意图,而不是让他去猜变量到底是数组中的最大值还是最小值。
代码的完整性在面试的过程中,面试官会非常关注应聘者考虑问题是否周全。
面试官通过检查代码是否完整来考查应聘者的思维是否全面。
通常面试官会检查应聘者的代码是否完成了基本功能、输入边界值是否能得到正确的输出、是否对各种不合规范的非法输入做出了合理的错误处理。
三种测试用例确保代码的完整性应聘者在写代码之前,首先要把可能的输入都想清楚,从而避免在程序中出现各种各样的质量漏洞。
也就是说在编码之前要考虑单元测试。
如果能够设计全面的单元测试用例并在代码中体现出来,那么写出的代码自然也就是完整正确的了。
通常程序员可以从功能测试、边界测试和负面测试三方面设计测试用例,以确保代码的完整性。
首先要考虑的普通功能测试的测试用例。
应聘者首先要保证写出的代码能够完成面试官要求的基本功能。
比如面试题要求完成的功能是把字符串转换成整数,应聘者就可以考虑输入字符串“123”来测试自己写的代码。
这里要把零、正数(比如123)和负数(比如-123)都考虑进去。
考虑功能测试时,应聘者要尽量突破常规思维的限制,避免忽视某些隐含的功能需求。
比如“打印从1到最大的n位数”,很多人觉得很简单。
最大的3位数是999、最大的4位数是9999。
这些数字很容易就能算出来。
但最大的n位数都能用int型表示吗如果超出int的范围可以考虑long long类型。
超出long long能够表示的范围呢面试官是不是要求考虑任意大的数字如果面试官确认题目要求的是任意大的数字,那么这个题目就是一个大数问题。
此时需要特殊的数据结构来表示数字,比如用字符串或者数组来表示大的数字,才能确保不会溢出。
其次需要考虑各种边界值的测试用例。
很多代码都包含有循环或者递归。
如果代码是基于循环,那么结束循环的边界条件是否正确基于循环的代码要特别注意开区间和闭区间的使用(也就是区分<与<=、>与>=)。
如果代码是基于递归,递归终止的边界值是否正确这些都是边界测试时要考虑的用例。
还是以字符串转换成整数的问题为例,应聘者写出的代码应该确保能够正确转换最大的正整数和最小的负整数。
再次还需要考虑各种可能的错误的输入,也就是负面测试的测试用例。
应聘者写出的函数除了要顺利地完成要求的功能之外,当输入不符合要求时,面试官还希望他能做出合理的错误处理。
在设计把字符串转换成整数的函数时,应聘者就要考虑当输入的字符串不是一个数字,比如“1a2b3c”,怎么告诉函数的调用者这个输入是非法的。
前面讨论的都是要全面考虑当前需求对应的各种可能输入。
在软件开发过程中,永远不变的就是需求会一直改变。
如果应聘者在面试时写出的代码能够把将来需求可能的变化都考虑进去,在需求发生变化时能够尽量减少代码改动的风险,那他就向面试官展示了自己对程序可扩展性和可维护性的理解,必定能得到面试官的青睐。
如果应聘者在解答面试题“调整数组顺序使奇数位于偶数前面”时能够考虑可扩展性,他写出的代码不仅仅只是解决调整奇数和偶数的问题,还能考虑到把调整数字顺序的功能和判断一个数字是奇数还是偶数的功能解耦。
这样当今后需求功能扩展要求解决类似的问题,比如调整负数和非负数的顺序、调整能被3整除的数字和不能被3整除的数字的顺序,只需要添加很少的代码都能做到,于是提高了代码的可扩展性和可维护性。
三种错误处理的方法通常有三种方式把错误信息传递给函数调用者。
函数用返回值来告知调用者是否出错。
比如很多Windows的API就是这个类型。
Windows中很多API的返回值为0表示API调用成功,而返回值不为0表示在API调用的过程中出错了。
微软为不同的非零返回值定义了不同的意义,调用者可以根据这些返回值判断出错的原因。
这种方式最大的问题是使用不便,因为函数不能直接把计算结果通过返回值直接赋值给其他变量,同时也不能把这个函数计算的结果直接作为参数传递给其他函数。
当发生错误时设置一个全局变量。
此时可以在返回值中传递计算结果了。
这种方法比第一种方法使用起来更加方便,因为调用者可以直接把返回值赋值给其他变量或者作为参数传递给其他函数。
Windows的很多API运行出错之后,也会设置一个全局变量。
函数调用者可以通过调用函数GetLastError分析这个表示错误的全局变量从而得知出错的原因。
但这个方法有个问题:调用者很容易就会忘记去检查全局变量,因此在调用出错时忘记做相应的错误处理,从而留下安全隐患。
异常。
当函数运行出错时,程序就抛出一个异常。
程序员可以根据不同的出错原因定义不同的异常类型。
因此函数的调用者可以根据异常的类型就能知道出错的原因,从而可以做相应的处理。
另外,由于显式划分了程序正常运行的代码块(try模块)和处理异常的代码块(catch模块),代码的逻辑比较清晰。
异常在高级语言如C#中是强烈推荐的错误处理方式,但有些早期的语言比如C语言还不支持异常。
另外,当抛出异常时,程序的执行会打乱正常的顺序,对程序的性能有很大的影响。
上述三种错误处理的方式各有优缺点。
那么面试时应聘者该采用哪种方式呢这要看面试官的需求。
在听到面试官的题目之后,应聘者要尽快分析出可能存在哪些非法输入,并和面试官讨论该如何处理这些非法输入。
和面试官进行这样的讨论对应聘者是有益的,因为面试官会觉得他对错误处理有着全面的了解,并且还会觉得他有很好的沟通能力。
代码的鲁棒性鲁棒性是指程序能够判断输入是否合乎规范要求,并对不合要求的输入予以合理的处理。
容错性是鲁棒性的一个重要体现。
不鲁棒的软件在发生异常事件时,比如用户输入错误的用户名、试图打开的文件不存在或者网络不能连接,就会出现不可预见的诡异行为,或者干脆整个软件崩溃。
这样的软件对于用户而言,不亚于一场灾难。
由于鲁棒性对软件开发非常重要,面试官在招聘时对应聘者写出的代码是否鲁棒也非常关注。
提高代码的鲁棒性的有效途径是进行防御性编程。
防御性编程是一种编程习惯,是指预见在什么地方可能会出现问题,并为这些可能出现的问题制定处理方式。
在面试时,最简单也最实用的防御性编程就是在函数入口添加代码以验证用户输入是否符合要求。
通常面试要求的是写一两个函数,应聘者需要格外关注这些函数的输入参数。
如果输入的是一个指针,那指针是空指针怎么办如果输入的是一个字符串,那么字符串的内容为空怎么办如果应聘者能把这些问题都提前考虑到,并作相应的处理,那么面试官就会觉得他有防御性编程的习惯,能够写出鲁棒的软件。
当然并不是所有与鲁棒性相关的问题都只是检查输入的参数这么简单。
应聘者看到问题时,要多问几个“如果不……那么……”这样的问题。
比如面试题“链表中倒数第k个结点”,这里隐含着一个条件就是链表中结点的个数大于k。
应聘者就要问自己如果链表中的结点不是大于k个,那么代码会出什么问题这样的思考方式,能够帮助发现潜在的问题并提前解决问题。
这比事后让面试官发现问题之后应聘者再去慌忙分析代码查找问题的根源要好很多。
小结本文从规范性、完整性和鲁棒性三方面介绍了应聘者如何在面试时写出高质量代码(如下图所示)。
第一,应聘者在白纸或者白板上手写代码时要注意规范性,尽量清晰地书写每个字母,通过缩进和对齐括号让代码布局合理,同时还要合理命名代码中的变量和函数。
第二,应聘者最好在编码之前全面考虑所有可能的输入,确保写出的代码在完成了基本功能之外,还考虑了边界条件,并做好了错误处理。
只有全面考虑到这三方面的代码才是完整的代码。
第三,应聘者要重视代码的鲁棒性,确保自己写出的程序不会轻易崩溃。
平时在写代码时,应聘者最好养成防御式编程的习惯,在函数入口判断输入是否有效并对各种无效输入做好相应的处理。
应聘者如果能够做到这三点,自然就能写出高质量的代码,最终通过面试拿到Offer也将是水到渠成的事情。
作者何海涛,思科高级软件工程师,之前先后任职于Autodesk和微软。
主要关注C++/C#的开发技术,并对设计模式和项目管理也很感兴趣。
本文选自《程序员》杂志2012年01期,更多精彩内容敬请关注01期杂志《程序员》2012年杂志订阅送好礼活动火热进行中。