近期比较多地使用了 AI 来辅助编程,可以分为以下几点来讨论:

  1. 现在 AI 辅助编程的水平如何
  2. 我们如何利用 AI
  3. AI 辅助编程对普通的从业人员的影响几何

AI 水平如何

在实际体验中,以 Claude 3.5 Sonnet 为例,AI 可以完成从项目搭建到具体的功能开发,并且可以输出不逊色于一个 3-5 年的中高级工程师水平的代码,如果有更详细的要求,则它输出的代码可以更有结构和符合常见的软件工程实践。

如果说到这为止,而不说任何前提,那么我们很容易得出一个令人焦虑的结论,便是 AI 是不是要替代程序员的工作了。这种论断是一种不负责任的说法,因为它既没有说明替代的时间,也没有具体的替代过程。AI 是替代哪一方面,还是说只需要我们描述一段话,AI 就可以自主完成所有的工作。

显而易见,只要有亲自尝试过现在 AI 编程的人,都无法得出以上的结论。如果以预测未来的视角来看,也是无意义的,因为这需要时间,历史上的很多事情都在变迁,技术在发展,也许有一天某个工种不再存在,但这于一个善于学习,愿意学习的人,可能并不是一个问题。计算机的世界本就如此。技术变化后,不是人失去工作,而是同一批人做了不同的工作。

由于 AI 编程能力的增强,现在 zed, cursor 等编辑器已经整合了 AI 到开发工作流当中。

AI 读懂现有代码后,进行功能开发,基本是能较大的符合当前的仓库代码设计和要求的,不需要对代码做非常多的调整。所以有更大的 context length 的模型便有很大优势。Claude 3.5 的 200k 的上下文基本能满足不少的代码仓库了。

特别是如果需要使用不熟悉的技术栈来实现东西时,比如前端程序员需要开发后端,AI 已经完全可以写出有很好实践的项目结构,表设计的后端项目。

但这一切都有一个前提,就是它需要人描述好需求,不仅仅是说功能是怎样的,还包括技术细节,如果我们忽略技术细节的描述,AI 输出的代码可能不是我们需要的,这时候需要多轮的交互,来让它产生符合预期的代码。

一个简单的例子,我们需要实现一个基于 JWT token 的登录认证流程,使用不同的 prompt 会有些微的差别(prompt 差别在现在的 AI 能力下,已没有那么重要了)。

Prompt可能的效果
基于 JWT 实现登录认证流程可以输出可工作的代码
基于 JWT 实现登录认证流程,考虑最佳实践有安全考虑,比如加上 refresh_token

这里的问题不在于 prompt 的差别带来了不同程度的代码,在于 AI 输出了这些可以工作的代码后,人类如何使用。

为什么这么说,因为我不是一个后端程序员,其实无法理解 AI 为什么会在表设计里,或者接口上加上 refresh_token,对于 access_token 和 refresh_token 的关系,我也是不明白的。

所以其实 AI 时代,更加要求开发者的水平,开发者水平的高低实际决定了 AI 输出的质量。

所以 Github Copilot 的名字取得很好,是 Copilot,而不是 Pilot,真正的驾驶员是人类。AI 是 Yet another tool.

但程序员本身对问题领域不熟悉,或者不太清楚要用什么方式来解决,AI 很可能输出的代码是不太可用的,比如会出现库的版本兼容问题,或者解决思路本身就不对,这时候需要人类的引导,告诉 AI,应该从哪里开始查看问题,有哪些方面会出问题,如果完全依赖 AI 通过读代码来解决,现在是有极大几率找不到问题的关键点在哪,导致无法解决。也许以后会有改善。

我们如何利用 AI

继续以上面的例子来说,这时候初级程序员或者对某一方面不熟悉的程序员,就要被 AI 替代了吗,也不完全是,因为正好因为有 AI,我们可以向它询问 refresh_token 的用途,对这个东西进行解释,也就意味着,我们拥有了一个很全面的老师,可以问任何我们不理解的地方,让它解释。

这其实是对程序员一个很大的影响点,因为我们有能力做到使用不熟悉的技术栈做需要做的事情,也可以学习到已知技术栈里的更多细节。

但这也有个两个前提存在:

  • 提问的能力
  • 你不知道你所不知道的

所谓的利用 AI,也就是提高这两个前提的能力。

提问的能力无需多说,如果不会提问和描述问题,AI 是无法给出很好的答案的,虽然 AI 的交互基本都是以聊天式来进行的,但其实一开始就提供好上下文,具体要求,效率是更高的,类似在 reddit 或 github 发帖求助类似。

第二点按字面来说,不是一种能力,而是局限,因为如果我们不知道一个东西,也就不可能问出相关的问题,比如一个初级工程师,可能不会问出提高 jwt 安全性的要求,因为他可能并不知道这里会有安全问题。

所以第二的是非常重要的,在 AI 辅助编程的时候,我们更需要加强自身对于编程的了解广度和深度,这也是回到上面那句开发者水平的高低实际决定了 AI 输出的质量。

但是提高的方式也变了,我们不仅可以通过看书,写代码,更多的可以通过与 AI 交互式的写代码,来提升自身的能力。

比如 jwt 需要做双 token 机制,并且通过 http-only cookie 下发 refresh_token,如何做 token 黑名单,更加加强 token 安全性,可以基于 refresh_token 吊销设备登录状态,都是通过使用 AI 来写而学到的东西。这种学习效率是比以前要快上 10 倍不止,因为以前很可能如果我们不做后端,也没有在一个有这样需求的公司待过,基本上职业的前几年可能并不能接触到这种细节。

因此 AI 的能力和程序自身的能力是相辅相成,有加速人类能力的作用。

AI 辅助编程对普通从业人员的影响几何

我们的开发模式已经发生了改变。自己的体会有几点:

  • 不再需要写简单的重复代码,模板代码,而是交给 AI 输出,人类 review
  • 更注重于软件架构和设计,而不完全是具体的实现
  • 可以使用多个 AI 模型,来对代码进行修改,优化
  • 从 AI 输出代码学习到自己不熟悉的编码和实现方式
  • 可以简单完成自己不熟悉的技术栈的代码

可以说,在实际开发中,初级的,重复的活都已经可以尝试使用 AI 来完成,比如前端布局,样式,后端 CRUD 操作,AI 完成基本是没有什么问题的。

行业对于从程序员的要求的变化,其实不是替代,而是程序员如何更好地使用 AI.

由于 AI 的存在,我们应该更多地使用它,让它快速地教会我们还不熟悉的东西,然后反过来让它可以输出更好的代码,更好的代码不是 AI 可以自动输出的,而是建立在程序员自己的经验和认知上的,这是重点。

而我们无需担心 AI 会替代人类的原因也是如此,应该通过 AI 加速自身的学习速度。

因此,也许以后 3-5 年经验的程序员,实际的水平是现在 10 年工作经验人的水平,因为一切都在加速。

AI/acc.

总结

  • 频繁使用 AI 开发项目,从中学习到知识,架构和实践方式
  • 扩展知识面,从前端到后端,到底层开发,到网络应用开发
  • 注重架构,设计等方面
  • 有更好的提问技巧