系统设计面试指北

转眼也毕业四年了,期间跌跌撞撞,但好歹也是一路在向前成长,职业成长算是冲破重重迷障,进入了一个良性循环。最近一直在思考如何突破当前职业困境,实现快速发展,于是总结了一系列的职场思考。本文内容多是针对像我一样,毕业工作3-5年的程序员,希望能对你有帮助。

硬实力

作为一个已经工作多年的程序员,是什么让你有别于那些初来乍到的程序员小白,一个很重要的区别,就是你在这个领域已经深耕多年,必须努力去成为某一块领域的专家,即你必须要有足够和你的工作年限相称的硬实力。

所以,我把这个几乎各行各业都适用并且已经老生常谈的真理放在第一点——一万个小时的刻意练习。

proactive

英语里有一个词,叫做“proactive”,我觉得它的释义非常好:

taking action to make changes yourself rather than reacting to things that happen.

你在程序员的日常工作中,到底是只应付领导安排的工作,一项一项的完成,还是在工作中有自己的思考和总结,主动去做更有价值的工作。

举个最常见的例子,比如说开发的系统出现了一次线上事故,普通的程序修完这个bug就完事了,丝毫没有更深的思考,这也是缺乏责任心的表现。

稍牛逼的程序员,会评估下这次事故的影响面,把事故的影响数据做一个修复,同时做好相关测试,以防止这类bug再次发生。

更牛逼的程序员呢?他大概会

  • 会举一反三的思考,当前系统还会有哪些隐患,怎样杜绝这列情况的发生
  • 甚至会深入阅读底层代码,分析核心问题所在,防患于未然。
  • 整理文档,总结经验,并且分享给周围同事,帮助团队在代码开发上做的更好。
  • ……

当前系统中所有做的不好的地方,都是你值得把握住的成长机会,也是你能够超越同事的杀手锏。

任务分级

吴军老师说过一个“伪工作者”的概念:在Google内,上述这种每天应付事务性工作的人被称为Pseudo Worker,直译出来就是“伪工作者”。这些人每天把自己搞得很忙,他们所做的工作可能也是公司里面存在的工作,但是那些工作(也被成为伪工作)不产生什么效果。

程序员是智力密集型岗位,但很多人把它当成了劳动密集型岗位。作为一名有了一定工作经验的程序员,我想你一定不会满足于CURD的开发的,然而必须承认的是,公司项目的80%的代码都是业务开发。

程序员都是讨厌重复的,要学会抵制重复和简单任务的诱惑,它们对你的成长毫无帮助,千万不要把自己陷入这种”麻木的充实”当中。如果只是满足于这些日常开发任务,久而久之,便会逐渐失去竞争力,被更年轻的程序员所替代。

要让自己保持竞争力,就要在公司里主动承担更有影响力的工作,学会安排当前工作中的优先级,重点关注那些更有价值,更能提高开发效率的工作。即使这些工作会让你感到困难,但一旦把握住了,这就是获得成长的机会。

公司与个人

我曾经在某个求职app上,专门看员工对他们公司的评价。我发现一个现象,无论是什么样的公司,下面的评论里90%都是负面的。

我自己也有这样的经历,只要在一个公司待久了,就会发现有很多不尽人意的地方,有种“不配自己”的感觉,想着到更牛逼的地方去。

毕竟如果公司没有完善的培养体系,或者浓厚的技术氛围,你的工作逐渐激情是下降的,你能学到的东西也是边际效应递减的。

但是,以上指针对一般的程序员,作为一名出色的程序员,应该有着强烈的自驱力。

公司的项目中带给你的成长是有限的,不要指望能从公司的项目经验中得到提升,大部分的提升还是在于自学、系统性的学习,以及不断的追问,和持续的输出。

功夫都在课外,如果那你认为程序员是智力密集型岗位,那就应该知道,公司支付给你的薪水可不只是上班的8小时,你在业余也必须要求自己不断精进,让自己的技术配的上市场的发展水平。

另外,你也可以把公司的项目当做自己的试炼场,毕竟这占据了我们绝大多数时间,与其只是完成功能需求,不如把自己新学到的只是技能给应用起来,创造更多的收益。这对自己和公司来说是双赢。

“不要总想着国家为你做什么,而要想你为国家做了什么。”——肯尼迪

关系转换

写到这里,可以发现,在工作中化被动为主动是多么重要的一件事,毕竟我们每天算上出勤,有一大半时间都花在工作上,如果不把工作的目的性加强,任由时间流逝是一件多么可惜的事情,尤其是在年轻时宝贵的黄金时间。

我在读陈海贤老师的《自我发展心理学》时学到一点,用关系的视角看问题。

没有人是一座孤岛,人总是生活在关系中。我们能在关系中扮演很多角色,我们的自我就有很多可能性。如果我们总是把自己固定在某个角色中,把这个角色规定的言行举止当作自己的个性,久而久之,我们就忘了自己还有的其他可能性,而我们的自我也很难有进一步的改变和发展。反之,如果我们能尝试很多不同的角色,发现自己的更多面,自我就能得到更好的发展。

所以,如果你只是把自己当成公司的螺丝钉,那你就只能干螺丝钉的活,你把自己认定在这个角色上,也就失去了别的发展的可能。

如果你调整了角色,比如站在项目负责人的视角看问题,或者站在领导的视角看问题,你就会多出很多思路和解决方案,你发现自己能去做的事情也就多了,动力也更足了。

这一思路还可用在你和同事之间,如果你只是满足于分内的工作,那永远只是低层次的码农,而如果你站在团队视角,多去思考如何才能提高团队的代码能力,或者提高小组内的技术氛围,比如主动的输出和分享等等,你就会这些新的角色上发现更多成长的可能性。这其实也是一种利他思维的体现,会使你获得同事们的信赖和帮助,以及提高自己在同事心目中的形象。

买家竞争

关于996的话题讨论也很热,揭示了工人和老板的矛盾,但我想换一个视角看这个问题。

从经济学的角度看,买家和卖家之间从来是不竞争的,竞争永远发生在买家和买家之间,或者卖家和卖家之间。

公司的出现,永远只是给你多一份选择,而作为程序员,我们与周围程序员的竞争,比起和老板间的对抗,会更为激烈。

一家公司可能不会持续很久,但你的简历会陪伴你很久,每个人都在为自己的简历打工,想要脱颖而出,就要比同行做的更好,在市场上获得更高的议价能力。

另外,一般越容易996的地方,也是资本越密集的地方,也会愿意支付更多的劳动成本。

想明白这些,我想,程序员该朝什么方向去努力就不用多说了吧。

积累技术广度和深度

如果工作多年,你还是掌握只一门语言,或者一个方向,那带给你的提升肯定是不够的。

比如我自己,工作中主要用python,但如果只是擅长python,就不满足于未来的发展了。最近也在深入学习前端和Go语言,多几把板斧,多一些竞争力。

提升深度,就要更去关注源码、性能、算法、架构、底层。如果公司没有条件帮助你提升这些,就要自己主动去学,别怕辛苦,这是获得进阶的必经之路。

目前想要面试进大厂,算法能力越来越重要,这是每一个程序员都要过的一个关卡。

leetcode刷题要养成习惯,我常常刷题有一种挫败感,然后便会放弃,这也是大多数人都会面临的窘境。其实,很多题不多做几遍,是不可能完全掌握的,那些高手都是一步一步过来的。也许做第一遍只是学习别人的思路,第二遍还是不能上手,坚持多做几遍,直到融会贯通。

学生思维

16年刚毕业时,在知乎上的看到一个关于学生思维的帖子,https://www.zhihu.com/question/41365485,当时觉得触目惊心,因为里面提到的各种学生思维,比如不会反馈,不会合作,被动接受等等,我基本上全占了。

现在回看这个帖子,值得庆幸的是,这些弱点我都已经克服了。从小被应试教育荼毒颇深,花了很大的精力才把身上的这些弊病给净化,从而获得了宝贵的成长型心态。相信亡羊补牢为时未晚,此刻正在正确的轨道上策马扬鞭。

如果你作为一个工作三年的程序员,依然身上还保留着许多学生思维,那可真是贻笑大方了。

工作三年VS读研三年

这也是一个很经典的讨论了,我的观点是,两边都可以列举很多优缺点,但完全不在一个维度上对比,没啥意义。

更有可比性的方式是,毕业三年的你,是否已经比同样毕业三年的程序员优秀。

比如,可以翻看市场上招聘岗位上对毕业1年,3年,5年的程序员的不同标准,你真的达到了吗?如果发现自己工作几年跟刚开始工作的小白没什么优势,那可就要小心了。

我之所以特地把这个拿出来讨论,是因为社会是很残酷的,在你相应的工作年限里,究竟有没有达到相应的水准,很大程度上决定了用人单位愿不愿意要你。换句话说,在你刚开始工作的时候,竞争就已经开始了,这是一场跟自己的竞争,你必须要保证在这个赛道上的每个阶段达成相应的成绩,否则会输的很惨。

所以,本科毕业选择工作的本科生,他们不是跟同一届读研的本科生比,更不是3年后的他们跟3年后的研究生同学比,而是他们要跟当年同一届同样选择出来工作的所有研究生、博士生比。这就是现实。

重新回到上面这个讨论,如果有个应届生问我,该是选择读研或工作,我给他们的建议是:如果你决定了去工作,那就在做这个决定前,先问问自己,你究竟有没有形成能让自己在工作上快速成长的能力。

当然大部分应届生都是不懂这些的,毕竟社会和学校完全不一样。

个人品牌

对于程序员来说,个人品牌就是你技术影响力的体现。

哪怕做不到github上有闪光的项目,也可以选择低成本的坚持写技术博客的方式,去总结和输出自己的观点,主动输出永远是最好的学习的方式。

木桶原理不适用于程序员,你只需要去把自己最擅长的地方去做专做精,面面俱到却哪里都不突出的半吊子不可能成功。为了一个技术梦想,为伊消得人憔悴,孜孜不倦的耕耘,并且享受着收获的喜悦,我认为这样才是一个技术人最好的状态。

此外,不能闭门造车,如果有机会,就多去参加技术大会,多做联结他人,不固步自封,不孤芳自赏,要往更高更远更深的地方飞去。

坚持+信念

最后,洒一点鸡汤。

我认为成长是一个人生目标愈来愈清晰的过程,随着经历世事沧桑,浮沉跌宕,你看事情的眼光也逐渐明亮,会摒弃很多的妄念,并且变得专注,明确自己的方向。

给自己顶一个目标,无论是成为很牛的程序员,还是跳槽到更好的公司,还是提升自己的技术影响力,如果你真心有这个目标,那我相信,没有什么东西能够阻挡你,你甚至会发现全世界都会来帮你。精诚所至,金石为开。

希望大家都能成为自己想成为的人,有所追求,有所舍弃,但在已经决定追求的事情上绝不放弃。