这是用户在 2024-12-28 16:51 为 https://articles.zsxq.com/id_24pdgjh6s1iw.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

23届非科班转行互联网的一些总结和经验

来自: 代码随想录
用户头像 森大湿
2022年11月17日 11:15

个人情况


首先感谢卡哥邀请!

我是TJay,211本985硕,本硕都是传统工科,能动专业出身,无竞赛无论文无实习。研一结束开始转码,在去年年底选择了Android开发方向。我的秋招从7月中下旬开始,到11月初最后一次面试结束,为期三个半月左右,最终幸运地拿到了阿里,蚂蚁,百度,快手,B站,东方财富等13个意向/oc。在今年寒气逼人的大环境下能够幸运上岸,离不开个人条件和客观因素的相辅相成。




1.为什么能够顺利上岸


客观因素


客观条件决定了我现阶段所能达到的上限,对于我本人来说,最重要的客观条件就是985硕学历背景+客户端/Android方向。在同等学历背景下,科班同学是基本不屑于投递客户端方向的,原因大家也心知肚明。今年很多同学投递算法或者java后端岗难求一面,而985学历+客户端的条件给予我的最大优势就是——进入面试的几率更高。秋招我投递了60家企业,最终有30家进入了面试阶段,前后经历了77次面试。获得的面试机会越多,积累的面试经验和查漏补缺的机会也越多,随着秋招深入水平会越来越强,成功率自然会提高许多。


个人因素


由于每个人的能力存在边界,我认为客观因素才是我现阶段拿到这么多offer的最重要因素,而个人因素主要是保证下限。对于我自己来说,最重要的几个条件是:目标导向,强烈的自驱力,本科培养的自学能力。它们能帮助我在相对快速地学习新知识的同时,一定程度地屏蔽外部环境干扰,最终顺利上岸。当然过程中也离不开朋友们的帮助。




2.为什么选择Android


大多数想进入互联网的应届生应该都对客户端嗤之以鼻,早几年就有“客三消”说法了,尤其是对于学历背景和我类似的同学,可能绝大多数人都不会建议去选择客户端/Android。其实在信息这么发达的时代,咱们都很明白这是怎么一回事,但不同的人所处的环境和自身条件都不同,选择Android也是基于自身的考量。


个人因素


其实选择进入互联网行业的原因很简单,就是想留在一线或者一线周边城市。我家里条件尚可,因此要能留下来就首先得解决前期如何赚钱的问题。本专业待遇没法支持我留在一线,而互联网行业门槛低,回报快,薪资较高,在家庭的帮助下是有可能在一线或周边安身的。同时我自己的性格比较追求效率,自驱,喜欢从自己做的事情中快速获得反馈。我所经历的传统工科磨洋工,回报周期长以及充满低效的氛围是我选择离开本行业的直接原因,并且坚决不会有回去的打算。


客观因素


作为非科班生,没有机会接触相关领域的前沿知识,因此基本和论文竞赛无缘。而作为传统工科硕士生,日常需要进实验室做实验,动起来就脱不开身,并且周期很长,空余时间被大幅压缩。此外,老师不放实习,更别说我这种一心想着跑路的,不仅无实习可能,还得和老师打游击战。在无论文无竞赛无实习非科班等多个debuff加持下,冲击最卷的算法和java后端毫无竞争力,更别说上岸大厂对于我来说,应届生身份就是我离开本行业最好的机会,我必须全力以赴,并且以上岸为最优先目标,因此选择了Android作为主攻方向。为什么没选前端或者测开呢?其实我本人之前有使用过单片机,也尝试过用手机配合开发板实现一些方便的小工具用于实验台,因此算是有点浅薄的经验,相当于顺水推舟。




3.怎么学Android


语言


Android现在的主流语言是kotlin,但对于校招生来讲,还是通过java入门更合适。一方面,java通用性很强,易上手,并且学习资料非常丰富,也是主流的刷题语言之一。另一方面,学习kotlin也需要java基础,kotlin对于校招生来讲算是加分项。我自己在简历上并没有写kotlin相关的内容,只是随着秋招深入,自己也在慢慢跟进学习,面试的时候可以提一提。但从结果来看,没学过kotlin并不会造成太大影响,最多是某些岗位sp和ssp的区别。


关于java,学习资源很容易获取,我初次接触的时候就是看网课学的(某马)。按照我当时的想法,是计划尽可能快速地掌握java的使用,然后去学习数据结构与算法并刷题。因此我选择通过网课入门,因为它是最高效的获取知识(并非理解知识)的方式。在这里想分享给大家一点个人的建议,有人初次学习java,c++或者mysql等等,喜欢挑时长特别长的网课去入门,因为里面的知识点拆解的非常细,讲得很深入。但就我个人的想法,其实没有太大必要,尤其是对于非科班转行的同学。从个人非科班的角度来讲,接触一门新语言,首先是要掌握它如何使用,后续再去深入理解相关特性和源码等。在时间有限的条件下,要快速掌握一门语言的使用,又想吸收各种底层特性和实现原理,这并不现实,初学者跟着那些超长课时的网课走,容易顾此失彼。因此我选择了时长尚可,知识点广而不深的某马,以掌握使用为主,同时了解java的基本特性,后续学习过程中配合看书不断补足


关于java要掌握的点,个人归纳主要包括:集合,反射,泛型,并发编程(线程安全,锁机制,线程隔离),IO流,JVM(内存结构,垃圾回收)这几大块,相关八股到处都是,咱们可以边学边理解。同时前四项最好边敲代码边学,可以加深印象,尤其是并发编程有不少场景代码题。这里建议手头上有本《Java并发编程的艺术》,因为并发编程一直是重中之重,配合这本书复盘和补足很重要。此外,有多余时间可以学习C++,不过建议放在后期,和学习Framework层以及性能调优同步。


刷题


核心,进大厂的底线。无论是后端还是客户端,面试大厂算法题只要写不出来,今年这情况基本上就寄了。在拿到offer的这些公司里,只有两家出现过算法题没写出来的情况。就我个人的经历,面试题大多是mid,也遇到过一些hard不过大部分是高频,而easy基本没在互联网面试中遇到过。


入门算法前我快速地过了一遍网课(某某谷)的数据结构部分,然后开始刷算法题。首当其冲推荐代码随想录,我也是因为这个才来到知识星球。里面针对比较重要的数据结构以及各自常用的算法进行了全面的归类,理解之后完全可以举一反三。我自己是按照代码随想录+剑指2+hot100的路线来刷题的,应该和大部分人路线一致,提前批开始后反复刷codetop高频题和最近题,当做复习。和星球里的刷题大神相比,我的刷题量并不多(不到400),在今年互联网秋招同学里可能也只算中等偏下的题量,但绝大部分题目实现了4刷或者更多。我是面向面试刷题,400左右的题量能吸收得差不多的话,完全可以达到两倍题量的效果,足以应付大厂面试。


对于笔试题,无论从难度还是广度都要高于面试题,按照上面那种刷题路径可能还不够。像线段树,图论,并查集等等面试较少考察的部分,在笔试中也屡见不鲜。建议大家可以在完成了两轮上述刷题之后,去力扣按标签刷或者在牛客刷大厂真题,刷的多了也会发现,很多笔试题其实就是面试题的缝合产物。随着笔试经验的增多,水平也会逐渐提升。当然要提前熟练ACM模式。


此外,一些模式化算法也经常在面试中出现,只是会变换不同的场景。比如快排堆排归并排序,回溯模板,滑动窗口模板等等,对于常见题型需要经常复习总结,并养成总结时间/空间复杂度的习惯


Android基础+项目


Android的知识体系非常庞大,网上的资料零零散散并且大多比较老套,稍微新一点的网课都是面向具有一定开发经验的同学,因此对于很多初学者来说,不知道从哪里开始。我在学习初期也遭遇了类似的困难,由于找不到系统的学习资料,我决定通过项目从0开始边做边学。


由于我并没有实习机会,因此项目都是从网上找的。第一个项目是一个比较烂大街的天气预报App,没什么难度,技术论坛上到处都是类似的,可以找个带源码的,一些云课堂也可以找到带视频教程的。这个项目的直接目的就是快速熟悉AS基本操作,了解实现一个简单App的流程,对于初学者来说通过简单的项目上手应该是一条比较高效的路径。当然,简单的项目更容易直接接触到Android的基础知识,比如Activity和Service的使用(顺势学习四大组件),设置滑动或点击事件监听(顺势学习事件分发机制),页面之间的切换(顺势学习Acitivity启动模式,启动流程和生命周期)等等。大多功能实现起来都十分简单,但每一块都涉及到一系列的基础知识,在实现功能的同时,也给我们指引了学习的方向。每块基础知识都可以由浅入深逐步学习:

1应用场景→2为什么使用→3源码中如何实现

这个流程非常重要,在前期接触时以搞懂1为目的。对于一些稍微复杂一点的功能可能会涉及到更深入的知识,比如Framework层源码,性能调优等等,但学习路径都是一样的。这里推荐《Android开发艺术探索》这本书,针对于Android的基础知识都有由浅入深的讲解,非常适合上面提到的这种学习模式。只要遇到涉及的知识,就结合这本书去学习。


在搞完第一个项目后,具备了基本的AS使用技能,熟悉了一定的Android基础知识。但此时的知识还未成体系,写项目时的思考也只停留在如何实现某某功能上,因此我决定开始第二个项目。这个项目来自阳光沙滩,可能一早就打算学习Android的同学也不陌生。在具有一定基础的前提下,我开始把更多的精力放在思考2和3上:比如项目为什么用MVP架构,为什么使用RecyclerView、Fragment、Retrofit而不用XXX等,页面切换/布局设置从性能上有没有可以优化的地方等等。在解决问题的过程中,1→2→3的思考链路会越来越清晰,过程中也会慢慢形成架构思维。经过一轮复习,前期零散的知识逐渐形成体系,在1→2→3的思考模式下,后期就可以完全独立地实现整个项目。达到这个要求,基本上就实现了Android的入门,可以去应对面试了。


如果时间有多余可以继续尝试,比如上手一个kotlin+jetpack+mvvm的项目,这也算是前些年Android的主流了。在有了前面的经验之后,上手速度会快很多。即使没有全部完成,也可以把部分工作往简历上丢。或者学习C++,继续钻研Framework层和性能调优这块。


总的来说,我是将学习Android基础知识和搞项目同步起来,秋招开始前我自己掌握的Android基础知识主要包括:四大组件及其原理,常用控件及其原理(各种View/ViewGroup),View绘制流程 ,事件分发机制 ,部分Framework源码(Handler+Binder+AMS),部分性能调优(内存泄漏+OOM+ANR)这几块,每一块都深入到源码级别。当然项目中也会使用一些常用框架,如OkHttp,Retrofit,Glide,RxJava等等,在保证1和2的前提下尽量尝试3。上面这些内容都是在不断地复习中慢慢吸收的,大家只需要保持耐心,多复盘多总结。


计算机基础


Android涉及的计算机基础知识主要是操作系统,计网和设计模式。由于我是非科班,没有系统学过这些知识,并且学习时间有限,因此我还是选择了相对高效但是不精通的方法,涉及一块就学一块。对于非科班同学,接触初期不建议看书或者看网课,时间成本太高,可以在后期慢慢补足。这里的学习我推荐小林的图解系列和拓跋阿秀,前者涉及的知识全面并有对应讲解,配图简单易懂,适合迅速入门;后者是以面试题的方式呈现,适合快速复习。设计模式我自己也没有太系统的学习资料,每种设计模式也没有一成不变的模板,因此我经常在技术论坛上去搜索不同的实例,和用到的设计模式对比,锻炼自己的抽象思维。当然,这些知识需要在后期不断跟进,这里只是为了更有效率地应对秋招。此外我个人建议,针对操作系统和计网的学习,手头上有准备一本《现代操作系统》和《计算机网络自顶向下方法》,一方面是为了辅助解惑,避免陷入纯背八股的误区;另一方面是为了后续跟进学习。


在面试过程中,就我个人的经验,计网中考核较多的是:HTTP/HTTPS/TCP/UDP 等协议的优缺点、TLS 和TCP 握手挥手、滑动窗口/流量控制/拥塞控制等原理。操作系统中考核较多的是:虚拟内存、进程/线程通信和锁、部分进程调度/页面调度算法。设计模式比较灵活,一般是结合自己的项目或者使用到的框架来展开。如果觉得自己有某块知识很不熟悉,在简历上就不写,尽可能把自己掌握的具体部分写到简历上,卡哥在星球里也有讲过,很有参考价值。



4.关于面试


简历


首先,最关键的,需要对简历上的内容了如指掌(基本就是专业技能和项目经历两块)。大多数正常的面试官都是从简历出发来问问题,这两块写得具体且合理,那主动权大部分时间都在自己手上。这里再次推荐星球里卡哥的简历教程,获益匪浅。面试经验多了,自然而然地能学会主动引导面试官往自己熟悉的点去问。


专业技能


面试大多是2+1或者3+1。前者的话,大部分情况是1面偏向专业技能,2面偏向项目经历个综合素质。后者的话,对专业技能的考核会更多。个人感觉,专业技能的考核难度会更大一些。尤其对于大厂来说,对专业技能的考核广而深,不仅仅局限于简历上的内容,所以面试官很容易主导整个过程,这就需要咱们在平时学习的过程中不断复习,追根究底。同时也要尽量结合自己在开发过程中使用的场景/遇到的问题去回答,找机会拿回主动权。


项目


项目经历的考核,主动权基本在咱们手上,主要注意这么几个点:

1.根据star法则描述自己的项目(重点是让面试官了解你为什么搞这个项目,以及做了哪些工作);

2.对于项目中的难点,展示自己的思考过程(遇到了哪些问题,如何发现这些问题,怎么解决的);

3.项目中涉及到的控件/框架等,需要对源码有一定的阅读经验(了解如何实现,才能知道为什么使用它)。

过程中可能会遇到一些与项目相关的场景题(诸如如果要你实现xx功能,你会怎么做等等),对于缺乏经验的非科班同学来说可能是天生劣势,我自己在前期场景题也经常答不上来,这个只能靠面试复盘不断积累,面试一结束就要马上记录下来。


代码考核


算法题在大多数互联网企业里是必考的,面试时的底线是做出来并且能跑通,不一定要最优解,但是做不出来必挂。如果感觉这道题心里没有底,就主动和面试官交流思路,大部分正常的面试官是很愿意引导的。除了算法题之外,可能也会考核一些基本功,比如手写线程安全的单例模式,手写死锁,手写一个Lock/CAS/CountDownLatch,多线程打印字符/数字等等。很多人把精力只聚焦在算法题,导致忽视这些,但是它们同样重要。


面试复盘


复盘相当重要,只有多复盘,吸收失败的经验,才能快速进步。面试中遇到的问题就两种,要么是完全不会的,要么是答得不太好的。处理方法有很多,我自己没有录音和做笔记的习惯(对我自己来说太耽误时间在整理过程上了),而是结束后将印象深刻的问题记录在一个word里,在当天晚上挑一段完整的时间去整理。对于完全不会的问题,我会去技术论坛或者书或者八股文里找问题的解答,然后把它们的地址记录在每个问题的后面,有些问题并不能完全解答,我就会在后面加上自己的理解,当做复习时的提示。对于答得不好的问题,我直接在后面加上细节提示,提示自己按这个要求来。这样做很大程度地减少了我在整理问题上消耗的时间。个人不太建议一定要做详细的笔记或者录音什么的,很多问题的答案都能找到,没有必要再花时间手打一遍或者复制一遍,关键是加上自己的理解和需要注意的细节。面试复盘的最终目的是为了发现问题并解决问题,在保证这两点的基础上,花的时间当然是越少越好。无论选择哪种方法,都需要经常回来看一看,有一些面试的高频问题,如果记录里有,可以标记一下。


反问

好好利用这个机会。一二面面试官可以尝试反问技术栈,反问学习路线建议等等,用于面试之后的修正和补足。主管面可以问问岗位甚至整个行业的发展方向,发展前景等等,在未来职业规划上可以不错的参考。总之比较灵活。




5.一些其他的心得


没有实习要不要紧?


我自己无实习机会,但个人建议能实习就实习。一方面,实习对于在校生来讲,是进入行业内了解业务的最佳通道。一份实习相当于一个项目经历,并且中大厂的实习在简历中的份量比普通项目大得多,进面概率会高一些,面试时能说的或许也会多一些。另一方面,今年这情况通过实习转正比卷秋招要稳妥得多,也有些大厂把大多数hc留给实习生转正,秋招基本就是走流程。所以,无论是日常实习还是暑期实习,能争取就争取。


项目很普通或者没有项目要不要紧?


首先,项目必须要有,要不然面试极其被动。但我自己的项目比较普通,没有用到kotlin,jetpack,flutter等主流工具。不过就我个人经验而言,对于大部分公司来讲,校招生的项目都是小儿科,毕竟大多都是脱离实际业务场景的。项目只是基础知识+思维能力的综合考查方式,这才是公司看中的,尤其是大厂。在大部分时候,能做到上面项目部分提到的那三点,就很有机会通过面试。比如我自己拿到的好几家大厂的offer都是偏向基础平台开发或者性能优化的,并且大部分都是sp,大家不必妄自菲薄,项目虽然重要,但思考过程和思维方式才是核心。


当然今年情况特殊,有些同学可能会被面试官质疑“你这项目没有深度”等等,咱们也不必妄自菲薄,既然没法实习也没有接触到好项目的机会,不妨想想如何将自己的思考过程表述清楚,项目虽然内容有限,但思考是可以无限延伸的,这是咱们力所能及的。


投简历是不是越早越好?


通常来说,投的越早hc越多,越容易先上岸,提前批挂了还有正式批,而且有些公司是分批开奖。但这有一个前提,就是准备充分。今年大环境艰难,如果没有准备充分就早早投递很可能根本没有第二次机会。我自己很早投了字节,zeku等公司,由于准备不充分一面就挂了,结果后面正式批都过不了简历。提前批我只有oppo和完美世界的offer,后期以及正式批投递的公司拿了超过10个。因此,相对于早投简历来说,早计划早准备才是关键


投简历需不需要海投?


建议海投,尤其是今年环境糟糕,大多数人没有办法选择去哪家公司,只能被公司选择,因此海投越多机会越多。但海投实习不太建议(仅从今年来看),因为大多公司会保留面评和应聘记录,海投太多最后一顿挂,有可能影响秋招投递。我自己暑期实习挂了的几家,秋招再次投递时只有某度过了简历。甚至有家公司我通过了所有技术面,最终因为没法实习拒了hr面,结果正式批过不了简历。因此,秋招建议海投,但实习不建议


零基础能不能投客户端/Android?


个人不太建议。首先,零基础对于稍微有点基础的同学是天然劣势,今年竞争这么激烈,大厂的后端/前端/客户端没有一个不卷的,零基础或许降低了投递门槛,但就目前这内卷程度,并不意味着录取门槛降低。其次,在我个人的印象里,只有字节的抖音和Tiktok客户端,以及美团的移动客户端等少数几个岗位,在JD里明着说了可以接受零基础。结果我自己面试这俩,对Android项目的考核非常细致,尤其是美团。再者,客户端的零基础大多针对IOS开发,而Android的零基础绝大多数是投java后端被调剂下来的,都有项目经历和相对不错的专业技能。因此,不建议抱着侥幸心理,真的就以“零基础”的身份投客户端



客户端/Android是不是更容易上岸?


从今年的情况来看,客户端相对于后端是更容易上岸的。更容易的原因在于投递人数没有后端那么多,且学历背景不错的科班生大部分不愿意投,因此进入面试的概率会相对高一点。但就我个人体验,面试本身的难度并不会低多少,大厂动辄一两小时的面试,对基础项目算法的考核都面面俱到。所以,首先得达到那个门槛,才有机会和同一批人进行排序,而相对于后端,这个排序的人数没有那么多。


另外有个地方要特别注意:Android的hc是真的少,岗位也少,且大多数集中在一线。我自己只投了60家,身边100+的也大有人在。在我拿到的offer里,已知有4家hc≤3个,其中有两家只招一个。如果在面试前提前知道这些,我可能也会有点底气不足。尤其对于非科班的同学,如果大厂没有上岸,一些中小厂反而可能因为缺乏足够的工程经验,培养成本大等原因拒掉你(我自己因为这个原因挂了两个中小厂)。因此,选择Android有一定赌博成分,对于非科班同学来说,需要提前确立并且坚定目标。


该不该为了大厂选择客户端?


基本不建议。一般出现这种情况都是拿了某些中小厂的后端offer和大厂的客户端offer,在这种情况下,大厂的优势在于平台和薪资。但大多数情况,后端和客户端的发展前景,职业寿命,学习成本上的差距要比大厂平台重要的多。如果不是两个平台和薪资差距太极端,我个人建议没有必要为了大厂去往客户端里钻。比如某节客户端和某程后端,我还是建议后者。如果是all in一个方向,那当然是大平台好。



6.想对非科班同学说的话


首先,当前这个大环境,我不太建议非科班同学往互联网转码。可能有些同学会说“你这是上车了想焊死车门”,如果是放在去年我肯定是劝进的,但经历过今年秋招我有点犹豫了。现在的互联网相比之下依然是个回报快收益高的选择,但对于大多数人性价比很低,且沉没成本巨大。今年学历要求提升,笔试/面试难度提升,录用门槛提升。往年经常听到某某师兄去了xx大厂,准备了半年java,spring全家桶都没学完就能去某鹅等等,今年已经不复存在了,光是简历没过的都数不胜数。好不容易卷上岸了,一开奖发现,大部分公司取消签字费和股票,薪资总包照去年明显下降,又会产生心理落差。对于非科班的同学,如果是因为想赚钱去转码,大可不必挤进互联网,就我个人的经验,像手机厂,新能源车企,甚至一些金融科技公司,它们的面试难度远远低于互联网,并且行业在处于上升期,有类似背景的同学完全可以尝试


此外,对于非科班同学来说,转码过程中除了0基础学习本身的困难之外,还有外部环境的阻力。比如来自老师的反对,来自同门的压力,家人的不理解,还有本专业课题占用的精力和时间等等。过程中可能会经历许多孤独与无助,咱们也无法避免。见过不少同是非科班转行的,在学习和环境的双重压力下,一步一步降低自己的期望和要求,最后选择了妥协回归本行业,能坚持下来的只有少数一些人。我想告诉大家,在做出决定前一定要尽可能多地了解信息,合理评估可能性。一旦做出决定,就立刻指定完整的学习计划,并且坚定不移地执行下去。强烈的目标导向和自驱力能很大程度地弥补能力上的不足,这也是我能幸运上岸的关键因素之一。



写在最后


今年秋招需要天时地利人和,很幸运实现了最初的目标,也恭喜同样幸运拿到心仪offer的同学。但这仅仅完成了一小步,许多问题依然存在,不会消失。从近一点看,入职后要在缺乏基础的条件下快速学习,熬过三个月的试用期。从远一点看,还要应对客户端未来的发展瓶颈,琢磨出适合自己的发展道路。我深知自己当前眼界有限,因此从未停止学习和思考,很庆幸在职业生涯初期有机会去大平台锻炼。未来不确定的事太多,唯一确定的就是自己会不断地进步。等以后这些问题到来时,希望自己也能像现在这样,有做出选择的能力。一直在路上,各位共勉!





扫码加入星球
查看更多优质内容
https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=88511825151142