软件设计的核心是问题的结构化抽象

软件设计的核心是问题的结构化抽象。

何为结构化抽象 ? 先回答 “何为抽象” 与 “何为结构化” 两个问题。

何为抽象 ? “编程漫谈(三):抽象” 一文阐述了什么是抽象及在编程与计算中的意义; “代码抽象与分层” 则列举了从代码中提炼出来的六类抽象,涵盖了编程开发中常见的实体及处理。

何为结构化 ? 结构,是事物的组成元素及关联和作用。 “编程漫谈(十一): 编程概要” 一文阐述了编程中的各种数据结构及控制结构,“软件的组合结构:从指令到软件” 则阐述了组合元素的方法与结构。

软件,本质上是一种可动态而弹性变化的逻辑装置。结构化,即是将逻辑进行抽象、提炼、分离、聚合,构建成更加缜密、动态、弹性的结构流。

逻辑,是思维意识的一种形式。软件设计与开发,是与自己的思维意识进行抗争与和解。

设计与开发

思考软件的设计与开发,通常有如下步骤:

  • 软件建模。是对大量原始数据进行结构化组织,使之更加有序、有意义、可交互。
  • 数据存取。在建立对数据的组织抽象之后,就要进行数据的存取操作。数据是规则的还是不规则的 ? 数据量有多少及增长速度如何 ? 是否要进行缓存 ? 选取合适的数据组件来存取。常见的有记录型、KV型、文档型。
  • 流程构造。在确定数据存取方案后,需要构建完整的流程。流程可以使用时序图来表示。流程包含约束、操作与契约。约束,是进行操作需要满足的条件;操作则是从外部服务获取数据或向外部服务请求某种动作;契约,是在完成操作之后,必须满足的一系列断言。完整流程通常是:“约束-操作-契约”的子流程的有序组合。
  • 编程实现。需要评估潜在变化的部分,将通用的部分与易变化的部分相分离。

设计模式

设计模式是对象职责及交互的结构化抽象,是最能体现结构化抽象思想的基本单元。可参阅:“软件设计要素初探:基础设计模式概览”

架构模式是基于设计模式的更高层次的结构化抽象。可参阅:“软件设计要素初探:架构模式”

设计模式和架构模式主要应对软件的业务可扩展性难题。

技术机制

在软件设计中,技术是绕不开的一道槛。技术的作用在于,在指定的场景下,所执行的操作必须满足某种特定的规则。要满足这些规则,需要使用技术机制来保证。

  • 幂等。比如处理资金问题,必须考虑幂等问题,即同一个请求,执行多次的效果必须与执行一次的效果等同;
  • 事务。比如多个关联数据的插入、更新和删除,必须保证原子性。要么全部执行,要么一个都不执行。需要使用事务来保证。事务的特性是ACID,结构化抽象是还原点、快照与回滚日志,操作是提交、刷新或回滚。
  • 并发。大量请求的处理,不可能使用串行的方式,必须使用并发的方式,充分利用多核CPU资源。并发往往要利用多核CPU的硬件存储结构(共享内存型和独立内存型)。
  • 同步。在并发场景下,要保证多个执行实体(比如线程、进程等)能够看到共享变量的最新更新值。同步的本质是确保指定顺序执行,避免不确定的执行顺序,其结构化抽象是临界区。临界区是约束执行顺序的一种结构。
  • 框架。应用的组件、配置与启动,可以做成通用的框架和脚手架反复使用,快速启动和部署一项工程,减少不必要的重复工作量。框架的结构化抽象是,将工程中的配置、部署与启动、运行结构、通用任务进行提炼并形成固定的模式,应用只需要关注可变的业务部分。
  • 限流。突发的峰值流量,为了避免瞬间占满和击垮服务器的资源和服务能力,需要进行限流。限流的结构化抽象是,时间与许可的计算。
  • 缓存。 对于热点数据,为了避免反复从源存储获取,增大对存储的访问压力,可以使用缓存来存储热点数据,增大命中率,提升性能,减少对存储的不必要的访问压力。缓存的结构化抽象是,使用少而精的空间优先于大而全的空间的搜索。“少而精”是指聚焦应用的经常被访问的热点数据。缓存的衡量指标是命中率和过期时间,操作是缓存与源存储的读写同步。
  • 降级。当非核心的依赖不可用时,可以及时切断依赖,舍小取大,保证整体服务正常运行,不受局部影响。降级通常是在超时的情况下切换到备用方案,是主备策略的切换机制。

规模化挑战

如果程序媛猿面对的是几万的数据量,那是可以夜夜笙歌的。然而,现实情况是,面对的是亿级以上规模的数据量,且数据量仍然在指数级增长。为了人类社会的无理性发展,程序媛猿们真是白了头。

为了应对亿级规模的数据量,并发、分布式等方案层出不穷,结合变化的业务场景,又衍生出更多的挠人烧脑的复杂问题。

如何应对呢?

  • 并发机制取代了串行机制。单CPU和单机的性能基本抵达瓶颈,只能从多核CPU和多机上想办法。将要处理的数据量分解为多个相互独立的子数据集,并在不同的任务实体里并行地独立执行。 并发虽然解决了单机性能不足的问题,却引发了更多的问题。
  • 同步。有了并发执行之后,由于有些资源是共享的,而一些热点数据往往被多个任务实体同时读取和修改,又产生了并发竞争问题。 为了解决并发竞争,又引入了同步机制。大量对同一资源、数据的操作引起性能问题。
  • 缓存。对于热点数据的读取和操作,通过“空间换时间”的策略,使用缓存来提升性能,降低对源存储的访问压力。
  • 限流。 由于允许并发请求进入,则必须应对瞬间的峰值流量(可见世态)。限流必须有度,不能因噎废食。 需要对系统承载的负荷及极限负荷进行测量,根据测量值来确定一个可动态调整的限流值。极限负荷测量即是压测。
  • 降级。 由于业务特性的不同,环境的不稳定波动,以及采用方案的局限性,依赖服务有可能出现部分失败,对于调用极其频繁的服务来说,依赖服务的少许失败可能导致上层的雪崩效应。因此在依赖服务出现问题时,必须进行适当的降级熔断。
  • 数据可视化。 为了从数据集中发现整体性的规律和趋势,通过将大量数据集进行可视化,拥有一个简明的全局视角。
  • AI。以数据为基础,以规则集为准绳,训练机器通过基本的规则集与数据的计算而获得某种“学习”能力,从而能够分析更多的数据集,调整现实活动和方式,获得人力所无法得到的见解和经济效益。

参考资料

猜你喜欢

转载自www.cnblogs.com/lovesqcc/p/11220727.html