本文讨论这个问题:架构是否存在?
架构本身就是设计,正如《软件架构编档》(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的胡说八道(https://zhuanlan.zhihu.com/p/27609960)
AI的模式识别,其实很像我们人类的直觉:看一千个图像,形成一个Pattern,以后一眼看过去,觉得这个模式像,那就是那个了。这种模式很容易过拟合(得到的决策系统经得起所有经验的考验,却错判每个未来),也就是说,你看了两个男人没良心,就说全世界的男人都没良心了。3个人给你说有老虎,你就觉得有老虎了。这种直觉,或者说抽象能力,是人最基本的能力,不但人有,估计大部分动物都有。蜻蜓透过它的复眼,看到一只猫,虽然在它小小的脑子里形成千万个点刺激,它也能在很短的时间内抽象出“猫”这个概念(不一定是这个名字)。
但我们人类今天能混到食物链这么高端的位置,可不是只有这种低级的抽象能力。我们具有走入知识荒原的能力,我们可以凭借非常有限的逻辑和Pattern,推理出更有前识性的模型,比Pattern更强大的模型,比如微积分。用微积分思考不是说你看过几千条曲线就可以得到的,它是在逻辑链的基础上对现实进行的拟合。也就是说,我们人类有Pattern之外的建模能力,而这一点是大部分动物所不俱备的。我们的优势也在于此。
所以,我们人的长处不是基于现象形成Pattern的能力,而是基于逻辑链的推理能力,如果我们总活在前一种能力上,给人的感觉就像个弱智的卷积神经网络。
补充2:关于心
这个定义,参考这里:in nek:王阳明的「知行合一」到底如何理解?又怎样运用到实际生活中?(https://www.zhihu.com/question/20810860/answer/44211799)
对于程序员来说,心的定义其实更简单。考虑如下函数:
decision *choice(void *env, void *heart, void *input);
你的行为就是一系列的决定,决定来自你的思考。思考需要输入条件,饿了会决定先吃饭,困了会决定先睡觉。但有些决定,即使env和input都一样,你做出的选择都不一样,这个影响最终决定的输入参数,就是心。
心不是思考,不是自己给自己找的理由(那个也是思考),却一直在最终定义你的输出。而且,这个因素基本上长期保持一致。但我们很多人决策的时候,刻意去给自己找理由,把心盖起来,用好或者不好的理由骗自己。所以,最终虽然他们的心一直在做决策,但因为他们的理智思考中没有把这个要素单独放进来考虑,在理智上,他们就不知道自己在干什么。
出处:https://zhuanlan.zhihu.com/p/28567206
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
架构文摘
互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习
领取专属 10元无门槛券
私享最新 技术干货