http://blog.sina.com.cn/s/blog_54830f070100cekm.html
我很不愿意去J道或其它知名的技术站点看那里的讨论。整体上来说,在这些网站上也形成了不大不小的圈子,其活动者大体也是业界实实在在的实践者,包括各个层次的程序员以及高层设计人员。所以,理论上这些圈子应该代表中国软件业技术主流的水准。然而我的确无法恭维;让我最为沮丧的是一种充斥其间的神秘主义的氛围。所有人都在讨论某种流行的方法论、模式或其它的理论,这些讨论彻底浮动在事物的表面,对于技术、方法本身内在的演进逻辑、本质属性毫无洞见,最后无非是在玩弄新鲜名次。所谓资深者浑浑噩噩,初学者懵懵懂懂,完全是不知所云。这不是一个认识深度的问题,这是一个认识方法问题,软件行业的技术精英们似乎与人类积累下来的宝贵的洞察事物的一般方法绝缘,极其庸俗地而且满怀热情地沉迷于他自己所罗织而成的一种高深莫测之中。是什么原因导致了这种情况?是软件技术人员整体上缺乏一般的思想修养和必要的洞察能力以及狭隘的知识界结构所致?应该有这个因素。另外,高科技的光环似乎使这些人并不为这种空洞贫乏而感到羞耻,似乎软件有理由成为一种超越一般的学科、科技的神秘的东西。显然这是极其有害而且荒唐的。软件与软件职业者一样都来自于我们所存在于其中的文明大背景,软件理论与实践必然遵循有关知识与技术的一般的方法,软件从业者需要从根本上提高自己的文化、文明素养才有可能获得出色的洞见与技能。在这个意义上,他们没有任何特别之处。
本文略举二三事,旨在说明这种流行的弊病并且给出我的分析。
关于DDD
DDD是什么?首先是一种观点,这种观点认为软件系统的关键在于处理领域模型的复杂性;以此为出发点,处理领域模型的方法、技巧、最佳实践;最后,在这种思想指导下服务于领域建模的各种工具;DDD就是这三个方面,并且其逻辑上的递进是有顺序的;J道有专栏来讨论DDD,但遍观所有帖子无不是瞎子摸象。有许多回答“什么是DDD”的帖子都是在谈论一个驴唇不对马嘴的问题。
DDD的根源仍然是那个老问题:软件系统的实质的复杂性在于需要从纷纭现实中抽象出一个逻辑上清晰、严谨、有序的良好的概念结构出来。对于目前绝大多数应用软件来说,这个所谓现实都可称之为某种领域;Brooks称之为概念结构,另有人称为概念模型;这个思想源头由来已久,但它不会抹杀DDD作为一种系统的、完整的思想系统的独立价值。
关于依赖注入
对于面向对象系统来说,运行时的系统是一个由相互作用、彼此协同的对象构成的对象关系图,信息在图中流动,图的有价值的行为,或者说状态迁移路线,形成所谓功能用例;开发者开发系统实际上是在叙述两件事情:@对象本身的结构与行为@它们如何装配以形成一个复杂的图状的结构。一方面,这两件事情并不能截然分开,另一方面,在相当多的情况下,分开来会使系统的体系、层次趋于分明。
对象组合装配成对象关系图这件事情在系统中设置一个责任者来专职完成,这个做法是几种所谓工厂模式的实质;无非是将对象图的烦琐的装配过程加以隐蔽,并且同时也在一定程度上降低了对象图的结构依赖程度而只关心其最终的行为。
后来容器环境的出现使这个对象关希图的装配任务被交给容器来做,容器实际上在运行时充当工厂的角色,而作为程序只需要描述出对象之间的依赖关系;依赖注入是对象图装配的自动化过程,是工厂模式的提升而已。这种显而易见的传承关系我没有听到被任何人提起过。
关于AOP
任何结构良好的系统的一个最重要的特征,就是在相对底层打造共享结构单元,或者说横切单元。它们与上层单元是正交的关系:上层的单元由多个下层单元支持;下层的单元被多个上层单元所共享;共享、通用、横切、正交是同义词。
横切成份的出现几乎是系统是否具有良好品质的试金石,它在系统的所谓微分特性(收敛)、可扩展性等等方面都起决定作用;在面向过程方法中,我们追求重用的过程;面向对象中我们追求重用的对象甚至构建,面向服务系统中我们追求共享服务,甚至在数据库设计中,数据库范式也是在追求最大程度的共享成分。横切在计算机软件的历史中由来已久。
AOP也正是被这个力量所推动,它提供的平台、机制和方法是横切传统的一种自觉和加强,他的确对于某些问题的处理给出了强有力的手段,尤其是与容器相结合时。但是,另一方面,AOP并没有也不能够囊括所有的系统横切问题,它本身不过是处理横切问题的技术方法中的一种。另外AOP作为一种横切方法,他并不具有与面向过程、面向对象等相类似的方法论意义,后两者在根本上乃是源于两种观察世界的哲学角度:直观地说,我们可以认为世界是过程,或者是对象,但我们很难说世界是由方面构成的;这有些类似于柏拉图哲学中的概念世界了。因此,AOP并不能够与OOP相类比,更不存在AOP取代OOP的问题,两者的前途并不冲突。
打破神秘主义
打破神秘主义的目的是在于我们能够从本质上理解软件各种方法、模式的历史演进、逻辑脉络而不是认为层出不穷的都是些天上掉下来的全新的没有先驱的、没有原因的了不起的创造;对这种内在演进、逻辑脉络的把握远比这些新鲜概念本身更加重要,我们籍此能够洞悉事物的根源;对这种根源的无知是许多程序员只会新名词而不能够驾驭、熟用各种方法、模式的根本原因;有太多的人湮没其中徒豪精力。