你为什么选择程序员这个职业?

写在前面

前几天和两位发小聚餐,我们三个人都选择了程序员作为自己的职业。初始时三个人差不多,往后的十几年开始出现了发展偏差,现在的我们进入到了职业的重要选择点,三个人的选择出现了较大的偏差,幸运的是每个人都走在了适合自己的道路上,感觉应该写一篇文章对程序员这份工作做一个个人理解的分享。

第一句话就问了大家为什么从事了程序员这份工作,我先来谈谈自己的情况。我一直认为,如果勉强自己做一件不喜欢的事情,那么很难有动力在今后的工作中继续前进。选择成为一名程序员,大概是在 16、7 岁的时候,那时候父母给我买了第一台电脑(一台 586 电脑),给自己的内心种下了一颗种子。IT 行业是个知识更新非常快的行业,其他行业也在发展进步,但是相对而言没有这么快的节奏,而我是一个喜欢尝试新事物的人,心理承受能力也还可以,所以程序员貌似会是一个不错的选择。此外,IT 行业的机会很多,也适合我这样的普通人家孩子,站在现在的年纪回顾过去,自己没有选错。

注意,今天的这篇文章,我只是对程序员这份工作所需要面对的问题挑选一些有意思的话题讲讲我的理解,并不是对程序员的职业规划进行分享。本文分为入行前和入行后两个部分,分别聊聊。

入行前

所谓入行前,其实就是指还是学生的你是否应该选择程序员作为你的职业工作、如何获得这份工作。作为一名学生,你真的要想清楚是否程序员这份工作适合你,因为它牵扯的个人精力实在太多,导致你不可能有太多的个人爱好。大家都知道,很多程序员会自嘲称呼为码农,目前来看,程序员是最容易逆袭的职业,码农也是从收入角度最容易逆袭的工作,但同时码农也习惯了自嘲,于是把自己描绘的异常辛苦,总觉得自己赚钱多是应该的,因为太累了。

入行前,作为学生的你们,除了正常的上课、实习之外,还可以通过一些竞赛类的准备工作提升自己的技术能力,此外,一般也需要通过校招进入技术含量较高的科技公司。针对这两点,我分别谈谈自己的看法。

对于 ACM 的理解

以个人的经验,搞 ACM 的学生遇到的问题,有点类似与高中各科竞赛,需要为了竞争而学习比较深层次的知识,拥有大量做题带来的经验,但致命的是除了顶尖高中竞赛选手和顶尖大学的 ACMer 之外,其余所有人学习的知识都不太系统,尤其是数学上的。

大多数人对数学的学习仅仅局限于数据结构 / 离散数学,可能因为 ACM 要有数论题而学习了一点数论和组合数学的皮毛,具体就不会深入看进去了。结果,ACMer 的数学功底并没有因为 ACM 的做题训练而提高多少,对算法的理解甚至可能是仅局限于套用算法模板,这对于未来想从事算法研究的人来说,无论是在公司为了某个任务做优化,还是在研究机构发论文,都会存在致命的基础短板。

ACM 除了算法之外,带来的间接好处是可以提高编程能力,但很明显提升编程能力的主要途径就是编程,至于写什么样的代码、什么语言的代码,区别不是很大。但不可否认,ACM 确实是一个可以锻炼写代码能力的机会。

公平地说,ACM 依然是我接触的大学里所有比赛中最公平、最锻炼能力的。在我看来,ACM 这种准备时间长、比赛时间短、评价体系又比较客观的竞赛,应该是最锻炼人能力也最有说服力的。因此如果想参加比赛,ACM 应该是计算机专业的首选,但并不是说 ACM 有价值,而是 ACM 是否是最有价值的事情,应该也不是,因为 ACM 本身就是一种游戏,它可以让人痴迷,可以让人形成一种容不得别人说 ACM 不好的圈子。不管怎么说,可以肯定的是,ACM 的经历让学生更容易被公司相中,因为“平均水平”高一些,起码觉得搞 ACM 的更有可能靠谱,尤其是编码能力这种无法体现在简历上的实际能力。

参加校招

最近几年读参与了公司组织的校园招聘工作,每次去都会见到大量的学生,我喜欢和他们交流,观察他们的一言一行,为了进一步考察他们的综合能力和性格组成,我每次都会自己准备面试题,这些题目包括了编程基本概念、算法编程题、操作系统、数据库编程、开源代码阅读、垃圾回收机制、系统架构描述、实习期经历回顾、人生过程中遇到过的挫折、对于工作氛围的想法、未来的职业发展方向设定等。

这些问题中其实大多数都是开放式问题,一些是没有固定的答案,另一些甚至于是完全开放式的,需要学生提出问题。我的这组题目中,可能只有编程基本概念这一条有固定的标准答案,算法编程、数据库编程都有多种回答方案,只不过每一种回答的运行效率不同,这些都属于半开放式的技术问答。操作系统、开源代码阅读、垃圾回收机制、系统架构描述,这些个问题则属于是自己出题的题目,为什么这么说?因为我会根据你所了解的知识点一点点地深究下去,一点点往下问,所以这是完全开放式的技术问答。实习期经历回顾、人生过程中遇到过的挫折、对于工作氛围的想法、未来的职业发展方向设定,这四个问题属于非技术领域的完全开放问答,我之所以提出这些问题,是希望能够更加接近学生的真实生活、内心想法,了解学生的过往经历、三观,以及周围环境,这样可以决定是否录用,以及如何更好地发挥学生的能力。

我讲一下自己的校招经历。很多年前,我去参加一家德国企业的面试,总经理是位中国人,50 来岁的老博士,他让我谈谈对于公司情况的了解情况,其实我已经做足了功课,把他们网站上的英文背出来了,我一边背,他一边睁大了眼睛,扶了扶眼镜,还纠正了对于创始人德文名字的发音错误,然后和我说:“你有什么要求,现在就可以提”。

除了实际的技术基础能力以外,我觉得一名学生还需要具备做人的格局,做人不要仅限于眼前利益,不要太实际,不要只考虑自己。推荐大家担任大公司的“校园大使”,这个工作一定要尽自己最大可能做好,积极配合 HR 小姐姐,其实过程中你也在被观察。

这次就遇到了三位截然不同的大使,第一位非常认真,两天时间忙上忙下,布置会场、参与宣讲会、电话联系学生、引导学生面试流程等等,还找了几位好朋友过来帮忙,忙到自己没有时间参加免于,虽然他存在不太擅长于沟通的弱点,但是我在晚上 9 点结束面试后,单独给他留出了面试时间,并且和 HR 一起邀请他加入,他很感激地不停鞠躬。人如果能做到对帮助自己的人心怀感激,这人一定不会差。第二位,面试当天他自己也坐下来面试了,技术一般,他自己介绍是校园大使,我正在犹豫时 HR 小姐姐和我聊起了他,“这个人责任心太差,请他帮忙招呼学生,他都懒得说话,自己管自己玩手机、吃饭,请他打电话联系没有来的学生问问情况,他一脸不屑,好像很看不起我们公司”,“哦,知道了,既然他看不上我么,我们也不用给他机会了”,他就这么错过了一家很棒的公司。第三位,我们面试当天她给自己安排了一天的面试,露了个面后就消失了,等她的事情干完了再跑来想面试,当然,我直接忽视了她。

入行后关于深度思考的理解

我觉得技术能力是可以培养的,而且可能可以快速培养,只要这个人具备深度思考的能力,因为知识体系的建立一定是基于思考之上的,而不会是填鸭式的。

多年来养成一种习惯,或者说不得不养成这样的习惯,就是在夜深人静的时候,静静地思考一天来的经历。白天,大部分时间是在异常忙乱中度过,没有时间思考。夜色下来,一切归于宁静,望着窗外闪烁的路灯,可以静静地思考自己和世界,思考在自己从事的工作中发生的各种各样或大或小的事情,从中找出有意义的东西,做一点小小的思想享受。这种思考,对人是有益的。

一个人做多了自己的职业活动,如果不调整,就会变得单一。思想也慢慢定向,没有开放式的思维方式,所以要在紧张的大脑和肢体活动之余,发现思维的新空间。作为一名软件工程师,我的大部分时间都用在了这个领域,我也发现,生活上的几乎所有细节也可以被放在这个领域里找到对应点或面,此外,程序员也需要从产品、运营方面思考技术,这样才能不断开阔自己的思考方式。我之所以愿意把这些思想“沉淀”积累起来,不是因为它们有特别的价值,而是因为它们是在宁静的外界和宁静的内心状态下形成的,宁静致远,对于拥有技术愿景的程序员来说,这是一个值得追求的境界。

对于工作时间的理解

时间是很值钱的,这种事情很多时候必须是上完学开始工作了才能理解。一个原因是对绝大多数学生来说,工作之后的空闲时间会变少,那么原来业余生活里快感度比较低的事情就不做了,这是因为你的时间可以换来收入,而收入可以用来在空闲时间换取更爽的快感,那么你的选择空间也就更多了。上学的时候,空闲的时间太多,以至于连写东西吐槽、在网上跟人互喷,都能排上日程。

我在一篇描述自我管理方式的文章里不小心说出了自己每天的工作时间(这里说的工作时间,其实也是学习时间,对于程序员来说,所有工作时间都是可以用来学习的,就看你会不会找方法),10-12 个小时,引起了读者的一波评论,我可以肯定的回答,确实是这样的。作为一名程序员,我认为你每周的工作时间应该保持在 60-65 个小时,因为我们这个行业的技术更新速度实在太快了,我认识的所有厉害的大牛都是这么熬过来的,没有人可以用很短的时间学会别人花费很长时间学会的技术。当然,每周的工作时间最好能够控制在 75-80 个小时以内,毕竟一个人的睡眠是需要保证的,也需要有一些陪伴家人的时间、个人娱乐时间。

关于公司的选择

我们发小三人,毕业后走上了不同的道路。一位一直在小型公司作为主力程序员,虽然也去过大公司,但是受不了那里的管理方式,最终选择了走上自己创业的道路,开了工作室。一位进了军工行业的研究所,一干 15 年,已经习惯了固定节奏的开发模式,虽然收入不能和外面的企业比,但是也挺舒服的,准备干到退休。一位在几家大公司干,工作的公司规模越来越大,他也习惯了按照研发流程和技术管理方法论工作,虽然每天需要面对的是激烈的内部和外部竞争环境、技术变更、产品驱动压力,但是也已经习惯了压力,继续着自己的道路。人各有志,也各有各的优劣势,找到属于自己的那一个点,尽力放大吧。

如果你希望自己在某一个或几个领域成为资深码农,你应该选择有技术并且有业务的大公司。技术层面,既要有技术积累,也要有高水平的同事。业务层面,要让业务对基础架构有足够的挑战性。其实当前满足后者的公司比前者多得多,毕竟让大多数互联网公司所做的事情来说,技术都不是决定性的,提前对技术做过于超前的储备大概率会浪费。反过来,假设一个公司有技术积累又有高水平的员工,一旦业务上不去高水平员工肯定会跑,最终只剩下哪些当年技术比较不错的技术人员,长期来看技术早晚要落后。这些原因导致业界很多公司存在业务发展非常快而技术跟不上的情况,去这样的公司也一样有挑战,但做的工作未必系统,而且同事的能力也不见得有保障。

怎么看技术人员话语权不高

一位朋友原先是做分布式数据库的,最近跳槽去了一家做无人车的公司,和他聊了一下,了解他的看法。做无人车和软件基础设施相比,最大的区别是做软件基础设施的技术人员,尤其是搞数据库开发的程序员,很多时候解决的是技术的门槛问题。我们认为数据库的一切问题归纳为本质上是“可用”的问题,对业务来说能扛住压力不丢数据不超时,并且各种功能都支持,这就是“可用”,至于在高并发情况下依然“可用”,那就是“高可用”。一旦把技术问题转化为“可用”的问题,就会让技术变成一个门槛,达不到的话业务受影响,达到后业务做得好或是坏,其实和技术的关系就不那么大了。这也是很多公司技术人员话语权不高的原因。

关于为什么去做高难度的技术

例如像 BAT、华为、小米这样的大公司,对软件基础设施的门槛要求还是比较高的,所以这个工作还是比较有技术含量的,尤其是比大多数实现业务逻辑、项目经理需求的工作有技术含量。就我前面提到的这位朋友的情况而言,无人车有更大的吸引力,因为它更难,难到我们并不确定什么时候才能真正做出来。表面上看它也是一个门槛—一个“可用”的无人驾驶技术,但因为难度足够大,所以有挑战性,必须不断地改善技术,做全球范围内还没有做出来的技术。搞数据库时处理的一些问题可能是其他公司已经解决的,并非“人类”都还没有解决的问题。很多时候需要和其他公司交流,互相借鉴经验,或者看看 Google 这样的领航者是怎么做的。

而做无人车因为这个领域很新,也都没做成熟,不存在谁跟随谁的问题,甚至严格来说并不存在领航者。到了一定程度后,自己取得的里程碑可能就是行业的里程碑了。无人驾驶是刚需,谁做出来谁赚大钱。相对应的,有些创业项目是解决了不存在的需求,有些项目是解决了存在的需求但不怎么赚钱。无人车是存在的需求,市场规模很大的需求,技术含量很高的需求。无人车并不是今年才有的,但在这个行当的人也不算太多。这个时候去做,虽然不算什么行业先驱,但是也亲身经历了行业比较初期的发展了。当然无人车本质上也是个大数据的行业,必然还会涉及到数据的存储、计算等等,这不就更棒了嘛。

另外,这个世界的进步,尤其是科技进步一定是需要聪明人去推动的,聪明人集中的地方进步就会快。冷战的时候搞军备竞争、太空竞争,*大规模投钱搞,自然聪明人集中从而发展迅速。冷战结束后*投入下降,这个领域的进步就小了,因为聪明人往华尔街跑了,后来又往硅谷跑。我一直以来的观点就是,聪明人和美女总是会集中在有钱和有资源的地方。哪个公司聪明人或者美女多,就说明哪个公司的待遇好并且人们认为这个公司有前途。因为聪明和漂亮都是面试加分项,因而他们能拿到更好的 Offer,能把这些人吸引来的公司必然是提供了好 Offer 的公司。

关于技术人员的上升通道

为什么说技术人员的上升通道局限比较大?曾经听移动的一位总经理说过,所有的高层管理者都需要一个抓手,也就是管理基点,他是不会放手这个基点的,例如运营、产品、业务逻辑,或是技术。PM 出生的管理者还是会继续考虑产品,运营出身的管理者还是要考虑运营,但技术出身的管理者到了一定级别不见得还要考虑技术,特别是技术细节。这样的人时间久了就做不回码农了,可能连一线的技术经理都做不了了。大公司高级别的码农就算不写代码至少知道最新技术的发展方向并且实际设计和运用加和人扯淡,出去还是能当个同级别架构师。小公司 CTO 很容易既不写代码又不了解大方向,出去只能找人接盘接着当 CTO,还可能被觉得没水平。

关于跟进最新技术的重要性

工作上一定要跟进最新技术的发展动向,某种程度上这和炒股差不多,看好业绩的话提前埋伏进场。比如若干年前刚有安卓 ios 的时候,很多人还在塞班上开发,但眼光好的第一时间就转行到了安卓、ios,因为先占了坑在最稀缺的时候抢占了先机,跟早毕业的道理一样,可能比你晚两年转行的人处处占了先机,差距越来越大。当然也有可能赌输了,例如 Windows 编程。

每一次业界的革命,都会让一些公司落寞而让另一些公司崛起,码农也一样,每一次技术换代也都会让一些码农没落而让另一些码农崛起。在技术换代面前,之前的工作经验不至于一文不值,但也大打折扣。另外,正因为技术不断换代,学的快的才比单纯年轻的有优势,如果技术完全停滞,干五年左右技术就不再成长,那么毕业五年后还当基层码农的失业风险就越来越大,这也是某通信大厂被传闻的所谓“35 岁裁员”的写实,听说 35 岁主要针对的就是这些基层码农,45 岁针对的是基层码农和技术一线管理者。不断地盼望着(如果能力够强也可以自己创造)新技术的出现,并且自己保持着不亚于年轻人的学习能力,自然就降低了高龄失业风险。

至于做管理,也是一种出路,因为在管理的经验积累上很难有天花板的说法,十年管理经验可能有很大一部分确实是后五年积累的,而不像写代码,但是也要考虑做管理和技术脱节的问题,得保证这个公司不要你了,你的管理经验是能用在其他公司的。作为技术管理者实际上也还是要掌握最先的技术并且能用于自身业务,比如你说你懂大数据、高并发访问的架构设计,但前公司的产品 TPS 只有几百,你觉得你的技术有实践过吗?只能强调自己管多少人的话,可能不是互联网公司技术出身管理者的出路。

写在最后

作为一名程序员,你需要保持三种感觉,饥饿感、疲劳感和孤独感,学习的目的是因为想要学习,学习的过程是很单调的,经常需要独自搜索网上的资料,独自前进,学习时间长了会很累。做技术的人容易仰望星空,但是仰望星空前需要做好脚踏实地,掌握好基础技术、动手能力强、三观正、具有较强的为人处事能力,这四点是一切可持续发展的基础。仅以此文献给在路上的我们三人,也纪念我们的青葱岁月,进入职业生涯的中期,我们仍需负重前行。


上一篇:“浪潮杯”第九届山东省ACM大学生程序设计竞赛


下一篇:ACM ICPC