程序架构与设计(Java语言)

从事应用开发的程序员或多或少都曾有过这样的感觉:这个世界充斥着形形色色的概念和缩写,不知该追随这位导师还是信奉那个门派,如EJB,RoR,AJax、Hibernate、IoC、AOP。Rod John son在他在书中《Expert One on One J2EE Development without EJB》倡导一种的“循证架构”(evidence based architecture)。 
  选择一种架构、一种技术的依据是什么?Rod John son认为,应该是基于实践的证据、来自历史项目或亲自试验的经验。Rod John son通过这本书希望传达的、更为重要的信息正是“循证”的工作方式—————那原本就应该是程序员的工作方式。 
  有意思的是看过这本书的人觉得大牛(Rod John son)很牛,自己也可能很牛,但如何让全世界架构师一起牛起来,还是一头雾水。 
  我们从一个问题开始:如果,给你一个ERP的项目,你会选择什么架构,为什么? 
  Soap?EJB?不论你怎么选择哪一种架构,尽管你可以理直气壮的说这是xx大牛所推荐最佳方案。但Rod John son都会大声告诉你:错了,根本上错了,因为xx大牛的经验根本靠不住! 
  把项目架构在不靠谱的经验上当然危险。循证的核心理念是:一切活动基于当前最佳证据。证据包括两大类:知识和经验。知识大家都很清楚,我们来说说经验。首先看一下经验的效应公式: 
                          表面效应 = 原始效应 +  伪效应 + 实际效应 
  从公式中可以看出,大牛的有效经验其实并不单纯。以软件架构为例,假设原始效应是指公司的有效资源及开发团队能力(意味着拥有优质资源的公司,即使选择最差的架构也可能会成功),伪效应指信仰架构是最优架构所带来的精神动力(比较容易理解的例子是,专家给病人吃用淀粉做成没有任何药物作用的“药片”能治好疾病,简称安慰剂效应。表面上伪效应是有用的效应,实际上有害,它意味着将资源浪费在错误的信仰而非正确的信仰上,而未能获得正确信仰的有效收益。),实际效应才是某种架构应用于特定环境的有效性。 
  我们曾经在无数的书籍和文章中看到,EJB是J2EE的核心技术之一;而Rod John son在他的书中竟然宣称,绝大多数的J2EE应用根本不需要EJB。在技术选型的时候,估计都能很清醒的意识到:“技术应该以实用为主”。但我们不免又被大牛和自己的经验所左右。选还是不选EJB?谁也不愿意把自己的项目架构在空中楼阁中,但是怎么样才能获取架构方案真实的效果和适应环境呢? 
  倒推一下经验公式: 实际效应 = 表面效应 - (原始效应 +  伪效应)。 
  屏蔽掉表面效应上的偏倚(或波动因素),才是实际效应。循证来源循证医学领域,它有一个很有效的方法:随机对照实验(RCT)。这个实验是伪效应的天敌(时不时也出来狠揍伪科学),至少让一半以上的地球人多活至今日。随机对照实验方法很简单,通过一定量的样本,进行结果比较,目的是屏蔽伪效应和原始效应。如做一次《EJB对xx类项目适用/不适用》实验,设置500个样本,分成A,B两组,a组为实验组使用EJB,B组为对照组,使用某个特定的架构。最后收集实验组和对照组的关键数据进行比较,比较结果就能够很客观的反映EJB对某种特定环境是适应性。 
    再关注一下倒推公式,假设实验组和对照组在样本足够的时候能模拟出几乎相同的环境,那么实验组的实际效应应该是比对照组强的那部分,即:实验组实际效应 = 实验组表面效应 - 对照组表面效应。通过随机对照实验,经验公式的伪效应、原始效应所对应的外部环境、公司资源、开发团队就可以被最大限度剔除,还原其真实面目。随机的目的是通过抽样减低主观选择样本导致失真,RCT还有单盲实验,最初指让实验组病人吃实验药物,给照组吃设计的一模一样的药片(安慰剂),以避免实验组出现安慰剂效应。后来发现医生会潜意识更关注实验组和忽视对照组也会导致偏倚(病人觉得更受关注而疾病好的更快),设计出双盲实验,即医生和病人均不知病人吃的是药片还是安慰剂。 
  “可是,”有人说了,“我一直都是按照别人/网上/书上的建议来做架构的。要亲自考察各种各样的技术,甚至还有很多项目,还要根据项目情况比较它们的优劣,我可没这份时间。”。事实上,完整的RCT在医学界也存在伦理问题,如:拿病人生命做实验是否符合人类道德。似乎RCT只适用于新药研究(如艾滋病、癌症、sars、甲型H1N1,等等死马当活马医)。但并没有难倒doctor们,他们发明了meta评价方法。让任何一个企业开展500个实验组和对照组做一次《EJB对xx类项目适用/不适用》,都不靠谱。可大家往往都忽略了,全球各地至少已经存在50000个以上的《EJB应用于xx类项目成功/不成功》的案例。meta评价方法首先假设有办法收集足够多的样本(meta评价得益于互联网的发展),用RCT的思想对已有资料进行科学理性评价。所以,meta评价方法至少包括四部分: 
  1,收集足够多的样本,包括可获取的企业内外资料、互联网资料、期刊杂志,还有问卷调查。 
  2,形成对照,收集A、B、C...N组对照信息,通过对照还原真相。 
  3,控制偏倚,设计出能模拟RCT效果的偏倚控制。是不是很像程序设计?所以Rod John son认为循证架构是程序员本该的工作方式。 
  4,分析出它(经验)的成分、特征、适应症、用法、副作用、禁忌。 
  值得注意的是这是四个必要部分,而不是四个个顺序步骤。问题就有点类似于先做架构还是先做需求,在这里主要指先收集样本还是先控制偏倚。当然,一般意义上如果现有大量可靠样本,则先收集样本,再设计偏倚控制。反之,则先设计偏倚,然后收集样本(如先设计偏倚控制,假设使用问卷调查,在问卷调查中加入偏倚控制策略:问题陷阱、交叉验证等等)。循证架构的目的是收集及评价出高质量的架构方法,但同时又要避免被这种意识所引导,造成“主观偏倚”,这是RCT所禁忌的地方。 
  千万别小看RCT的魅力,医学界用它打趴下无数经典,也拯救了无数的生命,如放血疗法、维生素等等。美国新药上市,没有经过RCT根本不让上市。至今没有一位医学界大牛敢出来公开反对RCT,循证的帽子也被扣在几乎任何一个领域:循证经济、循证管理、循证物理。。。。。。包括循证谈恋爱。存在问题的地方就存在循证。  
  有点啰嗦,总结一下: 
  1,经验效应公式为:表面效应 = 原始效应 +  伪效应 + 实际效应 ,其倒推获得: 实际效应 = 表面效应 - (原始效应 +  伪效应)。 
  2,屏蔽表面效应上的偏倚(伪效应及原始效应)的有效办法是随机对照实验(RCT)。假设在大样本意义上的近似输入应该有类似输出,那么可以假设:实验组实际效应 = 实验组表面效应 - 对照组表面效应。 
  3,在无条件施行随机对照实验(RCT)时,可以采取meta评价方法。 
  4,meta评价方法包括:收集大量可靠样本、形成对照、控制偏倚、获取分析结果。 
  正像Rod John son所倡导的:尔等不必向泥胎偶像顶礼膜拜,圣灵正在尔等自身。当然,前提是经验的分享和验证。按照Rod John son的说法,一个合格架构师有足够的知识和经验,更重要的是架构师应该是信息的处理者,而不仅仅是信息的传播者。也就意味者,合格的架构师应该具有收集资料、控制偏倚、提取经验真相,从而获得最适合自身项目的架构方案,而不仅仅是捧着红宝书不断念叨“大牛xx说”或躺在自身经验的柴垛上吃空山。

时间: 2024-10-12 08:58:38

程序架构与设计(Java语言)的相关文章

[Java入门笔记] Java语言简介

前言 学习Java有一段时间了,但是一直缺少一个系统的思想,现在重新通过书籍中.网上的文章,视频等资料,整理与回顾Java的知识点. 言归正传,让我们先从了解Java语言开始. Java语言的由来 Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的.1995年更名为Java,并

Java 语言的 XPath API

果要告诉别人买一加仑牛奶,您会怎么说?“请去买一加仑牛奶回来” 还是 “从前门出去,向左转,走三个街区向右转,再走半个街区向右转进入商店.走向四号通道,沿通道走五米向左,拿一瓶一加仑装的牛奶然后到收银台付款.再沿原路回家.” 简直太可笑了.只要在 “请去买一加仑牛奶回来” 的基础上稍加指示,多数成人都能自己买回牛奶来. 查询语言和计算机搜索与此类似.直接说 “找一个 Cryptonomicon 的副本” 要比编写搜索某个数据库的详细逻辑容易得多.由于搜索操作的逻辑非常相似,可以发明一种通用语言让

堆栈--java语言的理解

堆栈 1,概要 堆栈是两种数据结构.堆栈都是一种数据项按序排列的的数据结构,只能在一端进行(称为栈顶(top))对数据项进行插入和删除. 要点:堆,列队优先,先进先出.栈,后进先出(Last-In/ First-Out). 2,对比(Java语言) 1.栈(stack)和堆(heap)都是java用来在Ram中存放数据的地方. 2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小和生存期必须是确定的,缺乏灵活性.另外,栈数据可以共享.堆的优势是,可以动态

2018.6.13 Java语言基础复习总结

Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计算机执行. 1.2汇编语言 负责把汇编语言翻译成二进制的机器语言,这种翻译程序就是汇编程序. 1.3高级语言 1954年第一个完全脱离机器硬件的高级语言FORTRAN诞生 1.3.1C语言 是一种计算机程序设计语言,它既有高级语言的特点,又具有汇编语言的特点. 1.3.2 C++语言 是具有面向对象

关于Java语言的平台版本,这些基础知识一定要知道!

Java语言概述 关于Java语言的平台版本,这些基础知识一定要知道!1詹姆斯·高斯林(James Gosling)1977年获得了加拿大卡尔加里大 学计算机科学学士学位,1983年 获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM 工作,设计IBM第一代工作站NeWS系统,但不受重视.后来 转至Sun公司,1990年,与Patrick,Naughton和Mike Sheridan等人合作"绿色计划",后来发展一套语言叫做"Oak",后改名为Java.最后

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的 源代码.细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我 们如何使用Java语言来使用系统的Binder机

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

JAVA如何进阶架构师,Java进阶之路——从初级程序员到架构师,从小工到专家

怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题.希望这篇文章会是你看到过的最全面最权威的回答. 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常用数据结构 数组.链表.堆.栈.队列.Hash表.二叉树等

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na