Java, C, 还是C++?

前一遍得了站长一个精,心里真热乎,再来一篇!

我在国内读大学的时候,进去的时候是长城CH、CE,出来的时候是386了。那时候,James Gosling大爷还在琢磨机顶盒呢。当时两种主要的编程语言,Pascal和C。后来OOP流行,就有了Object Pascal和C++。所以毕业后出来只要是干程序员的全是C或C++,没有其他选择。 你要是现在已经有了3年以上的C/C++或Java经验,请你继续下去,经验最重要。你要是对某种语言特别的喜爱,谁说它不好,你就跟谁急,请您看到这里就打住。出门左拐 -到 http://java.sun.com 去Java的大本营;出门右拐 - 那是 http://www.msdn.com 微软爱好者(含VC++)之家。 看下来的人大概跟我差不多,对某个语言有一定的爱好、但还没到热恋的程度;喜欢自己擅长的、喜欢回报最高的。跟谁过不去,总不能跟钱过不去,你说对吗? ROI(Return Of Investment)是那些Sales和Marketing嘴里喷射次数最多的一个词了,你可能已经很想吐了...... (五分钟后,众人陆续回到教室) 下面,我们就从最现实、最庸俗的角度谈谈一个程序员要考虑的ROI - (下回分解,谁让你们撂我一人干等了5分钟) 计算机语言林林总总非常之多,目前流行的,除了Java和C/C++,就有PHP、Python、Perl、Ruby、Javascript、Unix Shell、Basic、Pascal等。 我要说的是系统编程语言、或叫通用编程语言,这里面就Java、C、Pascal够格,PHP算够一半。其他的全是脚本语言和辅助语言。其实有很多IT从业人员以Perl、Unix Shell作为工作第一语言的,但以Release Engineer、QA和IT为主。 几乎所有的真正的Developer对Unix Shell, Perl, Python也是非常精通的,但多用作顶端的Wrapper,尽管天天用,只是工具、不是吃饭的家伙什。 这个关系就象CS里的主枪和辅枪;主枪就两种M4,AK47,玩过CS的人都知道选把顺手的主枪有多重要! 那该选AK还是M4呢?Oops,是选Java呢还是C++呢? 你现在要是对这两种语言都是外行,选Java吧! 我喜欢AK47,火力猛、杀伤力强,条子见了扭头就跑。哈哈 知道说到这里有人就不爱听了,我仿佛看到一块块板儿砖飞了过来。我闪先....好吧,既然在这里挖了坑,躲是躲不过去了。 先说说,C(含C++)能干些什么。C什么都能干,它可能是到现在为止最全面的系统语言,从底层的系统程序到高端的行业应用都在C的火力范围内。目前C主要用于开发设备驱动、操作系统;计算要求高的图形和图像处理软件;Windows下的小型商业软件;大型科学计算。可以这么说,不管哪类软件都有C的身影。 正是因为C的无所不在,业界对其缺点了解越深,我说几个算抛砖引玉 -强大的操作性。啊,这算缺点嘛?我怎么听着象是表扬呢?听我慢慢说,CS里的AK47价格低廉、火力凶猛、杀伤力巨大,是居家旅行之必备。但在新手用起来,就怎么也打不准。为什么?后座力大。俗话说人无完人,所有的工程人员要牢记一句话:永远没有完美的设计!这不是给你做借口的而是要你学会平衡和取舍。C中自由的指针操作在高手的手里妙笔生花;新手可就要熬夜对付Segmentation Fault了。C++提供的各种艰难的招式(不点名了,自己想吧)对很多程序员是一种诱惑,谁不想练绝世武功呢?可又有多少人能练好?所以我们经常看到的是很多人在不该用的地方乱用啊! -较长的学习周期和陡峭的学习曲线(Learning Curve),上面特性决定了成为一个合格的C程序员需要投入很多时间,需要比较长时间的工作经验累计。不信你去看看有关C的工作,哪个都是要求5年以上工作经验。谁都不敢要一个2-3年的,来了不是添乱嘛。 -C程序员需要比较系统的计算机课程的学习,如操作系统、数据结构、体系结构。memory leak应该让很多人记忆犹新吧。 -不兼容的库使得程序移植非常困难。一个在Solaris上开发的程序,要移植到AIX可不是想当然的那么容易。那些好几行的编译参数就能让人晕。 下面再分析以下C程序员一般所写的应用 -系统软件,包括各种硬件Driver、OS、System Tools,现在写OS的厂家越来越少了,大多数都到Linux去凑热闹了,写Driver的也很分散,行业本身也是薄利。在这行干的一般都是C的高手了,没5年以上的工作经验和非常系统的计算机专业训练,是干不下来的。这行能干很长时间,一个OS要开发十年;一个更新版驱动程序可能就是一个礼拜的事,两极分化。公司一般也很稳定了,不会多招人,要招也是要熟手。 -图形、图像应用,不说你也知道,前两年火爆的游戏软件。在这行干,不仅要有上面要求的体系结构知识(不一定如上面的那么精深),但对算法的要求很高,2D、3D还有PS里的各种效果可都是超复杂的计算。这行虽发展迅猛,但竞争实在太激烈,程序员都忙得喘不过气来,两年前在LiveJournal上EA寡妇的文章就很说明问题。再说我也没听说游戏公司多给钱。别看着玩游戏爽,写游戏就是另一回事了。 -Windows下的小的商业应用软件,虽然数量极多,现在的潮流是把应用(Application)变成服务(Service),但这方面的稳定的公司越来越少了,很多是早生暮死的小公司,不构成板块,薪金、福利和机会的竞争力都够呛,不说也罢。 -其他还有很多、象科学计算、老旧的大型商业软件的维护升级。没有增长,不要指望有很多工作机会。 总结一下,如果你觉得自己是个牛人,而且能象老黄牛一样卖力,运气好的话能进第一类公司去精雕细刻一个小部件;到第二类公司去加班拼命;到第三类公司去歇歇脚,准备找下个工作。工资不高不低,每年看老板脸色涨点工资。 我想我大概概括了80%的以C作为主要工具的程序员的情况,收入、经验大概也应该符合80-20的分配吧。 绕了一大圈,现在该说我们的主角-Java了。老样子,先分析语言本身,再分析就业情况。 -比较单一的功能:Java刚出来的时候,Sun的设计师就说Java就是要做到“一个操作,一个目的”,换句话说,一个函数一个结果;要达到这个结果,只有一个函数最简洁。孔乙己的回字四种写法没有了用武之地。对初学者,大大方便了记忆和使用。 Java中去除了C++的友联函数(friend function)和多重集成(multi-inheritance),明确了接口(Interface)。不得不佩服设计者的苦心。C/C++的设计完全是从高手的角度看问题,在设计了结构严谨的阳关大道的同时还开出许多快速小道,Unix程序员开后门的习惯就是改不过来。 C/C++的很多功能就象在司法、行政体制外另辟一路,来个密折、“三规”啥的。用的好,非常有效;用不好,就乱套了。 Java为了降低了使用门槛,简化了语言、限制了可能出错的功能、接管了最容易出错的内存处理。在高手看来是束手束脚,但它能让学徒中规中矩。Java的流行也标志了程序开发也从Craftmanship向标准化过度。(以后有时间再展开说吧) 两种设计思路孰优孰劣呢?我还不敢评价,但从趋势看,彼此都会存在很长时间,但Java的设计思想会大行其道的。比较一下特色餐馆和连锁KFC就知道了。 -比较平和的学习曲线:Java设计人的苦心得到的回报就是Java易学易用 (要是比C难,怎么抢地盘啊?),设计优良的包(Package)初学者也不难掌握,一般有点基础的一年后就能写出不错的程序了,更不用说有C经验的人了。 更重要的是,就是Java新手写出的代码,可能有很多Bug,但不象C的那么可怕的,动不动就SEGV Error了。 -跨平台移植:从前开发软件都是计划在什么系统下运行,就在什么系统下开发。好处是培养了无数vi和emacs的高手,坏处是开发效率大大降低。很多人以为事先定下的部署平台很难更改。现实中,由于经济、政治和技术的原因,这经常发生。Java通过JRE提供了平台无关性,使得移植非常简单。很多人象我这样在Windows下编辑、编译、调试Java,最后部署到Linux或Solaris上。当然在Deploy的过程中会出现一些问题,无非是路径、分隔符、库函数链接之类的问题,都不难解决。如果是JRE的问题,那也不是你能解决的了。哈哈。 现在说说Java开发者比较集中的领域, -大型金融、电讯行业。计算机最开始的应用只是科学计算,比如破译密码、弹道分析、数据统计,采购的多是政府机构、以军情为主。自IBM系统360以后,计算机开创商业信息处理,并成为主流。先进IT技术的最大消费者是银行、证券、保险这类的金融服务业。这种寡头垄断行业肯花钱,也敢花钱,在其他方面很难创新的条件下,技术投入是实现产品优势的最大办法。 现在金融IT业的最大挑战是集成。你如果在任何一家有50年历史的银行(不算历史长的)干过,你很可能同时看到COBOL、AS/400、CORBA、Tuxedo和新的Java应用。集成的主要方法,一个是Messaging(IBM的MQ Series、Tibco),还有就是CORBA,都不是很容易的事。不同语言的程序接口集成,只有CORBA了。但由于OMG大大小小的失误和本身的技术和公司策略的复杂性,CORBA并不成功。 Java是种编程语言,CORBA是种Interop规范,本来是没有可比性的。但我们要注意到Java还是一个平台,一个建立在Java虚拟机规范上的平台,一个天生的系统整合平台。看一个典型案例,Windows下用VC写的应用要调用在Unix下的后台的C应用,你肯定要用VisiBroker或ObixWeb。但如果前后台都是Java的应用,直接用Java RMI就行了(Java RMI被看成CORBA的Java简化) Java是免费的,但不开源,虽然源代码也能免费下载,但不是GPL License的。Sun对Java一直也没松手,虽有JCP但控制还是很严的。Sun严格的JRE兼容性认证也保证了各平台下JRE的质量。所有这些措施平衡了成本和效能;质量和创新;民主和集中,我个人对此还是很认同的。(现在要Java开源的呼声越来越大了) 大型企业的采购策略和小型企业很不一样,在考虑费用的同时,更看中企业的规模、名声和行业经验。参加过这类项目投标的都知道,首先问到你的是类似项目案例和对方的评价。很难想象小公司凭着一个很酷的产品,就拿个银行的大单。还有一个特点就是不在一棵树上吊死,希望有 Java得到几乎所有在金融、电信垂直行业(Vertical Market)混饭吃的IT公司的支持,比如IBM、HP、Oracle、CA、BEA、Tibco、Sybase等等。当时很多IT公司都被微软挤得日子很不好过,现在有人挑头,当然就跟者Java的大旗闹起来了。 Marketing,Sales来了劲,IBM的人到银行老总那里一说,“你不是担心俺活不过明天吗?现在HP、Oracle....都入伙了,说好了有福同享、有难同当。就算我明天真的完蛋了,我的Java App你还可以投放到HP或Sun的系统上嘛。” 老总听着有理,再加上边上小秘的一杯杯的劝酒,就把支票给签了。 -新型电子商务业(e-commerce)。dotcom的主流,把传统商业上网,或是在网上开发新的商业(苹果的iTunes就是一个典型例子)。J2EE简直就是为此量身打造,既有事务处理(Transaction)的支持,又有页面展现(JSP)。Java比较低的门槛和比较平和的学习曲线使得初创公司(Startup)能找到足够多的Java工程师-有C的基础、Java也会点,进来慢慢学吧。我就是这么进Java门的,虽然不是e-commerce和Startup。 -大型商业软件,什么ERP、SCM、CRM、HRMS、Sourcing、Procurement...林林总总,千奇百怪,但有个共性-就一个字:贵!一个License上百万,请Professional Service还要花个上百万。要是新型公司,象Ariba、Siebel、Blue Martini、Manugistics、Documentum等;现有的给予C系统的公司也纷纷用Java改写老系统、开发新系统、如BroadVision等。Write Once,Run Anywhere啊!大公司的历任CIO采购的操作系统多的很,互操作和平台移植都是大问题。Java比较好的解决了这个问题,也无怪这么多高科技公司趋之若鹜。 从上面可以看出,Java工作一般都在高薪行业,而且相对稳定。Java方面的专业杂志Java Developer Journal(JDJ)每年都有Java工程师薪资调查,得出的结果都很正面。(当然你可以认为这是行业杂志,不可信)。就我所知,很多公司的Java测试工程师都能拿到8w到10w的年薪,C、C++、C#方面的QA能拿到这个数就比较少了,在这里再次强调,工资的高低和你的技能、经验相关,但更重要的是跟你所在行业相关。别的不说,中国的银行会计和企业会计,哪个赚得更多?哪个技能更全呢? 对绝大多数人来说,技能发展是有上限的。有五年Java经验的和有七年经验的比,编程水平和代码质量都是差不多的,但为什么要给七年的付更高的工资呢?多出来的钱是给行业经验的,资深的开发者和分析员对商业流程的了解甚至甚于Business方面的员工。这适用于所有的软件开发人员,不管是C的还是Java的。但由于大多Java工程师所在行业的经验值更多钱,所以Java和C工资的差距也会拉开。(我没有数据支持上述说法,只是个人感觉) 感谢努力的苯苯转贴的C#吧和JAVA吧的讨论,在我的回复中,给出了最新的Java和C#, C++工作机会的比较(限于美国) 搜索了美国三个主要招聘网站 - HotJobs.com,CareerBuilder.com,Dice.com,比较Java和C#,C++的空缺职位。 HotJobs.com -Java 8000多-C# 4000多 CareerBuilder.com -Java 160页-C# 41页,C++ 54页 Dice.com -Java 16293个-C# 759个, C++ 1531个 可以看到C#和C++绑在一起都没有Java工作的一半多,我还不考虑C#和C++重叠的部分呢(应该不少吧)。这是美国目前的情况,如果我们假设美国IT的今天就是中国IT的明天,你做为一个投资者,你把注压在谁身上呢?注意,你的本钱很大,最少是你10年的职业生涯! (全篇完,转载请说明来源:Java开发者互助论坛(dev2dev.cn)作者:calres1) 我也看了苯苯的贴子,里面有的说的不错,玩C++写系统程序的确实是高手。做Java也有高手、牛人。到了一定境界,编程语言已经不再重要了,Java和C都能玩得转。 但有的说Unix快玩完了,Windows Vista是有很不错的功能,IIS的市场份额也在上升,但Unix依然会长期存在,世界不可能只有一个操作系统。

你可能感兴趣的:(一碗新茶)