原文作者:Jeff Atwood
原文链接:The Best Code is No Code At All
译者:welovecs
无(代)码胜有(代)码
Rich Skrenta在 代码是我们的敌人 一文中写到:
代码时常令我们头疼。它会慢慢腐化,它需要不断定期维护,它有无穷尽的bug亟待发现。当新的特性出现,我们又要为旧的代码量体裁衣。我们编写的代码越冗长,bug的藏身之处就越多。代码的语法检查或编译的时间愈长,公司里的新来的员工,弄明白我们编写的系统所花费的时间就愈长。聪明的你可能想到了代码重构,可问题在于:需要的重构的代码就像长江后浪推前浪一样,向我们涌来。
代码是软件工程师智慧的结晶,更多的代码需要更多的工程师。然而,工程师之间沟通的成本正比于工程师数量的平方。将新的代码加入已有系统,虽然扩展了系统的功能,但同时也使得生产成本大大增加。我们应当"不择手段"地提高程序员个体的生产力,使他们写出具有很好表达力的代码。用更短的代码,实现同样(更多)的功能;用更少的工程师,构建同样的系统;用更小的沟通成本,完成同样的项目--应成为我们孜孜以求的目标。
Rich虽言代码之坏,但其"醉翁之意"并不在代码。软件工程师在代码编辑器中写出的代码,就像新生的可爱宝宝,是无辜的,无可责备的。事实上,代码并不是我们的敌人。你想知道真正的敌人是谁吗?不妨去照照镜子。你看到了什么?你自己,对了,这就是问题所在。
作为一名软件开发者,我们最大的敌人不是别人,而是自己。
我们越早认识到这一点,我们成长的步伐就越快。
我知道,就算你写出了冗余代码,但你的本意是好的,大家都一样。我们是软件开发者,我们热爱编程。我们从来不会遇到无法用管道胶带 (duct tape) [1]、临时衣架 (jury-rigged coat hanger)或是一小撮代码(a pinch of code)[2]解决的问题。但是,Wil Shipley却持另一种观点:软件工程师,应当控制"编写更多的代码"这样一种自然倾向。
对于一个程序员而言,编码工作的本质就是:我们在编码的过程中,做出的每一个决定,都是权衡、折衷的结果。一个大师级的程序员,能够看清这种权衡折衷后做出的决定的本质所在; 而且能够意识到,在我们写的每一行代码中,都有他们的影子。
在编码过程中,我们可以从许多方面来评估代码的质量:
- 简洁性
- 特性丰富
- 执行速度
- 编码耗时
- 健壮性(鲁棒性)
- 灵活性
请注意,这些方面是相互矛盾的。举例来说,你花了三天时间写出一个非常漂亮且高效的子程序,可以说,你将上述六个方面中的两个做的很好。但是,你花了三天的时间,所以"编码耗时"这方面,就无法兼顾。
那么问题出来了:哪些方面值得我们花费经历去做好?我们该如何做出选择?一个明智、简单且富有创新性的答案是:编码初期注重简洁性,随后根据测试的需求去做好其他方面。
Wil Shipley所言极是。在Code Smaller一文中,我曾给出类似的建议。我并不是在说:我们应当绞尽脑汁,用尽书中的技巧,来减小代码的体积。我想说的是:一个切实可行且通俗易懂的策略。通过实施此策略,我们得以减少程序员个体理解程序运行机制所需阅读代码的规模。下面是一个我将要讨论的一个小例子:
if (s == String.Empty)
if (s == "")
在我看来,后一行代码显然更佳,仅仅因为它更为简洁。说到这里,我敢保证一定有开发者对我的说法持反对意见,更甚者会和我争论到底。因为这些他们完全相信冗长的String.Empty,从某种程度上来说,是编译器友好的。
对于大多数软件开发者来说,承认这一点是痛苦的。因为他们深爱编程,但是,正如这篇文章的题目所言:无码胜有码。我们打算写出的每行代码,在写出来后,都要经过调试,都要被其他开发者阅读,都要提供对它们的维护与支持。所以,每次写新的代码时,就算有一百个不情愿,就算感到被人强迫,也请你把代码写的简洁一些。你别无选择,因为越是冗长的代码,越有可能成你的敌人。我们无法做到"Write no code",但是我们至少可以在编码初期就注重代码的简洁性。
如果你真正热爱编程,那么我敢肯定,你也会喜欢上简洁的代码。
------------------------
译者注:
[1] "Perl is the duct tape of the Internet." - Hassan Schroeder, Sun's first webmaster.
"Perl是互联网的管道胶带。" - Hassan Schroeder
[2] 不知道是什么意思- -,望知道的朋友告知我,谢谢。
添加评论
分享到:
相关推荐
第一代以荷兰鹿特丹港ECT码头为代表,第二代以德国汉堡港CTA码头为标志,而第三代则是荷兰鹿特丹港EURO-MAX码头。经过不断的技术实践和升级,新一代自动化码头在中国崭露头角,如青岛前湾港和上海洋山四期码头。这些...
虽然软件名称叫爬虫采集器,但是只是WPX.NEWS工具集中的一个功能点,该WPX.NEWS工具集中现在有两个功能点: 1、密码管理器 2、爬虫采集器 运行环境支撑:JDK1.8+ 运行命令:java -jar monitor.jar ===========...
WCDMA/UMTS之所以能在激烈的3G制式竞争中胜出,得益于其在标准、技术和实施方面的显著优势: 1. **标准与前景**:WCDMA遵循3GPP规范,是全球最广泛接受的3G标准。该技术标准成熟完善,已有商用网络在日本和欧洲等地...
地 址:东莞市南城胜和鸭仔塘东一巷23号 邮 编: 523000 电 话:0769-2485862 2723100 2311865 传 真: 0769-2485862 联系人: 蒋 相 国 李春庚 手 机: 13925855720 电 邮: tczdh@sohu....
最初的压岁钱并非流通货币,而是作为饰品的厌胜钱,上面铸有吉祥语和各种图案,如“千秋万岁”、“天下太平”等,用于祈求平安。到了唐代,宫廷中流行春日散钱,而宋元以后,这一习俗逐渐演变成在春节期间长辈给予...
同时,由于考虑了比特的联合可靠性,对于复杂编码结构如低密度奇偶校验码(LDPC)或涡轮码等,可能会有更高效的解码性能。 总的来说,这项发明是编码理论和信息论在实际应用中的一个重要进展,对于提高通信系统的...
---- 当 然 要 写 一 个 实 用 的 屏 幕 拷 贝 程 序, 光 靠 上 述 代 码 是 不 够 的, 下 面 讲 一 下 主 要 的 编 程 思 路: ---- 1. 全 屏 幕 拷 贝 的 实 现 ---- 首 先 隐 藏 拷 屏 程 序, 延 长 一 定...
- 激励相容:指设计的机制能够使个体在追求个人利益的同时,无意识中促进集体或整体利益。 中图分类号TP393涉及计算机网络,而TP301.6则与计算机软件与理论相关。文献标志码A表示该文献为原创性研究论文,文章编号...
此协议一切解释权归胜易网络投票软件开发中心所有。 9、增加帮助文件使用。我们从我们这几年走来考虑到我们的用户都是不太了解我们软件的用户,所以我门制作了此帮助文件。 10、验证码模块:分为两种模式,根据...
3. 二元一次方程组:第3题要求找出满足方程组的解,这是对二元一次方程组解法的考察,一般通过消元法或代入法求解。 4. 代数式转换:第4题要求将含有y的等式转换成x的形式,即2x-7y=8转换成x关于y的表达式,答案是x...
例如,题目中的03122xkx有一个根是1,意味着将x=1代入方程,等式成立,从而可以求出k的值。 4. **数学应用问题**:用数学模型解决实际问题。如题目中的密码系统,根据输入和输出的关系,可以建立方程6x=10...
8. **失传著作的引用**:寻找已失传的《汜胜之书》的相关引用,可以查阅古代文献汇编,如《艺文类聚》等。 9. **四部分类目录**:《七略》是我国现存最早的四部分类目录,将图书分为经、史、子、集四大类别。 10. ...
蜘蛛在访问网页时会留下HTTP请求记录,包括请求的URL、HTTP状态码、用户代理等信息。蜘蛛检测工具会检查服务器的访问日志,通过识别特定的用户代理字符串(这些字符串通常包含搜索引擎爬虫的标识)来判断是否为蜘蛛...
然而,鉴于积极的经济环境和固定收益市场整体趋紧的息差,分析师团队预计在2020年独特的风险有机会胜出。 3. 投资策略与建议: 在J.P. 摩根的这份报告中,分析师团队推荐了基于单B评级的债券超配策略(SingleB ...
56. **广义第二高价(GSP - Generalized Second Price)**: 在竞价广告中,胜出者只需支付第二高的出价。 57. **地域定向(geo-targeting)**: 根据用户的位置定位广告。 58. **梯度下降法(gradient descent)**:...
57. **GSP**: 广义第二高价,拍卖机制,胜出者支付第二高的出价。 58. **Geo-targeting**: 地域定向,根据用户的位置投放广告。 59. **Gradient Descent**: 梯度下降法,优化算法,用于寻找使损失函数最小化的参数...
《ORACLE常见错误代码的分析与解决(二)》 在ORACLE数据库的日常管理和维护中,遇到错误代码是常见的现象。本文将深入探讨两个典型的错误:ORA-...记住,预防总胜于治疗,定期备份和维护数据库是避免这类问题的关键。
### 常见的3756个汉字分析 #### 概述 本文旨在通过分析一个包含大约3756个常见汉字的数据集,探讨这些汉字在神经网络训练中的应用价值及其对自然语言处理(NLP)技术的重要性。数据集中包含了从日常生活中广泛使用...