0.编程语言排行榜:TIOBE
TIOBE 链接:https://www.tiobe.com/tiobe-index/
1.编程语言概要
C++:高性能、低延迟系统,如谷歌的搜索引擎核心部分、广告服务和大规模分布式系统
Java:大规模系统
Python:数据科学、自动化领域
Go:微服务、网络服务
JavaScript:前端
2.编程语言应该如何选择?
关于编程语言的选择,我一直认为你选择了什么样的编程语言,就会在以后大概率走上什么样的道路。如果你一开始就把编程语言选错了,你将会走许多弯路,最后不得不回到“正确的道路”。说到这,可能会有人反驳说:“语言只是工具”!确实,语言只是工具,但是你有见到过用 Java 搞科研、用 C 写网站后端的人吗?大概率是没有。
在我的学习历程中,我始终觉得许多人(包括我在内)在一开始并没有对计算机学科建立起比较全面的认识,导致在学习时经常充满迷茫,我该学什么好?这个我需不需要学?我学了这个以后有什么用?带着这些迷茫,一部分人会就此放弃、倒在了入门之前;而另一部分人则会不知所措的学习,看似学过许多技术,但是却始终写不出一个能用的程序。
在接下来文章中,我会就一些常见的编程语言进行讲述,在每一种编程语言的论述中,我都会先讲述它能干什么,然后讲述怎么学习,最后讲述在学习该编程语言的同时你还需要学习哪些内容。
1.C/C++/C#: 偏向底层
C、C++ 与 C# 其实是三门不同的语⾔,但可以把 C++ 与 C# 看作是 C 语言的两个不同分支。现阶段 C 的主要应用领域在于底层开发,针对操作系统层级;而 C++ 不仅在底层开发有所应用,而且在游戏开发领域也是领头羊,对于以后想从事游戏开发的小伙伴,C++ 绝对是你的首选;C# 在现阶段的主要应用领域是桌面软件开发,也就是为电脑开发软件,目前国内主攻这一方向的公司较少,大多数是外国公司。
2.Java语言: 偏向上层
选择了 Java ,也就相当于你选择了在本科毕业之后直接工作。Java 在现阶段最主要的应用就是企业级开发与安卓程序开发。Java并不适合科研,对于想以后考研(从事科研领域)的你没有太大帮助,反而会耽误你学习 Python,而 Python 才是现阶段科研领域所使用的语言。
1) 企业级开发: 企业级开发也就是在企业工作,需要一定的技术功底,但是现在校园里大多数人还停留在 Java 的基础阶段,毕业即失业。众所周知,几乎所有的大型网站与软件都拥有后台管理系统,我们的任务就是为前端程序编写后台管理系统。选择了这条路,你会慢慢接触到许多以前在学校从来没有见到过的技术框架、云原生技术(直接在云上开发应用、部署应用),不要指望学校会来教你,学校并不会。主流的开发软件是 IDEA,而不是 Eclipse。
2)安卓程序开发: 虽然 Java 也可以用于安卓开发,但是近几年出现新语言 Kotlin 正在慢慢的侵蚀 Java 在安卓开发领域的份额。总体来说,Kotlin 比 Java 更适合安卓开发,不过你并不需要为此焦虑,因为 Kotlin这门语言写起来跟 Java 很像,甚至有人把 Kotlin 称为“另一门 Java 语言”。我的建议是在学习完 Java 之后可以试着入门 Kotlin,把握住安卓未来的发展方向。
当然,在 Java领域要学习的东西不只这么多,以上只是主要的学习线路,其他你还要学习的知识包括但不限于:Git、HTML/CSS/JavaScript、HTTP协议、TCP/IP协议、Linux、mysql、Mybatis、redis、mongoDB、Nginx、RocketMQ、Docker、Kubernetes。
3.Python语言:
Python 是一把科研的利器,对于以后只想考研的同学大有裨益。在我看来,Python在现阶段主要应用领域为科研与大数据分析,少部分应用在 web 应用开发、游戏开发。主流的开发软件是 PyCharm。
1) 科研: 科研 = 从事研究工作,这是想考研的同学避不过去的一道坎。Python 近些年来在人工智能领域大放异彩,自然也成为了从事科研人员的首选语言。人工智能研究包括自然语言处理、物联网开发、自动化推理等,这其中会涉及到很多算法(数学),对于没有兴趣的小伙伴可能会觉得异常痛苦,有兴趣的则乐在其中。在这里,由于我不熟悉科研领域的相关学习路线,所以不给出直接的学习路线建议。
2) 大数据分析: 大数据分析主要涉及到爬虫与数据分析。与科研不同,这条道路未来的方向是就业,主要从事企业级数据分析与自动化流程开发等。
当然,在 Python 领域要学习的东西也不只这么多,其他你还要学习的知识包括但不限于:Git、HTML/CSS/JavaScript、HTTP协议、TCP/IP协议、Linux(重点)、mysql、mongoDB、网站爬虫、抓包。
4.JavaScript语言:
JavaScript 跟 Java 两者名字虽然相似,但其实是两门不同的语言,关于他俩之间的具体关系,这里不作过多介绍。JavaScript 目前的应用领域很广,既可以作前端开发(如网页开发、小程序),也可以作后端开发(如 NodeJS),是当下开发领域比较活跃的一门语言。
学习 JavaScript 会首先接触到三大组件“ HTML/CSS/JavaScript ”,这三门技术合在一起就是整个前端开发的基础、重中之重。三大组件入门很容易,但是想要精通却并不容易,尤其是在前端开发中会涉及到许多关于“美”的定义,需要开发人员具备一定的审美能力。在这里,你将接触到像 Vue.js、React这样好用的框架,主流的开发软件是 VScode、WebStorm。
总结: C/C++ 适合底层开发与游戏开发,C# 适合桌面级软件开发, Java 适合企业级后端开发与安卓程序开发,Python 适合科研与大数据分析,JavaScript 适合前端开发(网页、小程序类)与轻量级的后端开发。
3.前端 or 后端
算法 > 开发(后端>前端) > 测试/运维/网安
后端是非常有技术含量的,像什么高并发、缓存、负载均衡、分布式、消息队列、安全、搜索、数据复制… 每个方向都值得静下心来去深挖。
不管前端技术怎么变化, 作为提供服务的后端总是要存在的,这是一大优势。
后端编程还有一个优势就是相对稳定, 比起大爆炸的前端,后端技术的变化要缓慢一些, 心思不会那么浮躁, 有很多知识可以慢慢的沉淀。
对于那些不喜欢做GUI的同学,不妨考虑下后端编程。
(1)后端技术
互联网,尤其是移动互联网开始兴起以后,海量的用户呼啸而来,一个单机部署的小小War包肯定是撑不住了,必须得做分布式。
原来的单个Tomcat得变成Tomcat的集群,前边弄个Web服务器做请求的负载均衡,不仅如此,还得考虑状态问题,session的一致性。
业务越来越复杂,我们不得不把某些业务放到一个机器(或集群)上,把另外一部分业务放到另外一个机器(或集群)上,虽然系统的计算能力,处理能力大大增强,但是这些系统之间的通信就变成了头疼的问题,消息队列(MQ),RPC框架(如Dubbo)应运而生,为了提高通信效率,各种 序列化的工具(如Protobuf) 也争先空后地问世。
单个数据库也撑不住了,那就做数据库的读写分离,如果还不行,就做分库和分表,把原有的数据库垂直地切一切,或者水平地切一切, 但不管怎么切,都会让应用程序的访问非常麻烦,因为数据要跨库做Join/排序,还需要事务,为了解决这个问题,又有各种各样“数据访问中间件”的工具和产品诞生。
为了最大程度地提高性能,缓存肯定少不了,可以在本机做缓存(如Ehcache),也可以做分布式缓存(如Redis),如何搞数据分片,数据迁移,失效转移,这又是一个超级大的主题了。
互联网用户喜欢上传图片和文件,还得搞一个分布式的文件系统(如FastDFS),要求高可用,高可靠。
数据量大了,搜索的需求就自然而然地浮出水面,你得弄一个支持全文索引的搜索引擎(如Elasticsearch ,Solr)出来。
林子大了,什么鸟都有,必须得考虑安全,数据的加密/解密,签名、证书,防止SQL注入,XSS/CSRF等各种攻击。
(2)“大后端”
前面提到了这么多的系统,还都是分布式的,每次上线,运维的同学说:把这么多系统协调好,把老子都累死了。
得把持续集成做好,能自动化地部署,自动化测试(其实前端也是如此),后来出现了一个革命化的技术docker, 能够让开发、测试、生成环境保持一致,系统原来只是在环境(如Ngnix, JVM,Tomcat,MySQL等)上部署代码,现在把代码和环境一并打包, 运维的工作一下子就简化了。
公司自己购买服务器比较贵,维护也很麻烦,又难于弹性地增长,那就搞点虚拟的服务器吧,硬盘、内存都可以动态扩展(反正是虚拟的), 访问量大的时候多用点,没啥访问量了就释放一点,按需分配,很方便,这就是云计算的一个场景。
随着时间的推移,各个公司和系统收集的数据越来越多,都堆成一座大山了,难道就放在那里白白地浪费硬盘空间吗?
有人就惊奇地发现,咦,我们利用这些数据搞点事情啊, 比如把数据好好分析一下,预测一下这个用户的购买/阅读/浏览习惯,给他推荐一点东西嘛。
可是这么多数据,用传统的方式计算好几天甚至好几个月才能出个结果,到时候黄花菜都凉了,所以也得利用分布式的技术,想办法把计算分到各个计算机去,然后再把计算结果收回来, 时势造英雄,Hadoop及其生态系统就应运而生了。
之前听说过一个大前端的概念,把移动端和网页端都归结为“前端”,我这里造个词“大后端”,把那些用户直接接触不到的、发生在服务器端的都归结进来。
(3)怎么学?
现在无论是前端还是后端,技术领域多如牛毛,都严重地细分了,所以我认为真正的全栈工程师根本不存在,因为一个人精力有限,不可能搞定这么多技术领域,太难了。
培训机构所说的“全栈”,我认为就是前后端还在拉拉扯扯,藕断丝连,没有彻底分离的时候的“全栈”工程师。
那么问题来了, 后端这么多东西,我该怎么学?
之前写过一篇文章叫做《Java后端学习流程》,说了学习的广度和深度,在这里也是相通的。
往深度挖掘,可以成为某个技术领域的专家,如搜索方面的专家、安全方面的专家,分布式文件的专家等等,不管是哪个领域,重点都不是学会使用某个工具和框架, 而是保证你可以自己的知识和技术去搞定这个领域的顶尖问题。
往广度发展,各个技术领域都要了解,对于某种需求,能够选取合适的软件和技术架构来实现它,把需求转化成合适的技术组件,让这些组件以合适的方式连接、部署、运行,这也需要持续地学习和不断的经验积累。
4.参考文章
1.编程语言应该如何选择?:https://blog.csdn.net/qq_35760825/article/details/124859874?spm=1001.2014.3001.5506
2.后端程序员都做什么(转):https://www.jianshu.com/p/e95c7bbe4090