写点什么

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

2019 年 5 月 13 日

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

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 年 5 月 13 日 17:5628864

评论 1 条评论

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

终于有人把 java代理 讲清楚了,万字详解!

java金融

Java jdk 后端 动态代理 cglib

效率思维模式与Zombie Scrum

Worktile

敏捷开发

实现一个redis命令--nonzerodecr

老胡爱分享

redis 源码分析 源码阅读

策略模式解析

七哥爱编程

设计模式 策略模式

架构师训练营第三周学习总结

张明森

Java操作Excel竟如此简单

生命在于折腾

Java EasyExcel

架构师训练营第二周作业

陈靓-哲露

在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了

java金融

Java 后端 BigDecimal金额 Arrays.asList

啥是CPU缓存?又如何提高缓存命中率呢?

八两

大话设计模式 | 3. SOLID原则

Puran

设计模式

架构师训练营 - 第2周学习总结

红了哟

SpringIOC 是依赖倒置吗?

yupi

LeetCode | 4. Palindrome Number 回文数

Puran

Python C# 算法 LeetCode

ARTS|Week 4 Product, Leadership, and SOLID

Puran

设计模式 LeetCode ARTS活动 Leadership

从拼多多突破阿里和京东两大巨头绞杀,市值破千亿美金来看职业价值链

非著名程序员

程序员 程序人生 职业规划 程序员成长 职业成长

golang-pprof实战笔记

卓丁

golang pprof 性能分析

Git 基础知识学习

LeoBing

架构师训练营 - 第 2 周命题作业

红了哟

程序员的晚餐 | 6 月 20 日 随便牛肉和翡翠白玉

清远

美食

如何做好职场印象管理?

石云升

职场 印象管理 职场形象

在 React 仓库中的那些 package

teabyii

源码 前端 React

架构师第二周学习总结

陈靓-哲露

本地缓存高性能之王Caffeine

java金融

Java Guava Cache Caffeine 本地缓存 谷歌本地缓存

ArrayList哪种循环效率更好你真的清楚吗

java金融

Java 后端 ArrayList 循环效率 方式

游戏夜读 | RPG的美式和日式

game1night

LeetCode | 5. Longest Common Prefix 最长公共前缀

Puran

Python C# 算法 LeetCode

一款跨平台免费的开源 SQL 编辑器和数据库管理器!

JackTian

数据库 sql GitHub 开源项目 实用工具

[架构师训练营] 2 依赖倒置

悬浮

2020最新阿里Java高级面试题(首发,50道附答案)

互联网架构师小马

软件设计原则

yupi

架构师训练营第三周总结

hiqian

混合云之争的开端与终途

混合云之争的开端与终途

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