我是一个从野路子上一路走来的程序员,现在主要用.net做方案。选.net不选jave并没有什么特别的原因,只不过是因为我自己从c,java学起,后来被vs这个工具所吸引, 很熟悉这个平台罢了,从业15年了,C#是最方便的一个语言,而VS是最方便的一个工具,因此就很自然地用C#来解决我的一切问题,而这个工具也没有让我失望过,基本上还没有遇上过解决不了的问题。
但是在现在的这家公司里,我却发现了一个很明显的选择倾向,就是90%的项目,都会选择J2ee的平台,.net平台基本上没有什么机会被引入。更有一段时间,公司里甚至规定了:禁止使用.net技术!
这是一家金融公司,一直以来都是以甲方的身份出现的,不知道为什么居然会出现这样的规定,甲方应该关心需求,不知道为什么还会做技术平台的这种要求,而且用上了“禁止使用”这样的字眼,无论如何,都是一种很不客观的做法。
前几年我还有些单纯,看问题总是从技术角度出发。这个规定让我相当不满,于是我做了一些测试和调查,证明了几件事情:
1. 无论在小负载和大负载的情况下,.net都比j2ee的效率要高。
2. 由于第一条,对于相同的应用程序 .net比j2ee的所需要的硬件投入小得多。
3. .net与j2ee相比,前者学习的成本低得多,开发用的人力成本也更低。开发周期也短得多。
4. 收费的.net与“免费的”j2ee相比,产品许可证成本要低廉得多。这是花了我最多时间来扭转人们看法的一条。
5. 以公司里的大多数项目的规模来看,.net比j2ee更合适于我们公司的情况——你真得不必为每一个项目都购买oracle和weblogic,大多数系统每天只有几个用户,登录不到1个小时。
我拿着这些得到的事实,去找一些参与了此规定制定工作的人理论,在讨论过程中,我又发现了以下几个事实:
1. 这些人没有一个人熟悉.net平台。
2. 这些人中,绝大多数人也不熟悉j2ee平台。
3. 这些人懂具体技术的人也不多,但有一些高层,是IBM的忠实信仰者。
大型企业的决策者们的心理是这样的——我们金融公司基本上资金充足,明白吗?我们不需要节省费用 ,上市之后,有几十亿的定向募集的资金要用于IT建设,这笔钱必要花出去的。如果不花干花净,投资人是不答应的。因此最小的项目,也常有几百万的预算,这其中一半是开发费用和数据库、中间件等服务器产品费用,另一半是几台IBM的小型机硬件(这也是被认死了的东西),用于支持每天个位数的访问量。
如果项目太省钱,是没有办法操作的。
既然钱不是问题,那么我们公司在项目投入方面的心理诉求是什么?是做一个“高档的”项目,一个标杆项目!谁能抓到这个点,谁就能得到项目。
IBM的营销人员非常强大。他们向人们暗示:只有j2ee才是“高档”的,而微软的平台是“小孩子玩的”东西。后来,我有机会参加一些项目的工作,于是亲眼看到IBM的营销能力在公司里造成的影响:如果在项目规划的会议上有人提出是否考虑一下MS的平台,他们会通过轻蔑的笑容让提议者无地自容。请注意,技术决策者基本上都是一些对技术一知半解,或是完全不了解的人,人都有下意识,都有虚荣心,不愿意让人认为自己在技术上很低档,没有见识,于是一个个就很羞愧地住了口。有些情况下,即使一个心存怀疑的人,也会自动加入鄙视MS的行列,与之划清界限。
另一方面,MS却一直不知道为什么自己总是在营销上失败,他们的营销人员很单纯地向我们说明,.net平台的优越的性能、便宜的开发成本、低廉的产品费用……,但是他们不知道我们的心理诉求,他们所讲的一切,都是在证明MS的东西是个“玩具”,“低档平台”,他们在背道而驰,最后的失败也是当然的了。
这是就是我的第一层认识。
------------------------------------------------
如前面所述的,由于很多人已经被洗过脑,还有其他很多操作上的考虑,大家都会很自觉地配合IBM的营销攻势,而且我们也相信:在IBM等软件和硬件的支持下,我们的一个个系统步入了“高档系统”的行列。把.net平台留给了孩子们玩去吧。
其实,IBM,以及其他一些高端厂商(Oracle, BEA等)做承接的项目,大部分的活计是直接再转包给其他国内的小厂商的,他们自己所需要做的,基本只限于“规划、咨询、建议、项目管理方法论”等一些又高端又阳春白雪的工作。
不过说实话,这些大厂商的总结能力真不是盖的,你听了他们的咨询师的课之后,大部分会感觉自己醍醐灌顶,狠不得把自己的所有的系统都推倒了重来!甚至狠不得把自己的业务方式都来个大变革。不过另一方面,这些高瞻远瞩的规划,一般也会与现实社会有很大的距离,要么是客户不接受,要么是监管不接受,要么是现实不接受。无论如何,听听绝对有好处,就当开阔了思路了。
既然远景做不到,那么近景能做一些就做一些也是好的。首先就要听这些大厂的话,选择SOA, 或是SAAS, 或是别的什么概念来做这些项目, 当然,听IBM他们说,这些项目的都需要J2ee来支持,而最好的J2ee应用中间件,当然是IBM自己的websphere什么的。其实都没所谓.net好还是Java好,无关乎技术。对于厂商来说,这都无非是一件武器,用来对抗微软的武器罢了,因为MS真得太令人害怕了,需要这么多厂商来一起对抗它。
为什么MS令人害怕?因为以下的几个原因。
1. MS是一个程序员的公司,而IBM是一个营销员的公司。MS有实实在在的技术,但是明显在市场头脑方面差人一等,因此总是在战略上慢几拍,但是后发的产品很强大。
2. MS一直不停地研发。相信学MS技术的人都有感觉,就是他的主导技术基本上不到三年就要整个推掉重来一次,比如从ado到linq,再到现在的那个什么Ado.net entity framework的东西。每一代技术都更强大,但是翻新得让人追不上。这种技术创新的能力,是十年不变的java阵营很害怕的。而且下一代的WPF、WCF等平台的高度和技术能力是其他厂商难以达到的。
3. MS有着令人难以置信的软件产品线,从操作系统到游戏,甚至是机器人仿真和开发包!在每一个战线上,他都有产品(可能是原型级的)可以用来对抗全世界厂商。
4. MS正在蚕食下一代程序员。
因此,java联盟必须努力抗击MS, 他们其实对java的低效率心知肚明,但是他们已经选择了这个武器和这个招牌,因此只好做足文章,把数据库、应用服务器全部用java写成——当然可以用。这就够了。
但是效率太低,无论懂不懂技术都能看出来系统慢。那么也没问题的,只要几台P590上线,也就快多了。
技术上也对此准备了解释:是的,j2ee是用于对付大批量用户的应用平台,在少用户的情况下,效率上不明显。但是当用户量上升到海量级别时,这个系统的响应曲线一定是平缓的。而“.net一类”的响应曲线必然是陡峭的。这叫做“吞吐量”。
我们得到了安慰,为我们的预算支出找到了解释。每个人都满意了。至于什么时候我们会用上百万并发的吞吐量?也许永远也不会,不过备着这个能力也好。
一度我也很相信这个含义不明的“吞吐量”指标,实际上的情况如何?有个例子可以参考:公司里有一个系统很关键,用户并不是很多,这个系统由IBM规划,orcale实施,运行在一个oracle cluster上,数据库的存储用的是HP的11000,应用服务器用两台单独的590,全部资源都划为一个分区来跑。在每个月初会有几百人在里面干活,系统要把上千万条数据做转换、抽取和导入(ETL),每到这个时候,系统就会慢得几乎不能干活,登录页都需要十几秒才会响应。听说硬件组的人为了加快效率,都把这个数据库的存储移到最快的硬盘条带上了,还是很慢。每次登录这个系统,我都能感觉到IBM和oracle的庞大重量全部压在我的鼠标上。
这个例子并不是为了证明j2ee很慢。相反,我认为这个系统的慢一定出现在软件的设计上,那种级别的慢法,一定是要有数量级上的性能提升才会有用,java与C++相比,也不过是10倍以内的效率之差,不会慢到二十秒出现登录页,再过二十秒才能登录进去。因此,一定是与软件、数据库的设计很有关系,也就是与开发者的水平有关系,只有那样才会导致几百上千倍的效率区别。
因此,用什么技术效率高什么的,只是一个建立在“完全相等条件下进行比较”这个前提下的一种说法而已,现实中,你没有办法忽略具体设计人员的个人水平造成的影响。就算是有严格的数据证明说什么技术比另一个什么技术快,也不能保证“这个项目”就一定会“吞吐量大”。其实这就是一个营销手法,它在我们遇上巨额费用支出是否合理的问题时,提供自我心理安慰的理由。
既然说到了这个项目,我就用这个项目做例子,继续说我的第二层认识吧。
----------------------------------------------------------------
公平地讲,这个项目有很大的技术难度,开发的风险很大。一开始是个烫手项目,倒不是因为有政治方面的问题,高层都肯定是下了决心来做的,但大家都已经算计过了,这个项目的技术难度这么大,有50%的可能性是会做烂掉的,公司里没有多少人敢接手负责。但是这个项目又必须做,最后就指定一个项目负责人来强迫他来做这个项目。
其实这个项目虽然难,但都是技术方面的难度,最少50%可能性是会很成功的。于是负责人就会硬着头皮上马,开始招标什么的。然后,各种厂商也都立即拥过来,各种营销手法来来往往的,也不用多说了,只说这个负责人在最后定标时的心理。
前面说了,这个项目有一定的风险,虽然只有50%,但这50%对于项目责任人来说就是100%的风险。这样重要的项目,负责人也都会是很高层的领导,他们对政治方面非常敏感,一般情况下是会给自己留足后路的。资金不成问题,请厂商不要节省,节省你就输了。在这个投资的范围之内,如何保证自己的政治风险最小?
很明显,就一定是要选择一个最大牌的厂商,选择最高档的技术。最好为了分散政治风险,把几个大厂商都拉进来一起做才好,比如我说的这个项目,数据库用最贵的orcale, 一个cpu的授权都在30万人民币。打折?不用了,你只要给我最好的服务就行!软件的实施请BEA来做,BEA连应用服务器都能做,做这个还不是小菜?IBM做咨询与规划,还有硬件当然也是IBM,最好的机器给我来两台做热备!
有懂技术的说了,慢着,这不是加大了技术风险么?这么多大厂商来一起做,谁会听谁的?那不是增加了沟通的难度吗?最少也增加了集成的难度呀!这样一来,技术风险从50%成了75%,做烂掉的风险加大了!
你说的没错。从技术角度上来看,是这样的。但是我一直说的是政治风险,没说技术风险的事情。这个项目的政治风险是对项目负责人能力评价的影响。如果做成了当然最好,但是还有一半可能性做不成,这种情况下影响就很负面了。
因此,对于一个项目负责人,他的决策思想一定是这样的:如果选择了一个小厂商,项目做坏了时,他就有决策失误的嫌疑了。因此一定要选择最好最贵的厂商,这样的话,就是做烂了项目,他也可以向领导汇报:您看,我们选择了最好的产品,最好的硬件最好的服务,最好的软件开发者,这都是业界一级棒的乙方,他们联手做这事情,但是还是做成这个样子。言下之意就是:这不是我的决策问题,是这个项目真得真得太难了,换了谁也不行。
当然,最后项目也不会一无是处,对付着还是能用的,这就叫成功了。但项目做得很差是人人都看得出来的,于是这个后着就用上了,政治责任就推走了。
这就是我对这个选择的第二层认识:从政治上讲,选择最大牌的厂商是最“政治安全”的策略。
IBM这些厂商深知这个秘诀,于是他们把自己包装成很高明、很抽象、很High Level的样子,这就与很多大项目的责任人的心理就切合上了。而MS因为后起,就有心理定势,以为自己的技术比别人来得晚,生怕甲方对他们的技术能力有怀疑,于是总是在技术的可用性、成本的节约性上努力, 很有南辕北辙的意思。
这就叫“市场定位”。
-----------------------------------------------------------------
最后,我再聊聊我新近观察的一个项目的运作,来分享一下我的第三层认识。
在达到了第二层关于政治风险的认识水平之后,我保持了这个认识水平有一段时间。当然我也无法左右公司高层的选择,反正有钱就花吧!只是有些系统自己要用的,难用成那样实在不爽,有时候也不免发发牢骚。
我有一个哥儿们混得挺好,他新近管着一个项目,这个项目也是由IBM指导实施的,但听说最初决定这个项目由谁来做时,也是某个领导一番沉思之后决定的,但那位领导不说什么理由, 只是思考之后做了这个决定而已。
这个项目没有什么大的技术难题,技术实施的成功率是很高的,按道理不需要什么政治保险。一开始我那哥儿们在做方案时,也的确没有选择IBM,而是以他们的评估,选择了资质不错,但是价格是IBM五分之一的一个厂商做为给领导决策的推荐。
有一点我们都没有多想,就是这个项目虽然没有技术风险,但整体上有一个政治风险。这个系统所要支持的一个业务模式很创新,公司里有很多人出于各种原因,对这个项目比较抵触。在项目立项时,这种反弹还没有表现出来,大家估计也都没有反应过来这个项目是在做什么。等做到一半时,很多人开始明白过来了,回过味来了,发现这个项目再做下去,可能会出一些对自己“不利”的情况。
这个说是“不利”,其实也没有什么“不利”,无非是高层的注意力会有一些转移、政策优惠会有一些转移、资源的倾斜会有一些转移什么的,业务上的竞争与冲击还远远说不上,但如同郭德纲的那句话一样,对于很多中国人来讲,只要自己不得益就算是吃了亏了。
于是这个项目就受到了冲击,一会儿停下了,一会儿继续了,一会儿又被人重新设计目标了,反正摇摇欲坠,挺危险的。
最后,这个项目还是挺住了,继续!为什么?因为有IBM在!
当项目因为上述问题出现方向争论、资源争抢时,这个项目自然就延期了。项目一延期,而且看劲头甲方一帮人还要继续这么乱下去,IBM不干了,第一、他们的工程师、咨询师天天白瞎在这里,那工钱是按小时出的,流水一样。第二、IBM做的项目,怎么能做烂掉?以后让业界说起来,“某某某公司的某某平台是IBM做的,做烂了!”这IBM的脸往哪里放?IBM也是个官老爷公司,能力固然是很强的,但是内部政治也很复杂,说不定比我们更复杂,他们可丢不起这人。第三,IBM已经在财务计划里把每期工钱的应收预算做好了,你又延误了,不交支票了,这可不行!
于是,IBM通过自己长期已经建立的人脉对甲方开展了攻势,突然之间,上上下下都有IBM的营销团队在活动,这个项目的责任人正好得到助力,项目目标很快确定,争论平息,项目继续。
后来我们聊天时,都对这位项目负责人的高明手法佩服无比,他早看到这个项目未来的风险所在,于是就采用了与大厂商绑在一条船上的策略,在危机出现时,借力向公司的决策层加压,最后才得险胜。而如果一开始就决定另一个较小的公司来做,出现这种事情时,小乙方只能闭嘴苦等,听人发配的份儿了。
虽然请IBM而支付了5倍的费用,但项目毕竟可以继续,多出的那部分,就算是“管理成本”好了。
最后总结第三层认识:
* 如果一个项目有技术风险而无政治风险,那么从项目决策都角度上出发,一定要用看起来最HIGH的配置,因为技术实施困难导致的政治风险,可以通过不等式的传递性而推脱:“乙方如此强大,还没有办法, 因此此项目确实超出我们的、以及现在业界的技术能力”。
* 如果一个项目有政治风险而无技术风险,而自己又没有信心独自搞定这些问题的话,不妨拉上大厂商,接用他们的力量来在关键时候做推动。
* 只在有项目即没有技术风险,又没有政治风险的情况下,才可以考虑采用一家务实进取的小公司来做,快速小成本地用“低端方案”搞定。
说到最后,大家应该明白我说的意思了:在很多企业里,项目技术的选择已经基本上与J2EE和.net技术本身没有什么关系了。这两个技术只是两大阵营碰巧选择的武器而已,可能会有一些小小的优劣差异,但是根本不重要。MS和反MS这两大阵营各自采用不不同定位,因而各自占据了市场的两端,谁是高端谁是低端,并不能说明这两种技术本身哪种就“高级”了,而哪种就是“低级”技术。
当然,客观上为了迎合两端不同客户的需要,这两类平台都发明了相应的附加品。比如Java,就发明了J2ee这种相当有点阳春白雪的东西,还有很多无比抽象复杂的实现模式,而.net则发明了服务器控件、viewstat和数据绑定这类速成工具。
这篇的目的,一方面是为了把自己的想法和大家交流,另一方面,也是想劝劝大家,不必太介意技术那点小小的差异,目前大家遇上的项目,大多都没有什么技术困难迫使得你必须要选用什么平台,或是不能选择什么平台。因此,技术平台的选择往俗了说是一个政治问题,往好听了讲,是策略问题。策略选择的原则,我也在“第三层认识”里总结过了,只要选择得当,就可以使项目更容易成功——那才是我们这些人的目标。

对于大型公司项目平台选择j2ee的几层认识的更多相关文章

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解

    笔记 2.中大型公司里面项目开发流程讲解     简介:讲解一个项目如何从零到上线,经历过怎样的步骤和流程                  1.一个中大型项目的开发流程,从需求调研到项目上线    ...

  2. 大型C++项目必须注意的几个小问题

    大型C++项目必须注意的几个小问题 有些问题对于小型的C++项目来说可能无关紧要,但对于大中型C++项目来讲,这些问题却成了大问题.什么样的项目算是小型项目呢,什么样的算是大中型项目呢,我认为10万L ...

  3. 【J2EE】在项目中理解J2EE规范

             J2EE平台由一整套服务(Service),应用程序接口(API)和协议构成,它对开发企业级应用提供了功能支持.13个核心技术各自是JDBC, JNDI, EJB, RMI, JSP ...

  4. 入职一个月快速熟悉大型Vue项目经验感想

    来到和睦的公司家庭已经一个月出头了,从技术层面来说,公司项目PC端是我目前来说接触的最大最复杂的项目了,德老师也说这个不断开发更新迭代的项目的代码量相对于全国的web来说是蛮多的,对于快速熟悉这样的大 ...

  5. 加速 Gradle 构建大型 Android 项目的方法[转]

    加速 Gradle 构建大型 Android 项目的方法 时间 2016-03-14 20:38:00  Mystra 原文  http://www.wangchenlong.org/2016/03/ ...

  6. Gradle在大型Java项目上的应用

    在Java构建工具的世界里,先有了Ant,然后有了Maven.Maven的CoC[1].依赖管理以及项目构建规则重用性等特点,让Maven几乎成为Java构建工具的事实标准.然而,冗余的依赖管理配置. ...

  7. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  8. java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

    15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...

  9. Java进阶(二十六)公司项目开发知识点回顾

    公司项目开发知识点回顾 前言 "拿来主义"在某些时候并不是最佳选择,尤其是当自己遇到问题的时候,毫无头绪. 在一次实验过程中,需要实现数据库的CRUD操作.由于之前项目开发过程中, ...

随机推荐

  1. 为apache提供sftp文件传输服务

    一.安装apache yum install httpd 二.为 /var/www/html 创建ftp账号www useradd -M -d /var/www/html www 三.更改ssh配置文 ...

  2. java反射机制_读取properties

    代码: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射特点: ...

  3. redis实战笔记(1)-第1章 初识Redis

    第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片.    本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...

  4. Netty(1):第一个netty程序

    为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...

  5. CSS3 图标神器 => content:"我是特殊符号"

    基本形状 ▲ 9650 25B2 ► 9658 25BA ► 9658 25BA ▼ 9660 25BC ◄ 9668 25C4 ❤ 10084 2764 ✈ 9992 2708 ★ 9733 260 ...

  6. ashx 绝对路径得到物理路径

    //先得到模板页所在的路径 string phyPath = context.Server.MapPath("/p02style.html"); //得到模板的所有内容 strin ...

  7. Java学习网址

    JAVA学习记录均参考自爱慕课网址: 爱慕课:http://www.imooc.com/course/list?c=java

  8. <input>属性为number,maxlength不起作用的解决方案

    <input type="text" maxlength="11" /> 效果ok, 当 <input type="number&q ...

  9. MySQL一查就会

    Table1--mysql常用操作 主题 用例 说明 书写规范 数据库和表的名称不一定要大写. 输入文本类型的数据时都要加上单引号: NULL 表示未定义,它不会等于另一个NULL: 不要使用双引号. ...

  10. OpenStack IceHouse 部署 - 4 - 计算节点部署

    Nova计算服务(计算节点)  参考 本页内容依照官方安装文档进行,具体参见Configure a compute node(nova service) 前置工作 数据库 由于我们在Nova(计算管理 ...