我认为我有资格谈论这个问题:
我在 Githuh 已经有 2 个超过 100 星标的开源项目。
截止文章开始写的时候,一个 267,一个 105。考虑到 Github 上绝大部分项目不超过 10 个星标,我的成绩自然是在水平线之上。
除了这 2 个破百星标的项目之外,我还有好几个 50 个星标的项目,一些 20 个星标的项目。
自从我 Vibe Coding 到现在,我一共开发了 12 个项目。没有一个项目低于 10 个星标。其中 2 个项目起码经历了大规模重构(几乎完全重写)。
为什么标题不是 Vibe Coding 而是 Vibe Debugging?
如果从生物学分类来看,Bug 是克鲁苏——不可名状,永恒存在,令人恐惧。
小白 Vibe Coding 到最后往往变成 Vibe Debugging,拼命打印调试日志,然后塞给大模型,祈求它这把能过。
抑或,在 Vibe Coding 爽撸一把之后,祈祷这把不会有 Bug。然而克鲁苏就是克鲁苏,Bug 不会因为你的诚意感天动地,就自动消失。曾经有科学家开玩笑, Bug 是唯一违反物理定律的东西,因为即便太阳系毁灭了,Bug 也会继续存在。
所以,我们在谈论小白 Vibe Coding 的时候,也是在讲 Vibe Debugging——请所有小白在尝试 Vibe Coding 之前,一定要清醒的明白一件事,很多时候你不是在编程,你只是在制造你无法解决的 Bug。这是我非常痛的领悟。
想要减少 Bug 的出现,必须懂点软件工程
小白之所以无法控制 Bug 的产生,我觉得原因和会不会编程语言的关系不大。
就我潜伏在 V2EX(中文最大的程序员线上社区)里观察,即使懂得编程语言,同样闯祸,很多时候还是一口大锅,搞得身边的同事恨不得给这种惹事精做开颅手术,瞧瞧脑袋里装的是啥。
就我的 Vibe Coding 经验而言,真正令 Bug 减少的,是软件工程里的常识。也是让我觉得 Vibe Coding 时,不再害怕 Bug 出现的关键飞跃。
Vibe Coding 领域的流行理论,从单纯的 Prompting 到 Context Prompting 再到现在的 Spec Programming,在我看来是毫不回头地朝着软件工程化的方向狂奔。
所以,你还觉得不必了解一点软件工程吗?
想懂点软件工程,必须先拥有「组件化思维」
想知道 Bug 发生在哪里,为什么发生,固然是可以将日志直接塞给大模型——这是 Vibe Coding 的标准做法。
但,难免会碰上大模型怎么改都改不好的克鲁苏级 Bug 出现。排查 Bug 的流程,首先肯定是定位问题。
此时,拥有组件化思维的小白,会尚未拥有的小白,差距会十分明显。因为,前者通过脑子里清晰的结构,很快地定位到问题发生的那一段代码,以及它的相关因素。而后者,往往只能看到一个函数报错,但他只能重复地把错误日志塞给大模型。
克鲁苏级 Bug 无法马上消灭,往往就藏在这个「相关因素」里。缺乏组件化思维,脑子里就缺了一张地图,无法找出这些个「相关因素」,那么,更不要说排查 Bug 了。这整个过程就好像排雷,雷通常是藏起来的,如果想全排除,只能用扫雷车一个地面都不放过地筛,但是如果连埋雷的地方都不知道,就谈不上排雷这件事了。
现在,问题来了,如何拥有「组件化思维」呢?别急,往下看。
*想懂「组件化思维」,必须了解基础概念「抽象*」
我们通常接触到「抽象」这个词,往往和「抽象思维」这个词组密不可分。抽象思维,说的是迅速寻找事物的共性,总结特征。
在计算机领域里,「抽象」也类似的含义,因为组件往往是由普通的代码抽象而来的,而这个抽象的过程,往往是因为代码当中存在着大量的重复。这些重复的部分,可以抽象成公共组件,为其它组件提供服务。
还有另外一种抽象,是明确代码的边界,比如说,这几个函数是为同一个目的服务的,那么它们只需要面向这个目的进行设计即可。你可以认为,软件其实是一个流水线,这个流水线由不同的工序组成,从原材料放进传送带开始,一直到变成成品从传送带离开,每一道工序都负责加工上一道工序所传递过来的半成品——在软件里,工厂流水线里每一道独立工序都可以视为「组件」。
实际上,现在的 Spec Programming 也不过是进化到,将软件里的所有组件也说清楚给大模型听,然后让大模型生成代码。
换言之,如果你有能力在文档里描述不同的组件的作用,以及它们相互之间的关系,如何配合,那么你已经具备 Spec Programming 的能力。
在设计组件的时候,软件开发领域的「DRY 原则」显得尤为重要,它有点像麦肯锡金字塔原理的「不重不漏」原则。每个组件必然不是重复的,而要让它们有机地写作,那么又缺一不可。
请期待下一篇
这一篇我已经说清楚非常基本的概念,这些概念对于小白来说是不可或缺的,必须掌握的背景知识。在这里我十分推荐《软件设计的哲学》这本书,它不长,但更好覆盖了必须了解的常识。