posts - 157, comments - 216, trackbacks - 0, articles - 6

2006年3月4日

    最近强调弹性设计的比较多,大概是因为需求的多变太令人挠头了吧。但从道理上说,一个良好的设计必然是刚柔并济的。所谓没有规矩不成方圆,你能想象没有钢 筋骨架结构的高楼吗。在基础核心架构方面特别需要适当的刚性和足够的稳定性,需要用接口明确表达出将用到的假设。内核稳定了,固化了,外围的aspect 才能安全的织入到系统体系架构中来。象变形金刚那样的自由组合变化的结构(在流动结构与固化结构之间转换)目前还只是一种幻想。

    强类型语言在控制大型系统的核心方面还是远胜于弱类型脚本语言的。有些人认为单元测试可以取代编译器的强类型语法检查,这完全是一种臆想。程序的正确性应 该在不同的层面上得到约束,验证,而不是一古脑的推到单元测试那里。在单元测试中对于概念一致性的保障是绝对无法与静态类型检查相比的。类型一致性的检查 在编译器的帮助下以非常低的成本就可以进行,而如果要在单元测试中实现同样的约束,成本要高得多。有一点我们应该明确:除了功能实现代码,其他任何文档, 代码都应该是多余的。为什么需要单元测试,那还不是因为没办法嘛。

posted @ 2006-03-04 23:57 canonical 阅读(702) | 评论 (2)编辑 收藏

   我其实很少谈到OO这个概念,一般情况下我只提结构的表达与结构的控制。软件开发是一个从二进制指令构造出一些高级结构的过程。无论是PO, OO, 还是XO, 只要它能有效的降低这种结构构造过程的复杂性,能够增强我们对程序结构的表达和控制能力,那么它就是有价值的。在我看来,继承(inheritance) 必然是有用的,因为它是一种表达推理结构的方式而无论它的概念诠释是什么。行为函数聚合在对象的名义下是有意义的,因为它使得这些关联得以明确化,静态 化。为什么函数式编程是有效的,它和OO是什么关系。说白了,FP能够方便的表达OO不易表达的结构。xml与OO是否是冲突的?xml能够方便的表达结 构,通过dtd或者xml schema又可以方便的实现对结构的约束(动态的类型系统?)。
    级列设计理论要求我们所有的讨论必须在一个统一的模型(最广义的模型)下进行。OO与非OO的思想其共同之处是什么,它们在什么层面上是统一的?无论是 OO还是PO,都可以归结为结构问题。所以我多谈结构,少谈OO。两个不同的概念,可能意味着它们处于复杂性的不同级列(可以实现平滑的过渡),也可能意 味着它们之间是正交的,互补的

posted @ 2006-03-04 23:54 canonical 阅读(1102) | 评论 (4)编辑 收藏

                                      

http://www.xml.com/pub/a/ws/2003/09/30/soa.html
http://canonical.blogdriver.com/canonical/809426.html

   随着IBM, Microsoft这些世界级大厂商不遗余力的推销,SOA(Service Oriented Architecture)已经成为企业应用中的核心概念之一。我的一个同学在IBM做SOA架构咨询,前两天也和他聊到这个话题。从他们IBM的态度来 看,SOA无非是后EJB时代一个profitable enabled的概念而已。现在软件厂商的日子变得愈加艰难了,很多厂商都希望向服务转型,成为所谓IT service provider. 这是某种商业架构上的service oriented, 与技术上的SOA似乎有一些相互映衬的关系。IBM极力希望把SOA中的service概念提升到business layer, 希望在超越BPM(Business Process Management)的层次上提供一站式的打包服务。但是很显然,此service非彼service, 这种SOA的宣传中颇有一些偷换概念之嫌。把所有可以让用户买单的理由用MDA(Model Driven Architecture)做包装,打包到一个独立概念的package中在目前确实是一种可行的商业策略,只不过相对于用户脆弱的技术理解力而言,这种 SOA实在是不可承受之重。大多数用户所能理解的SOA不过是Integration的代名词,与EAI(Enterprise  Application Integration)没有什么可区分性。目前java技术的普及已经使得各个厂商的区别变得很小了,IBM这些巨型厂商鼓吹它们在异构系统集成方面的 优势当然是势所难免,在此过程中加点料也是可以理解的。


   虽然SOA这一概念中混杂了太多的商业因素,它也并不是一种单纯的fantasy. 从技术角度上说,SOA存在着如下关键性特征:
1. 独立运行(standalone)。所谓的service, 它与组件(component)的根本不同,首先在于service是独立于调用者自行运转的。访问service的接口相对狭窄,我们只需要知道 service如何满足我们的功能需求,而不需要管理它的生命周期,不需要理会那些维持service运行所需要考虑的种种细节。即我们对于 service的了解只需要局限于功能接口即可,不需要理会它的那些管理接口,配置接口等。各种service在功能接口这一层面发生交互,整个图景得到 简化。最常见的一个例子就是数据库服务器,调用程序只要知道如何通过sql语言进行数据访问即可,另有数据库管理员去对付各种配置管理问题。从技术上说, 这可以看作是singleton模式的一种扩展。实际上spring容器中管理的bean在某种程度上就可以看作是独立于bean的调用者的,因而 spring这样的容器可以成为SOA架构的自然接入点。

2. 异步调用(asynchronous)。内禀的异步特性是SOA包容真正的商业智能的关键所在。想象一下我们现在需要评估用户的信用度,它对应于函数 evaluateCustomerCredit(customer). 最简单的情况下,我们只需要根据用户的某些指标直接进行算术运算即可。如果评估规则非常复杂,我们可能放弃硬编码,而引入规则引擎(Rule Engine)这种人工智能的解决方案。在更加复杂的情况下,我们可能无法抽象出以数学方式表达的规则,而必须依赖于业务人员的人工处理(真正的智能)。 此时,系统可能需要弹出一个页面,等待业务人员作出判断,部分情况下还需要经过审批流程才能决定对于用户信用度的最终评定。对于计算机系统而言,这些都是 漫长的过程,是同步调用方式所无法容纳的。同样是一个函数调用,只有异步特性才能够包容真正的商业智能,才能在函数这种最小的程序结构单元中引入最复杂的 处理过程。现在SOA的宣传往往集中于机器之间的互相调用,强调异构系统之间的一种包容性,但事实上异步特性所能承载的内容要远远超越机器世界本身。当 然,同步调用方式也是SOA架构的自然组成部分,就像我们既需要email, 也需要手机一样。

3. 基于消息(message based)。基于消息的调用方式是分布式系统的一种内在要求。消息是一种数据,它并不是远程对象指针。distributed object这种基于proxy-stub的方案其内禀要求是远程状态同步(状态的一致性),而分布式系统是由众多独立的状态空间(进程空间)所构成的, 这种内在的不协调是造成分布式对象方案难以实现可扩展性的关键原因。
  SOA与EBI(event-based integration)的区别主要在于EBI往往是push模式的,消息源向注册的消息consumer推送消息,而SOA往往还是一种pull的调 用。这两种方式各有千秋,在大的scale情况下,pull模式的可扩展性要更好一些。但是两种模式在企业应用中都是必不可少的,可能这些概念很快就会出 现融合。


4. 纯文本协议+元数据(Plaintext Meta)。SOA架构中基于纯文本协议是一个非常关键的技术抉择。当需要跨越众多硬件平台和软件系统的时候,各种二进制的RPC方案总是存在着难以彻底 解决的可理解性的问题。凭借纯文本的结构透明性加上元数据的自描述特性,我们希望实现一种语义透明性,使得各种中间层都能够以通用的方式传递经过的消息, 并理解其中需要理解的部分。与OOP(Object Oriented Programming)中的传统模式不同的是,SOA架构中强调的是结构(structure)与内容(content)的分离,而不是数据与行为的耦 合与封装. 表面上看起来,SOA中的调用方式似乎是对procedure(过程)化调用的回归,但实际上其中有着深刻的不同。在与元数据结合之后,在系统之间传递的 消息(信息)并不是完全被动的,而是具有某种smart特性。当数据这一方面可以包容更多的变化的时候,处理函数这一方面的结构可以得到简化。实际上,在 SOA架构中,我们推崇一种uniform interface, 也只有通过一种通用的接口,信息才能以比较低的代价穿越各种状态空间边界。基于通用接口,我们又重新发现了世界的简单性,而pipe-and- filter这种在unix系统中久经考验的设计模式也得到了新的发挥空间。
    说到纯文本的元语言,xml无疑是这一概念最强势的候选者。作为一种半结构化的文本表述,xml天然就是人机共享的信道。但是,随着应用的深入,当越来越 多的xml设计变得无法让人直观理解的时候,我们也感觉到了一些对于xml滥用的痕迹。W3C的Web Service协议栈提供了非常关键性的思想,并作为标准化的实现方式存在了很长的时间了,但是其实现和调用的繁琐和冗长逐渐引起了开发者的不满。 SOAP虽然号称Simple Object Access Protocol,但是今天已经很难把它和simple这个词拉上什么关系。也许Web Service的未来就如同EJB一样, 渐渐被更加pragmatic的方案所取代。

    在SOA架构中,松散耦合(loose couple)是late binding(discovery), standalone和message based等多种技术策略综合作用之后所达到的一种效果,这为外部灵活的流程配置做好了铺垫。

posted @ 2006-03-04 23:51 canonical 阅读(918) | 评论 (1)编辑 收藏