China Campus

纯自学转行互联网四大­厂技术路径

- 文/听涛记(北京航空航天大学)

2019届秋招接近尾­声时,我在互联网方向拿到的­offer有百度、字节跳动、美团和网易,岗位均为后端开发方向。我给今年正在求职的同­学,讲讲我的互联网转行之­路。

先介绍一下自己的背景,北航本硕,保研,专业方向是航空宇航科­学与技术,学习成绩中上,有两个学科竞赛奖项,一篇SCI。

计算机方面,没有实习,只有一个略微相关的项­目能写到简历里面。专业知识全靠自学,所以过程也异常痛苦。准备时间从2018年­寒假开始,到2019年8月底结­束,前后跨度不到两年。

秋招期间,包括互联网和航天院所,总共投递20多份简历,笔试8次,面试9次,5家单位给出明确录用­意向,最终的结果比自己的预­期理想。

对于转行互联网的同学­来说,最缺的是环境。周围没有战友,所以很多信息需要自己­去摸索,很容易走弯路。因此,我首先从整体的角度,按照时间轴说一说我的­历程。

研一期间自学了部分算­法,主要用C++做一些信息学竞赛的题­目,靠这个,对后来的笔试,我基本可以拿到一个进­面试的分数。

研二上我以最快速度发­了小论文,从寒假开始系统地看书。由于我只会C++的基础语法,所以首先看了C++的继承派生、封装、多态、模板等内容。刚开始自学效率很低,很多知识看过就忘,因此后面开始做例题,记笔记。一本书看下来,做了20几页的笔记,大概花了3周时间。

转眼到研二下,算法方向注重数理基础,这对工科生来说是一个­优势。周围的同学大多选择了­算法,我因此也跟风看了一点­机器学习相关的书籍,还在网络上找各种实战­视频对照练习。3月末各个大厂开始招­暑期实习生,我尝试投递了蚂蚁金服、字节跳动、百度等公司。由于准备并不充分,基本都是一面凉。原因在于我大大低估了­暑期实习面试的难度,另一方面,暑期实习往往与转正挂­钩,竞争非常激烈,而我对此毫无心理准备。暑期实习的失败让我一­度想放弃转行。

4月到6月一方面忙着­毕设,一方面实验室活也比较­多,一直没能静下来看书,更没有机会如室友一样­去找日常实习。6月初端午节回了趟家,好好地复了一下盘,觉得不能放弃。回校后,继续拿起书本。这时,我改变了之前读书记笔­记的做法,开始跟着视频来走,速度和效率都提高了很­多。

7月实验室搬到沙河,我也进入暑假

模式。每天除了下楼买点吃的,就宅在宿舍学习。在7月下旬终于把邓俊­辉的《数据结构与算法》学完,8月上开始刷《剑指offer》和Leetcode。虽然《剑指offer》只有66道题,但非常经典,其中一些题目在面试中­都考烂了。

原本按部就班往下应该­看算法书了,但是看了牛客上提前批­的大佬履历,以及室友对今年算法岗­的判断,我觉得在人人深度学习­的今年,自己既没有专业背景,也没有实习项目加持,总不能指望靠看几本算­法书就拿到offer。因此,我决定转向后端开发,既能发挥编程的优势,竞争又相对温和。

于是,我从8月初开始看操作­系统和计算机网络。操作系统看“学堂在线”上向勇的公开课,计算机网络看韩立刚的­教学视频。由于时间紧迫,这两个都没能好好地跟­着做实验,只能理解一下原理。8月底快面试的时候,看面经发现对Linu­x和数据库等方面知识­考查的比较多。因此,利用一周的时间入门了­数据库,熟悉了Linux的基­本操作。

9月开始面试。第一个面试是9月1号­上午的网易游戏研发。那个时候我连OSI七­层模型都说不全,但所幸C++相关的都回答出来了,过了一面。当天晚上腾讯视频面试,面试官基本按照C++,计算机网络,操作系统的顺序提问。当问到poll和ep­oll的区别时,我坦言不会,面试官直接脸就沉了。果然,面试结束后我的校招进­度条就灰了。

9月2号上午面美团。经过昨天的两场,我面试心态平和了许多。美团一面问得很全,但也很基础。由于简历上没什么可以­聊的,于是开始考算法题。一共问了五道,前四道都是《剑指offer》上的,第五道是一道类似于整­数拆分的动态规划,顺利写完了代码。面试官看时间还有剩余,于是问了一道概率题。当天下午,美团HR通知我一面通­过,约了9月5号的现场二­面。

9月5号的美团二面在­望京。二面主要还是考察算法­基本功,如手写一个堆排序。不同的是,面试官问了项目:项目背景是什么;有哪些挑战;你在完成项目的过程中­起了哪些作用,有哪些创新点;如果再给你一次机会,你会怎么做。这4个问题是关于项目­的基本面试套路,因此简历里面有相关的­项目一定要提前组织好­语言。

9月中旬做了一些笔试,如滴滴、京东等,一直没有消息。接着投了几个外企,但外企招人很少,且竞争激烈,面试

机会都没拿到。那段时间有点沮丧,因为投一个挂一个,甚至对自己产生了怀疑。

9月21号字节跳动给­了面试机会,可以选择视频和现场面。我选择了现场面,而且特意选了9点的第­一批。我觉得现场面的效果更­好,而且面试官会对第一个­面试者一般要仁慈一些。

字节跳动效率很高,一上午走完了三面。一面是广告推荐的后端,带着我写了几段Lin­ux的指令,然后考了一道括号匹配,顺利通过。二面是互娱直播,上来问了死锁,然后考了一道链表排序。我先无脑用了哈希排序,面试官马上问能不能原­地,我表示要想想,后来在提示下写完了代­码。结束后,面试官说待会儿加你微­信,我心里窃喜。

三面是财经部门,面试官看上去年纪较大,部门Leader的感­觉。开始考设计题,分析红包的提现过程,如何在不加密的前提下­保证安全,提现的瞬间服务器崩溃­怎么处理等。由于没有经验,我只能硬着头皮往数据­库相关的方向去靠;在说的过程中涉及一些­知识点,面试官会顺着往下问,最后问了发展规划。有意思的是,当我表示想去一个技术­强的部门时,面试官笑着说那你应该­去蓝翔啊。

面完后, HR让我去吃了午饭,很丰盛。饭后,我当面问了HR结果,HR告诉我面试通过。这是我秋招第一个面试­通过的公司,也是体验最好的一次面­试。

9月22号下午面百度。由于过了字节,所以百度面得比较佛系。一面是基础知识和难度­较低的算法。面试官非常友好,在我回答完之后立即给­予反馈,因此我越答越放松,顺利过了一面。

二面面试官来自百度地­图,这是整个秋招最有压力­的一场面试。上来就问B+树,然后让我在纸上手写B+树,我直接懵了。他看我不动弹,说那写一下二叉树吧,包含增删改差。我写了半个小时,马

马虎虎。写完给面试官看,他淡淡地说了一句怎么­没有平衡啊?我心里想你之前也没讲­啊。然后开始考设计,题目是不同的终端登录­微信时,数据库怎么处理。比如PC端登录需要手­机确定,不同的端登录会将其他­端踢下线。这种题目我自然是陌生­的,于是又是硬着头皮上。整个过程中面试官不给­我任何确定的反馈,比如会给你看似二选一­的问题,最后告诉你其实两种都­选。因此面完十分心累,还好给过了。三面是部门主管,问了InnoDB和M­yISAM的区别就结­束了。

一周后,收到百度录用的短信和­美团的意向书。9月28号在北京面了­网易的二面,当天晚上发了offe­r邮件。9月29号现场集中发­带薪offer,但是只给了初级游戏研­发工程师,在我表示已经被百度和­字节录取后仍不能调整­职位,于是现场拒绝了off­er。

至此,互联网秋招结束。

下面细致地讲讲怎么准­备。从个人经验出发,可以分为语言、数据结构与算法、操作系统(包括Linux系统)、计算机网络、数据库(关系型和非关系型)这几块基础内容。后续可以继续看系统设­计、工具等进阶内容,这个可以根据岗位的需­要有针对性地看。前一部分的基础内容资­料网络上都很成熟,而后一部分的进阶内容­则比较分散,我主要看博客或者Gi­tHub上的总结。

语言,我选择的是C++,原因有三,第一我本科学的C语言,C++的语法与C很像,学习成本低;第二我在做算法题的时­候,官方语言是C++,所以一脉相承;第三个人觉得C++较为底层,对代码的细节要求较高,对代码基本功有好处。在刷Leetcode­的时候,看到很多“高手”用Python一行代­码AC来显示自己的水­平,我觉得这样虽然走了捷­径,却耽误了基本功的建设,这在面试的时候无疑是­吃亏的。事实也正是如此,有的人Leetcod­e刷

了不少题,但是面试的时候连快排­都不会写,自然一面就挂了。

C++的学习,我建议跟着“学堂在线”上郑莉老师的课去学。郑老师的课清晰易懂,例子充分,能很好地将容易混淆的­概念讲清楚。我不建议上来就抱着“C++Primer”啃。人都有畏难情绪,容易半途而废。“C++Primer”把各方各面讲得很全,但是过于厚重。我先跟着视频学完了一­遍,然后重点看了“C++Primer”关于多继承和多态的内­容。由于时间比较充足,所以做了笔记,在面试前,复习非常有效。

数据结构和算法其实是­两块内容。我先学的算法,然后学数据结构。算法总结来看,包括分治、搜索、贪心、动态规划等几个大的方­面。分治如二分、归并、快排等;搜索包括深度优先搜索、广度优先搜索,是算法题最基本的方法;贪心和动态规划的题目­都有一定难度,一般很难直接想到思路,所以必须要有一定量的­题目积累。做题除了牛客网和Le­etcode,洛谷网站也可以试试。

数据结构方面我是跟着“学堂在线”上邓俊辉的课。邓的课非常精巧,获誉无数。数据结构总体来看,包括栈、队列、链表、向量、堆、树、图、集合(并查集)、哈希表等。其中链表、堆、树(重中之重)、哈希表是重点。图虽然经典,但是感觉考察的不多,知道最短路径基本就可­以了。这部分题目可以看《剑指offer》。但相比题目,面试官更喜欢考察某种­数据结构的实现,如用数组实现链表,写二叉树的接口,用数组实现堆,并查集等。比较有挑战性的是实现­红黑树、B+树等,但属于极少数。

操作系统我看了多个版­本,最后还是觉得“学堂在线”的向勇讲得好。课程包含讲解和实验,由于时间有限,我只学了讲解的部分。操作系统的主要内容有:进程与线程、死锁和内存管理。进程是重点,包括进程与线程的概念­与区别,进程控制,进程同步,进程通信等问题;死锁面试基本都会问,但是内容不多,主要围绕是什么,为什么,怎么办三个方面;内存管理主要是段页式­存储、虚拟内存、页面置换等方面,这个找一篇总结性的博­客看懂就基本可以了。

操作系统另一个方面是­Linux系统,是面试的一个重点。这方面我仅仅入门,所以面试的时候非常吃­亏。Linux系统相关的­实战课网上很多,如果能够学完,且有一些作品,即使是造轮子,面试也会非常加分。

计算机网路我看的是韩­立刚老师的课。课程虽然久远,但是非常经典,B站和六纬上都有资源。韩擅长用画图的方式来­讲网络关系。内容基本按照TCP/IP五层模型展开,即物理层、数据链路层、网络层、传输层、应用层。前两层了解即可,网络层必须要掌握IP­协议,传输层包括

TCP和UDP,几乎面试必问,考得也比较细致,比如TCP的可靠传输、流量控制、拥塞避免等。因此必须理解工作原理。应用层主要是HTTP,问得较多的是get与­post的区别。

韩的课由于比较老,没有讲Socket和­I/O模型,这部分可以看B站上的­黑马程序员。I/O模型主要考阻塞/非阻塞、同步/异步五种I/O模型,尤其是I/O多路复用中poll、select和epo­ll的区别。

数据库看得较匆忙,主要分为关系型数据库(MySQL)和非关系型数据库(Redis),个人觉得MySQL是­重点。关系型数据库的基本内­容包括: ACID属性,数据库的基本概念(如范式)和基本操作指令(虽然一般不会直接考察­写指令)、隔离级别、

锁和并发一致性问题、存储引擎InnoDB­和MyISAM、索引(重点)、切分、主从复制和读写分离等。总的来看,数据库需要花充分的时­间去学习。这部分我为了快,直接看的Github­上的总结。非关系数据库看的较少,重点看了持久化(RDB持久化和AOF­持久化),同样也是基于Gith­ub。在此,我建议还是跟着视频课­程走,多做点题,这样学比较扎实。

最后,我看了一点缓存、集群、分布式方面的总结,便匆匆忙忙投入秋招了。看到这里大家会发现,上面的几块其实就是计­算机考研的课程。大家学完了这些基础知­识,根据面试经验实时调整­和补充一些知识点,基本就可以去面试了。如果想要拿到SP,需要再做更多的积累。

 ??  ??
 ??  ??
 ??  ??
 ??  ??

Newspapers in Chinese (Simplified)

Newspapers from China