说明:以前仅发布于朋友圈的文章,将结合国内外形势,挑选一些陆续发布到本公众号。本文写于2020.6.27。
(下午看了一篇分析苏联工业体系为何走向衰败的文章,促使我提前写下此文)
软件开发领域有两个意思等同的术语——控制反转(IoC)与依赖注入(DI)。我一般更喜欢使用前者,因为听起来更有排面。
狭义的控制反转就是依赖注入:原本需要自己创建的对象,改为由外部创建,引用(即依赖)的时候,由外部“注入”进来就可以了。至于如何注入,那不关我事,你们看着办。在服务器端,Spring的一半作用就是干这事;安卓端则可以用Dagger等工具。
广义的控制反转,那就海了去了。
在计算机领域,“控制”可以理解为对象/规则/代码。原本由你来负责对象的创建、规则的执行,出于某些原因(或嫌麻烦,或为了分工,或为了延迟实现等等),这事你不干了,交给别人,也就是控制权反转给其他人了,这就是“控制反转”。这里的“其他人”,通常是当前模块的使用者。本来我是主人,你是仆人,我是来使唤你的,结果你反客为主,没点眼力架儿,反而把一些活还给我干了。您还别说,只有这么设计的软件才是好软件!现在你该明白,我为什么说开发岗位不招学生会干部背景的人了吧(当然还有别的原因)?当然,“其他人”还可以是任何人。
面向对象、设计模式其实都是控制反转的体现。把“规则”封装成对象,才能方便地“击鼓传花”。对象的极简形态就是接口,接口的极简形态就是闭包。控制反转体现在数据层面就是基类对象,体现在执行层面就是动态绑定。而设计模式,说白了就是各式各样的控制反转手段。
控制反转不仅在程序内部广泛运用,也可以应用到程序员同产品设计师甚至用户之间的关系中。但这一点却被绝大多数开发人员所忽略。高明的程序员会运用巧妙(但并不复杂)的方法,神不知鬼不觉地将选择权抛给最终用户,而不是固化在程序中。其本质是将产品与需求解耦,是产品迭代的秘诀。我一般都会在机试题目中,考验应聘者这方面的能力。不过很遗憾,绝大多数人连这方面的意识都没有。据此推测,国内的大部分互联网公司,其产品代码并没有有效施行控制反转。
刚才讨论的是算力方面的反转。回到开头的话题,苏联工业体系如何从辉煌走向衰败?二战期间,受经济危机影响,苏联的工业体系从无到有,后来甚至达到超越美国的巅峰,然而却又在短短二十年之后几乎消失得无影无踪。虽然苏联领导人一直处于没头发→有头发的循环更迭,但其“科技强国,重视基础”的基调一直未变,这一观念甚至在上世纪40年代至60年代超越美国领导人。苏联工业体系的衰败并非国家不重视,也不是民众不努力,上述两点到现在都应该是我们学习的榜样,甚至都是超过美国的。其衰败根源就在于控制未反转,经济学的术语就是计划经济。苏联的工业经济是国家计划安排下的经济,所有发展规划与步调都严格由国家安排;而美国则是由国家以投资援助的形式对民营企业进行扶持输血。两者的根本区别是苏联的所有控制权牢牢掌握在国家手里,没有任何形式的反转,所以非常僵硬死板,就像“套中人”别里科夫那样,天天盼望着“千万别出什么乱子”;而美国则是把大量的控制权反转到企业手里,企业就能动态地适应市场,并对市场变化做出快速反应。所以,苏联的工业可谓“成也萧何,败也萧何”,萧何就是计划经济。
由此,不难看出,对于是否需要控制反转,并不能简单地下结论。在落后、前期、基础的阶段,集中控制其实也是一个不错的选择,因为可以把有限的资源集中到刀口上,有利于以最高效率办大事。然而,当发展到一定程度,具备一定规模之后,这种模式的弊端就显露出来了。根本原因是:大家都是凡人,而不是神!如果是由上帝来掌控,那控制还反转个毛线?你干的活会比上帝还好?然而,每个凡人的能力与效率是有限的,当系统具备一定规模之后,控制必须反转,这样才能充分发挥每个个体的优势。
企业经营权需要控制反转,公共事务的权力同样需要控制反转。治理国家跟管理企业,并没有太大的不同,也跟烹小鲜相仿。放眼世界各国,公共权力与经营权力基本上都是同时反转或不反转的。国家的权力分散些,企业经营权就会灵活些;国家的权力集中,企业经营权也会集中,当然,最后的归口肯定是权力,因为胳膊拧不过大腿。
让民众参与决策,让民众发声,都是权力上的控制反转。话语权本身就是权力的重要组成部分。无论是在家庭,在饭桌,还是参加活动,谁是老大?当然是能叫你“闭嘴”的那个人。所以,允许别人发声,就是默许了权力的渡让。这不但是修养的体现,更是高明的治理技巧。
甚至暴力也需要控制反转。马克思说过,国家的本质是暴力机器。权力本质上是暴力的体面外衣。如果说出让话语权是男的给女的送花说“我爱你”,那么出让暴力就相当于男方在房产证上写上女方的名字。谁是真爱?哪个更容易变心?
控制反转的观念非常重要,重要到我必须要唱一首周杰伦的歌,才能表明我的态度:观念不及格,其他全部是乐色(垃圾)!

