原则六 识别内在的复杂性
有时候事情本身就很复杂,你不能把问题简单化。
任何这样的尝试都只会让系统变得更加复杂。
原则七 使用的技术越少,系统就越简单
深入理解一小部分技术要比只是表面理解很多技术好。
更少的技术意味着更少的东西要学习和更少的运维复杂性。
原则八 集中精力学习概念,而不是技术
不要太关心技术的复杂细节,因为你可以随时查阅它们。你要学习底层的基本概念。
技术会变化,概念却是永恒的。你学到的概念将被用在更新的技术中,你就可以更快地学会新技术。
例如,不要太关注 React、Kubernetes、Haskell、Rust 的表面细节。
重点学习:
纯函数式编程
关系型模型
规范的方法
逻辑编程
代数数据类型
类型类 (通用的和特定的)
借位检查器 (仿射 / 线性类型)
依赖类型
Curry-Howard 同构
宏
同像性(Homoiconicity)
VirtualDOM
线性回归
......
原则九 代码一致性很重要
有时候,具有一致性的代码比“正确”的代码更重要。如果你想要改变代码库中某些代码的行为,就要修改它所有的实例。否则的话,就只能忍受。
代码的可读性更多地与一致性(而不是简单性)有关。人们通过模式识别来理解代码,所以请重复 (和记录) 模式!
原则十 分享原则很重要
如果你和队友之间的共同原则越多,就能越好地在一起工作,而且你会越喜欢和他们在一起工作。
附录:不一致性导致的复杂性
这是我能想到的最简单的例子,希望能毫不费力地与现实问题联系起来。
假设一个数据库有两个布尔变量 x 和 y,你的应用程序有一个规则,即 x = y,可以通过使用一个事务修改这两个变量来执行这个规则。
如果这个规则被正确执行,那么数据只有两种状态:(x = True,y = True) 或 (x = False,y = False)。
基于这个规则的函数“toggle”就非常简单。你可以读取其中一个值,并将两个值都设置为反向值。
现在,假设你将这两个变量放到不同的数据库中,并且不能再被一起修改,那么会发生什么?
因为你不能确保 x = y 的一致性,所以数据可以有两种以上的状态:(x = True,y = False) 或 (x = False,y = True)。
如果你的系统处于这些状态中的一种,你应该使用哪个值?
当处于其中的一种状态时,“toggle”函数的行为是怎样的?
在写入新值时,如何确保两次写入都成功?
这些问题没有正确的答案。
当然,如果我们一开始就遵循“剔除无效状态”的原则,那么将只有一个变量!