Java程序员的困惑迷茫~想从Java转C++~请各位大神给点建议。

macemers 发布于 2014年05月26日
无人欣赏。

本人Java狗一枚,主要从事服务器J2SE方面的开发(网络,多线程和一点Spring),而不是J2EE那块。最近找工作,发现服务器端的职位大部分都是c++,搞Java的多数是android或者J2EE什么的,感觉有点迷茫,所以前来请教各位:

  1. 有没有必要转C++?我想知道Java服务器开发的需求大么?还是坚持在Java的体系里,学习点其它的,例如android什么的?因为在没有工作经验的情况下转语言似乎难度比较大,尤其是像C++实在是一门庞大的语言。

  2. 该怎么转C++?Java转C++该怎么转?看哪些资料或者课程?然后可以参与或者做点什么项目,让自己看起来有点C++的开发经验?

欢迎各位的建议,谢谢了。

共55条回复
BarryWey 回复于 2014年05月26日

有没有必要转C++,问别人干嘛?这事情不就是根据爱好和自身情况做决定就好么?!

king2k 回复于 2014年05月26日

你找工作看的什么网站啊?服务器端明明招java比c++多。

我这c++狗还正发愁呢

manzhiyong 回复于 2014年05月26日

很难。。见过很多从c++转java的,很少见到能够java转c++的。c++的思想,与java是完全相反。c++比较提倡“重复造轮子”。比如linus嫌svn不好用,自己搞个git,这就是典型的c++风格。java的风格是:这个库不好用,那好吧,我能不能对付。。java工程师一般对于系统原理、编译原理等等基础知识掌握的不好。如果不知道内存结构,文件格式等等,做c++很难。内存泄漏你都不知道咋搞。对于指针,数组等等的理解更是没法上手。

如果想转,先把大学专业课挨个看一遍。

manzhiyong 回复于 2014年05月26日

而且java程序员找android也不是很给力。android程序员圈,可以看出大部分是原来linux,或者其他平台转行过来的。j2ee过来的少。还是那句话:系统原理基础知识不够。被jdk惯得什么都不会。

hazukijunichi 回复于 2014年05月26日

C++找工作比较蛋疼。。。像我就是自学C++的,现在在自学java想转型。。。 因为网上找工作,C++都是要高级工程师,低级的不要。。。 然后对于我这类的人就特别尴尬。。。

skydiver 回复于 2014年05月26日

3楼 @manzhiyong ……Linus才不稀罕C++, git也是用纯C写的

CarltonYu 回复于 2014年05月26日

可以转啊,我就是java出道做android应用,后来去做游戏,用cocos2d-x,自然而然就去做c++了。目前用c#做unity3d开发。并且导出项目的二次开发分别用java二次开发android,用objc二次开发ios。服务端golang貌似最近几年很火,elang也不错啊

pinxue 回复于 2014年05月26日

3楼 @manzhiyong 不是 bitkeeper 收回了免费授权,于是 Linus 只好搞了 git 吗?

CarltonYu 回复于 2014年05月26日

3楼 说的“系统原理、编译原理等等基础知识”,非常重要,学会之后就可以举一反三了

macemers 回复于 2014年05月26日

2楼 @king2k 呃,我直接搜服务器开发,大部分都是Linux C++。很少Java。所以得出初步的结论,也不知对不对。

CarltonYu 回复于 2014年05月26日

10楼 @macemers 有的时候要看优势劣势,比如你在找工作的时候,与你竞争的人,张口就是6年c++经验,你怎么办?其实找工作,开发语言不是问题。看好你的人,招进来培养都是可以的。想转的话你可以考虑新锐的语言go

macemers 回复于 2014年05月26日

3楼 @manzhiyong 我知道c++是多范式的编程语言,不太清楚c++的思想是什么。但我认为,无论是c++还是java,在一般情况下,都会避免”重复造轮子”。c++也有stl boost等的库,作为一般的使用。

对于特殊的业务或者需求,java也要写相应的库来实现,而非3楼所说‘这个库不好用,那好吧,我能不能对付“

所以举这个例子,不太恰当。

macemers 回复于 2014年05月26日

5楼 @hazukijunichi 自学的话,可以做点什么入门项目练手呢?而且雇主也会看重?

nickel 回复于 2014年05月26日

作为个有几年C++经验但是非常抗拒Java的老头来说,我不建议你转C++,倒是有兴趣可以自己玩玩学学。

C++几乎不适合做任何应用类,就是比较接近用户层面的东西。连C++大牛许式伟都对C/C++那套内存管理机制(即使用上智能指针)有相当大的看法(可能我表达不准确,大概意思吧)。

而且C++的工作领域确实越来越窄,除非你是打算钻到那个窄领域里做到很牛,但我也同样不看好一个Java出身的人可以在C++里钻的很深,理由和三楼差不多。因为你从一开始就是从Java进入的,很多内存管理的意识你是完全木有的,加上你的工作经验还是偏用户端的比较多,很多架构意识也是比较缺乏的。这个在Java里几乎问题不大,因为什么架构什么框架都有人给人弄好了,你自己照着套跟着做就完了,但是在C/C++里经常是几乎从零开始做(不是说那些库,而是说架构)。这些意识都不是短时间可以补回来,需要很多项目经验。如果你钻到这个领域去,除非你决心要往这条路上走,否则从心态上你是坚持不了的。

虽然C++同样可以做很多网络上的服务(怎么可能不行,很多语言都可以),但是它毕竟是个古老的语言,而且并没有强悍的公司支撑其与时俱进,所以做网络服务类的还是考虑别的语言更好。所以C++越来越被局限在一个底层的领域(别举反例了,我知道有不少,但没有可对比性)。

所以我的思路里,更将Go/Java这类语言放在服务的中间层,底层可以是C/C++,上层可以是其他更容易开发的脚本语言。这个只是我个人看法,给你做参考。

manzhiyong 回复于 2014年05月26日

12楼 @macemers “但我认为,无论是c++还是java,在一般情况下,都会避免”重复造轮子”。c++也有stl boost等的库,作为一般的使用。”这就是典型的java思路。你看看boost和stl现在的发展情况就知道了。。你已经犯了我们一直在说的问题了。。。。。。。你是无法想象在c++上开发的时候,需要自己根据产品情况封装一个文件读写引擎、网络访问引擎、链表+数组等等。你看看云风的blog。

manzhiyong 回复于 2014年05月26日

你再看看陈硕的那本服务器并发编程。陈硕是个不错的开发者。06年我就和他聊过,那时他还没毕业。他是代码大全的中文译者之一。

brambles 回复于 2014年05月26日

C艹是个非常强大的工具,同时也是一个非常蛋疼的工具……

manzhiyong 回复于 2014年05月26日

17楼 @brambles 顶~!蛋疼。

brambles 回复于 2014年05月26日

18楼 @manzhiyong

基本上感觉,从C艹转向任何语言都不会有太大的问题或者太多的不适,但是任何语言转向C艹都是满脑子草泥马……

tinyfool 回复于 2014年05月26日
  1. 学什么语言有前途的问题,基本上是伪问题,学啥语言学好了,都有前途
  2. 学Java转C++没什么难的,这跟C++转Java,C语言转Objective-C,都一样没啥本质区别。基本逻辑是好程序员,从来不觉得转语言有多难。
  3. C++本身确实比其他的一些语言难,这个是行业公认的。
  4. 学习的核心问题是方法。学一个东西的时候,毫无头绪的来问别人看什么书好,该怎么入手,都是没弄懂怎么学习的表现。正确的方法是先随便学一段时间,有点头绪以后再带着针对性的问题提问。
manzhiyong 回复于 2014年05月26日

20楼 @tinyfool 不是很同意这个说法。

学汇编前提是了解片上存储。了解目标平台指令集。精剪指令 vs risc。

学c一般用在操作系统,要了解内存,了解驱动,了解内核,了解线程进程的调度概念。

学c++一般用在对效率要求比较高的地方。比如前几年的手机平台,linux等等。android的dalvik也很多是c++搞的。这个要求了解文件系统,了解设计模式,了解计算机体系原理等等。。否则,对内存的操作、对进程线程信号量临界区等内核对象的直接调度,很容易就直接搞崩进程,甚至直接搞崩系统。

但是学java等等这些非编译型的语言就简单多了。所有东西都有jvm给你兜底。

所以c++转其他比较多。其他转c++一般难过内存关。。当然,如果楼主有足够的毅力重打地基倒也没什么。

tinyfool 回复于 2014年05月26日

21楼 @manzhiyong 这些对好程序员来说,无非就是基本功而已,你要学什么就学什么就是了。

我司的主程Objective-C入门的。懂GGC么?不懂。懂编译么?不懂。懂GDB么?不懂。现在做Android NDK的工作,移植整个Cocoa到Android上去,还不是搞起来了么?

我当年BASIC入门,学C一样学的很轻松。

这些东西当然不是天生就能学会的,那都是那么简单都能学会还要程序员做啥?

manzhiyong 回复于 2014年05月26日

http://coolshell.cn/articles/2250.html 想起这个文章。你看吧。

manzhiyong 回复于 2014年05月26日

22楼 @tinyfool 没错。我就是在说这个问题:从java入行的程序员,在基本功的锤炼上不如c和c++入行的。所以导致c++跳其他较容易。java跳c++和c难。。。基本概念理解不上去了。如果想跳c++,要重打基础。重新看系统原理,操作系统。

董一凡 回复于 2014年05月26日

了解下现代c++去吧,你只需要明白一个概念,c++默认值语义,其他语言基本默认引用语义。其他什么需要了解内存,指针这些都是上古时期的c++程序员出来吓人的。在这些方面现在c++和objc java这些要求已经是一个量级的了。

谁tm说Java不需要知道内存的。

c++真要说反直觉,也就一个模版元编程了,注意不是模版,还有个元字。幸运的是这个你完全可以不学,虽然其实也没什么难的,就是怪异一点罢了

tinyfool 回复于 2014年05月26日

25楼 @董一凡 注意语气

tinyfool 回复于 2014年05月26日

24楼 @manzhiyong 这就是我们观点的区别。

事实上,我见太多的从比较简单的语言跳到复杂语言然后混的很好的。我认为核心问题在于你本身怎么样,而不是你先学了什么。按照一般的入门顺序,至少在我们那个年代,大多数人在学C/C++前往往学过Basic之类的更简单的语言。

然后,更重要的是,这种所谓的学过Java就学不了C++之类的愚蠢的常见论点,让很多本来很聪明,完全不会被这些问题打到的人,被打到了。

同时附和一下 25楼 @董一凡 的意见,在我做搜索的时候,我们主要的流量是靠Java去抗的,我们亲身经历可以证明,做Java,因为JVM和GC的缘故,你要做到某种程度,你对内存的理解其实比C/C++不差,甚至可以说,我们当时还要解决很多C/C++程序员遇不到的问题。怎么跟GC沟通,怎么调优GC表现。

manzhiyong 回复于 2014年05月26日

27楼 @tinyfool 所以说,既然做了java,还是要继续做下去,别跳。

我们的区别在于:我不建议楼主茫无目的的跳。跳了也不会好。java有自己的方向。

HuiCls 回复于 2014年05月26日

语言之争果然是很能引起争论呀 哈哈·

manzhiyong 回复于 2014年05月26日

27楼 @tinyfool 楼主:不要把时间浪费在学习语音基本语法模型上。语言背后的算法、业务场景才是程序员最花工夫的。。

tinyfool 回复于 2014年05月26日

28楼 @manzhiyong 谁推荐他跳了?我哪句推荐了?跳不跳是一件非常小的事情,我谈的是学习的问题,这才是大事情。

manzhiyong 回复于 2014年05月26日

31楼 @tinyfool 楼主来问的就是要跳c++。。在java上可学的也不少。不是看到的c++才值得学习。 c++那么复杂,一入侯门深似海。。所以我不建议楼主跳。

tinyfool 回复于 2014年05月26日

32楼 @manzhiyong 我哪句推荐他跳了,你不要脑补啊

brambles 回复于 2014年05月26日

29楼 @HuiCls

这不是语言之争,语言真的没什么好争的,目前主流的语言都有其优劣都有其适用的环境。这没什么好争的。争得的是语言背后的东西,比如上面说的内存管理等基础。

seagate 回复于 2014年05月26日

14楼 @nickel 楼上说的不错。。。 刚才吃饭的时候,我还在骂C++呢,感觉自己再搞10年,可能C++ 的某些东西还是不懂。。。。 记得面试的时候,三面经理问我: 以前做JAVA 的,这边都是C++,你行吗?(我用java做过半年的游戏) 我忽悠说:有人说过,一个程序员一生至少要会两门语言。我会java,写C++ 的时候,我会考虑Java是怎么实现的,然后融会贯通。。。。。 半年了,我还是没摸着门道。。。。。。

个人感觉其实 c++ 背后的这一套 linux操作系统知识 、网络IO、 存储、 线程调度、各种开源库 才是最蛋疼的。。。。。 你会一下子意识到: 我靠,大学真他妈白上了。。。。。。说明一下: 我是小菜,用 C++ 做应用,不是架构组的。。 不过只要你有那么一点点好奇心,就会不可避免的用到我提到的这些东西。。。。

语言来说,其实应该是不分优劣。我还是不习惯C++。。。。。。将来我自己做应用,我估计也不会用C++。。。。

所以,看你个人兴趣了吧,做产品 做架构 做算法 还是其他。。。。希望对你有帮助。

iamaflyingpig 回复于 2014年05月26日

j2se 做服务器端开发好像岗位不少吧,C++真的不建议学习,感觉岗位越来越少,除非你以前就有很多C++的积累

macemers 回复于 2014年05月27日

14楼 @nickel 谢谢你的建议~~你提到的所谓窄的领域,能不能举个例子说说是什么窄的领域?

macemers 回复于 2014年05月27日

15楼 @manzhiyong 那我还真的犯了你说的错误了。云风的博客我有浏览过,不过现在他貌似转向了C和lua了。C++没什么涉及了。至于陈硕的书,我也买了看。不够我觉得缺乏实践的情况下,看他的书并不能真的理解到书里的内容

macemers 回复于 2014年05月27日

27楼 @tinyfool 我现在的工作由于涉及到线程和调优,所以对内存操作系统等,也不是一无所知,当然没C++的程序员了解得那么细致深入。 我的想法是,如果我将我所有的时间和精力放到c++上面,但是由于缺乏实践并未得到以后雇主的认可,感觉有点得不偿失。

nickel 回复于 2014年05月27日

@macemers 其实就像tiny说的,如果你真想学,有足够的动力和热情,还真是没有不行的。问题是从你简单的信息来看,你在Java领域也只是soso,我就不太能感受到你到C++就能有那么强的钻研精神吗?这个不是挖苦你,只是谈事实,毕竟C++算是一门公认难学的语言,是不是有足够热情和动力是关键。

其次,回答你问题。你应该知道C++现在还在用的领域越来越小,早期连Web Server服务也做,现在你还看到有多少公司会用C++做这个的?一般的互联网领域,即使要做媒体类通讯的也越来越少用C++直接做网络那部分的东西。所以恐怕还在传统通讯领域(2G/3G/4G)以及服务器内部对效率要求很高的模块是比较典型的领域,以及内核级开发、部分工业领域嵌入式等等。当然肯定不止我说的这些,问题是越来越难找到这类业务的公司,即使有估计你以后转换环境的选择也不多。这就是所谓的窄领域。

当然,最好还是得看你的目标是如何的?你并没有说清楚,所以也不好针对性回答。

macemers 回复于 2014年05月27日

一大早发现各位大神都出现在讨论里,感觉受益匪浅。再说一下其实这并非语言之争,而只不过是我自己的困惑。

就招聘而言,大部分大公司,或者直接说BAT,c++的比例远远大于java。B和T几乎全是c++(不算android),而A据我所知,也是一半c++一半java。

manzhiyong 回复于 2014年05月27日

35楼 @seagate 嗯。

manzhiyong 回复于 2014年05月27日

41楼 @macemers 哦?没有吧。bat招聘基本不太局限于语言。关键看基础知识。操作系统、数据结构、系统原理、机器学习、大数据基础理论。

关键字容易背。业务难搞。。尤其是bat,随便立个项目就几十个人参与的。。业务这么复杂,很难理解。

newguy 回复于 2014年05月28日

对于技术狂人来说,什么语言都不重要。minecraft都是用java来写的。对于普通技术屌丝,如果一条路走不通,尽快实现转型才是最正确的,哪条路让你更好更快实现人生目标你就选哪条。

macemers 回复于 2014年05月28日

44楼 @newguy 普通技术屌丝有什么路可以选?~

testmian 回复于 2014年06月02日

用心学还是会懂的,不过c++门槛的确是有的,至少从我觉得看,编译出错信息不简洁直接已经是一个不低的门槛,尤其用上复杂模板,stl等等高级特性后,个人觉得C++做一些对性能优化程序比较时候,而java做业务代码比较适合。当然如果你完全精通一个语言用java写3D游戏还是可以,用java发射火箭导弹还是的,用java做F-35战斗机雷达系统也是可以的。。。

nowherekai 回复于 2014年06月02日

学门语言没那么难,别人的经验也未必适合你。试试就知道了。

tossking 回复于 2014年06月05日

C++是很复杂,不过大部分的特性大部分人都用不到,也不建议用

Glue 回复于 2014年08月20日

作为一个学习C++的学狗,我说两句,从大学开始,我就一直在强迫自己去学C++,因为很多人管C++学的好的人叫大神,为了虚荣心,我强迫自己去学,开始学习WIN32,MFC,后来又在Linux平台上搞,但是我真心觉得我。。。那啥,你懂的,接触了这么久,我现在只想说,去你妈的C++老子不跟你玩儿了!!学了JavaScript,Python,觉得世界都清静了!

macemers 回复于 2014年08月20日

49楼 @Glue js也不简单到哪里去。。。

netdigger 回复于 2014年08月20日

我是从C/C++开始编程的,所以不能理解楼上各位说的java转C++的困难。但是我学一种语言,只是语法上的问题,再看看库提供的功能,就可以开始作业了;GOLang有点区别,语言不一样,开始的时候写出漂亮的代码比较困难。

反过来,我玩了一段时间的java,python,php之后,发现写C++的风格转变很多,借鉴了其它语言的很多特性。

总之一句话,不要怕难不难,有没有有用,有时间就多学点东西,时间长了,自然而然就增长了。

Glue 回复于 2014年08月22日

50楼 @macemers 这不是简不简单的问题。。。

nowherekai 回复于 2014年08月22日

50楼 @macemers 跟我一样,被C++虐的受不了了, 转Ruby了

kiracn 回复于 2014年08月22日

觉得没必要, 感觉还不如去学点andriod, GO之类新鲜的东西

ljb_iss 回复于 2014年08月22日

@macemers 只是找工作的问题,咋会想到转语言上了?转语言未必能解决你的问题啊。你想你刚学c++,去找工作能满足招聘需求吗?做了那么多年的java服务器开发,积累了那么多经验,都找不到工作,刚转C++就好找工作了吗? 建议,

  1. 多找找看还有没有公司,需要你这样的技能的。感觉你的技能领域应该是用java开发企业应用吧? 你看的估计都是互联网公司吧,用的都是开源技术,所以用c/c++的语言多一些吧。
  2. 深化,提炼自己的项目经验,提高面试能力,这会提高你面试成功率的啊。

一点不成熟的想法,同勉。

本帖有55个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]