计算机领域的定律

定律是为实践和事实所证明,反映事物在一定条件下发展变化的客观规律的论断。定律的特点,是可证,而且已经被不断证明。定律是一种理论模型,它用以描述特定情况、特定尺度下的现实世界,在其它尺度下可能会失效或者不准确。

计算机领域存在很多经典的理论,由于之前没有系统的去梳理,所以大多是听过,然后后续再听的时候,嗯,是有这么一回事。但是要自己能够在对应的场景下去引用,去讲出来,就有些不够丰满。因而这篇主要关注怎么把这些计算机领域的定律,像故事一样的简单,总结起来。

tl;dr

康威定律可谓是软件架构设计中的第一定律,在《人月神话》这本软件圣经引用后被广泛推广。摩尔定律也是人们耳熟能详的,是计算机第一定律。

另外还包括阿姆达尔Amdahl定律,奥卡姆剃刀原理。

[toc]

康威定律

1967年,马尔文·康威:

设计系统的架构受制于生产这些设计的组织的沟通结构。

Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.

康威定律可以总结为4个定律:

  • 组织沟通方式会通过系统设计表达出来;
  • 时间再多一件事情也不可能做的完美,但总有时间做完一件事情;
  • 线型系统和线型组织架构间由潜在的异质同态特性;
  • 大的系统组织总是比小系统更倾向于分解;

组织的沟通和系统的设计之间紧密相连,特别是复杂系统,解决好人与人的沟通才能由一个更好的系统设计。人员增加沟通成本呈指数增长的规律:沟通成本=n*(n-1)/2, n表示人的个数,n-1表示每个人据需要同剩下的n-

1个人由交流,而沟通交流是双向的,所以会在此基础上除以2。

对于团队我们应该追求小团队,为了整个系统的开发效率和最终产品结果。使用一切手段提升沟通效率,每个人每个系统有明确的分工。

在软件开发中人手永远是不够的,事情也是永远做不完的,不可能做完没。面对这样的情况,敏捷开发可以做到不断迭代、持续交付、快速验证和反馈并持续的改进。再牛的开发也会写出bug,在全面的测试覆盖率也无法测出所有的问题,解决方案不是消灭这些问题,而是容忍一些问题的存在,然后通过适当的设计(冗余、监控、高可用)允许接受出错,当问题发生时能够快速解决。

我们想要什么系统就搭建什么样的团队,反过来有什么样的团队就搭建什么样的系统。对于大的公司,架构不仅仅需要技术,还需要政治。这种政治说的是和他人协作将事情搞定的艺术,架构是一种社交活动,在技术世界里,个人主义很容易被打败即便目的是好的技术也是最有的技术。技术决策是也是政治决策,一个产品任何一个团队都可以做,但是对于选择任何一个都意味着局限。

摩尔定律

1965年,戈登·摩尔:

每个新芯片大体上包含其前任2倍的容量,每个芯片的生产都是在前一个芯片产生后的18-24个月内。计算能力相对于时间周期将呈指数式的上升。

衍生出三个版本:

  • 集成电路芯片上所集成的电路的数目,每隔18个月就翻一番;
  • 微处理器的性能每隔18个月提高1倍,而价格下降1倍;
  • 用1个美元所能买大的电脑性能,每隔18个月翻两番;

更有一个安迪比尔定律。安迪给你的,比尔都会拿走。安迪是Intel创始人,比尔是微软的创始人,intel不断提高CPU的计算能力,微软就用新的操作系统来吃掉它,就是硬件性能的提高总会迅速的被新的软件消耗掉。

相近的一个使维尔斯定律,其认为软件变慢的速度比硬件编码的速度更慢。

同时有一个反摩尔定律,就是IT公司如果18个月后卖掉同样多的同样的产品,其营业额却要减少1半,需要所有的硬件和设备生产厂商都要追赶上摩尔定律的发展速度。

目前GPU就是摩尔定律进入失效区间的一个创新,计算不仅仅依赖CPU。图形渲染单元和计算单元放在一个芯片上,因为它们不会同时被使用,所以发热问题得到缓解。GPU简化了控制单元和缓存,把有限的芯片上的空间让个了计算单元,通过牺牲延时换取了吞吐量。

阿姆达尔定律 & 古斯塔夫森定律

阿姆达尔定律用于计算优化某一部分能够对整体产生的最大优化效果。在并行计算中,阿姆达尔定律主要用于预测使用多处理器的程序理论上所能达到的最大提速。 $$ {S}{latency}(s)=1/(1-p+p/s) $$ 其中${S}{latency}$是任务整体执行过程的理论速度,s是任务中受益于系统性能提升的那一部分的加速,p是获益部分占用执行时间的比例。

古斯塔夫森定律给出了任务执行时间固定时,通过提升系统性能所能达到的理论潜在加速。 $$ {S}{latency}(s)=1-p+sp $$ 其中${S}{latency}$是整个任务执行过程的理论潜在加速,s是任务中受益于系统资源改进部分的潜在加速,p是系统资源改善之前收益部分占整个任务的执行工作量的比例。

阿姆达尔定律假设问题大小固定,即执行的工作量不会随着资源的改善而改变。古斯塔夫森定律提出,程序员倾向于调整问题的大小以充分利用通过改善资源释放出的计算能力,更快的设备可以使用相同的时间解决更大的问题。

阿姆达尔定律优化的目标是使程序在相同的工作负载下更快运行,古斯塔夫森定律意义在于改变了研究目的,选择或重构问题从而使用相同时间解决更大的问题,在相同的运行时间内实现更大的工作负载量。

奥卡姆剃刀原理

14 世纪,逻辑学家奥卡姆的威廉:

如无必要,勿增实体

不要浪费更多的东西去做,你可以用更少的东西做同样的事情。人们做的大部分事情可能没有意义,而隐藏在复杂事务中的一小部分是有意义的。复杂事情往往可以通过简单的方法解决,应该化繁为简,抓住重点,把我关键。

扬尼斯定律

程序员的开发效率每6年会提高一倍。平均年提高16.6%,如果没有达标,则我们的价值其实是在下降16.6%。对于公司来说,6年内员工数量保持不变,如果营业额没有翻一倍,那么公司的利润其实是在下降。但是并不是所有的公司全员都是程序员。

梅特卡夫定律

一家网络的价值与它的用户数量的平方成正比。正式这一预言可以解释看似不可理解的信息现象,并帮助网络拥有者和价值投资者进行正确估值。

尤尔互补性定律

其指出如果两种属性或两种产品是互补品,其中一种互补品的价值/需求将与另一种互补品的价格成反比。也就是说,如果一种补品的价格降低,那另一种补品的需求就会增加。

Liao lile
Liao lile
架构师 | 系统工程师

目前主要方向在微服务、服务网格等云原生相关领域技术