《系统之美》-摘记

一、系统

几乎每一个系统都有一个重要的目标,那就是确保自我永存。

调节回路:使系统逐渐恢复原来的目标,是保持平衡或达到特定目标的结构,也是稳定性和抵制变革的根源。

增强回路:是自我强化的,随着时间的变化,增强回路会导致指数级增长或加速崩溃。

时间延迟:调节回路上的时间延迟很可能导致系统的振荡。

二、系统之美:系统的三大特征

1. 适应力

适应力是一个系统的基础,使系统能正常发挥和维持功能。

有适应力的系统是动态变化的、非静止或恒定。

适应力使系统具有自我修复或复位能力,在遭遇干扰时能恢复原来状态。

2. 自组织

自组织特性会产生异质性和不可预测性:系统可能演变出全新的结构,发展出全新的行为模式。它需要自由和实验,也需要一定的混乱。

是指系统具有塑造自身、生成新结构、学习、多样化和复杂化的能力。

即使是非常复杂的自组织形式,也有可能产生于相对简单的组织规则。

3. 层次性

层次性是系统的伟大发明,能让系统更加稳定和有适应力,而且因为它们减少了信息量,使得系统各部分更容易记录和跟进。

层次性原本的目的是帮助各个子系统更好地做好其工作,不幸的是,系统的层次越高或越低,越容易忘记这一目的。很多系统因为层次的功能失调,而不能实现预定的目标。

层次结构既要有足够的中央控制,以有效第协调整体系统目标的实现,又要让各个子系统有足够的自主权,以维持子系统的活力、功能和自组织。

继续阅读

检查清单(20200510)

1. 逻辑代码

1.1 基础开发

1.1.1 参数校验

  • 入参基本校验:金额不能小于0、不能大于余额、不能大于应还总额等。
  • 字符串非空。

  • 请求参数用 POJO 接收,POJO 的属性要添加基本校验注解,Controller 方法要用 @Valid 注解开启校验。

  • 正则表达式:用正则表达式进行参数校验时,不能写太复杂的,因为 Java 的正则引擎采用的是贪婪匹配模式。

1.1.2 跨系统调用

  • 超时限定:为了防止外部服务出现响应缓慢而拖累调用方,调用方必须设置连接超时、读超时等。

  • 幂等性,防止重复调用:调用方传递唯一的请求编号、服务方根据请求编号进行幂等性控制;

  • 重试:对于重要业务,调用方应该有重试机制,重试一定次数后仍然失败的,有告警出来,人工介入处理。

  • 调用链跟踪:

1.2 SQL

  • 检查SQL语句的执行计划,关注是否有全表扫描、索引全扫描。

  • 尽量把 1+N 次查询改写成 1或2 次查询。

  • 不能在字段上应用函数。

  • 字段应该单独在比较运算符的左侧。

  • 检查是否有隐式类型转换

    • 隐式类型转换会对扫描到的每条记录的字段进行转换,然后再进行比较,执行性能较慢,还会导致无法使用被转换列上的索引。
    • 比如 varchar(10) 类型的字段用 abc=40 则会进行隐式类型转换, abc='40' 则不会。
    • MyBatis在处理数据库 Date 类型时只能传 TIMESTAMP。 类型,与Oracle的Date类型进行比较会导致隐式转换。
    • MySQL 里如果比较的两个字符串列的字符集不同也会发生隐式类型转换。
  • join 的连接条件不要放到 where 子句,连接条件与过滤条件的执行顺序不同。

继续阅读