阅读更多
引用
软件设计有两种方法:一种是尽可能地简单,这种设计明显没有什么缺陷;另一种是尽可能地复杂,这种设计没有明显的缺陷。
——C.A.R. Hoare,1980年图灵奖讲座

在开发过程中,我的口头禅是: Your code may be elegant, by mine works。我为此而常常受到质疑,也有人反驳我“你不会使用最优方法!”“你在逃避测试!” 为了避免一次又一次地重复解释,我决定阐述下我的观点,仁者见仁,智者见智。

首先,我认为“项目可能会延期,但是代码会更好或更容易维护或更简洁”这句话是有问题的。项目延期,就是未完成,不应该用代码质量会更高作为借口。如果客户要在圣诞节进行推广活动,但你在12月29号才完成项目,即使提供了史上最好的产品,也是毫无价值的。

其次,我们来谈谈“最优方法”这个问题,“最优”是否意味着要写出更易于维护的代码需要更长的时间呢?其实除了大家都知道的《101个最优方法》以外,“最优”的标准是各种各样的。无论你对其进行怎样的定义,“最优方法”对所有程序员来说,应该是一种自然的编程标准。举个最简单的例子,经验丰富的程序员会自然地将变量命名为:$a、$b、 $c等,也能正确地缩进代码行。说得再深入一点,有经验的开发者知道在什么时候、如何提高效率以使得项目能如期完成。虽然 “最优方法”的标准有很多,但这些标准不会令你因此而延长项目时间。这引出我将谈到的下一点——Over-engineering(过度设计,指设计出来的系统比恰到好处要复杂臃肿的多,过度的封装、一堆继承、接口和无用的方法,以及超复杂的xml配置文件)。

像任何经验丰富的程序员一样,我了解那种想为每个项目搭建最好、最灵活、最耐用的系统的心态。但我也了解每个项目都有的商业限制:时间和资金。大多数项目都有明确的截止日期和项目预算,开发者要有意识地去控制项目规模以按时达到目标。你没有任何理由花一周时间,来为一个20行的table表上的数据库查询设置“恰当的”缓存层。多了解实用案例,如果只是为了实现一个页面访客计数器的功能而构建支持多种同时响应请求的XHR框架,是不现实的。要有眼界,这是我最强调的一点,最好的程序员不是精通如何构建最棒的系统的人,而是了解系统不需要的是哪些功能的人。

另外,在软件开发领域,上市时间是商业驱动力,在web应用开发领域,由于其动态性,这点更为明显。当时间成为关键,“最优方法”就是最简单的解决方案。

最后,我们来讨论一下技术债务(指为了匆忙实现一个功能,破坏了现有的程序库,在实现的过程中污染了代码库的设计)。如果在开发过程中,你在某个地方偷工减料了,那么就会产生无法解决的长期存在的技术债务,而且在之后的开发中,任何一个决定,都会受该债务的影响。事实上,在接手商业项目时,明白何时、如何对代码进行简化的能力是很关键的,这也是区分老手和菜鸟的标准。解决技术债务的办法有很多,但应尽量做到不产生技术债务。同样地,过度设计也不可避免地会产生技术债务。

通常人们在谈到技术债务的危险时,并没有包含商业影响。但其实技术债务与实际投资回报率是相对的,因为在许多情况下,早日上市更具成本效益。也有种情况是技术债务与收益同时存在,那么你可以慢慢偿还债务,但这会延长你的项目时间,很可能当你解决完技术债务时,你也失去了市场机会。

作为软件开发者,我们常常认为自己的工作就是开发软件,但其实这只是一种手段,我们的目的是令开发商达到他们的商业目标,你的代码也许很优雅很简洁,但如果不能达到目的,就丝毫没有意义。

英文原文:Your Code May Be Elegant
4
14
评论 共 31 条 请登录后发表评论
31 楼 pankanghe 2012-03-21 22:48
哈哈。 就一句英语大家聊的这么尽兴。。
太欢乐了
30 楼 youarestupid 2012-03-21 09:01
rubynroll 写道
youarestupid 写道
hardPass 写道


看来英语差的tx也不只我一个。我还以为就我一个看不懂的呢。原来你也不懂。
都是稀里糊涂的装明白。说白了都是不懂装懂。

Your code may be elegant, by mine works . 这句话从语法、语义上、习惯用语上能讲通?

作者应该写错单词了,作者可能想这样写:
Your code may be elegant, but mine works.(你的代码可能很优雅,但是我的代码能工作)
也可能是西方人习惯这样把by当做but来用。

西方人的日常用语,没出过待过的东方人是很难“融会贯通”的,比如美国人口语聊天中,经常把“because ”省略说成是“cause”,写得时候也经常是u=you,4=for……等等,没在西方国家实际待过两三年的中国人,是不可能把英文“融会贯通”的,所以翻译英文文章词不达意,是很平常的事。

另外,很多国内的程序员朋友,对*uix操作系统的命令行非常着迷,达到了不容许别人有丝毫质疑声的地步,但是我看到很多西方人都对命令行感到很头疼,因为他们都不想去记那些简写的*uix命令和参数,但是很多中国人对命令行命令和参数却乐此不彼。

我想说的是,你先把英文掌握地比西方人还娴熟以后,再来吹嘘你的命令行吧,如果你连几个美国口语都弄不清楚,却在琢磨unix中的creat是简写还是全写,那么你纯粹是在自找麻烦,自我摧残。


实在看不下去了...错别字就是错别字,说什么“也可能是西方人习惯这样把by当做but来用。”

还举八杆子打不着的例子来说明什么?

为了说明,憋屈在国内的众多程序员,本身就对西方人的英文只了解点皮毛,却整天到处宣传命令行下工作多么多么的舒服,这种自欺欺人的做法令人作呕。
29 楼 rubynroll 2012-03-21 06:07
youarestupid 写道
hardPass 写道


看来英语差的tx也不只我一个。我还以为就我一个看不懂的呢。原来你也不懂。
都是稀里糊涂的装明白。说白了都是不懂装懂。

Your code may be elegant, by mine works . 这句话从语法、语义上、习惯用语上能讲通?

作者应该写错单词了,作者可能想这样写:
Your code may be elegant, but mine works.(你的代码可能很优雅,但是我的代码能工作)
也可能是西方人习惯这样把by当做but来用。

西方人的日常用语,没出过待过的东方人是很难“融会贯通”的,比如美国人口语聊天中,经常把“because ”省略说成是“cause”,写得时候也经常是u=you,4=for……等等,没在西方国家实际待过两三年的中国人,是不可能把英文“融会贯通”的,所以翻译英文文章词不达意,是很平常的事。

另外,很多国内的程序员朋友,对*uix操作系统的命令行非常着迷,达到了不容许别人有丝毫质疑声的地步,但是我看到很多西方人都对命令行感到很头疼,因为他们都不想去记那些简写的*uix命令和参数,但是很多中国人对命令行命令和参数却乐此不彼。

我想说的是,你先把英文掌握地比西方人还娴熟以后,再来吹嘘你的命令行吧,如果你连几个美国口语都弄不清楚,却在琢磨unix中的creat是简写还是全写,那么你纯粹是在自找麻烦,自我摧残。


实在看不下去了...错别字就是错别字,说什么“也可能是西方人习惯这样把by当做but来用。”

还举八杆子打不着的例子来说明什么?
28 楼 xxxcomcn 2012-03-20 22:23
学习了哦
27 楼 smilerain 2012-03-20 21:59
严重鄙视这种观点,优雅的代码最终目地是什么,就是为了达到很好的重用,从而提高开发效率,尽快的达到目地。什么也不干就想一步达到目的,就如同空中楼阁。
26 楼 pengfeng 2012-03-20 18:12
对于有丰富经验的开发或设计人员需要掌握的是一个“度”,对于没有什么经验的技术水平一般的开发或设计人员来说需要的就是提高,只有满足这两个条件才能满足作者所述
25 楼 youarestupid 2012-03-20 17:19
hardPass 写道
丶枫肆 写道
hardPass 写道
winminy2011 写道
hardPass 写道
英语太差,没看懂  :Your code may be elegant, by mine works
哪个帮我解释下,最好能分析下句子结构

你的代码是很优雅,但是我的可以工作(你的好看,我的有用。。。。。)。

by 是介词还是连词?by还能这么用?
代表英语差的tx问一下。

英语学久天然呆?


看来英语差的tx也不只我一个。我还以为就我一个看不懂的呢。原来你也不懂。
都是稀里糊涂的装明白。说白了都是不懂装懂。

Your code may be elegant, by mine works . 这句话从语法、语义上、习惯用语上能讲通?

作者应该写错单词了,作者可能想这样写:
Your code may be elegant, but mine works.(你的代码可能很优雅,但是我的代码能工作)
也可能是西方人习惯这样把by当做but来用。

西方人的日常用语,没出过待过的东方人是很难“融会贯通”的,比如美国人口语聊天中,经常把“because ”省略说成是“cause”,写得时候也经常是u=you,4=for……等等,没在西方国家实际待过两三年的中国人,是不可能把英文“融会贯通”的,所以翻译英文文章词不达意,是很平常的事。

另外,很多国内的程序员朋友,对*uix操作系统的命令行非常着迷,达到了不容许别人有丝毫质疑声的地步,但是我看到很多西方人都对命令行感到很头疼,因为他们都不想去记那些简写的*uix命令和参数,但是很多中国人对命令行命令和参数却乐此不彼。

我想说的是,你先把英文掌握地比西方人还娴熟以后,再来吹嘘你的命令行吧,如果你连几个美国口语都弄不清楚,却在琢磨unix中的creat是简写还是全写,那么你纯粹是在自找麻烦,自我摧残。
24 楼 witcheryne 2012-03-20 11:36
comsci 写道
代码最终是给机器用的,不是给人看的。。。


通篇传达的观点是:
引用
你的代码也许很优雅很简洁,但如果不能达到目的,就丝毫没有意义


按照你的理论,我们都应该直接使用:

010101010101010111110000
23 楼 comsci 2012-03-20 11:03
代码最终是给机器用的,不是给人看的。。。
22 楼 白粥若水 2012-03-20 10:35
正确性和实用性才是软件的第一要求,如果不能保证这些,代码再优雅又怎么样?
21 楼 accphc 2012-03-20 09:52
能掌握“度”的人才是老鸟和菜鸟的区别。
所谓的“简单”设计其实并不简单!
20 楼 nkhanxh 2012-03-20 09:52
hanshifei 写道
高质量代码与按期完成项目不矛盾
相反,随着项目的推进,高质量代码形成的良性循环会大幅度提高交付效率。
为了保证交付目标,降低或忽略代码质量,这种做法得不偿失。

理论上学习明白了所有知识,知道怎么做才是对的会对以后的人生形成良性循环。
但是...有多少人是搞清楚了所有事情才从学校离开?
19 楼 hardPass 2012-03-20 09:28
丶枫肆 写道
hardPass 写道
winminy2011 写道
hardPass 写道
英语太差,没看懂  :Your code may be elegant, by mine works
哪个帮我解释下,最好能分析下句子结构

你的代码是很优雅,但是我的可以工作(你的好看,我的有用。。。。。)。

by 是介词还是连词?by还能这么用?
代表英语差的tx问一下。

英语学久天然呆?


看来英语差的tx也不只我一个。我还以为就我一个看不懂的呢。原来你也不懂。
都是稀里糊涂的装明白。说白了都是不懂装懂。

Your code may be elegant, by mine works . 这句话从语法、语义上、习惯用语上能讲通?
18 楼 H_eaven 2012-03-20 09:13
如果我是一个代码编写者,我将全力编写出我所认为最优的代码;
如果我是一个项目管理者,我将全力控制项目所达到的最终的目标;

我不会用A眼光去做B的事情,
同样也不会用B的眼光去做A的事情。
17 楼 jinnianshilongnian 2012-03-20 08:13
vivaxiaohua 写道
的确是这样,不过这个“度”是很难掌握的。


引用
这也是区分老手和菜鸟的标准


,是的
16 楼 丶枫肆 2012-03-20 08:08
hardPass 写道
winminy2011 写道
hardPass 写道
英语太差,没看懂  :Your code may be elegant, by mine works
哪个帮我解释下,最好能分析下句子结构

你的代码是很优雅,但是我的可以工作(你的好看,我的有用。。。。。)。

by 是介词还是连词?by还能这么用?
代表英语差的tx问一下。

英语学久天然呆?
15 楼 vivaxiaohua 2012-03-19 22:01
的确是这样,不过这个“度”是很难掌握的。
14 楼 hanshifei 2012-03-19 21:45
高质量代码与按期完成项目不矛盾
相反,随着项目的推进,高质量代码形成的良性循环会大幅度提高交付效率。
为了保证交付目标,降低或忽略代码质量,这种做法得不偿失。
13 楼 hardPass 2012-03-19 21:34
winminy2011 写道
hardPass 写道
英语太差,没看懂  :Your code may be elegant, by mine works
哪个帮我解释下,最好能分析下句子结构

你的代码是很优雅,但是我的可以工作(你的好看,我的有用。。。。。)。

by 是介词还是连词?by还能这么用?
代表英语差的tx问一下。
12 楼 jojo_java 2012-03-19 20:54
哼哼哈嘿

发表评论

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

相关推荐

  • MySQL安装配置教程(超级详细、保姆级)

    一、 下载MySQL Mysql官网下载地址https://downloads.mysql.com/archives/installer/ 1. 选择想要安装的版本,本篇文章选择的是5.7.31版本,下面的那个文件,点击Download下载 二、 安装MySQL 1. 选择设置类型 ...

  • 2024 年 MySQL 8.0 安装 配置 教程 最简易(保姆级)

    首先去官网下一个MySQL MySQL :: Download MySQL Installer 这里没有看到64位的安装包, 不要着急, 这只是一个安装器, 安装包里有64位的MySQL Server8.0 这时候如果直接安装你会发现: 默认装到 C:\Program ...

  • MySql-8.0.26安装详细教程(保姆级)

    MySql-8.0.26安装详细教程保姆级下载安装包安装配置配置环境变量 下载安装包 下载安装包: 下载网址: https://dev.mysql.com/downloads/ 选择这个 进入后选择 直接下载第一个 点击这里,开始下载 安装配置 解压...

  • mysql8.0.25安装配置教程(windows 64位)最详细

    官网下载MySQL2.配置初始化文件my.ini3.初始化MySQL4.安装mysql服务并启动+修改密码5.配置环境变量6.部分疑难杂病7.使用连接工具连接mysql 1.官网下载MySQL 下载Mysql点击下载mysql. 下载完成后解压到某一个文件夹...

  • mysql安装教程【安装版】

    mysql安装教程【安装版】

  • mysql数据库安装(详细)

    安装MySQL MySQL是目前最为流行的开放源码的数据库,是完全网络化的跨平台的关系型数据库系统,它是由瑞典MySQLAB公司开发,目前属于Oracle公司。任何人都能从Internet下载MySQL软件,而无需支付任费用,并且“开放...

  • MySQL 5.7详细下载安装配置教程

    MySQL5.7下载安装过程(详细步骤),包含设置密码、修改密码过程介绍。

  • MySQL数据库下载及安装教程(最最新版)

    MYSQL数据库下载和安装教程

  • Docker安装MySQL

    默认的鉴权方式,我们修改为mysql_native_password,不然的话连接会报错。虽然 docker 安装 mysql 不是一个很好的方案,但是为了个人使用方便,使用 docker 安装 mysql 还是没什么问题的。所以,我们在安装之前需要...

  • MySQL 5.7 安装教程(全步骤图解教程)

    在项目中使用到了MySQL数据库,在安装时踩了很多坑。本文用于记录MySQL安装的全过程。 在项目中使用MySQL数据库+Navicat数据库管理工具。 0、系统环境 系统版本:Windows 10 教育版 版本号:21H2 MySQL版本:...

  • MySQL 5.7.27详细下载安装配置教程

    本文详细介绍了Win 10下MySQL 5.7.27的安装及配置步骤,也列举出了一些常见的问题及解决方案

  • Linux 安装Mysql 详细教程(图文教程)

    Linux 阿里云 安装Mysql 详细教程,XShell免费版(解决官网打不开的问题)

  • MySQL详细学习教程(建议收藏)

    目录1、初识数据库1.1、什么是数据库1.2、数据库分类1.3、相关概念1.4、MySQL及其安装1.5、基本命令2、操作数据库2.1、操作数据库2.2、数据库的列类型2.3、数据库的字段属性2.4、创建数据库表2.5、数据库存储引擎2.6...

  • MySQL 8.0.19安装教程(windows 64位)

    话不多说直接开干 ...4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

  • MySQL修改root用户密码

    知道密码 在清楚的知道密码的情况之下可以使用以下几种方式修改MySQL的密码。 方式一 登录mysql

  • Mysql超详细安装配置教程(保姆级)

    有mysql官方的mysql workbench,有DataGrip,还有navicat等等。这个工具官方下载是会收费的,免费版本可以关注下面的公众号,输入navicat进行领取。安装好之后,在桌面右键点击我的电脑(有些是此电脑),然后点击属性...

  • Linux安装MySQL5.7

    下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar ...mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql ...

  • MySQL下载与安装

    MySQL下载与安装 一、下载 地址:https://dev.mysql.com/downloads/mysql/ 当前最新是8.0版本,我选择上一个最新的mysql-5.7.24-winx64.zip 二、安装 MySQL安装文件分两种 .msi和.zip ,.msi需要安装 zip格式...

  • Windows安装mysql详细步骤(通俗易懂,简单上手)

    前期在windows电脑尝试安装mysql,经历诸多不顺,特把安装详细步骤以及遇见的问题记录下来,提供给有需者使用。配置过程主要分为五个步骤,如下所示: (1)确认本地是否安装mysql (2)下载mysql安装包 (3)添加...

  • Ubuntu22.04 在线安装 MySQL8

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'lihaozhe'; ALTER USER 'root'@'localhost' IDENTIFIED ...update mysql.user set host = '%',plugin='mysql_native_password' where user='root'; flush privileges;

Global site tag (gtag.js) - Google Analytics