在我工作的公司,我们有一个成功的软件产品表现不错,但现在已经过时且不可维护.我想解释一下,为了生存,你需要创新并用新产品替换这个产品.我正在寻找一些公司的好例子,这些公司犯了我们即将犯下的错误 - 依靠一个成功的产品方式超过它的正常生命,所以我可以在做出论证时用它作为例证.
这些产品不一定是软件,象征性的案例,很好地说明了这种情况,但产品不是软件也受到赞赏.
如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存.这是如何在引擎盖下实施的?
编辑:我的应用程序使用大量的String对象,其中许多是相同的.使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?
根据我可以收集的有关.NET和Java执行环境的信息,目前的情况如下:
现代Java VM能够执行连续重新编译,与分析相结合可以产生很大的性能改进.较旧的JVM使用JIT.本文中的更多信息:http: //www.ibm.com/developerworks/library/j-jtp12214/ ,尤其是:Java理论与实践:动态编译和性能测量
.NET使用JIT或NGEN生成本机代码,但是一旦生成本机代码,就不会执行进一步的(运行时)优化.
抛开基准并且无意升级圣战,这是否意味着Java Hotspot VM比.Net领先一代.这些在Java VM中使用的技术最终是否会进入.NET运行时?
我经常被要求为我们的客户执行规模调整和容量规划.当我们的客户购买我们的产品(基本上是J2EE Web应用程序)时,他们经常会询问运行这些产品所需的硬件.我们的建议通常会导致高成本的硬件采购.
到目前为止,我开发的最佳启发式方法是将利用率预测(应用程序应注册的已注册和并发用户数)与我们现有安装中收集的数据进行比较.例如:如果安装A使用X硬件参加100个并发用户,那么安装B将需要2*X硬件来参加200个并发用户.
然而,这种方法存在许多问题.客户端通常使用不同的硬件和软件平台.他们从我们这里购买的产品通常是不一样的,通常部分应用程序是根据特定客户的订单构建的.考虑到软件版本正在改变等等,并且有如此多的参数可以使调整任务非常困难.
我研究了一些关于这个主题的书,有些人建议使用复杂的数学模型.这些方法需要作为输入的参数数量(例如应用程序功能的详细分类)让我觉得这些参数几乎没用.硬件通常在定义基本要求之前订购,更不用说这些在整个应用程序开发和生命周期中会有所不同.那么,您如何进行规模调整和容量规划?任何提示和如何赞赏.
我即将使用JProfiler和Eclipse Tptp进行java应用程序的研讨会分析,性能调优,内存分析,内存泄漏检测等. 我需要一些练习,我可以提供给参与者,他们可以:使用工具来分析发现问题:瓶颈,内存泄漏,次优代码等.我相信有丰富的经验和现实生活中的例子.
问题和解决方案不应过于复杂; 应该可以在几分钟内解决它们,最坏的情况是几小时.一些有趣的锻炼领域:
理想情况下,练习应包括样本未优化代码和解决方案代码.
我们的应用程序通常通过Web服务,MQ,JDBC,专有(直接通过套接字)和其他传输孩子连接到不同的后端之王.我们已经有许多实现允许我们从应用程序连接到这些后端,虽然所有这些实现都实现了公共java接口,但它们不共享任何其他内容.
我们已经意识到所有这些特定连接器实现都有共同的代码部分代码,我们决定通过一个通用连接器简化未来连接器的开发.此连接器将能够将消息格式化为后端预期的格式,并使用可用的传输机制发送它们.例如:MQ或超过套接字的固定长度消息格式.
我们面临的困境之一是这种连接器最合适的技术.到目前为止,我们的连接器是实现常见Java接口的基本java类.由于我们通常在某些Java EE应用程序服务器中托管我们的应用程序,因此Java Connector Architecture似乎是最适合此软件的技术.但是,实现符合JCA标准的连接器似乎相对复杂.采用标准有什么明显的好处 - JCA并且有益于额外的努力吗?
我理解它应该是其他方式(OSGI运行时托管Java EE服务器),因为它显然已经可以使用glassfish.
但是,我们的客户在管理传统Java EE服务器和重大投资(许可证,培训等)方面拥有丰富的经验.我们的架构将受益于OSGI模块化架构,但我不能要求我们的客户从Java EE服务器切换到OSGI运行时.
有没有办法在传统的Java EE服务器中安装OSGI运行时作为战争或耳朵,即使他们不使用容器管理的资源(例如线程或连接池),也不使用其他Java EE功能,如JNDI,EJB等?
我们的应用程序使用Hibernate,Spring等技术.
我刚开始为一个政府机构工作,我遇到了一个有趣的问题:业务规则取决于立法机关,因此他们必须尊重立法机关活跃的确切时间段.
举个例子,如果一个主题在某个特定日期申请了补贴,那么他必须根据该特定日期的血管有效标准进行评估.同样的补贴,适用于某些日后申请的人有不同的标准.我想知道是否有一种已知的模式来有序地处理这些依赖于时间的规则.目前,代码中散布着类似于以下内容的表达式:
if application.date >”July 17th, 2008”
管理此问题的最佳方法是什么?
在过去的几个月里,我一直在从Java转换到Groovy,我可以欣赏它带来的许多好处:更少的代码,闭包,构建器,MOP最终使Grails成为可能的框架,在编写测试时易于模拟等.
但是,我被同事"指责"我的代码并不够常规.也就是说,我仍然为我的参数和字段声明类型,倾向于使用继承和多态而不是鸭子打字等.在我看来,在这些情况下,它不仅是动态与静态,而且是动态与面向对象的范式.有点困境.在那些情况下,我仍然倾向于选择OO.我觉得OO范例在其基本前提中具有很大的价值,允许您将代码结构与特定的现实世界概念进行抽象和关联.
所以,以下是我需要帮助的特殊问题:
我应该为参数,字段等声明类型吗?
当简单方法做的时候,我应该将代码块声明为闭包吗?
我什么时候应该使用duck typing而不是多态动态调度.例如,在groovy我可以做动物."$ action"()或def动物; animal.action(),而不是Animal animal = new Dog(); animal.action().我可以在开放 - 封闭原则的上下文中首先看到问题,但是更喜欢OO样式多态的任何其他原因?
什么时候应该在groovy中使用接口(如果有的话)?
我确信还有一些其他类似的困境,我没记下来.我也认为这些问题不仅适用于groovy,也适用于任何其他动态语言.你有什么意见?
想象一下,我有一个代表简单洗衣机的课程.它可以按以下顺序执行以下操作:打开 - >清洗 - >离心 - >关闭.我看到两个基本的选择:
我可以使用方法turnOn(),wash(int minutes),离心(int revs),turnOff()等方法使用WashingMachine类.这个问题是接口没有说明正确的操作顺序.如果客户端在打开机器之前尝试离心,我最多可以抛出InvalidOprationException.我还可以使用separete程序类,它将离心机转速和洗涤分钟传递给WashingMachine并简化这些方法.
我可以让类本身处理正确的转换并使用单个方法nextOperation().另一方面,问题在于语义很差.客户端不知道调用nextOperation()时会发生什么.想象一下,您实现了离心机按钮的单击事件,因此它调用nextOperation().打开机器后,用户按下离心机按钮!机器开始洗了.我可能需要在我的类上使用一些属性来参数化操作,或者可能需要一个带有washLength和centrifugeRevs字段的单独的Program类,但这不是真正的问题.
哪种选择更好?或者也许还有一些我错过的其他更好的选择?
java ×6
java-ee ×3
oop ×2
.net ×1
backend ×1
comparison ×1
connector ×1
ejb ×1
end-of-life ×1
groovy ×1
hardware ×1
innovation ×1
jca ×1
jit ×1
jvm-hotspot ×1
lifecycle ×1
memory-leaks ×1
modularity ×1
ooad ×1
optimization ×1
osgi ×1
paradigms ×1
performance ×1
product ×1
profiling ×1
sizing ×1