"Code was never the hard part" is an insult to all programmers
TL;DR · AI 摘要
编程的复杂性远超表面,对程序员的挑战远不止写代码本身,文章通过多维度论证反驳‘编程容易’的偏见。
核心要点
- 《Clean Code》等经典书籍的存在证明编程需要系统性思维
- AI生成代码无法替代程序员的领域知识和设计决策
- 需求分析的复杂性不亚于技术实现,且更难量化评估
结构提纲
按章节快速跳转。
- §引言
指出‘编程容易’论调对程序员群体的侮辱性
通过薪资水平、行业现状、经典书籍等维度证明编程难度
分析AI生成代码对程序员核心能力的挑战
揭示需求分析比技术实现更难量化和标准化
用10x程序员现象和LeetCode面试机制佐证编程难度
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 编程复杂性的本质
- 技术实现维度
- 代码质量标准
- 调试复杂性
- 系统设计
- 需求分析维度
- 需求挖掘难度
- 优先级判断
- 商业价值评估
- AI影响
- 生成代码局限性
- 人机协作新范式
金句 / Highlights
值得收藏与分享的关键句。
‘如果编程容易,为什么需要《计算机程序设计艺术》这样的巨著?’
AI生成的代码无法承载程序员的领域知识和设计决策
需求分析的复杂性远超技术实现,但行业却缺乏相应评估体系
“编写代码从来就不是困难的部分”是对所有程序员的侮辱 —— Senko Rašić
“编写代码从来就不是困难的部分”是对所有程序员的侮辱
2026年8月8日
软件开发行业正经历剧烈变革。没有人知道人工智能革命最终会如何发展,但可以确定的是,工作方式和生活方式的许多方面都将被重塑——包括编程本身。
最近我经常听到的一种观点可以归结为:“大型语言模型(LLMs)可能擅长编写代码,但软件开发从来就不是困难的部分”以及“编写代码很容易,困难的是搞清楚该编写什么”。
我认为这种说法是对全球所有程序员的粗鄙侮辱。
如果编写代码很容易...
如果编写代码很容易,为什么程序员长期处于高需求状态,并且多年来一直要求获得高额薪资(即使在零利率政策(ZIRP)之前)?为什么在人工智能开始生成5000行代码的提交记录之前,就已经存在如此多的压力、过度工作和职业倦怠?为什么公司要寻找十倍速的编程高手并让他们接受LeetCode面试——毕竟,如果编写代码真的很容易,刚毕业的初级程序员应该也能轻松完成任务?
如果编写代码很容易,为什么还存在《代码大全》和《程序员修炼之道》这样的厚重著作?《计算机程序设计艺术》是轻松的夏日读物吗?《计算机程序的构造和解释》(SICP)是咖啡桌装饰书吗?为什么会有专门的编程训练营甚至整个大学学位课程致力于此?
如果编写代码很容易,卡马克(Carmack)只是在正确的时间出现在了正确的位置吗?为什么我们仍将法布里斯·贝尔拉德(Fabrice Bellard)视为天才?
如果编写代码很容易,为什么人们会愤怒于AI(或任何人)复制他们的代码?为什么他们表现得仿佛自己投入了大量汗水、灵魂和时间去完成某种如此琐碎的事情?
如果编写代码很容易,为什么现在许多人感到自己的身份和职业价值正在被剥夺?
如果编写代码很容易,为什么软件仍然如此之多缺陷?
如果确定要开发什么才是困难的部分...
如果确定开发方向是困难的部分,为什么那么多产品经理看起来毫无头绪?为什么他们没有严格的十步面试流程?为什么他们的薪资没有超过开发人员?
如果确定开发方向是困难的部分,为什么市场研究人员、可用性专家甚至——天哪——客户成功团队在软件公司里不被视为明星人物?如果“理解客户需求”更难,为什么商业分析师却被视为只会推纸的文员?
如果实现很容易而发现需求更难,为什么程序员会对销售人员为了促成交易而向客户承诺新功能感到不满?他们发现了真正的市场需求,这是人们愿意付费的东西!
如果编写代码很容易,为什么不是每个人都能直接构建十个不同版本的产品,然后看看哪个能成功?
并不存在“普通水平”的程序员
另一个陈词滥调的说法是:“软件开发中大部分工作是与利益相关者沟通、理解客户需求以及明确优先级。”
在我的职业生涯中,我遇到过许多程序员,其中很少有人愿意与利益相关者沟通,更不用说直接面对客户了(例外情况是自由职业者和创始人,尤其是软件开发公司的创始人)。而且,“明确优先级”最终归结为“请直接告诉我该做什么,不要每隔两天就改变需求”。
一些软件开发者确实会说:“我不写代码,我解决客户的问题。”但紧接着他们就开始谈论单子(monads)、内存安全性和DRY原则,而他们对客户的理解只是虚构的“用户画像”,还认为“affordance”是父母周末给你的钱,好让你出去玩得开心。
另一些人则会说:“软件开发是构建理论。”程序实际上就是证明(数学证明)。每一次提交都应该讲述一个故事。而通过FTP上传一个PHP文件来解决客户问题则是一种大逆不道之事。
我并非想暗示没有开发者既深刻关注软件开发的技艺,又真正能与客户共情。我相信他们可能需要去看心理医生,因为这听起来像是人格分裂症的症状。
什么才是重要的?
我相信与用户沟通、理解他们的体验、与他们共情、解决问题以及让所有利益相关者达成一致,是软件项目成功的关键。
我也相信编写高质量代码是一门需要技能、耐心、注重细节、经验与智慧的技艺,这种技艺在未来依然会非常重要。
¿为什么不能两者兼顾?
只要我们能做到,我认为我们应该追求两者兼得:既要深入理解我们正在构建的系统,也要深刻理解我们为什么要构建它。
大声宣称“代码很简单”或相反地宣称“代码是艺术,是无法自动化的创造性人类表达”,这不过是自欺欺人。
这是逃避现实。你不想逃避,你想要茁壮成长。
通过以上内容,我并不是说“赶紧加入LLM的浪潮”,也不是说“成为AI代理舰队的管理者”,更不是说“AI生成的代码是偷来的垃圾,必须用尽全力与之对抗,因为泡沫很快就会破裂”。
但请认识到,我们正处在一个行业范围内的地壳运动时期。我们需要想办法适应。我们需要理解哪些很可能会改变,哪些永远不会改变。
什么不会改变?
软件会变得越来越复杂。软件始终需要维护:比特腐烂(bit-rot)是生活中的事实,熵增也是如此。技术(硬件和软件)会不断前进,无论好坏。抽象层次的塔(摩天大楼?)会越来越高。
用户永远想要更多,却愿意花更少。他们仍然不知道如何表达自己的需求和愿望。更糟的是,他们甚至不清楚自己到底想要什么。客户(实际付费的人)与用户(实际使用者)之间的脱节依然存在,企业需求与客户需求之间的紧张关系也将持续。
此外:永远都会有兜售万能药的骗子。流行的技术会来来去去(我仍在等待新的VR复兴!)
什么会改变?
从一开始,程序员就在颠覆自己的行业。如今没人使用穿孔卡片了。很少有人需要用汇编语言或COBOL编程。那些花费数十年与C或C++中的内存错误搏斗并留下伤痕的岁月,在Rust、Go、Python和JavaScript的时代已毫无价值。
我足够年长,能够欣赏 valgrind 或者记得 PHP4 时代 mysql_real_escape_string() 函数——这些是我这辈子再也不会需要用到的东西。而且那也并不久远!我勉强躲过了 dBase、Clipper、HyperCard 和 Access 时代,这些技术如今仍能在一些店铺、咖啡馆里看到它们的影子,甚至还能看到某个布满灰尘、曾经是米色现在变成了金棕色的中塔机箱仍在愉快地运行着某个定制化的商业解决方案(备份?什么备份?)
我们如何才能持续成长?
接受变化是必然的。对新技术既保持好奇又保持批判性思考。
理解存在大量炒作,学会辨别虚张声势与真正有效的东西(以及其有效程度)。同时要意识到目标不断变化:退后一步审视过去一年甚至五年,评估变化的速度(技术、经济、社会层面)。
你的角色和职责将发生变化。要愿意投入时间和精力去深入理解与你领域相关联的其他领域或角色。
如果你是资深开发者,不要只满足于深化自己的专业技能。学习用户体验、客户访谈,或你所在领域公司的商业策略。这将帮助你更全面地理解所有为将软件交付到用户手中所付出的努力,无论你是否真的需要亲自参与这些工作。
如果你刚刚起步或处于初级职位:投入精力深入理解软件的工作原理。理解指针、递归或内存层次结构,即使你是 JavaScript 开发者也会有所帮助。理解网络协议和 HTTP 的工作原理,即使你在开发 WordPress 插件也会很有用。做 LeetCode 题,学习算法和数据结构,即使你暂时不需要。不要害怕去问"为什么"和"具体如何"。
以下是一些可能对你有帮助的书籍和其他资源:
- 《计算机程序的构造和解释》(PDF)
- 《编程面试攻略》
- 《人月神话》
- 《逆向工作法》
- 《团队拓扑》
- 《七种力量》
- 《新机器的灵魂》
- 《显然很棒》
- 《日常事物的设计》
- 《不要让我思考》
- 《持续发现习惯》
- 《妈妈测试》
最后一点
无论你是谁,都不要将你的理解力、判断力、共情能力和审美取代理给 AI。不要放弃自己的责任。不要做一个人肉代理。