今年是转折的一年,很多学android开发的小伙伴失业了,虽找到了一份工作,但高不成低不就,下半年金九银十有想法更换一份工作,很多需要大厂面试经验和大厂面试真题的小伙伴,想提前准备刷下题。接下来分享一份我的字节跳动、阿里巴巴、百度、小米等大厂面试经验和总结。(文末附真题解析大全)
我们再说说第二个话题,程序员职业发展路径有哪些选择?
程序员一般的发展方向主要是几类:技术专家、架构师、技术管理、管理、产品。
接下来通过例子和大家分享以下四种不同的发展路径及适合走这四类路径的人群的三个关键词。
第一类,程序员-高级开发-技术专家路线
我们通过例子来说明。有一位 Z 先生,他2012年从湖北工业大学毕业,而后去了搜狗担任工程师,做了两年后,跳到了另一家公司叫小麦公社,是当时一家风头正劲的创业公司,担任 B 端高级开发,后来去到了因果树担任 B 端的技术资深开发,在今年2月份入职了杭州阿里巴巴,同样是负责 B 端商家后台部门,担任技术专家,他职业规划最大的亮点是找到自己想要专注的领域并且一直坚持至今。
第二类,程序员-高级开发-架构师
再看个例子,H 先生,他2011年北航毕业,而后选择创业做 SAAS 平台当时担任前端负责人,两年后选择加入搜狗成为一名高级前端工程师,后来去到了音悦台担任架构师,目前在一家创业公司担任前端架构师,他职业规划的最大亮点是在前端领域各个方向都深入见解,而后负责多条产品线的架构设计。
那以上两种技术路线有什么不同呢,应该如何选择呢?
技术专家,是偏理论研究的,对某个或某些相关的专业领域深入了解,能直接或通过提供思路间接解决这些领域的各种问题。
架构师,是偏工程实践的,与技术专家的区别在于它需要一专多能,提供方案解决问题已经不是它最重要的价值,它的价值体现在选择性价比最高的方案;
举个例子,其实你可以把技术专家和架构师的区别类比成科学院院士和工程院院士,你要搞一个语言识别,那是理论,你要做一个 Siri,那是工程。而你,更擅长和向往做语言识别技术还是 Siri 呢?
有些同学可能会说,我的最终目标仅仅是成为一个优秀的程序员,那我想知道你能做到以下 3 点吗?
写的程序不需要格式化,也是非常标准的,我见过很多程序员写的代码,连空格的使用都没有标准,从上到下给人的感觉就是一片混乱的字符的组合,好的程序应该像诗词,在格式的约束下追求飘逸。
写的程序没有无用的代码,其他人来评审时找不到无用的代码,也无法在保持同样阅读性的情况下进一步精练。
在可读性与效率中保持平衡,通常情况下我们优先考虑可读性,但是对于频繁执行的部分,可以牺牲可读性保证效率,但需要书写足够多的注释,注释不要说代码的用途,而要说自己写代码时思考的内容,我就曾经见过有人把一段代码使用自己的思想来改写提高可读性,结果这个代码的目的是越精简越好,这其实就有点好心办坏事了。
如果还不能做到以上几点,那就好好做好明天的事儿就好了,暂时什么都先别想,因为成为一名优秀的程序员是技术路线的基础。
接下来说说第三类,也就是管理路线:程序员—资深工程师—技术经理(技术管理)—技术总监(管理)—CTO(管理)
我们再来看个例子。Q 先生,他在 30 岁就成为了某知名共享单车公司的 CTO,说一下他的职业规划,2009 年首都经理贸易大学毕业加入一家创业公司担任开发移动端工程师,两年后加入 360 担任资深研发工程师,而后加入新浪微博担任移动端部门的技术负责人,而后加入了宜信担任技术总监,在去年 7 月加入共享单车公司担任 CTO。他职业规划的最大亮点是一直在核心业务上往技术管理进阶,最终成为一名优秀的管理者。
谈到这类管理路径,必须要说明下技术管理和管理的区别,技术管理是事情为中心,管理是以人为中心,技术管理主要工作是保证事情能按时按质完成,管理需要考虑团队的士气和稳定性、阶梯性。
最后说一说第四类,也就是技术转产品:程序员—高级开发-产品技术—产品经理—产品管理
在这里,X 先生带来一个海龟码农成功转行产品经理的故事,2009 年毕业于美国工程类名校普渡大学,而后回国在一家外企担任开发工程师,一做就是 5 年,2014 年一个幸运的机会加入了腾讯,当时腾讯面试了 7 轮,拿到了 T1-2,月薪 1W2 的工程师 offer ,基本是刚毕业一年左右应届生的水平。在腾讯主要做手机 QQ 红点系统,做了两年,他从未抱怨。他也给我们展示了所谓“红点”,其实就是手机 QQ 上不同接口旁的红点引流。手机 QQ 流量日活上亿,但是会点击那些游戏、商城、音乐等接口的用户大概只有1%,红点主要就是吸引那些有强迫症的用户点进去引流。从最开始的红点数量的改进,到后面根据不同属性用户设置不同红点,再到后来和其他产品合作比如京东商场,搞红点的竞价排名……就这么一个小功能腾讯专门养了一个团队去做,对于 BAT 这种大公司来说,一个小的模块和功能的改进能带来很大的利润,很多人常年都在做很小一个模块的重复工作,很难独立完整去做项目,里面闲人很多。
所以工作两年后,X 也想做点商业化的东西了,给部门老大反馈了想法没得到支持,在内部其他部门也争取了问了一圈没能成功转岗,于是就想出来,不想继续在腾讯里面慢慢熬晋升了,从腾讯出来是那年是 2016 年3月,T2-3。而后入职了一家投资公司,以产品经理的身份加入,两年过去了,目前已经成为了一名高级产品经理。他职业规划的最大亮点是深思熟虑后立刻决定和行动,没有犹豫,而机会往往更容易留给有准备和有勇气的人。
谈到技术转产品这类职业规划路线,和大家说说开发转产品经理需要锻炼哪些能力
1.商业思维
开发人员以前是和机器打交道,产品经理给出一个需求就按照那个需求做了,从来不想着为什么这样做,做这个需求想达到什么目的,从来没想过你开发的 App ,你做过的程序老板是怎么用它来赚钱的,这就是你转行产品经理要锻炼自己的第一个能力,培养自己的商业思维,培养自己发掘用户需求的能力。产品经理是站在用户的角度考虑产品,以用户为中心。所以技术人员转产品经理要摆脱技术思维,多想想用户的使用习惯,多想想产品的商业目标。
2.沟通表达能力
程序员给别人的印象一般都是木讷,沉默寡言的,也难怪,程序员都是在和机器打交道,不是销售那种和人打交道的工作,不需要说太多话,不需要撕太多逼。而产品经理的工作要和很多部门打交道,要和运营、技术、设计、市场推广等各个部门打交道,在产品宣讲的时候要清楚的向他们传达你的需求,当产品上线你需要给客服培训,这些都需要你有较强的语言组织和表达能力。
3.文档能力
程序员的工作就是码代码,代码是用英文编写的,只有在给代码注释和写产品说明书的时候才写中文,而且写的也是一些琐碎的内容。如果让一个程序员就某一个主题写一篇文章出来,我想大多数程序员可能无从下手。而产品经理工作中要写很多文档,商业需求文档,市场需求文档,产品需求文档,产品说明书,文档表达能力在工作中很重要。
4.项目管理能力
好的产品经理需要一定的项目管理能力。需要推动产品按照正常的步骤,规定的时间,按质按量的发布上线。这里就涉及到,整体管理、时间管理、团队管理、需求管理。整体管理:包含产品从分析规划到产品开发到产品上线运营到迭代优化的全过程进行管理。时间管理是指主要是计划监控跟踪项目进度,把握关键时间节点,确保产品按照规定的时间上线。团队管理:产品经理需要协调很多部门,有技术,设计,市场推广,运营,产品经理是一个无授权的领导者,你多数需要通过自己的影响力,自己的沟通技巧来协调项目的各个成员,所以需要一个相应的团队管理能力。需求管理:包含各个部门反馈的需求,以及自己收集的需求,需求的变更,需求的跟进等。
所以,你觉得你在以上四个能力上有天赋么,有天赋并且你也有意愿放弃技术成为一个产品经理的话,那就一个原则,就是趁早。
好了,以上就是我们的第二部分,程序员职业发展路径有哪些选择,希望大家可以及时对号入座。
接下来我们聊聊第三个话题,也是比较关键的核心话题,如何结合自身优势做好职业规划?
这个问题实质上其实是要求我们把两件事做好,一是如何增强自己在众多程序员中的竞争力,一是如果保持方向感
先来谈谈如何增强自己的竞争力
1.拓宽业务场景
我们会在很多场合听到对“精钻”这个词语的推崇,包括在职场上,我们常常听到前辈教导我们对待工作要精益求精,但事实上,在某一方面做到万里挑一的大牛是一条可取的道路,却不是职业发展的唯一道路。
尤其是对于那些未来的职业发展规划是进入明星创业团队担任技术负责人的程序员来说,在之前的积累过程中寻找机会尽量多地接触各类业务场景并寻找解决方案,可能是一条更可行的路径。
这里的业务场景分为大业务场景,也分为小业务场景。大业务场景即不同的细分行业,如电商、内容、视频、共享平台等等。我建议程序员们在进行工作选择的时候不要被自己原先所属的细分领域太过限制,认为自己原来在电商公司以后也必须在电商公司。事实上,多去尝试不同领域的公司,去了解不同领域的公司在技术实现上有什么异同,对于程序员更深入地理解技术是很有帮助的。
尤其是当今行业发展日新月异,某一细分领域很难在一个人 15-20 年的职业生涯中一直处于蓬勃发展的状态,如果之后又出现了新的细分市场,复合背景积累的经验会帮助程序员快速切入到新的细分市场。
而小业务场景则是指同一个技术在同一家公司的不同业务范畴。例如算法方向,可以分为排序、推荐、NLP、图像识别和用户行为研究等,攻坚某一领域是一条发展路径,但横跨不是一个领域也是一条发展路径。这就需要程序员自己把握机会,不断跳出舒适区去承担新的业务和需求。
比如曾经有位陈先生,他之前在 BAT 某公司任职 6 年,担任算法方向的程序员。由于之前 6 年公司业务增长很快,陈先生在不同的研发 Team 都参与过项目,因此在广告、排序、推荐、NLP 和用户行为研究领域都有一定经验,但却没有深入的研究。对此他自己也在跳槽的时候表示过担忧:“业务在哪儿需要就打到哪儿,什么都会一点,什么都不精。”
然而没想到的是,这样的背景非常受中小型互联网公司的欢迎。在经过了几家面试之后,最终陈先生拿到了一家已经 D 轮融资的公司算法负责人的 Offer,薪水也比之前有了大幅度提高。
如果没有这样的机会,也可以做到在某一方面非常精通,然后对其他方面有所了解,将自身培养成“T 字型”人才。
2.把握职场节奏
在职场上有一个时间标准:3 年。 3 年时间,一定要在工作内容和职级上有一个质的变化,这个变化可以通过升职得到,也可以通过跳槽达成目标。
初入职场的 3 年,主要的工作内容就是夯实基础,此时基本处于“完成上级交付的任务”这样的阶段。但在这个过程中,员工不能仅仅完成任务了事,而是要不断思考为什么上级要布置这个任务,这个需求是怎么来的,用于解决什么问题,有没有更好的解决方案等等。
之后的 3 年,也就是职业生涯的 3-5 年,作为程序员,需要达到一个小 Leader 的层级,即带领一个小团队(可以仅仅有几个人)负责某一个模块或是功能的研发,此时在上个阶段积累的经验和关于解决方案的各种想法的作用便凸显出来。而此时作为小团队负责人的角色,程序员更多地需要关注上下游的逻辑,能够形成完整的逻辑链条。
工作经验的 5-8 年,此时程序员已经成为了技术负责人,可以独立负责某一个产品的研发,可以成功地推动产品从 0-1 的阶段,此时更多需要关注的便是跨部门之间的合作与沟通,确保研发行程的按时交付。与此同时,更多地关注一些产品设计方面的内容,会对进一步的晋升很有帮助。
最后一个阶段,即工作 10 年以上,此时达到研发总监或是更高的职位会是一个比较理想的状态,而对于这个层次的要求,是对于整个行业能有比较清晰深入的判断,能够感知未来技术发展的方向并为公司提前布局。
3.训练复合技能
除了编程之外,程序员要尽量培养一些其他方面的技能,例如演讲、写作等等。这样做一方面可以为程序员提供一些兼职机会,如主讲技术相关的直播课程、参考文章或书籍的撰写等。类似的机会在提供报酬的同时也会增加员工的知名度和行业影响力,更有甚者,在社交媒体上发表了相关文章之后,吸引了一批志同道合的同行,开始合伙创业,有了更大的机遇。
就算没有这些额外的收益,复合技能的人才在公司内部也会受到青睐。
比如某知名互联网企业的程序员张先生,由于他在面试时给 HR 看了自己在知乎等技术论坛上的文章,因此入职之后 HR 邀请他参与公司每周五下午的技术分享会并作为主讲人之一。
刚开始张先生还很犹豫,毕竟本身的工作内容已经很繁多,很怕接了这个任务之后力有未逮,反而影响了自己的开发进度。但后来因为同事的鼓励和 HR 的反复邀请,张先生还是答应成为主讲人,并且利用每周末的时间准备讲座材料。
因为在技术分享会上的良好表现,入职后不久,张先生被上级重用并在一年后得到了升职。
4.保持紧密沟通
有些程序员认为自己做的是技术性工作,只要写好代码就可以了。这是错误的认知。根据过来人的经验,那些有意识在工作之余关注行业动态,积攒人脉资源,并且乐于与同行沟通的程序员,往往在职业发展的路上走得更远。
一方面,程序员可以通过这些方式随时评估自己在市场上的价值和优势,当行业和技术的风向发生转变时,及时对自身查漏补缺,避免被时代抛弃。另一方面,人脉资源的积累,有时也能对自己下一次换工作起到雪中送炭的作用。
可见,行业信息、公司动态的互通有无对于职业发展有着至关重要的影响,准确地把握行业动态有助于员工抓住一些转瞬即逝的机会。
而对于信息的获取,自己的朋友、前同事、公司 HR 还有靠谱的猎头等,这些都是可以利用的资源,同时也可以参加一些展览、峰会等线下活动。尤其对于那些自己感兴趣的技术方向,尽量积累一些人脉资源,一次有效的内推往往比海投简历更有效果。
接下来我们再来谈谈如何保持职场方向感,也就是如何在职场这片海洋里航行到最适合我们的一个又一个目的地。
首先我们要知道目前的职场海洋是什么样子的,更重要的是知道它正在发生着哪些变化。
不得不要正视的三个变化。
一是整个行业的人才储备越来越充裕,相关专业的毕业生数量逐年提升,并且质量还越来越高。
就拿 2016 年的数据来说,根据教育部的统计,2016 年有高校毕业生 765 万人,为历年最高;而与编程相关的专业毕业人数达到了总人数的 8% 以上。计算机科学与技术、电子信息等专业也成为了近年来多所高校的热门专业,不仅每年申请人数众多,录取分数线在众多专业中名列前茅,同时转专业和旁听的人数也是逐年增加。 清华大学 2016 年计算机科学与技术系的转专业录取人数与申请人数比例竟然达到了惊人的 1/40 。
二是互联网行业的野蛮生长时期已经接近尾声。
大型互联网公司的基础招聘需求逐渐萎缩,BAT 等巨头企业 2016 年的校招需求数量均不足前两年巅峰时期的一半,与此相对的是对高端招聘的需求越来越旺盛。创业公司更是面临大批死亡和被收购的困境。以前几年火爆的垂直电商领域为例,随着淘宝、天猫等传统电商的成功,垂直领域的电商在 2014 年顺势而起,然而三年之后活下来的企业少之又少。而共享单车从异军突起到开始收割仅仅是 1 年半的时间。越来越短的行业周期很难继续为基础研发的工程师提供稳定大量的岗位需求。而创业公司的大规模倒闭也戳破了行业中的薪酬泡沫。
三是科技的发展并没有带来岗位的增加,相反,有时意味着岗位的减少。
以测试为例,曾经测试都是以手动测试为主,而如今一二线互联网公司已鲜少见到手动测试,大多都是开发自动化测试工具的测试开发,因而对员工素质的要求大幅度提高,而数量需求则大幅度减少。在人工智能飞速发展的如今,可以预见的是未来很多支持类的研发岗位都有可能被效率更高的程序所代替,而专注人工智能的公司将会把相关技术在行业内大规模普及。
从以上三点来看,我们可以很清楚地得出结论:在需求侧趋于平稳,而供给侧逐渐增加的情况下,程序员之间的竞争将会越来越激烈。
知道大海的样子后,你要知道在航行过程中该做哪些事情让自己顺利抵达目的地。
首先,你得有一个清晰的人生规划,才能有一个清晰的职业规划。
跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
本文在开源项目:【腾讯文档 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
算法题汇总。)
[外链图片转存中…(img-fxP8lN46-1616071275512)]
本文在开源项目:【腾讯文档 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…