Featured image of post 我在6个项目中实践的整洁架构优化AI生成代码

我在6个项目中实践的整洁架构优化AI生成代码

本文分享了如何将整洁架构与AI代码生成相结合,通过在6个实际项目中的实践经验,解决AI生成代码不稳定的问题,为中大型项目提供更可靠高效的开发方案。

开篇

大家好,我是 Kirk Lin,一个始终追求在代码中注入艺术灵魂和人文关怀的工程师。我始终铭记:完美是永无止境的追求,而创造更美好的世界,是我们每个人的责任与机遇。

今天,我想通过这篇文章,和大家分享我的学习与实践之旅——从初识整洁架构(Clean Architecture),到见证人工智能(AI)技术的崛起为代码生成带来全新可能性,再到最终将两者结合,解决开发中的实际难题。这一路走来,有迷茫、有顿悟,也有不少收获。我希望这些经历能给你带来点启发,也欢迎你和我一起探讨,咱们在代码的世界里共同成长。

我的故事始于几年前对整洁架构的认识。那时候,我开始关注如何通过清晰的架构设计让代码更易维护、更具扩展性,这让我逐渐沉浸于整洁架构的世界。后来,AI技术的飞速发展又给我打开了一扇新窗:代码生成变得更快、更智能。但我很快发现,AI生成的代码虽然高效,却常常不够稳定,bug频出。这让我开始思考:如何在AI的助力下,依然保持代码的高质量?

作为最早研究和实践将AI与整洁架构结合的开发者之一,我尝试提出了一种融合两者的方法。通过将整洁架构的层次化设计理念与AI技术相结合,我不仅解决了AI生成代码的"不稳定"难题,还为中大型项目提供了一种更可靠、更高效的开发方案。这一方法经过多个项目的实践验证,证明了它的可行性与价值。接下来,我会从我的经历讲起,带你看看我是怎么一步步走到今天的,也为后续的系列文章铺个路。

初入职场,MVC让我欲哭无泪

2022年,我刚进入一家小公司,接手了一个已经迭代了10年的大型政府项目,用的还是经典的MVC架构(Model-View-Controller,模型-视图-控制器)。刚来的时候,我还挺开心,毕竟MVC是大学里学过的老朋友,结构简单明了:Model管数据,View管界面,Controller管逻辑,教科书上不都这么教吗?

但现实很快给了我一记重拳。入职后,我在整整一年时间里不停往这个项目上迭代新功能。表面上看,一切还算正常,可实际上,代码简直耦合得一塌糊涂啊,更糟的是,文档几乎没有——老员工走了好几波,留下的代码就像一座无人清理的"屎山"。我每天打开代码库都在"屎里淘金",完全不知道从哪儿下手。

比如,有一次我要改一个简单的表单功能,本以为很简单,结果发现Controller不仅要解析请求、返回结果,还得做一堆用户校验和数据转换;Service层呢,本该专注业务逻辑,却塞满了数据库查询、缓存操作,甚至还有直接操作HTTP session的代码。Model层也好不到哪儿去,里面不仅有数据库表映射,还混着各种业务规则。结果一个功能改下来,Controller、Service、Model三层都得动,牵一发而动全身。修bug修到凌晨是家常便饭,真的很累。

MVC的痛点:你是不是也有同感?

那段时间,我开始总结MVC在我们项目里的问题。虽然有Controller和Service层,但这些"分层"只是表面功夫,实际问题一点没少。我归纳了几个最扎心的痛点,大家看看有没有共鸣:

  1. Service层啥都干 Service层本该专注业务逻辑,但实际上,它既管数据库,又管校验,还管外部调用,成了个"大杂烩"。结果Controller和Service都乱七八糟,谁也救不了谁。
  2. 数据库绑架一切 项目从数据库设计出发,Model直接映射表结构,Service里全是CRUD操作,业务逻辑被技术细节绑得死死的。举个例子,有次产品经理说要改个字段名,我一看,牵涉到几十个文件,从数据库到前端全得动,改完人都虚了。
  3. 测试和扩展成噩梦 耦合太深,单元测试写不下去,改个小功能都得手动测一遍。新需求来了,只能硬着头皮在老代码上打补丁,越补越乱,最后连自己都看不懂写了啥。

这些问题让我意识到,MVC虽然简单,但在复杂项目里根本扛不住。那时候我常跟同事吐槽这项目也太屎山了,但是大家只是苦笑,谁也没辙。可我心里不甘啊,总觉得应该有更好的办法。

发现整洁架构

就在我快要崩溃的时候,2022年底的一次技术分享会给了我灵感。会上,一个前辈提到了整洁架构,他说:“这东西通过关注点分离和依赖反转,能让代码更清晰、更容易维护。“他还提到,业务逻辑应该独立出来,不被数据库、框架这些"外部细节"绑架。我当时就觉得,这不就是我想要的嘛?

会后,我立马下单了Robert C. Martin(大家都叫他Bob大叔)的《Clean Architecture》啃了好几遍。一开始读的时候,我有点懵。书里讲了一堆概念,什么"实体层"“用例层”,还有一堆圆圈图,看得我头晕。但我没放弃,反复读了几遍,慢慢摸到了一点门道。几个核心想法特别打动我:

  • 业务逻辑独立:不管用什么框架、什么数据库,业务逻辑都应该是核心,独立存在。
  • 依赖反转:通过接口让高层(业务)依赖低层(细节)的抽象,而不是直接依赖具体实现。
  • 关注点分离:每一层只干自己的事,互不干扰。

所以整洁架构的核心思想其实很简单:**把系统分成几个独立的层次,让每一层只关心自己的事,彼此通过抽象接口沟通,而不是直接依赖具体实现。而Bob大叔那句“框架是细节,业务才是王道”**让我醍醐灌顶。回想我们项目,数据库、Web框架这些东西把代码绑得死死的,要是升级个框架大版本或者改个数据库,都得大动干戈,根本改不完。如果能把业务逻辑抽出来,独立于这些"细节”,那得多省心啊!

整洁架构的"四层模型”

为了搞懂整洁架构,我花了好几周时间啃书、查资料,在网上看了不少教程,还在笔记本上画了好几页图。慢慢地,我梳理出了它的经典结构,也就是"四层模型":

  1. 实体层(Entities):放核心业务实体,比如"订单"“用户"这些概念,跟具体技术无关,纯粹是业务的核心。比如一个订单实体,可能只有编号、金额、状态这些字段,不管你是用Java写的还是TS写的逻辑上都一样。
  2. 用例层(Use Cases):这一层放具体的业务逻辑,定义系统要干啥。比如"创建订单"“支付订单”,这些具体的操作都在这儿写。它的任务是把实体用起来,完成一个个业务目标。
  3. 接口适配器层(Interface Adapters):这层负责把用例层的东西翻译给外部世界,比如把数据塞进数据库,或者展示到界面上。用例层只管"我要存”,不管"怎么存"。
  4. 框架与驱动层(Frameworks & Drivers):最外层,放具体的工具和技术,比如数据库、Web框架、UI库。它是最容易换的部分。

这四层有个关键原则:依赖方向从外向内。也就是说,外层可以依赖内层,但内层不能依赖外层。比如,用例层不care你是用MySQL还是MongoDB,也不care你是Web界面还是命令行,只要接口定义好,外面爱咋实现咋实现。

我越琢磨越觉得这东西妙,觉得这玩意儿简直是为我们这种"屎山项目"量身定做的。它就像一个超级整理术,能把乱七八糟的代码分门别类装进抽屉,想改哪儿就改哪儿,再也不用担心牵一发而动全身了。

小项目实践

光看书没用,为了更深入理解整洁架构,我开始在业余时间写小项目。一个是Todo应用,一个是简易博客系统,全都用整洁架构来实现。比如Todo应用,我是这么分的:

  • 实体:Task,只管标题、状态这些核心属性。
  • 用例:CreateTaskUseCase,负责创建任务的逻辑,比如检查标题是否为空。
  • 接口:TaskRepository,定义"存任务"“取任务"这些方法。
  • 适配器:MySQLTaskRepository,用SQL实现具体的存储逻辑。
  • Controller:接收HTTP请求,调用用例层完事儿。

实践下来,我发现整洁架构是真的香。比如我想加个"任务优先级"功能,只需要在实体和用例层加点代码,数据库操作完全不用动,扩展性好得不行。换成以前的MVC,我得从Controller到Service再到数据库全改一遍,累死不说,还容易出错。慢慢地,我对整洁架构的理解也更深了,开始体会到它"分层"和"隔离"的妙处。

痛苦的尝试:从理论到实践

有了点信心后,我决定在项目里试试整洁架构。考虑到政府项目的复杂性,我先挑了个相对独立的小模块来重构。结果呢?过程比我想象的痛苦多了:

  • 老代码的坑:代码耦合太深,拆分时经常出错,我得花大量时间理清依赖。有时候改着改着就懵了。
  • 同事一脸问号:团队里的人看我加了这么多层,觉得"太麻烦”,有人甚至问:“这不就是多此一举吗?“我只好耐着性子解释,还开了几次小会讲原理。
  • 我自己也迷糊:刚上手时,我也没完全吃透整洁架构,实践时走了不少弯路。比如用例层写得太臃肿,接口定义得乱七八糟,改了几版才像样。得亏是B端项目。

有好几次,我都想放弃,心想:“MVC虽然乱,好歹能跑,整洁架构这么折腾值吗?“但我咬牙坚持下去了,边改边学,慢慢有点感觉了。重构完后,我发现改bug轻松多了,测试也好写了。虽然过程痛苦,但结果让我看到了希望。加点小功能我直接在用例层改几行就搞定,数据库和Controller都不用碰。以前这种问题,我得翻遍三层代码,修完还得测半天。

用"整理术"讲整洁架构

说到整洁架构,我还想起了日本的"整理术”。有一次我偶然翻到一本《怦然心动的人生整理魔法》,作者近藤麻理惠讲了个简单的道理:收拾房间不是为了扔东西,而是让每件东西找到自己的位置,用的时候一拿就到,家里干干净净,心情也舒畅。我读着读着,突然觉得这不就是整洁架构的精髓吗?代码也像房间一样,乱糟糟的时候让人头疼,可要是收拾得井井有条,改起来就跟玩儿似的。

那段时间,我刚从公司项目的"屎山代码"里挣扎出来,脑子里全是MVC的痛苦回忆。整洁架构的概念虽然让我有点眉目,但总觉得还差点儿啥。看了这本书,我灵光一闪,把整洁架构的"四层模型"跟整理术联系起来,瞬间觉得亲切了不少。我试着用自己的话,把它讲得接地气一点:

  • 实体层:就像你家里的"核心物品”,比如衣服、书这些最基本的东西。不管你用什么柜子装,它们还是那些东西,独立又纯粹。
  • 用例层:像是"使用场景”,定义这些东西怎么用。比如"穿衣服出门"是个场景,不管是用衣架挂还是叠在抽屉里,穿的过程不会变。
  • 接口适配器层:好比"收纳盒”,负责把东西装起来。你可以用木盒子,也可以用塑料箱,盒子换了,里面的东西还是那些。
  • 框架与驱动层:就是"外部环境",比如房间的电源插座、窗户这些外围设施。插座坏了换一个,屋里的东西照用不误。

这么一比喻,我突然明白了整洁架构的妙处:它不是让你把代码扔了重写,而是给每块代码找个合适的位置,分门别类放好。以后改代码就像找衣服,打开衣柜一目了然,不用翻箱倒柜。

个人成长:从修bug到带团队

回想这一路的经历,我的变化真的挺大。刚入职那会儿,我就像个"修bug机器",每天埋头在代码堆里,被项目拖着走。面对那堆乱糟糟的代码,我心里只有两个字:头疼。那时候的我,完全没想过抬头看看远处,总觉得能把眼前的bug修好就不错了。

可慢慢地,我开始不满足于这种状态。接触整洁架构后,我像是打开了一扇窗,不再只是被动地修修补补,而是主动去琢磨:怎么才能让代码更好?怎么才能少加点班?这种转变让我整个人都活泛起来。到了后来,我不只是自己折腾,还开始带着团队一起往前走。

带团队的日子让我印象特别深。刚开始,我还是个独行侠,习惯一个人闷头干活。可后来发现,一个人的力量太有限,大项目得靠大家一起跑。我从围着数据库和框架打转,写出一堆机器都能嫌弃的代码,变成了先想清楚业务要干啥,再用技术去落地。带着同事们一起改代码、聊思路,看着他们从"这是啥玩意儿"的疑惑,到"嘿,这还真行"的认可,我心里挺满足的。

这过程让我明白,技术只是个起点,真正厉害的是思路和协作。以前,我是被技术推着走,忙得像个陀螺;现在,我学会了驾驭它,把脑子里的想法变成现实。这种成长,比写出一堆代码更让我骄傲。它让我从一个只会低头修bug的小白,变成了能抬头看路、带人前行的工程师。

下一步的计划

在这些项目里,我不仅打磨了整洁架构,还赶上了AI技术的热潮。AI生成代码的速度让我惊叹,但质量却让我头疼——代码虽然快,却常常乱糟糟,bug一堆。这让我开始思考:能不能把整洁架构的经验和AI结合起来?

经过多次尝试,我找到了一条路:用整洁架构的层次化思路约束AI生成代码。6-7个项目里,我反复验证了这套方法的可行性。结果呢?AI的效率加上整洁架构的规范,让开发既快又稳,中大型项目也能轻松驾驭。这套融合方案成了我这些年最大的收获之一。

现在,我决定把这些经验写成系列文章,和大家分享。从整洁架构的实践,到AI的融合,再到怎么解决实际难题,我会一一讲来。这只是开篇的第一篇,后续还有更多干货等着你。欢迎关注我的后续文章,咱们下篇见!

此外,我开源了一个基于Go语言的整洁架构后端框架 boot-backend-go-clean:https://github.com/kirklin/boot-backend-go-clean,旨在为开发者提供一个AI友好的实践模板。