软件架构别光盯着设计模式,真正的门道在这儿
模式陷阱
说句实话:如果你在软件开发这行干了几年,肯定遇到过这种场面——架构评审会上,有人掏出一本设计模式手册,跟服务员递菜单似的。“这儿可以用工厂模式,那儿试试策略模式,你们考虑过CQRS吗?”
拜托,这不是架构。这是拿着锤子找钉子。
开发者社区里有句话说得挺扎心的:好的软件架构是从理解问题本身长出来的,而不是把问题硬塞进某个现成的模式框架。最厉害的开发者会先摸清自己的工具、了解要处理的材料,然后按自己的判断来——而不是随手抓个模板,把眼前明摆着的解法给盖住了。
Web 资源满天飞,系统编程架构资料去哪了?
你想学微服务、容器编排、分布式系统?恭喜,你挑都挑不过来。但如果你正在写编译器、嵌入式系统、游戏引擎,或者数据库呢?
那画风可就完全不一样了。
现在网上铺天盖地的“软件架构”内容,其实都是围绕互联网应用场景转的:水平扩展、服务发现、最终一致性,还有大团队协作带来的那些组织问题。这些确实是真问题,但不是所有问题。
对于系统程序员和非Web开发者来说,关注点完全不同。你脑子里转的是:
- 内存布局和访问模式
- 延迟保证和实时约束
- 资源受限的环境
- 正确性要求高时的形式化验证
- 为十年甚至几十年的维护周期做设计,而不是只管下一个迭代
问题是,这类好资料太分散了,而且往往藏在学术论文里,很少直接贴上“架构”标签——明明讲的就是架构那回事。
真正有用的:心智模型而不是模式清单
与其再给你列一串模式,不如聊聊几个真正管用的思考框架,不管你写的是嵌入式C还是企业级Java,都能用上:
1. 先想约束
任何系统都活在约束里:预算、时间、团队规模、性能要求、合规要求。把这些约束摸透了再设计架构,永远比套一个“标准答案”但无视实际情况要强。
2. 数据流是地基
在你开始想类、模块、服务之前,先把数据怎么进来、怎么变、怎么出去搞清楚。把这条线理顺了,架构往往就清晰了——哪些抽象是多余的,哪些是真正少不了的,一目了然。
3. 搞清楚谁负责
谁拥有这份数据?谁可以改这个状态?把这两个问题答清楚,大部分架构乱麻都能避免。系统开始烂,往往就是从“数据所有权”这笔糊涂账开始的。
4. 间接层的代价
每多一层抽象,就多一分调试难度,性能也更难把握。该问的不是“该不该抽象”,而是“我花这个代价换来什么,值不值”。
5. 行为要集中
代码单独拎出来就能看懂,不用同时在脑子里装三个文件,这样的代码才能扛住未来五年的维护。架构搞得让人费脑子,迟早会被简化——而且往往是被那个不懂当初为什么这么设计的人给简化掉。
推荐资料(非Web向)
想提升架构思维,又不想一头扎进互联网那套模式里,可以看看这些:
《软件设计哲学》John Ousterhout 著 — 讲软件复杂度管理讲得最清楚的书之一。不挑语言,干货满满。
操作系统和分布式系统的学术论文 — 特别是微服务概念流行之前的那些。文件系统设计的论文里,藏着的架构智慧用在别处照样灵。
读优秀系统的源码 — 听起来是老生常谈,但真能系统性地去读的人不多。看看数据库、编译器、那些工程做得好的开源项目是怎么解决难题的,比看十本模式书都有用。
科学背后的艺术
说个不太中听的事实:软件架构艺术成分比科学成分大,而且这事儿不会变。
聊原则和经验法则可以,量化耦合度和内聚度也可以,画模型画图表都行。但说到底,架构反映的是做决定的人的判断力——他们能不能把问题看清楚,以前踩过哪些坑,做取舍的时候是不是真的在服务实际需求,而不是在追求理论上的完美。
真正能做出好系统的开发者,有个共同点:他们对问题领域本身充满好奇,而不只是对技术感兴趣。他们先问“这事儿难在哪儿”,而不是“先用什么模式”。
从这儿开始。把自己的问题吃透。解法会自己浮出来的。要是有人跟你吹某个模式就是架构,问问他这模式解决的是什么问题——那个问题在你的系统里真的存在吗?