用一个面试故事开始
年初去环普一个电力公司面试,面试官一顿输出。
面试官:怎么看待VibeCoding的
我说:AI辅助是一个非常好的工具,但要说替代,我保留意见
面试官他说Cursor多好,他们团队几个人都在用,页面一键就生成了。
我问:使用AI编程遇到了什么问题,你们怎么解决的?对现有的团队协作和管理模式有啥冲击没?
没音了,可能是我问多了。
后来他说自己是某为待了16年的员工,我也就理解了。
一、媒体带来的焦虑
我自己是深深的被这些言论冲击,这些东西禁不起推敲,说话不严谨。只有躬身入局,自己用AI工具完成一个项目一切焦虑烟消云散了。
1. 语不惊人死不休的营销
语录:软件时代结束,所有中台项目暂停,软件即时生成,日抛,软件工程师这个职业消失。
网络大量的:文科生写出了自己的APP; 一键生成了一个网站 等等
2. 全面唱衰VibeCoding
用VibeCoding会产生电子垃圾,说最苦逼的是面对电子屎山代码的程序员。
二、从0到1体会 Cursor编码
最近使用Cursor从0到1完成一个项目,产品名称:Smartshell。就是WEB版本的Xshell和Navigate+AI。如果你想体验一下功能,访问Smartshell官网 (地址:smartshell.cc )
1. Cursor 刚开始跟傻子一样,慢慢就好起来了
刚开始并不清楚需要设置规则,直接开始编程,因为我并不清楚Cursor能力咋样,也不可能学完所有才去使用,一边用一边学。
确实非常提效,效率是手写代码10倍。 如果到这里,我也是传播焦虑的。任何结论必须是有前提的,否则就是扯淡。提效10倍的前提条件:
- 需求清晰情况下,就剩下堆砌代码了。 对于一些产品一句话需求,就是上帝来了也得摇头,别说一个工具了。
- 架构只能用死板的,不会灵活变通的。比如你给他说用DDD规范代码设计,他会严格按照这个完成。如果你让他搞三层,没问题,很标准。 如果你让他搞六边形架构,同样。 如果你让他实现DDD+三层+六边形的融合,不好意思,除非你自己验证过并且将边界和适用条件说清楚。
- 技术方案是已经经过验证的,并完成原型验证的。研发人员对方案局限和边界有清晰的认知。如果一个方案技术人员都不清楚,更别想着Cursor能搞定,Cursor默认给你的方案根本只是学校课程设计级别的。比如实现堡垒机Linux黑屏命令识别功能,就算资深专家也得补丁摞补丁设计方案,最后也有个识别准确度和拦截率。
- 页面交互不复杂,可描述,且描述简单。
2. 技术方案和功能方案关键点必须描述清楚
用Smartshell中黑屏实现举例,SmartShell项目介绍和试用系统
页面效果:
黑屏技术实现:
Promote提示词(简化,可用)
技术组件:前端使用XtermJS组件,后端用Websocket对接前端Xterm的数据流;使用Apache SSHD连接 Linux系统;中间使用线程进行流的转接,线程必须使用线程池管理;
连接统一管理,维护一个定时任务,这个定时任务使用服务级,别用Quartz实现,定时任务1min轮训一次,对超过3min么有心跳的连接进行清理。
长连接必备心跳:前端连接Websocket后需要定时30S(这个跟Websocket的超时时间有关系,太频繁是负担)发送一次心跳消息;后端收到心跳消息不进行处理。
命令长度限制:后端Websocket设置IO缓存大小为1K,前端需要设置一次输入后端的命令长度为1000,比如直接复制超过1000个字符的命令需要提示。(有字节和字符区别,写个博客就不较真了)
网络抖动:后端SSH连接 需要在前端Websocket断连后保持3min,如果超过则断连, 为了应对网络抖动不稳定,如果前端Websocket连接断开,则需要进行3次重试,每次间隔15S,超过给页面进行提示。
技术细节,决定页面交互:连接SSH和SFTP连接使用不同的Apache SSHD 的Session对象(否则一个Linux如果没有sftp服务,连接sftp失败 ssh连接也被迫断连,这是sshd组件的问题),连接ssh后让用户手动连接SFTP。
认证和鉴权,连接Websocket耗费资源,如果用户对此用户没有权限控制,则耗费资源。所以在连接Websocket连接前,启动一个startsession http请求进行会话的创建,然后返回token。连接Websocket时直接校验token即可。
……
这些不是一次性说清楚的,但如果不说清楚或者没有做过类似系统,你就不会了解各个组件的局限和注意点,以及这个方案的不足,也就不可能有一键生成。
3. 规则需要积累
刚开始使用,或者后面也会遇到 代码中经常出现log.info(中文日志);直接在代码中硬编码,连个constant 常量都不用的情况。
如果马后炮的管理者会说:为什么前面不设置完备的规则。
因为不可能。
学习是循序渐进的,犯错的过程也是学习的过程。一个开发再怎么熟悉,就算自己写的组件,也不可能完全了解,记得起需要设置的边界。况且面对一个只会Demo示例的框架和组件更没有办法做到,犯错的过程也是学习,熟悉的过程。
规则需要设置到多么细Cursor才不犯这类规范错误。这需要实践过程才能了解的。
三、Cursor是Agent还是工具
无论对一个老板,经理,还是开发。我就问一句话:
问老板:Cursor生成的代码上线出了问题,谁负责?
问责任人:Cursor生成的财务系统代码,不经过人工检查,你敢不敢上线?
责任最终需要落在人身上。就算自动驾驶汽车公司负责,你敢直接撒手不管吗? 这还真有这么煞笔。可Cursor不会给你负责,他只收token的费用。
既然最后还得一个人来负责,那么Cursor就是工具。无论看着Cursor像程序员的代理,主要的代码是由他来写,程序员只是写提示词,但他就是工具。是程序员在利用AI进行编码。
四、必须积极全面拥抱已经到来的AI时代
对老板建议:如果你自己不想自己去写提示词,即不要在纠结AI能否替代程序员,直接去招聘程序员去完成,并且最好是高级程序员。
对管理员建议:AI提效是一定的,用不着吹牛逼给老板,能沉淀出团队使用AI的经验才是最重要的资产。 细节是魔鬼,如果说不说AI对组织的影响,以及底层编码遇到了什么问题,没有沉淀下经验资产,再怎么吹牛逼都算扯淡
对程序员建议:别纠结AI是不是会取代你,积极去拥抱。跳出语言的限制,别说自己就是一个前端,一个后端。AI能将你熟悉的快速实现,如果你不熟悉,不好意思,淘汰的就是你。需要自己底下去好好学习,对一下技术进行调研,以及上手编码,即使你熟悉python,也需要培养手指对语法的肌肉记忆。以及一些架构模式和方法论,Cursor不会主动使用这些架构模式。跳出角色设定,AI可以让你非常容易的做到产品设计,UI设计等,AI会极大的扩展你的能力边界。
五、分享Cursor规则优秀博客
再优秀的博客也没法取代你的经验积累,只有团队中人员经历过使用Cursor这个痛苦的初试过程,才能将这些规则拿来用。
Cursor Rules Response
Awesome Cursor Rules
用了Cursor,却总写出烂代码?试试写个Rules!
从0到1配置cursor规则Java篇:全局(Always Apply)
基于《阿里巴巴 Java 开发手册》扩展的cursor编程约束