大家好,我是二哥呀。
微信上收到一个读者的私信,他正在一所 985 高校读研,专业是机械工程,想转行做软件开发,问我该选择 C++ 还是 Java?
那考虑到还有不少读者有类似的问题,我这里就把我之前的回答整理一下发出来,希望能给大家一些参考和启发~
众多的编程语言(C/C++、Java、Python、JavaScript)当中,到底哪一门适合自己?其实会困扰很多初学者。借这个机会,就简单给大家普及下。
C语言就好像是编程界的大叔,因为年长、稳重,被尊称为前辈。它更偏向于底层,用于系统和硬件编程。
C++算是 C语言的同室宗亲,从小就受到 C语言的各种关照,自己也比较上进,练就了无数禁咒级别的魔法,拥有更强大的力量,广泛应用于游戏开发,以及追求极致性能的应用开发。
Java 虽然在名字上和 C/C++ 风马牛不相及,但其实有着颇深的渊源。Java 更喜欢跨平台,也更愿意设身处地地为他人着想,所以在编程语言中的呼声很高,有帝王之相。Java 可以用来做网站、做软件、做安卓、做游戏,几乎可以胜任所有工作。
Python 看起来似乎很年轻,但其实比 Java 还要年长几岁,随着大数据、人工智能的兴起,Python 重新赢得了人们的青睐和信任,属于典型的大器晚成,在人工智能、深度学习、自然语言处理等领域有着得天独厚的优势。
JavaScript 从名字上看好像是 Java 的小弟,但它们之间的关系也仅限于此。JavaScript 面向的是前端开发者,可以说有浏览器的地方就离不开 JavaScript。
对于初学者来说,如果非要选择一门编程语言来作为入门语言的话,我认为 C++ 应该排在最后。从岗位的选择上来看,前端无疑选择 JavaScript,后端可选 C语言和 Java,算法选择 Python。等有了 C语言的基础后,再学 C++ 的阻力就会小很多。
JavaScript 在这些编程语言当中是最特殊的,代码编写、代码运行和代码调试都可以直接在浏览器的开发者模式下进行,对于初学者来说,这一点极其重要,因为令人心烦的开发环境配置就省去了。
C++ 和 Java 之间的区别可以追溯到它们各自的传统,如果想知道 C++ 和 Java 之间有哪些细微的区别,可以到维基百科上看这个条目:
https://zh.wikipedia.org/wiki/Java%E5%92%8CC%2B%2B%E7%9A%84%E5%B0%8D%E7%85%A7
为了帮大家对编程语言有一个初步的认知,前面顺带分析了C语言、Python 和 JavaScript。针对读者微笑的情况,我们来重点讨论一下 C++ 和 Java。
编程界有一个固有的偏见,就是大多数人会默认 C++ 可以轻松转 Java,但 Java 转 C++ 很难。理由是,Java 程序员在软件工程上的修炼比 C++ 更充分,但在内存管理和硬件优化上有着明显的不足。
但 Gosling 曾说过一句话:“语言只是实现目标的工具,而不是目标本身。”
因此,我们学编程的这群人不应该有这种偏见,应该针对自身的情况,做出最有利于自己的选择,因为每一种编程语言都有自己的应用领域,而每个人的能力又千差万别。
如果你是计算机科班生,天赋很高,自己对编程也有浓厚的兴趣爱好,也想挑战自己,那么可以选择 C++。
C++ 的应用范围非常广,能应对多方面的需求,比如说网络、通讯、图像、游戏、桌面等等,像操作系统的部分内核也都是由 C++ 编写的。Java 的 Hotspot 虚拟机,整体上都是用 C++ 实现的,只有非常少量的汇编。
除此之外,下面这道选择题无疑更富有哲理性:
Java 相比较于 C++,除了语言本身之外,我觉得最大的优势在于 Java 拥有着强大而丰富的开源生态,就 Spring 这一体系的框架足以吊打任何对手。
英语里有个单词——accountable,这东西不太好翻译,直译比较难把真正要表达的意思传递出来,用通俗一点的话讲,叫做——指望得上。
Java 就是一种指望得上的编程语言。
往小了说,个人开发者可以到 GitHub 上 down 下来一套源码,改上三五个月,就能交付一套成熟而完善的系统。
往大了说,阿里这家国内互联网头部公司,主要的技术栈就是 Java,就不说它的产品了,光它的开源项目,我都能掰扯一整天。
如果你肯花一点时间到 GitHub 或者码云上逛一逛的话,就会发现,原来 Java 的世界如此庞大和美好!
有人说,C++比 Java 难学,但其实要加一个前提条件,就是如果你不下狠功夫,不去花时间和精力的话,不管是 C++,还是 Java,都很难学。很多初学者在遇到 C++ 中的指针、虚函数、动态绑定的时候,会怵得慌,我敢肯定,他在遇到 Java 中的并发编程、JVM 时也会怵得慌。
只不过,Java 对于初学者更友好一点,C++ 对高阶程序员更开放一点。
当然了,无论选择哪一门编程语言,我觉得抽象思维能力是非常的重要的,这也是计算机领域最重要和最基础的能力。你得把现实世界里复杂的问题抽象化,然后转换成计算机能够运行的语言,从高级编程语言,再到汇编语言,最后到机器语言。
看到这,大家不会以为二哥是个 Javaer,就推荐读者选择 Java 了吧?
这个读者的情况是,他之前已经把 C++ 的基本编程语法学完了,希望能找一个计算机和机械结合的工作,所以我给他的建议是继续学习 C++。
因为他本身的学历是过关的,985 的研究生,尽管是非科班,但编程的门槛已经可以轻松跨过了。再加上他想要从事计算机和机械相结合的工作,那 C++ 无疑是更合适的,毕业后可以转型做工业领域的 C++ 软件开发,很多工业软件方面招C++的挺多的。
机械专业有C语言的功底,学习 C++ 以及数据结构与算法就不会有特别大的阻力。再加上有单片机的基础,深入搞一下 Linux 往嵌入式方向发展也是可以的。
或者可以转机器人、自动驾驶,因为很多底层的控制算法库是都是基于C/C++开发的,比如快速傅里叶变换算法、矩阵计算、特征值求解等等。机器人非常关键的一点是对性能非常苛刻,性能要求严格的地方,C/C++就是王者。
再或者可以直接转 Linux C++ 服务器端开发(也就是在 Linux 进行 C++编程),这条路也是非常吃香的。
学习 C++ 语法,首推《C++ Primer 第五版》。我在参加第一份工作的时候,就买过一本《C++ Primer 第四版》,这本书一直不舍得扔,尽管它已经非常破了,但我们之间的感情是深厚的,毕竟跟随我辗转了好几个城市了。
这本书非常全面地讲解了 C++ 的语法以及 C++ 的各种特性,如果能坚持看完的话,帮助会很大。如果时间比较充分的话,建议至少看两遍。如果时间比较紧张的话,至少通读一遍吧,要能把握住这本书的大体框架,然后结合个人的实际情况选择性地看一些重点章节。
然后是《Effective C++》,侯捷老师译的,这本书主要讲解了编写 C++ 代码需要注意的一些条款,和《Effective Java》 属于同一个系列。
第三本是《STL源码剖析》这本书,侯捷老师写的,这本书讲了C++的底层实现,包括各种容器(vector、list、heap、deque、Red Black tree、hash table、set/map)的实现、各种常见算法(排序、查找、排列组合、数据移动与复制技术)的实现等。
第四本《深度探索C++对象模型》,侯捷老师译的,这本书讲解了 C++ 面向对象特性的底层实现机制,读起来虽然有点晦涩,但读完后就会搞明白“代码跑起来的时候实际发生了什么”。
既然有三本书都是侯捷老师的,那再刷一刷侯捷老师的视频,岂不是效果更佳?不过,由于涉及到版权,国内的 B 站、A 站都下架了相关的视频资源,包括:
我从网上 down 了一份,保存到了本地。大家需要的话,可以在后台回复「侯捷」关键字拉取下载链接。
其实不管是学习 Java,还是学习 C++,还是任何一门其他的编程语言,有时间有精力的话都要学习计算机基础。
1)数据结构与算法
我画了一张脑图,里面几乎涵盖了所有数据结构与算法书籍中都会讲到的知识点。
书的话推荐小争哥的《数据结构与算法之美》,由浅入深的一本书,读起来就像打游戏刷boss一样,没有其他算法书那种嚼蜡感。
视频课的话推荐浙大的数据结构课,讲解简明易懂,B 站和 mooc 上都可以观看。
https://www.bilibili.com/video/av18586085/
学的差不多后就到 LeetCode 上刷题,刷题的过程中可以同步学习 STL 源码剖析,双管齐下后的结果就是你在编写 C++代码的时候更加游刃有余。
刷题可以分为两种方法,一种超级兔子系,一种超级乌龟系。兔系追求的是暴力,可以照着答案去刷,刷多了就自己慢慢领悟了;龟系讲究的是质量,追求最优解,一道题可能要做多种解法。
2)操作系统
操作系统是管理计算机硬件和软件资源的程序,是计算机的基石,也是校招面试中考察的核心知识点。当学了 C++ 基础语法后,再加上数据结构与算法的基础,操作系统这块硬骨头就不那么难啃了。
推荐两门视频课,先看一门国内的,再看一门国外的,中西合璧,药效持久。
国内的推荐哈工大的《操作系统》实验课,分为四个部分:
01、操作系统基础篇
https://mooc.study.163.com/course/1000002004
02、操作系统之进程与线程
https://mooc.study.163.com/course/1000002008
03、操作系统之内存管理
https://mooc.study.163.com/course/1000003007
04、操作系统之外设与文件系统
https://mooc.study.163.com/course/1000002009
国外的推荐 MIT(麻省理工学院)的 6.S081(Introduction to Operating System,操作系统导论)这门课:
https://www.bilibili.com/video/BV19k4y1C7kA
可以配合这份 30 万字左右的中文在线阅读文档一起刷,
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
我还整理了一份操作系统的核心知识点,大家需要的话,可以在后台回复「操作系统」关键字拉取下载链接。
针对 Linux 的话,可以先看《鸟哥的 Linux 私房菜》,主要是了解基本的 Linux 命令,进一步学习的话,可以看《UNIX环境高级编程》,如果还想对 Linux 内核原理进行深度学习的话,可以看一下《Linux内核设计与实现》,这本书可以帮助你快速建立起比较完善的知识框架。
3)计算机网络
计算机网络和操作系统有一个共同点,就是它们有着相当复杂的体系结构,很多初学者都会觉得比较难,那可能是没有产生足够的求知欲。
也许你可以这样问自己一下:那些 P 站上的小电影,是怎么传输过来的呢?
这么一问,是不是瞬间就支棱起来了?
入门的话,推荐三本书,《图解 HTTP》、《图解 TCP/IP》、《网络是怎样连接的》。第三本书虽然名字上没有带图解,但其实可以归为一个系列。
如果想看视频的话,推荐 B 站上的《计算机网络微课堂》,有读者在留言区这样评价说:“吹爆,这种课才应该是真正的国家精品课程”:
https://www.bilibili.com/video/BV1c4411d7jb
学习完前面这些,就基本上掌握了计算机网络的理论知识,如果还想对网络编程进行实战的话,可以看一看《Unix 网络编程》这本书。
4)数据库
要想学好数据,首先要学习一下 SQL,书的话推荐《SQL 必知必会》;视频的话推荐一个老外的视频课(中字版啦),内容制作得非常棒,所以完全不用担心听不懂,这个视频的整个画面制作得非常舒适,观感非常好。
https://www.bilibili.com/video/BV1UE41147KC
然后再学习一下市场占有率非常高的 MySQL,书的话推荐《高性能 MySQL》;视频的话推荐尚硅谷的一个,一位女老师讲的,质量也非常不错。
https://www.bilibili.com/video/BV12b411K7Zu
1、自学才是硬道理。强大的自学能力是独自解决问题的根本,程序员需要拥有强大的自学能力。
2、一个人可以走得很快,但一群人才能走的更远。最好加入一些有氛围的技术交流群,结交一两个有能力的同阶段的人,切磋精进一下。
3、入门阶段,coding 为主,视频和看书为辅,不要搞反了。记住这个公式:只看+不练=假把戏。
4、如果你以后不想当一个优秀的工程师,不想在计算机这条道路上走得更远,只想躺平当个平平淡淡的码农,那么我推荐一条路:跟着老师一步步走,跟着大学的教学方案,一步步走就行了。
5、学习的最好方法就是逐步扩大胜利战果,先从最小的胜利开始,让自己感受到学习的快乐,尽快地进入到一种正反馈的状态当中。
6、罗马不是一天建成的,请保持耐心。