软件为什么会慢慢长成今天这个样子?
最近重新翻了一些以前接触过的企业软件,忽然发现一个以前没有认真想过的问题。
为什么很多完全不同的软件,最后都会长得越来越像?
这里说的不像,并不是界面,而是它们背后的设计。
例如,几乎所有企业软件最后都会出现 Group、Role、Project、Team、Namespace、Owner 这些概念。权限越来越复杂,组织越来越复杂,配置越来越多。很多人觉得这是软件越来越臃肿了,但如果把时间拉长一点,会发现事情可能没有这么简单。
真正发生变化的,也许不是软件,而是软件所面对的世界。
例如最早接触企业目录服务的时候,会觉得 Group 就只是一个功能,方便管理员批量授权而已。后来接触越来越多的平台之后发现,不管是代码平台、容器平台、权限平台,还是各种企业应用,都在不断重复出现类似的设计。
于是开始换一个问题。
为什么企业软件最后几乎都会出现 Group?
如果答案只是”方便管理”,那其实什么都没有解释。
继续往下问。
为什么需要方便管理?
因为人越来越多。
为什么人多了就一定要 Group?
因为人一直在变化。
有人入职,有人离职,有人调岗,有人临时加入项目,有人又退出项目。如果所有权限都直接绑定在人身上,那么每天都会有大量配置发生变化。
软件其实只是选择了一种成本更低的表达方式。
它没有去解决人的变化,而是把变化放到了另一层。
所以,Group 更像是一种对组织变化的适应,而不是一个单纯的软件功能。
继续往下看,又会发现另一个现象。
以前总觉得权限应该绑定到角色。
开发。
测试。
运维。
产品。
后来发现,角色本身也开始越来越不稳定。
现在一个人同时承担几个角色已经很正常。
参与多个项目、负责多个系统、既是 Reviewer,又是 OnCall,还可能兼顾平台建设或者 AI 项目。职位名称越来越多,也越来越容易变化。
如果继续围绕 Role 去设计系统,很快又会遇到新的问题。
于是越来越多的软件开始出现 Policy、Attribute、Relationship 等新的表达方式。
一开始觉得这是权限模型升级了。
后来慢慢发现,也许真正升级的是组织,而不是权限模型。
软件只是被迫跟着一起演化。
类似的现象,其实很多年前就在不同领域反复出现过。
十多年前,监控系统曾经讨论过一个问题:监控对象到底应该按照树状结构组织,还是按照标签组织?
树状结构最大的优点是直观。
机房下面是机柜,机柜下面是服务器,服务器下面是应用,一层一层展开,人很容易理解,也方便浏览。
标签则完全是另一种思路。
同一台机器可以同时拥有多个属性:数据库、生产环境、支付业务、高优先级……查询和组合会更加灵活,也更适合不断变化的系统。
当时很多人认为,标签会逐渐取代树。
但真正实践之后,事情并没有那么简单。
标签最大的难点,并不在技术,而是在语义。
“MySQL”是不是数据库?
“生产”和”线上”是不是同一个概念?
“支付”和”金融”应该是什么关系?
不同的人会给出不同的答案。
标签越自由,维护成本反而越高,最后又不得不制定新的规范。
回过头来看,这并不是树和标签谁更先进的问题。
树擅长表达稳定的层级关系。
标签擅长表达不断增加的新维度。
它们解决的,其实不是同一个问题。
有意思的是,这种现象不仅出现在监控系统。
写博客也是一样。
很多博客系统同时提供”分类”和”标签”。
分类更像一棵树,适合建立稳定的知识结构;标签更像一张网,用来表达文章之间不同维度的联系。
曾经也有人讨论过,是不是只保留标签就足够了,或者只保留分类就可以了。
最后,大多数系统都没有选择其中一种,而是把两者保留了下来。
今天再去看 Kubernetes 的 Label、GitLab 的 Label、Grafana 的 Tag、对象存储的 Metadata,甚至 AI 知识库里的各种 Metadata,会发现它们都在解决同一种问题:如何在稳定结构之外,再表达不断增长的新关系。
类似的现象还有很多。
小时候理解组织架构,总觉得企业就是一棵树。
部门下面是小组,小组下面是员工。
后来参与的平台越来越多,会发现真实世界根本不是这样。
同一个人在不同系统里,拥有完全不同的身份。
在人力系统里属于某个部门。
在代码平台里维护几个仓库。
在项目系统里负责不同产品。
在值班系统里承担 OnCall。
在权限系统里又属于另外几个 Group。
这些关系彼此独立,却又共同描述着同一个人。
这时候再回头看很多软件,会发现越来越多的产品开始弱化”树”,而强化”关系”。
软件并不是突然喜欢图结构了。
而是现实世界本来就越来越像一张不断变化的网络。
想到这里,忽然觉得,以前研究软件时,关注点可能放错了。
以前总是在研究:
为什么 Kubernetes 这样设计?
为什么 GitOps 会流行?
为什么 Platform Engineering 会出现?
这些问题当然值得讨论。
但还有另外一个问题,也许更加值得花时间。
到底是什么发生了变化,才让软件不得不变成今天这样?
如果组织没有变化,很多今天看起来理所当然的软件设计,也许根本不会出现。
如果协作方式没有变化,平台工程可能也不会成为今天的热点。
如果研发规模没有变化,GitOps、值班平台、权限模型,很多东西可能都不会演化到今天这个样子。
这样想之后,再去看软件,好像就多了一个新的角度。
以前研究的是软件。
现在更想研究软件为什么会变化。
软件只是结果。
组织、协作方式、人与人之间关系的变化,可能才是真正的原因。
所以最近开始尝试用另外一种方式看待各种产品。
不是先研究它有哪些功能,而是先观察它解决了什么变化。
不是先比较不同产品的优缺点,而是先思考为什么不同产品最后会收敛到相似的设计。
如果这种观察继续积累下去,也许以后讨论一个产品的时候,可以少问一点”怎么实现”,多问一点”为什么会演化成这样”。
因为真正值得留下来的,也许不是某一个软件的最佳实践。
而是那些在不同产品、不同组织、不同年代里,一直反复出现的规律。
这些规律,不一定只属于 DevOps,也不一定只属于企业软件。
它们可能同样存在于平台工程、AI Agent,甚至未来还没有出现的新系统里。
软件一直在变化。
真正有意思的,也许不是变化本身,而是推动变化的力量。
或许下一次再看到一个新的软件,不妨先别急着研究它的功能。
先问自己一个问题:
它到底在适应什么样的变化?
也许,从这个问题开始,比直接打开产品文档更有意思。
夜雨聆风