听说AI要抢程序员的饭碗我这样的老程序员也想尝试一下AI编程。我用的是一个低码平台使用JSON定义接口使用VueQuasar实现端侧UI客户端本质是一个轻应用容器。都是标准的东西按理应该是很容易用AI自动编程的。希望只要将需求描述清楚就能丢给AI生成一个业务应用这样我就能从繁琐的业务开发中解放出来专注于平台的开发。最初使用ollama本地部署AI折腾了两周发现无法做复杂的工作后面花几十元钱改用阿里巴巴的VibeCoding妙悟。下面简单讲一下过程有兴趣的可以自己去尝试。编程前要先创建一个技能技能中最重要的就是指导文档与例子文档必须是markdown格式越详细越好例子越多越好。因为文档在之前已经完成了80%的样子在线转word为markdown稍微改改就行了还有二十多个完整例子所以大约两天就做完了技能建设。例子对AI技能非常重要我发现AI生成的很多代码是仿照例子实现的。尝试的过程并不复杂提需求就可以尽量逐条列出需求它会逐条完成最终生成一个总结列出它修改过的文件。整个尝试过程有惊喜也有失望。惊喜以最常见的进销存系统为例让妙悟实现一个百万行记录的进销存应用系统。需求提得很粗略前面一句话就是我提的需求但是妙悟仍然完成得很出色。完成的应用有数据库定义、接口定义、UI实现做一些简单的修改后就可以正常运行起来。AI两分钟就能生成一个大致的框架节省了前期一些思考工作。因为本身是低码平台生成的代码人很容易看懂、容易修改。这加强了我对低码平台的信心它能让人更容易跟AI配合工作提升效率。它可能参照了其他进销存系统的功能需求UI设计基本满足我希望具有的功能点。随后人工修改一点错误存入妙悟给它提新的需求妙悟在人工修改的基础上修改人工运行一下再做一些修改……加上人工修改每次耗时大概十来分钟。但是循环几次就到了AI的极限。失望UI实现部分是比较省心的大部分情况提出需求能正确修改当然做不到完全正确特别是用到自实现的组件时就容易出错。接口定义部分就弱很多一些基本特性在文档中有明确的说明例子中也有但是AI仍然无法正确理解尽管能跑起来只要做完整覆盖测试一定会漏洞百出。很多消息说AI编程很强甚至传言Anthropic 80%的代码由AI编写。不知道是我使用的工具有问题还是我的文档写得不够完善总之在使用过程中远远达不到想要的效果。Anthropic难道是纯粹的商业宣传目前会经常用免费的AI工具生成一些成熟的原生代码片段因为网上能搜到人工搜索非常费时AI非常高效也会用AI检视代码库能发现一些设计错误。在实现quickjs的java封装时用kimi解决了不少问题在写代码这块kimi比deepseek强很多而豆包就是个渣时间2026.7。更大规模应用我再等一等。总结前面也提到AI好像有一个极限到了那个极限它就不能再根据要求正确修改了给它提新的需求它就开始颠三倒四的重复错误的修改无法提升必须要人工参与。所以一个应用从无到有前面的速度极快非常省事越到后面越得不到期望的结果。整个过程与完全人工开发时间上大概只有10%的节省节省的主要是应用框架的生成与UI重构。想要完全依赖AI目前还是做不到的希望未来能做到。推测如果是C/C或Java、Rust之类的代码开发一旦达到极限人需要理解AI生成的代码才能再做修改要看懂C、Rust之类的原生代码可能并非易事整体上未必会节省人工。例子片段客户查询接口定义的例子{ name: list, method: GET, property: private, tokenChecker: USER, request: [ {name:page, type:int, must:true, default:1}, {name:pageSize, type:int, must:true, default:20} ], process: [ { name: get_customers, type: rdb, db: inventory, sqls: [ { name: total, multi: false, merge: true, metas: each, sql: select count(*) as total from customers }, { name: list, multi: true, metas: each, sql: select id,name,phone,address,remark from customers order by createAt desc limit {pageSize} offset {CALCULATE|i,({page}-1)*{pageSize}} } ] } ], response: [ {name:total, type:int}, {name:list, type:object, list:true, props:[ {name:id, type:int}, {name:name, type:string}, {name:phone, type:string}, {name:address, type:string}, {name:remark, type:string} ]} ] }UI客户管理的例子export default { inject:[tags,service], data(){return{ customers:[], ctrl:{cur:1,max:0,search:}, showDialog:false, isEdit:false, form:{id:null,name:,phone:,address:,remark:} }}, created(){ this.query(1); }, methods:{ query(pg){ this.ctrl.curpg; var url/api/customer/list?pagepgpageSizethis.service.PAGE_SIZE; request({method:GET,url:url},this.service.name).then(resp{ if(resp.code!RetCode.OK||resp.data.total0){ this.customers[]; this.ctrl.max0; this.ctrl.cur1; return; } this.customersresp.data.list||[]; this.ctrl.maxMath.ceil(resp.data.total/this.service.PAGE_SIZE); }); }, search(){ if(this.ctrl.search){ return; } var url/api/customer/search?keywordencodeURIComponent(this.ctrl.search); request({method:GET,url:url},this.service.name).then(resp{ this.ctrl.max1; if(resp.code!RetCode.OK) { this.customers[]; return; } this.customersresp.data.list||[]; }); }, resetSearch(){ this.ctrl.search; this.query(1); }, showAdd(){ this.isEditfalse; this.form{id:null,name:,phone:,address:,remark:}; this.showDialogtrue; }, editCustomer(row){ this.isEdittrue; this.form{...row}; this.showDialogtrue; }, saveCustomer(){ if(!this.form.name){this.$refs.errMsg.showErr(1,this.tags.pleaseInputCustomerName);return;} var urlthis.isEdit?/api/customer/update:/api/customer/create; var methodthis.isEdit?PUT:POST; request({method:method,url:url,data:this.form},this.service.name).then(resp{ if(resp.code!RetCode.OK){ this.$refs.errMsg.showErr(resp.code,resp.info); return; } this.showDialogfalse; this.query(1); }); }, deleteCustomer(id){ request({method:DELETE,url:/api/customer/delete?idid},this.service.name).then(resp{ if(resp.code!RetCode.OK){ this.$refs.errMsg.showErr(resp.code,resp.info); return; } this.query(this.ctrl.cur); }); } }, template: q-layout viewlHh lpr lFf container styleheight:100vh q-header elevated classbg-primary text-white q-toolbar q-btn flat iconarrow_back click$router.push(/home)/q-btn q-toolbar-title{{tags.customers}}/q-toolbar-title /q-toolbar /q-header q-footer classbg-white q-pa-md q-input outlined v-modelctrl.search :labeltags.search dense keyup.entersearch template v-slot:append q-icon v-ifctrl.search! nameclose clickresetSearch classcursor-pointer/q-icon q-icon namesearch clicksearch/q-icon /template template v-slot:after q-btn round colorprimary iconadd_circle clickshowAdd/q-btn /template /q-input /q-footer q-page-container q-page padding q-table :rowscustomers :columns[ {name:name,label:tags.customerName,field:name}, {name:phone,label:tags.phone,field:phone}, {name:address,label:tags.address,field:address}, {name:action,label:tags.operation,field:action} ] row-keyid flat hide-bottom template v-slot:body-cell-actionprops q-td :propsprops q-btn flat dense colorprimary iconedit clickeditCustomer(props.row)/q-btn q-btn flat dense colornegative icondelete clickdeleteCustomer(props.row.id)/q-btn /q-td /template /q-table div classq-pa-sm flex flex-center v-ifctrl.max1 q-pagination v-modelctrl.cur colorprimary :maxctrl.max max-pages10 boundary-numbersfalse update:model-valuequery/q-pagination /div q-dialog v-modelshowDialog persistent q-card stylemin-width:400px q-card-sectiondiv classtext-h6{{isEdit?tags.editCustomer:tags.addCustomer}}/div/q-card-section q-card-section classq-pt-none q-input v-modelform.name :labeltags.customerName outlined dense classq-mb-sm/q-input q-input v-modelform.phone :labeltags.phone outlined dense classq-mb-sm/q-input q-input v-modelform.address :labeltags.address outlined dense classq-mb-sm typetextarea/q-input q-input v-modelform.remark :labeltags.remark outlined dense typetextarea/q-input /q-card-section q-card-actions alignright q-btn flat :labeltags.cancel colorgrey-7 v-close-popup/q-btn q-btn unelevated :labeltags.save colorprimary clicksaveCustomer/q-btn /q-card-actions /q-card /q-dialog component-alert-dialog referrMsg/component-alert-dialog /q-page /q-page-container /q-layout }