System-Notes

Software Engineering Series | 软件工程、算法与架构
软件开发就是把一个复杂的问题分解为一系列简单的问题,再把一系列简单的解决方案组合成一个复杂的解决方案。而软件开发中最大的挑战,就是即能够快速高效地针对需求、环境的变化做出改变,也能够持续提供稳定、高可用的服务。
在笔者的系列文章中,分门别类地讨论了
Preface | 前言,从编码到软件系统
一般来说,在软件工程中,我们往往会面临三类问题:性能问题(The Performant System Problem

系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。子系统也是由一群有关联的个体所组成的系统,多半会是更大系统中的一部分。
关联:系统是由一群有关联的个体组成的,没有关联的个体堆在一起不能成为一个系统。例如,把一个发动机和一台
规则:系统内的个体需要按照指定的规则运作,而不是单个个体各自为政。规则规定了系统内个体分工和协作的方式。例如,汽车发动机负责产生动力,然后通过变速器和传动轴,将动力输出到车轮上,从而驱动汽车前进。
能力:系统能力与个体能力有本质的差别,系统能力不是个体能力之和,而是产生了新的能力。例如,汽车能够载重前进,而发动机、变速器、传动轴、车轮本身都不具备这样的能力。
模块与组件
软件模块
软件组件定义为自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。模块和组件都是系统的组成部分,只是从不同的角度拆分系统而已。
从逻辑的角度来拆分系统后,得到的单元就是“模块”;从物理的角度来拆分系统后,得到的单元就是“组件”。划分模块的主要目的是职责分离;划分组件的主要目的是单元复用。其实
框架与架构
软件框架
软件架构指软件系统的顶层结构。首先
其次,系统中的个体需要“根据某种规则”运作,架构需要明确个体运作和协作的规则。
第三,维基百科定义的架构用到了“基础结构”这个说法,我改为“顶层结构”,可以更好地区分系统和子系统,避免将系统架构和子系统架构混淆在一起导致架构层次混乱。
逻辑
逻辑的抽象复用可以说是所有软件开发活动中最为重要的一条原则,衡量一个程序员代码水平的重要原则之一就是看他代码中重复代码和相似代码的比例。大量重复代码或相似代码背后反映的是工程师思维的懒惰,因为他觉得复制粘贴或者直接照着抄是最省事的做法。这样做不仅看上去非常的丑陋,而且也非常容易出错,更不用提维护起来的难度。
数据中台
产品化是一种技术沉淀,从
模块化是把系统分离的一种设计思路,模块化后可以方便重复使用和插拨到不同的平台,不同的业务逻辑过程中。
产品化的系统一般都会在内部实现组件化,把模块独立抽象成组件,分离组件边界和责任,便于独立升级和维护。组件化可以让一个产品化的系统更可维护。
平台是一组程序的集合,提供了一系列的接口或界面。平台化是让一个系统具备装载很多不同外部系统的能力。平台化作得好的系统,要吧让外部系统很方便的了解你的内部能力,实现自由方便的插拨。平台化是一种对外的能力,提升的是外部系统与平台系统之间的联接能力,以开放作为设计目标,而不是封闭。
我们的系统有很多服务中心,会员中心,商品中心,产易中心和营销中心等。建这些中心的目的是为了业务系统解偶,为了让业务系统能更专注各自的业务逻辑,让通用业务下沉或平移抽出成为服务中心。中心化和组件化的不同一般是远程和本地的区别。以前客户端软件多用组件化设计,而互联网架构多用中心化,服务中心内部可以有不同的组件化设计,业务系统内部也常用组件化的设计。 中心化可以隔离易变和不易变的逻辑,也可以隔离不同运维策略的业务逻辑。中心化的系统一般符合职责单一原则,在面对对象设计的理论下,中心化可以看作一个逻辑上的大的对象来对待。服务中心是一个完整的业务闭包,可以完成一整组业务逻辑。 中心化不一定需要服务化。业务单元也可以中心化。
服务化,服务化一般是指远程调用的形式,我们关注调用的协议,
架构师是一个既需要看全局整体又需要攻坚局部瓶颈并能在业务场景中平衡取舍方案的人,中台和前台,后台都需要架构师,架构师有自已的领域经验。
架构师是分领域的。架构师通过领域建模来划分业务边界,用领域经验来隔离变化,预测变化。很多系统的重复建设,与架架构的领域分拆不清楚有关系。可以借这个底层的实体关系模型来帮助系统建模,找到所有角色、实体对象和关系。 领域建模是一个抽象事实的过程。要为将来的业务扩展性和变化作好足够的准备。
中台和前台的区别是,前台实现业务逻辑和试错,需要比较多的人,这些人可能会失败。而中台实现通用逻辑和工具,产品,帮助前台快速试错,中台失败的可能性应该比较低,把可能错的事让前台去完成。中台人要少,前台人要多。如果前台人少,中台人多,那这个中台基本上应该归属到前台。中台的重点是产品化和平台化。中台应该是一系列能力的组合,包括组织规范和系统的规范,人和系统的一个方法论,标准。
诉求不是需求,而是需求的本质。电商业务中台由一系列业务能力标准、运行机制、业务分析方法论,配置管理和执行系统以及运营服务团队构成的体系,提供各业务方能够快速,低成本创新的能力。
定义能力的定义与标准,提供一个能力注册、发现、查询等管理的机制与管理系统;提供全局性的业务或应用注册管理中心,要让业务跑在大平台上,而不是一个或几个平台上。
提供一套或多套领域对象建模方法论或标准,比如按领域驱动设计
定义平台化的标准,定义可以实现平台化的框架的标准,比如框架需要提供模块化、流程化、插件、扩展等功能。平台化的标准是什么?玄难大师有个很好的比喻,如果你的业务能一键上线或下线,就接近平台化了。这里的一键上下线,不是指单纯的切换一个开关,而是要做到部署的代码里不再有和该业务相关的任何代码。
平台化的基础构建,定义业务规则的定义,提供一个统一的业务规则平台(非中心,非动态编译引擎
软件设计
软件设计有以下四大目标:简单、正确、一致、完整,但两大流派
性能
以著名的
系统嵌入
嵌入式系统是计算机硬件和软件的组合,其目的是实现对系统的机械或电气方面的控制。我们今天使用的大多数系统都是建立在一个非常复杂的代码层上,如果不是最初编写的,通常会编译成
用这些语言编码不适合胆小的人。在
编程
架构与复杂性控制
对于某些问题,这个挑战不是关于处理更多请求的扩展,而是根据代码库的大小进行扩展。企业公司有复杂的现实问题需要解决。在这些公司中,最大的工程挑战通常是:
-
能够逻辑地(通过域)将整块的各个部分分成更小的应用程序。然后,物理上(通过有界上下文的微服务)将它们分开,以便可以分配团队来维护它们
-
处理这些应用程序之间的集成和同步
-
对域概念进行建模并实际解决域的问题
-
创建由开发人员和领域专家共享的无处不在(包罗万象)的语言
-
不会迷失在大量编写的代码中,并且在不破坏现有代码的情况下无法添加新功能
我基本上描述了
强/ 弱类型语言
对于设计到复杂领域建模的问题,如果您不选择
这可能很难做到。
在像这样的领域驱动项目中,使用严格类型语言的强大好处不是表达可以做什么,而是更多关于使用封装和信息隐藏来通过限制实际允许的域对象来减少错误的表面区域。代码大小通常与复杂域问题相关联,其中大型代码库意味着复杂的域,但情况并非总是如此。当项目的代码量达到一定大小时,跟踪存在的所有内容变得更加困难,并且更容易最终重新实现已编码的内容。
复制是精心设计和稳定的软件的敌人。当新开发人员开始在已经很大的代码库上编码时,这一点尤为明显。
生产级别软件与Demo
生产软件是您关心的代码,或者如果它不起作用您将遇到麻烦的代码。这也是你为其编写测试的代码。一般的经验法则是,如果您关心代码,则需要对其进行单元测试。如果您不在乎,请不要进行测试。
宠物项目是不言自明的。做你喜欢的事。您没有专业承诺维护任何标准的工艺。
性能与高可用
研发效能
About
Copyright & More | 延伸阅读
笔者所有文章遵循 知识共享 署名
