技术架构评估
--主要对Java、Dotnet等技术进行综合评估weide2005 年 12 月17 日
在本文中我们将根据一个业务需求对当前流行的几种技术架构进行评估。
这篇文章的目的不是为了评价各种技术架构在单项指标上的优劣,仅仅根据我们描述的业务需求做出选择。同时,强烈希望大家发表自己的意见和建议,帮助我们做出这种选择。
业务场景描述这是一个经典的业务场景,其核心问题是:作为一家行业软件提供商,要形成自己的
企业应用框架[6],并在该企业应用框架上搭建行业的整体解决方案。
现状:经过多年的积累,我们形成了一个系列的行业软件产品,从几个方面分别描述如下:
- 满足的业务需求: 服务于企业质量管理这一行业,同时为满足不同的业务需求,产生了相应的多款产品
- 使用的数据库: SQL AnyWhere、SQLServer、Oracle
- 开发语言(工具): PB、VC、Delphi、Dotnet(C#)、Java(JSP)
- 发布形式: 核心业务仍以C/S为主,最新的项目根据企业需求也用Dotnet/Java实现了少量B/S应用。最终的产品线将会是B/S、C/S共存,包括单机版、网络版;标准版、定制版本的产品系列。
- 经营模式: 定制开发与标准版软件升级并行,在标准版的基础上进行定制,同时把适用于多数企业的新功能合并到标准版中来。
- 用户数许可规模:当前的数量级为N*10,可预期的上升空间为几百到几千。所以对应用服务器、并发等性能要求不算太大。
目标:
将这些不同语言开发的,拥有不同发布形式,但却服务于同一行业的单个软件,统一到一致的技术架构下,并增加B/S发布模式的支持。最终形成B/S与C/S相结合的产品系列,形成行业的整体解决方案。
举例描述:首先用Java(或C#)搭建企业应用框架,该框架包含认证/权限/组织角色管理、文件管理等通用性的功能。然后在该框架的基础上把现存
C/S版的--PB实现的财务管理系统,Delphi实现的库存管理系统,VC实现的局域网即时通讯系统的业务功能模块全部用Java或(C#)重写,并
增加B/S版本的实现。
统一到一致的企业应用框架下,形成统一、规范的开发方式,使得我们不用再去维护多个技术团队;通过一致的企业应用框架,建立积累机制,逐步形成并完善整个系统的业务功能。
评价方法
根据上述业务场景的目标,我们根据如下几个因素进行评价,同时希望得到大家的意见和建议,最终将在这些数据的基础上形成一个综合性的评估结论。
社区文化
开发语言流行程度
技术体系和思维方式
成本
学习曲线
社区文化Python和Ruby从技术角度也能够满足我们的要求,但由于在国内太“小众”,缺乏相应的技术支持和客户基础,现阶段不被考虑。Java和dotnet目前都拥有活跃和为数众多的开发社区,我们能够获得足够的交流空间和技术支持。
Ruby
知道Ruby是因为Ruby on Rails,一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上。它被宣传为现有企业框架的一个替代,而它的目标,简而言之,就是让生活,至少是
Web 开发方面的生活,变得更轻松。
但是,对于Ruby实在生疏的厉害,虽然知道也有相关的GUI库,但如果拿它来做一个系列产品,可能人手都找不够。基本没有交集,资源不列举了。
Python
Dotnet
Dotnet最大的社区是MSDN Home?MSDN中文网站拥有无数的中文Dotnet技术资源,这也是国内相比Java的一大资源优势。
Dotnet社区,其中最受关注的是多是关于控件以及和技术关系不是太大而在非技术上很有争议的随笔.在java社区已经普及的面向对象以及模式的概念,在.net社区鲜有提及.
在cnblogs的情况稍微好些. 不过通常局限在运用面向对象和模式来解决一些示例性的小问题.这样层次似乎太低了,这离企业级的应用差的还比较远。
[4]Java
Java由于时间的积累,项目的积累,社区资源多多。很多在实践第一线的开发人员、架构师活跃在各个社区之中。由于社区文化的不同,Java社区有N
多技术先行者,并乐于把自己的开发经验分享给整个社区。而Dotnet由于时间尚短,在这方面相对较差。
Java开源产品多,面临的选择多,各开源项目文档充分程度各异,且文档又多以英文为主:( 好在国内的Java牛人自发组织了文档的翻译
[5],并乐于分享自己的学习体验,这种方式对于技术的提高又有很大的帮助。
英文
TheServerSide.com http://www.theserverside.com/tss
http://java.sun.com
http://www.javaworld.com
中文
BlogJava http://www.blogjava.net/
Java视线论坛 http://forum.javaeye.com/index.php
Matrix http://www.matrix.org.cn
J道-专业的Java解决之道 http://www.jdon.com/
Java爱好者http://www.javafan.net/index.jsp
BEA dev2dev 在线 http://dev2dev.bea.com.cn/
IBM developerWorks 中国 http://www-128.ibm.com/developerworks/cn/java/index.html
http://www.javaresearch.org Java相关技术综合服务网站
http://www.javaworld.com.tw/jute/index.html
开发语言活跃程度我们将引入两个排行榜,来评估开发语言的活跃程度和受欢迎程度。
TIOBE程序语言使用排行榜
下面列出2005年11月排行榜,最新排行请参考
官方网站[1]。
近日来,在TIOBE程序员社区中公布了其2005年11月的程序语言排行榜。这得注意的是PHP即将超过C++成为了排行榜的老三!而Java作为开源先锋首当其冲的成为了龙头老大,并且仍然保持着很好的增长势头。
这个排行榜每月更新一次,其排名顺序按照世界范围内的技术工程师、讲师、第三方厂商的调查依据,并查询了目前流行的搜索引擎:Google,MSN,
Yahoo,结合前两者的数据计算后得出的。根据TIOBE的观点,此排行榜是被程序员们用来检查自己的程序技能是否过时,或者作为建立新的软件系统时进行参考之依据,并非意味着哪种语言是最好的。
图 1. 2005年11月TIOBE发布:世界前20位语言排行榜
图示说明:
(Position):此列表明当前语言与去年位置的变化。
Ratings:在查询搜索引擎计算排名顺序时使用了 '+" programming" -tv -channel'公式,对上12个月内Google,MSN,Yahoo!和Google新闻组的数据进行查询。注意此公式应用于标准的Google
web点击率、标准的MSN web点击率、标准的Yahoo!web点击率和标准的Google新闻组点击率。这里的“标准”意味着一次对前50位语言web点击率总和的查询是均匀分布的,即保证了排名的相对公正性和科学性。
(Ratings): 此列表明当前语言在上12个月内的排名变化。
Status:带有“A”的程序语言被认为是主流语言。带有“A-”和“A--”表示程序语言位于“A”和“B”之间。从支持能力的观点看,尽量在工业的、任务危机的软件系统中使用带有“A”的主流程
序语言。如果某种语言在上3个月内具有超过0.7%的增长率,则此语言将获得“A”状态。上两个月内具有超过0.7%的增长率的程序语言相应的将获得“A--”和“A-”状态。
图 2. 2005年11月TIOBE发布:世界前10位语言在前五年内长期发展趋势图
sourcefage开源项目所用语言排行榜
SourceForge.net,全球最大的开放源代码开发网站。对各个开发语言的开源项目统计,最新信息请访问
官方网站[2]。
以下列出2005.11.25数据,Java超过C++成为Sourceforge第一语言
1. Java (16738 projects)
2. C++ (16731 projects)
3. C (15934 projects)
4. PHP (12175 projects)
5. Perl (6209 projects)
6. Python (4542 projects)
7. C# (2892 projects)
8. JavaScript (2779 projects)
9. Visual Basic (2192 projects)
10. Delphi/Kylix (1926 projects)
11. Unix Shell (1845 projects)
12. Assembly (1608 projects)
13. PL/SQL (1145 projects)
技术体系与思维方式
在同样满足技术期望目标的情况下,Java和dotnet的体系结构越来越近似,因此对于Java和dotnet架构的比较没有太大意义。
二
者最大的区别是社区文化:Java是由各大公司一块儿制定规范,开源产品多,发展迅速,同时开源产品有些过多了;dotnet基本由微软控制,底层技术不
开放,但是对第三方软件开发商而言,也很友好,因此现在已经有众多的软件公司提供dotnet下的组件--这一点很类似于Delphi。Java由几大
IT公司共同制定和维护其规范,有着可选的若干方案;Dotnet由于微软的强势地位,只能是一支独秀的局面。其它公司采用
Dotnet开发产品,若微软也要插一腿,则其它公司很难竞争得过,最终难免衰败(Borland?)。比如金蝶最早准备用.net,现在改Java了
(?)
给
个形象的比喻:走入Dotnet的世界,MS既是Dotnet世界的王,Dotnet世界规则的制订者,它就像太阳照亮了广阔的空间,大家除了仰望,谁能
与其争辉?Java世界,则是一个谁都能闪烁光芒的地方,能量小的是萤火中,能量大的就是恒星啊(IBM?BEA?)。
转贴两篇
C#
vs. Java:相反的思维方式 (译文):
Conflicting
mindsets of C# vs. Java,Malcolm Davis,September 12, 2004
我最近受邀对 C#/.NET 和 Java/J2EE 做一个对比。一开始,我比较了它们的功能特性、产品、技术,然后我发现
C# 和 Java 的战场并不在这些表面特征方面,而是思维方式层面的竞争。
坐在办公电脑前,开发者脑袋中按两种相反的思维方式看问题:
1.接受桌面上已有的工具并以此为标准。
2.经常的搜索能够提高工作效率的机会。
接受主义与探寻主义是两个社区的主要思维方式差异。什么是对开发者有益的,接受主义者放弃了对工具的控制,接受经理和卖主的选择。探寻主义者搜索、寻找正好对他们工作有用的工具。两种思维方式都有其正面因素和反面因素。
工具的探寻(包括 IDE,组件,工具等)是正常的、预想的、首选的行为。作为开发者,应该寻找适当的途径,比如新的程序、自动生成重复的代码以及组件重用等途径,提高工作效率。可是,这对于一个
IT 公司来说,可能是一个不好的兆头。很多的 IT 公司限制随意安装新的软件,很多公司限制对外部网站访问,有的还限制对新闻组和
blog 站点的访问。(当然,很难想象有些 IT 公司甚至不允许访问 weblogs.java.net。)这些 IT 公司有很多适当的理由,比如对病毒、木马软件传播的担忧,以及由于缺少许可证而导致的法律问题,很多程序员并不清楚也并不关心引进新软件可能带来的这些后果。
四年前,我向一家 IT 公司引进了 Ant,Tomcat 和 JUnit,这些工具简化并加快了 web 编程、测试以及制造的过程,极大的提高了公司的生产效率。现在几乎每一个
Java 开发者都已经掌握了这些技术。
NAnt 和 NUnit 是仅有的一些开源的、对 Java 工具集的 .NET 移植。然而,Microsoft 并不是采纳这些已有方案、加以改进、并将它们集成到生产线中,而是自己重新创建了类似的产品
Visual Studio Team System。停下来想象一下,会不会有哪家 Java IDE 会声称“我们将不会支持
JUnit 或者 Ant,我们将推出我们自己的产品。”这简直是不可想象的!你现在知道 Java 和 .NET 之间的思维差异了吧:一个采纳社区已有的成熟工具,另一个则重新创造一套集成的方案。因为商业
IT 公司偏爱集成的解决方案,Microsoft Team System 给人感觉不错。可是,Team System 只是一个落后时代大约
5 年的产品。
商业世界的人们已经开始使用 Jakarta 项目上发布的 Ant 和 Tomcat。思维方式凸现了商业运作和 IT 开发的主要差异。如果商业软件能够遵守和
IT 开发相同的规则,它们将压缩竞争对手的空间,同时失去他们最好的开发人员。
由于 IT 公司需要以应用程序提供商(Application Service Provider, ASP)的等形式采用外部资源,Java
以及 Open Source 将成为 IT 的主流。Microsoft 的做法最终会伤害他们。ASP 的商业模式,将带领我们进入一个商业软件开发的新时代。Industrial
strength development techniques, cutting edge technology, 以及经常性的探寻提高生产效率的机会,将成为标准,我们将看到“小鱼吃大鱼”的一幕,我们将看到
Java 吃掉 .NET 的午餐。
Conflicting
mindsets of C# vs. Java: Part II,Aaron Hohnson,September 21, 2004
大家都看到了 Malcolm Davis 刚刚发表的那篇“C# vs. Java:相反的思维方式”了吧?你也注意到:sourceforge
上 Lucene.NET 的主持者关闭了项目,带着他们的玩具回家去了吧?我接着 Malcolm 的话题,说说这两件事之间的关系。
大体而言,.NET 社区的参与者总是在谈论 Microsoft 推出的最新的、最强大的东西:MapPoint Location
Server,SQL Server,Longhorn,ASP.NET 2.0,Visual Studio,所有来自雷德蒙(Redmond,微软总部所在地)的产品。相反的,Java
社区的程序员在那里谈论 JBoss,Hibernate,Struts,Eclipse,这些东西没有一个来自硅谷。
Malcom 的文章说,.NET 开发者接受 Microsoft 提供的工具和服务,我想这在很大程度上是对的。.NET
开发者很少花时间,开发持续层方案(persistence layers),web 应用程序框架(web application
frameworks)或者缓存解决方案(caching solutions),因为 Microsoft 已经为这些问题提供了
Microsoft 解决方案。但是仅仅是因为 Microsoft 提供了这些工具吗?那为什么 JSF,JDO,NetBeans
不能成为 Java 技术 Blog 站点的主流声音呢?拿 ASP.NET 和 JSF 作一个细致的比较,它们并没有太多的不同,但
ASP.NET 和 Visual Studio 一起被广泛应用,而 JSF 却很少人用并且饱受嘲弄。我认为 Malcom
是对的,的确是思维方式的差异早就了这一切。
回过头来看看 Lucene.NET 的那群人吧:他们为什么关闭了开源的项目,他们为什么不再继续为这个很优秀的想法贡献他们的时间和精力呢?或许
.NET 社区对他们工作的反响,让他们无法继续维持下去了吧!使用 google 在 weblogs.asp.net 上搜索“lucene”只得到了
17 项结果,而在 jroller.com 得到了 2570 项结果。Lucene 已经存在很长时间了,但 Lucene.NET
的那群人们把东西包起来另起门户,其中一个原因可能就是:几乎没有人关注他们的工作:大家都在忙着研究 SQL Server
的全文检索,这才是 Microsoft 提供的解决方案(当然,需要为每个处理器花费成千的美元购买许可)。在 Java 世界,Lucene,Struts,Tomcat
之所以繁荣,也是因为为一个大的开源项目工作,给开发者带来了足够的威望。而当你投身于一个开源项目,却很少人注意时,沮丧的你也许也要寻找另外的动力。在
Lucene.NET 这个事例中,money 是他们的动力,所以他们关闭了项目,转而贩卖他们的个人版本和商业版本。他们或许能得到双倍的美元吧,但我打赌一年以内,不会有多少人谈论
seachblackbox.com 的。
那么我的观点是什么呢?是说 .NET 开发者很贪婪,不关心社区吗?不是这样的。我认为,这两个社区有不同的司机:.NET
开发者盯着 Microsoft,关心 Microsoft 提供的解决方案,如果他们在车窗外看到了好东西并拿来使用,Microsoft
可能会最终进入这个领域,并发布产品或者提出解决方案,这样,以前的工作就完全被否定了。Microsoft 是 .NET 社区的司机。Java
开发者们看了看 Sun 推出的产品和语言规范,扭头去开发他们自己的工具、框架、应用程序。Sun 推出的东西,Java 社区的开发者只有他们确实喜欢才会去使用。Struts
的门庭若市,与 JSF 的门庭冷落,印证了这一点。在 Java 社区,开发者自己是司机。
Eclipse联盟与桌面GUI
目
前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括
Borland、Rational Software、Red Hat、Sybase、SAS等。
作为一款企业信息化产品,服务端和客户端的技术应尽可能的保持一致,这样能够最大的限度的资源共用。Eclipse联盟的建立使得我们对于Java的桌面
GUI有着充分的信心。
Eclipse的插件机制、扩展机制、自动升级、帮助系统等平台性的功能,使得我们拥有了一个现成的平台性软件,很多基础性工作可以不再重复去做。
桌面GUI一向是MS的强项,在性能与界面美观方面占据优势,但没有现成可用足以媲美Eclipse的框架。
成本
开发成本
另外一个非常重要的问题在于,用Java做为我们的软件架构,开源社区为我们提供了免费(或低价)的应用服务器,项目管理工具,开发工具,数据库系统。这
些足以满足我们的业务需求,而没有任何版权问题,而版权是我们软件产品经营中早晚要面对的问题。我们需要付出的代价就是了解并掌握这些开源的产品;若采用
微软的技术架构,则从开发工具、应用服务器、数据库服务器、工作流等整套系统全部正版的话,有着高昂的成本。
用户实施成本
用户既可以在现有Windows系统上安装,也可以安装在Linux系统上,伸缩性良好。同时,可以支持开源的数据库,降低用户的实施成本。Java由于有着良好的移植性,和为数众多的应用服务器产品,可以满足各种客户的需求。
跨平台
Java当然比之Dotnet要好很多。只是对于C/S应用而言,运行在国内几乎90%以上的Windows系统中,跨平台貌似没有任何意义。若干年后,如果Linux或其它系统在企业应用中被普及的时候,可能Dotnet也能够很好的跨平台了。
学习曲线
Dotnet入门容易,有着从服务器到开发工具的一站式解决方案;Java的入门曲线则相对较高,N多的技术、开源框架要掌握、要选择,服务器、开发工具的顺利使用要做很多的配置工作。
对于企业级开发而言,其关键在于满足业务要求,合理的设计方案和架构,设计模式等,这些无论对于Java或Dotnet都是非常重要的。使用Java来学的话,由于整个社区对于架构、设计模式的普及,提升会比dotnet快。
趣味观点
以色列软件工程师Tamir Khason 揭示出了一个惊人的理论:有大胡子——有旺运;没胡子——只有干瞪眼!
[8]
图 3. C#之父Anders Hejlsberg
图 4. Java之父James Gosling
结束语
注意了,注意了!走过路过,千万不要错过下面的信息啊!
感谢大家把这篇文章一直看到最后^_^
既然已经看到最后,我诚挚地邀请您再伸出援助之手:请在这篇文章的最后给出您的宝贵意见,格式如下:
我建议采用的平台是:(Java/Dotnet/其它)
我的理由是:...
我的补充意见:...
参考资料
[1]
TIOBE程序语言使用排行榜
[2]
sourcefage开源项目所用语言排行榜
[3]
C#
vs. Java:相反的思维方式(译文)
[4]
质疑国内.Net社区
[5]
满江红.开源
[6]
理解企业应用框架,原载于《程序员》
[7]
整理一下技术路线,robbin
[8]
有胡子与没胡子的区别
[9] 微软是如何输掉API之战,
上、
下
关于作者
最近正在进行本文所描述的技术架构评估,对于Java和Dotnet有些举棋不定。热切希望得到大家的宝贵建议,再次感谢!