20 年编程老兵的代码价值观|极客时间

代码,是我们交流的语言和处世的名片,更是未来你找工作的简历。
你好,我是范学雷,我想和你来聊聊“怎么写好代码”这件事。
2014 年 2 月,安全研究人员爆出苹果公司旗下的 iOS 和 OS X 操作系统出现了严重的安全漏洞,黑客可以利用这一漏洞轻松获取用户的数据。下面的这段 C 语言伪代码简单描述了当时的漏洞情况。


复制代码

if((error= doSomething()) !=0)
gotofail;
gotofail;
if((error= doMore()) !=0)
gotofail;
fail:
returnerror;

相信你一眼就能看出来,在这段代码的第三行出现了多余的代码,导致后面的其他代码“失效”,这一低级错误也让所有的安全人员大跌眼镜。你可能会说,这开发人员真是太粗心了,是不是他复制代码的时候,多复制了一行,然后忘记删除了?
可能是这个原因,但问题的源头肯定不是粗心。有专家在看完了代码文件之后,发现相关的 Bug 代码没有正确使用缩进,也没有正确使用括号,并且其中的空格、制表符和代码注释也都不统一。
换句话说,这段代码就是所谓的“烂代码”。

工作中,你要是说谁的代码烂,那我估计很快你就会挑起一场战争。因为对于烂代码和好代码的定义,真的是千人千面。 现实环境的变化,也影响着你我对于代码“好”与“坏”的判断标准。

虽然对于“什么是优秀的代码“难以形成一致意见,但是这么多年的经验,让我对代码“好”与“坏”积累了一些自己的看法。
“好”的代码应该:

  1. 容易理解;
  2. 没有明显的安全问题;
  3. 能够满足最关键的需求;
  4. 使用规范的命名;
  5. 经过充分的测试。

“坏”的代码包括:

  1. 难以阅读的代码;
  2. 浪费大量计算机资源的代码;
  3. 代码风格混乱的代码;
  4. 复杂的、不直观的代码;
  5. 没有经过适当测试的代码。

当然,上面的列表还可以很长很长,长到一篇文章都列不完、长到我们都记不住的程度。 如果用一句话来概括的话,我觉得“最适合当前现实环境的代码,才是最优秀的代码。”
我将会在极客时间上的专栏 《代码精进之路》
中详细阐述这句话的含义。

我是谁?

我是范学雷, 现在是 Oracle 的主任工程师,也是 OpenJDK 和 Java 安全的评审成员
。从 1998 年我参加工作以来,一直在一线从事编程工作,期间在 OpenJDK 社区参与代码评审的工作。作为一个代码评审者,不是批准或者拒绝提交的代码,而是提出合理的建议,帮助代码提交者规避这些失误或者错误,编写出更优秀的代码。
作为解决现实问题的软件工程师,不管资历深、资历浅,我们都需要编写优秀的代码,并且是越来越优秀的代码,因为这是我们生存的基本依靠。作为活在现实世界的技术工程师,我们需要保持长久的竞争力,甚至是越来越强的竞争力,因为这是改善我们生存质量的最好方式。

我常和一些程序员说:“每一行代码,都体现着程序员的修为,思考问题的深度,甚至是处理问题的习惯和态度。 代码,是我们交流的语言和处世的名片,更是未来你找工作的简历。”

这个专栏我会讲些什么?

我会围绕代码的 规范、性能和安全
三个方面展开,选取工作中遇到的 最高频的、实用的细节问题
,从 重要性、易犯错的场景以及最优的处理方案
等角度来讲解,让你知道好的代码应该怎么写,怎么定义好的代码。

互动讨论


复制代码

importjava.util.HashMap;
importjava.util.Map;

class Solution {
/**
* Given an array of integers, return indices of the two numbers
* such that they add up to a specific target.
*/
publicint[] twoJia(int[] nums,inttarget) {
Mapmap=newHashMap();
for(inti =0; i < nums.length; i++) {
intcomplement = target - nums[i];
if(map.containsKey(complement))
returnnewint[] {map.get(complement), i };
map.put(nums[i], i);
}
thrownewIllegalArgumentException("No two sum solution");
}
}

这段代码中你发现了几个错误呢?同时可以在留言区秀秀你最中意的代码,或者吐槽一下你今年遇到的那些烂代码,并且给你造成了哪些困扰呢?

内容选自极客时间
代码精进之路

专栏