说一说程序员的职业规划
好吧,这篇文章已经欠了好久,今天来补一补。
主要也是因为自己也是一直没想清楚,从打算想写这个到后面思考的一段时间,其实自己的感受和思路也发生了很大的变化,前期因为各种不顺利就比较容易偏激,现在慢慢冷静下来了,也能从多个角度来看问题了,思路就一直在变化中。所以职业规划这个东西,真的不是这么好规划的,今天我写的,大家也就权当是个参考了,为了避免写成心灵鸡汤,有些可能会写的比较无奈,但是我始终坚信,鸡汤除了补一补是没有实际用处的,所以该面对实际的还是得面对实际。
然后说个前提,因为我们都知道人跟人的差距是很大的,所以我今天写的不是针对那前 5% 智商特别高,学啥都特别快,坐一趟飞机就能掌握一门语言的人,当然也不是那种体力特别充沛,一天就只需要睡 4 个小时,第二天就可以神采奕奕的人,这两种人不是不需要规划,而是我这种水平哪里轮得到去规划他们。
今天说的是智力和体力都在大众平均水平上下波动的人,通俗的来说,也就是普通的程序员。下面就从几个常见的范畴来讨论这个问题:
进大厂还是进小公司
这个问题我觉得没什么可讨论的,条件允许的话,尽量进大厂。有人会说进了大厂可能只是螺丝钉,每天干着重复的工作,没有机会接触到核心的内容,进了小公司,有可能从头开始跟着公司一起成长,能接触到的面也比较广,这个论点有没有错,当然也没有错,也很有道理,但是就像我说我们不讨论智商前 5% 的人是一样的道理,任何事情,都是一个概率。
理性的分析,小的创业公司,真正成功的概率有多少,基本跟摸彩票的概率差不多吧。虽然进大厂有说到的做螺丝钉的问题,各种中台技术也非常成熟了,但是你进去了,至少机会还是多很多,我就从这几个方面来说:
- 有机会接触海量数据,虽然你是在拧螺丝钉,但是在大厂,拧螺丝钉的规范也是很多的,每一个规范后面都是血泪的教训,只要你搞明白这些规范的原因,就少走很多弯路。而且有机会接受大数据量的洗礼,会让你对底层数据结构,存储,事务,线程安全这些都有更深入的理解和实战,而小公司是很难有机会面对这样海量的数据的,虽然我们可以看书,但是跟具体的实践差距还是很大的。更重要的是,你会懂得取舍,比如经典的理论教材都会讲数据库的范式,这是从设计领域出发的,但是实际操作中,面对大数据的冲击,大厂的实践就是会抛弃范式的规范,在实际操作中你会慢慢领悟出各方面的权衡和选择的精髓,这个东西靠看书是看不到的。
- 有机会接触牛人,不是说小公司没有牛人,往往初创的小公司其实也会有牛人的,但是毕竟还是没有大厂多,多跟牛人接触,你才能变得牛起来。
- 规范的流程,其实在我刚毕业的时候,也很反感这些流程,觉得很麻烦,对生产代码又没什么帮助,但是后面自己管理团队也发现,很多流程对于工程化实施还是很有帮助的,虽然对于个体开发而言可能是个累赘,不进大厂你就感受不到这种流程,而这种流程如果自己摸索的话,也要花大量的时间。
那么你说,我的技能上可能暂时还进不了大厂怎么办,折中的办法是,挑选流程清晰,规范的小公司,技术负责人看起来至少要条理清楚,也就是整个研发流程不那么乱的公司,至于后面能不能发展,很多时候也不是技术决定的,就赌赌你的人品吧。
选择什么语言
虽说程序员是应该不受限于语言的,但是大多数人也不可能频繁的更换开发语言,大多数可能是有一门最擅长的,然后也兼容会其他语言。毕竟每门语言入门都是容易的,但是要精通还是要经历深度的学习和实践的考验的,如果拿自己只是刚会的语言,和这个领域里已经经验很丰富的人去竞争,也是没什么竞争优势的。所以那门擅长的语言的选择其实也是很重要的,这决定了你在这个行业里的生命周期。
我记得我刚实习的时候,主管让我在两个项目里选一个,一个就是 Java 的,一个是 Unix 下 C++ 的,当时 Java 其实出来没几年,懵懂无知的我选择了 Java,只能说是运气好,并不是当时我有什么过多的想法,单纯因为 Java 比较简单而已。
事到如今,虽然大多数人都觉得 go 会替换 Java,但是我基本可以打赌,至少在未来十年内,Java 依然会是大型互联网公司的首选语言。具体原因我就不在这里阐述了。
那么问题来了,选择语言的标准究竟是什么,你们会以为我说选新的吗?no!我要说的,是,当当当,选简单的!其实我当年还是很想选 C 的,心里总是觉得学好了 C,学其他语言不是很容易吗?但是当时只是从职业化的角度去考虑,毕竟去公司不是学习的,是要产出的,万一选了个 C++ 的,搞砸了,那不是对初入职场的人来说不太好么。
事到如今 C 依然是最烧脑的语言,也不是说他没有应用场景了,但是从实际的就业来说,其实机会真的不是那么多,不是写 C 的人有问题(一般选择 C++ 的大多还是程序员了里顶尖的一批),而是整个生态圈的问题。
越是复杂的语言就越极客,这会导致进入的人变少,整个圈子就是几个高智商的人在玩儿,而这样的人的特点就是满足自己极致的发挥就好了,很少去考虑打造整个生态圈和工程体系。而只有入门简单的语言,才会有大量的开发涌入,这时候开发队伍层次不齐,大多数公司或者团体就会考虑打造底层框架,打造生态圈,打造工程体系,让基础的开发人员只要关注业务编码就可以了,而由于大多数程序员的涌入,招人也相对容易,价格也相对便宜,这才是企业要的东西,所以会发现越看不上的语言,发展的还越好(比如 JavaScript 能发展到今天的地步,是很多人大跌眼镜的一件事情,这里没有贬低 JavaScript 的意思,只是相对来说脚本语言的入门门槛还是相对低一些)。
有人就出来反驳了,那世界上最好的语言 PHP 呢,呵呵,你也不要看不上 PHP,人家发展的也很快,现在的性能也不错,而且很多小公司的技术栈还是 PHP,对老板来说,还是最实际的选择,虽然被调侃为世界上最好的语言,但是人家基本上也是可以经久不衰的,而且你要是用 PHP,业余时间找个兼职做做其实比 Javaer 还是容易一点呢。
所以我个人比较偏激的选择就是选择简单的语言,不要去选择太复杂的语言。
选深度还是选广度
这个不好一刀切,还得看你自己的能力和兴趣,如果就是对技术感兴趣,对业务和管理兴趣不大,那就选深度。如果对业务和管理更感兴趣,那就选广度。如果都可以,那么就看经济情况,牛市选广度,熊市选深度。好吧,最后这条这个建议其实挺没意义的,毕竟不论是深度还是广度都需要时间去积累,你无法判断等你积累好了,经济形势是个什么形式了。
就目前比较糟糕的经济环境而言,构架师会比技术总监需求量更大。但是不论哪种选择,我建议大家要不惜一切大家在 35 岁以前走上构架或者管理的岗位,如果 35 岁以后还是一般写代码的,不论经济形势如何,大概都是很麻烦的事情,毕竟中国的国情不同于国外,996 还是个常态,同样都是写代码,找年轻的不好么,35 岁以上就一定要有核心的竞争力,要不是技术特别牛,要不就是综合能力特别强,反正你光只能写一般的业务代码是肯定完蛋了。
另外就是两点小建议:
- 如果选深度,那么对底层的原理一定要吃透,不要只选择掌握一门语言的深度就可以了,要跳开一门语言去思考总体性的问题,这往往是操作系统,网络,算法这些更底层的层面,语言只是你涉入这些领域的入口而已。虽然上文也提到选择语言的问题,但是真的到构架师层面,不说一定要很快的切换语言,但是你也不能对除了常用语言之外的内容一无所知啊,你说一个构架师,我只懂后端构架,前端一窍不通,数据库得依赖 DBA 是肯定不行的。我就遇到过这样的构架师,只负责应用这部分,前端,数据库一概不管,其他部分还得我去补位,这样的人其实竞争力也是有限的,哪怕他在某一门语言特别特别的精通。
- 如果选广度,我会建议除了基础的技术能力(技术能力是根本,即使管理岗,技术能力也不能太弱),管理,业务之外,还要多了解一些运营,产品,甚至学习一些金融学的知识。因为如果走上综合型或者管理型的岗位,在一个公司的人脉积累是很重要的,这意味着你得在一个公司扎根比较久的时间,那么这个公司如果本身发展时长就很重要,一两年就倒闭了,你的管理技能是无法锤炼出来的,对于管理岗位来说,是很难经常更换赛道的(构架师可以一年换个公司,管理岗恐怕是不能这么频繁的更换工作的),所以学习运营,产品,甚至金融学的知识,除了对你日常工作有帮助,也对你选择行业和公司有所帮助。
职业规划到底要如何规划
按照上面几条的建议,如果你刚毕业,或者还年轻,我会比较建议如下的职业发展:
- 选择大路货的语言先入门,学好基础的数据结构和算法,努力进入大厂。
- 在工作中不要只满足完成手头任务,业余时间多学习核心的代码库,不要太在意此时的工资和加班时间,只要能多方面的学习和了解就去做,争取在 1-3 年之内至少把你所处的产品线的所有业务和技术流程都搞明白,对使用的中间件技术也尽量的吃透搞明白,总之就是多学习,只要能学到新知识就不要错过。
- 三年之后选择你的方向,走构架方向还是走业务管理方向,并根据方向选择不同的学习路径,多实践,多尝试。不管哪个方向,最终极的目标就是对整体流程的熟悉度
3.1 比如你偏业务和管理的,你得搞清楚你的系统需求为什么是这样的,各个环节之间是怎么配合的,为什么能够运营成功,后期的维护流程是怎样的,技术上是怎么配合的,独立的服务之间是怎么组合的,这就需要除了完成技术功能,了解技术构架,还得多跟产品,运营人员沟通
3.2 如果你是偏构架的,那就要了解一些难度很高的技术场景,比如大促,整个环节,各个中间件是怎么配合的,各个部分的优化是怎么做的,而不是只了解其中一块。 - 持续学习吧,学习新的框架,学习新的语言,学习新的业务,毕竟这个市场变化太快,不学习就是淘汰。
题外话一:要不要 996
我的建议就是只要能学到新东西,不要介意 996,如果是重复劳动,就悠着点吧,控制一下节奏,留出时间来学习和锻炼身体。
题外话二:跳槽如何选择 offer
按照上面的建议,在毕业前几年,以学习东西为主,所以尽量以发展机会为主,薪资次之。后面几年,就要多考虑把你的经验变现了,能选择到薪资不错的又有发展前景的公司固然好,但是毕竟概率太低,实在不知道怎么选,就考虑毛爷爷多的,毕竟真的 35 或者 40 岁以后下岗了,有积蓄还是很重要的。
题外话三:面对焦虑怎么办
确实,现在的职场人士,不仅仅是程序员,都很焦虑。不过这里要心灵鸡汤一下,你焦虑,是好事,说明你遇到了困难,遇到困难就能逼迫你去学习和成长。
反而你每天都觉得工作已经可以安排的紧紧有条,可以抽时间健身,幸福生活的时候,你得警惕,毕竟中国还是个高速发展的时期,你活的太舒服,未必是好事。
但是又要反过头来说,即使你再焦虑,也记得要锻炼身体,毕竟工作做不完,不管 35 岁以后是什么状态,留一个好的身体永远是不错的选择。
题外话四:未来程序员这个工种会如何进化
对于这个话题,我个人比较悲观,未来将有一大批平庸的程序员被市场淘汰。随着云计算的兴起,底层的构架和基础中间件都可以通过购买服务获得(比如我之前需要一个图片比对服务,要是自己做不知道要耗费多少人力物力,结果去阿里云,百度云找找,现成的都有,便宜,效果还好,你猜老板会怎么选择)。
所以未来的程序员要不就是往底层基础架构发展,提供基础服务(你得先掂量一下,有没有搞人工智能,算法,基础设备的能力),要不就是整合能力特别强,迅速的能整合各个基础服务,懂业务,懂运营,分分钟能利用已经打造好的轮子拼出业务系统来。
再加上 SAAS 的崛起,可能未来企业对于程序员的需求是真的会越来越小。
所以程序员的竞争力在哪里,要不就是你有别人不具备的技术能力,要不就是你有综合的业务和技术整合能力,根据你自己的特点,选择吧,骚年~
还有,再补一句,以上各种都是针对打工,如果你的想法是创业,那就另说了。
我的这个不成熟的小想法就是:
除了写程序之外,要不要训练点候补技能,一旦计算机这条路走不下去了,还可以有个退路,比如烤冷面?