学 C++ 还是学 Java?做软件研发还需掌握哪些知识和技能?
最近和一些高校的学生朋友交流,他们打算毕业后从事软件研发的工作,但目前有些困惑和迷茫,他们不太确定今后的学习方向,他们想了解一下软件研发的一些领域的现状及发展前景,想知道应聘软件研发岗位要掌握哪些具体的知识和技能。今天我们就来讲一下从事软件研发工作需要学习哪些主要内容,需要做好哪些方面的技能储备,给高校同学们和中途转行的朋友们提供一个参考。
1、是学 C++好呢?还是学 Java 更有前途?
这是一个很经典的话题,相信很多人都有这个疑问,很多人都谈论过。众所周知,Java 和 C++是两门主流的热门开发语言,一直名列世界编程语言排行榜的前几位。在 TIOBE2022 年 5 月最新的世界编程语言排行榜中,C++和 Java 依然稳定在前几位,如下所示:
不管是从世界范围来看,还是从国内来看,Java 和 C++的受欢迎程度都名列前茅,所以毋庸置疑,选择这两种开发语言中的任何一种,都很有前途。
此外,从上图的排行榜中我们可以看到,Python 和 C 依然高居前两位。从我们了解到的实际工作中的情况来看,Python 作为全球首屈一指的脚本语言,已经达到无所不能的境界,但 Python 依然是作为工具来使用,主要来编写一些工具和脚本;C 主要用于底层的开发,比如用于 Linux 操作系统和底层驱动程序的开发,做 C 开发的门槛要稍微高一些。
1.1、Java 和 C++都很有前途
从我们实际工作中接触到的内容以及多年积累起来的认知来看,Java 和 C++都比较有前途,都有着很好的就业情景,具体选哪一种语言作为自己的主攻方向,需要在了解这两种语言的应用领域和使用场景之后结合个人的兴趣去做选择。
一个完备的大型软件系统,从前端到后台,几乎都离不开 Java 和 C++。比如安卓客户端 APP 和后端的 Web 服务器是用 Java 开发的,Windows 客户端程序和后台的很多业务服务器是用 C++实现的。此外,Java 还是大数据、云计算、云原生(微服务)的主流开发语言。
我们日常生活中使用的各种手机 APP,在安卓手机上的,都是 Java 开发的。我们 PC 机上常用的 QQ、桌面版微信、腾讯会议、企业微信、飞书、钉钉、阿里旺旺客户端、Chrome 浏览器等 Windows 客户端软件都是用 C++开发实现的。所以,无论是选择 C++还是 Java,肯定都是有用武之地的。
1.2、Java 的应用领域与使用场景
随着近些年移动互联网的迅猛发展,移动 APP 已经成为各个 IT 厂商争夺市场的主战场之一,这给作为安卓 APP 开发语言的 Java 带来了新的生机和活力。目前,Java 也是大型 web 系统处理后台 web 业务的首选语言,像淘宝和京东这些大型电商系统的 web 服务器都是用 Java 实现的。
常用的 Hadoop、Spark、OpenStack 等大数据与云计算开源框架,都是用 Java 开发的,所以在大数据与云计算领域 Java 有着天然的优势,Java 已经成为大数据开发人员最喜欢的开发语言之一。近年来涌现出来的云原生、微服务等新兴技术与框架,也都是 Java 的主战场。
Java 运行于虚拟机之上,有着特有的跨平台特性,Java 中有完善的异常处理机制。作为 C++开发人员的我们(我本人是做 C++开发的),有时真的很羡慕 Java 如此完善的异常处理机制,一旦程序中发生异常,Java 就会抛出异常,这些异常的提示信息会输出到运行日志中,通过这些输出的信息就能知道是什么异常,快速地定位到有问题的代码。此外,Java 有着近乎完美的封装(封装了很多常用的功能类,以 Jar 包的方式提供),以及多种成熟的 Java 框架(比如 Hibernate、MyBatis、SpringMVC、SpringBoot、SpringCloud 微服务框架等)。
此外,大数据与云计算领域中的 Hadoop、Spark、OpenStack 等框架也都是 Java 实现的。特别是在大数据、云计算和云原生领域,Java 的新技术和新框架更新的很快,Java 始终站在技术的最前沿,这是 Java 最吸引人、最有魅力的地方。所以,Java 绝对是很值得学习、很有前途的主流开发语言。
相对于 C++,Java 有着更完善的内存管理机制,有别于 C++中复杂的指针操作,Java 的学习门槛要稍微低一点,这也是很多人选择 Java 的一个重要原因。从现在在校学生选择现状来看,确实大部分人都选择了 Java,选择 C++的同学相对要少不少。这也导致了一些问题,比如我们在招聘 C++开发时应聘的人明显比几年前少了,比 Java 开发人员难招了许多。
1.3、C++的应用领域与使用场景
C++语言不仅能开发 PC 端的客户端程序,还可以开发服务器程序,后台的很多业务服务器出于性能和效率的考虑,都需要使用 C++来开发。C++也有着良好开源生态,有各种功能的开源库可供选择,但在软件框架这块,C++要比 Java 要逊色一些,Java 有很多成熟通用的框架可以使用。
Java 语言是一种运行于虚拟机上的一种解释性语言,正是通过虚拟机实现了跨平台的特性,开发出来的程序可以运行不同的操作系统上,但同时因为 Java 是一种解释性语言,边解释边运行,其运行效率上,和 C++相比要差一些。C/C++的运行效率是最接近汇编语言的,所以在服务器侧,执行各种高效率代码或算法的业务都会选择更高效的 C++。现在 PC 端的客户端程序基本都是用 C++或者其他语言开发的(比如 C#等),基本不用 Java 来开发客户端程序了。在人工智能、机器学习、计算机视觉与图像识别、自动驾驶等新兴技术领域,对运行性能有着很高的要求,都会首选效率更高的 C++来开发。有朋友可能会问,这些领域能不能使用 python 去实现呢?答案是否定的,因为 Python 的运行效率在这些场景下达不到要求。
所以在当前各种大型系统中,从前端到后台,都有 C++语言的大片用武之地。所以,C++也是一种很有用途、很有市场的主流开发语言。
1.4、如何选择
其实对于一个大型的系统,后台的服务器或模块,有部分是用 Java 开发的,有部分是用 C++实现的,两种语言交织在一起,彼此没有明确的界限,它们相互通信,相互配合。
最终选择哪门开发语言作为自己的主攻方向,要看对语言本身的兴趣,也要看对语言所侧重的技术领域的兴趣,需要综合考虑一下。此外,在大学学习期间我们去主攻一门语言,但找工作时拿到的是另一门语言的开发岗位,或者是校招时以 A 语言应聘进来的,但进入公司后可能因为人员变动会把你调到另一个项目组做 B 语言开发的岗位上。这些情况我们在公司都见到过,比如去年有个以 Java 开发岗位应聘进来的同学,到公司后因为我们 C++项目组缺人,就调到我们这边来搞 C++了。
这位同学在校期间一直学习 Java,甚至参加了一些 Java 的开发项目,在 Java 开发方面积累了一定的经验,刚开始学 C++感觉很不适应,但熬过了最开始那段最难熬的时间后,也逐渐适应了,做的也越来越好了。语音是想通的,学会一门开发语言,再去学另一门语言就不会那么难了!
2、需要掌握的知识和技能
除了掌握开发语言本身之外,还要掌握一些其他的基础知识和技能。这些基础知识知识与技能不仅工作中可能会用到,在找工作时的笔试和面试可能也会涉及到。
2.1、掌握一些基础的网络知识
因为现在的大型系统都是基于网络的,都要基于网络编程,了解一些基础的网络知识,不仅可以加深对代码的认识和理解,也能在遇到网络问题时去排查问题。这些基础的网络知识不仅工作过程中可能会用到,找工作时的笔试和面试可能都会涉及到。不管是开发人员,还是测试人员,亦或是运维人员、技术支持人员,都要有扎实的网络知识,可以应对项目中遇到的各种网络问题。当然,不同岗位或不同层次的人员,对掌握程序是有所差别的。
大家在学校时基本都会学计算机网络相关的课程,建议大家可以好好学一学。可以了解一些基本的概念,了解一些 TCPIP 协议栈层的内容,对以后的工作和面试都是有帮助的。
常见的基础网络知识有 OSI 和 TCPIP 模型的分层以及各层对应的协议、端口的概念、TCP 数据的构成、TCP 连接的三次握手和四次挥手、TCP 和 UDP 的区别、TCP 的心跳机制与丢包重传机制、TCP 的滑动窗口与拥塞控制、操作系统中常用的网络命令等。这些基础的内容,在找工作时的笔试和面试中也会频繁地涉及到。当然,计算机网络课程中的部分内容可能比这些基础内容讲的要深,可以深入地、系统地去学习一下。
2.2、熟悉一些常用的 SQL 语句
掌握基本的数据库知识是对一个 IT 技术人员的基本要求,无论是开发人员,还是测试人员,亦或是其他技术岗位。服务器侧有存储数据的数据中心,数据都是保存在数据库中的,服务器程序会频繁地读写数据库,特别是大型系统中的海量数据的存储对数据库的读写查询性能有着很高的要求,会有专业的数据库工程师进行开发和维护。
服务器侧一般使用大型数据库比如 PostgreSQL、MySQL、Oracle、SQL Server 等,上图中基本涵盖了大部分数据库系统。一些互联网大厂甚至会基于开源的 PostgreSQL、MySQL 等深度优化改造出满足自身业务需求的专业的高性能专业数据库,比如阿里推出的金融级 OceanBase 数据库、腾讯推出的分布式 TBase 数据库、以及华为推出的智能原生的 GaussDB 数据库。经过海量数据与业务的考验和锤炼,这些数据库都已达到国际先进水平,甚至它们的性能与稳定性要高于国外的 Oracle 等顶级数据库,在这些大厂的产品和系统中,已经实现了对国外顶级数据库的国产化替代。客户端程序和嵌入式软件可能也需要存储一些数据,一般会使用轻量级的 sqlite 数据库。
不同层次的人对数据库掌握程度的要求也是不一样的,此处我们主要讲一下需要掌握的一些基础的 SQL 内容。比如数据表的创建、修改和删除,向数据表中插入、修改和删除记录,对数据库中数据进行查询,要熟悉并会使用数据库中的索引、视图、事务处理、存储过程、触发器等。具体学习哪一种数据库,其实都可以,比如比较常见的 MySQL、Oracle 和 SQL Server,任选一种就可以了。这些数据库 SQL 语句的语法大体上是差不多的,只是部分细节上会有所不同,我们只需要掌握相对通用的 SQL 语句即可。
所以,大学期间开设的数据库课程还是需要好好的学一下的,可以在自己的电脑上安装一个数据库系统,要边学习边动手操作,这样效果会比较好。推荐大家安装免费的 MySQL 数据库,数据库客户端推荐使用数据库图形化管理客户端工具 SQLyog。
2.3、了解 Linux 系统,掌握常用的 Linux 命令
当前大部分 IT 公司的后台服务器中使用的操作系统都是 Linux 系统,服务器程序都是运行在 Linux 系统上的,服务器侧的开发人员、测试人员、运维人员都需要对 Linux 系统比较熟悉,了解 Linux 文件系统,掌握一些常用的 Linux 命令。在日常开发和排查问题的过程中会频繁地使用到这些 Linux 命令。这些 Linux 相关的内容,不仅工作中可能会用到,找工作时的笔试和面试也会有所涉及。
常见的 Linux 系统有 RedHat 红帽、Ubuntu 和 CentOS 等,其中 CentOS 是免费的,也是大多数 IT 公司广泛采用的 Linux 系统。CentOS 是 RedHat 公司的免费开源的 Linux 系统,但 RedHat 公司已经宣布停止维护 CentOS 系统了,对于大多数 IT 公司来说,这是个不好的消息。国内的 IT 顶级厂商为了应对这个不利的局势,相继推出了基于开源 Linux 系统深度优化改进的开源服务器操作系统,比如华为的欧拉系统、阿里的龙蜥系统和腾讯的 TencentOS 系统,这些系统是经过大厂的业务系统和海量数据锤炼出来的,是值得信赖的,可以使用这些系统实现对 CentOS 的替代。我们这边已经着手将 CentOS 切换到华为的欧拉系统了。
有的学校可能不开设 Linux 这门课,或者只开设了选修课,Linux 还是很有必要去学一下的,可以到图书馆或者到网上买一本 Linux 教材,系统地学习一下。建议在电脑上安装一个虚拟机,在虚拟机中装一个 Linux 系统(比如常用的 CentOS、Ubuntu),在学习的过程中要实际动手实操一下。
有同学问,像 CentOS 和 Ubuntu 系统,在安装时可以安装 UI 桌面的,可以像使用 Windows 那样使用这些系统,为啥还要掌握大量的 Linux 命令呢?其实在将 Linux 系统部署到服务器时,会做对 Linux 系统做一些功能上的裁剪,是不会安装 UI 桌面模块的,因为 UI 桌面运行时会占用一部分 CPU 和内存资源,所以为了减少不必要的资源消耗,服务器中的 Linux 系统都是不带 UI 桌面的,都是通过 SSH 远程到系统中进入 Linux 命令行使用 Linux 命令去做所有操作的,比如查看文件和文件夹,查看文件内容,查看系统的一些配置和状态信息等等。
2.4、学习汇编语言相关的内容
大家工作后基本都很少接触汇编了,大家用的都是上层的高级语言,只有个别的岗位才会接触并使用到汇编。其实学习汇编是有很多好处的!学习汇编,可以了解到 CPU 中执行的是一条一条汇编指令,在指令中操作各种寄存器,可以搞清楚源代码与汇编代码的对应关系,从而可以理解应用程序是怎么运行的。在 C++开发领域,查看汇编代码可以为分析 C++软件异常提供一些手段和方法。按照我们的经验,了解汇编的人对程序的运行机制会理解的更加透彻。
汇编语句的执行效率是最高的,上层的高级语言相对汇编而言执行效率要低一些,其中 C/C++执行效率是最接近汇编语言的,所以在对程序执行效率要求比较高的领域都会首选 C++进行软件开发,比如人工智能、自动驾驶、计算机视觉与图像识别、算法等领域。
有时为了提升代码执行的速度,我们会直接在源代码中嵌入一段汇编代码,比如在一些算法代码中,比如音视频编解码算法。有人可能会问,经过 IDE 编译出来的二进制文件中也都是汇编指令,你人为的添加一段汇编代码,都是汇编代码,为啥会有执行速度上的差别呢?因为源代码经过编译器的处理生成的汇编代码在实现上可能不是最优的,这要依赖编译器,而我们人为地添加汇编,可以直接控制汇编代码,保证汇编代码是最优的,不再依赖编译器。
大学会开设 8086 汇编或者 ARM 嵌入式汇编,或者单片机的课程,大家可以认真地学一学。另外,现在的很多汇编教材几乎都没有将汇编语句与实际项目的源代码对应起来,对于学 C++的朋友,可以给大家一个很好的建议,可以安装微软的 Visual Studio 2010 及以上的 IDE 开发工具,在调试状态下可以查看 C++源码对应的汇编代码,这样就能将汇编代码与 C++源代码对应起来了。
下面我们以一段 C++测试代码为例,我们编写了一个将两个 int 型整数相加的函数 Add,然后在 main 函数中去调用这个 Add 函数,C++源代码如下:
我们在 Visual Studio 中,在调用 Add 函数的代码附近打断点,然后调试运行,当命中断点时,右键点击断点处的代码,在从弹出的右键菜单中点击“转到反汇编”菜单项:
可以查看到调用 Add 函数附近的汇编代码如下:
如果要从汇编代码页面返回到源代码页面,可以右键点击汇编代码,在弹出的右键菜单中点击“转到源代码”菜单项,如下:
如果要查看多个函数的汇编代码,需要分别点击右键去查看这些函数的源代码,这样才能准确地跳转到函数所在的汇编代码块。
在查看汇编代码时,可以勾选“显示代码字节”选项,就会同时显示机器码:
其实机器码和汇编代码是等同的,汇编代码是机器码的助记符。
2.5、学习一些其他的专业课程
除了上面讲到的一些课程,还有计算机组成原理、计算机操作系统、编译原理与数据结构与算法等一系列重量级的专业课程,这些课程也要好好学一学,这些课程可能是考研要考的专业课。
数据结构与算法这门课中讲到的常用数据结构和算法很实用,工作面试时会涉及到,工作以后也可能会用到,所以要静下心来学一学。计算机组成原理、计算机操作系统、编译原理这几门课都比较难,比较偏理论,实际编写代码时直接使用到的比较少,但是对代码的编译、软件及系统的运行的理解很有好处。
计算机操作系统课程介绍了计算机操作系统的构成,详细讲述了处理器管理、存储管理、设备管理、文件管理、并发程序设计等方面的内容。通过该课程我们可以了解到操作系统的基本概念与实现原理,并深入理解操作系统的设计方法与实现技术。
计算机组成原理课程介绍了计算机的各子系统(包括运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的相关技术。
编译原理课程详细介绍了编译程序构造的一般原理和基本方法,内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等。编译原理课程是计算机相关专业的必修课程和核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。
3、最后
本文详细讲述了 C++和 Java 两大热门语言的应用领域与使用场景,具体选择哪种语言作为自己的主攻方向,还需要结合语言特性及兴趣综合考虑一下。此外,除了掌握一门主打开发语言之外,还需要掌握计算机网络、数据库、Linux 等领域的一些基础知识和技能。最后,希望本文的内容能给高校的同学们提供一定的借鉴和参考。
版权声明: 本文为 InfoQ 作者【dvlinker】的原创文章。
原文链接:【http://xie.infoq.cn/article/c54f5871a1a2ed95082575e7d】。未经作者许可,禁止转载。
评论