解决方案:增加Tomcat的JVM的Maximum memory pool的值,可根据具体机器的配置增加,在我的1G的机器上将其改为512M后,系统运行正常。
Step:
- 双击托盘上的Apache Tomcat图标(如果未出现,请先选择程序菜单Apache Tomcat -> Moniter Tomcat), 打开Tomcat Monitor的属性页面。
- 选择Java属性页。
- 设置Initial memory pool和Maximum memory pool的值。
- 确定。重新启动即可。
sofware development, technology, reviews...
奥卡姆剃刀(Occam's Razor, Ockham's Razor)是由14世纪逻辑学家奥卡姆的威廉提出的一个原理。奥卡姆(Ockham)在英格兰的萨里郡,那是他出生的地方(后人习惯称之为 "William of Occam")。这个原理称为"如无必要,勿增实体":
Entities should not be multiplied unnecessarily
此外,还有更多的关于"奥卡姆剃刀"原理的阐释:
解释任何事情都不应当增加不必要的实体数。One should not increase, beyond what is necessary, the number of entities required to explain anything.
如果某一原因既真又足以解释自然事物的特性,则我们不应当接受比这更多的原因。 We are to admit no more causes of natural things than such as are both true and sufficient to explain their appearances.(Isaac Newton)
当你有两个处于竞争地位的理论能得出同样的结论,那么简单的那个更好。When you have two competing theories which make exactly the same predictions, the one that is simpler is the better.
威廉使用这个原理证明了许多结论,包括“通过思辨不能得出上帝存在的结论”。这使他不受罗马教皇的欢迎[1]。在科学领域,“奥卡姆剃刀”作为一种“parsimony of explanations”的原则,具有很大的影响,爱因斯坦、霍金都明确地表示使用了这条法则来进行阐释和分析。对于商业以及生活中,作为一种简单的实用主义原则同样备受推崇,这方面的介绍可以参见附录部分的资料[2]。
在软件开发中,使用"Occam's Razor"原理是判断过度设计的一条好的法则,我们常常为了不必要的灵活性而使系统变得复杂。另一种我常见到的情况是在进行Unit Test Case设计时,很多人并非依据代码覆盖和逻辑覆盖的原则,而是简单的数据量增加或者写多处同一种情况的测试代码,测试者一厢情愿的认为这会帮助发现更多的Bug,但这只会让人难以理解测试设计的思路。
两个关于"简单"的相关性话题:
我看一个代码设计的好不好,最初的判断通常来自于直觉,它的基础就是"Simple is beauty"。之所有说是自觉,是因为"简单"并没有一个客观的标准,依靠提供者的信息和阅读者的感觉。如果从设计中我能够捕获设计者的思想,获得设计的关键抽象,在头脑中可以形成很清楚的结构图,它们的每一部分职责清楚,个体的概念明确,之间的联系也容易理解,这会给看的人一种愉悦的感觉。当然,好的设计有很多的因素,但这是最基础的"特质"[3]。而如果情况相反,则通常都是不好的设计,意味着还没有搞清楚事物本身的特征和之间联系,或者缺乏抽象和描述能力。自然界和社会的客观规律总是有章可循,但却呈现出复杂的表象,需要设计者具有很强的抽象能力来提取事物的"本质",简化这种复杂度。人的记忆力是有限的,很难理解过多概念的系统,但人却具有很强的逻辑思维能力,善于理解抽象特征,所以,如果一个设计提供的是表象的复杂度,通常很难理解,也可能意味着没有建立好的抽象。
上面提到的情况其实指的是一个系统的设计超过了它不该具备的复杂性,也就是说我们完全可能满足同样的要求下,通过分析抽象获得更简单的设计。但正如Fred Brooks所说,有的事物是本质复杂的[4]。如果一个系统打算完成10项功能,那只完成了其中5项功能的系统相比较完成了全部功能系统要简单。
本质复杂度有时候很难通过设计达到某一种简化,而常常需要通过减少一些功能来达到简单的目的。一项功能的存在总是有其价值的,如果没有原则的简化,也许系统的设计是简单了,但因为缺少了必要的功能可能使系统无法使用或极其难以使用,简而言之,"简单并非简陋"。
要简化系统的本质复杂性,需要考虑系统的使用价值和其它制约的平衡,比如时间、财务等资源性因素,以及系统设计复杂性。系统可以完成的功能就像巫师的口袋,是看不见底的,有时候为了努力保持系统设计的简单,删减一些不必要的功能是明智的。
关于这方面,我的另一个经验原则是:
当一个功能的价值没有明确时,尽量选择简单的方案。
正如人们说的,“软件开发是权衡的艺术”,要敢于舍弃,更要善于舍弃。
------
[1].引自 《What is Occam's Razor? 》 英文版, "三思科学"上的中文版:奥卡姆剃刀(Phil Gibbs 著,杉原广 补充,柯南 译)
[2].《奥卡姆剃刀:影响全球精英命运的思维法则》,作者:罗耶 编译,中国民航出版社
[3].参见C.Alexzander的"建筑的永恒之道",Alexzander认为好的建筑都具有某种无名"特质"。
[4].参见Fred Brooks的 "No Silver Bullet:Essence and Accidents of Software Engineering"
原文:2003/2/13
修订:2004/3/17
本文的主题涉及到公司进行863项目的一些内容,希望不会成为人们抨击公司和863项目本身的工具,我的目的是提供一些关于失败的教训或值得借鉴的经验。
原文序:2月11号下午,工作流项目组成员、部门主管XXX和我进行了一次比较长的关于工作流项目情况的总结性交流,以下是我通过交流对项目的一些认识和看法,从项目的最终结果的状态、项目的目标、项目开发过程中的好的和需要改进的地方等多个方面进行了分析。
项目来源于公司申报的国家863项目。工作流项目于2002年4月启动,12月份基本结束,但还未通过国家验收。
项目并未进行同类商业化产品的比较,主要目的是通过国家的验收,因此产品仅停留于技术原型状态。项目组选取了一些典型的应用案例,并基于原来在群件系统上的工作经验和WfMC(工作流管理联盟)的标准制定了需求,开发了可运行的基于J2EE平台的模型,其中包括了工作流引擎、建模工具以及一些示例,具备了应用开发包(SDK)的基本内容。
鉴于时间和本身的原因,我们并没有真正进行产品的技术性测试评估,而是根据项目的一些信息来了解它的成果。相对于市面上可使用的主流服务器(如BEA/IBM)厂商产品和第三方产品以及开放源码产品来说,在实用性、成熟度、同其它技术和环境的整合度(如安全)、开发支持产品(文档、指南等)等方面还有较大的差距,毕竟这些产品的开发时间较长,并具有良好的开发基础。总的说来,离产品化还有很大的差距,有些原因不可忽略:
经过交流发现项目存在以下现象:
公司在处理863项目没有自己的立场,为863项目而作863项目,没有考虑自己的发展方向,带来的结果是公司的高层领导并不关心以863计划为基础的项目,只有项目部才关心,因为他们需要对验收负责。到公司和部门来说,这些项目大多与公司的业务方向和基础背景不同,这带来了两个不利的方面,一是项目的目标不具有实用性,二是缺乏开发的基础。
工作流项目原来的目标据项目组说上级领导的意见是:
因此项目并不来自于自身的需求,而这样模糊的高层目标难以指导项目组完成具有真正可用性和市场化的产品。当然这些并不是在《前景》文档中反映出来的,然而是事实上的指导目标。
公司在过去企业应用的开发上虽然有一定的业务协作工作流的应用场景和办公协作应用的开发经验和理论基础,开发时对需求的处理也因无法找到好的需求获取渠道显得效果不是特别好,而且用例我觉得在描述这种需求上还很有局限性,无法体现应用价值和应用场景,应当增加其他的需求描述方式,当然需求渠道和应用场景是最主要的。
被外界干扰来源于几个方面:
因为工作流项目不是一个面向直接用户的产品,而是一个面向应用开发的基础服务产品,因此没有很明确的像MIS项目的交互式功能类型的需求,项目组在需求完成后无法获得对用户价值或“可视化”结果的主观感觉。
在处理这种类型项目上,以后的项目应该注意这点。我建议采用“领航者”项目来解决这个问题,即项目需求确定一个应用项目,可以是外部的,也可以是自己根据应用场景建立起来的,关于这个问题,以后的项目可以参考《软件架构:组织原则与模式》一书。这主要是让应用来驱动项目,并让项目组感到每一个完成点带来的价值。
前面已经提到9月以前项目的工作基本上提留在需求和部分的前期设计上,9月是项目的主要开发期,10月份项目成员有部分被抽调出去,10-11月集中在引擎的完善和增加外围部件。12后项目为了准备结项验收基本上结束了开发。基本上看来,项目整个的有效开发工作量约为5月*5人=25人.月,这对于像J2EE工作流应用这类产品来说太少了。
虽然项目是按照RUP方式来组织项目,但并不成功。阶段的划分比较机械,迭代的概念并不完整,阶段的划分和迭代的周期显得不合理,这也跟项目组的计划受外界影响可能有直接关系。从目前看,RUP并没有在我们内部真正使用好,RUP过于庞大复杂,建议以后的项目要慎重,不要机械的使用RUP。
SQA活动被要求,但并没有太多实际价值(改进活动)。这些活动包括组织(SQA部门)对项目活动和文档的评审,缺少对项目组真正有帮助价值的管理,这些是与组织的过程管理成熟度是有关的,在不成熟的组织,容易成为形式,并带来负面影响。
项目组没有一个明确的架构人员或架构组,以至于在一些项目项目的整体的构架决定上无法及时决策。在关键需求的定义、应用的验证和目录数据库技术引入等决定上都有影响。但对于每一部分具体的逻辑设计,构架组的作用并不明显,因此这里的构架组主要担任一种决策的职责。
但项目组同时也建立了与系统结构一致的组织:引擎组、建模工具组、原型组,这种结构应当是合理的,符合系统的特征,只是在进行的过程中,3个小组的节奏不太一致,难以形成一个整体的感觉,如果存在构架师或构架组也可能使他们更容易形成一个整体。
同时也发现项目组成员对整体的计划没有很好的理解。虽然项目经理公布了进度,但因为总体计划经常变化,以至于在成员心中没有了权威性,这一点也可以说与需求的变化和外部的干扰有很大的关系。当然项目组如果能够控制变更的节奏(如两周或一月才基线化变更,而不是一有变化就引入给其他成员)和更有效的方式来反映进度(如进度图表、测试通过率等形式化手段),也可能会有改进。