最近和朋友交流,他们打算转行从事软件研发的工作,但目前有些困惑和迷茫,他们不太确定今后的学习方向,他们想了解一下软件研发的一些领域的现状及发展前景,想知道应聘软件研发岗位要掌握哪些具体的知识和技能。今天我们就来讲一下从事软件研发工作需要学习哪些主要内容,需要做好哪些方面的技能储备,给高校同学们和中途转行的朋友们提供一个参考。

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++源代码如下:

int Add(inta,intb){    int hSum = a+b;    return nSum;} int __cdecl _tmain(int argc,_ TCHAR* argv[]){    int a = 3;    int b = 4;     int nSum = Add(a,b);    printf(" nSum = %d\r\n", nSum );     return 0;}

复制代码

我们在 Visual Studio 中,在调用 Add 函数的代码附近打断点,然后调试运行,当命中断点时,右键点击断点处的代码,在从弹出的右键菜单中点击“转到反汇编”菜单项:

可以查看到调用 Add 函数附近的汇编代码如下:

如果要从汇编代码页面返回到源代码页面,可以右键点击汇编代码,在弹出的右键菜单中点击“转到源代码”菜单项,如下:

如果要查看多个函数的汇编代码,需要分别点击右键去查看这些函数的源代码,这样才能准确地跳转到函数所在的汇编代码块。

在查看汇编代码时,可以勾选“显示代码字节”选项,就会同时显示机器码:

其实机器码和汇编代码是等同的,汇编代码是机器码的助记符。

2.5、学习一些其他的专业课程

除了上面讲到的一些课程,还有计算机组成原理、计算机操作系统、编译原理与数据结构与算法等一系列重量级的专业课程,这些课程也要好好学一学,这些课程可能是考研要考的专业课。

数据结构与算法这门课中讲到的常用数据结构和算法很实用,工作面试时会涉及到,工作以后也可能会用到,所以要静下心来学一学。计算机组成原理、计算机操作系统、编译原理这几门课都比较难,比较偏理论,实际编写代码时直接使用到的比较少,但是对代码的编译、软件及系统的运行的理解很有好处。

计算机操作系统课程介绍了计算机操作系统的构成,详细讲述了处理器管理、存储管理、设备管理、文件管理、并发程序设计等方面的内容。通过该课程我们可以了解到操作系统的基本概念与实现原理,并深入理解操作系统的设计方法与实现技术。

计算机组成原理课程介绍了计算机的各子系统(包括运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的相关技术。

编译原理课程详细介绍了编译程序构造的一般原理和基本方法,内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等。编译原理课程是计算机相关专业的必修课程和核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。

3、最后

本文详细讲述了 C++和 Java 两大热门语言的应用领域与使用场景,具体选择哪种语言作为自己的主攻方向,还需要结合语言特性及兴趣综合考虑一下。此外,除了掌握一门主打开发语言之外,还需要掌握计算机网络、数据库、Linux 等领域的一些基础知识和技能。最后,希望本文的内容能给转行的小伙伴们提供一定的借鉴和参考。

学 C++ 还是学 Java?做软件研发还需掌握哪些知识和技能?相关推荐

  1. 学C++还是学Java?做软件研发还需掌握哪些知识和技能?

    目录 1.是学C++好呢?还是学Java更有前途? 1.1.Java和C++都很有前途 1.2.Java的应用领域与使用场景 1.3.C++的应用领域与使用场景 1.4.如何选择 2.需要掌握的知识和 ...

  2. java后端开发需要学什么_从事Java后端开发,要学习哪些知识和技能?

    首先要明确后端包括哪些职业:DBA(数据库维护优化专家),Developer(程序猿),Architect(构架师),Scrum master及类似(敏捷开发专家),Project Manager(产 ...

  3. java 内存 开发 经验_有一到五年开发经验的JAVA程序员需要掌握的知识与技能!...

    JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为什么他们能达到如此境界? ...

  4. 解惑:学.Net还是学Java?

    因为.Net和Java是国内市场占有率最高的两门技术,对于准备学习编程语言的初学者来说,.Net和Java是初学者首先考虑的两门技术,因此很多人一遍遍的问"学.Net还是学Java" ...

  5. 没有统计学基础可以学python-统计学专业应该学Java还是Python?

    在你的问题里面,你自己说你是一个善变的人.至于到底应该学习哪个语言,还是要看你自己,看你自己想要从事哪方面的岗位工作.就目前国内的一个IT行业发展情况的话,我比较建议你选择Java,当然Python也 ...

  6. 学完Python后可以做哪些工作呢?

    如果你想选择一种语言来入门编程,那么Python绝对是首选!其非常接近自然语言,精简了很多不必要的分号和括号,非常容易阅读理解.编程简单直接,更适合初学编程者,让其专注于编程逻辑,而不是困惑于晦涩的语 ...

  7. 学妹问我Java枚举类与注解,我直接用这个搞定她!

    很多人问我学妹长什么样,不多说 上图吧! 学妹问我Java枚举类与注解,我直接一篇文章搞定! 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举 ...

  8. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  9. 编程行业高手级别必学C语言,要挣大钱必学C语言,要做黑客、红客必学C语言,要面试名企、外企、高薪职位必学C语言。

    于大部分程序员, C语言 是学习 编程 的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的, ...

最新文章

  1. (七)渐变 矩形渐变 放射渐变
  2. 突发流量引发的Dubbo拥堵,该怎么办?
  3. 打羽毛球如何提高手腕的爆发力
  4. OpenCV演示FloodFill()函数的实例(附完整代码)
  5. python 串口助手 简书_python用pyserial读取串口问题解决
  6. Oracle性能调优之--Buffer cache 的调整与优化
  7. 画春天的景色计算机教案,大班绘画春天来了教案
  8. HTML_CSS_JS_JSON
  9. 《中国人工智能学会通讯》——2.35 敏捷和灵巧精细动作技能(Agile and Dexterous Fine Motor Skills)...
  10. resolving xxx failed: Temporary failure in name resolution解决
  11. Oracle中Lpad函数和Rpad函数的用法
  12. Python安装jieba库
  13. win10安装序列号
  14. Flutter中使用device_info获取设备信息
  15. Scaled-YOLOv4: Scaling Cross Stage Partial Network 论文翻译
  16. http协议详解+https
  17. 回顾这两个月的面试总结,不断的试错不断地坚持!!你也可以的
  18. 发文章,找自己专业学术期刊的“大牛”才好
  19. 基于java的超市积分管理系统
  20. 索尼XB950N1 震撼人心的重低音

热门文章

  1. 【3D游戏编程与设计】一 游戏的分类与热点
  2. 美国洛杉矶cn2测评数据和测评IP
  3. RTKLIB学习总结(四)rnx2rtkp.c、Option文件读取
  4. 友善SD卡烧写工具(SD-Flasher)替代解决方案
  5. 浙江大学陈越教授数据结构PTA 题目——最大子列和(在线处理法)
  6. 使用DataContractJsonSerializer发序列化对象时出现的异常
  7. Android 该如何开发一个证件照DIY小程序 这篇来教你
  8. Win10系统 开启IIS 服务
  9. 【图雀早报】2020年6月8日星期一
  10. Linux C/C++编程:lseek、fseek、ftell、rewind、fgetpos、fsetpos、