本人Java狗一枚,主要从事服务器J2SE方面的开发(网络,多线程和一点Spring),而不是J2EE那块。最近找工作,发现服务器端的职位大部分都是c++,搞Java的多数是android或者J2EE什么的,感觉有点迷茫,所以前来请教各位:
有没有必要转C++?我想知道Java服务器开发的需求大么?还是坚持在Java的体系里,学习点其它的,例如android什么的?因为在没有工作经验的情况下转语言似乎难度比较大,尤其是像C++实在是一门庞大的语言。
该怎么转C++?Java转C++该怎么转?看哪些资料或者课程?然后可以参与或者做点什么项目,让自己看起来有点C++的开发经验?
欢迎各位的建议,谢谢了。
很难。。见过很多从c++转java的,很少见到能够java转c++的。c++的思想,与java是完全相反。c++比较提倡“重复造轮子”。比如linus嫌svn不好用,自己搞个git,这就是典型的c++风格。java的风格是:这个库不好用,那好吧,我能不能对付。。java工程师一般对于系统原理、编译原理等等基础知识掌握的不好。如果不知道内存结构,文件格式等等,做c++很难。内存泄漏你都不知道咋搞。对于指针,数组等等的理解更是没法上手。
如果想转,先把大学专业课挨个看一遍。
而且java程序员找android也不是很给力。android程序员圈,可以看出大部分是原来linux,或者其他平台转行过来的。j2ee过来的少。还是那句话:系统原理基础知识不够。被jdk惯得什么都不会。
C++找工作比较蛋疼。。。像我就是自学C++的,现在在自学java想转型。。。 因为网上找工作,C++都是要高级工程师,低级的不要。。。 然后对于我这类的人就特别尴尬。。。
可以转啊,我就是java出道做android应用,后来去做游戏,用cocos2d-x,自然而然就去做c++了。目前用c#做unity3d开发。并且导出项目的二次开发分别用java二次开发android,用objc二次开发ios。服务端golang貌似最近几年很火,elang也不错啊
3楼 @manzhiyong 我知道c++是多范式的编程语言,不太清楚c++的思想是什么。但我认为,无论是c++还是java,在一般情况下,都会避免”重复造轮子”。c++也有stl boost等的库,作为一般的使用。
对于特殊的业务或者需求,java也要写相应的库来实现,而非3楼所说‘这个库不好用,那好吧,我能不能对付“
所以举这个例子,不太恰当。
作为个有几年C++经验但是非常抗拒Java的老头来说,我不建议你转C++,倒是有兴趣可以自己玩玩学学。
C++几乎不适合做任何应用类,就是比较接近用户层面的东西。连C++大牛许式伟都对C/C++那套内存管理机制(即使用上智能指针)有相当大的看法(可能我表达不准确,大概意思吧)。
而且C++的工作领域确实越来越窄,除非你是打算钻到那个窄领域里做到很牛,但我也同样不看好一个Java出身的人可以在C++里钻的很深,理由和三楼差不多。因为你从一开始就是从Java进入的,很多内存管理的意识你是完全木有的,加上你的工作经验还是偏用户端的比较多,很多架构意识也是比较缺乏的。这个在Java里几乎问题不大,因为什么架构什么框架都有人给人弄好了,你自己照着套跟着做就完了,但是在C/C++里经常是几乎从零开始做(不是说那些库,而是说架构)。这些意识都不是短时间可以补回来,需要很多项目经验。如果你钻到这个领域去,除非你决心要往这条路上走,否则从心态上你是坚持不了的。
虽然C++同样可以做很多网络上的服务(怎么可能不行,很多语言都可以),但是它毕竟是个古老的语言,而且并没有强悍的公司支撑其与时俱进,所以做网络服务类的还是考虑别的语言更好。所以C++越来越被局限在一个底层的领域(别举反例了,我知道有不少,但没有可对比性)。
所以我的思路里,更将Go/Java这类语言放在服务的中间层,底层可以是C/C++,上层可以是其他更容易开发的脚本语言。这个只是我个人看法,给你做参考。
12楼 @macemers “但我认为,无论是c++还是java,在一般情况下,都会避免”重复造轮子”。c++也有stl boost等的库,作为一般的使用。”这就是典型的java思路。你看看boost和stl现在的发展情况就知道了。。你已经犯了我们一直在说的问题了。。。。。。。你是无法想象在c++上开发的时候,需要自己根据产品情况封装一个文件读写引擎、网络访问引擎、链表+数组等等。你看看云风的blog。
学汇编前提是了解片上存储。了解目标平台指令集。精剪指令 vs risc。
学c一般用在操作系统,要了解内存,了解驱动,了解内核,了解线程进程的调度概念。
学c++一般用在对效率要求比较高的地方。比如前几年的手机平台,linux等等。android的dalvik也很多是c++搞的。这个要求了解文件系统,了解设计模式,了解计算机体系原理等等。。否则,对内存的操作、对进程线程信号量临界区等内核对象的直接调度,很容易就直接搞崩进程,甚至直接搞崩系统。
但是学java等等这些非编译型的语言就简单多了。所有东西都有jvm给你兜底。
所以c++转其他比较多。其他转c++一般难过内存关。。当然,如果楼主有足够的毅力重打地基倒也没什么。
21楼 @manzhiyong 这些对好程序员来说,无非就是基本功而已,你要学什么就学什么就是了。
我司的主程Objective-C入门的。懂GGC么?不懂。懂编译么?不懂。懂GDB么?不懂。现在做Android NDK的工作,移植整个Cocoa到Android上去,还不是搞起来了么?
我当年BASIC入门,学C一样学的很轻松。
这些东西当然不是天生就能学会的,那都是那么简单都能学会还要程序员做啥?
22楼 @tinyfool 没错。我就是在说这个问题:从java入行的程序员,在基本功的锤炼上不如c和c++入行的。所以导致c++跳其他较容易。java跳c++和c难。。。基本概念理解不上去了。如果想跳c++,要重打基础。重新看系统原理,操作系统。
了解下现代c++去吧,你只需要明白一个概念,c++默认值语义,其他语言基本默认引用语义。其他什么需要了解内存,指针这些都是上古时期的c++程序员出来吓人的。在这些方面现在c++和objc java这些要求已经是一个量级的了。
谁tm说Java不需要知道内存的。
c++真要说反直觉,也就一个模版元编程了,注意不是模版,还有个元字。幸运的是这个你完全可以不学,虽然其实也没什么难的,就是怪异一点罢了
24楼 @manzhiyong 这就是我们观点的区别。
事实上,我见太多的从比较简单的语言跳到复杂语言然后混的很好的。我认为核心问题在于你本身怎么样,而不是你先学了什么。按照一般的入门顺序,至少在我们那个年代,大多数人在学C/C++前往往学过Basic之类的更简单的语言。
然后,更重要的是,这种所谓的学过Java就学不了C++之类的愚蠢的常见论点,让很多本来很聪明,完全不会被这些问题打到的人,被打到了。
同时附和一下 25楼 @董一凡 的意见,在我做搜索的时候,我们主要的流量是靠Java去抗的,我们亲身经历可以证明,做Java,因为JVM和GC的缘故,你要做到某种程度,你对内存的理解其实比C/C++不差,甚至可以说,我们当时还要解决很多C/C++程序员遇不到的问题。怎么跟GC沟通,怎么调优GC表现。
14楼 @nickel 楼上说的不错。。。 刚才吃饭的时候,我还在骂C++呢,感觉自己再搞10年,可能C++ 的某些东西还是不懂。。。。 记得面试的时候,三面经理问我: 以前做JAVA 的,这边都是C++,你行吗?(我用java做过半年的游戏) 我忽悠说:有人说过,一个程序员一生至少要会两门语言。我会java,写C++ 的时候,我会考虑Java是怎么实现的,然后融会贯通。。。。。 半年了,我还是没摸着门道。。。。。。
个人感觉其实 c++ 背后的这一套 linux操作系统知识 、网络IO、 存储、 线程调度、各种开源库 才是最蛋疼的。。。。。 你会一下子意识到: 我靠,大学真他妈白上了。。。。。。说明一下: 我是小菜,用 C++ 做应用,不是架构组的。。 不过只要你有那么一点点好奇心,就会不可避免的用到我提到的这些东西。。。。
语言来说,其实应该是不分优劣。我还是不习惯C++。。。。。。将来我自己做应用,我估计也不会用C++。。。。
所以,看你个人兴趣了吧,做产品 做架构 做算法 还是其他。。。。希望对你有帮助。
15楼 @manzhiyong 那我还真的犯了你说的错误了。云风的博客我有浏览过,不过现在他貌似转向了C和lua了。C++没什么涉及了。至于陈硕的书,我也买了看。不够我觉得缺乏实践的情况下,看他的书并不能真的理解到书里的内容
@macemers 其实就像tiny说的,如果你真想学,有足够的动力和热情,还真是没有不行的。问题是从你简单的信息来看,你在Java领域也只是soso,我就不太能感受到你到C++就能有那么强的钻研精神吗?这个不是挖苦你,只是谈事实,毕竟C++算是一门公认难学的语言,是不是有足够热情和动力是关键。
其次,回答你问题。你应该知道C++现在还在用的领域越来越小,早期连Web Server服务也做,现在你还看到有多少公司会用C++做这个的?一般的互联网领域,即使要做媒体类通讯的也越来越少用C++直接做网络那部分的东西。所以恐怕还在传统通讯领域(2G/3G/4G)以及服务器内部对效率要求很高的模块是比较典型的领域,以及内核级开发、部分工业领域嵌入式等等。当然肯定不止我说的这些,问题是越来越难找到这类业务的公司,即使有估计你以后转换环境的选择也不多。这就是所谓的窄领域。
当然,最好还是得看你的目标是如何的?你并没有说清楚,所以也不好针对性回答。
一大早发现各位大神都出现在讨论里,感觉受益匪浅。再说一下其实这并非语言之争,而只不过是我自己的困惑。
就招聘而言,大部分大公司,或者直接说BAT,c++的比例远远大于java。B和T几乎全是c++(不算android),而A据我所知,也是一半c++一半java。
41楼 @macemers 哦?没有吧。bat招聘基本不太局限于语言。关键看基础知识。操作系统、数据结构、系统原理、机器学习、大数据基础理论。
关键字容易背。业务难搞。。尤其是bat,随便立个项目就几十个人参与的。。业务这么复杂,很难理解。
对于技术狂人来说,什么语言都不重要。minecraft都是用java来写的。对于普通技术屌丝,如果一条路走不通,尽快实现转型才是最正确的,哪条路让你更好更快实现人生目标你就选哪条。
用心学还是会懂的,不过c++门槛的确是有的,至少从我觉得看,编译出错信息不简洁直接已经是一个不低的门槛,尤其用上复杂模板,stl等等高级特性后,个人觉得C++做一些对性能优化程序比较时候,而java做业务代码比较适合。当然如果你完全精通一个语言用java写3D游戏还是可以,用java发射火箭导弹还是的,用java做F-35战斗机雷达系统也是可以的。。。
作为一个学习C++的学狗,我说两句,从大学开始,我就一直在强迫自己去学C++,因为很多人管C++学的好的人叫大神,为了虚荣心,我强迫自己去学,开始学习WIN32,MFC,后来又在Linux平台上搞,但是我真心觉得我。。。那啥,你懂的,接触了这么久,我现在只想说,去你妈的C++老子不跟你玩儿了!!学了JavaScript,Python,觉得世界都清静了!
我是从C/C++开始编程的,所以不能理解楼上各位说的java转C++的困难。但是我学一种语言,只是语法上的问题,再看看库提供的功能,就可以开始作业了;GOLang有点区别,语言不一样,开始的时候写出漂亮的代码比较困难。
反过来,我玩了一段时间的java,python,php之后,发现写C++的风格转变很多,借鉴了其它语言的很多特性。
总之一句话,不要怕难不难,有没有有用,有时间就多学点东西,时间长了,自然而然就增长了。