从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路
我是在去年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):
多线程了解吗?
多线程如何实现通信?
多线程如何实现线程安全?
多线程如何实现同步机制?
进程间的通信方式?
谈谈你对架构模式和设计模式的理解。
现在让你设计一个字典,说一下你的设计思路。
三面(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高级研发——一个半路出家菜鸟的艰难逆袭之路的更多相关文章
- 一个吊丝android个人开发者的逆袭之路
转眼间,一年多过去了,记得我开发第一款android应用的时候,那是在前年的冬天,我本人是做java的,android的学习和开发完全是业余爱好,从前年上半年到前年下半年大约花了半年的业余时间把and ...
- 腾讯面试Android高级岗,居然被一个多线程基础面倒了?
前言 一个在深圳从事开发五年的老友一个月前从原公司辞职后,昨天去腾讯总部面试Android高级岗,一面的时候,自我介绍后,陆陆续续问了很多问题,有着五年的从业经验很多项目开发的技术问题都回答的很通顺, ...
- 转:探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
前言 相信这样一个问题,大家都不会陌生, “有什么的方法可以使Android的程序APK不用安装,而能够直接启动”. 发现最后的结局都是不能实现这个美好的愿望,而腾讯Android手机游戏平台却又能实 ...
- 探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
前言相信这样一个问题,大家都不会陌生,“有什么的方法可以使Android的程序APK不用安装,而能够直接启动”.发现最后的结局都是不能实现这个美好的愿望,而腾讯Android手机游戏平台却又能实现这个 ...
- 好程序员打造核心教培天团,着力培养IT高级研发人才
随着数字化进程加快,各行各业数字化转型迫在眉睫,技术人才战略成为企业发力重点,IT高级研发人才已经成为企业的"核心资产",对企业发展起关键性作用,然而市场上高级研发人才极为稀缺.据 ...
- Android高级之第十一讲Hybird开发
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着移动端应用平台的兴起,需求和交互方式的多样化,H5开发逐渐在移动端流行起来:常见的移动产品有We ...
- Android 高级UI设计笔记07:RecyclerView 的详解
1. 使用RecyclerView 在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- Android高级开发专题晋升班
Android高级开发专题晋升班 适用人群:1-3年以上经验的开发者丨学员平均薪酬20K/月
随机推荐
- Gitlab触发jenkins并获取项目post参数
jenkins -- Generic Webhook Trigger插件 此插件是git webhook的高阶应用,安装后会暴露出来一个公共API,GWT插件接收到 JSON 或 XML 的 HTTP ...
- 实例化Class类的5种方法
实例说明 java的数据类型分为两类:基础数据类型和引用数据类型.对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象.它提供了在运行时检查对象属性的方法,这些属性包括 ...
- 企业该选择什么样的CRM系统
不论您是需要CRM系统来优化业务流程,还是准备更换一款新的CRM系统,在这之前都应该先明确企业的需求,并了解CRM的哪些功能能够对企业有所帮助.例如,企业的管理者想了解每个销售人员的业绩情况,那么就应 ...
- 暑假自学java第七天
1,Object类: 任何类的父类都是Object 任何子类的对象都可以赋值给父类的引用.任何类的所有实例都可以用Object来代替 (3条消息) java中的Object类_iqqcode-CSDN ...
- Java:java -jar命令讲解
1. 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 #正常启动jar包 java -jar XXX.jar#当前ssh窗口被锁定,可按CTRL + C打断程序运行, ...
- Mybatis学习(4)实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...
- 在docker的镜像中安装vim
在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时 ...
- Java实验项目二——小学生考试系统(简单四则运算)
Program:设计实现一个小学生数学考试系统,完成随机出题(简单的四则运算),学生答题,自动判分的功能. Description:代码如下: 1 /* 2 * Description:面向考试系统建 ...
- Java | this的本质 和 static的本质
this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象. this的本质 ...
- ARTS第十周
之前忘了发布 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的 ...