【起风了,唯有努力生存】一个本硕非科班码农的后台开发之路

1. 秋招情况

先说明一下个人基本情况,本硕东南自动化,实验室主要是做一些图像处理相关的项目,后面发现自己对算法并没有太大的热情,于是转向了C++后台开发,在秋招过程中,投递了大概10+家公司(基本都在7月份完成投递),最终拿到了以下offer,大部分是sp或者ssp:
  • 腾讯PCG分布式存储
  • 百度Feed推荐技术架构部
  • 阿里云计算平台事业部
  • 字节跳动视频架构
  • 拼多多服务端研发
  • 远景智能后端开发
  • 商汤科技后端开发
  • 华为顶尖人才计划(***软件院)
  • 美团到店平台技术部
  • 网易互娱游戏研发

2. 如何选择

在开始介绍学习路线之前,想先和大家分享一下我的几个观点,读研还是工作,算法还是开发,C++还是Java,国企还是互联网,除了第一个问题外,都曾经困扰过我,当然我相信很多人也会遇到类似的迷茫,所以在这里分享一些我的想法,希望能给有需要的人提供一些参考,自己已经想的很明确的可以直接跳过~

(1)读研还是工作

这个问题是牛客上经常被讨论的一个问题,已经拿了某大厂的offer是否还有必要读研,这个问题我的看法是这样:如果自己很明确就是想进互联网做开发,并且读研的学校比较一般,那我建议选择就业,能力强的人在三年内就能有很好的技术积累,这些是在研究生期间很难得到的锤炼;相反,学校本身还可以,自己也没有明确以后就是互联网做研发,有可能考虑国企或者研究所,或者从事偏研究性的算法工作,建议读研,因为国企和研究所学历卡的比较严,读研意味着以后有更多的选择。对于我个人而言,本科阶段基本没有计算机相关的就业能力,所以读研让我有了更多的时间去思考自己的规划,并且在自律上有了很大的提高,这些都算是我在读研过程中的收获。

(2)算法还是开发

这几年算法由于起薪较高,偏研究性质的工作吸引了大量的人才涌入,也就造成了现在激烈的竞争情况,不过这都是符合市场规律的正常现象,毕竟风口在哪,热钱就在哪,总会吸引一大批优秀的人才涌入。对于这个问题,我的看法是个人兴趣结合个人特长,算法算是一个投入反馈比较慢的工作,也就是可能投入了大量的精力也会得不到实时有效的反馈,而开发则基本能够得到实时的反馈,于是我这种本身不是很能耐得住性子的人,对于算法就有些难以接受了(个人有过一段1个多月的算法实习);同时,算法要求一定的数学能力,我很清楚自己更擅长一些逻辑性的问题,而不喜欢数学推理论证性的问题,这也会影响以后的上限。最后就是实验室有一位坚定走在算法道路上的大佬,@daili0015 (实力卖队友,大家找算法工作的可以看他的秋招总结贴啦),大佬读完论文后经常脑子里冒出一些骚操作,看的我是目瞪口呆,发现自己是真的不适合算法。

(3)C++还是Java

刚开始转开发的时候,纠结过一段时间Java还是C++,有一位师兄劝我转向Java,毕竟机会多,而我纠结了一段时间后最终选择了C++,理由是:为什么大家都选Java我就要选Java呢,这可能也是性格偶尔有些叛逆的原因吧。好了,回到主题上来,C++应用场景确实不如Java广泛,但是也是有自己的立足之地的,这里可以参考@TeeKee 大佬的帖子(https://www.nowcoder.com/discuss/156212),C++因为更偏底层一些,可能上手上难度会略大,说回来其实还是个方向选择上的问题,Java大多是业务侧,数据库以及各种组件就会很重要,而C++偏底层一些,操作系统以及Linux相关的知识更为重要一些,具体选择,因人而异,给个说服自己的理由就好。其实在校招过程中,更加关注的还是基础知识的把握能力,还有项目过程中体现出来的问题解决能力,快速上手能力,个人的思考,这些都是在美团、远景(这两个offer的部门都是Java系)包括春招实习投递的蚂蚁Java岗中注重考查的点。

(4)国企还是互联网

这真的是一个围城,城外的人想进去,城里的人想出来。看过一些国企待不下去跳互联网去的人,身边也有不少朋友(复旦、南京大学等本科生)进入国企后,觉得工作上没有动力,升职加薪遥遥无期,我觉得自己是那个最了解自己的人,所以一定要想清楚自己想要什么,然后做出自己的选择。

3. 调整心态

我的秋招之路,始于牛客,也在此终于牛客。在牛客上找到了学习路线,学习资源,也明白了自信与坚持的重要性,在这里放一段(@_XiaoTeng_  )大佬在面经中的一段话:

offer = 心态 * (实力 + 面试技巧) + 缘分运气

1、心态
  • 首先是要正视自己的能力,不轻视,不高估
不轻视:对自己有信心,机会那么多,怎么都能有个差不多的offer,不至于失业
不高估:清楚自己的能力范围,保持好心态,面试是有偶然性的
  • 不要总给自己消极的暗示,心态差了积极调整,一个乐观向上的态度是非常重要的
提高效率,专注寻找自己的方向
  • 多交流,不比较
对于每一次面试,只跟自己比有提高就已经很好了
每个人适合的方向和技术栈都不一样

2、硬实力是关键
顿悟的前提一定是大量知识的积累

我是从2018年3月底开始准备校招,因为是在18年春招实习的时候获得了两次面试机会,分别是网易游戏和去哪儿,下面给大家还原一下真实面试场景,其实我也是和各位非科班的同学一样,基本是零基础开始准备秋招,但希望大家相信只要努力,永远不晚
2018.03.27  ——  网易游戏研发工程师实习面试(下面以Q代表面试官,A代表我)
Q:C里面内联有什么作用
A:不知道...
Q:struct和class有什么区别,和union有什么区别
A:不知道...
Q:虚函数有什么作用
A:不知道...
Q:智能指针听说过吗
A:没听说过...内心os(啥,这玩意是啥..)
......
就是在这种情况下,面试官还拿着准备好的题目一直面了我40分钟,面试体验很棒,QAQ

2018.04.某天   ——  去哪儿后台开发实习面试
Q:知道二叉树的各种遍历顺序吗?
A:知道,前序中序后序,分别说了下怎么遍历的
Q:好,那你手写一下中序遍历...
A:拿笔挣扎了好久...一个字没写
Q:要不你再好好想想,你都知道遍历顺序了,应该可以写出来的
A:我真不会写..
Q:那今天就到这吧...
总结:相信很多同学在开始的基础都比我好,所以一定要有自信,然后坚持学习,秋招肯定是收获满满(不仅仅是offer上的收获,还有很多关于自主学习能力、个人自律以及自信上的收获)。

4. 学习路线

毕竟以前没刷过题,没看过书...写的大部分都是C#代码,于是决定开始着手秋招,从语言开始系统学习,关于学习的几个建议(个人觉得算法开发通用,且可能比学习路线更实用!!!):
1、一定要做笔记!!!好记性不如烂键盘,知识温故而知新,每次回顾总结再原来基础上再引申一些新学到的知识,如果能达到这样的效果,就相当于自己在给自己面试!做到面试效果好,还不会紧张
2、笔记可以选择很多可在线编辑的软件,个人在用的是Evernote,可能已经积累了数十万字的笔记
3、可以先在网上看看相关的面经,记录常见的考点,在读书过程中及时总结自己的答案,这样既高效,面试时的答案又有自己的理解,绝对加分项!
4、talk is cheap,show me the code. 无论是算法还是开发,只要你是计算机编码相关从业人员,能刷题都是很重要的,这里面不仅可以反映你写代码的速度和质量、思维的灵活性、对常用算法的掌握与迁移以及将抽象的问题具体化的能力,一定要刷题

下面是各方面知识体系的学习资料和路线,大部分是书籍,少部分是我推荐的一些公开课或者b站视频

C++:

  • C++Primer  基础书籍,初学者建议精读,可重点关注一些C++11的新特性,比如智能指针、移动构造等在面试中常考的特性
  • 深度探索C++面向对象模型,这是一本建立起C++面向对象模型观的好书,个人收益良多,另附一份此书总结的技术博客,写的很好,读完本书再读一遍博客,绝对收获满满,以至于我后面复习C++面向对象观,直接对着博客看了:http删掉我://www.roading.org/develop删掉我/cpp/%E3%80%8A%E6%B7%B1%E5%BA%A6%E6%8E%A2%E7%B4%A2c%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B%E3%80%8B%E7%AC%94%E8%AE%B0%E6%B1%87%E6%80%BB.html  (重点推荐)
  • STL源码分析,主要看各种STL容器的底层实现方式、内存管理方式,看完自然会对这些容器内部对象到底分配在堆上还是栈上,迭代器失效情况,内存是连续还是非连续等各种问题都有一个很好的掌握
  • Effective C++和More  Effective C++,需要对C++有一定了解和使用经验后阅读,里面主要是介绍各种安全管理、效率提升的小细节,可以参考阅读,有些小细节可以在手写代码时体现,给面试官很好的印象!

操作系统

  • 清华大学  陈渝老师的公开课(b站和网易云课堂上都有),非常系统的讲述操作系统的一些实现原理,也把包括生产者消费者、读者写者、哲学家就餐等经典问题讲得非常透彻,作为清华的公开课,又不失知识的广度和深度,推荐
  • 深入理解计算机系统(CSAPP),这本书真的是讲解整个计算机系统的一部神书,短短的篇幅内能涵盖到这么多的技术点(看完公开课后再来读效果应该会更好),我翻来覆去读了三四遍,每次读都有新的收获,极力推荐
  • 现代操作系统,详细讲述操作系统的基本概念,其实我并没有读过,因为没有找到这本书的电子资源...但是很多人推荐,应该也是一本好书!
  • Unix环境高级编程(APUE),详细讲述Unix环境下的各种编程机制和接口,建议书上的代码都自己敲一遍执行,才能有更好的理解,配套技术博客: https删掉我://blog.csdn.net/q1007729991?t=1,上面有APUE和UNP的实验教学,作者Allen是一个百度大佬,不光技术好,还能讲的通俗易懂!但是一定不要只看博客,建议博客和书籍配合阅读,代码一定要自己手敲!!!(尤其是以腾讯为目标的同学们,此书必读)

计算机网络

  • 图解TCP/IP,图解系列的书籍都是比较浅显易懂,但是作为入门或者第一本相关书籍,可以看到全貌却有不打击大家的学习积极性,可以快速阅读
  • 图解HTTP,建议同上,但是我其实对HTTP了解并不多,因为实际上C++开发很少与http打交道,基本是C++与Java通信,Java再与前端通信,但是还是应该扩充自己的知识面
  • 计算机网络,这本书是本科上课时我们选用的教材,对于计算机网络有一个比较深入的讲解,包括网络协议中的各种设计细节以及相关算法的原理,值得阅读
  • UNIX网络编程(UNP),同前面操作系统一样,可以配合Allen大佬的技术博客,学习一些底层的网络编程知识,尤其是打算准备网络相关的项目时,建议细读本书
  • TCP/IP详解,非常详细讲述了TCP/IP协议栈下的各个技术细节,建议大家挑自己感兴趣的阅读,都是拔高点,体现个人技术深度的点

数据结构:

  • 大话数据结构,入门书籍,把每个抽象数据类型(ADT)的实现方式都讲得比较透彻,也涉及了相关的算法,可以仔细阅读,后面面试可能也会涉及一些让你在某个应用场景下的适用数据结构,应该详细掌握
  • 清华大学 邓俊辉老师的公开课,详细细致讲述了数据结构与算法相关的内容,因为算法和数据结构密不可分,在讲述基本的数据结构与算法同时,包含一些时间复杂度的推导,课程又有一定的深度,老师讲课也非常有趣!值得深入学习
  • 网易云浙江大学 数据结构公开课  ,课程感觉不如邓俊辉老师的有趣,但是优点是有配套的学习平台和练习题,配合课程刷题,效果更佳!

算法(这块其实是我的薄弱点,我大概只刷了200道题+剑指offer):

  • leetcode2016,这本书是在北美找工作的国内同学总结的,将leetcode上的一些经典题目按照各种方法总结在一起的,大约有200题,建议按照专题开始刷!这本电子书我会在后面给出百度网盘的链接,大家可以自己下载
  • 剑指Offer,不多说了,哪里不会刷哪里
  • 算法图解,一本适合刚开始接触算法的初学者,用通俗易懂的语言说明了一些常用的算法
  • 程序员代码面试指南,左神神书,适合算法进阶,题的数量和质量都有保障
  • BAT版算法讲解经典版,b站视频——https://www.bilibili.com/video/av36288901?from=search&seid=14784848492074489353,可以根据个人喜好,选择先看讲解视频掌握基本的算法以后,再开始刷题,也可以刷了一部分题以后,再回过来用这些算法题来检验自己的算法水平

数据库:

  • Mysql必知必会,介绍了sql查询相关的用法,读完之后可以配合牛客上的SQL查询相关练习进行熟悉
  • 高性能Mysql
  • MySQL技术内幕  InnoDB存储引擎
  • Redis设计与实现,前面几本书都是sql相关的知识储备,而详细了解一款nosql也是很有必要的,因为各自有不同的应用场景,面试中也常考一些Redis相关知识
  • Mysql基础+高级, https://www.bilibili.com/video/av49181542?from=search&seid=6259727214006633832,Mysql技术内幕和高性能Mysql侧重于数据库本身的底层实现,而这套视频则是从实用的角度出发,讲解了数据的查询到优化等方面的知识,配合使用效果更佳

设计模式:

  • 大话设计模式,描述了二十多种设计模式的使用场景,设计模式只有了解了概念以后,在实际项目中去加深理解,单例模式、工厂模式、***模式、中介者模式等都是在实际项目中常用的设计模式

Linux与编译原理:

  • 鸟哥的Linux家常菜,基本就是讲一些Linux下的命令操作,C++必然是跟Linux结合在一起的,所以如果对Linux不够熟悉,可以粗读一遍,熟悉相关的命令
  • Linux内核完全注释,采用早期Linux内核0.11或0.12版本的代码进行完全注释讲解,作者是同济的一名老师,阅读本书需要有一定的汇编基础、硬件基础和操作系统基础,适合对Linux内核机制比较感兴趣,想了解底层源码的同学
  • 程序员的自我修养——链接、装载与库,校招面试过程中发现,只要面试一深入,就经常会讨论到编译和链接过程中的一些问题,虽然对开发并没有太大的作用,但是掌握过程中发生的情况,可以帮助分析和解决一些问题

面试相关

(下面这两本书中都有很多常见的面试题,可以细读当做个人知识的一个查漏补缺,也需要关注一些常见的智力题,比如头条有时候就会问一些相关的智力题):
  • 程序员面试笔试宝典
  • 王道程序员面试宝典

5. 项目面试问题

在具体的面试中,一些技术问题可能因为公司或者面试官的不同而不太一样,但是经过大大小小几十场面试发现,关于项目上,有几个问题经常被提及,能够看出一个人的项目深度以及是否在项目过程中有自己独立的思考:
(1)项目中的难点以及解决方法  
建议项目做完一定要及时总结,回顾过程中踩过的坑,走过的弯路,回答这个问题时,可以给出一些参考的解决方式,最后结合实际需求,给出自己的方案。
(2)与现有的一些类似产品,有什么优势?或者说为什么在你们的使用场景下,要用这种方案
因为主要的项目经历是推荐场景下的分布式KV存储,所以经常被问到与Redis相比的优势在哪,为什么不用这些现有的KV存储方式。在做项目过程中,就要培养自己的好奇心,多问自己Why,而不是一味的只是How。
(3)如果再给你一次重新做的机会,你觉得哪些方面会有改进和提高?
做完项目以后,一定要去复盘,想想这里面可能存在的问题,或者说哪些方面可以被改进
总结:以上几个问题都是在各大厂面试中经常提及的问题,希望各位做项目时,一定要保持充分的好奇心,对自己的方案有绝对的把控力,然后及时总结和复盘。

6. 写在最后

上面大概就是我个人的一个学习路线,基本是书籍+公开课+网课为主要学习路线,当然对于硕士来说,准备秋招的过程中肯定免不了会穿插有实验室的一些工作,这就得看个人的时间规划和安排了,另外效率是很关键的一点,如果遇到了心浮气躁学不下去的情况,建议找个适合自己的方式去放松一下,保持好自己的学习效率。接下来想说一些秋招过程中的一些奇葩经历:
字节跳动的十一轮面试经历,是的你没有看错,我从春招到秋招一共面了十一轮字节跳动!!!
1、3月初,本来打算投春招实习的我简历莫名流到了一个日常实习中,想着面就面面吧,然后上来一面面试官说你是C++的啊,我不会C++啊,然后说你在××实习过呀,我以前在那边工作过几年,但是我图像相关的知识我也忘了,没法面啊,要不就算了吧...(一轮凉凉)
2、4月,春招实习统一面试,面了三轮,只记得第三轮面试时撕的代码是两个链表的大数相加问题,大概涉及到链表的逆置和进行10进制的加法运算....代码量比较大,写得比较久,然后三面完就收到感谢信了(三轮凉凉)
3、6月底,投递字节跳动的超级工程师计划,简历没有通过,然后又流到一个实习生的招聘中,跟HR商量可以按照校招提前批的要求进行面试,深圳头条信息流部门,然后因为实习2个月没有刷题,二面题目没写好,并且问了很多智力题和工程设计题(都是常见问题,在程序员面试笔试宝典和王道程序员面试宝典基本都有覆盖到,所以建议大家面试前细读两本面试书籍查漏补缺),可惜我以前没有接触过,临时想太慢了(二面凉凉,HR小姐姐还给我看了面试评价,基础还可以,可以实习提升工程能力后再来面...)我是真的题刷的少...
4、7月中,投递字节提前批,EE部门toB端,面试中问了很多http相关和web服务器相关的知识,平时了解的较少(一面凉凉)
5、8月中,字节正式批,投递的是上海的基础架构部门,全程聊rpc框架的设计细节...很多没答上来,我真的很恍惚以为面的是社招...因为我本身实习做的是分布式存储,并不是rpc框架开发,一面完让我等一下,结果20分钟后收到凉凉短信,可能是跟主管商量后觉得欠缺相关开发经验给挂了(一面凉凉,I'm fine...)
6、本来以为秋招就此与字节无缘,结果视频架构部门又把我给捞了...这次一口气三面,其中聊了很多网络相关的知识,都是在一些相关知识的基础上,问一些场景设计的问题,比如说让你去设计TCP传输中的超时重传,你该怎么去设计这种...好在我对计算机网络有一定的理解,顺利通过了这次面试,第二天HR就联系发了意向书(3面过)
所以我一共面了1+3+2+1+1+3=11轮....我已经可以想象字节内部我的面试评价可能已经占满了一页,哈哈哈哈....
由于我个人没有记面经的习惯,但是每次遇到一些不太明白的知识点,都会记录到笔记中,面试总结也转成了PDF,放在了我提供了百度网盘中,当然由于个人水平有限,其中肯定会有些错误的地方,还希望各位在学习过程中保持你的好奇心和质疑的能力!

现在由于经济下行、大量人才的涌入,互联网就业确实存在着竞争越来越激烈的问题,但是在秋招求职道路上,只要你能拥有一份清晰且目标明确的学习计划+良好的学习习惯+高效的学习效率+适当的学习记录和思考,都能拿到想要的offer,希望诸君都能享受自己选择的生活~
最后用一句宫崎骏的台词与各位共勉——起风了,唯有努力生存。
接下来,要准备毕设,希望顺利毕业啦!


下面学习路上参考的各位大佬的学习资源与学习路线资料链接:
https删掉我://pan.baidu.com删掉我/s/1yAW5tsVuIp9Jd7N删掉我r2f2DbA   (提取码:8h9v,个人上传的一些电子书籍以及个人的常见面试题总结)
#腾讯##百度##阿里巴巴##字节跳动##校招##C++工程师##面经#
全部评论
之前的链接由于有一些电子书籍,被百度网盘禁掉了,所以把电子书籍删除后,重新放了链接 面经资料链接: https://pan.baidu.com/s/1Wk1rB7nT3r_J4kQdL4IWIw 提取码: 1dtm
4 回复 分享
发布于 2020-04-12 07:44
支持一下大佬
1 回复 分享
发布于 2019-10-29 11:31
大佬年初0基础,短短时间学这么快的吗
1 回复 分享
发布于 2019-10-29 19:28
放实习是因为,大四进入实验室开始干活,导师本身还可以沟通,而且恰好碰到导师在研二一年期间在美国进修访学,这点结合个人实际情况吧。平时怎么计划学习,可能就是有计划按照章节去学吧,其中学一些书的时候,会发现很多不懂的东西,就很好奇,再去阅读相关书籍 查阅资料,一点一点积累,然后记得注重效率
1 回复 分享
发布于 2019-11-06 12:27
作为一个已工作一年半的人,很佩服楼主的系统性与务实性😊
1 回复 分享
发布于 2019-12-17 22:32
大佬,我也打算从算法转C++开发,已经照着你的路子学了一段时间了。 我有个问题,想咨询一下你:你当时找实习有什么开发相关经历吗?  我现在只有几个kaggle竞赛的牌子,很焦虑啊。
1 回复 分享
发布于 2019-12-18 16:20
同图像处理转开发c++,楼主太强了看了那么多书,我明年秋招(还有6个月),现在除了数据结构比较熟,其它基础(计算机网络,操作系统等)都比较差,按楼主的路线,我应该看不完了,想请教下楼主哪些部分的内容比较核心,需要侧重一些呢,或者楼主对于我这样的情况有什么建议吗?感谢😊
1 回复 分享
发布于 2019-12-22 00:45
楼主秋招是准备了1年多嘛?我看到18年3月就开始准备,你是19年才秋招的吗?
1 回复 分享
发布于 2020-05-25 13:48
大佬回复真的好有耐心,想问下这么多厚书大佬用什么方式看的,电子版还是纸质版感觉好呢
1 回复 分享
发布于 2020-06-02 01:43
大佬,我现在研一,是南京某高校本硕,也是非科班转c++后台开发。准备开始时间和你相似,目前坚持学习了五个月了。今天看了你的博客又感觉信心满满,加油学!点赞!
1 回复 分享
发布于 2020-06-20 08:16
我照着书单学一遍,就能拿60w的offer吗
点赞 回复 分享
发布于 2019-10-29 11:01
可恶,我竟然没抢到沙发
点赞 回复 分享
发布于 2019-10-29 11:07
膜拜大佬,看完您的面经,收获颇多,谢谢大佬的分享
点赞 回复 分享
发布于 2019-10-29 11:11
聪神牛逼!
点赞 回复 分享
发布于 2019-10-29 11:34
慕名而来!
点赞 回复 分享
发布于 2019-10-29 11:59
拿了这么多,选起来也纠结,老哥打算去哪呢
点赞 回复 分享
发布于 2019-10-29 21:20
今晚开始就学习
点赞 回复 分享
发布于 2019-10-29 21:22
这也太强了
点赞 回复 分享
发布于 2019-10-29 21:25
楼主是三年硕士吗,现在开始准备毕设😂
点赞 回复 分享
发布于 2019-10-30 03:15
太强了
点赞 回复 分享
发布于 2019-10-30 10:06

相关推荐

YZBPXX:国科的佬都挂了 让我们这些四非怎么活呀
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
10-31 13:03
已编辑
重庆邮电大学 C++
hxd们,这是进池子的意思吗?
喜欢走神的孤勇者练习时长两年半:凯子今年舍得搞个网页查询了?我的评价是快跑
点赞 评论 收藏
分享
228 1592 评论
分享
牛客网
牛客企业服务