初学者如何开发出一个高质量的J2EE系统?

J2EE征途坎坷,越来越多人走上这条崎岖之路,如何给他们一个正确引导、好坏评判,本文试图抛砖引玉,用简单语言描述一个高质量的J2EE系统是如何开发的?

http://www.jdon.com/idea/j2eebasic.htm

你好 Banq先生 关注你的文章很长一段时间了, 对你在Java领域的技术水平,以及在很多问题上的看法, 也非常佩服. 国内目前达到你的水平的人真是很少(当然高人也许都隐居起来了). 但是, 有几个问题想与你讨论:
首先,软件是一个绝对的应用技术,任何技术离开了具体的应用, 坦率地说是毫无价值的.我看,Jdon也有在这方面的尝试,如网站,网上商店生成系统等.但这与真正的企业应用还有非常大的距离. 我不了解,你在这一领域里为什么没有涉足,是因为你认为很困难,基本上是以我们国内目前的技术水平无法到达呢, 还是因为你不屑于这方面的深入, 认为你所追求的是纯粹超然的技术概念呢.
我的其他问题有赖于了解你关于这个问题的回答,让我们继续关注和讨论.

首先十分感谢您的文章!
一直都像上面那位先生一样十分关注您的文章,很浅显易懂,而且总能使人受益匪浅(至少我是这样的,可能我的水平很低吧),一针见血的指出我心中的疑问!
不过还有个问题想向您请教,就是您所说的Domain Model,是指RUP中的领域建模吗,我分析了一下,大概是的,还请您帮我解释一番!

借宝地,感谢bang老师的指引,我是天天来的!

最近公司定书,我第一个定了bang老师的书。呵呵!

文章写得太好了,读后大有醍醐灌顶之感,对于 banq 先生的热心和谦虚虫子深感钦佩,有一次公司在研发一个应用开发框架时,架构师曾引用了Jdon的一篇文章,开发了一套Delphi版本的JMS,当时我就将Jdon加入收藏夹,一直也没有机会来逛,现在有机会转到java,Jdon是我每天开机后第一个进入的网页,简约而不简单,Jdon给了我很大的帮助,转入java时间不长,但是已经深深领略到她的美。

再次感谢Jdon,感谢 banq ,感谢所有帮助过我的朋友!

>但这与真正的企业应用还有非常大的距离. 我不了解,你在这一领域里为什么没有涉足,是因为你认为很困难,基本上是以我们国内目前的技术

多谢探讨,这个问题很复杂,大概有下列几点:
1. 现在软件技术不再象以前的技术,以前的技术可以说只有做个这个行业大型软件系统的经验的人才可以说对这些软件技术有掌握,而现在的技术则不必了,J2EE讲究架构,J2EE它是一套应用软件的规范,也就是说,J2EE是很多做过大型软件的人进行汇总后的经验精华,一个大型系统需要哪些技术部分、什么时候适合什么技术,在J2EE标准中基本都有涉及,例如EJB技术、JMS等。

这样,如果你能完全掌握和驾驭这些J2EE架构技术,你有时确实不必一定要做个大型软件经验才型,这称为站在巨人的肩膀上。

但是反过来,如果你没有丰富的软件系统实战经验,你去理解EJB/JMS等就很困难,所以这两个技术对初学者比较难的原因之一。

2. UML结合J2EE这样OO一套实施过程从方法论以及模式角度固化了软件数据库系统的分析 设计开发,这也是因为有MDA(将这些过程用软件自动生成代码)诞生的原因。虽然这些简化了我们开发系统的过程,但是这只是解决了应用系统的一部分问题,工作流等尚未成熟,使用这样方式开发系统,依据我的经验,最后会将烦琐和细致的工作压在Jsp页面上,目前开发一个系统,结合标签库和用户界面需求这个工作反而花费我更多时间,希望JSF在这方面能有效率提升,等这些技术细节都能解决,基本J2EE非常成熟了。

3.目前我通过咨询角色和一些软件公司一起承接一些企业应用项目,例如去年承接一个大型外资人事系统,他们要求管理GE 等几家外资企业的人事福利(这些企业外包人事给他们),如果专为一家公司开发人事很简单,但是要求这个人事适合多家,那么重用性要求很高,设计抽象面很高,他们在新加坡有类似系统,但技术很老,我听过新加坡的系统,他们也有一些经验总结,大部分和我的J2EE设计相吻合,我和新加坡的人交流过想法,他们很惊奇,不太相信,加上费用问题,只进行了初步架构设计就搁浅了。

4.不要小看网站系统,以前网站系统都是用PHP Perl做,功能很弱,无法和企业系统相比,但是随着Inernet普及,更多人要求联网,例如如果一家公司的ERP通过互联网实现,那么老总出差就很方便,但是现在为一家公司开发一个基于internet的ERP很贵,比传统的贵,这不合理,这也是SOA提出的目的之一,以后ERP实现网上租用,就象你申请一个Blog或论坛或Email,你可以为你的企业申请一个ERP系统,这样只要企业付租费就可以了,这可理想目前已经接近,前段时间美国一家提供这种服务的企业来上海做宣传,他们的业绩增长速度极其快 500%.

通过网站提供ERP等企业服务对于软件设计的重用性要求很高,就一套邮箱系统可以服务很多用户一样,你必须设计出一套重要性、灵活性很高的ERP系统适合不同的用户,可见网站软件的水平是极其高的。前面我做的网站自动生成系统到现在我都认为完成不够好,现在很多网站都提供这种服务,这象Blog,但是Blog等只限制你网站模板,而不是自由定制页面,所以Blog这些都是小孩玩家家,根本无发走向商业,著名的那个方兴东鼓吹Blog,其实没有技术革新,靠你媒体吹呼就是革命了。


banq老师好,最近大致抽象总结出了一个比较浅显的规律,既是您平均一两个月能够发一篇比较的适合初学者的帖子,但每一篇都可以对偶的有关知识的梳理和导向能够起到很重要的作用,不敢说终生受用但也似乎会持久难忘了,在此还是要道一声感谢。

既然题目是初学者...高质量的J2EE系统,那么就题目本身这个用例来说,参与者该是“novice”了,领域模型应该是"高质量的"+"J2EE系统",那么能否请您再深一步的举个样例来说明何为"high quality j2ee system"呢?估计您不会选petshop,但有可能会将jive和jdon算进来,但偶真正想看到的是一个就您个人来讲曾经有过consultant经验的项目作为例子来简要阐述下高质量+j2ee系统的概貌,或者象您前面某篇论oo和数据库的矛盾的文章一样,能否前瞻性的给出一个在您心目中最理想的高质量j2ee系统的轮廓呢?比如jsf(new version>1.1)+ejb3.0+j2ee设计模式?偶觉得struts+spring+hibernate并不敢称为高质量的或是j2ee系统,所以总觉得从现在开始既该有意识的用一下jsf+ejb3来设计了,但由于不知道有没有人在这方面开始吃螃蟹了,所以只好去随大流的关心些什么ajax,xp之类的流行名词了。但从内心来讲,无论是javascript还是组件式编程,无论是spring+hibernate还是ejb3,无论是xp还是fdd,无非是想尽量按照客户的要求迅速提交一个界面新颖,结构稳定的一个能够跨平台的良好的系统吧。假如能预知何为一个好的系统的话,似乎事情会变的简单些,也就不必为那些喋喋不休的争论着技术名词的人们所困扰了。

但由于目前偶的能力所限和所处的时期的特殊性,似乎想马上就拿jsf+ejb3来首选做企业级开发还有点不现实,那么作为一个apprentice来说,能够做的似乎只有学习模式了,偶不知道关于模式该学到多深才合适,只相信尽量选择从建模的时候就配合着设计模式来考虑可能会有助于系统的稳定和重用,谈到这里有引申出关于题目的另外一个话题,就是“初学者”,偶觉得如果想作为计算机编程人员的话,面对着不停的新技术名词和版本更迭,似乎偶总要做一名初学着来的说,于是最近有意识的在看一些数据结构方面的课程,希望能够从一些理论基础中来寻找那些所谓的新技术背后所蕴涵的知识,但还是那句话,由于能力有限,所得甚浅,所以希望您如果能站在一个咨询家的角度来看,能否指点一下,就您认为的如果想设计一个好的软件系统来说,或许不仅限于j2ee,该多看看哪些computer science中的理论知识呢?偶不知道这个问题提的对不对,但总觉得设计模式对于系统的意义,是类似于数据结构和算法之相对于程序的意义的,所以假如您在类似的方面能有些心得的话,希望能够得到一点指点。

(偶的废话似乎不少,希望banq老师能忍受)

谢谢 Banq 先生在6月23日非常认真的回复(抱歉由于忙,没能马上回复). 总结起来, 如果我的理解不错的话, 你的结论是 1)你认为网站系统并不可小觑(同意,一个高访问量,同时能够实现网上交易的网站的确如此).2)EJB/JMS技术对于初学者来说是不容易,但是对你来说,你是可以Handdle的. 3)你也有承接企业系统的实际经验,象你说的那个HR系统. 但不知您以咨询身份参加的这个HR系统到底都解决的是实际管理中的什么样的问题?在性能方面都达到了什么样的水平? 具体来说,采用了哪些技术(诸如您帖中提到的一些技术)应对了实际中具体的什么样的问题. 此外以你在这个HR系统的经验来看, 是一个多少人的Team,采取什么样的开发方式和开发进度(人员和时间的分配比例)开发的.你认为在这样的一个项目的开发过程中最关键的是什么?最影响 Prductivity的又是什么?

对这样一些问题看上去似乎很空泛,但是实际上能够真正反映出我一开始提出的issue,"软件是一个绝对的应用技术,任何技术离开了具体的应用, 坦率地说是毫无价值的".举个例子来说,书本上,名家们会告诉你, Value List Handler 这个设计模式是解决这样的问题:"You have a remote client that wants to iterate over a large results list." 一般来说,如果是一个大量地查找某一些"topic/dimension"下的数据,这样的问题,我们也毫无疑问地确定要用到这个模式.但是,如果对一条具体的数据,如某一个销售员,要和他的客户讨论(在线谈判)他们之间的一个具体合同,这时候会不会也需要用到这个模式.如果要用这个模式,到底是用Stateful Session Bean 还是用 Stateless Session Bean 实现呢,他们各自在实现方法上对性能的影响是什么, 当你决定采用了某种实现方法,你到底是怎样Tradeoff的呢; 最后对这个设计模式来说,在最终的设计方案中如何把它抽象到对一个通用的,普遍的业务问题,而不是仅仅对"某一个销售员,要和他的客户讨论他们之间的一个具体合同"这样的一个特例问题,作出一个通用的解决方案,适应任意规模,任意业务的企业,真正达到软件工程的目标:高度的Reusing 和 Scalablity. 实际的企业应用系统就是充满着类似这样的问题,很有挑战.但有些技术人员就仅仅满足于自己可以用某项技术做出一些小的Demo了,就不愿意,或根本不屑于深入下去面对一个实际的应用问题.

因此, 我相信您应该能够非常理解,我为什么感兴趣了解您对我上面提出问题答案.

您的很多看法都很不错, 我非常同意, 希望我们能在今后进一步深入地探讨. 谢谢!

>你认为在这样的一个项目的开发过程中最关键的是什么?最影响 Prductivity的又是什么?

当这样的项目使用框架组件组合后,由于系统重要 重用的功能已经封装在框架软件中,所以,只要能够组装出应用系统,一般第一次测试就会立即通过,我已经不止一次体会这种快感,我现在基本告别以前那种花费大量时间在Java调试上时代,我相信很多初学者还在这个泥潭里挣扎,这就成为影响一个产品的主要原因,现在使用jdon框架开发,几乎消灭这个因素。

那么,现在最影响 Prductivity的是什么?就是技术外的因素:项目管理。

关于你提的性能方面设计达到什么水平等,这些我已经整合进入Jdon框架,使用Jdon框架开发,几乎无需考虑性能设计,一开始就具有优越的性能,这些都是有测试数据,Java产品的好处就是一切可以自己动手,不必听从第三方评价,因为那些都有失公正,服务器配置上Jprofile/Optimizeit,客户端配置Jmeter,启动几个线程一跑,Jdon框架和应用程序的性能真相就出来了,所以,在Java领域,开源和商业产品是在同一起跑线,面对不同的用户:前者是更有头脑,自己动手;后者是对自己缺乏自信的人;服务是两者的重点。

>在最终的设计方案中如何把它抽象到对一个通用的,普遍的业务问题,而不>是仅仅对"某一个销售员,要和他的客户讨论他们之间的一个具体合同"这>样的一个特例问题

其实你说的行业框架提炼的问题,这和业务相关,Jdon框架等都是基础框架,没有这些组件框架的优雅解决方式,就没有行业框架的好的开始,我想你不希望在行业框架提炼之后,发现无法加入一些纵向功能,就象数据库设计好之后,几年以后却成为你发展的障碍。

行业框架需要资深的行业背景,这也不是一般人做的,但是工作流/Portal等都是行业框架的提炼,这些也是我们以后发展的方向。

就我个人来说,我愿意解决重要问题,然后我告诉更多人解决方向,如果他们相信,大家一起努力来解决所有问题,而不是靠我一个人解决所有问题。


to shuiwx
很抱歉现在才回复你的问题:
>如果想设计一个好的软件系统来说,或许不仅限于j2ee,该多看看哪些>computer science中的理论知识

设计一个好的软件系统我文章里其实写了,掌握分层解耦宗旨,学习使用一些现成的框架就可以了,如果你不原意囫囵吞枣,那么研究一下这些框架设计原理和模式,这些会花费你很长探索,数据结构、编译原理这些已经成为底层机制,就象汇编是底层一样,现在的大学计算机教学完全是错误的,学习的都是正确的废话。所以没有必要在那些大学课程上浪费时间。

增强项目经验,研读源码,自己动手编写项目是提升水平的唯一道路。
以上只是我个人意见。

谢谢Banq先生的回复, 你的很多观点都很好,我非常同意.象你所说最影响Prductivity的是技术外的因素:项目管理. 但我不知你能不能有一些具体的看法.因为任何行业,最终的问题, 竞争力的问题都是如何通过管理来提高Prductivity. 不知你对软件这一行业有没有特别的见解.

开源项目的确有它的优势,特别是作这些开源项目的人,往往是一些技术的精英.但是, 我还是以为应该以成熟的Commercial产品作为自己开发的基础,即所谓"巨人的肩膀". 这是因为, 成功的Commercial产品往往更注重最终用户, 这是这些产品能够给它的公司带来巨大的商业利润的源泉.纯技术的专家往往会忽视这一点.

要成就一件事(一个大型企业管理应用的项目), 是需要很多人踏踏实实,坚持不懈(这也非常重要)的努力.这和去上上课,或者在场外指导一下,有很大的区别.

我希望通过你这个论坛, 结识一些志同道合的朋友, 能够作成这样一件事.再次谢谢你的回复, 我因为很多时候很忙,有一些Deadline非常紧的事情,有时没能马上给您回复, 请你见谅.

非常感谢JoannaYe 讨论,从言论中感觉你是一个职业的项目经理。非常专业。

项目经理和设计师良好沟通和理解交流,是一个项目成功的关键。

关于开源和Commercial区别,我个人觉得它们之间真的没有严格的区别,只不过是两种思路的表现:开源通过免费产品卖服务;Commercial是既想卖产品又卖服务,不能因为它的产品卖钱,就是技术好,一般是市场品牌好。

就拿EJB实现来说,在所有J2EE服务器中只有开源JBoss 4.0使用AOP实现,坚持AOP的一些纯设计派认为EJB过时了,那么Weblogic /Websphere等这些以支持EJB自诩的服务器产品反而不如开源产品呢。这些人认为:EJB<AOP+EJB<AOP+POJO;按照这个不等式,商业产品卖的都是过时技术。

但是正如你说:为什么客户还是购买Websphere等服务器,因为它们注重最终用户。

我认为一直试图在这两者之间寻找平衡是挑战的事情。




Banq大师你好,很高兴看到你的文章。我现在有个问题:我搞J2EE项目/课题也有很长时间了,过去搞J2EE时主要用的是EJB,包括statefull, stateless SessionBean以及EntityBean.最近似乎非常流行Hibernate,很多人甚至说要将Hibernate取代EJB,至少是EJB里的EntityBean。但是EJB3里面还一直保留着ENtityBean。我另外还看到有人建议说将来搞J2EE项目时最好是把商业逻辑放在stateless SessionBean里面,而把持久层数据处理用HIbernate来完成。这样的例子我还没有见过,banq大师能谈谈?或者介绍有关这方面的资料?

谢谢!

不敢称大师,这个问题一年前在Jdon讨论得很厉害,可查查以前的精华贴:
http://www.jdon.com/communication.htm

Java领域的技术一直会百花齐放,完全看你使用者方便和喜好。

我问过很多有 很长 java 开发经验的人员,你文中的这些概念。

但是,几乎没有人能讲明白。

该文章讲的比较清楚。

就像《工作流管理模型、方法和系统》 的第一章(我非常喜欢这一章)

解释为什么要工作(为了获取生活资料),为什么要协同工作(经济,现实) 。
协同工作 就需要 流程。

娓娓道来,非常清楚有趣。
我喜欢。