The Joy of Programming

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

昨天,我在为我关于Java和面向对象编程的未来演讲准备一个幻灯片时遇到了麻烦,因为我找不到关于“逻辑透明性”的有说服力的论点。我本来打算说,对于程序员来说,理解他们所做的一切如何工作是很重要的,即使他们看不见它或从不想看到它。但后来我意识到,也许不是每个人都这样想。也许有些程序员更喜欢对大多数事情保持一无所知的状态,只要他们面前的代码“正常工作”就行。因此,我写了这篇博文,想问问你们站在哪一边。

很多年前,我作为一个求职者参加了一次面试。他们正在寻找一位网络架构师,我正在和他们的首席技术官交谈。他要求我解释当我们在网页浏览器中输入新的URL并点击“Enter”时发生了什么。我给他画了一个小图,包括一个域名注册商、几个DNS服务器、一个负载均衡器、几个HTTP服务器、几个数据库和几个IP中继在中间。我相信他对我的回答印象深刻(尽管他们当时没有雇佣我),并告诉我大多数Web开发人员并不了解这个图中的大部分内容。据他说,他们只知道HTTP服务器是如何工作的,对其他方面几乎不关心。他们中的大多数人甚至不知道HTTP是什么,只要PHP代码按照预期工作就行。

我记得那次面试,并在后来面试别人时问了类似的问题,当时我是自己公司的首席技术官,也是其他几个项目的架构师。他的结论得到了证实。事实上,大多数程序员不了解例如DNS是如何工作的,也不知道它的作用。此外,他们没有这些信息也感到很好。这是否意味着他们是糟糕的程序员?

让我告诉你另一个故事,就在几天前发生在我身上。我正在解决一个非常复杂的技术问题,试图将我之前没有机会使用过的软件与另一段我也从未见过的软件集成。这花了我整整三天的时间。现在回想起这段短暂的旅程,我意识到当我开始使用新东西时,我总是经历几个特定的阶段,这些阶段对我来说总是一样的:

  • 猜测。我开始对刚刚复制粘贴的简单代码进行更改,并对其背后的逻辑进行一些假设。我不知道我正在使用的产品是如何设计的,但我需要依赖于某些东西。因此,我依赖于我能够猜测的内容。

  • 沮丧。显然,我大部分的假设都是错误的。我开始使用谷歌和stackoverflow搜索。我得到的答案(如果有的话)并没有太多帮助,因为整体情况还是不清楚,我所能做的最好的就是根据我从随机来源得到的建议修补我的代码,让它能够工作。但我仍然在黑暗中摸索,整体设计概念仍然不清晰。我仍然希望在不阅读完整的开发者手册手稿的情况下解决所有问题。

  • 抑郁。很快,我意识到自己只是一只试图启动飞机的猴子。也许它会飞起来,也许我甚至能成功降落。但我仍然是只猴子,这让人非常沮丧。我对此毫无乐趣可言。我讨厌自己的愚蠢。我讨厌那些创建这些库却不让人明白如何使用的人。我也讨厌我的工作。

我认为这四个阶段对于我们所有的软件工程师来说都很常见。然而,之后发生的事情区分了优秀的程序员和糟糕的程序员。坦白说,根据情况不同,我既属于好的程序员,也属于坏的程序员。当我成为一个糟糕的程序员时,我只是让一切工作起来,并且结束这一天,却仍然不知道内部发生了什么,也不知道为什么它以这种方式工作而不是我之前尝试的方式。我的抑郁症没有改善,只会升级。我仍然讨厌自己,但我的软件可以工作。我继续解决下一个问题,等待周末的到来。

当我成为一个好的程序员时,我会深入研究问题,学习我使用的软件,下载源代码,阅读文档,直到我理解发生了什么。然后,我回到我的代码部分,带着充分的理解修复它,并结束这一天。有时候我甚至会写一篇博文,比如关于Nutch的博文,关于Liquibase的博文,或者关于CasperJS的博文。我的抑郁症完全消失了。我不再讨厌自己,也不再讨厌我的工作,也不再讨厌那些“愚蠢”的库的开发者。我甚至通过我的博文来帮助他们的项目。

我如何决定选择哪种方式:像一个糟糕的程序员还是像一个好的程序员?你可能会认为这取决于我为手头的工作有多少时间/预算,但你错了。这完全取决于我对生活在抑郁症中的准备程度。

不久前,我告诉自己我不再这样做了。我不想再成为驾驶飞机的“猴子”。我想成为一个“飞行员”。当然,学习曲线会更长,但结果是……快乐。当我清晰、透明地看到我写的每一行代码的逻辑时,我确实喜欢我的工作。我完全知道为什么写它们,它们做什么,如果我改变它们会发生什么。当然,我不知道所有的细节,但我知道在哪里点击以找到这些细节。这就是使我对工作感到有趣的地方:我的编码逻辑的透明性。

我真的喜欢掌控我的代码所做的一切。我喜欢感觉它完全按照我的意愿去做。你可能会说我是一个控制狂——也许是这样。但这是在过去30年的编码中,我获得最多乐趣的地方:看着计算机按照我的意愿去做事情。如果一些库试图夺走这一点,让我坐在乘客座位上,我会尽一切努力重新掌控驾驶座。我想知道发生了什么,我希望这发生在我意愿之下。我想享受我的工作。

现在,回到我的演讲。我将在我的一张幻灯片中展示这段代码(这是Spring Framework应该被使用的方式)。

然后我会问一个问题:你知道谁正在创建HelloController类的实例以及如何使用该实例吗?谁在调用它的方法,为什么和何时调用?此外,你知道如何修改这种行为吗?我在会议上的观点是,一个好的框架必须使其用户更容易理解其内部机制。因为好的程序员确实想要知道里面的情况。另一方面,糟糕的程序员对于成为飞行猴子是可以接受的。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:47

sixnines availability badge   GitHub stars