耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)
Posted 启舰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)相关的知识,希望对你有一定的参考价值。
要说哪个方向容易进腾讯,那必然是C++
鹅厂确实喜欢C++,我毕业时,面试腾讯,当年给的offer就是Linux C++ 后台开发。
每个公司的技术选型不光要考虑技术因素,还需要考虑历史代码屎山的因素。腾讯很多产品的服务端都是用C++开发的,当然需要大量的C++攻城狮来维护。
所以,相比其它大厂,鹅厂是招C++工程师最多的。
大家需要注意的是,如果你要学C++,有且仅有linux C++ 服务端开发一条路。
但,Linux服务端开发工资要比其它程序员起薪要高。
当然是因为它难!
直接上干货,我花了一个月的时间做了一张Linux C++学习路径,为了方便展示,我把所有子主题、子子主题都缩了进去
涵盖了linux C++每个阶段所需要学习的知识点。记得帮我点赞呀
包括计算机基础(组成原理、计算机网络、操作系统、编译原理、数据结构、算法、设计模式)、开发环境及编译器的使用、第一阶段(C++入门)、第二阶段(C++进阶)、第三阶段(征服Linux)、第四阶段(高级进阶)、第五阶段(架构师)及近五十个优秀开源工程汇总、及程序员所需具备的软技能。
这份路线图是绝对是每个C++工程师的必备经典,大家可以根据自己的能力水平,根据路线图去看自己还需要补齐哪些知识,并且向高级进阶时,又需要哪些知识点。
这份路线图,是我跟两个大厂朋友共同完成的,为了不给大家造成误导,连续勘校了一个月。大家帮我点个赞吧。
需要高清无水印思维导图源文件的小伙伴,可以点击这里获取:
再来看下完全展示的状态,完全垂直打印出来,应该有二十米。
长文预警,以下内容涵盖了linux C++的完整学习路线及学习资料推荐,总结出来供大家参与。如果不是终结贴,尽管来骂我!!!
文章写了很久,我相信它一定能帮到你,也希望大家能给我个赞,以示鼓励,谢谢
根据这个技术路图,我们再来拆解每个阶段应该学些什么和怎么学。
关于计算机基础知识,我之前有过一篇高赞回答讲解并推荐了学习书籍和视频(目前六千赞),这里就不再重复了,大家可以直接移步过去参考,绝对会对你有所帮助。
我们这里着重讲述linux C++的学习阶段。
各个答主都着重在讲述linux C++有哪些内容应该学并且推荐了一些资料,但这么多资料真的有多用吗?
任何时候,我们都应该循序渐进!你让一个小白,上来就学中间件?估计直接就劝退!
一、工具的选择
工欲善其事,必先利其器。我们先看下开发工具的选择
IDE:
我这里列出了JetBrains系列和VS Code的IDE。对于C++er而言,我们可以使用CLion,也可以使用微软开发的Visual Studio Code(简称VS Code)。
CLion :跨平台的C/C++ IDE 开发工具,支持C++11 、C++14、libc++以及Boost。
Visual Studio Code(简称VS Code):是一个由微软开发,同时支持Windows 、 Linux和macOS等操作系统的免费代码编辑器,它支持测试,并内置了Git 版本控制功能,同时也具有开发环境功能,例如代码补全(类似于 IntelliSense)、代码片段和代码重构等。该编辑器支持用户个性化配置,例如改变主题颜色、键盘快捷方式等各种属性和参数,同时还在编辑器中内置了扩展程序管理的功能。
在2019年的 Stack Overflow 组织的开发者调研中,VS Code被认为是最受开发者欢迎的开发环境。
编辑器:
在 Linux 下开发肯定离不开 Vim 或者 Emacs,这两个都是常用的编辑器,已经形成了两大爱好者阵营。特别是 Vim 编辑器,学习成本有点高,配合上各种插件和配置,有些 Vim 爱好者已经把它当成 IDE 来用了,一旦掌握可以大幅提升工作效率,值得你去学习。
当然除了 Vim 如果是文字编辑工作,比如写 README 文档或者写技术博客,那么强烈推荐学习下 Markdown 语法,这是一种种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,注重内容本身不用过多的调整排版。Markdown 编辑器推荐 Typora 、有道云笔记 Markdown 编辑器、VSCode Markdown插件。
版本控制:
大型软件项目的代码量巨大,如何有效组织和管理源码和版本,于是产生了版本控制系统。版本控制系统就是我们常说的SVN 或 Git,用来追踪、维护源码、文件以及配置文件等等的改动,并且提供控制这些改动控制权的程序。
常见的版本控制系统分为两大类:集中式版本控制和分布式版本控制。作为后端开发工程师,版本控制系统的使用也是必须掌握的基础技能,不过这些系统一般都是边使用边熟悉,刚开始熟悉一些常用操作就好
-
常见的有集中式版本控制系统,代表是SVN;
-
分布式版本控制系统,代表是Git
二、第一阶段:C++入门
很多同学问我,学C++要先学C语言吗?当然不需要!
C++和C语言本来就是两种不同的编程语言,但C++确实是对C语言的扩充和延伸,并且对C语言提供后向兼容的能力。
所以,如果你本身就要学C++,反而从C语言开始,把C语言学完以后,还需要重新学习和适应C++的区别和特性,浪费时间。
当然,如果你原来就会C语言,那你学C++会更快。毕竟,他们之间的区别并不像跟其它语言一样那么大。
第一阶段,大家只需要了解C++的语言基础、一些基础的linux命令和常用的几个数据结构即可。
我们只需要能够在linux上面简单跑起来代码,或者直接在IDE中跑出来,也是可以的。
在这个阶段,我们需要的是快速入门,最后我们可以做一个电子词曲人小项目,以使用C++的基础知识。(电子词典的源码将和推荐的书籍、技术路图一同提供)
强烈大家刚开始要跟着视频学,C++本身就难,如果自己看书的话,会非常吃力。在看视频的同时,把书做为辅助,有奇效。
视频强推侯捷老师的C++面向对象程序设计,我当前入门C++就是跟着侯老师学的,讲的非常仔细,现在候老师在B站上开源他的讲课视频,大家可以去看:
但候老师的课,一如即往的每节都非常长,短的也要三十分钟……着实很难坚持。
对于定不住的同学,可以看小甲鱼的《C++快速入门》,每个视频十分钟左右,共49集,看完以后,再看候老师的课会轻松很多。
配置书籍首推《C++ Primer》
本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。
《Effective C++:改善程序与设计的55个具体做法》(中文版)
一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑,教你怎样才能写出优雅的C++代码。这里也是很多关于C++方面面试问题的出处。
三、第二阶段:C++进阶
这个阶段主要了解STL的使用,学会应用一些常用的设计,并且能够开发一个贪吃蛇项目,以学习类和设计模式的使用。
有关STL标准库的使用是比较难的,同样推荐大家以视频入手。
再次感谢侯捷老师,他录制了46集的系列视频讲解了《C++ STL标准库和 C++ 泛型编程》
【高清完整版】侯捷-C++ STL标准库和 C++ 泛型编程
配置书籍推荐《C++ 标准程序库》
这本书给我感觉就是既适合初期入门,又适合当字典用,因为里面的内容比较多,好多第一次记不住。
所以也可以大致看一遍,以后用时再具体记,这样根据实际去学习我个人觉得效果会更好。
《STL源码剖析》
学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品位都会获得快速的成长。
四、第三阶段:征服Linux
到了这部分,就真正开始涉及linux开发了
首先,我们需要熟悉Linux的常用基本指令:
书籍首推《鸟哥的linux私房菜》:
内容讲的很好,比较简单易懂,当然,如果你还是觉得困难的话,可以跟着视频一块学,在B站有一些up主录制了《鸟哥的linux私房菜》的教学视频,可以一起参考:
然后,我们需要学习各种基于linux的编程API,分别学会系统编程、网络编程、数据库编程。这些内容学完,已经能够自行实现软件开发了,找个工作问题不大。
1、系统编程
众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。
2、网络编程
后台开发是离不开网络编程的,甚至简单来说,后台开发就是用厉害点的电脑去处理大规模的网络请求。所以作为一名合格的后端开发人员,对Linux网络编程的熟悉是必不可少的。
3、数据库编程
如果只是会mysql基础可能是远远不够的,像是Redis,MongoDB等非关系型数据库也是当前的热门。分布式数据库,分布式存储是当前每个大公司都会非常重视的核心,所以数据库基础非常的重要。
一般而言,Linux/Unix的书籍会一齐覆盖系统、网络、数据库这三个方面的知识。所以,这里的书籍做一次统一推荐。
首推Linux编程经典书籍:《UNIX环境高级编程》,本书是被誉为UNIX编程“圣经”,这本书大而全,但也比较难啃,可以挑着看
如果觉得上面那本书看不懂,那推荐《Linux高性能服务器编程》,这本书对菜鸡比较友好,内容很庞大,而且基础讲解的比较详细。
如果只是会MySQL基础可能是远远不够的,像是Redis,MongoDB等非关系型数据库也是当前的热门。
分布式数据库,分布式存储是当前每个大公司都会非常重视的核心,所以数据库基础非常的重要。
MySQL入门建议可以看《MySQL必知必会》。原理比较少,基本都是语法和使用细节,适合先过一遍。
Redis入门可以看《Redis设计与实现》这本书。非常详细的讲了Redis的底层数据结构,包括其集群部分也做了很好的解释。除此之外可以再去理解一下分布式的Raft算法,Gossip协议等等。
很多同学在学习的同时,想要做些实战项目,我也把Github的优秀开源项目进行了整理,这里也分享给大家。
这些内容学完以后,基本上具有了工作两年的水平,别说校招,就是社招找工作都是非常简单的。
为了方便大家,我把以上推荐的所有书籍、工程文件、开源工程地址,都已经整理好了,需要的同学可以去下载。
第四阶段:高级进阶
在划分时,我也是非常纠结的,因为编程的学习并不是完全线性的,并不一定要先学A才能学到B。比如,这里列到的监控的统计,大家在学习前面的编程书籍时,一般也都会涉及。
但我仍把它列到了高级进阶部分,因为我是基于对就业的必要性来划分的。很多同学看这个路线图的主要目的就是为了找份工作,所以,我为了减轻大家负担,把就业时可有可无的项放在了高级进阶,而把必会的编程能力放在了第三阶段:征服Linux。
高级进阶部分主要考察的点在于中间件的使用、监控与统计、测试、性能调优和云原生。
1、中间件
后端开发中你可能经常听说到「中间件」这个词,那什么是中间件?看下Wiki上的定义:
中间件(英语:Middleware),又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。 -- 维基百科
中间件能够为上层应用软件的开发提供便捷的、开箱即用的服务交互和计算的能力,缩短开发周期;屏蔽底层runtime的差异;节省应用本身的系统资源,减少运行成本。
中间件部分主要的学习内容有:
这里需要说明的是,同一个中间件,有多种技术选型,大家不必全部都会,根据当前自己公司在使用的中间件类型学习即可。
比如RPC框架这里就列出来了四个Tars、Dubbo、gRPC、Thrift,这四个都是RPC框架,都各有优劣势,大家只学习一款即可。
由于中间件内容众多,且每个中间件都会有对应的书籍,我们就不再一一推荐了
2、云原生
随着云时代的到来,大量公司的业务向云上迁移;
为了云上客户能够便捷的使用稳定高效的中间件能力,云厂商开始将自身沉淀的基础中间件能力云化,用于支撑各个云上客户和自身业务的快速生长。
比如阿里的一系列中间件产品,EDAS(用于帮助企业级客户轻松构建并托管分布式应用服务)、用于加密安全的对象存储 OSS、阿里云商用的专业消息中间件 [ONS]、阿里巴巴自主研发的分布式数据库产品 [DRDS]等
如果你们公司有上云服务,那云上面的各种中间件产品和部署、使用方法是需要了解的。
3、性能调优
当看到性能指标时,我相信“高并发”和“响应快”一定是你最先想到的。而它们也正对应着性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是从应用负载的角度来考察性能,并直接影响了产品终端用户的体验。性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。
性能调优,包括:
linux本身的调优方法:大家都知道Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。
MySQL调优:MYSQL 如此方便和稳定,以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的,比如,不要写过于消耗资源的 SQL 语句。但是除此之外,在整个系统上仍然有很多可以优化的地方。
GCC调优:代码优化可以说是一个非常复杂而又非常重要的问题,以笔者多年的linux c开发经验来说优化通常分为两个方面,一是人为优化,也就是基于编程经验采用更简易的数据结构函数等来降低编译器负担,二是采用系统自带的优化模式,也就是gcc - o系列
4、测试
做为服务端开发,为了保证代码的正确以及能够应对一定的流量压力,会一些测试技巧是必不可少的。常见的有压力测试、单元测试、全链路测试、A/B、灰度测试和蓝绿测试。
5、监控与统计
后台服务运行我们如何了解其运行状态和健康度?如果只是开发小玩具监控和统计大可不必,只需记录本地日志即可,对于成熟的大型后台服务系统,监控、统计、追踪必不可少,无监控,不运营
这里列出来了业界常用的几个监控和追踪管理的开源软件,大家可以根据需要自行选择学习其中一种。
第五阶段:架构师阶段
到了架构师阶段,就不再是简单的会用中间件和一些开源框架,而是要求有分布式架构、集群、源码分析的能力。
1、分布式架构
如何设计一套分布式系统?
说白了就是: 如何合理将一个系统拆分成多个子系统部署到不同机器上。
将系统拆分成多个子系统,这就意味着拆分后的系统必然需要通过网络进行互相通信联系。所以通信中的稳定和安全也显得尤为重要。随着业务慢慢的增长,扩展性、可靠性、数据一致性都需要进行考虑。
2、集群
分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。
而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
3、安全
本质上后台服务在网络上运行,需要和各种网络环境交互,在正常情况下能够工作,但互联网中有很多针对后台服务的恶意攻击,因此网络安全也是后台开发工程师需要学习的内容。
网络攻防并不只是公司网络安全工程师的责任,做为技术架构师,我们需要了解一些常见的网络攻击方法,当出现网络攻击时,不至于抓瞎。
4、源码分析
知其然,知其所以然
做为架构师,我们需要清楚地知道我们所用的Linux内核和各种框架的内部具体是怎么实现的,以至于在出现各种疑难杂症的时候,能够从根本上分析并解决问题。
好了,整个linux C++的学习路线和学习资料都推荐给大家了,正如我文中所说,技术的学习并不是线性的,有时候,我们会发现一本书中在学着A同时讲解着B的知识,而你会发现我居然没把B跟A列在一个等级。
这是因为我分割技术时,是以是否以找工作必备为前提进行划分的,对于找工作必备的知识点我尽量靠前,对于不那么必需的技能,一般往后放,以减少大家初入门时的学习压力。
总结了一个月,希望能帮到你,大家帮我点个赞吧。
另外,我把我这些年的所知所得,整理成了一本书,开源到github上了。相信会对大家很有帮助,大家可以去看.
目前还在持续更新,欢迎大家star。
地址:https://github.com/harvic/FightingCoder
好了,这篇就到这了,希望大家毕业都能找到好工作。
我是 @启舰 ,原创不易,帮我点个赞吧。
本人所有文章皆为原创,著作权归@启舰 所有,未经授权,转载必究
以上是关于耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)的主要内容,如果未能解决你的问题,请参考以下文章
耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)
耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)