软件开发七宗罪

导读:一起来看看世界各地的程序员们所共有的致命通病,从软件开发的地狱中拯救自己。这七宗罪你有几条?

想成为一名优秀的软件开发人员需要很长时间的培训和实践。但是如果不遵循合适的原则,即便是再好的程序员也会成为失败的牺牲品。不经意间你就会养成一些可怕的坏习惯,它们可能会一而再再而三地出现,甚至对于经验最为丰富的程序员而言也是如此。我认为软件开发至少存在七宗罪。那么,就请看看欲望、暴食、贪婪、懒惰、愤怒、嫉妒和骄傲会为你的最新编程项目带来哪些意想不到的损失吧。

软件开发第一宗罪:欲望(过度设计)

现代编程语言趋向于不断增加更新的功能让其臻于成熟。程序员们一层一层地往上堆叠抽象的代码,用新设计的关键字和结构来增加代码的可读性和可重用性——只要你肯花时间去学习如何正确地使用它们。

与此同时,编程的原则在这些年里有所改变。今天,你可以饱览到成千上万的设计方案和模式,而且每几个月就会有人想出新的开发方案。此外,开发人员总是信誓旦旦地宣称这些开发方案会让你成为程序员中们眼中的佼佼者。

但是纸上谈兵往往不见得在实际操作中奏效,这个道理很简单,打个比方来说就是你可以去做某些事情但是并不意味着你应该去这么做。就像编程大师Joel Spolsky所说的,那些盲目迷恋自己工具的程序员们都不可避免地忽略了这一点,甚至于最简单的项目也可能葬送进开发的地狱。所以,必须抵制这种不可取的冲动,那么首先要做到的就是坚持你最初的设计方案。

软件开发第二宗罪:暴食(不进行重构)

没有比开发软件更令人可喜的事情了。一旦你有一个正在开发的产品,就会很容易受到开始筹划下一次迭代的引诱。新产品应该具备什么样的新特征呢?我们在第一轮实施的时候没有注意到哪些问题?

人们总是很容易忘记代码很少能在运行的时候保持最佳状态。然后,当新功能不断地累积直至几个轮回的发展之后,程序员们往往会倾向于复合过去发生的错误,这样就导致了一个臃肿、脆弱的代码基础,难以进行有效地维持。

所以,在添加新功能之前尽量克制自己,对现有代码的质量和可维护性进行评估。对于每一次新一轮的开发,都必须将代码重构列入预算范围之内。用户可能只会关心每一个版本的新功能,但是从长远来看,他们一定会更希望你保持产品的精炼性。

软件开发第三宗罪:贪婪(团队之间的竞争)

对于财富和权利的过度欲望——要不然如何解释程序员与自己同僚之间竞争的动机?当一个团队得到了其他团队泄露出来的电子邮件,就开始进行闭门会议和开发。接下来的事情你应该知道,这个团队编写了一个代码库,它已经超越了其他团队已经完成的编码库功能的一半以上。

开发团队很少会出于恶意来进行重复的工作,但是他们往往缺乏明确的目标和责任感。得到的结果则是多余、无力的代码库,更不要说预算的损失和之前付之一炬的努力。经营开发项目的首要任务之一应该是了解其他团队正在做什么,然后所有的团队都朝着一个共同的目标去努力。分享与共享应该成为开发人员的座右铭。

软件开发第四宗罪:懒惰(不验证输入)

基本编程容易犯的错误清单很长,但是没有验证输入这样的错误非常低级以至于不能不从别的角度来思考犯这类错误的原因。这个看似低级的错误仍旧出现在许多经验丰富的程序员编写的代码中,这一点十分令人费解。然而,很多普通的安全漏洞,从缓冲区泛滥成SQL注入攻击,却可以直接追溯到用户输入的代码没有进行正确格式验证这一点。

现代编程语言提供了许多工具来帮助程序员来避免类似情况的发生,但是他们必须对其使用得当。切记,一个JavaScript的Web表单验证输入可能很容易被在浏览器中禁用的JavaScript回避,或者干脆不使用浏览器进行访问。输入验证应该是你应用程序的核心部分,而不是在用户界面上煞费苦心。如果做不到这一点只能归咎于程序员的懒惰了。

程序开发第五宗罪:愤怒(不对你的代码进行注释)

对于你的同僚而言,有什么行为能比不对你的代码做出任何注释这种行为更具敌意?我自己写的我当然知道:精心编写的代码是它本身最好的文档资料。那么,你知道吗,其他人能看懂吗?其实这些你自认为值得骄傲的代码可能并非天衣无缝。

程序员们自己很可能很快就会遗忘他们现在所写的代码,但是这些代码将在他们离开以后继续存在很长一段时间。对于取代他们的程序员而言,要想搞清楚每一个代码真正代表什么是一件吃力不讨好的工作。鉴于此,在你编写程序的时候,行行好吧,多给他们留下一些暗示。

但是请记住,难以理解的注释或者注释过多都与不做任何注释的性质同样恶劣。类似于“这已经损坏”或者“不要碰这个”的注释对于任何人都没有什么帮助。也不要做多余的评论来解释简单的操作,比如变量初始化。代码就是其本身最好的文件材料,所以出现的注释评论应该尽可能解释原因和本质。

软件开发第六宗罪:嫉妒(不使用版本控制)

也许你有理由对于你的项目不推行版本控制。也许一开始你的项目很小。但是今天,功能强大并且高效的版本控制系统已经可以免费进行使用。服务供应商甚至可以对分布式项目提供价格低廉的托管代码服务。所以没有理由不在一开始就使用一个代码库,即便是再小的项目也是如此——除非,你无法容忍除了你以外的任何人实施代码变化。

软件开发第七宗罪:骄傲(不进行单元测试)

你往往会认为自己的编程工作相当出色,但是你又如何知道自己做的到底是否唯美无缺呢?有什么指标来对你的工作好坏进行衡量吗?

除非你已经在特定的测试环境下对你的代码进行了验证和测试,否则你就不能证明它能像广告中说的那样完美无瑕。但是太多的开发人员并不对他们的代码进行单元测试。他们声称花时间进行测试就没有时间推行新功能了。事实上,一些开发人员甚至不将质量测试写入他们项目的预算范围。

那么我又能说什么呢?只能期待他们在品尝失败的滋味之前将这股傲气抛之脑后。一旦存在缺陷的代码抵达客户手中的时候,再撤销它们就未免太迟了。在进行代码传输之前,进行越多的单元测试,就能在今后越多地避免不必要的损失。

原文链接:http://www.oschina.net/news/15961/seven-deadly-sins

转载于:https://www.cnblogs.com/mixer/archive/2011/03/02/2448583.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot:快速入门教程

什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简而言之,Spring Boot通过提供默认配…

loadruner11 socket脚本-10053错误

背景: socket 10053异常:软件主动放弃一个连接,原因是超时或协议错误。如果LR客户端报10053异常,说明LR在执行套接字操作时,发生通信超时、网络中断或其它异常,主动将Socket连接断开。也就是说:10053异常是…

万网独享主机Apache为Ecshop商城添加404页面详解

在博客园基本都是做看客的角色,自己基本都没写过文章,不过昨天的经历确实让我有想法了,因为在网络上面看了很多文章,每篇写的都相对较片面,对于我这个Linux新手来说不免有点分不清东南西北,一不小心就浪费了…

移动微技(Mobile Widget)应用开发权威指南

移动微技(Mobile Widget)应用开发权威指南 基本信息 作者: 程宝平 杨晓华 朱春梅 丛书名: 中国移动创新系列丛书 出版社:电子工业出版社 ISBN:9787121104527 上架时间:2010-4-19 出版日…

[转载]Informix Dynamic Server维护手册

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/06/1972733.html

Java反编译器Java Decompiler

Java Decompiler不仅为Windows、Linux、OSX系统提供GUI程序JD-GUI,而且还提供了Eclipse插件JD-Eclipse,官方网站:http://java.decompiler.free.fr/转载于:https://www.cnblogs.com/heroking2000/archive/2009/10/12/1582120.html

alternatives命令使用方法

alternatives命令使用方法 alternatives是Linux下的一个功能强大的命令。仅仅能在root权限下运行。如系统中有几个命令功能十分相似,却又不能任意删除,那么能够用 alternatives 来指定一个全局的设置。alternatives经常使用于同一个系统中安装同一软件的…

linux下挂接fat32分区

作者: Eulogize 出自: http://www.linuxdiyf.com Coolinux 在/mnt 下新建一个文件夹,命名可以随意,如D等。然落伍入终端输出上面的饬令#mount -t vfat -o codepage936 iocharsetgb2312 /hdv/hdX /mnt/dX在LINUX下的实体名,如Chda1版权声明…

Apache、Nginx、Tomcat的区别

Apache、Nginx、Tomcat的区别NginxTomcatApache,Nginx与Tomcat的区别Nginx -----是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。** Tomcat -----servlet(jsp)应用服务器 Tomcat是运行在JVM中的一个进程。它定义为“中间件”…

python中通过元类(TYPE)简单实现对象关系映射(ORM)

ORM是创建一个实例对象,用创建他的类名当做数据表名,用创建他的类属性对应数据表的字段,不需要在自己写复杂的sql语句,而是通过对实例对象的操作时,能让代码自动帮我们整理为对应的sql语句。 class User(父类):uid (&…

ORA-12519: TNS:no appropriate service handler found 解决

selectcount(*) fromv$process --当前的连接数selectvalue fromv$parameter wherename processes--数据库允许的最大连接数修改最大连接数:altersystem setprocesses 300scope spfile;重启数据库:shutdownimmediate;startup;--查看当前有哪些用户正在使用数据SELECTosuser, a.u…

Linux下Web效力器架设攻略-1

来日诰日我们来看看怎样将Web效力器架在Linux零碎下。    LINUX零碎中罕见的有:CERN、NCSA、Apache三种体式格式,浅显最常用的要领就是用Apache。此种体式格式特点分明,设置装备部署简明,具有最大的对零碎兼容性,以…

Codeforces 1188A 构造

题意:给你一颗树,树的边权都是偶数,并且边权各不相同。你可以选择树的两个叶子结点,并且把两个叶子结点之间的路径加上一个值(可以为负数),问是否可以通过这种操作构造出这颗树?如果…

iOS- 关于AVAudioSession的使用——后台播放音乐

1.前言   •AVAudioSession是一个单例,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用•针对不同的音频应用场景,需要设置不同的音频会话分类1.1AVAudioSession的类别   •AVAudioSessionCategoryAmbient–混音播放&…

检索

【摘抄】基于线性表的检索一、检索的基本概念和算法分类1、检索概念: 可以形式化地定义基于关键码的检索。假定k1、k2…kn是互不相同的关键码值,有一个包含n条记录的集合C,形式如下: (k1, R1),(k2, R2),…

ajax请求后无法实现指定页面跳转或带参数跳转

问题:我们通过Ajax在前端对Controller的接口进行请求,处理完成后,无法通过Controller的return方法返回指定的页面。 原因:ajax只是局部刷新,所以不能在后台接口直接进行页面的跳转,我们可以在ajax的succes…

例说C#深拷贝与浅拷贝

一开始,先对C#深拷贝与浅拷贝知识做个简单的总结。 无论是浅拷贝与深拷贝,C#都将源对象中的所有字段复制到新的对象中。不过,对于值类型字段,引用类型字段以及字符串类型字段的处理,两种拷贝方式存在一定的区别&#x…

c++程序的多文件组织

当程序规模变大后,一个程序用多个文件组织,便于组织生产。这样,不必每次都重复对所有代码进行编译,而只需编译一次即可。把编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。 C…

strconv---用来基本类型之间的转换

strconv---用来基本类型之间的转换字符串转int:Atoi(s string)(i int,err error)int转字符串: Itoa(i int)stringstring转换为对应TP类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为string转其它类型可能会失败,所以这些函数…

企业架构 - 开篇:TOGAF介绍

在《年度总结和计划:去年4个1,今年5个1》中说过今年我准备在项目组引入一个架构方TOGAF。工业和信息化部副部长杨学山在一次内部座谈时提到:与西方发达国家比,国内的信息化建设在硬件方面已经不相上下,在软件方面有5年…