“防呆”法在软件研发中的应用

引言

工业制造领域的很多思想和方法正在或已经被借鉴到软件开发行业,尤其是精益制造的思想和工具。笔者多年前就在关注软件研发领域的防错方法,即如何来避免软件Bug。今天结合一下工业领域的“防呆”思想和方法,来重新分析探讨一下软件研发领域的防错方法。

错误产生的原因

工业生产过程中的错误原因一般被归为设备原因、方法原因和人为原因三类。其中人为原因占到70%以上,主要包括:

  1. 新手错误:对作业过程和作业环境不熟悉,缺乏经验而产生的错误
  2. 标准错误:缺乏指导或工作标准而产生的错误
  3. 疏忽错误:作业者不小心、心不在焉产生的错误
  4. 迟钝错误:作业人员判断或决策过慢、行动迟缓导致的错误
  5. 识别错误:太快、太远、看不清楚作出错误判断
  6. 遗忘错误:当不重视或不集中精神时会忘记事情或某项操作
  7. 故意错误:出于某种原因,作业者故意造成错误

笔者认为,人为错误可以划分为不知、不在、不及和不为四个层次

“防呆”法在软件研发中的应用

人为错误的分层

传统防错方法

常规的防错思路还是以岗位实操培训、完善监督体系与绩效考核为主,简而言之就是“培训、监督、考核”,其中培训用来解决“不知”问题,监督主要解决“不在”、“不及”等问题,而考核主要解决“不为”的问题。但是,总体效果不尽如人意,因疏忽、遗忘、识别等主观因素导致的顽固性错误很难杜绝。

“防呆”法在软件研发中的应用

传统防错“三板斧”

“防呆”法

“防呆”法是指如何防止工作中犯错误的方法,原理是用一套设备或方法使作业者在作业时直接可以明显发现缺陷或使操作失误后不产生缺陷,以达到“一次性就把工作做对”的目标。

“防呆”法的哲学

疏忽、遗忘、反应不及等一些难以克服的人为错误,可能与人的惰性有关,尤其是人脑的惰性倾向有关,大脑总是喜欢能量消耗较小的行为,而且为了提升整体效率,也拒绝长时间高度专注于某一项事务。当我们不能完全克服人类这一缺点的时候,就要想办法去适应它,这应该就是“防呆”法的哲学。

“防呆”法在软件研发中的应用

大脑喜欢低能量消耗

“防呆”法的理念

  • 不需要经验和直觉,即使是新人或外行操作也不会出错
  • 不依赖高度注意力,即使出现人为疏忽也不会出错
  • 不需要专门的知识与技能,无论是谁在何处都不会出错
  • “防呆”法的原则

    “防呆”法在软件研发中的应用

    防呆法的原则

    “防呆”法的原理

    “防呆”法认为“不会出错”要胜于“不要出错”,主要有停止、防备和警报三类手段,和断根、保险、顺序、隔离、层别、复制、自动、相符、警告、缓和等更为具体的十大原理,通过各种防错装置和防错方法在源头上防止错误的发生。

    “防呆”法在软件研发中的应用

    防呆法的十大原理

    “防呆”法的运用

    “防呆”法并不完全排斥传统防错方法,两者结合运用,才是更好的防错之道。

    软件设计防错

    由于软件用户界面是直接面向最终用户的,所以防呆法在这个领域有很大的用武之地,网上也有很多探讨这方面的文章,这里不再赘述。

    “防呆”法在软件研发中的应用

    防呆在软件设计的应用

    软件开发防错

    软件开发过程也是人员密集活动,因而,也可以深入利用”防呆“法来避免错误。

    版本管理

    常见的代码版本管理工具,如Subversion、Git等,可以为每次代码修改保留记录,并支持回滚到某个历史版本,从而防止代码删除后,无法找回的尴尬和痛苦。有些开发工具,如IntelliJ IDEA,还会自动维护开发工具层级的本地修改历史,开发人员在代码版本管理上更加得心应手。版本管理可以说是很好地利用了“防呆”法里的缓和原理,为消除错误影响提供了很好的手段。

    集成式开发环境

    包括IntelliJ IDEA、Visual Studio、Eclipse等在内的集成式开发环境(IDE)提供了诸如拼写检查、语法检查、自动补齐、代码模板、自动生成代码、自动编译、宏、向导、重构、功能分区、静态检查等等很多便利的特性,充分应用了“防呆”法的自动、警告、层别、复制、顺序、保险、隔离等多种原理,可以避免很多人为错误。

    强类型检查

    像Java、C#等常用的面向对象语言,会在编译期提供类型检查机制,以防止类型误用错误遗留到代码运行期,是对”防呆“法相符原理的很好应用。

    类型封装

    为防止对私有成员的错误访问,面向对象开发语言通常会提供一套机制,利用访问修饰符或者属性设置器等,限制对类型私有成员或内部类型的访问,或者避免类型被继承,从而避免非法访问引起的问题,应用的就是“防呆”法的断根原理。

    函数式编程

    函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。函数式编程消除了变量和状态带来的副作用,断绝了由此产生Bug的可能,也体现了“防呆”法断根原理。

    测试驱动开发

    测试驱动开发(TDD)方法,一定程度上利用了“防呆”法的警告原理,可以尽早发现代码的逻辑缺失或错误。

    防御式编程

    防御式编程用于检查代码运行的先决和后置条件,借鉴了“防呆”法的断根、保险、顺序、相符、警告等原理,可以通过“快速失败”有效地防范深层次错误。

    完全分支

    编码时,可以利用“防呆”法的顺序原理,有意识地将if语句的所有分支都列出来,强迫自己考虑各种可能的情况,从而防止逻辑遗漏错误。

    复用

    通过对已证明有效组件的复用,而不是重复发明“轮子”,相当于利用了“防呆”法的复制原理,避免了重新创造过程可能带来的错误。

    减少代码

    代码越多,带来Bug的可能性更大,Bug不能从不存在的代码中产生。所以,要利用“防呆”法的断根原理,通过利用非代码解决方案、复用已验证代码、删除无用代码等方式来消除产生Bug的根源。

    真正理解代码

    “我们无法创造出我们不理解的东西,知道如何解决每一个已经解决的的问题”,这是已故物理学家理查德·费曼去世那天留在黑板上的话,被认为是智力的物理定律。编程也是一样,我们要真正理解我们的需求,真正理解我们的代码,才能创造出真正正确的软件。实践中,我们可以通过向别人讲述、结对编程等方式来澄清代码逻辑,利用“防呆”法的保险原理,为编写的代码加一道“保险”,防止个人思维误区引起的错误。

    常量写在前面

    判断变量和常量是否相等时,可以考虑使用“常量==变量”的写法,而不是“变量==常量”,从而可以利用“防呆”法的断根原理消除可能的运行时异常。当然,这种写法会影响代码的可读性,存在一定的争议。

    使用空对象模式

    空对象模式是一种设计模式,它通过为每种类型创建一个表示空的对象,并提供适当的默认行为,在需要返回空的时候总是返回空对象,而不是空,以消除空指针检查代码和避免空指针异常,体现了“防呆”法的断根原理。

    持续集成

    通过持续集成、每日构建和自动化测试等活动,可以先于生产环境更早发现软件错误。这其中也有“防呆”法自动、警告原理的“身影”。

    结束语

    “防呆”法强调“快速失败(尽早失败)”,而不是隐藏错误。软件研发过程还有需求、测试、部署、运维等其他需要人员参与的诸多活动,都可以引入“防呆”法来消除人为错误,如自动化、检查表和模板等,在这里就不再展开了。

    最后,希望“防呆”法能够在您的工作环境中起到作用。

    来源:尿床草

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2021年5月5日
    下一篇 2021年5月5日

    相关推荐