在科技行业,一个令人困惑的现象正日益引发关注:一方面,编程语言、框架、开发工具和人工智能辅助编码技术日新月异,似乎“写代码”这件事已经变得前所未有的高效;另一方面,普通用户却频繁遭遇软件卡顿、闪退、界面臃肿、功能冗余甚至安全漏洞。如果“coding has been solved”(编程已被解决),为什么我们的软件体验反而每况愈下?

复杂性:效率提升的代价

“是的,我们现在可以用更少的代码行实现更多功能,”硅谷资深开发者、前微软工程师埃里克·李(Eric Li)在接受采访时表示,“但问题在于,现代软件的规模和相互依赖关系已经远远超出任何个体开发者所能理解的范围。”

以iOS系统为例,一个简单的“照片”应用背后,涉及底层图像处理引擎、云同步模块、机器学习分类算法、多个第三方SDK以及数百个系统接口。任何一处的微小变动,都可能在不经意间引发连锁反应。苹果公司在iOS 17中因修改了相册缓存机制,导致部分用户遇到严重的启动延迟,修复补丁耗时三周才推出。

这种复杂性不仅体现在操作系统层面。用户每天使用的微信、Facebook、Chrome等应用,动辄包含数千万行代码。尽管自动化测试和持续集成工具日益成熟,但“未知的未知”依然大量存在。DORA(DevOps研究与评估)2023年度报告显示,仅有27%的高绩效团队能够做到“变更失败率低于5%”,而大多数中等团队的失败率在15%-20%之间。

商业压力:快比好更重要

如果说技术复杂性是客观困难,那么商业逻辑则是一种主动“破坏软件质量”的推手。

“用户不会因为你的代码优雅而给你付费,他们为功能买单。”国内某头部互联网公司产品总监坦言,“产品经理的KPI往往是新功能上线数量、日活增长幅度,而不是应用崩溃率或内存占用。”

这种“功能军备竞赛”导致软件变得越来越臃肿。以微软Teams为例,这款企业通讯软件在2020年远程办公潮中迅速崛起,但用户很快发现它动辄占用2-3GB内存。微软工程师后来承认,为了快速对标Zoom和Slack,团队在架构设计中牺牲了性能优化。直到2023年,Teams才通过重写核心模块将内存占用削减一半——这距离用户广泛抱怨已经过去了三年。

类似的案例比比皆是。Gmail在2011年推出了优先级收件箱功能,却导致加载时间增加1.2秒;Spotify屡次更改界面布局,用户需要反复学习操作逻辑;甚至谷歌Chrome浏览器,在持续添加新API的同时,其内存开销已从最初的几十兆飙升到如今动辄上GB。

人工智能:辅助还是隐患?

近期受到广泛关注的是AI代码生成工具(如GitHub Copilot、Cursor)对软件质量的影响。支持者认为,AI让程序员可以专注于架构设计,而将重复性编码工作交给机器。但批评者指出,AI生成的代码往往缺乏对上下文和边界情况的深入理解,且难以保证安全性。

斯坦福大学2024年的一项研究显示,使用Copilot的开发者提交代码的速度提升了55%,但产生的安全漏洞数量也增加了22%。“很多开发者过度信任AI的产出,跳过了代码审查和静态分析。”论文主要作者詹姆斯·麦凯(James McKay)说,“结果是,我们正在以更快的速度生成更多有缺陷的软件。”

更令人担忧的是,AI生成的代码可能包含隐蔽的逻辑错误,人工审查需要花费比手写代码更多的时间。这形成了一个悖论:工具声称“解放程序员”,实际上却可能让软件质量变得更难控制。

技术债务:看不见的雪崩

几乎所有大型软件项目都会积累“技术债务”——为了赶工期而采取的权宜之计、过时的设计决策、被遗忘的遗留代码。在初创公司中,技术债务往往被视为可接受的短期牺牲。但一旦公司上市或产品成熟,偿还债务的成本会呈指数级增长。

一个典型案例是波音737 MAX的MCAS系统。这款旨在补偿气动缺陷的软件,其设计原本是临时方案,但由于管理层对市场份额的急切追求,该方案被绕过严格的重新认证流程而部署。最终两次致命空难导致346人丧生。波音为此支付了超过25亿美元的罚款和赔偿金,公司声誉遭受重创。

用户能做些什么?

面对日益复杂的软件环境,普通用户并非完全无能为力。专家建议:定期检查并清理不使用的应用;关注软件的“长期支持(LTS)版本”,避免过早采用可能充满bug的新特性;对于关键工作,选择那些在稳定性上口碑较好的老牌软件替代新晋的“快速迭代”产品。

“我们无法停止技术进步,但至少可以要求厂商为软件质量负责。”数字权利组织“电子前沿基金会”研究员阿曼达·莱文(Amanda Levin)说,“用户反馈渠道应当更加透明,开发者也应该承认:没有任何工具能替代人类的理性判断和责任心。”

编程从未真正“被解决”。它只是从一种技能变成了一种产业——而产业,永远有它自己的优先级。