论防御式编程与攻击式编程

今天突然想到了这个话题。

那么,有一部分读者可能并不会很理解我的意思

防御式编程:客户提出什么问题,我们就解决什么问题。

攻击式编程:主动发现问题,其中有一部分问题是性能优化问题,一部分是客户未能发现的BUG。以尽快的方式解决问题。

  真实场景:一个功能被做出来了,开发人员于是试了一遍,觉得功能已经出来了,他心里面觉得松了口气,

可以暂时缓了一口气,然后这个功能的测试任务,被分配给了测试人员。

“叮叮叮,小李,过来一下,你这个功能怎么怎么的”。

有以下几种可能情况:

测试人员:   你这个样式在IE7下面有问题,IE7+没问题,所以。。。这算是一个BUG哦。。。

开发人员:我用的就是IE9啊,IE7..这个小问题,没关系吧?

测试人员:万一客户用到了IE7的话。。。。

开发人员:好吧,算是一个BUG,你提交吧。

正想离开。。。

测试人员:你这个功能的程序逻辑有问题,为什么这个功能所有人都可以使用。这个功能本来是给特定人群用的。

快去做权限 设置。

开发人员:糟糕,本来这里我是偷懒的,没想到测试人员这么仔细,看来权限还是要做控制为好。

测试人员:还有一个问题。。。XX你这里不合理,那里也不合理。

开发人员:恩。。恩。。。恩恩。。。。嗯嗯嗯、。。。。。。

最后计算了下,改BUG的时间是开发时间的3~4倍。

为什么会出现这么多BUG呢?

一方面,是自己编程的时候,考虑不周全,另一方面,是由于自己得过且过的心理,即使发现了BUG,也认为无关紧要。

自己不去改它,从而导致测试的时候出一堆BUG。

我们做一个程序,想过没有一个问题,在我们做完程序以后(第一遍),我们有没有能力把显性的或者隐性的问题都给挑出来,在测试人员测试以前,把问题都给扼杀在萌芽中,也许,我说的是一部分问题,能够尽力减轻测试人员的负担,以及我们修复BUG的时间。

  我在我们公司有一个防御式编程的经典例子中告诉你们:我们公司去年接到了一个1000万的项目,

具体什么项目我就不说了,我们做的所有功能,经过测试,是不兼容除了IE以外的所有浏览器的,也就是说,只有IE才可以使用,而项目的单位是一个信息化程度很低的地方。我跟项目经理提过这个问题,他就说,如果我改了IE的兼容性问题,他们是不是会提更多的问题?这句话其实也说得对,但是,我就想反问一句,如果你知道这个问题,为什么在做项目不考虑进去呢,非得要等到项目快做完了,大家才开始面对这些问题吗?

为什么不在问题凸显之前把问题解决掉?能优化的地方,难道要等到客户提了,我们才去解决吗?他不提,难道这个问题就不出现了吗?

什么是衡量一个号的程序员的标准?一句话:看他能把目前的项目所优化的程度的高低。

说直接一点,就是发现问题,解决问题(攻击式编程)。

好了,今天牢骚就发到这里,本人入行才1年,讲得不妥的地方,还请各位大神多多指出。

论防御式编程与攻击式编程,布布扣,bubuko.com

时间: 2024-08-03 07:11:47

论防御式编程与攻击式编程的相关文章

ReactiveCocoa -函数式编程和响应式编程

RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现. ReactiveCocoa试图解决什么问题 ReactiveCocoa试图解决以下3个问题: 传统iOS开发过程中,状态以及状态之间依赖过多的问题 传统MVC架构的问题:Controller比较复杂,可测试性差 提供统一的消息传递机制 统一消息传递机制 iOS开发中,每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过

(10)响应式宣言、响应式系统与响应式编程——响应式Spring的道法术器

本系列文章索引<响应式Spring的道法术器>前情提要 响应式编程 | 响应式流 1.5 响应式系统 1.5.1 响应式宣言 关注"响应式"的朋友不难搜索到关于"响应式宣言"的介绍,先上图: 这张图凝聚了许多大神的智慧和经验,见官网,中文版官网,如果你认可这个宣言的内容,还可以签下你的大名.虽然这些内容多概念而少实战,让人感觉是看教科书,但是字字千金,不时看一看都会有新的体会和收获. 这也是新时代男朋友的行为准则: Responsive,要及时响应,24

函数式编程与响应式编程

参考文章 函数式编程及响应式编程之己见_Java_Tycho's Blog-CSDN博客 RxJava系列1(简介) - 知乎 1.函数式编程是从编码实现的角度来说的,即通过编程语言中的方法(method)来实现数学中函数(function)概念.数学中函数的概念存在一个输入和一个输出,通过对输入进行一定的运算来获得一个输出,从而形成一一对应的关系.那么直接通过让方法拥有一个入参和一个返回值不就满足了吗?这样确实可以,但这只形成了一种模式下的一一对应关系,这唯一的模式即为定义方法时内部指定的逻辑

并发编程 18—— 显式的Conditon 对象

并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线程的服务 并发编程 09——

scala学习笔记-隐式转换与隐式参数(18)

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转

提高编程效率的C++编程箴言

对于单纯常量,最好以const对象或enums替换#defines 对于形似函数的宏,最好改用inline函数替换#define 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象.函数参数.函数返回类型.成员函数本体. 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复. 确定对象被使用前已经被初始化. 为内置型对象手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初始列,

隐式转换与隐式参数

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转

008.在C#中,显式接口VS隐式接口

原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (Aty表示本人) 介绍 什么是显式和隐式接口 什么时候需要显式接口 更简洁的方法(ISP:接口隔离原则) 显式接口更多 结论 介绍 文章将讨论下显式接口,讨论它们与隐式接口的区别,以及为什么应该避免使用. 什么是显式和隐式接口 C#中有两种方式来实现接口:显式和隐式 定义如下接口: 当我们隐式的实现该接

(46)LINUX应用编程和网络编程之一Linux应用编程框架

3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. (2)典型的嵌入式产品就是基于嵌入式linux操作系统来工作的.典型的嵌入式产品的研发过程就是:第一步让linux系统在硬件上跑起来(系统移植工作),第二步基于linux系统来开发应用程序实现产品功能. (3)基于linux去做应用编程,其实就是通过调用linux的[系统API]来实现应用需要完成