现代代码实践的通病反思
讨论当代代码中的质量问题和实践缺陷。社区热度高但内容范围较宽泛。
讨论当代代码中的质量问题和实践缺陷。社区热度高但内容范围较宽泛。
我偶尔会使用一项服务:我需要把一些文件上传到那里(服务叫什么并不重要,因为坦白说,它们都大同小异)。基本上,我只要指定硬盘上的某个文件夹,里面的内容就会被复制到远程服务器。服务器可能会执行一些与数据库有关的操作——为这些文件命名,并检查是谁下载了它们。
这项服务由一家大公司运营,因此其处理流程规模庞大。它很可能经常遭到黑客攻击,所以需要采取一定的保护措施,还要检查文件从我的 PC 上传到服务器接收完成的这段时间里,是否被人篡改过。这些我都理解。
……但从本质上说,我们讨论的无非是:登记几个文件、读取它们、上传,然后关闭连接,并在日志文件中记录一切是否顺利;如果不顺利,就记录具体发生了什么。这件事并不复杂。我以前就曾使用 Wininet API 从头编写过类似的代码,服务端使用 PHP,并连接到我的 MySQL 数据库。我的系统可能没有企业级系统那么可靠,但它支持数十万份文件的上传、校验、下载和日志记录。这不就是一个程序员花两三周便能完成的工作吗?
而我现在使用的这款专用文件上传工具,客户端文件总大小达到 230 MB,并且用了 2,700 个文件来管理整个过程。
你可能会以为这是笔误,但并没有写错:仅仅为了把几个文件从客户端复制到服务器,就需要两千七百个文件,以及 237 MB 的可执行文件和支持文件。这已经不只是软件臃肿或过度工程,而是彻底、明显、肉眼可见的疯狂。
问题在于,这款上传工具很可能与其他任何大公司开发的同类现代软件没有什么区别。顺便说一句,它现在会报错,而且根本无法工作。
我见过程序员这样写代码。我知道这个过程是怎么发生的。这不仅仅是因为程序员不会为了实现目标而编写高效的底层代码,更是因为他们从来没有见过高效、优雅的底层代码。如果他们甚至都不知道这种代码是可以写出来的,我们又怎么能指望他们创造出更好的东西?
你完全可以编写一个程序,把文件安全、快速且可靠地上传到服务器,而它所需的代码量只有现在的十二分之一。它甚至可以只有一个文件,一个小小的 .exe。它不需要数百个 DLL。这不仅可以做到,而且很容易;这样的程序会更可靠、更高效、更便于调试,并且真的能够正常工作。
你可能会觉得,那些五十多岁的老程序员(比如我父亲)之所以抱怨代码臃肿,只是因为他们已经过时,而且脾气古怪。我能理解这种想法。但那些过时又古怪的人,抱怨的是代码比应有的速度慢 50%,或者比应有的体积大 50%。然而,如今的情况早已远远超出了这个范围。我们已经走到了这样一个地步:我真心相信,我们 PC 文件中 99.9% 的代码完全没有用,而且永远不会被执行。这些代码之所以被塞进一个包含 65 个 DLL 的软件包里,可能仅仅是因为程序员想做一件像保存 bitmap 这样微不足道的事情,却不知道它原本可以多么简单,于是导入了一大堆臃肿的软件来解决问题。
正如我所说,我确实不该因此责怪年轻程序员。他们接受的就是这样的教育。他们根本不知道什么是高性能,也不知道如何在资源约束下进行开发。一个 25 岁的女孩谈论这些,听起来或许有些奇怪,但我遇到过足够多睿智的导师,他们向我展示了真正优美的代码。我父亲告诉我,1984 年的第一代 Elite 拥有一个巨大的银河系、3D 太空战斗、职业成长系统、交易系统,以及数千颗可供探索的行星,而整款游戏的大小只有 64 KB。现代程序员或许听说过这件事,却意识不到它与我们今天拥有的软件之间,存在着多么巨大的鸿沟。
这件事令我担忧的原因有很多。最起码,如果你需要用多两千倍的代码才能完成一项任务,那它至少应该能够正常工作。但更重要的是,我意识到,在我这台庞大而强劲的 PC 上,99.9% 的 CPU 时间都被完全浪费了。今天的计算机速度快得惊人,如果放在 10 年前,简直会被视为绝对的魔法。任何你能想象到的操作,都应该在 1/60 秒内完成。然而,当我点击 Microsoft Surface 笔记本电脑上的音量图标时,却能看到明显的延迟:机器慢慢创建一个新的用户界面元素,判断应该绘制哪些图标,然后这些图标才会出现并变得可以交互。整个过程需要时间。看起来大约要半秒,而在处理器的时间尺度上,这几乎相当于十亿年。
如果现在我们的 PC 资源有 99% 被浪费了——这还是保守估计——那么我们也在浪费计算机 99% 的能源。这简直是一种犯罪。那么,这些资源究竟花到哪里去了?如果你打开任务管理器,就会看到一堆臃肿的软件垃圾,天知道它们到底在做什么。我现在只是在输入这篇博客文章,Windows 却有 102 个后台进程正在运行。我的 NVIDIA 显卡目前就占了其中六个进程,其中一些甚至还有子任务。它们到底要做什么?我并没有在玩游戏;我使用的显卡驱动功能,与我父亲二十年前使用的那套几乎完全相同,但不知道为什么,现在却需要六个进程。
Web View Microsoft Edge 同样需要 6 个进程,Microsoft Edge 本身也是如此。而我甚至根本不用 Microsoft Edge。看起来只是因为我昨天打开过一个 SVG 文件,于是现在就有 12 段毫无用处的代码在浪费内存,而且很可能还在轮询 CPU。
这完全是疯了。这就是为什么什么东西都不能正常工作,所有东西都运行缓慢;为什么你每年都得买一部新智能手机,还得买一台新电视,才能下载那些臃肿的流媒体应用——而这些应用内部同样藏着糟糕透顶的代码。
就我个人而言,我认为情况只会越来越糟,因为 Facebook、Twitter、Reddit 等大型科技公司,正是这种趋势最糟糕的范例。很快,为这些公司工作的数千名“程序员”中的每一个人,都会使用 machine learning,把 Github 上那些臃肿、漏洞百出、杂乱无章的东西复制粘贴到自己的代码里。仅仅为了把两个数字相加,他们就会需要 32 个 DLL、16 个 Windows Services,以及十亿行代码。
Twitter 有 2,000 名开发者。更准确地说,在 Elon Musk 到来之前是这样。Tweetdeck 有时会拒绝加载用户栏。这个问题已经持续 4 年了。我敢肯定,没有一个程序员知道它为什么会发生。而它的核心代码,正如我父亲所说,不过就是一堆臃肿的、复制粘贴而来的 ****。
Reddit 根据链接推荐主题标题时,连 ampersand、semicolon 和 pound symbol 都处理不好。外面的世界已经是 2022 年了。这家公司大概也有 2,000 名开发者。显然,他们当中没有任何人能让文本解析器正确工作。这些人到底都在做什么?
曾经有过一个编程的“黄金时代”,那时内存和 CPU 都受到严格限制。如今,我们却生活在一个极度浪费、效率低下的深坑里。这实在令人悲哀。
感谢阅读!希望你觉得我的这些思考有些意思,也希望现在的你有了一些值得思考的问题。如果你赞同我的观点,欢迎留下评论,也欢迎写下你的想法。
若要采取进一步操作,你可以考虑屏蔽此人和/或举报滥用行为。