软件架构的洋葱和六边形,可能只是换了个马甲的“老中医”

一位程序员的灵魂觉醒:他花了一个月研究“洋葱”和“六边形”架构,结果发现这些听着高大上的东西,核心思想其实就是“依赖倒置”和“面向接口编程”这两个老祖宗早就玩剩下的。他犀利地指出,这不过是一场“新瓶装旧酒”的学术营销,把简单的东西包装得神乎其神,就为了卖课卖书。文章用幽默吐槽的方式,拆穿了这些架构神话,让你看完只想说:“就这?!”


哥们儿我,花了整整一个月,感觉自己被一群架构大师组团给“忽悠”了

事情是这样的,最近我不是想提升一下自己嘛,就寻思着研究研究那些听起来巨牛掰的软件架构,什么洋葱架构、六边形架构、整洁架构,一个个名字听着就跟科幻大片里的终极武器似的。我心说,这要是学会了,那不得在公司里横着走,代码写得飞起,让产品经理和测试都跪下来唱《征服》?

结果呢?一个月过去了,我非但没飞起来,反而感觉自己掉进了一个巨大的语言陷阱,一个由各种术语、概念和大师们精心包装的“知识迷宫”里。我现在的感觉,就像是被几个老教授拉进了一个小黑屋,他们在我面前摆弄着一堆闪闪发亮的模型,嘴里念叨着“端口”、“适配器”、“核心领域”,然后一脸神秘地问我:“年轻人,你悟了吗?”我悟个屁!我只想掀桌子问一句:你们说的这些玩意儿,跟我十年前写的分层架构,到底有啥本质区别?

这帮大师,我觉得他们就是合伙儿在逗我们玩儿呢。你看看那些文章,读起来简直痛苦,比背英语单词还难受。同一个意思,今天叫“端口”,明天叫“边界”,后天又叫“接口”,让你不翻个七八篇解释文章,根本不知道他们在说啥。这就好比,你妈明明叫你“儿子”就行,她非要在不同场合给你换名字,吃饭时叫你“食客”,写作业时叫你“学者”,挨骂时叫你“逆子”,你说这谁受得了?

而且,他们还总爱说分层架构是个“大泥球”,不高级,容易乱。然后转头就推出自己的“六边形架构”或者“洋葱架构”,说这才是未来的方向。但你仔细一琢磨,这“六边形”和“洋葱”它不也是分层的吗?你把洋葱剥开,一层一层的,跟蛋糕有啥区别?我要是能写一个程序,不用分层,还能跑得流畅、维护方便,我估计诺贝尔奖都得给我颁一个,可惜我没那本事。所以,分层它本身不是原罪,是你自己把代码写成了大泥球,然后怪人家“分层架构”这双鞋不好,非要去买双叫“六边形”的新鞋,这不扯呢嘛!

说到底,这些大师们教来教去,核心就那么三板斧,全是老祖宗玩剩下的

我这一个月也不是白费功夫,我把那些绕来绕去的文章都拆解了,最后发现,他们所谓划时代的架构,说白了就是三个核心思想在反复炒冷饭。

第一,依赖倒置原则,听着唬人吧?翻译成人话就是:别让你的高层模块(比如业务逻辑)死盯着低层模块(比如数据库操作),你得让它们俩都去盯着一个抽象的东西(比如一个接口)。这样一来,以后你想换数据库,或者想换个API,就不动核心代码,换个“插头”就行。

第二,面向接口编程,这更简单,就是不要把你的代码写死了,要留个“插口”。你今天用MySQL,就写个MySQL的“插头”,明天想换PostgreSQL,再写个新的“插头”插上去,原来的业务逻辑纹丝不动。

第三,层隔离,意思就是各干各的,别越界。展示层就管展示,业务层就管业务,数据层就管数据,谁也别想跳过中间层直接去打扰对方。

就这三板斧,听着是不是特耳熟?我翻遍了我的书架,1994年的《设计模式》(GoF),1996年提出的“依赖倒置原则”(DIP),还有从上世纪八九十年代就开始流传的“核心隔离”这种OOP实践,人家书里写得清清楚楚。这就像你过年回家,你爷爷跟你讲怎么种地,说“春种秋收,要施底肥,要勤锄草”,结果你跑出去听了个讲座,回来兴奋地跟爷爷说:“爷爷,我学到一个颠覆性的农业革命!叫‘时序资源分配与土壤养分循环系统’!”爷爷不拿拐棍打你才怪。

一个灵魂拷问:如果我偷偷给分层架构做个“微创手术”,它会不会变成六边形?

我这个人比较轴,想不通的事就爱钻牛角尖。我就琢磨,这帮大师天天说分层架构不行,可他们的“六边形”不也是分层吗?区别在哪儿呢?

于是,我偷偷做了个实验。我就拿一个最普通的分层架构项目,按照DDD(领域驱动设计)的方法把业务逻辑好好分一分,确保每一层都严格隔离,再使用依赖倒置,让所有依赖的方向都指向最核心的业务层。做完这些,我连文件夹名字都没改,还是叫ControllerServiceRepository。请问,我现在这个项目,它算分层架构,还是算六边形架构?

你们那些大师别想着糊弄我,说什么“这不是名字的问题,是依赖方向的问题”。行啊,那我现在依赖方向也改了,和你们画的六边形图一模一样,所有的箭头都指向中间的“核心”。那么请问,我还需要把文件夹名字也改了,改成PortAdapterCore,才算正式加入你们“六边形俱乐部”吗?

这让我想起一个笑话,说是一帮城里人去乡下买了个老房子,结果他们觉得“杂物间”这个名字太土,于是改名叫“落尘区体验馆”;觉得“厨房”太俗,改名叫“分子料理热能实验室”;觉得“厕所”不够雅致,改名叫“私密静思空间”。然后逢人就说,他们买了一栋充满现代设计感的“生态人居”。这跟那些给旧架构换新名字、画新图的“大师”们,是不是一个味儿?

别跟我扯什么六边形、洋葱,打开代码一看,不还是接口和实现类吗?

你让这些大师把他们的“六边形架构”或者“洋葱架构”的代码拿给我看看,我不看项目结构图,我就看代码本身。你能从代码里找到一个六边形吗?能找到一个洋葱圈吗?找不到吧?代码里有的,还是那些东西:interface(接口)、class(类)、public(公开)、private(私有)、package(包)。只不过他们把接口叫成了“端口”,把接口的实现类叫成了“适配器”,把核心业务逻辑包叫成了“领域”。

你把接口改名“端口”,它就不是接口了?你把实现类改名“适配器”,它就不是实现类了?这跟我把“白开水”改名叫“液态无色H₂O分子饮品”,然后就卖你五十块钱一杯,有什么区别?

我甚至怀疑,这些大师写文章的时候,是不是都有个潜规则。文章的开头,一定得把一个简单问题说得云里雾里,让你觉得,天呐,我智商是不是不够用,怎么连标题都看不懂。文章中间,一定得创造出几个你不认识的词,让你觉得,哇,这里面学问好深,以前学的都是皮毛。文章的结尾,也一定是高度统一的,那就是:“想彻底搞明白?快来报名我的付费课程吧!只要九九八,架构大师带回家!”

学术圈那点事儿,我有个教授朋友,他的论文高产秘诀就是“旧酒换新瓶”

我有个朋友,是个大学教授,在学术圈里混得风生水起,论文发得那叫一个快,质量嘛,咱不好说,但数量绝对是杠杠的。我很好奇,问他哪儿来那么多新概念、新术语可以写。他倒是诚实,一脸无所谓地跟我说:“嗨,哪有什么新发现,我就是把别人研究过的东西,换个新名字,重新包装一下,就是一篇新论文了。”

你看看,是不是跟咱们看到的这些架构文章一模一样?这就是他们的核心玩法:把“依赖倒置”包装成“六边形”,把“接口隔离”包装成“端口与适配器”,把“模块化”包装成“洋葱”。最后,一个“革命性”的“新架构”就诞生了。

他们为什么这么做?因为只有这样,才能在学术圈和商业圈里混下去啊!你要是一直说“咱们就搞分层架构,再用用设计模式”,那谁还来请你写书、讲课、做咨询?只有不断地创造新词、新概念,把原本简单的东西复杂化,让程序员们永远觉得自己学得不够,这样才能建立起一个巨大的“焦虑产业链”。你今天学完了“六边形”,明天他发明个“太极图架构”,后天再整个“莫比乌斯环架构”,你学得完吗?

所以,咱们该怎么办?啥也不办,该吃吃,该喝喝,擦亮眼睛就行

我知道,看到这儿,你可能跟我一样,内心有点小愤怒,觉得被这些大师当傻子耍了。但愤怒完了呢?是去网上骂街,还是去他们课程下面刷差评?其实都没用。

“洋葱架构”、“六边形架构”这些名字已经像病毒一样传播开了,成了一个通用的“黑话”。你跟同事说“端口与适配器”,大家都懂,都知道你要做什么。你要是非较真说“这不就是分层架构加个依赖倒置嘛”,大家可能还会觉得你有点“不上道”,不懂得与时俱进的“先进理念”。

这就像你非要跟人说“太阳不是从东边升起来的,是地球自转造成的”。你说的完全是事实,但大家只会觉得你是个杠精。在技术圈里,语言和共识的力量,有时候比真相还大。

所以,我的结论就是,咱们看清了这场“魔术表演”的本质就行了。以后再看那些讲架构的文章,脑子里自动给它“翻译”一遍,把那些花哨的新词,替换成它最朴素、最原始的意思。然后思考一下,它里面提到的核心思想,是不是真的对当前项目有用,能不能解决实际问题。

对于那些张嘴闭嘴“我们用的是先进的六边形架构,所以很牛”的人,你就在心里呵呵一笑,默默打开他们的代码,看看里面有没有一个六边形,或者一个洋葱圈。

我最后悔的,就是花了整整一个月的时间去追根究底。不过也好,至少现在我练出了一双火眼金睛。以后再看到什么号称“颠覆性”、“革命性”的新玩意儿,我第一反应不会是“赶紧学”,而是先闻闻,看它身上是不是有股熟悉的“老酒味”。然后,再抬头看看文章末尾,那个熟悉的“付费链接”是不是还在老地方。