打破循环
当我把视线从网络工程移回软件工程时,我看到了同一个结构。编程语言的包管理和库依赖有一个共同的噩梦。那就是循环依赖。A包引B包。B包引C包。C包又引A包。构建顺序无法确定。初始化次序陷入死锁。解决方案和STP如出一辙。打破循环。重构依赖关系。让依赖图变成一棵树。
在技术的领域里面,软件工程的原则和网络工程的原则是相通的。它们的目标是一致的。那就是效率。从效率的目标导向来看,近乎差不多的解决方案都被提了出来。防环路是一种解法。打破循环依赖是另一种解法。它们在各自的领域里独立产生。但原理是同一个。
这个发现是我在做技术学习的时候直觉跳跃过来的。我看到有类似的关联关系。从一个节点出发。不断选路。就跟知识概念在一个图上面关联到其他知识一样。通过一些指针来定位。切换下一跳。后来我发现,在技术的各个领域里面,软件编程的一些原则会与网络工程中的一些原则相关。就是为了效率。从效率的目标导向来看,近乎差不多的解决方案都被提了出来。
循环依赖在计算机科学中是一个经典问题。它指的是两个或多个模块之间形成了闭环依赖关系。这种关系在编译、加载、运行时都会引发问题。解决方案通常是引入依赖倒置原则或者抽象层。把闭环打破。重构为树形或层级结构。
我把这个原理带到了考试以外的地方。在工作里,读文档时,学新技能时,我开始用同样的思路。找到关键矛盾点。找到主要的目标。找到不可跳过的过程。这些是能够高价值保留下来的内容。百分之二十的关键节点,决定了百分之八十的效果。其余的冗余内容应当被剪掉。就像STP阻塞冗余端口一样。就像重构代码消除循环依赖一样。
同样的原理出现在不同的领域。它就不是巧合了。它是一种跨领域的通用规律。
参考文献
- IEEE 802.1D-2004. IEEE Standard for Local and Metropolitan Area Networks: Media Access Control (MAC) Bridges. https://doi.org/10.1109/IEEESTD.2004.94569
- Martin, R. C. (2003). Agile Software Development, Principles, Patterns, and Practices. Prentice Hall. https://www.pearson.com/en-us/subject-catalog/p/agile-software-development/