实习面试结束后的一些思考(已拿腾讯实习 offer)

机会只留给有准备的人

先简单自我介绍一下吧,我是一名中末流 211大学的一名大二学生,也就是 21届毕业生,起初是在大一开始之前的暑假里在学姐的建议下提前进行了 C语言的学习,然后开学之后的话继续进行了一小段时间的 C语言学习后就进入到了数据结构的学习当中,学习的基本方式也就是通过看浙大的网课和做它配套的习题。

在完成了数据结构的学习之后,我借着七天的国庆假期(因为自己的家离学校比较远所以没有回家),算是从头到尾仔细的刷了一遍《C Primer Plus》,并完成了其中大部分的习题,因为这其实算是第二遍读了(第一遍是暑假的时候),因此印象很深,效果也很好。十一结束后我是进行了 C++的学习,方式也是网课+书的方式,再然后就是 Python的学习,是通过使用很常见的那本《Python编程从入门到实践》,然后紧接着在期末考试结束后,利用小学期的一个月的时间通过看培训班的教学视频(直接在网上找的资源,没有花钱)又进行了 Java的学习。

第一次质变(理论 到 实践)

到这个大一上学期结束进入寒假为止,其实我已经草草的学过很多语言了(但其实说实话当时也仅仅是接触过皮毛,掌握的并不深),但是并没有进行过实际的项目开发,大多数的知识都是存在于理念之中的。碰巧的机会我受学姐的邀请,去参加全国大学生服务外包大赛,因为是第一次参加比赛,所以整个人还是慢兴奋的,但是因为这个比赛是在寒假的过程中进行的,所以就出现了后面的情况,基本所有的队员在刚放假回到家后,就已经选择了放弃,而开始的时候我是不知道的,所以还是在兴致冲冲的准备着比赛,根据开始分配的任务,我是负责小程序端的开发,但是我们队伍是没有设计人员的,所以我责无旁贷的承担起了原型设计的任务,因为自己以前是没有接触过原型设计的,所以这个过程坎坎坷坷,进行了大概半个月的时间。

接下来的任务就是对于前端的学习,这个过程还是比较快的,因为有之前一些编程语言学习的经验,所以简单学习过 HTML、CSS和 JS后就开始进行了页面的开发。其实刚开始的开发过程,真的是很难很难,因为当时其实是自己第一次接触实际项目的开发,当我打开小程序开发者工具的时候,连控制栏在哪儿都找不到,完全是毫无头绪的状态,那段时间基本是每天都要熬到凌晨两三点,但真正有实质性的进展,已经是在快一个星期的时候了。当然,因为小程序的开发其实是比较简单的,所以经历过最艰难的一个星期后,后面的开发就很顺手了。

但是随之而来的问题是,我们现在是没有后端的(当时的小程序还不支持云函数这样的功能),在跟队长沟通过后,我选择了主动承担起了后端开发的工作(这在一定程度上使因为前端小程序开发进展顺利给自己带来的信心)。再查过一些资料后,我选择了世界上最好的语言 PHP来进行开发,但是问题又来了,我不会 PHP啊(不要问我为什么不用 Django,因为当时小程序提供的快速启动模板中,好像一共就三款,Node.js 、PHP 和 Java,然后当时其实连框架到底是什么样的一个东西都没有什么概念),那能怎么办,学呗。接下来又是几天的 PHP学习,学习方式依然是网课(因为我认为网课是最直观的,也是最易于入门者学习的方式)。当学习完 PHP后,大概又进行了半个月的 PHP原生开发(因为当时的自己根本不知道 TP、Laravel这些框架,甚至没有框架的概念),在这个开发的过程中,为了满足客户端之间的实时通信的需求,我选择使用了基于 Workerman的 GatewayWorker,感觉还是挺好用的,上手也是比较容易的。

然后就是开学后,进行服务器的搭建,我们当时选择的阿里云的 Linux服务器,对于没有 Linux基础的我唯一的选择就是学,真的是无比的艰难,就 PHP服务器环境的搭建就花费了我大概一个星期的时间,那段时间真的是每天都在研究 Linux。再然后就是网页的前端开发,数据库设计等等,这里的细节也就不过多说了。

为什么说他是我的第一次质变呢,因为这个项目对于我的提升,真的是超乎想象的,通过这个项目使我知道人的潜力真的是无限的,你不逼一逼自己,真的是永远不会知道自己的能力到底会有多强。当完成那个项目后,我再回头去看那个项目的代码时候,真的是完全不相信它是自己所完成的,因为整个项目的结构真的是感觉很复杂,涉及到很多交互和实时通信的问题。这个项目带给我的质变算是从 理论实践 的一次质变,它使我明白,很多东西不是你光看书,光去听别人讲,觉得自己好像会了,自己就真的会了,真的是需要自己去进行实际的开发,才能够真的掌握那些知识,也才能真正的发现问题的关键所在,才能真正的使自己得到提升。

第二次质变(实践 到 理论)

这个第二次质变,其实跟第一次整整刚好隔了一年的时间。在那个项目结束后我算是喜欢上了前端,喜欢他所带给我那种编程完成后立即就能得到结果的成就感,但是人的好奇心是永远存在的,所以在完成那个项目的暑假,我又进行了 Python 中 Scrapy 爬虫的学习(我觉得因为自己才大一,还有很多的时间,所以还是要多进行一些尝试的,只有这样才能更好的发现自己真正的兴趣所在),同时在学长的建议下开始接触计算机网络这样的更底层更基础一些的知识,但是在自己的心中总是有一个当时的终极目标,那个就是 Android开发,因为当时的自己是觉得 Android开发是要比前端开发更具有挑战性的,需要考虑的因素也更多,上手也更难一些(但其实后来发现前端的广度和深度也是很难想象的,其所谓的简单只在于入门的轻易性)。所以,在大二的上学期,我又抱着我还小,还可以尝试的想法进行了 Android开发的学习。

对于安卓的学习其实就是可能大家都走过的一条路,即先看《第一行代码》,再看《Android编程权威指南》,当我看完了这两本书之后,其实是已经有一点入门的了,然后我又在学长的建议下看了《Android开发艺术探索》和《Android源码设计模式》这两本书。但是读后感怎么说呢,感觉是囫囵吞枣,因为当时的自己没有进行过实践,因此对里面的东西都是大概有一个印象,但其实过了没多久就没什么印象了,整体感觉其实还是挺糟糕的。因此我借着第二次服务外包大赛又进行了 Andorid开发的实践,项目采用了自己之前学过的 MVP架构、设计模式、第三方库啊等等,做完这个项目我觉得自己好像仿佛已经入门 Android了,但其实现实还是很残酷的。

做完一个项目的自己信心满满,准备好简历,开始投递简历。因为自己其实也做了一些相应的准备(假期每天都会固定刷三四道算法题,开学后也进行过一些理论方面的准备),然后自己的策略是先投小一点的公司,积累经验后再去投大一点的公司。3月11日我在实习僧上投出了第一份简历,蜜柚科技公司,当时的自己是不知道他是字节跳动的子公司的,所以当我当天下午接到约定面试时间的电话的时候,得知是字节跳动,其实是又惊又喜的,但是惊喜过后,就是绝望,因为自己当时因为没有反应过来,所以面试的时间直接就定在了第二天晚上,但是自己的准备其实还是很不充分的,所以第二天晚上的面试其实是意料之中的就凉了,只不过凉的很彻底,因为全程都是,不好意思这个方面不是太了解这样的话,但其实当时面试官问的都是比较基础的一些 Java知识和 Android方面的一些基础知识。

那天的面试还是给自己了很大的触动的,当时的自己只懂得了一个道理就是 菜真的是原罪,面试结束后的自己其实是很失落的,因为为了这次面试,为了有一个比较好的面试环境,自己专门去校外订了一间钟点房,然后也是对自己的项目中的点都进行了准备,当时的第一个想法其实想放弃的,一个想法说,你才大二而已,不会是很正常的嘛,大不了明年再试嘛,当然一些学长学姐也是这么安慰我的,所以其实当晚我是决定放弃了的,所以时隔好几个月去看了一场电影,放松一下。

但是第二天早上一起来,喝过咖啡之后的自己,好像打了鸡血一般,莫名其妙的又重新燃起了斗志。不算是鸡汤吧,但当时真的是莫名其妙的,好像就是早上上课的时候在郭霖大神的公众号上突然看到了当日的一个推文,是关于面试中的一些常见的问题,当时只是点进去看了看,就无法自拔,看到里面其实有很多面试中会固定问到的问题,我才发现自己的问题到底出在哪里。

也就是从那个早上开始吧,我又重新站了起来,重新修改简历,同时开始恶补关于 Java、Android还有计网的一些知识,开始的时候其实就是死记硬背,那个阶段是挺难的,因为好多东西都不理解为什么会是这样,但是在持续了一个星期左右吧,开始慢慢渐入佳境,可能是因为知识的储备达到了一定的水平(因为我记东西特别快,当时高中老师都劝我去学文科,哈哈哈),之前背过的很多点开始慢慢的连成线,知识的脉络开始逐渐清晰起来,很多之前都是死记硬背的东西开始慢慢的理解了起来。在这个阶段,对于知识的点不再是死记硬背,而更多的是开始进行理解,就比如在看一个知识点的时候,可能突然发现另一个知识点(比如从 IntentService 到 HandlerThread 到 Handler 再到消息机制 再到 ThreadLocal),这个时候就会突然很好奇,哎,那个知识点我之前好像看到过,但是感觉有点想不起来了,所以立即直接跳到那个知识点去(这里我们假设只跳一层),因为我们已经知道这个点在另一个点中的作用了,所以当我们再回来看这个点的时候,就会恍然大悟,对很多之前不懂得地方慢慢有了新的理解,然后当我们大概理解了这个点再返回原来的点之后,你就会发现原来那个点的整体结构格外的清晰,因为这时你已经知道它底层的一些实现了。

当这个阶段过去后,一个新的阶段就是,联想能力逐渐增强,可能你在这里看到了一个知识点,但是你之前没有学习过,如果这时是第一个死记硬背或第二个阶段,你可能背下来就过去了,但是现在的你可能会更加好奇,这个知识点的内部实现,从而推动你去自己进行探索,去查找资料对它进行了解。我觉得在这个阶段的时候,其实就已经不再是为记而记,为面试而准备了,到这个阶段,推动你的更多是你自身的兴趣。这个其实很好理解,比如,做英语阅读的时候,假如这篇文章里,很多的单词你都不认识,这个时候其实你是完全读不下去的,因为你每句话都连不上,也不存在什么兴趣,也就没有推动力,但是,假如你逐渐的进行积累,从比较简单的文章开始,将简单文章中的单词记住,然后积少成多,这样当你的词汇量达到一定的水平之后,你就会突然发现,以前觉得特别难的文章中的一些话你已经可以断断续续的理解大概的意思了,这个时候如果你看到眼熟的单词,你可能会选择回顾一下,看看它是什么意思,这其实就对应的是第二个阶段。然后当你的词汇量水平进一步上升的时候,你这个时候就会突然发现,哎,好像有一些句子我已经可以顺下来了,但是其中可能还有那么一两个单词没有见到过,这个时候的你因为已经具备了主观能动性并且对这句话精确的理解充满了兴趣,所以你大概率会去主动的查询它的涵义,这个时候其实就已经是第三个阶段了,这个时候驱动你的已经不再是外界的因素,而是你自身的兴趣了。在这个阶段中,我觉得收获最大的就是,我已经可以将一个一个的点,慢慢的连成一段一段的线,对于很多知识点,不再是想办法去记住他,而是通过他与别的点的之间的关系去理解它。

我所到达的最后一个阶段,也就是小线段连成大线段的过程,在最后的这段时期里,因为之前很多不理解的点都已经有了比较好的理解,之前做项目中出现的错误的原因这个时候也有了理解,所以我开始更在在意它更底层的实现到底是怎样的,因此我开始阅读源码,尽量去捋顺它的逻辑,实在不懂得会上网去看看别人的解释,在这个过程中我真的是乐在其中的,很多时候都是有一种恍然大悟、茅塞顿开的感觉,就感觉困扰了自己很久的问题突然就被解开了。同时我开始再次去阅读《Android开发艺术探索》和《Android源码设计模式解析》,这次的阅读是跟第一次的阅读有天壤之别的,因为有了足够的知识积累同时也进行过技术实践,所以很多书中提到的点和存在的问题,马上就能很好的理解,而且是真的可以做到看过后记在脑子里,不是硬记而是理解,这个时候的阅读不再是被动的强迫自己一定要多读书才能进步,更多的是兴趣使然,当你理解了一点后,你就会很想知道相关的点是怎么实现的,这样一环扣一环,才算是真的进行了阅读。

对于第二次的质变,准确的来说就是从 实践理论 质变吧,对于之前的学习,更多是会用就行,知其然就可以了,但是这次面试准备却实实在在的把我带入了新的世界,现在的自己更加注重的是知识的连贯性和底层的理解,更加渴望知道的不是它怎么用,而是它是怎么实现的,他为什么要这么实现,他跟另外的技术又有什么样的关系。因此对于这次的面试准备,我的最大的收获就是思想观念的转变,和对更底层实现的一种渴望。

写在最后

大概也就是这些吧,我算是把自己这一年多的大概进行进行了一下总结,总体的过程就是从 理论到实践,再从实践到理论 ,我觉得这可能就是哲学上所说的螺旋式上升吧,对于最后的面试,我是投的腾讯的移动客户端,但是被转岗到了测试开发,一面的话就是项目介绍和算法,二面的话侧重于 Java基础,问的也就是反射和GC这样的,但是总体来说二面问的问题比较少,可能是因为我一个 GC就说了20分钟,但我意犹未尽的时候问面试官还要不要继续讲的时候,面试官说不用了的原因吧。第二次面试跟第一次面试相隔了刚好两个星期的时间,两个星期里做了几万字的笔记,每天从早到晚都在看笔记写笔记。

但是其实归根到底,我觉得今天自己能够有这样的机会去腾讯实习,还是依赖于自己长期的一个项目积累和知识储备,对于最后的那个 GC,之所以能够说那么多是因为以前的时候自己对 JVM很感兴趣,所以刷过两遍《深入理解JVM虚拟机》。对于整体的面试,因为我是 21届的学生,而且投的是安卓开发这样的一个岗位,同时基本没怎么投中小企业,所以其实从头到尾仅有两次机会吧,机会还是很少的,只有抓住每一次的机会才能有成功的希望。然后我觉得自己最大收获,就是完成了从实践到理论的转变吧,现在的自己因为有了更多的知识储备,前方的路途越来越明朗,未来的规划也越来越清晰,也开始慢慢知道了自己到底应该去掌握什么,什么才是最重要的。

最后,我希望看到这篇文章的你,如果是跟我之前一样迷茫的人,这篇文章可以帮助到你,如果你有什么相关的问题,也可以来联系我,我们一同进步。

未来的路还很长,现在的我还是很菜,需要学习的东西还有很多

我不知道自己的未来是怎样的

但我知道自己永远不会停下学习的脚步

还是那句话,不会不要紧,拼命学就完事了

如果你也是正在努力拼搏、热爱编程的人,请让我们共勉

你可能感兴趣的:(Android,感悟随笔)