#概率性编程

Andrej Karpathy 将软件发展分为三个阶段,Software 1.0,是通过编写计算机代码来解决问题,标志性产物是 Github;Software 2.0,神经网络扮演了重要角色,编程工作变成了训练和调参,通过调试不同的数据集,来修改神经网络每一层、每个节点的权重,标志性产物是 Hugging Face;而 Software 3.0 最本质的变化是,神经网络变得“可编程”了,且编程语言不再是传统代码,而是提示词,你可以通过自然语言跟大模型交互来找到问题解。 从写代码,到训模型,再到写提示词,软件的本质始终是:寻找让机器解决问题的最优表达方式。 再去看编程范式的变化,在神经网络出现之前,软件属于“确定性编程范式”,if A then B else C,逻辑规规矩矩,一条逻辑解决一个明确问题;而到了 LLM 时代,演进成了“概率性编程范式”,软件输出结果由权重叠加完成,可能性变多了,能解决的问题也更多、更大、更复杂,因此未来大量的长尾需求也会得到好的满足。 回到人机交互这个命题,问题也随之而来,代码过于精确(输入高成本),而自然语言过于模糊(输出低质量)。要做好人机交互,需要有一层规约(Specification),把事情有条理地讲清楚。事实上,我们日常的需求拆解、需求澄清,其实就是在“写 spec”,它的价值不在于文档本身,而在于帮助人类和机器对齐意图。这也是为什么越来越多的 AI 编程工具(如 Kiro Spec、Trae Solo)本质上都在探索新的 spec 模式。 可以预见,当机器拥有更强的“自主意识”、能够解决更复杂的问题后,未来的人机协同、机机协同也会变得频繁,要解决“人-机-机”三方协同问题,软件工程的核心势必会转向定义规则、目标与价值观上。对工程师来说,或许就是,从编码切换到写规则。