专栏名称: 宝玉xp
前微软Asp.Net最有价值专家 互联网科技博主 我是宝玉。
目录
相关文章推荐
黄建同学  ·  其他一些重要的时间序列基础模型:1. ... ·  4 天前  
爱可可-爱生活  ·  [LG]《Ultra ... ·  4 天前  
爱可可-爱生活  ·  [LG]《Model Alignment ... ·  5 天前  
爱可可-爱生活  ·  今日推介(第1648期):从数据中发现时滞微 ... ·  1 周前  
爱可可-爱生活  ·  通俗版解读 查看图片-20250112075417 ·  1 周前  
51好读  ›  专栏  ›  宝玉xp

//@高飞://@QuantumDreaming:context-20250115071030

宝玉xp  · 微博  · AI  · 2025-01-15 07:10

正文

2025-01-15 07:10

//@高飞://@QuantumDreaming:context 太短了 + context 长时模型性能退化,这是当下我觉得对于编程来说最糟糕的两个问题。对于比较大的项目,传统那种 token prediction 肯定不太行,需要用 o1、o3 那种更长时间的推理的模式,因为中间 AI 需要反复的调整自己的理解,逐步逼近用户的真实需求、代码的真实问题。//@高飞:原文说的对,目前AI是不能平替人类程序员,但由于AI提高了程序员的效率,无论是30%还是10倍速,所以对人类程序员的需求总量就少了,这些被减少的人其实也是被AI替代了。至于如何用好AI,目前它是孙悟空,你要做的就是唐僧[doge]
试用AI辅助编程的心得

左轻侯 2025.1.14 (注:转发经过作者本人同意,原文发表在网页链接

最近我花了很多时间(每天十个小时以上)试用AI辅助编程,以下是一些心得。

项目是多年前使用PHP+MySQL写的一个简单网站,十几个表,代码量(包括CSS和Javascript)一万多行。所有代码都是手写,除了一个比较小众的js库mootools用于ajax调用,没有使用其他第三方库。自己用PHP实现了比较简单的页面路由,OR mapping和web组件复用。

重构这个网站的目的:分离前后端,完全使用HTML+Javascript渲染页面,PHP只负责提供json形式的ajax接口。这样不但可以集中处理UI而不用考虑后端语言的影响,而且有利于将来切换到其他后端语言和数据库。同样,不使用任何第三方库。前端完全通过原生HTML和Javascript来实现,后端PHP只有少量修改,主要是定义相应的ajax接口,将数据库的查询结果转变为json对象,还有一部分工作是从PHP5到PHP8的语法升级。

开发工具使用windsurf,购买了pro。我试用了windsurf和cursor,感觉windsurf的chat模式更好用。cursor有一个大的问题,它无法自动打开文件(这很奇怪,但它明确告诉过我),必须我手动在IDE中打开相关文件(但cursor可以修改)。这不排除是我自己配置的问题。但cursor可以自己设置AI模型,windsurf只能选GPT 4o、Claude 3.5 Sonnet和Cascade Base(不知道具体是基于什么模型),我选择的是Sonnet。

总的来说,AI的表现象一个受过很好教育的初级程序员。基本功扎实,写的代码和文档都很规范,符合一般意义上的best practise,只要给出明确的提示,实现相对简单的算法也没问题。对于语言和相关领域的知识的了解非常准确和完整。例如,我决定使用web component技术实现代码复用,而之前我从没有接触过web component,因此它生成的代码有时候会超出我的知识范围,我理解不了的会让它详细解释,这样变成我向它学习了。我让它创建一些SVG格式的图标,基本也令人满意。当然还有一点,永远情绪稳定,会不厌其烦地解释和修改代码。

它的问题也同样很多:不知道是否因为context大小限制的原因,它对问题的理解限制在一个小的范围之内,而不会主动从更大的范围来考虑。这一点其实非常象缺乏经验的初级程序员。

一个例子是,某个ajax调用应该返回json,实际上却返回了HTML页面。AI debug了很多次,反复修改后端代码,一直不能解决。我不得不手动debug,最后发现后端代码没有问题,根本原因是js提交的request没有设置accept json的请求头。AI没有能够发现这一点,可能是因为本项目和常见的用法(通过单独的API访问路径返回json)不一样。我告诉AI之后,它马上就修正了问题。

另一个例子是,某个场景要弹出一个side bar,并且把当前页面的其他元素变暗。但是有一个元素总是不变暗。AI反复debug之后,发现是因为这个元素设置了一个较高的z-index,于是把该元素的z-index设成9999,把遮罩设为10000,解决了问题。我问它:有什么特别的理由需要为这个元素设置z-index吗?能不能直接把z-index去掉?它说:you are absolutely right,于是去掉z-index而解决了问题。

可以想象,这种“脑容量不足”很容易导致AI在某个牛角尖无限制地越钻越深。事实上这种情况多次发生,AI把很多不相关的代码改得面目全非,最后彻底失控。要避免这种情况,一是在AI每次修改代码之后人工进行仔细review,二是频繁commit,随时准备回滚代码。这样就非常费credit,而windsurf是按credit计费的。

AI有时候会想当然地预设条件。开始的时候,它在生成的页面里面加了一些关于header/footer的引用,导致页面混乱。我问:你的header/footer在哪里?它说:请告诉我哪里可以找到header/footer。我说:还没有创建出来……它说:明白了,我应该在引用header/footer之前先检查它们是否存在……

此外的问题还很多:

Windsurf本身不太稳定,经常出现internal error,占用的内存和CPU很高,往往接近100%。鉴于AI的活动主要在服务器端完成,我不知道这种占用是否合理。

完成比较复杂的任务时,即使提供了非常详细的指令,它也会只完成其中一部分,而无视其他的。这应该也是由于“脑容量不足”。

经常偷偷修改完全不相关的代码,虽然我尽量人工review,但是防不胜防。

debug能力有待加强,经常debug很长时间而不能解决问题,或者解决了一个问题而把其他正常的代码都改坏,只能回滚代码再人工解决。目前AI的debug能力是完全无法依赖的。

Windsurf pro每月15美元,提供500个Prompt credits,另外还可以按10美元300个credit补充购买。但是根本不够用,我一天一夜就能用掉100个。Pro Ultimate提供无限制的credit,每月60美元,也太贵了。目前我尽量使用chatgpt获取具体知识而不是直接问windsurf,简单的修改人工完成,复杂点的debug也人工完成,windsurf主要用于生成代码框架、需求明确的函数,以及某些比较复杂的代码重构。

总的来说,AI辅助编程对于生产力的提升是非常惊人的。因为AI能够在极短的时间内处理大量的代码细节(在传统开发中这些细节往往占据主要的时间成本),我基本以10倍速在工作。但是,由于上述问题,我无法完全依赖AI。为了让代码呈现我想要的样子,我需要非常详细地、反复地描述需求,有时候需要细化到某个函数的输入输出、主要逻辑和算法,还要告诉AI参考哪一部分代码来完成,要尽可能仔细地review代码,提出改进意见(AI的实现往往不是我想要的),在AI失控的时候,还要自己动手修正bug。这也很象是资深程序员带着一个新手工作。

另外一个后果是,由于10倍速开发带来的信息量冲击,我其实比传统开发更累。有人说,传统开发是手动档,AI辅助开发是自动档。这可能是对的,但他没有告诉你,这辆自动档车的速度是手动档的10倍,而且操作经常失灵。AI提升生产力是真的,如果说AI将完全取代程序员,目前我还没看到这个可能。

那么,随着技术的进步,上述这些问题是否可以被修正呢?显然,不但稳定性这样的问题肯定会被修正,而且随着AI的“脑容量”越来越大,代码质量肯定会越来越高,debug能力也会越来越强,对问题的理解能力也会越来越全面。目前我仍然尽量review AI生成的代码,但是我相信,用不了多久,大多数AI生成的代码就会不再经过人工review;这不仅是因为AI代码的质量会足够好,也是因为人类的精力根本无法跟上AI的生产效率。

但是,有两项工作,至少是现阶段的AI无法代替人类完成的:一是确定需求。人需要把产品需求非常详细地、没有歧义地描述出来,这个过程没有很多人想象中那么简单;这是开发过程中最复杂的环节,是对现实世界的建模。二是进行技术决策。以本项目为例,由于投入的资源极少,而维护的周期极长,所以不采用流行的前端框架,而选择原生HTML+Javascript,以便尽可能减少维护升级的工作。这两项工作,不但需要技术知识,而且需要对业务逻辑、对现实世界的复杂条件、乃至对人性的理解,在强人工智能出现之前,必须由人来完成。

在这个背景下,人的角色就转变成产品经理+技术架构师,而传统的程序员角色将逐渐消亡。本该如此。(原文:网页链接

#AI##编程##程序员#