[翻译]J2EE项目危机

基于JavaEE的“三味”书屋网上售书系统 故而为了努力不让社会淘汰我们,必须做到与时俱进、对于新知识不断探索与浓烈的好奇心, 21世纪,一个网络蓬勃、信息漫天的时代,时间对于我们而言是十分宝贵的,可能为了工作,为了学习,为了娱乐等等人们没有时间、精力到书店去,即便有时间精力到书店去,也不知道哪家书店有我们想要的书,这个买卖双方都无法保证。另一方面,书店的经营者没有一些好的途径让人们知道我书店究竟有些什么书,而且价格便宜,此时买卖双方信息便无法互通,这样的阻碍便是“三味”书屋的原动力。5.2.1 无“用户名“,”密码“直接登陆 29。 阅读详情

J2EE项目危机【翻译】

避免这10项J2EE危机来确保你的企业JAVA项目成功

摘要

在你着手企业级JAVA 项目开发时,你需要像耍杂技掌控手中的球一样来处理一些问题:与工具商之间的关系,漫长的工程——不论是设计还是开发,还是保持健壮性。每一项都会带来固有的危险,一些是明显的,然而另外一些却不是。但所有这些危机均可避免。本文作者分析了10项危机企业级JAVA项目的最大的危险,并大致指出了避免它们的办法。(4,500字——此处是指英文字数)

By Humphrey Sheil


作者:Humphrey Sheil
原文出处:http://java.sun.com/developer/technicalArticles/J2EE/projectdangers/
翻译:gooing 2005-01-18
http://blog.youkuaiyun.com/gooing/
感谢金山词霸和薛叉叉,请指正!

在我作为开发者、高级开发者、架构师的经历中,我遇到过好的、差的甚至是丑陋的企业级JAVA项目。当我问自己,是什么使一个项目成功而使另外的失败,我发现很难得到一个完美的答案,就好像很难用成功来定义所有的软件项目。J2EE项目也不例外。因此,项目被分为不同级别的成功或失败。在这篇文章里,我主要想为您——读者朋友——揭示影响企业级JAVA项目的最大的10项危险。

一些危险只是简单的延迟项目进度,一些却是错误的征兆,而还有一些使项目彻底没有成功的希望。尽管如此,如果具有良好的准备,征程开始前相关的知识和熟悉地形的向导,所有的都可避免。

这篇文章结构简单,我会按以下方式来揭示各种危机:

  • 危机的名称
  • 项目阶段(Project phase):危机所出现的项目阶段
  • 所牵连的项目阶段(Project phase(s) affected):大多情况下,这些危机对随后的“项目阶段”有一种顺带(knock-on)的影响
  • 解决:避免危机的方式以及如何最小化它们的影响
  • 注释:有关该危机我想透露的观点,但不适合以前的分类

如上所注,我们将在企业级JAVA项目背景和它的各个重要阶段中检查每一项危险。这些项目阶段包括:

  • 供应商选择:在你启动J2EE工程之前,挑选你的最佳工具组合的过程——不论是应用服务器还是咖啡品牌
  • 设计:不论是严格的瀑布模型还是"code it and see"(试翻译为:编码和运行查看)方式,我对设计都有这样一个观点:我做了充分的设计,因此我可以轻松的进入开发阶段。当我确切知道我在建造什么和如何建造时,我认为我的设计阶段完成。另外,在进入开发阶段之前,我使用设计模板来保证我对我自己问了所有正确的问题并且有了建议的解决方法。然而,我在该阶段同样也不害怕写代码;有时,这是回答问题的唯一方式,执行和模块化( performance or modularity)。
  • 开发:这个阶段早期有大量工作要做。选择好的工具加上一个良好的设计并不总是意味着开发阶段会非常顺利,但的确会很有用。
  • 稳定性/负荷测试:在这个阶段,系统架构师和项目管理员将关注系统健壮性和构建质量,如确保系统的关键统计——并发用户数,失败的情境等。然而,直到这一阶段,代码质量和运行亦不应被忽略。事实上,你不能留一些差的或慢的代码到健壮性阶段来改。
  • 存在阶段[live]:这并不是真正的项目阶段,it's a date set in stone(想了半天也不知道怎么翻译:-{)这是关于准备的阶段,也是以前的错误的鬼怪出没的地方,不论是差的设计、开发还是错误的(开发工具)卖主的选择。

  • 供应商选择:在你启动J2EE工程之前,挑选你的最佳工具组合的过程——不论是应用服务器还是咖啡品牌
  • 设计:不论是严格的瀑布模型还是"code it and see"(试翻译为:编码和运行查看)方式,我对设计都有这样一个观点:我做了充分的设计,因此我可以轻松的进入开发阶段。当我确切知道我在建造什么和如何建造时,我认为我的设计阶段完成。另外,在进入开发阶段之前,我使用设计模板来保证我对我自己问了所有正确的问题并且有了建议的解决方法。然而,我在该阶段同样也不害怕写代码;有时,这是回答问题的唯一方式,执行和模块化( performance or modularity)。
  • 开发:这个阶段早期有大量工作要做。选择好的工具加上一个良好的设计并不总是意味着开发阶段会非常顺利,但的确会很有用。
  • 稳定性/负荷测试:在这个阶段,系统架构师和项目管理员将关注系统健壮性和构建质量,如确保系统的关键统计——并发用户数,失败的情境等。然而,直到这一阶段,代码质量和运行亦不应被忽略。事实上,你不能留一些差的或慢的代码到健壮性阶段来改。
  • 存在阶段[live]:这并不是真正的项目阶段,it's a date set in stone(想了半天也不知道怎么翻译:-{)这是关于准备的阶段,也是以前的错误的鬼怪出没的地方,不论是差的设计、开发还是错误的(开发工具)卖主的选择。

  • 供应商选择:在你启动J2EE工程之前,挑选你的最佳工具组合的过程——不论是应用服务器还是咖啡品牌
  • 设计:不论是严格的瀑布模型还是"code it and see"(试翻译为:编码和运行查看)方式,我对设计都有这样一个观点:我做了充分的设计,因此我可以轻松的进入开发阶段。当我确切知道我在建造什么和如何建造时,我认为我的设计阶段完成。另外,在进入开发阶段之前,我使用设计模板来保证我对我自己问了所有正确的问题并且有了建议的解决方法。然而,我在该阶段同样也不害怕写代码;有时,这是回答问题的唯一方式,执行和模块化( performance or modularity)。
  • 开发:这个阶段早期有大量工作要做。选择好的工具加上一个良好的设计并不总是意味着开发阶段会非常顺利,但的确会很有用。
  • 稳定性/负荷测试:在这个阶段,系统架构师和项目管理员将关注系统健壮性和构建质量,如确保系统的关键统计——并发用户数,失败的情境等。然而,直到这一阶段,代码质量和运行亦不应被忽略。事实上,你不能留一些差的或慢的代码到健壮性阶段来改。
  • 存在阶段[live]:这并不是真正的项目阶段,it's a date set in stone(想了半天也不知道怎么翻译:-{)这是关于准备的阶段,也是以前的错误的鬼怪出没的地方,不论是差的设计、开发还是错误的(开发工具)卖主的选择。

  • 供应商选择:在你启动J2EE工程之前,挑选你的最佳工具组合的过程——不论是应用服务器还是咖啡品牌
  • 设计:不论是严格的瀑布模型还是"code it and see"(试翻译为:编码和运行查看)方式,我对设计都有这样一个观点:我做了充分的设计,因此我可以轻松的进入开发阶段。当我确切知道我在建造什么和如何建造时,我认为我的设计阶段完成。另外,在进入开发阶段之前,我使用设计模板来保证我对我自己问了所有正确的问题并且有了建议的解决方法。然而,我在该阶段同样也不害怕写代码;有时,这是回答问题的唯一方式,执行和模块化( performance or modularity)。
  • 开发:这个阶段早期有大量工作要做。选择好的工具加上一个良好的设计并不总是意味着开发阶段会非常顺利,但的确会很有用。
  • 稳定性/负荷测试:在这个阶段,系统架构师和项目管理员将关注系统健壮性和构建质量,如确保系统的关键统计——并发用户数,失败的情境等。然而,直到这一阶段,代码质量和运行亦不应被忽略。事实上,你不能留一些差的或慢的代码到健壮性阶段来改。
  • 存在阶段[live]:这并不是真正的项目阶段,it's a date set in stone(想了半天也不知道怎么翻译:-{)这是关于准备的阶段,也是以前的错误的鬼怪出没的地方,不论是差的设计、开发还是错误的(开发工具)卖主的选择。

图1阐释了这些项目阶段,以及对其有影响的各种因素(尤其是那些“突然的[knock-on]”影响)

 


Figure 1. Enterprise Java project phases
and their most likely reasons for failure.
Click on thumbnail to view full-size
image. (60 KB)

危机1:没有理解Java,没有理解EJB,没有理解J2EE


好,现在我将其分解成3个小主题来进一步阐释。

描述:不理解Java

项目阶段:开发阶段

所牵连的项目阶段:设计,稳定阶段,存在阶段

受影响的系统特性:可维护性,可测量性(scalability),执行性

征兆:

  • 重复实现已经包含于JDK核心APIs里的函数功能和类

 

  • 不知道下面所列的任何一项或几项是什么和它们能做什么(下面列出了一些示例)

     

    • 垃圾回收(train, generational, incremental, synchronous, asynchronous)
    • 对象什么时候可以被“垃圾回收”——
    • Java里面继承特性的使用(及其权衡使用)
    • 方法重载
    • 为什么java.lang.String(此处替代你自己喜爱的类)似乎性能很差
    • 忽略Java引用的语义(与忽略EJB中值的语义相对)
    • 对非基本类型(nonprimitives)使用==而不是实现equals()方法
    • 在不同平台上Java线程的进度如何(for example, pre-emptive or not)
    • 绿色线程VS本地线程
    • 热点[Hotspot](Hotspot <and why old performance tuning techniques negate Hotspot optimizations>)
    • JIT以及什么时候好的JITs变差(不安装的Java编译器并且你的代码依然运行良好等)
    • The Collections API
    • RMI

解决办法:

你需要提高你的Java知识,尤其是了解它的优势和弱点。Java的存在已经远远超除了一门语言本身,同样重要的是理解这平台(JDK and tools).具体的,你应当具有做一名Java 程序员的资格(如果你还没有的话)——你将对你有如此多不了解的东西感到吃惊。更进一步,将它作为你小组的一部分并向其他人推广,这种方式同样很有乐趣。更进一步,创建一份邮件列表,专心于Java技术并且保持下去。(我曾工作过的公司都有这些列表,大多数由于不更新而变的岌岌可危)向你的同伴学习——他们是你最好的资源。

注:

如果你或你团队中的其他成员不理解这门编程语言和这平台,你又怎么能期待建造一个成功的企业级Java应用呢?健壮的Java程序员对于EJB和J2EE如果鸭子对于水一般。与之相对,差的没有经验的程序员将建造一个质量差的J2EE应用。

 

描述:不理解EJB

项目阶段:设计

所牵涉项目阶段:开发,稳定性阶段

受影响的系统特性:可维护性

征兆:

  • EJBs在第一次被调用后就不再管了(尤其是处于就绪池[ready pool]的无状态SESSION BEANS)
  • 非重用的(Nonreusable)EJBs
  • 相比于容器提供的,开发者不知道可依赖什么
  • 不符合规范的EJBs(fire threads,调用本地库,试图完成I/O操作等)

解决:

为提高你的EJB知识,花一个周末来阅读EJB规范(1.1规范有314页)。然后阅读2.0规范(524页)来了解为什么1.1规范不再适用和2.0规范能带给你什么。关注规范中那些能告诉你——应用开发者——什么是在EJB中合法的行为的部分。18.1和18.2节是开始的好地方。

注:

不要从你的提供商(指应用服务器或其他开发软件的提供商——译者)的眼里看EJB世界。确保你了解符合规范的EJB模型和特殊的实现之间的不同。这将保证在需要时你可以将你的技术带给你的提供商(或其他版本)。

描述:不理解J2EE    

项目阶段:设计

所牵涉项目阶段:开发

受影响的系统特性:可维护性,可度量性(scalability),执行性


征兆:

  • “什么都是EJB”的设计
  • 手工配置而不是使用容器提供的机制
  • 客户安全实现——J2EE平台或许是在企业计算中最完全和完整的安全架构,从表现一直到后台;它全部能力很少被全部使用的

解决:

学习J2EE关键组件以及每个组件所能带来的优势和劣势。依次涉及各项服务,此处知识和能力一样重要。

注:

只有知识能解决这些问题。好的Java 开发者造就好的EJB开发者——一步步地可以完美地成为J2EE领袖的人。你获得越多的Java/J2EE知识,你在设计和实现方面的能力越强.Things will start to slot into place for you at design time.(想了半天也不知道怎么翻译:-{ )

危机2:过度设计(无论是否是对于EJB)

项目阶段:设计

所涉及的项目阶段:开发

受影响的系统特性:可维护性,可测量性(scalability),可执行性


征兆:

  • 特大型EJBs
  • 开发者无法解释他们的EJBs做什么和它们之间的关系
  • 不可重用的EJBs,组件,或服务——当它们应该重用时
  • 当已经存在的事务可以完成任务时,EJBs 启动新的事务
  • 数据独立性被设定的太高(为了安全的目的)

解决:
解决过度设计的方法可以直接从XP(extreme programming)中找到:局部范围内,设计和编码实现最小的暴露的[bare minimum]部分来满足需求,而不要做的过多。当你需要意识到将来的需求,比如平均负载需求和在系统负载顶峰时候的行为,不要试图“第二次猜测”[second-guess]系统将来需要成为的样子。另外,J2EE平台为你定义了特性如可测度性和服务器底层需要捕获的任务错误。

注:

除了上面的解决方式,使用设计模式——它们会显著的提高你的系统设计。EJB模型本身广泛地使用设计模式。如,每个EJB里的Home接口是一个寻找者和工厂模式的例子[Finder and Factory pattern].一个EJB的远程接口担当实际bean的实现的代理,也是容器截取调用和提供服务如透明化负载均衡的能力关键。忽略设计模式的价值是危险的。

我不断强调的另一种危险是:为使用EJB而使用。你的应用的一些部分在不适合被当作EJB模型时候而被设计为EJB模型,你的整个应用似乎使用EJBs将获得无限价值。这是极度的过分设计,我曾看到完美的servlet 和 JavaBean 应用在并没有好的技术方面的原因而使用EJBs时,变的乱七八糟,不得不重新设计。

危机3:未分离表示逻辑和商业逻辑

项目阶段:设计

所涉及的项目阶段:开发

所影响的系统性能:可维护性,可扩展性,可执行性

症状:

  • 大型且笨拙的JSPs
  • 当商业逻辑改变时,你发现你需要编辑JSP文件
  • 显示需求的改变迫使你编辑和重新部署EJBs和后台组件

解决:

J2EE平台给你将表示逻辑同导航和控制分离并最终与商业逻辑分离的机会,这被称为Model2 结构(参见 Resources )。如果你已经掉进圈套,一种比较呆板的做法或许有用。你应该至少使 那些大部分自我包含的片断保持“垂直瘦小”[thin vertical slices](这是说,我如何布局的一个片断要同如何更改我的用户名和密码分开)。在你系统中使用这种方式来重新组织。

注:

在你的工程中使用一种连接UI框架(如标签库)坚固的设计将帮助你避免逻辑分离问题,不要为你自己需要的GUI框架设计而烦恼,这会为你带来诸多执行方面的好处。依次评估每一种框架,然后选择最适合你的那种。


危机4 :未在你开发的地方部署

项目阶段:开发

所影响的项目阶段:稳定阶段,并行阶段,存在阶段

所影响的系统特性:正常的心智(Your sanity)

征兆:

  • 持续多日及1周的向真正应用系统的迁移
  • 关于运行期的风险是固有的,伴随着诸多未测试的不清晰和主要的情节
  • 在运行期系统上的数据和开发及稳定期间的数据不相同
  • 在开发者机器上无法运行构建[builds]
  • 应用的行为在开发环境、稳定性环境、产品环境不一致

解决:

危机4的解决办法是将你产品的环境如实地复制到你的开发环境。在你打算放置产品的确切的环境上开发——不要在Red Hat Linux 上用JDK1.3开发,然后却布置到 JDK 1.2.2 和 Solaris 7 上。进一步,不要在这个应用服务器上开发却部署到另外的服务器上。同时,得到你产品的数据库的数据的大致印象,并且在其上进行测试,不要依赖人工创造的数据。如果产品数据是敏感的[sensitive],减少其敏感性,装载它。意想不到的产品数据将打破:

  • 数据有效性规则
  • 已经测试的系统行为
  • 系统组件间的契约(尤其是EJB-EJB和EJB-DB之间)

最坏的情况,每一项均会导致异常,空指针和你以前从未见过的行为。

注:

开发者经常到稳定阶段才想起安全性(“耶!屏幕正常,让我们把用户加为确认的员工”)。花费同样的时间来避免这种圈套实现安全性,就像你分离商业逻辑时候做的那样。

实施是一个复杂的过程,充满政治问题和技术问题。你将会碰到你不期望的问题;这就是实施的全部。开发环境和稳定性环境给你在实施前犯错误和找到问题的空间,利用这点,将减少应用实施过程中你的痛苦和风险。

你经历的项目越多,你就越容易知道什么能运行什么不能,为你和你的同伴保留一本项目记事本。在实施过程,你的目标应该是同样的错误不犯两次。

 

危机5:选择错误的(开发工具)提供商

项目阶段:提供商选择

所牵涉的项目阶段:设计,开发,稳定性/负载测试,实施

所影响的系统特性:可测量性,执行性,可维护性,稳定性

征兆:

  • 开发人员花费较长的时间和工具“较劲”[wrestling],而不是有效的使用它们
  • 在执行过程中,重要的系统需要重新设计来避开知道和不知道的bugs
  • 不同工具间差的整合性乃至丝毫不能整合(应用服务器和IDE,IDE和调试工具,源代码控制和构造工具,等等等等)
  • 对于IDE,调试器等,开发者简单的以个人的喜好来选择或放弃

解决:

为了避免危机5,你需要一个好的供应商选择过程。危机10在这里是适用的。

对于IDEs,唯一的评价方法是去使用它。评价J2EE的唯一的方式是构建一个你的观念构架中用到的特性的实现。事实上,当你花费3个月开发和投资到一项特殊的培训的时候,你不会希望在这些工具之间出现BUG.

那么,当你开发的半路上遇到关于工具集的麻烦的时候怎么办?一些工具似乎比其他的更加重要。如果你选择的应用服务器不适合你的需求,你要接受它并改变规范。如果IDE令人恶心,就设置最小级别的代码规范(tabs对空格等等),并让开发者寻找能最大限度提高生产效率的配置。

注:

了解最好的供应商和工具作为一项特殊的任务并非是一个“只做一次”的工作。你需要不断对市场评估。例如,过去的12个月,我曾用过4个不同的IDE,这取决于我的应用服务器平台,而不是我是否写EJB代码。

危机6:不了解你的供应商

项目阶段:供应商选择

所涉及的项目阶段:供应商选择之后的所有阶段

受影响的系统特性:可维护性,可测量性,执行性

征兆:

  • 开发时间比最坏的估计时间长33%
  • 当供应商或实现提供的功能超出“圈子”[作者使用了 box,不懂——译者注]时,开发者重新发明轮子。[Developers reinvent the wheel when the vendor or implementation provides the required functionality out of the box]

解决:

为避免由于不了解供应商而产生的问题,去订阅所有的供应商所能提供的资源,如邮件列表,新闻组,和发行注释(尤其是那些修订BUGS的列表);你将得到无可估量的信息。

一旦你选定了供应商就要马上投资于培训,然后,建立一个快速的概念的实现来打破这个它。[Once you've picked your vendors, invest in training as soon as possible, ideally well before the project kicks off. Next, build a quick proof of concept to break the team in gently.原文如此,译的郁闷:-{] 建立两个Ejbs并部署它们,然后通过你的显示层技术(Swing GUI,Jsps 等)调用它们。如果你试着构造你的开发环境同时试着满足一个项目目标,环境的设置将不尽人意。事实上,我曾经看到过没有经过部署过程的项目,原因是“我们没有时间”。当团队不得不每天晚上干到11点仅仅是为了获得一个发布的应用的时候,此处的意义就显得尤为重要。因此,事先花费一些时间将这些细节处理好,在以后的路上你将节约大量时间。对那些说“我们的计划没有给我们这么多的时间”的人,我要说,“你的计划没有给你不做它的时间。”

注: 

在J2EE世界中,工具提供商的技术的可转换性[transferable]如何呢?让我们看一看两个供应商的具体例子——IBM和BEA系统公司——支持EJB1.1的不同的应用服务器。确实,BEA WebLogic 5.1 和 IBM WebSphere 3.5 有多大程度的相似呢?

  1. BEA WebLogic 的配置管理风格与IBM WebSphere 非常不同。
  2. IBM对于WEBSPHERE采用了全GUI环境,与此对应,BEA 对于WebLogic提供了全命令行的控制工具。
  3. IBM WebSphere 对于程序员采用了IIOP 来通讯和抛出CORBA 可见的异常,weblogic根本没有CORBA 层,默认采用t3协议。

这里只是几个不同之处,还有许多。概要:多数的供应商之间的相似就像粉笔和奶油之相似一样。在一种应用服务器上成为一名专家并不意味着你在所有的服务器上都是专家。上面的讨论适合于任何东西:IDEs,调试器,编译工具,配置管理等等。对于一种特殊工具拥有使用经验对于评价其竞争对手是一件好事情。但这并不意味着你可以从一种工具平滑的过度到另一种。尽量给你自己时间来熟悉你的工具。

 

危机7:没有为可测量性或可执行性设计

项目阶段:设计

所涉及的项目阶段:开发,测试,生存期

受影响的系统特性:可测量性,可执行性,可维护性

征兆:

  • 系统慢的不可接受
  • 过度利用服务端状态的系统及不能充分利用供应商集群技术

解决:

对于危机7,在分析阶段你要明确的知道系统的执行性能和测量性能——在进入开发之前就要知道你需要得到的数字。如果你知道你需要每秒处理50个交易,但所有的实体Bean的设计只能提供40个交易/秒,那么你需要为你的系统寻找替代方式,比如存储过程,批处理或重写的OLTP 方面[reworked OLTP aspects ].

尽量求助于你的工具供应商——他们应该知道他们产品的优缺点,并因此而帮助你。

注:

没有为可测量性或可执行性设计经常和危机2(过度设计)相抵触。事实上,它们相互取长补短。对于危机2我的解决方式是只有绝对需要的时候才进行部署。对于确定可测量性和可执行性,你可以在需要的时候设置可能的最大值。

如果你确定大量的测度是一个必需的需求,你可以指定一个支持最大聚合的应用服务器,可能的话,为你的执行提供一个交易缓存。进一步,你可以设计商业对象如Ejbs来最大程度的利用服务器的架构。XP没有这样的问题,你仍然可以在必须的时候再部署.

我回顾这种方式,思考提供这种平衡的方式。当我想一个最简单的系统时,那个系统需要提供客户要求的功能和行为。

 

危机8:陈旧的开发过程

项目阶段:开发

所涉及的项目阶段:稳定性,生存期

受影响的系统特性:可维护性和编码质量

征兆:

  • 一个项目计划像可疑的瀑布模型:“首先,我们进行整体设计,然后,我们坐下花大量时间来编码。”
  • 由于部署过程不存在,部署便成了一个噩梦。
  • 部署的天数等于所花费的开发天数,因为什么都没完成。
  • 在整合时组件未经过充分测试。实际上,整体测试意味着将两个不稳定的组件的绑到一起,然后看它们的堆栈。

解决:
一个好的软件设计方法将拯救你的生命。我经常提到XP;下面的资源包含一个这样的链接(Resources)。你将发现XP覆盖了很大的细节。

注:
我并没有 没经过Junit单元测试和没有用Ant部署的经历——那是两个可以加强XP方法的免费工具。参见: Resources.

危机9:使用框架失败

项目阶段:开发

所涉及的项目阶段:开发过程,稳定性能,生存期

受影响的系统特性:可维护性,可扩展性和编码质量

征兆:

  • 核心库中的Bug在代码里重复使用
  • 没有设定日志标准——因此系统的输出不可读或不能转换成scripts
  • 差的或不协调的异常处理。在一些站点上我看到,终端用户在一些低级错误上被暴露,例如,当用户试图为购物车结帐的时候出现SQLException的堆栈追踪。用户接下来做什么呢?打电话给数据库管理员并强制报告这个错误吗?

下面的任务需要开发者在大量的情况下处理,并且,应该作为使用框架的首要任务:

  • 记录日志
  • 异常处理
  • 获取相关资源的链接(数据库,名字服务等)
  • 建立JSP页面
  • 数据有效性验证

解决:

我对在重型应用中使用轻量级框架坚信不移。事实上,我在JavaWorld的第一篇文章"Frameworks Save the Day" 讨论过在企业开发环境中使用框架的问题。如果你现在已经在开发,马上采用框架仍然将获得重大收益。你将经历重新工作的痛苦,像日志及异常捕获,但就长远来看,你会节约大量时间和金钱。

注:

当你采用框架和面向组件编程时候,考虑不同级别的重用。在第一层,重塑(plumbing),使用0.9或更高的重用因子(reuse factor),这意味着90%的工程将用到它。越是特殊的服务,其重用因子越低。是说,我可能建立一个帐号服务来管理资源使用,希望50%的工程用到它。但对于那些需要它的工程——那些搞开发的男孩将很高兴它在那里!

危机10:将工程计划和设计基于市场广告,而不是技术现实

注:

危机10并未出现在我的列表中,直到我认识到有许多的人而不仅仅是我一个存在对企业java的误解,尤其是那些新鲜的领域。

项目阶段:
所有的项目阶段,尤其是供应商的选择更明显。

所影响的项目阶段:
所有阶段

所影响的项目特性:
可维护性,可扩展性,设计质量,代码质量

征兆:

  • 技术方面的决策占很轻的分量,因为EJB被设计的轻便
  • 供应商选择对于产品未经过是否轻便的试验
  • 在项目生存期需要选择工具

解决:

不要相信在你项目之外的任何既得利益者。这是说:不要相信供应商(除非你已经了解他们了),不要相信供应商提供的白纸。如果你想要一些真实的应用服务器的建议,查询以前的链接:Resources。进一步,下载你想评测的工具,挽起袖子,设计原型。通过提供的例子来运行(任何好的提供商都有例子)。

总之,选择正确的供应商和工具集需要花费时间,尽管你的时间可能并不充裕。将你的选择集中到3个-4个,然后每个都试一下。花费一周的时间来验证你的应用服务器,IDE,部署过程等等,直到用这些工具可以满足你的开发计划时。

注:
如果你对J2EE不熟悉,在项目开始阶段你将很受打击。一开始所做的决定将对整个项目的成功有巨大的影响。一个好的J2EE顾问可能要进行一个重大的供应商选择过程并很好地将你带入设计和开发状态。

只有这10项危机?

10只是一个武断的数字,只是作为一个断点——还有数不清的其他危机存在。确实,我自己仍知道比这多一倍的危机。即使这样,如果你防备了这里所列出的,我保证你的工程可以完美和成功。

如果只从这篇文章中吸取一样东西,我的建议是:没有什么可以替代经验和计划的[There is no substitute for experience and planning]。如果你没有经验,那么你去试,然后得到它。在工程过程中,不要将赌注押到工程开始时候你以及你团队的培训上。开发前就进行一些编码,更好的是在设计之前就做编码。把你的Java和J2EE团队交给经验丰富的人来带以确保整个工程的方向和你团队中那些经验少的成员可以沿着这条路成长起来。

最后,我写的越多,我越清楚我想说的:

  • 软件工程的社会层面
  • 单元测试和整体测试(什么时候测试完成?)
  • 设计模式
  • 异常捕获

唉,我没有那么多的空间,下一篇文章将很快出来。不论如何,祝好运!

结论

好吧,就这么多。上面的互相影响的10项危机,是你在企业Java开发中将要面对或已经面对的大多数(如果不是全部的话)问题的原因。自然的,在你的旅途中还会遇到许多问题,但我相信,我已经揭示了最主要的原因。做个回顾,下面就是按重要程度划分的这10项危机:

  1. 没有理解Java,没有理解EJB,没有理解J2EE
  2. 过度设计(无论是否是对于EJB)
  3. 未分离表示逻辑和商业逻辑
  4. 未在你开发的地方部署
  5. 选择错误的(开发工具)提供商
  6. 不了解你的供应商
  7. 没有为可测量性或可执行性设计
  8. 陈旧的开发过程
  9. 使用框架失败
  10. 将工程计划和设计基于市场广告,而不是技术现实
FPGA 学习系列(2):Verilog 语法基础 Verilog 由门级建模数据流建模行为建模门级建模(Gate Level Modeling):使用基本逻辑门描述电路,接近硬件物理结构。数据流建模(Data Flow Modeling):使用assign语句进行组合逻辑建模,类似数学方程式。行为建模(Behavioral Modeling):使用always代码块和if-elsecase等控制语句建模,抽象程度较高。Verilog 代码一般由模块(module)组成,每个模块描述一个独立的硬件功能。 阅读详情

相关推荐

Qwen3.5本地部署实战:4B模型在RTX3060上离线运行指南

大语言模型本地化部署正从云端服务转向终端设备,其核心是模型轻量化、硬件适配与推理引擎协同优化。基于INT4量化感知训练和GGUF格式支持,Qwen3.5在结构精简、Tokenizer轻量及显存友好性方面显著优于前代,使4B级别模型可在RTX 3060等中端显卡上稳定运行。该技术路径兼顾低延迟响应(<2秒)、数据隐私保障与离线可用性,广泛适用于法律文书分析、医疗文档处理、教育AI助手等对安全性与实时性双重要求的场景。本文聚焦Qwen3.5-4B量化部署全流程,涵盖llama.cpp编译调优、GPU层加载策略及

weixin_32181267的博客 365

J2EE项目危机【翻译】 -避免这10项J2EE危机来确保你的企业JAVA项目成功

在我作为开发者、高级开发者、架构师的经历中,我遇到过好的、差的甚至是丑陋的企业级JAVA项目。当我问自己,是什么使一个项目成功而使另外的失败,我发现很难得到一个完美的答案,就好像很难用成功来定义所有的软件项目。J2EE项目也不例外。因此,项目被分为不同级别的成功或失败。在这篇文章里,我主要想为您——读者朋友——揭示影响企业级JAVA项目的最大的10项危险。一些危险只是简单的延迟项目进度,一些却是错...

十八画生 镜像站点http://blog.youkuaiyun.com/wangyihust 433

利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)

1、知识概述 (1)软件定义网络: (2)mininet: Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。特别是SDN,在真实网络中进行相关的网络实验有一定难度,自然需要一个仿真平台可以学习这种新型的网络架构,而Mininet就应运而生,承担了这个光荣而艰巨的使命。Mininet自带交换机(switchs)、主机(hosts)、控制器(controllers),同时,在mininet上可以安装OpenvSwitch、多种控制器(NOX\POX

北风 1万+

J2EE项目危机 -避免这10项J2EE危机来确保你的企业JAVA项目成功

J2EE项目危机【翻译】 -避免这10项J2EE危机来确保你的企业JAVA项目成功[ 作者: | 来源:优快云 文档| 点击数:151]  在我作为开发者、高级开发者、架构师的经历中,我遇到过好的、差的甚至是丑陋的企业级JAVA项目。当我问自己,是什么使一个项目成功而使另外的失败,我发现很难得到一个完美的答案,就好像很难用成功来定义所有的软件项目。J2EE项目也不

xymyeah 1279

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 294

SAP FICO 资产会计AA后台配置 (上)

输入折旧表“CZ11”如有外币计价的资产,则需指定外币计价的资产折旧范围,以及规则。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。新增资产类型:Z101 固定资产-房屋及建筑物新增资产类型:Z301 固定资产-房屋及建筑物。

ghgxm520的博客 1762

oracle eclispe,Oracle 扼杀 Java EE!

原标题:Oracle 扼杀 Java EE!2017 年,Oracle 对外宣布,为了 Java EE 可以拥有更快速的创新发展,其决定将 Java EE 移交给新东家 Eclipse 基金会。彼时无论是对着 Java EE 有着突出贡献的 IBM、Red Hat,还是 Eclipse 基金会,均对这次的移交持乐观态度,Eclipse 基金会的执行总监 Mike Milinkovich 也曾表示,...

weixin_36349685的博客 137

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

当Spring遇见AI:一个老框架的中年危机

Spring 二十年发展始终围绕优化人类编程体验,如注解、自动配置等。但 AI 眼中,这些为人类设计的语义化、简化配置等特性成冗余。作者设想 AI 可能需要更直接的函数式框架,认为程序员角色正从创作者转向意图表达者。同时提到 Spring AI 的集成尝试,猜测 Spring 或成 “QWERTY 式” 标准,感慨其是人类为自己设计的最后一代框架,而未来是无需理解只需使用的新世界。

架构师刘7的博客 939

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 947

【定位教程2----旋转中心标定之方法一】

【定位教程2----旋转中心标定之方法一】

Quintin 3万+

《软件工程导论》学习笔记·

第一章,软件工程导论: 软件危机:计算机软件开发维护过程中所遇到得一系列严重的问题。 软件危机的典型表现: 对软件开发成本和进度的估计常常很不准确。 用户对以完成的软件系统不满意的现象经常发生。 软件产品质量靠不住 软件常常是不可维护的 软件常常没有适当的文档资料。 软件成本在计算机系统总成本所占比例逐年上升。 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。 ...

山河已无恙 3万+

游戏开发:逻辑与渲染分离技术解析

游戏开发中逻辑与渲染分离的架构设计 本文系统阐述了游戏开发中逻辑与渲染分离的设计原则与实践方法。文章首先定义了核心概念:逻辑层负责游戏规则与状态,渲染层处理视觉表现,二者通过数据模型层进行通信。通过历史回顾,揭示了从早期混合架构到现代分层设计的演变过程。 在技术实现层面,文章详细分析了分离架构的优势:性能优化、流畅度控制、测试便利性、扩展灵活性以及团队协作效率。提供了Unity和Unreal两大引擎的具体实现方案,包括代码示例、分层模型和最佳实践。特别探讨了网络同步、客户端预测、插值处理等关键技术难点。 文

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1060

比尔盖茨笔记--参加达沃斯论坛心情小记

摘要:比尔盖茨自20世纪90年代以来总是会出席在达沃斯召开的世界经济论坛。今年达沃斯论坛的焦点是气候变化和由经济危机余波所产生的问题,这包括谁应该从投资和金融危机中获利。 在今年的达沃斯世界经济论坛上有许多不确定性,这是由于关于金融危机有一些悬而未决的问题,这包括金融危机是什么原因造成的,金融危机是谁的责任以及我们需要做什么改变? 我参加达沃斯论坛至今已经有15年了。这是一个功能强大的,商...

qjoycn 164

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【软件工程】软件工程概述——大体框架初步认识

软件工程大体框架初步认识,主要对整个软件工程进行先导的认知,简单的了解整个学科的框架结构,简单认识每一部分的大体知识内容,以及相关的书目推荐汇总

bay_Tong桐小白的博客 745

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

GigaSpaces 改革之路 (Survival Guilde for IT)白皮书的翻译文档

前言•危机,是由两个字组成的,“危”和“机”,一个代表危险,一个代表机会。•经济危机要求公司更加高效。降低成本,提高效率,是云计算的主要承诺。•1、改革才能生存–降低成本,提高效率•2、内部操作系统的虚拟化(VMware)–降低IT成本的变革之路–Gartner –虚拟化和云计算是2009年两大战略性技术–Forrester –云计算带来的财政收益非常重要•3、应用层的虚拟化将节省更多的成本 应...

johsonwon的专栏 257

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C,C++,C#,java的区别

简单地说,它们不是一种语言,语法有差别,编程时具体用到的类库或者函数库也不一样。虽然它们不是一种语言,不过它们却也有所联系。广泛地说,C可以看作其他三种语言的源语言,因为其他三种语言几乎都是从C而来的,无论从数据类型还是控制语句看,其他三种语言都有从C得来的迹象。其中C++则一般看作是对C语言的扩展。因为C语言没有面向对象的语法结构,而当时业界又迫切需要面向对象的编程特性,所以贝尔实验室的开发者就

rosekisser的专栏 3929

java编程语言_Java编程语言庆祝成立25周年

java编程语言 Java编程语言将于本周(即2020年5月23日)庆祝其成立十周年,这标志着Sun Microsystems首次将Java推向世界的第二十五年。 古老的语言在企业中仍然很受欢迎,即使是诸如Python和Go之类的众多竞争对手语言,现在也正在争夺软件开发人员的心。 但是Java并没有停滞不前,它正在进行一次旨在解决长期难题的改进。 起源于1991年的“ Oak”项目,由Jam...

cxu0262的博客 309

Java语言概述(上)

java基础知识图解 1.软件开发介绍 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。 人机交互方式 ------图形化界面(Graphical User Interface GUI)这种方式简单直观,使用者易于接受,容易上手操作。 ------命令行方式(Command Line Interface CLI):需要有一个控制台,输出特定的指...

qq_40805387的博客 349

准备下个月毕业论文答辩完了背着麻袋&睡袋奔赴上海找工作

[color=green] [size=large] 在济南这上学,眼看下个月就要毕业答辩了,却还一直没有找到实习的地方。也不是完全找不到,过完年第一次应聘了济南的一个小公司,笔试面试都过了之后让我去工作,最后我想了想还是给公司打了电话道了谦说自己还有点事不能去实习了。其实是我的想法是以后去上海找工作,怕在济南这里实习之后再走实在对公司过意不去,毕竟是小公司,把你培养起来也不容易,如果...

秀才的梦想 286

Oracle 扼杀 Java EE!

2017 年,Oracle 对外宣布,为了 Java EE 可以拥有更快速的创新发展,其决定将 Java EE 移交给新东家 Eclipse 基金会。彼时无论是对着 Java EE 有着突出贡献的 IBM、Red Hat,还是 Eclipse 基金会,均对这次的移交持乐观态度,Eclipse 基金会的执行总监Mike Milinkovich 也曾表示,这正是企业级 Java 所需要的,也是社...

优快云资讯 3270

新鲜阅读

blogers,你们受尊重了吗?--Grindery for Code Cattle你博我也博, 可是我想自己博,我碍着谁了? 也说说第一博客--自由人/Libero(Mirror)相关:预测2006年博客十大发展趋势老徐,中文第一博,走哪儿都有人关注个性化的Blog Skin制作方法详解 --seven2000的专栏本教程的适用范围以及相关注意事项适用范围:本教程适用于.Text的B

优快云 博客周刊 1094
上一篇: [学习小记]Java的反射机制
下一篇: [Java学习]使用digester 解析xml配置文件
Gooing
博客等级 码龄24年 4粉丝 59原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值