声明:
1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。
文章目录
资源(^-^)V
资源因为网上很多,而且我的百度云也不是会员,GitHub也不能放大于25M的文件,就自己找一找吧。。。
〇、写在前面
- 关于深度学习和算法工程师的成长路线在这个博客中,【记录】一个深度学习算法工程师的成长之路(思考和方法以及计划);
- 关于后台学习和开发工程师的学习路线在这个博客中,【资源】C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔),即本文。
事实上19届秋招算法岗就有些【供过于求】了,头条甚至发了 算法劝退贴,而这很大程度上就是由于前几年算法就业形势太好了,导致一大批人转算法,这导致的大泡沫其实还没有消化掉,所以其实不是现在算法突然不好找工作了,而是之前太容易了。其实你说公司真的不缺算法工程师嘛?当然不是,公司也是有算法工程师的缺口的,那为什么出现这种情况?除了要劝退一部分盲目入行的同学;听到、遇到的好几个HR都说,收到几百份简历,但是没什么匹配的。所以说做算法的人多是真的,可是需要做算法的人也是真的,而主要的矛盾点在于 供需不匹配。
所以在这个大背景下,加上最近看到好多关于C/C++的学习路线,以及若干大佬的面经,此外也有很多同学询问算法或者数据结构相关的资源,就有了这么一个博客。因为我也在学习,没有办法给出具体的方案,不过下面提到的这些相关的都是必备的,也就是必须要学习的。这个文章应该会是一个【资源】性质的文章,关于 准备学什么,需要学什么,希望和各位共勉。
一、编程能力
在这个博客中谈到过,【记录】一个深度学习算法工程师的成长之路(思考和方法以及计划),这里面还是直接拿出来用了。
这真是个老生常谈的问题,为什么这么说呢,自然是因为这个【编程能力】我听过不下几百遍,听的脑瓜子都疼,可是没法子,这就是 必备技能,必备到什么程度?
这么说吧,假如你想写作文,如果你不会写字,组词,造句,我想你应该完全没法完成这个创作过程。很形象吧,但是也确实如此,仔细想一想,招你进去是要干活的,公司不会招聘一个只会 MATLAB 或者 python 都用不熟的人来做项目开发吧,做纯算法研究都不行。
- MATLAB 大家都懂的,做实验室研究确实很棒,高效方便的矩阵和数组运算,画图方面也相当不错,但是工业应用还没听过谁说是用 MATLAB 实现的呢。
- python 你可能想问为什么,可以这么说,如果连 python 这样比较简单的语言还用不熟,那真是无话可说。
- C++ 你更不必说了,因为这是一个开发工程师的主要工具,你的刀都没了还准备打架吗?嗯?
那么 具体地说,编程能力需要哪些基本要求呢?
(1)熟练使用 linux
新手肯定都是用 Windows 起手的了,像我之前就是这样,但是在学习过程中发现在 Windows 上搞不定了,一般也会先忍几次,然后掉头就去学 linux 了,一定是这样的过程。尤其是很多工业上的项目实现都是在 linux 下完成的,深度学习的很多算法也是在 Windows 上真的搞不定,所以 linux 真的是一个必备的工具。。。
但是在条件上可能很多人都觉得不是太合适,比如实验室条件,电脑条件等等,那也没有办法,只能搞起,下面是好久之前询问大佬给的意见,可供参考。
如果是剩下的完全是在使用的过程中现用现学,手边常备一本书 《鸟哥的linux私房菜》,神书,你可以百度或者Google一下自然就知道这个书的强大了。在或者现在的网络比较强大了,资源也是很多,实验楼 也是一个不错的选择,帮你搭配好的环境,直接使用就OK了。如果还是想自己搞一下,虚拟机也是一个不错的选择,不会影响你电脑本来的环境配置,但是还满足了要求。
个人建议:
- 《鸟哥的linux私房菜》
- 实验楼
linux 内核的推荐放在后面了。
(2)流畅使用 python
网络如此发达的今天,如果你说你找不到资源我是不相信的,但是如果你说你眼花缭乱了,我是毫不质疑的。因为我当时就就是这样的,基础部分看廖雪峰的 python教程 就可以了,我个人有看一些,但是真正入门的是一本书——《Python编程:从入门到实践》,极其的基础,但是对小白来说非常友好。
有的同学会问是学 python2 还是 python3?这么说吧,python 核心团队计划2020年停止支持 python2,也就是说 python2 马上就要说再见了,肯定还是学 python3,遇到之前的 python2 的代码再查找区别即可。python 学起来其实很简单,看别人代码的过程就是学习的过程。对于不熟悉的用法多搜下官方文档,如 python,numpy,pandas,matplot,scikit-learn 等等。
python 的开发环境值得说一下,因为有太多选择,这里比较建议使用 pycharm 和 jupyter notebook 吧,具体可以参考这个博客——Windows10 下 Anaconda和 PyCharm 的详细的安装教程(图文并茂)。
个人计划:
- 《Python编程:从入门到实践》
- 廖雪峰的 python教程
(3)熟练使用 C++
至于 C++,比较普遍的都是 《C++ primer》 或 《C++ primer plus》 这样的大块头书,我也写过这类的博客,不过还没有写完,因为写起来太累了。。。《C++ Primer》学习笔记/习题答案 总目录,这种特别厚的书有一个什么样的问题呢?
直接看图说话:
怕吗?知道什么叫做恐惧吗?就这?没错,真的厚,,,我服了,但是你还是得看,比如我现在就暂时停下了《C++ primer》的博客更新,去啃《C++ primer plus》了,原谅我的不厚道,对不住了兄弟们,我实在是觉得《C++ primer》的逻辑有点异于常人。。。《C++ primer plus》更适合我一点,最近正在写《C++ primer plus》的课后题:https://github.com/TeFuirnever/Cpp-Primer-Plus,有一起的小伙伴可以关注一下。
入门之后就需要看一下《Effective C++》这本书了,可以说是必须要看的书之一,不过有大佬跟我说看过《C++ Primer》之后就不用了看《Effective C++》这本书,因为基本都包含在内了。。。你可以试一试。
看完上面的书之后(大块头书优点在于全面,同时也往往导致了重点不突出),可以看一下 《王道程序员求职宝典》,这类书就是比较实用,推荐可以后期提高或者准备面试之前看。
如果想看视频课程的话,推荐中国慕课上浙江大学的 《程序设计入门——C语言 浙江大学》,《C语言程序设计进阶》,第一个课是非常基础的C,第二个课是进阶加上一些数据结构,目前还在更新中,不过看视频课程一般比较慢,但是如果没什么基础或者特别想把基础学好的话,强烈推荐。
个人计划:
- 《C++ primer》
- 《C++ primer plus》
- 《Effective C++:改善程序与设计的55个具体做法》
- 《more effective C++》
- 《程序设计入门——C语言 浙江大学》
- 《C语言程序设计进阶》
- 《王道程序员求职宝典》
(4)良好的算法与数据结构基础
开发能力如果想过关,算法效率必须要高,因为在实际生产中还是有要求的。因为工业界用的算法是滞后于学术界好几年的,所以不要对公司所做的算法有太多的幻想,现实用的算法也没有那么高端,大部分时间都不是用在建模,而是在开发,这也就是说你要好好准备算法与数据结构,这样你就立于不败之地了,无论是啥,都能游刃有余,懂不?
道听途说的,某师哥说过进入公司培训期间就是刷LeetCode!?!
个人计划:
- LeetCode
- 牛客网
- 《剑指offer》(准备校招刷一遍,校招过程再刷一遍,哪里不会刷哪里)
- 《算法图解》(python写的,算法的入门书籍,写的真的牛逼,通俗易懂,之前写过 笔记,其实就是偷偷抄了抄书,写了写个人看法)
- 《大话数据结构》(c语言写的,数据结构的入门书籍,写的真的牛逼,和《算法图解》一样,都是神书,作者自嗨写成了教案,你说牛逼不)
- 《算法导论中文第三版》(这是本神书。。。据说你要是能看完就是大佬了,如果能看懂部分就是大牛,如果能全部看懂那你一定是在吹牛逼,骗谁呢兄弟???)
- 网易云课堂-浙江大学《数据结构课程》(推荐,0基础学生的必备良药,基础视频,每节课的配套题目必须独立完成)
- 《程序员代码面试指南》(左程云,好书,配套左神的视频使用效果更佳)
(5)良好的编程习惯
这里说的习惯有:多使用类,多利用函数封装,写好项目的目录结构,良好的变量或者函数命名,善用程序的注释功能。这可以帮助你更好的和同事或者同行沟通,而且看着也舒服,就算好久不看程序了,依然可以做到很好的回溯记忆。
这个真的是一个很重要的但是被好多人忽略的习惯,希望咱们能跳过这个坑,让自己更具有影响力。
二、C++的其他重要书籍
《STL源码剖析》是一本 STL 方面的神书,介于 STL 的地位,虽然是一个很老的书了,很多内容都过时了,比如空间配置器,但是面试官还是会问。。。可以跟面试官讲讲 ptmalloc 的实现,故而整本书都是重点,有没有回到高中或者上学的时候那种感觉,老师说划重点了,整本书都是(微笑)。
《深度探索C++对象模型》基础书籍,虽然基本只会问虚函数的实现,看一篇博客也能应付面试,但是还是建议多看几遍。比如某大佬(当然不是我)表明自己STL和对象模型我都看了3遍以上,因为太容易忘了,所以还没开始的我和你赶紧的吧。
个人计划:
- 《STL源码剖析》
- 《深度探索C++对象模型》
三、g++, CMake和Makefile
关于部署在移动端嵌入式平台,需要使用 c / c++ / java 语言,g++,CMake 和 Makefile 正是 Linux 下编译 C系代码 的工具,也是必备的基础。实际上一些开源项目也需要预编译,更多的等到了工作岗位自然懂。
个人计划:
- g++
- CMake
- Makefile
四、shell,vim 和 git
Linux 下一个熟练的工程师,会比 Windows 下工作效率高很多,提高写代码效率可以从终端多任务管理,熟练使用 shell 命令,熟练使用 vim 等开发环境,熟练使用 git 命令等地方入手。
- shell 命令是 Linux 的操作基础,也是学习使用 Linux 的开始,而慢慢熟悉高级的 shell 命令在将来的工作中会带来很大的效率提升。
- vim 是 Linux 下最常用的编辑器,从小白到高手都可以使用,而它的列编辑,查找替换,自动补全等功能都是效率的保证,或许从 visual studio 等环境切换过来的同学刚开始会有些许不适应,但是时间久了就会越来越明白 vim 的好。
- git 是程序员必备的素养,慢慢学会维护几个自己的代码库,等到将来出问题的时候就明白了。
个人计划:
- shell
- vim
- git
五、操作系统
《深入理解计算机基础》(CSAPP),一本神书,极度推荐*****,号称比同等质量的金子更加之前的书,这个评价一点也不为过,是一个必读的书籍。
《现代操作系统》,建议在读完上一本书后再读,讲述操作系统的概念,可以配套网易云盘北大或者清华的操作系统课程视频,这样效率会高很多,不然自己摸路实在是。。。不想说了,就这样吧。
《UNIX环境高级编程》(APUE),同样是一本强烈推荐的书籍*****,尤其是如果想进鹅厂(腾讯),建议此书列为必读,如果能够理解这本书的内容,网络编程不会是你拿到offer的拦路石。
关于想去哪一个公司,可以留言区发表一下看法,我们探讨探讨,共同努力,话不多说,我想去字节。。。不过现在还只是在做梦中。。。
还有一个一个牛客推荐的——MIT6.828的这门课,要求自己设计出一个简易的操作系统,是一个极好的实践项目(7个lab),如果有机会就建议搞一下,因为这可以作为作为项目的东西。
个人计划:
- 《深入理解计算机基础》
- 《现代操作系统》
- 《UNIX环境高级编程》
- 《MIT6.828》
六、计算机网络
不知道你们本科学没学过计算机网络,如果学过的话应该会好一些,虽然学的比较水,但是聊胜于无。本人在本科学过的《计算机网络 自顶向下方法》,这本书虽然厚,虽然是翻译版本,但是真的不错。
《图解TCP/IP》,这本书非常的简单明了又很薄,只要花上三天时间就能大概读完。多读读这本书还是挺有好处的,基础数据,又有图,可以说是很友好了。
《TCP/IP详解》卷一,一本进阶书籍,属于必读的书籍之一,其中的12-16章是重点,TCP、IP、UDP等等。
其它部分看书太麻烦了,直接从博客里看了。
个人计划:
- 《计算机网络 自顶向下方法》
- 《图解TCP/IP》
- 《TCP/IP详解》卷一
- 博客。。。
七、数据库
很多面试官都会问一下,你是不是学过数据库,如果没有的话,大概就不会问了,不是什么特别影响的事。
《数据库概论》基础书籍,快速读过一遍就可以了,重在了解概念与基础,相当于是个入门级别的。
《Mysql必知必会》基础书籍,快速了解mysql的好书,强烈推荐,Mysql(关系型数据库管理系统)是一个很重要的数据库知识,是 SQL 语言是用于访问数据库的最常用标准化语言。
《高性能mysql》,这个书只要读前面索引和性能的部分即可,除非你有很多时间去准备,这样就随便了,我是不行了。。。
如果问了数据库的话,也不会太多,校招时间有限,所以建议基础先打好,后续再学习更深入的部分。
个人计划:
- 《数据库概论》
- 《Mysql必知必会》
- 《高性能mysql》
- 牛客网
八、Linux提高
Linux 环境编程 apue 和 unp 两本是必须的,但是因为太厚了,看起来还是有点痛苦的,还好是不需要全看的,而且内容重叠很多。大佬推荐:unp 卷1前面8章是重点,卷2前面4部分都挺重要的;apue 全部,先是要有个概念,自己写代码的时候就知道哪块重要了。
《深入理解linux内核》,这本书是挺有名,不过很多人都是完全啃不动,一个大佬推荐《linux内核设计与实现》,外加一大堆博客,除此之外,《深入理解计算机系统》讲的东西比较简单,可以作为一个补充。
《Linux多线程服务器端编程》,陈硕的书,讲 muduo 网络库的,如果你能看好多遍的,收获肯定是非常多的。另外前面部分是后台开发的一些经验之谈,对面试也很有用。还有好多项目都是基于 muduo 实现的,基本上是必读书籍了。
《Redis设计与实现》也是一本看完之后感觉特别好的书,很值得学习,可以很快就看完。有很多重要的数据结构可以在面试的时候讲出来,比如跳表、redis 的 hash 表等等。
《深入理解Nginx》也是极其经典的一本书,因为 nginx 太经典了,很多面试官也都提到过,所以可以看一下。
一个大佬还推荐了,短小精悍的源码——leveldb,对照博客就可以把 leveldb 源码看完,并不需要多长时间,在此基础上还可以了解一下 rocksdb。
《Linux内核完全剖析——基于0.12内核》,这个书好像之前CSDN上有人下载过,具体的忘了。
个人计划:
- 《apue》
- 《unp》
- 《深入理解linux内核》
- 《Linux多线程服务器端编程》
- 《Redis设计与实现》
- 《深入理解Nginx》
- 《leveldb》
- 《rocksdb》
- 《Linux内核完全剖析——基于0.12内核》
九、后台开发
《后台开发:核心技术与应用实践》是腾讯的员工写的,虽然这本书评价比较差,几乎都是抄的博客,但是内容上总结的很好,可以认为就是给咱们校招的同学写的(原来抄博客就能写书,那我岂不是也能写书了),都是后台开发需要的基础知识的总结,这本书中内容所代表的知识,基本都是腾讯的C++后台开发工程师所必备的基础,可以作为一个复习提纲。
十、总结
这就是一个拉锯战,谁能站到最后,谁就通吃,就是这么简单又残酷的道理,建议多看看面经,就知道自己有多菜了。。。共勉。
留言区有话就留言,可以一起加油,一起努力,已经无路可退,唯有逆风飞翔。