模块化是一个"发现"


模块化(Modularity)这个概念与其说是一种创新,不如说是一个"发现"。这正是人们在解决问题时常用的行为方式和思维过程。它不是单纯的技术问题,更深深地影响着整个社会生活。可以读读<<设计原则:模块化的力量>>, 在<<Unxi编程艺术>>第4章也提到了这本书!


 


我们获取知识有两个重要的方式:归纳(conclude)和演绎(deduce),不用多解释。它们其实就是自下而上和自上而下的差别。人类有与生俱来的抽象思维能力,沟通问题时使用隐喻会大大提升效率。太多的琐事常常影响我们的判断力,所以我们总是在追求分理主次,简化问题。社会的发展带来了越来越多样的社会分工,在亚当.斯密的<<国富论>>讲到了社会分工的必然性。整个世界都在分分合合中保持着一种稳定,发展形势上也有自下而上和自上而下之分。


 


所以模块化正是我们思维习惯的体现,它的发现是一个必然的结果。它的目的可以概括为:


  1.信息隐藏 (抽象,黑盒)。


  2.分工 (正交性,聚合)。


分工同时可以更容易实现并行开发,带来开发效率的提升。而信息隐藏则降低了对程序员的要求,能够更好地掌握模块内的复杂度。而最终是一个经济目的:低成本。


 


经济上定义了公司的一个决策行为,当内部生产的成本高于在开放市场上购买的成本时,就不会自己生产,而是转向购买。 也就是分工合作。模块就像不同的公司,上下游之间有着各式各样的互动。当公司/模块独立运作(低耦合)时,只关注公司/模块间的契约或合同(信息隐藏),这就是模块化。可以宏观的看(不同的公司或国家),也可以微观的看(不同的部门或器官)。并且模块化本身是动态的过程,合合分分。 当发现两个公司产品线相互紧密依赖(内部生产的成本优于在市场上采购)或相似(整合会产生规模效应),就会出现并购。当公司内部某个产品线与其它产品线开始分化(更好或更差,或者经营目标等不一致时),就可能会分拆。


 


模块化的要素


模块化的第一要素是角色和责任(Role&Responsibility, HR上的一个概念,能引起一些思考.)。如果焦点只关注在模块,容易造成局部最优,但整体不佳的问题。这也正是约束理论要解决的问题。所以还要有标准。从系统的层级定义一个模块的目标功能,划分好角色,来约束模块的演进,以保证整体系统的最优。


 


模块化的第二个要素是接口,包括静态的接口定义(职责)和动态的交互定义(行为方式,如何协作,异常处理等),也可以概括为契约(contract),在技术上则称为接口(interface)。


 


所以模块化设计要从大的系统视角规划角色,又要从小的模块视角设计协作的细节,中间一定不断有冲突,要经过不断演化来达到一个相对稳定的结构,这取决于时间和成本上的考虑。


 


*在软件开发中,模块化和语言无关,关键是领域,也就是业务面的问题。这也和敏捷与否无关,不同的只是模块化程度的问题。

------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。