18

为什么高级程序员写的代码都是傻瓜式的?

 5 years ago
source link: https://www.infoq.cn/article/gu0HigYOJ-Wf20HayH69?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Brian Goetz 是 Java 领域的技术大牛,同时也是《Java 并发实践》一书的作者之一。我最喜欢的一句名言就是他讲的。这句话出现在甲骨文公司以《编写傻瓜式代码》为题发表的访谈当中,当时记者问到 Goetz 如何才能编写出性能良好的代码。以下是他给出的睿智回应:

一般来说,在 Java 应用程序当中快速编写代码的方法,就是先写点傻瓜式代码——这类代码简单、干净,而且遵循最明确的面向对象原则。

在接下来的发言中,他一直在具体解释:为什么尝试优化代码并试图让代码看起来不那么傻瓜,正是程序员群体中的一种常见错误。而在我看来,这更多是一种新手程序员常犯的错误。

高级开发者的代码

如果大家像我一样,也经历过初窥门径的过程,那么各位应该还记得自己第一次看到高级开发者写出的代码时,心里想的是:

“这玩意儿我也写得出来,为什么我就不是高级开发者呢?”

此后,我花了不少时间想写出相类似的代码,最后发现我根本就做不到。

关于“高级开发者”的疑问,并不在于我无法理解代码当中的特征。相反,我一眼就能明白他们写的代码在说些什么,因为这些代码从根本层面上就是在走傻瓜式路线,谁还看不懂啊。但除此之外,似乎还有更多不同。我记得当时我在想,“这「更多的」究竟是什么?又是怎么做到的?”

从那时起,我逐渐学会了编写傻瓜式代码的所有原则与质量保证方法,包括:YAGNI 原则 (You Ain’t Gonna Need It);单一责任原则;DRY 原则(Don’t Repeat Yourself);单一级别抽象原则;低耦合等等。我自己,也慢慢成了“高级开发者”。(我其实很讨厌「高级开发者」这种说法,因此我始终坚持称自己为「软件工程师」,但这又是另一个故事了。)

我学到的最重要的经验就是:

编写傻瓜式代码实际上非常困难,但一旦实现则会带来远超预期的回报。

如何从一里外认出菜鸡程序员

在《重构:改进现有代码设计》当中,Kent Beck 指出:

任何傻瓜都能够编写出计算机可以理解的代码,但只有优秀的程序员能够编写出人类可以理解的代码。

如果大家遇到精妙无比的单一代码行,以及模糊的抽象及 / 或语言特征时,其背后几乎总会有一位初级开发者。说实话,后一种情况尤其常见。看到这些代码,我仿佛就看到这位程序员在强调:

“快来看我!我真的很懂这门编程语言!我在使用默认接口同步本地线程 JavaBean 复制构造函数,并配合自定义通用未检查异常以及跨函数安全强化 JAXB Lombok 代码生成!看我厉不厉害!”

以上场景纯属胡说八道,但相信大家能够明白我的意思。这类代码往往来自那些只关注计算机理解,而不重视人类理解的程序员。

代码的本质,在于向其他人交流并向计算机发出指令;但相较于后者,目前代码的前一项作用显得尤其重要,因为有编译器负责将程序员编写的内容翻译成机器语言。一般来讲,这种转换会分多层实现,例如在将 Java 编译为 ByteCode 时,Java 代码首先由 Java 虚拟机在运行中读取,并最终将内容翻译为 0 和 1 的形式。

不过代码代表的仍然是人类的语言,除了指导计算机之外,必须也能够表达任务当中的谁、什么、何时、哪里、如何以及为什么等问题。再举个例子,即使你的公司被收购了五年多,这些代码也仍然得具有实际意义,并确保之前从未见过这些代码的新团队能够快速打开并进行功能增强 / 错误修复。

是的,编写傻瓜式代码非常困难。随着时间的推移,我觉得我越来越喜欢这种编程风格了。当我在代码评论中收到“这代码真干净!”之类的评语时,我真的感到非常欣慰。我知道我能为整个团队、乃至未来的代码维护者们做的最好的事情,就是编写傻瓜式代码。

需知:

道路千万条,维护第一条。代码不规范,运维两行泪。

作为结尾,我再列出 Dave Carhart 的一些观点,只为博君一笑:

jmAFvmq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK