.. Kenneth Lee 版权所有 2017-2020
:Authors: Kenneth Lee :Version: 1.0
架构的存在性
本文讨论这个问题:架构是否存在?
架构本身就是设计,正如《软件架构编档》(ISBN: 9787302070610)中提到的,架构是“ 架构师眼中的设计”。所以,如果我们说架构不存在,可以认为“架构这个角度的设计没有 特别的设计方法可以加诸其中”,所以增加“架构”这个角度(topic)的设计推演没有意义 。
设计本来就有多个topic,比如你做一个电话交换机,“话务接续”,就是一个设计topic, 电话摘机,拨号,号码匹配,生成出局信号……这个过程,就是一个Topic。实现这个功能, 需要在这个Topic上建立“如果,则,然后……”这样的逻辑。
但一个电话交换机不只是这个逻辑,比如,你还会有“号码管理”这个Topic,它负责给你的 接续流程提供本地和异地的号段管理。它相对独立,但又和“话务接续”有各种交集和关系 。
如此类推:你还有有“话务统计”,“用户板管理”,“日志和告警”,“双机备份和倒换”,“回 音抵消”,“七号信令局点间路由管理”……等等等等,一系列的Topic,每个都会建立相关的 逻辑。这些逻辑就会互相冲突,因此,逻辑本身的管理,就需要一个单独的Topic。这个 Topic的设计,就是“架构”。
如果“架构设计”不存在,就意味着我们在语法和功能之外不需要额外的约束条件。如果你 有这样的约束条件,就说明“架构设计”是存在的。
所以,我现在给出了“架构设计”的定义了,你是否还认为“架构设计”是不存在的呢?
Pattern,UML,DFD确实不是架构,它们是架构工具,是架构语言。这些工具不能用于所有 场合,不表示架构设计不需要或者不存在。
架构设计有特别的设计推演可以加诸其中吗?显然是有的,比如我前面提到的减少熵增, 留下余地;或者基于Topic的多分支设计方法;或者基于“语义”进行设计,而不基于“能跑” 进行设计;等等。都是方法。但这些方法单独提也许太抽象了,所以需要落实到一个个具 体的项目或者场合,到时可能有人就有觉得这个思路缺乏“普适性”了。所以,我们要谈架 构,要不我们都有较多的产品项目经验,要不我们我们就谈具体的情形。
拿一个简单的网卡驱动来做例子。第一个版本上线,也许我只能仅仅支持Linux的napi或者 做Windows NDIS的一对FDO/PDO做polling,打通通讯,适配ethtool,能休眠,能支持一定 程度的RAS和其他可靠性保护的功能。这可能就要1万行左右的代码了。然后要支持10G端口 ,就开始加多队列,GSO,GRO,CSUM,然后要全局优化所有perfech,DMA,mb()的时机, 优化内存的使用(比如根据NUMA距离决定是否复用skb)。好了,现在我基本达到线速10G 了。
然后接着加需求,要支持RoCE和SR-IOV,原来的优化怎么保证?加SR-IOV就要使能IOMMU, 原来的DMA行为就和新的模型不一致了,这个调整要废掉多少过去的工作量?30%的用户使 用4P的系统,另外的用户是用1P还是2P系统我都不知道,DIMM条的插法怎么样的我也不确 定,我原来的NUMA优化是否还有意义?应该怎么调整?
市场上现在同时有1G,10G,插在32位 x86和64位 x86_64的标卡和集成ARM64 SoC的版本了 ,同时支持Windows 8、10,Ubuntu, Redhat, Suse Linux,我的驱动开几个分支?
这不算,硬件下个版本升级,我们升级到40G的端口,支持SmartNIC,ring_buffer直接和 FPGA接口,FPGA和网卡驱动之间如何互斥?原来部署的mb位置怎么保证和这些互斥一致? 而不会导致总线snooping时间延长?40G的网络一个机器根本用不上,然后你要支持VM网络 调度,你如何判断使能OVS还是自己在硬件里实现一样的功能?……
然后现在我们来谈谈Zero Copy Networking特性?……
然后我们来谈谈现在硬件这边再出了一套新的接口?……
没有这种上层逻辑的支持,你就等着天天改程序,投入大量人力还被别人踩在地上磨擦吧 。
所以,不要轻松说什么“不需要架构设计”,这属于站着说话不腰疼,就谈现在这个版本当 然随你怎么说。拉长到两年,拉大到几个市场域,谁负责?到时你又该缩起来,说“我赶着 去编码,不跟你聊了”……
有时会想,软件工程师会忽略架构的存在,就好像很多人会忽略心的存在一样。我们在顺 利的时候讲功能和方法,自以为高明,不顺利的时候讲情怀找理由,认为是环境使然。却 会忽略架构在战略上对自己的支撑,忽略心的感受在所有决策中的输入,活得像个卷积神 经网络。等神经网络普及了,估计会很有挫败感吧;)
补充1:关于活得像卷积神经网络是什么意思
关于卷积神经网络的简单理解,可以参考这里:关于AI的胡说八道
AI的模式识别,其实很像我们人类的直觉:看一千个图像,形成一个Pattern,以后一眼看 过去,觉得这个模式像,那就是那个了。这种模式很容易过拟合(得到的决策系统经得起 所有经验的考验,却错判每个未来),也就是说,你看了两个男人没良心,就说全世界的 男人都没良心了。3个人给你说有老虎,你就觉得有老虎了。这种直觉,或者说抽象能力, 是人最基本的能力,不但人有,估计大部分动物都有。蜻蜓透过它的复眼,看到一只猫, 虽然在它小小的脑子里形成千万个点刺激,它也能在很短的时间内抽象出“猫”这个概念( 不一定是这个名字)。
但我们人类今天能混到食物链这么高端的位置,可不是只有这种低级的抽象能力。我们具 有走入知识荒原的能力,我们可以凭借非常有限的逻辑和Pattern,推理出更有前识性的模 型,比Pattern更强大的模型,比如微积分。用微积分思考不是说你看过几千条曲线就可以 得到的,它是在逻辑链的基础上对现实进行的拟合。也就是说,我们人类有Pattern之外的 建模能力,而这一点是大部分动物所不俱备的。我们的优势也在于此。
所以,我们人的长处不是基于现象形成Pattern的能力,而是基于逻辑链的推理能力,如果 我们总活在前一种能力上,给人的感觉就像个弱智的卷积神经网络。
补充2:关于心
这个定义,参考这里:in nek:王阳明的「知行合一」到底如何理解?又怎样运用到实际 生活中?
对于程序员来说,心的定义其实更简单。考虑如下函数:::
decision *choice(void *env, void *heart, void *input);
你的行为就是一系列的决定,决定来自你的思考。思考需要输入条件,饿了会决定先吃饭 ,困了会决定先睡觉。但有些决定,即使env和input都一样,你做出的选择都不一样,这 个影响最终决定的输入参数,就是心。
心不是思考,不是自己给自己找的理由(那个也是思考),却一直在最终定义你的输出。 而且,这个因素基本上长期保持一致。但我们很多人决策的时候,刻意去给自己找理由, 把心盖起来,用好或者不好的理由骗自己。所以,最终虽然他们的心一直在做决策,但因 为他们的理智思考中没有把这个要素单独放进来考虑,在理智上,他们就不知道自己在干 什么。