好开发者是聪明而不机灵的

11/3/2019 software engineering

好代码自我表达,无须令人印象深刻。

原文:Good Developers are Smart, not Clever (opens new window)

Photo by Austin Distel on Unsplash

起始于 15 年前的开发者生涯中,我的第一个经验教训是以下一条简单而短小的格言:

“好代码自我表达,无须令人印象深刻”

曾经的我也反驳过:“这能有什么区别吗?”

“自我表达”意味着清晰、明确和专一。因此,编写一份自我表达的代码需要解决特定问题。在创作这份代码上面投资的时间和精力都是有目的的,希望它能够按预期的方式工作。

“令人印象深刻”则意味着给人留下印象和持久影响。因此,用复杂的结构和算法编写一份令人印象深刻的代码,也许会满足我们的虚荣心,给我们带来惊叹、羡慕的眼神和掌声,但是对于后期需要维护我们代码的人来说,这可能是大部分痛苦的来源。如果他是个精神病患的话,我们就只能祈求上天能保佑免遭这愤怒的后果了。

这就是为什么好开发者都是聪明而不机灵的。一个聪明的开发者家天生的聪慧和能力结合,用于判断此次操作会给未来带来的后果。他们清楚知道正在写啥、为什么而写和这份代码的长期影响。简而言之,它们不是创可贴型的开发者。他们坚信根治疾病方能一劳永逸。

精灵的开发者就不大同了,他们知道快捷方式和世上所有把代码跑起来的骚操作。他们讲天生的聪慧和能力结合,找到解决手头所有问题的最快方案。但日积月累之下绷带和胶布愈多,突然某天代码崩溃,所有参与其中的开发者的声誉也随之飘散。这也是应 Steve McConnell 所言:

编程和呆在 CIA 上班不同,投机取巧并不会得到赞赏。

聪明的开发者从不投机取巧。他们写的代码都是无聊、简单和容易理解的。不多也不少。

以下是聪明的开发者拥有的特质。

# 他们保持代码简洁

Martin Fowler 有言:

傻子都能写出计算机理解的代码。好程序猿则会写出能被人理解的代码

开发者有时不免心血来潮想要证明自己。他们想要向别人证明自己的能力。这使得他们对眼前最简单的解决方案视而不见,而去为每个问题寻求复杂方案。这是所有开发者犯的最大错误。

聪明的开发者写出的代码都是直接了当的。直接的代码易于后期维护、优化和重构。它做不出疯狂和非预期的行为,使得每个读者都能清楚知道它的功能。通宵用咖啡浇灌出的新颖和非主流的算法和姿势通常看起来不得了,但是现实场景下死得比较惨。

记住了:每次写代码时心头称为虚荣心的小鸟勾引你时,请自问以下一个简单问题。

“如果两个月后我回头,再上手这份代码的话,我还读得懂吗?”如果你说可以的话,那就义无反顾地操作吧,但是请怜悯一下你同事,添加一些合适的注释、合理地命名变量,并尽可能地把代码模块分好一点使得它不需要多余的解释。

好代码就像个笑话。如果还需要解释的话,那它就有点冷了。

# 他们知道优化代码的时机

Edgar Dijkstra 有言:

编程时专注于 WHY 而不是 WHAT 能够使得我们成为更好的开发者

这句话是说优化代码的方式千万种。每种可能性都源自使用更多内存、跑得更快或不同的算法/逻辑。无论何时何地,聪明的开发者都能机智地作出选择。

但是在开始任何代码优化工作之前,他们会遵循 “don't” 的黄金法则。

我为什么应该这样做?程序是否应景很好了?基于程序的使用方式和执行环境,使它跑得更快有多大好处?这些都是我们优化代码之前需要回答的问题。

这样才是对得。只有程序异常重要,跑的贼慢,预计能够保持健壮性、正确性和清晰性的同时能够改写得更快的时候,优化才是对得起为其付出的努力和代价。一个跑得很快的程序无法产出正确结果的话,对大家来说是毫无用处的。经过有效优化的软件优势要大于劣势,但是优化不当的话,话就得反着说了。

谨记:所有优化都应该能够测量出来。直觉在指明所需的依赖方面总是非常糟糕的。

# 他们维护而不是新写代码

Vicky Gundotra 曾指出一个关键点:

你开始写代码去吧。我会找到他们想要的

聪明的开发者就是这样做的。他们从搜索现有的可用方案入手。当我们小部分人自以为是地吐槽别人代码,觉得自己能以“正确的方式”写出更好的代码时,大部分情况下我们都在浪费精力在重复造恶心的轮子上面。

不要害怕搜索。查阅在线或我们代码库的已有方案是非常有用的,能帮助我们掌握类似情况的常用应对方法和这些方案具有的优缺点。这也是为什么聪明的开发者开始写代码前大量时间都花在阅读代码上面。白手起家写出一份新代码往往在耗费时间、金钱和精力方面是非常昂贵的。除非逼不得已,千万不要搞事。

所以每当试图完成一项任务时,先查查是否已经有人解决过类似问题。我们并没有抄捷径,只是节省了精力而已。

# 他们挑战自我

Aristotle 有言:

如果我们手头的工作没有给我们挑战,那它不会给我们带来改变

聪明的开发者会挑战自己,更准确指的是他们任何条件下写过的代码。他们能够谦虚的承认没有代码一开始就是最好的。

他们不会满足呆在舒适区,周而复始地每次应用同样的模式。他们会有意识地避免自身的编程偏爱退化为盲目的教条。他们总会盼望更好地解决问题的方法和途径,如果这意味着需要学习新东西,对他们来说只不过好玩的游戏而已。

记住了:聪明的开发者不会迷恋于新颖的想法或花俏的特性。他们的实用主义使他们能够意识到没有答案是完美的,每个美好的特性或惊艳的操作都是有不足之处的。

# 最后,他们都不会羞于求助

Sophocles 有言:

如果我们总是互相帮助的话,没有人需要碰运气

作为开发者,我们偏向于把自己看做聪明的人。事实上,部分人确实是纯正的天才。尽管刻意这样认为,但是我们往往倾向于我们全知全能,能够把万事纳于一心。毕竟,没有谁愿意在开会时直言“我不懂”。谁会勇于承认即将部署的新功能对自己来说就像恶心的希腊字母一样?

我们自言自语:“我会自己弄明白的。以往我都是自力更生的。这次我也能行。”

聪明的开发者可不会这么想。他们能够区分寻求助攻和自立更生的时机。他们清楚地认识到:再晚一点寻求帮助的话,会引来焦虑并且后续会给团队的每个人赶截止日期带来压力。这就是为什么他们敢于暴露自己的无知,需要的时候大胆求教。

记住了:求助不是说质疑我们的能力。它只会增强别人对你的信心,相信我们会不惜一切地按时完成任务得到正确结果。这时我们看到的是一个踌躇满志、自信满满的开发者,他每天都在为变得更优秀改变着自己。

Kubra Salt 有言:

求教是开始改变的第一种方式