编程是难点吗?探讨 AI 时代编程的价值

软件开发行业目前正面临着由大语言模型 (LLMs) 兴起引发的根本性的身份危机。一种普遍的论调正在出现,认为“代码从来都不是难点”——这意味着软件工程真正的难度在于产品发现、需求收集和利益相关者管理,而实际编写代码的行为是微不足道的。

这一观点极具争议。对许多人来说,这是对编程手艺的一种侮辱;而对另一些人来说,这是在“输入语法”的行为与“构建复杂系统”的工程行为之间必须做出的区分。

论编程是一门艰深的技艺

编写高质量、可靠且可维护的代码是一门需要深厚专业知识的精湛技艺。认为编程“简单”的观点与几个行业现实相矛盾:

  • 经济价值: 对“10x 开发者”的历史性高需求和高薪酬表明,实现复杂逻辑的能力是一种稀缺且宝贵的技能。

  • 技术深度: 诸如 The Art of Computer ProgrammingStructure and Interpretation of Computer Programs (SICP) 等基础著作的存在,表明其理论和实践的复杂程度远超“微不足道”的工作。

  • 系统稳定性: Bug 的普遍存在以及维护遗留系统的难度证明,实现过程很少是直截了当的。

  • “天才”因素: 行业继续认可像 John Carmack 和 Fabrice Bellard 这样的人才,不是因为他们与利益相关者沟通的能力,而是因为他们非凡的技术实现能力。

反方观点:编码 vs 工程

许多经验丰富的开发者认为,“代码从来都不是难点”这句话是一个定义问题。他们区分了“coding”(将已知解决方案转化为语法的行为)和“programming/engineering”(解决问题的行为)。

编码即翻译

有人认为,一旦问题被完全分解为技术规范,编写代码的行为就是流程中最简单的部分。在这种观点看来,编码类似于手术中的最后一步“切割”——它是必不可少的最后步骤,但它是在完成了 99% 的关键决策之后才进行的。

“非代码”工作的复杂性

从组织的角度来看,瓶颈很少在于代码行本身,而在于:

  • 需求模糊性: 理解客户真正需要什么,而不是他们口头上想要什么。
  • 架构与建模: 设计能够演进而不会因自身复杂性而崩溃的系统。
  • 分布式系统挑战: 管理 CAP 定理的权衡、时钟同步和精确一次性交付 (exactly-once delivery)。
  • 组织协同: 协调多个团队和利益相关者以达成一致方向。

"Writing code is not hard. Writing correct code is. Knowing what is correct in a setting with paying customers generally involves interacting with those customers."

AI 对开发者角色的影响

LLM 正在加速开发者投入时间方式的转变。虽然 AI 可以产出成千上万行代码,但它引入了新的复杂性,将“难点”进一步推向了技术栈的上层。

从编写到验证

开发者正日益从代码的作者转变为编辑和架构师。挑战不再是编写函数,而是构建测试套件 (harnesses)、架构规范和验证系统,以确保 AI 生成的代码不会引入安全漏洞或架构漂移。

“氛围编程” (Vibe Coding) 的风险

人们越来越担心“氛围编程”,即开发者使用 AI 生成看起来可以运行的代码,却不理解底层的机制。这会导致脆弱的代码库,开发者无法解释数据如何在系统中流动,或者为什么选择特定的实现方式。

如何在剧变中生存

为了保持竞争力,开发者必须在技术深度与对业务和用户体验的广泛理解之间取得平衡。

对于高级开发者

深化技术专长已不再足够。资深开发者应该投资于相邻领域:用户体验 (UX)、客户访谈技巧和商业策略。理解为什么要构建某个功能,与知道如何构建它同样重要。

对于初级开发者

尽管语法正在自动化,但基础知识仍然至关重要。理解指针、内存层级、网络协议 (HTTP) 和数据结构,能为调试 AI 生成的“幻觉”并设计高效系统提供必要的思维模型。

不变的变量

无论使用何种工具集,软件的一些真理保持不变:

  • 熵: 位衰减 (Bit-rot) 和软件复杂性总会增加。

  • 用户模糊性: 用户将继续难以清晰地表达他们的需求。

  • 维护: 软件在长期维护和演进方面始终需要人类的判断。

最终,目标是避免“将判断力、同理心和品味外包给 AI”。最成功的开发者将是那些能够弥合“对系统的深刻理解”与“对用户问题的深刻理解”之间鸿沟的人。

Sources

相关