InfoQ 研究中心诚意出品,一份报告带你走进中国 2000 万开发者 了解详情
写点什么

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

  • 2019-05-13
  • 本文字数:1477 字

    阅读完需:约 5 分钟

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

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 的一些观点,只为博君一笑:



2019-05-13 17:5629306

评论 1 条评论

发布
用户头像
走了不少弯路并且还在走下去😢
2019-06-06 08:06
回复
没有更多了
发现更多内容

我眼中的工程师的十个特质

张驰

理解OT算法

张驰

以应用为中心的云原生2.0

8小时

微信朋友圈的复杂度分析

Fleng

架构实战营

cri-o技术探秘1

xumc

模块二:课后作业

菲尼克斯

架构实战营

Prometheus counter 四大 query 函数详解

Grafana 爱好者

云原生 Prometheus 可观察性 PromQL

Linux ifconfig 命令

一个大红包

4月日更

计算机原理学习笔记 Day9

穿过生命散发芬芳

计算机原理 4月日更

在线 excel 产品技术调研

张驰

模块2作业 2

dwade

架构实战营

模块二:课后作业

黄嘉治

架构实战营

一行代码实现网站移动化的原理与实现

张驰

微信朋友圈高性能复杂度分析

业务架构:作业二 朋友圈高性能架构设计

Nick~毓

微信朋友圈高性能结构设计构想

我不是坏人

翻译:《实用的Python编程》09_02_Third_party

codists

Python

写作平台一周年 | 我曾陪伴走过四季春秋

架构精进之路

个人总结 4月日更 1 周年盛典 我和写作平台的故事 InfoQ 写作平台 1 周年

Prometheus Pushgateway 0.9 和 1.0 的区别。

耳东@Erdong

4月日更

谈商业软件的发展趋势

张驰

架构实战营 -- 模块二

永佳

架构实战营

带你厘清事务一致性(下篇)

小舰

4月日更

基于 Notion + CloudFlare + 域名搭建博客

张驰

架构实战营 模块二:课后作业

Ahu

架构实战营

在线文档 - 为什么需要OT算法

张驰

从 JavaScript 明星项目看前端发展

张驰

架构实战营 模块二课后作业

iProcess

架构实战营

看看别人家 SpringBoot 的全局异常处理,多么优雅....

Java小咖秀

springboot 全局异常

采访彩食鲜 CTO 乔新亮:数字时代,企业如何完成数字化转型?(采访提纲)

xcbeyond

数字化转型 4月日更 人物访谈

一天也不要和他们一起工作

池建强

架构实战营模块二作业

冷大大

作业 架构实战营 模块二

为什么高级程序员写的代码都是傻瓜式的?_编程语言_Scott Shipp_InfoQ精选文章