终极设计:所有业务系统中都只有两个集合

业务系统中只有两个集合
梁山权限引擎最终的设计只有Catalog集和Privilege(Catalog元素二元组集)集这两个集合。Role、Account、Menu、AppSystem、Function等都是Catalog目录森林上的事物。人们之前在存储层反映它们的时候把它们分别放进不同的逻辑表中存储,可是对于数据库来说它们虽然是不同的逻辑表但是数据库进程中也是有个逻辑的Catalog目录树统一了它们。

现在由于99%的权限数据都已经常驻了内存,管理这些权限数据的义务完全落到了权限引擎身上,权限引擎可能需要像数据库那样去考虑问题,磨平Role、Account、Menu、AppSystem、Function等类型的不同,全部纳入Catalog集合,在每一个Catalog元素上留下一个CatalogType字典值(取值、Role、Account、Function、Field等)就可以了。

Catalog集合和由Catalog集合中的元素组成的二元组集合(记为Privilege集合)是所有问题的中心。所有其它模型都是外围的辅助模型。如果最终只留下这两个集合的话,那份代码就可以跨平台跨语言了。因为最终的代码中可能只有Dictionary<string, object>(或者称HashTable)这一种类型,无论是.NET还是Java或者C++或ruby或rust或golang都有这种类型或者自己去实现个这样的类型就可以了。.NET、Java、C++、Rust、Golang等都是技术,而梁山权限引擎是它们之上的业务,把.NET、Java、C++、Rust、Golang仅当作CPU来用的一份代码就是跨平台的了。

Catalog集合相对稳定,由Catalog集合中的元素组成的二元组集合(记为Privilege集合)相对躁动。有静有动就是完备的,丢失不了来自上层或下层的信息。但是麻烦的是如何让安全管理员直观的面向这两个集合呢?权限引擎管理系统得提供一个怎样的图形界面?

主体分神进入三维立体的业务系统中去行走
三维立体的空间结构,安全管理员分神进入系统空间在空间中行走,整个空间是分形的,宏观上到处都一样的。一份安全策略有没有漏洞要能明显的反映出来,如同安全管理员来到一个房间发现房间的墙上有个大洞一样。有那么大一个小偷可以钻进来的洞当然是不安全的。
所有的安全策略都能通过空间的隔离和在空间中的运动来表达。不只是安全策略可以表达成跟现实世界完全一样,所有的业务系统所有的计算机系统也都是可以表达成和显式世界完全一样的。只有隔离的空间和在空间中受控的运动。运动是时间,只有空间和时间,整个世界都是这样的,这样的世界我们熟悉了几百万年,所以我们应该还以同样的模式去熟悉计算机世界。

前端很重要
xml + css描述的那个平面是可以立体起来的,以后它们可能突然间被变现为立体空间,然后人分神进入那些空间中,在里面行走。
前端工程师掌握的那些技术是过时不了的,无论是平面的还是立体的,他们掌握的那些技术不会有什么大的不同。整个计算机世界可能真的跟建筑行业没有什么区别。只不过是烧砖和垒砖的区别,烧砖的并不比垒砖的高级。

前端工程师的工作既抽象又形象,他们左右脑平衡使用和发展;而后端工程师的工作太抽象,太依赖左脑,他们不平衡的发展,到最后可能后端会被这个世界淘汰掉。最终留下的不是后端,而是抽象与形象和谐发展的前端人们。

左脑处理问题时是很费时间的,而右脑处理已知问题的速度是严重的高于左脑的。我们大都是左脑型的人,这也是为什么我们现在能胜任计算机工作的原因,但是我们太依赖左脑,被左脑支配了,这会导致我们在现实世界中运行的很慢,世界中未知的抽象问题会越来越少越来越少,我们的作用必将会越来越小越来越小。

我们过时了
我们的成果已经进入了90后00后10后的世界,环境变了,他们中难以出现对0 1抽象的世界特别感兴趣的人,他们就应该去对更美好的上层世界感兴趣,远离0 1抽象世界。群体考虑问题时的出发点从来跟个体不太一样,我们这些人动用左脑的力量去处理底层0 1抽象世界的问题,等我们把底层问题规整好了,到头来可能是我们自己亲手淘汰了自己。人类群体这个超级生物体造就了我们这一半善于左脑思考的人,让我们去开拓抽象的世界,等我们开拓完了,人类就该淘汰我们了,是我们亲手淘汰了我们。我们的下一代得左右并重起来,再也不要去纠正他要用右手夹菜了。

业务系统中只有两个集合中的那两个集合所对应的分别是空间和时间。

函数式中的Function是一种纯计算单元,是逻辑单元而不是空间单元。Function不影响外部世界,不主动从外部世界中读取任何东西,只从入口处被动的接收东西,不主动往外部世界写任何东西,只被动的往外部世界指定的地点返回东西。一个function纯粹是一个逻辑单元。

而data是空间单元(姑且不要认为1是fn >1,2是fn =>2),data不干任何逻辑上的事情,data是结构,是空间,是分层的空间。空间是一种可以被主体感知到的一定程度上不变的存在。data自己不会主动去做任何变化,data存在的唯一意义是等待把它传入某个function。

function从虚空中虚拟出一个context,function在那个凭空出现的被自己所控的context中对传入的data进行变换,然后function往父世界指定的位置返回一个东西,父世界拿到东西后继续由父function在自己的context中变换那个data。function就是世界,function的调用栈一层套一层一直套下去,所以它也是树。一直套到我们的系统根到达一个人为制造的边界,但是如果你愿意的话还是可以继续套下去的,套到计算机外面去,出现电流的输入与热量的输出……,值得注意的是套的方向有两个:向上和向下,向上到宏观宇宙,向下到微观宇宙。如果我们对这种极端的世界模型妥协一下,把正交的data和function这两个东西按需组合起来,让它俩组成一个个联合的单元,这样的单元被称作object。以上这些逻辑在权限引擎中有用。权限引擎工作时的逻辑与这些逻辑是一致的。

function是时间,data是空间。函数式和OO下面都是集合,是两个集合:时间集合和空间集合,两个集合都是树形的。两棵树是两个正交的维度。由这两个维度出发在局部可以随需增减维度,随需构建一片森林。

权限引擎要干的事情很简单,就是设立两道屏障,防止非法的请求“进出”人类世界。
用一种简单直接明确的模式干这件事情而不再用和业务写在一起的代码干这件事情。它为什么带来了简单直接明确?因为它只有:主体、客体、运动、环境。它只有一个逻辑就是“谁在什么时间什么地点对什么干什么干几次”。