阅读更多

33顶
5踩

研发管理

翻译新闻 优秀的程序 vs. 糟糕的程序

2012-11-19 15:50 by 副主编 wangguo 评论(75) 有21173人浏览
开发者Rahul Singh近日在其个人博客中列出了他眼中的优秀的程序和糟糕的程序:

引用
优秀的程序可以使复杂的东西看起来很简单;糟糕的程序让原本简单的东西变得复杂。

优秀的程序不需要加以说明;糟糕的程序需要大量注释。

优秀的程序编写时需要更多时间,但未来花费的时间却更少;糟糕的程序往往花费较少的时间,但会在未来浪费掉更多时间。

优秀的程序需要考虑当前和未来的需求;糟糕的程序只侧重于现在,在未来可能无法正常工作。

优秀的程序非常易于维护;糟糕的程序难以维护。

优秀的程序有更长的生命周期,甚至应用范围超出预期;糟糕的程序在其工作范围之外几乎无法使用。

优秀的程序如同良好的习惯,其影响将持续很长一段时间,几乎可以永久地解决问题;糟糕的程序如同止痛药,其效果只有很短的时间,解决问题大多是暂时的。

优秀的程序是整洁的、遵守规律的;糟糕的程序是混乱的。

优秀的程序可以令人学到很多编程方法和经验;糟糕的程序只能令人越学越糟。

优秀的程序中,该重用的地方重用,该发明的地方发明;糟糕的程序会重新发明轮子,并在适合发明的地方重用。

优秀的程序依靠程序员的直觉和知识,并经过了多年良好程序习惯的熏陶;糟糕的程序往往盲目依赖他人的知识和经验,而没有自己的理解。

优秀的程序可以很容易地从一个程序员转移给另一个程序员;糟糕的程序只能被编写者理解和实施。

优秀的程序员不会刻意去记忆一段代码,他依赖于他的逻辑思维能力和理解,并能在未来轻松改善代码;糟糕的程序员往往会记住很多自己不理解的代码。

优秀的程序都有相同的特征,如简单、可读性强、效率高;糟糕的程序各有糟糕之处。

优秀的程序比程序员存在的时间要更久;糟糕的程序存在的时间很短。


英文原文:Good Programming, Bad Programming

相关阅读:优秀的开发者 vs. 差的开发者
33
5
评论 共 75 条 请登录后发表评论
15 楼 lipeixin 2012-11-20 10:57
这些比较 后面加上中国的国情,和那些老板的挣快钱的思想,就变成了中国式程序,
不能出了什么问题都去怪程序员,程序员容易吗,有问题要修改,出问题要背黑锅,
给个功能限期几天内完成,那些老板只管数票子,这个比较缺乏对各种环境下的说明,把微软的程序员拉到中国的公司里,也只能是变成各种ctrl+c,ctrl+v的组合了.
14 楼 if(i!=我){} 2012-11-20 10:45
laogao3232 写道
我现在在的项目里就有各种问题。
但是你仍然能看到刚开始时,这个项目是一个严谨的优秀的项目,但是09年走了一批优秀的人,然后来了新人直接就写代码,你就可以看到这个之后的代码有多么的糟烂。
现在项目组里也有这样的人,写的一个方法A,干的B的事,一个字符串C,其内容却是D。
这样的代码,就算加上注释也是难以理解的。至于其他的如设计,程序健壮性,异常处理等,你看了就只能深深的鄙视,有时间,结构便于修改的话,我还会改改。

不知道是否有人接触过遗留的烂项目,我接过一个,差点崩溃,名字都不对应,起名还有中英混合,简写不简写的。
至于几千行的超大类,超大方法,多层嵌套,对于后来人来说,噩梦啊。

我也遇见过这样的情况:代码中充斥着大量复制粘贴的东西,大量错误的注释,奇奇怪怪的逻辑——基本上是删之而后快!
13 楼 elektrobank 2012-11-20 10:40
if(i!=我){} 写道
Frankie199 写道
“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

恰恰相反


我非常认同“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

如果一段代码:
变量命名规范
方法名见名知意
方法粒度合适(功能专一、健壮)
格式化良好

我认为是不需要注释的,至少在方法内部是不需要注释的。除非读者的英语水平很差、或者没学过编程。



您说得内几点, 是个正常点的程序员都做得到. 注释的目的是让人家看懂整个过程中如何处理或实现复杂的业务逻辑.
12 楼 laogao3232 2012-11-20 09:57
我现在在的项目里就有各种问题。
但是你仍然能看到刚开始时,这个项目是一个严谨的优秀的项目,但是09年走了一批优秀的人,然后来了新人直接就写代码,你就可以看到这个之后的代码有多么的糟烂。
现在项目组里也有这样的人,写的一个方法A,干的B的事,一个字符串C,其内容却是D。
这样的代码,就算加上注释也是难以理解的。至于其他的如设计,程序健壮性,异常处理等,你看了就只能深深的鄙视,有时间,结构便于修改的话,我还会改改。

不知道是否有人接触过遗留的烂项目,我接过一个,差点崩溃,名字都不对应,起名还有中英混合,简写不简写的。
至于几千行的超大类,超大方法,多层嵌套,对于后来人来说,噩梦啊。
11 楼 H_eaven 2012-11-20 09:56
zhbf5156 写道
我觉得,这纯属无稽之谈,相信每个人都想写出优秀的程序,每一个功能点也许每个人都有一种算法来解决问题。如果有时间研究这种无聊的问题,倒不如花点经历在写程序上更有价值一些。



这个说的也没错,
而且如果是小众应用,或者是不经常改动的程序,其实可读性,清晰性没那么必要,可以追求些别的方面,但是像占程序开发中很大比重的业务系统的程序,需要多人协同开发,人员流动量也很大,改动也很频繁,如果不注重点可读性和清晰性,那么整天因为不是核心的问题,而是一些外围的问题就能把人给搞死了,
10 楼 zhbf5156 2012-11-20 09:51
skzr.org 写道
a414529949 写道
我只想问句 什么叫优秀的程序 ...

优秀的程序并不一定赚钱,糟糕的程序也不一定不赚钱

如果所有的开发人员目的都是只为赚钱,中国it技术不如国外就说得通了。
9 楼 zhbf5156 2012-11-20 09:41
我觉得,这纯属无稽之谈,相信每个人都想写出优秀的程序,每一个功能点也许每个人都有一种算法来解决问题。如果有时间研究这种无聊的问题,倒不如花点经历在写程序上更有价值一些。
8 楼 tracyqucy 2012-11-20 09:09
Frankie199 写道
“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

恰恰相反



建议去看看Refactoring , 如果一段代码还要靠注释来解释这段代码的含义的话,那么这段代码就有bad smell, 需要进行重构.

就像四楼说的,好的方法名,清晰的变量名,每个函数只做一件事情并且尽量控制每个函数的代码在5-10行,并且遵守DRY原则.这才是好的代码. 这样的代码基本是不需要注释来说明的.
7 楼 skzr.org 2012-11-20 08:50
a414529949 写道
我只想问句 什么叫优秀的程序 ...

优秀的程序并不一定赚钱,糟糕的程序也不一定不赚钱
6 楼 pangbuddy 2012-11-19 20:40
Frankie199 写道
“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

恰恰相反


好的程序是可以“自说明”的, 自然流畅, 注释未免多余。
5 楼 if(i!=我){} 2012-11-19 19:06
1. 无风不起浪

代码设计是否糟糕,从某些地方就可以看出来。比如:
a. 超大类或超大函数
b. 大片被注释的代码
c. 逻辑重复
d. If/else嵌套过深
4 楼 if(i!=我){} 2012-11-19 18:58
Frankie199 写道
“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

恰恰相反


我非常认同“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

如果一段代码:
变量命名规范
方法名见名知意
方法粒度合适(功能专一、健壮)
格式化良好

我认为是不需要注释的,至少在方法内部是不需要注释的。除非读者的英语水平很差、或者没学过编程。
3 楼 yidao620c 2012-11-19 17:22
a414529949 写道
我只想问句 什么叫优秀的程序 ...

简单、可读性强、效率高
2 楼 Frankie199 2012-11-19 17:06
“优秀的程序不需要加以说明;糟糕的程序需要大量注释。”

恰恰相反
1 楼 a414529949 2012-11-19 16:51
我只想问句 什么叫优秀的程序 ...

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JVM类装载器详解

    JVM类装载器详解

  • JVM类装载器机制

    加载:查找并加载类全限定名的二进制字节流,转为方法区数据结构(特殊的堆),在Java堆中生成对应的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 注意:对于数组类,情况就有所不同,数组类本身不...

  • java类验证和装载顺序_一张图看懂JVM之类装载系统

    原标题:一张图看懂JVM之类装载系统 导读在之前的文章中,我们通过一张图的方式(图????)整体上了解了JVM的结构,并重点讲解了JVM的内存结构、内存回收算法及回收器方面的知识。收到了不少读者朋友们的反馈和指正,在...

  • JVM类加载器(类装载子系统)

    加载:通过类的全限定名获取此类的字节流,将流代表的静态存储结构转化为方法区(作为一个内存区域,jdk1.7以前永久代,1.8之后元空间)的运行时数据结构,在内存中生成一个代表该类的java.lang.class对象,作为方法区这个类...

  • JVM之类装载子系统

    如果一个类是用户类加载器加载的,JVM会将类加载器的引用作为类的一部分信息保存在方法区当中,当解析一个类型到另一个类型引用的时候,JVM则必须保证两个类加载器是相同的。(动态链接) JVM中对类的使用分为主动和...

  • JVM系列之三:类装载器子系统

     虚拟机类装载器子系统:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。  类的加载指的是将类的.class文件中的二进制数据读入到...

  • JVM类加载器子系统

    JVM Class Loader SubSystem概述类加载的过程加载阶段(Loading)链接阶段(Linking)初始化阶段(Initialization)3种类加载器& 自定义加载器获取 ClassLoader的4种方式自定义类加载器(User Defined ClassLoader)双亲...

  • JVM学习笔记02-类加载器子系统

    1、类加载器子系统的作用 2、类加载器ClassLoader角色 3、类的加载过程 3.1、加载 3.2、链接 4、类加载器的分类 4.1、引导类加载器(Bootstrap ClassLoader) 4.2、扩展类加载器(Extension Class Loader) ...

  • JVM(二)类装载子系统

    类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。 加载的类信息存放于...

  • JVM—类加载子系统

    类加载器执行引擎在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式...

  • JVM类加载子系统

    类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。 加载的类信息存放于...

  • [JVM]超详细JVM系列文(1):整体结构+类加载子系统+运行时数据区—程序计数器、栈(多图长文)

    按照Java代码执行的流程,从类装载器子系统出发,剖析其各个子模块的结构与功能。结合Java语言中的相关设计思路(变量的初始化、存储;对象的生命周期、方法的调用)、OOP(继承、多态),在JVM进行追根溯源,解释其...

  • JVM一:类加载器子系统

    类加载器子系统(ClassLoader):将class字节码文件加载到JVM内存中,是否会执行该字节码文件由 执行引擎决定。 类加载器子系统(Class loader subSystem)只负责将class文件加载进内存中,并且类在仅需要时加载,...

  • 【JVM】VM是什么?JVM是什么?JVM作用是什么?JVM特点?JVM位置?JVM组成?

    1、类加载子系统类加载的角色?类加载的过程?① 加载 Loading② 链接 Linking③ 初始化 Initialization类什么时候初始化?类的初始化顺序?类加载器分类?双亲委派机制是什么?双亲委派的优点?类的主动使用/被动...

  • JVM第二章-类加载子系统

    类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载

  • JVM-类加载子系统

    System . out . println("你的大恩大德,我下辈子再报!");} }它的加载过程是怎么样的呢?...完成后调用 HelloLoader 类中的静态方法 main加载失败则抛出异常完整流程JVM严格来讲支持两种类型的类加载器。...

  • JVM总结之类加载子系统

    一个类的完整生命周期如下 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? 系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又...

  • JVM系列之类加载子系统

    1、类加载器与类的加载过程 1.1、类加载器 1.1.1、类加载器子系统的作用 负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识,魔术,CA FA BA BE Classloader只负责class文件的加载,...

  • 4. JVM-类加载子系统

    类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为...

  • 【JVM】类加载子系统

    一,内存结构 二,类加载器及类加载过程 三,类加载器的分类 四,ClassLoader的常用方法及获取方式 五,双亲委派机制 六,其他

Global site tag (gtag.js) - Google Analytics