+-
从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路
首页 专栏 android 文章详情
0

从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路

程序员吴彦祖 发布于 1 月 18 日

我是在去年3月份加入腾讯公司,目前是腾讯公司某技术部门里面的一个小负责人,年薪月薪大税后概30K,谈不上多么厉害,但在回想自己半路出家学习编程,从一个销售到现在终于进入中国互联网顶尖公司,还是有些许感慨。

今天写这篇文章,算是对自己过去一个总结,也分享自己的职业之路。

(一)初入编程

我是12年大学毕业,我毕业于一家非常一般本科院校,大学生活浑浑噩噩,却有无比的幸福,对我来说,那四年是属于魔兽世界的。

有人问过我,浪费那4年时间后不后悔,我都会无比坚定的说,不后悔,那四年我真的幸福。但是在夜深人静,扪心自问,到底后不后悔?只能说有点惋惜,如果当时能够抽出一些时间来,做点更有意义的事情,可能生活会更加不一样。

我现在对游戏的态度就是:我会劝很多学弟学妹,最好别玩游戏,玩游戏真的没有意义,除非你将来打算走上电竞,当一个电竞选手,不然很浪费时间,你用游戏的十分之一去看书,收获到的都会比游戏里面得到的要多。

大学毕业后,我第一份工作是销售。

我的本专业不提也罢,因为我现在自己都不知道那是个什么东西,不过我还是拿到毕业证书。由于先天的不自信,我选择了销售这个岗位。

这是非常多大学毕业生,刚毕业的时候都会选择的岗位,在这里倚老卖老,劝一句:如果你真的喜欢销售这个岗位,那么选择销售肯定没问题,如果你只是因为不自信,那么就大错特错,去尝试投点简历,做好面试准备,可能会有意想不到的收获。

我选择销售,是一条弯路,那段岁月特别难受,很大程度是因为我性格的关系,再加上不喜欢销售团队经常的打鸡血和洗脑,最后离开这个销售这个行业。

但,这是非常难的一条路。

不干销售,那么我能干嘛?那几个月我一直在考虑这个问题,那段时间我非常迷茫,我换了好多家公司的销售岗位,做一段时间,再离职,再去做销售,再辞职,犹如一个死循环。

直到我一个朋友让我尝试学习Android开发。

那是一个星期天,他来找我聊天,那天晚上,我们在农大旁边的闽江,一边看着隔壁技校妹纸的大白腿,一边喝着酒,痛哭流涕,哭什么我们不知道,大概可能也许,我们一直没做好独立面对这个社会的准备,以至于到处碰壁。

反正,就这样,在和他聊过后,我开始学习Android开发。

最开始,我对Android非常恐惧,因为我觉得学习编程好难好复杂,那么多密密麻麻的代码,让人望而生畏。

初学编程,最重要的就是“驱动力”。而这个“驱动力”是由两个东西带动的,一个叫做“勇气”,一个叫做“兴趣”。

一旦你对这门语言实用性产生兴趣,那么学习起来真的不难,另外一个就是勇气,别害怕碰到难的知识,一定要想办法尝试挑战,如果真的觉得自己无力解决,那么就看视频,买书,请教别人。

在那段时间内,我学习编程的热情前所未有的高涨,就跟当年玩魔兽世界一样,非常充实,我自己能够感觉到自己慢慢变强了,而这种变强不是依托在一个账号上,而是我自己变强。

(二)找工作

对于我这种自学编程的人来说,找工作绝对是一个非常非常大的挑战。

但是,我已经做好了再也不做销售的决心,所以我当时第一个目标,就是不管工资多少,不管公司多么不好,先找到一份工作再说,至少,先入行。

虽说我已经有了足够的心理准备,但现实更惨烈,整整一个月,一个面试通知都没有,那个打击是真的很大。

不过,打击归打击,该投的简历还是要投。

在一个周四的下午,我接到一个面试通知,至今我都记得,当时我的手绝对在颤抖。

那是一家手游行业的公司,要做一个游戏APP,当时这家公司的Android开发突然就不干了,再招人又来不及,刚好看到我投简历,就打电话叫我过去面试。

面试过程很短,面试我的是技术部经理,问了几个简单问题后,说:“你什么时候可以上班?”

我说:“随时都可以。”

他说:“那你现在就上班吧,那边是你的工位。”

就这样,我得到第一份编程工作。现在回想起来,我能够得到这份工作,最大最大的因素,就是坚持。

在这个过程中,我做了很多努力,比如修改我的简历,了解每一家我投递公司的项目需要,再认真写好我的每一份投递的求职信。

虽然,在当时外人眼中,那样其实没有什么意义,但是我知道,只要去做,就一定有意义。

(三)职业进阶

对程序员来说,最重要一定是工作经验和项目经验。

有人说,不对,应该是学习!其实这个答案和我上面给的答案是一样的,因为当你在积累你的工作经验和项目经验的过程中,其实就是一个学习的过程。

我的第一份工作,对我来说,是通过项目来学习的,而且这是最有效的!这是很多在自学编程的小伙伴,没有意识到的问题!

大家学习的理论知识都一样,但是最快速、最有效的方式,一定是多敲代码,多看别人的代码。

当时,我花了大概2个月时间,快速成长,当然这得益于我的勤学好问,碰到你无法理解的问题,一定要先尝试思考,然后再去求教他人。

当时如果项目非常着急的情况下,请立即把问题抛出来,求助他人,因为你是在为公司的项目负责,而不是个人的自我学习。

每天来回的一个小时里面,足够我看完一些技术文档。

当我想尝试其他语言基础知识,或者做点好玩的东西,这段时间对我来说非常重要。

因为我在回家后,就知道我应该做什么,怎么做。

会不会很枯燥无味?老实说,肯定会!曾经有一段时间,我在公交车上每天看的是“今日头条”,今日头条确实非常棒,他本身的算法太可怕,一直推送你喜欢的内容,以至于后来很长一段时间,我都没敢打开力扣学习。

好在我这人幡然醒悟的比较快,因为我很清晰的知道,我要的是什么,那就是让自己变强,因为你变强后,你才有资格得到你想要的。

有些人只会抱怨,怨天怨地,我想说的是,在那个过程,你已经浪费了很多时间,比如看完一篇python的爬虫文档。

一直保持海绵体的吸收知识,不仅让我自己看到自己的进步,也让我快速在职场里面脱颖而出。

我在第一家公司呆了大概2年后,我跳槽了。

那个时候的我,非常自信,我有有足够的资本自信,因为这两年,我一直在进步,kotlin、第三方开源框架、framework、高级UI、数据结构、NDK、flutter等等,还有其他编程语言我也有所涉略。

这边给各位小伙伴一个建议:

一定是中高级的Android开发,才有市场,一定要自己动手做点小项目,再去找工作。

另外,Android的职业规划之路有很多,全在于你是否愿意继续学习,因为后面可拓展的技术太多了,比如上面提到的flutter。

(四)入职腾讯

我在跳槽后,进入一家很知名的网络公司,那个时候,我的水平,离进入腾讯的技术员,还有一定的差距。

主要的差距在于,基础理论知识!

越是大公司,越重视程序员的基础知识,这也是非科班出生程序员的致命痛点。

那么是否有办法补救,当然有,那就是:看书、刷题库。

看书和刷题库是最有效弥补基础知识的方式,我自己整理了一套面试题,里面有历年各大知名网络公司的面试题,百度、腾讯、阿里巴巴、美团、滴滴等等都有,其实这些公司的面试题,都是非常基础的知识。看到这些题,你就知道我花了多少精力了。

再跳槽到第二家公司,我是我们公司Android开发的小领导,在繁忙的工作中,每天我必定抽出时间继续学习。

有很多程序员容易满足,不会主动去学习,直到他们需要用到的时候,才开始翻书学习,这种态度不是说不行,只是在我看来,有点懈怠了。

程序员是一个需要不断学习的岗位,同时程序员也是一个高薪的岗位,所以这样容易滋生懈怠,其实这样未尝不可,只是如果你想站在更高的平台,那么不要停止学习,哪怕每天只是学一点点。

后面的事情,顺理成章,19年,我开始规划自己入职腾讯的计划。

除了刷腾讯公司每年的面试题之外,我还认真的了解腾讯技术部门的架构,以便清晰的知道,如果自己要进去,自己应该负责哪些事项,同时,这些事项需要拥有哪些技术的程序员。

在一切做好准备后,我去面试的那天,游刃有余,我丝毫不觉得我在面试一家多么厉害的公司。

下面分享我的面经:

一面(1h):

谈谈你学习过的架构模式 MVC MVP MVVM 一个Union类型,共有一个int类型、Float、Double类型的字段,请问在32位的CPU创建时需要占用多少字节? Union和Struct的区别 谈谈你所了解的C语言的内存管理 说说你了解的程序设计模式,知道多少说多少 说说TCP和UDP的区别,你认为QQ的实现是使用TCP还是UDP? 谈谈你了解的C语言的编译过程

8 . 进程和线程的区别

谈谈你对Viper架构模式的了解 Fiddler的工作原理解释一下 死锁产生的原因以及解决办法 进程的调度算法有哪些,分别解释一下? Android程序共享数据的方式有哪些? Android的性能优化 Handler和HandlerThread的区别 八皇后问题了解过吗?具体怎么实现的? 解释一下异步编程,说说它的应用 Android应用的启动过程

二面(40Min):

1.  多线程了解吗?

多线程如何实现通信? 多线程如何实现线程安全? 多线程如何实现同步机制? 进程间的通信方式? 谈谈你对架构模式和设计模式的理解。 现在让你设计一个字典,说一下你的设计思路。

三面(3.5h):

请你画出MVP架构图,并解释一遍它的运作流程。比如网络操作 解释一下页面展示数据获取的数据来源。 多线程会导致什么问题,应该怎么解决? Android进程的优先级是怎样的? 说一下Activity的生命周期 onStar和onResume方法的区别是什么?什么时候用onStart,什么时候用onResume. 说一下冒泡排序的区别? 冒泡排序最优的时间复杂度? 一棵没有特定顺序的二叉树,如何存放在文件中? 手写代码,给一个int的数组,将其移动k位(使用交换的思想)。如array = [1,2,3,4,5], k = 2, 则移动后的array为[4,5,1,2,3] 设计QQ传文件功能,并画出模块设计图。 说一下防火墙穿越的实现原理 加密算法和加密原理 Https实现原理 手写代码,无限大整数转16进制 讲解一下登陆时密码加密过程 推理题

宴会上,人们都带着白色或者黑色帽子,其中至少有一个人带黑色帽子,每个人都能看到别人帽子的颜色,看不到自己帽子的颜色。假设每个人都足够聪明,如果在熄灯的时候你觉得你自己带了黑色帽子,就鼓掌。第一次没人鼓掌,第二次没人鼓掌,第三次有人鼓掌。请问有多少个人带了黑色帽子。

Hr面(20Min)

1.自我介绍

你认为你身上最显著的三大特征是什么? 产品、薪资、个人发展、平台、地域等等  选择你认为最重要的三个?并解释为什么?

4.你除了腾讯还有面试别的公司吗?为什么选择腾讯?

5.家住哪,倾向在哪个城市工作?

6.介绍一下你的社团活动经历,说说印象最深刻的一次。

7.说说你的实习经历

8.你对待加班的看法。

9.说一说你接触过腾讯哪些产品,并说说他们的特点。

10.你如何看待腾讯、百度、阿里巴巴这些公司

最后

其实进入腾讯公司,只是结果中的“果”,而一切的“因”,是我之前的积累。

想要得到多少,势必就得付出多少,这是我一路上来最大的感悟。

在准备期间,我刷了大量的Android大厂面试题,在前段时间做了一个整理,内容更加详细了:

1.2020腾讯Android面试真题解析

2.2017-2020字节跳动Android面试历年真题解析

3.2020阿里巴巴Android面试真题解析

4.一线互联网三方源码高频面试总结

5.Android Framework精编内核解析

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。

有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。

我很幸运的是,当我准备好的时候,机会来了。从此以后,我变成了一个相信运气的人。

我相信,越努力,越幸运。

android
阅读 41 发布于 1 月 18 日
赞 收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
程序员吴彦祖
1 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
程序员吴彦祖
1 声望
0 粉丝
关注作者
宣传栏

我是在去年3月份加入腾讯公司,目前是腾讯公司某技术部门里面的一个小负责人,年薪月薪大税后概30K,谈不上多么厉害,但在回想自己半路出家学习编程,从一个销售到现在终于进入中国互联网顶尖公司,还是有些许感慨。

今天写这篇文章,算是对自己过去一个总结,也分享自己的职业之路。

(一)初入编程

我是12年大学毕业,我毕业于一家非常一般本科院校,大学生活浑浑噩噩,却有无比的幸福,对我来说,那四年是属于魔兽世界的。

有人问过我,浪费那4年时间后不后悔,我都会无比坚定的说,不后悔,那四年我真的幸福。但是在夜深人静,扪心自问,到底后不后悔?只能说有点惋惜,如果当时能够抽出一些时间来,做点更有意义的事情,可能生活会更加不一样。

我现在对游戏的态度就是:我会劝很多学弟学妹,最好别玩游戏,玩游戏真的没有意义,除非你将来打算走上电竞,当一个电竞选手,不然很浪费时间,你用游戏的十分之一去看书,收获到的都会比游戏里面得到的要多。

大学毕业后,我第一份工作是销售。

我的本专业不提也罢,因为我现在自己都不知道那是个什么东西,不过我还是拿到毕业证书。由于先天的不自信,我选择了销售这个岗位。

这是非常多大学毕业生,刚毕业的时候都会选择的岗位,在这里倚老卖老,劝一句:如果你真的喜欢销售这个岗位,那么选择销售肯定没问题,如果你只是因为不自信,那么就大错特错,去尝试投点简历,做好面试准备,可能会有意想不到的收获。

我选择销售,是一条弯路,那段岁月特别难受,很大程度是因为我性格的关系,再加上不喜欢销售团队经常的打鸡血和洗脑,最后离开这个销售这个行业。

但,这是非常难的一条路。

不干销售,那么我能干嘛?那几个月我一直在考虑这个问题,那段时间我非常迷茫,我换了好多家公司的销售岗位,做一段时间,再离职,再去做销售,再辞职,犹如一个死循环。

直到我一个朋友让我尝试学习Android开发。

那是一个星期天,他来找我聊天,那天晚上,我们在农大旁边的闽江,一边看着隔壁技校妹纸的大白腿,一边喝着酒,痛哭流涕,哭什么我们不知道,大概可能也许,我们一直没做好独立面对这个社会的准备,以至于到处碰壁。

反正,就这样,在和他聊过后,我开始学习Android开发。

最开始,我对Android非常恐惧,因为我觉得学习编程好难好复杂,那么多密密麻麻的代码,让人望而生畏。

初学编程,最重要的就是“驱动力”。而这个“驱动力”是由两个东西带动的,一个叫做“勇气”,一个叫做“兴趣”。

一旦你对这门语言实用性产生兴趣,那么学习起来真的不难,另外一个就是勇气,别害怕碰到难的知识,一定要想办法尝试挑战,如果真的觉得自己无力解决,那么就看视频,买书,请教别人。

在那段时间内,我学习编程的热情前所未有的高涨,就跟当年玩魔兽世界一样,非常充实,我自己能够感觉到自己慢慢变强了,而这种变强不是依托在一个账号上,而是我自己变强。

(二)找工作

对于我这种自学编程的人来说,找工作绝对是一个非常非常大的挑战。

但是,我已经做好了再也不做销售的决心,所以我当时第一个目标,就是不管工资多少,不管公司多么不好,先找到一份工作再说,至少,先入行。

虽说我已经有了足够的心理准备,但现实更惨烈,整整一个月,一个面试通知都没有,那个打击是真的很大。

不过,打击归打击,该投的简历还是要投。

在一个周四的下午,我接到一个面试通知,至今我都记得,当时我的手绝对在颤抖。

那是一家手游行业的公司,要做一个游戏APP,当时这家公司的Android开发突然就不干了,再招人又来不及,刚好看到我投简历,就打电话叫我过去面试。

面试过程很短,面试我的是技术部经理,问了几个简单问题后,说:“你什么时候可以上班?”

我说:“随时都可以。”

他说:“那你现在就上班吧,那边是你的工位。”

就这样,我得到第一份编程工作。现在回想起来,我能够得到这份工作,最大最大的因素,就是坚持。

在这个过程中,我做了很多努力,比如修改我的简历,了解每一家我投递公司的项目需要,再认真写好我的每一份投递的求职信。

虽然,在当时外人眼中,那样其实没有什么意义,但是我知道,只要去做,就一定有意义。

(三)职业进阶

对程序员来说,最重要一定是工作经验和项目经验。

有人说,不对,应该是学习!其实这个答案和我上面给的答案是一样的,因为当你在积累你的工作经验和项目经验的过程中,其实就是一个学习的过程。

我的第一份工作,对我来说,是通过项目来学习的,而且这是最有效的!这是很多在自学编程的小伙伴,没有意识到的问题!

大家学习的理论知识都一样,但是最快速、最有效的方式,一定是多敲代码,多看别人的代码。

当时,我花了大概2个月时间,快速成长,当然这得益于我的勤学好问,碰到你无法理解的问题,一定要先尝试思考,然后再去求教他人。

当时如果项目非常着急的情况下,请立即把问题抛出来,求助他人,因为你是在为公司的项目负责,而不是个人的自我学习。

每天来回的一个小时里面,足够我看完一些技术文档。

当我想尝试其他语言基础知识,或者做点好玩的东西,这段时间对我来说非常重要。

因为我在回家后,就知道我应该做什么,怎么做。

会不会很枯燥无味?老实说,肯定会!曾经有一段时间,我在公交车上每天看的是“今日头条”,今日头条确实非常棒,他本身的算法太可怕,一直推送你喜欢的内容,以至于后来很长一段时间,我都没敢打开力扣学习。

好在我这人幡然醒悟的比较快,因为我很清晰的知道,我要的是什么,那就是让自己变强,因为你变强后,你才有资格得到你想要的。

有些人只会抱怨,怨天怨地,我想说的是,在那个过程,你已经浪费了很多时间,比如看完一篇python的爬虫文档。

一直保持海绵体的吸收知识,不仅让我自己看到自己的进步,也让我快速在职场里面脱颖而出。

我在第一家公司呆了大概2年后,我跳槽了。

那个时候的我,非常自信,我有有足够的资本自信,因为这两年,我一直在进步,kotlin、第三方开源框架、framework、高级UI、数据结构、NDK、flutter等等,还有其他编程语言我也有所涉略。

这边给各位小伙伴一个建议:

一定是中高级的Android开发,才有市场,一定要自己动手做点小项目,再去找工作。

另外,Android的职业规划之路有很多,全在于你是否愿意继续学习,因为后面可拓展的技术太多了,比如上面提到的flutter。

(四)入职腾讯

我在跳槽后,进入一家很知名的网络公司,那个时候,我的水平,离进入腾讯的技术员,还有一定的差距。

主要的差距在于,基础理论知识!

越是大公司,越重视程序员的基础知识,这也是非科班出生程序员的致命痛点。

那么是否有办法补救,当然有,那就是:看书、刷题库。

看书和刷题库是最有效弥补基础知识的方式,我自己整理了一套面试题,里面有历年各大知名网络公司的面试题,百度、腾讯、阿里巴巴、美团、滴滴等等都有,其实这些公司的面试题,都是非常基础的知识。看到这些题,你就知道我花了多少精力了。

再跳槽到第二家公司,我是我们公司Android开发的小领导,在繁忙的工作中,每天我必定抽出时间继续学习。

有很多程序员容易满足,不会主动去学习,直到他们需要用到的时候,才开始翻书学习,这种态度不是说不行,只是在我看来,有点懈怠了。

程序员是一个需要不断学习的岗位,同时程序员也是一个高薪的岗位,所以这样容易滋生懈怠,其实这样未尝不可,只是如果你想站在更高的平台,那么不要停止学习,哪怕每天只是学一点点。

后面的事情,顺理成章,19年,我开始规划自己入职腾讯的计划。

除了刷腾讯公司每年的面试题之外,我还认真的了解腾讯技术部门的架构,以便清晰的知道,如果自己要进去,自己应该负责哪些事项,同时,这些事项需要拥有哪些技术的程序员。

在一切做好准备后,我去面试的那天,游刃有余,我丝毫不觉得我在面试一家多么厉害的公司。

下面分享我的面经:

一面(1h):

谈谈你学习过的架构模式 MVC MVP MVVM 一个Union类型,共有一个int类型、Float、Double类型的字段,请问在32位的CPU创建时需要占用多少字节? Union和Struct的区别 谈谈你所了解的C语言的内存管理 说说你了解的程序设计模式,知道多少说多少 说说TCP和UDP的区别,你认为QQ的实现是使用TCP还是UDP? 谈谈你了解的C语言的编译过程

8 . 进程和线程的区别

谈谈你对Viper架构模式的了解 Fiddler的工作原理解释一下 死锁产生的原因以及解决办法 进程的调度算法有哪些,分别解释一下? Android程序共享数据的方式有哪些? Android的性能优化 Handler和HandlerThread的区别 八皇后问题了解过吗?具体怎么实现的? 解释一下异步编程,说说它的应用 Android应用的启动过程

二面(40Min):

1.  多线程了解吗?

多线程如何实现通信? 多线程如何实现线程安全? 多线程如何实现同步机制? 进程间的通信方式? 谈谈你对架构模式和设计模式的理解。 现在让你设计一个字典,说一下你的设计思路。

三面(3.5h):

请你画出MVP架构图,并解释一遍它的运作流程。比如网络操作 解释一下页面展示数据获取的数据来源。 多线程会导致什么问题,应该怎么解决? Android进程的优先级是怎样的? 说一下Activity的生命周期 onStar和onResume方法的区别是什么?什么时候用onStart,什么时候用onResume. 说一下冒泡排序的区别? 冒泡排序最优的时间复杂度? 一棵没有特定顺序的二叉树,如何存放在文件中? 手写代码,给一个int的数组,将其移动k位(使用交换的思想)。如array = [1,2,3,4,5], k = 2, 则移动后的array为[4,5,1,2,3] 设计QQ传文件功能,并画出模块设计图。 说一下防火墙穿越的实现原理 加密算法和加密原理 Https实现原理 手写代码,无限大整数转16进制 讲解一下登陆时密码加密过程 推理题

宴会上,人们都带着白色或者黑色帽子,其中至少有一个人带黑色帽子,每个人都能看到别人帽子的颜色,看不到自己帽子的颜色。假设每个人都足够聪明,如果在熄灯的时候你觉得你自己带了黑色帽子,就鼓掌。第一次没人鼓掌,第二次没人鼓掌,第三次有人鼓掌。请问有多少个人带了黑色帽子。

Hr面(20Min)

1.自我介绍

你认为你身上最显著的三大特征是什么? 产品、薪资、个人发展、平台、地域等等  选择你认为最重要的三个?并解释为什么?

4.你除了腾讯还有面试别的公司吗?为什么选择腾讯?

5.家住哪,倾向在哪个城市工作?

6.介绍一下你的社团活动经历,说说印象最深刻的一次。

7.说说你的实习经历

8.你对待加班的看法。

9.说一说你接触过腾讯哪些产品,并说说他们的特点。

10.你如何看待腾讯、百度、阿里巴巴这些公司

最后

其实进入腾讯公司,只是结果中的“果”,而一切的“因”,是我之前的积累。

想要得到多少,势必就得付出多少,这是我一路上来最大的感悟。

在准备期间,我刷了大量的Android大厂面试题,在前段时间做了一个整理,内容更加详细了:

1.2020腾讯Android面试真题解析

2.2017-2020字节跳动Android面试历年真题解析

3.2020阿里巴巴Android面试真题解析

4.一线互联网三方源码高频面试总结

5.Android Framework精编内核解析

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。

有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。

我很幸运的是,当我准备好的时候,机会来了。从此以后,我变成了一个相信运气的人。

我相信,越努力,越幸运。