当前位置 博文首页 > 程序员乔木的博客:干货!这是一份适合科班/非科班的技术学习路

    程序员乔木的博客:干货!这是一份适合科班/非科班的技术学习路

    作者:[db:作者] 时间:2021-07-31 09:05

    第一篇文章分享了我的校招求职经历,还没看过的小伙伴可以看这里:

    从长安大学到腾讯,一个卑微本科生的坎坷求职路

    这篇文章就来点干货,给大家说说我都学了哪些知识,如何顺利通过校招,拿到腾讯,美团等大厂offer。

    更多干货文章都在我的公众号:星尘coding 中首发,欢迎关注!

    时间节点

    开始之前,先介绍一下校招的时间节点。

    校园招聘分为春季招聘(3 4月份)和秋季招聘(9 10月份)。

    现在互联网公司的春招和秋招都有提前的趋势,春招一般过完年就开始,秋招提前批7月份就开始,9月份就接近尾声了。

    如果直接找正式工作,那么就是参加大四上学期的秋招和大四下学期的春招。

    如果你希望自己在校招中更有优势,大三下学期的春招就可以去找暑期实习。有的大佬大二就能去大厂实习,到正式应聘的时候都好几段实习经历了,实在是比不过。

    这里给大家的建议就是简历一定要早投,刚开始的时候公司名额最多,机会最大。不要感觉自己没有准备好,朋友,永远都没有准备的十全十美的时候,等你准备好了,公司都倒闭了。

    抓住提前批的机会。提前批会发出大部分的offer,而且很多公司提前批会免笔试,这个真的很有用,后面会专门说。

    而且很多公司提前批挂了不影响后面正式批投递,这就跟打游戏复活似的,复活甲白给都不要是不是脑子有坑。

    像腾讯这种可以无限捞人的,一个部门挂了还可能有其他部门的捞起来再面,跟我一起实习合租的舍友被腾讯不同的部门捞起来三回,这通过的概率马上翻倍呀。

    编程语言

    既然是要做技术,要写代码,那么编程语言最少得会一个吧。

    这时候很多人就纠结了,C,C++,Java,Python…我到底选哪个嘞?

    首先应该明确一点,语言只是工具,将来是可以根据工作需要随时切换的,深入学习了任何一门成熟的语言,再上手其他语言就非常快了。

    C/C++

    科班的同学很多都会学C/C++,从深入理解计算机的底层原理来上来说,C/C++无疑是第一选择,但也意味着学习难度会比较高。

    对于刚入门的同学来说,什么指针,内存管理真的让人头秃,我当时真的被C++吓到了,但是C/C++的地位真的无可取代,比如Windows和Linux就是基于C,C++来实现的。

    C/C++主要是用于对性能要求非常高的底层架构,高性能中间件,嵌入式等方向的编程。腾讯之前的后台开发是用C++,现在开始逐渐转Go了。

    如何你准备学习这两门语言的话,这里给推荐几本书吧。

    C:《C Primer Plus》和《C和指针》

    C++:《C++ Primer Plus》和《STL源码剖析》

    Java

    Java语言相对简单一些,函数库更丰富,没有指针,内存管理也交给了虚拟机,大大降低了学习门槛。

    另外一个优势就是Java本身的生态更完善,使用的公司比较多,自然工作岗位也比较多。主要是两个方向:后端开发方向和Android开发方向。

    不过现在学习Java的人也越来越多,竞争十分激烈,一堆研究生过来竞争开发岗很多都是Java技术栈。

    因为我主要学的就是Java,所以这里给大家推荐几本书来入门和进阶:

    《Java核心技术》:这本书讲的比较通俗易懂且经典,比较适合入门,只看卷一就可以了,卷二的流和网络编程感兴趣就看看,swing图形化编程部分不用看,没人用了。

    《Java并发编程的艺术》:并发编程是面试中考察的重点和难点,面试中常考的问题这本书基本都有涉及,每一块都是重点,值得多次阅读。

    也有人推荐先看《Java并发编程实践》,再看这本书,如果你觉得艺术这本书比较难理解,就先看看实践这本书。

    《深入理解JVM虚拟机(第三版)》:刚才说Java中内存管理之类的东西都交给了虚拟机,那么虚拟机到底是如何管理内存的,垃圾回收的机制是啥样的,怎么也得了解一下吧。

    这本书就是学习JVM必看的经典之作。因为大家都看这本书,所以最好自己整理一份笔记出来,将相同的知识讲的不一样,面试中更容易出彩。

    当然虚拟机相关的东西适合有些编程基础后再看,要不然很容易云里雾里,不知所云。

    最后还有两本更经典的书是要推荐一波的,不过校招就没必要啃了,收藏以后慢慢看吧。

    《Java编程思想》:这本书好像每个Java学习路线都会推荐,非常经典,也特别难啃,不适合入门,太劝退了。平时可以当个工具书,想深入理解哪一块就看看。

    《Effective Java》:这本书可以说是神书了,第三版中给出了90条经验法则,让你写出更优雅的代码,可以在想提升代码质量的时候研读。

    小结

    Python,Go等其他语言我并不太熟悉,就不班门弄斧了。如果你对一门语言感兴趣,就去搜一下这门语言适合干什么,不适合干什么。然后结合自己想要从事的方向去选择语言,不要听说他很火就去学,学了并不一定适合你。

    当然如果只是感兴趣,学习任何语言都是可以的。以求职为目的的话,建议选择一个相对更适合找工作的语言作为主力开发语言。

    如果觉得看书太枯燥,入门的时候也可以找个教学视频看一看,跟着老师敲一敲代码,注意,这里说跟着敲不是老师写一句你写一句,而是老师写完一个程序,你可以不看老师的代码自己写出来,写不出来就再回去看一遍,看看自己的思路卡在哪。

    只看不动手,只抄一遍不思考,都并没有什么卵用,看完了脑子里什么也没留下。

    教学视频就去B站找吧,B站真的是个学习宝地,各种学习视频应有尽有。

    更多干货文章都在我的公众号:星尘coding 中首发,欢迎关注!

    数据结构与算法

    语言学的差不多了,基本语法懂了,能写点简单的程序了,就得开始学习数据结构与算法了。这一块内容是校招的重中之重,也是决定一个候选人能不能进入大厂的关键因素。

    一般,公司的技术岗考察包括一场笔试和N轮面试,大厂笔试以算法题为主,面试的时候很多也会有现场手写算法题。

    因为面试的时候时间有限,面试官一般不会出特别难的题。而笔试题一般是给2个小时左右的时间,出几道不同难度的题给你写,这就真的容易凉凉了,我是凉了好几次。

    这也是前面为什么说要抓住提前批的机会,很多公司提前批免笔试,部门直接捞人开面。比如我都是提前批面试的腾讯和美团,别人秋招第一批笔试的时候我已经面完等offer了。

    数据结构和算法入门,我推荐看**《大话数据结构》《算法图解》**,这两本书讲的都比较生动,易于理解,当然如果科班出身,就别看这两个了,直接看下面的这个。

    《算法(第四版)》,橙皮书,算法深入学习建议看这本。至于那本算法圣经**《算法导论》**,太偏重理论,实在啃不动,还是放一边去吧。

    算法光看书可不太行,这玩意你要是写不出来,那就是在扯淡。算法刷题推荐两个地方:LeetCode和牛客网

    LeetCode上的题目都有分类,学习完一个算法或者数据结构就可以去LeetCode上刷这个模块的题目,从简单题开始,试着写点中等题。

    刚开始的时候你肯定啥也写不出来,那可太正常了,大家都是这么过来的。

    从看了完全没思路,到有点想法却不知如何开始,到写出来就是通过不了,再到能写出来一种解法,最后到能想出来多种解法,追求性能。写算法题可真是个折磨人的小妖精。

    到了准备求职阶段,就要祭出来我们的面试算法宝典:《剑指offer(第二版)》。这本书里的题目真的是太经典了,很多面试的算法题都是从这里面选的。

    LeetCode和牛客网上都有剑指offer的题库可以直接刷,先看题目自己尝试写,然后再看书,肯定有一种恍然大明白的感觉。

    准备求职的时候就可以去牛客网看公司笔试真题了。可以针对性地做几套感受一下风格和难度。公司的笔试题很多会套个业务场景的壳子,去掉这个壳子就是普通的算法题。

    对于低年级的时间充裕的同学来说,可以尝试去参加ACM,好好提升一下自己的算法能力,好多面试官非常喜欢有ACM经历的学生。

    至于哪些算法是考察重点,难点有哪些,具体做哪些题,这个写起来就太多了,后面专门写文章讲吧。

    操作系统和计算机网络

    这两门课科班的同学肯定都学过,非科班的同学可以去B站看视频学习,操作系统推荐清华大学向勇老师的课程。计算机网络我没看网课,所以也不好推荐,大家自己搜来看吧。

    看书的话操作系统推荐**《现代操作系统》**,讲的比较全面,重点是进程管理,内存管理,各种调度算法,几种IO模型,Linux常用命令。

    这里需要明确一点,操作系统课程所涉及的概念是各种操作系统通用的,不是针对Linux来写的。比如内存置换中的时钟置换算法,Linux中的内存置换是基于这个算法实现的,但是将1位的使用位改成了8位的age,原理一样,实现有区别。

    很多人推荐的**《深入理解计算机系统》**并不是单独讲操作系统的,还有计算机组成,系统结构,编译原理的内容,我看了一部分就啃不动了,适合有些基础后再看。

    计算机网络可以看谢希仁老师的**《计算机网络(第七版)》,这本书非常适合了解计算机网络的整体框架。然后可以看《计算机网络:自顶向下方法》**,重点是TCP相关的内容,其他部分有时间的话就看看。

    HTTP协议推荐**《图解HTTP》**,这本书很简单,可以很快看完,主要学习HTTP协议的特性,各个版本的改进点,HTTPS加密的实现过程。当然像DNS,ARP等协议了解作用和工作过程就可以了。

    这里还要推荐一本**《网络是怎么连接的》**,这本书从浏览器输入一个URL讲起,将网络连接的全过程讲解的很清楚,可以帮助加深对计算机网络的理解。浏览器输入一个URL之后发生了什么,这个问题我面试中被问到了3次,面试腾讯的时候问的非常详细。

    这两门课都是概念比较多的课程,所以学习过程中整理好笔记,便于之后准备面试的时候复习。

    方向性学习内容

    计算机基础学完了,后面就得整点方向性的东西了。从我准备的Java后端来说,主要还要学习数据库,Spring,中间件,而Linux的要求低一些,主要是问一些常用操作命令。

    如果是C/C++方向的,可能Linux的要求就要高一些了,这里就不展开讲了,后面有机会单独聊聊这个方向的学习路线。

    数据库MySQL

    数据库这玩意只要是搞后端的都跑不了,得学呀。数据库类型有很多,但是原理都是一样的,就选择MySQL来学就好,免费,用的比较多。

    首先推荐一本书入门:《MySQL必知必会》,这本书非常简单,适合非科班同学入门,科班的同学可以用来回忆SQL的写法。

    进阶可以看**《高性能MySQL》的第一,四,五,六章**,至于后面的复制,高可用章节有时间再看用于提升,这本书还挺难的,但是我看的时候的确收获满满。

    看书的同时可以参考一些优秀的博客和推文,一般讲的比较通俗易懂,便于理解。这方面的文章我之后也会写。

    从面试的角度来看,主要是围绕InnoDB和MyISAM等存储引擎的区别,索引及其数据结构B+树,锁,事务,SQL语句,以及数据库表的设计与优化能力来考察。

    Spring

    一般比较成熟的语言都是有开发框架的,可以帮助开发人员只关注业务本身,避免重复造轮子浪费时间。

    如果时间充足,可以尝试不使用框架来写个小网站,然后再学习框架,就能更好的体会到这玩意的便捷。

    Java后端开发框架Spring一家独大,建议直接学习Spring Boot,那什么 SSM,SSH 就别学了。作为初学者快速上手还是建议B站找个视频跟着学,然后再找个视频跟着做个项目出来。

    这之后最好尝试自己独立写个小项目出来,跟着别人写和自己写真的差别挺大的,所有环节都得自己设计,出bug的概率大大增加,改bug是个很好的提升过程。如果前端不会写就只提供Restful接口,用postman发请求测试,测试能通就可以。

    如果想把这个项目写到简历上,就将这个项目做的丰富一些,增加功能,使用一些并发编程,中间件等,就是要让项目有难点,有亮点,有让面试官能问的东西。

    跟面试官聊到Spring基本都会被问到它的的两大特性IOC和AOP,这方面建议看一些博客来了解,想看书的话推荐**《Spring技术内幕:深入理解Spring架构与设计原理》**,只看IOC和AOP的章节就可以了。

    至于微服务框架Spring Cloud就不建议学了,非常费时,而且校招考察的重点还是计算机基础,基础不牢固搞这花里胡哨的都是徒劳。我简历里也写了自己了解Spring Cloud,面试官只问过我一次对微服务框架的理解,具体细节从来没问过(可能是我比较菜)。

    中间件

    现在的企业开发中,都会使用大量的高性能中间件。比如缓存中间件 Redis,消息队列 Kafka,网络框架 Netty 等。

    深入学习一两个中间件的实现原理绝对让你受益匪浅,因为每一个高性能中间件在性能优化和高可用的保证上都做了非常优秀的设计。

    从项目实现上讲,可以使用中间件来提升你的项目性能,从面试的角度讲,熟悉中间件的实现原理绝对是你的一个加分项。

    学习中间件首先要会中间件的基本使用,在自己电脑上装上玩一玩,加到自己的项目里用一用,然后就可以看书来了解他的底层原理了。

    这里首先推荐学习Redis吧,其他的有时间再看,这里推荐**《Redis设计与实现》**,全书每一块都是重点,从基本数据类型讲解到高可用架构的设计,我学习的时候,脑子里只有两个字,牛X!

    其他的说两个我看过的,Kafka推荐**《Kafka权威指南》,Netty推荐《Netty实战》**,有时间就看,没时间就算了。

    项目

    学习内容聊完了,再好好跟大家聊聊项目。

    项目的意义一个是展示自己不是光会嘴上说说,是能做出来真东西的,有干活的能力;另一个就是让面试官有能问的切入点,要不然技术点那么多,面试官要是天马行空的问,大概率会碰到你不会的内容。

    什么样的项目是个好项目?放简历上可以加分?有以下几个注意点:

    1. 不要太大。太大了会让面试官觉得假。你简历上写我做了个跟淘宝一模一样的商城,淘宝有的功能我都有,设计的非常优秀,性能很好。那淘宝是不是应该请你去做CTO?
    2. 有闪光点。面试官问你项目做了啥,有什么难点,你总不能说就做了个增删改查,没啥难点吧。解释项目的时候就往自己擅长的方向引导,展现你解决问题的能力。
    3. 岗位契合度。项目最好与你的求职岗位吻合,比如你投递的岗位是Java后端开发,你写了个自己做前端的项目,是不是有点不合适,如果实在没有项目就放上凑数吧。

    比如我的一个小程序后端项目,本身并没有什么高深的,每次面试官问我这个项目的难点的时候我都讲数据库表的设计和优化过程,然后面试官大概率问数据库,回答的差不多了再引到其他地方。

    那没合适的项目怎么办哪?怎么办?做呀!朋友,光说没有项目有啥用。一个小项目写出来真的不需要太久。很多人都推荐去GitHub上搞个别人的项目,研究研究写到简历上,如果你确定自己不会被问露馅也是可以的。

    有的同学简历上一个项目能写半页纸,完全没必要。每个项目应该用几句话概括出来是什么,有什么难点和亮点,最好用数据说话,比如QPS达到的了多少?数据量有多大?上线了的话访问量有多少?像获得了领导的一致认可这种话就显得非常虚。

    简历

    简历是你拿到面试机会的敲门砖,校招一页纸简历就够了,如果你的项目和实习经历非常非常多,可以写满两页的话就用两页。

    这里推荐一个做简历的工具:超级简历。技术岗适合简约风的PDF简历,不要自己弄个Word模板做完转PDF,好多Word模板真的好丑。(超级简历请给我打钱~)

    技术岗简历要突出自己的技术实力,重点展示自己掌握的技术点,项目经历,实习经历,如果有维护的比较好的博客,GitHub,技术类奖项一定要写上。

    而一些学生工作经历,社会实践,个人评价这些东西相对来说就没必要写,写了技术面试官也不感兴趣,只能用来凑篇幅。

    不要在简历上给自己挖坑,自己不懂的东西千万不要写在简历上。

    比如你在项目中使用了一下Kafka,写在了简历上,那么面试官一般会问为什么选择使用Kafka,不选择其他的消息队列?Kafka相对其他消息队列来说有哪些优势?Kafka是如何保证消息不丢失的?Kafka的底层设计是什么样的?如果你说我就是用了一下,底层的东西我不懂,那这个点就没法加分了。

    信息资料来源

    牛客网:互联网行业求职必看的网站。这里有很多面试经验贴,招聘内推信息,笔试题等等,我从找工作开始基本每天都刷牛客。

    我的面试笔记基础版就是当时要准备字节跳动的面试,在牛客找了30篇字节的优质面经,将里面的所有问题都分类整理下来,标注被问到的次数,然后自己将答案整理出来,之后每次面试遇到不会的问题都加到这个笔记里面,就成了一套通用的面试笔记。

    校招薪水:这个公众号里每天都会推送招聘信息,方便把握最新的招聘动态,发现自己想去的公司再去搜一下这个公司的招聘公众号或者官网去投简历(投简历前最好先去牛客找个内推码)。另外他家有个小程序offershow,查询公司薪水情况,互联网比薪神器。

    招聘软件:市面上招聘的软件很多,我在求职过程中只用了BOSS直聘,很多都是部门直接招人的,无论是找实习还是全职都挺方便的,一般比官网投递反馈更快,而且没有某些求职软件的邮件推送轰炸,还是不错的。

    技术公众号:很多技术公众号专注于学习路线,面试求职资料的分享,可以自行搜索一些高质量的公众号查看。我自己也在一些公众号里获得了不少有用的资源,现在我自己也开始做公众号了:星尘coding,感兴趣可以关注,我的所有干货文章都会在这里首发。

    总结

    上面写了这么多,最后再给大家说几句掏心窝子的建议吧。

    1. 不要只看视频。看视频只适合入门学习,后面需要实践,看书,看官方文档来深入学习。如果想仅仅看个视频就进大厂,朋友,还是早早洗洗睡吧,梦里什么都有。
    2. 动手,动手,动手!动手真的比什么都重要,光说谁不会呀,能写出来才是王道。Don’t say, show me the code.
    3. 做笔记。计算机知识非常庞杂,凡人的脑子想看一遍就记住怕是不太行。尤其是求职的时候,我的笔记帮我节省了很多时间。笔记建议大家写电子版,方便看也不容易丢。我平时是在有道云笔记上记笔记,可以插入代码块,多端同步,非常方便。
    4. 写博客。写博客的目的有两个:一个是将自己学的知识总结给别人看是非常考验自己的掌握程度的,对自己深入理解这一块知识有帮助;第二个是如果你博客写的比较好,很多人看,将来写简历上是个面试加分项。我之前就是一直没写博客,后悔的一批,现在直接开始做公众号了。
    5. 求职多刷面经。平时学习要稳扎稳打,夯实基础,但是面试前再从头来时间不允许呀,所以针对性的复习非常重要,多刷面经,看别人面试都问了哪些问题,都记录下来,一个一个攻破。可以先看一眼我的这篇【Java校招面试记录总结帖】感受一下。
    6. 保持良好心态。学习技术是很苦逼的事情,尤其是刚入门的时候,不要因为学不动就心态爆炸了,更不要因为一两次面试挂了就否定自己,难受的想哭就哭一场,哭完了擦干眼泪继续整呀,想想大厂的年薪,马上鸡血打满。

    对了,上面提到的那些书的电子版微信读书里有一些,我的公众号:星尘coding中也有一百多本电子书可以免费下载(上面提到的书里面都有)。

    好了,这篇学习路线和校招经验贴就到这里吧,啰里啰嗦7000多字了,一些具体的重点知识点讲解后面慢慢写文章跟大家分享。大家还有什么疑问或者想知道的,可以在我的公众号里留言。

    写作不易,感觉还可以的话帮忙点个赞呀,你的认可就是我前进的最大动力。感谢大家的支持,Peace!

    更多干货文章都在我的公众号:星尘coding 中首发,欢迎关注!

    cs