程序员的30岁现象
在官场上,曾经有一个59岁现象,就是官员们会在59岁时,会使劲捞上一把。很明显嘛,权力过期作废,再不捞就要退休了,没有机会了。
在程序员的圈子里,也有一个30岁现象。程序员干到30岁,好不容易从码奴混到了白领,却再也干不动了,还时时面临失业的危险。30岁,是一个程序员伤不起的年龄。明天,何去何从?当然,如果你有铁饭碗,比如在国企或政府机关,那你是无法理解底层劳动人民的感受的。同时也要恭喜你成为体制内的一员,可以一直干到退休无忧。
30岁现象人人都明白,但要给出一个定义并不容易。列举几个表现,也许你会觉得心有戚戚焉。
面临职业瓶颈,程序写不动,上升又困难。
薪水较高,加班变少,后浪追前浪,面临失业压力;生活压力剧增,不敢跳槽;
招聘程序员年龄限制在30岁以下成为行业潜规则,跳槽困难。
30 岁现象和59岁现象貌似不搭边,其实都出于同样的原因:价值贬值。官员老爷在任就像皇帝,一旦退休,就成为了平民百姓,贬值那是自然的。而程序员也一样, 所谓三十而立,一旦到了30岁左右,由于面临结婚生子,一方面需要高薪抚养家庭,另一方面却无法像以前那样全身心投入到工作,性价比急剧下降;与此同时, 大批廉价的新手涌入,他们往往还使用最新的技术,老一辈程序员只能慢慢的靠边站了。
是否有不可替代性
30岁现象产生,只能程序员自身身上找原因。
当然我们也可以产业、从社会、从政府、从制度等多方面进行分析,发现不足,这些分析未必没有道理,但是肯定没有用,因为我们无法改变。所谓“命苦不能怪政府,命背不能怪社会”,从外部找原因,只会让我们满腹牢骚,整天觉得自己生不逢时,苦闷不堪。
从自身找原因,试着问自己几个问题:“为什么我的性价比以下降?老板为什么要请我,给我高工资呢?一个人有价值是由什么决定的呢?”
你也许可以列出很长很长的答案,但我想应该都可以浓缩为一句话:“一个的价值是由他的不可替代性决定的”。不可替代性可以理解为,为了替代你老板需要付出的代价。
因为你的可替代性高,所以性价比下降。反之,因为你不可替代性高,所以老板会给你开高工资。不是这样的吗?
有一则小故事:
技师退休时告诫自己的徒弟:“少说话,多做事。”
十年后徒弟也成了技师,他找到师傅,苦着脸说:“师傅,我一直都按您的教导做,只知埋头苦干,可那些比我技术差的都升职了、加薪了,我还是拿着过去的工资。”
师傅想了想,说:“你请一次假吧。如果一盏灯一直亮着,那就没人会注意到它……”
徒弟恍然大悟,真的请了一星期假,等他回去上班时,厂长找到他说要给他加薪。原来,在他请假时,厂长发现,工厂已经离不开他了。
徒弟很高兴,以后他时不时就请几天假,每次请假后厂长都会给他加薪。一天徒弟请假后准备去上班,厂长却告诉他:“你不用来上班了。”
徒弟苦恼地去找师傅,师傅说:“那天我的话还没说完呢。一盏灯偶尔可以熄灭一次,可如果它总是熄灭,性质就不一样了,因为没人会需要一盏时亮时熄的灯。”
故事中,因为徒弟的不可替代,所以厂长给他加薪;后来因为有其它的灯亮了,他被替代了,厂长不需要他了,所以被炒了鱿鱼。
所以我们归根到底还是要提高自己的不可替代性。否则,一旦老板觉得用较低的代价就可以替代你,那么你就面临可能失业的危险了。
出路在哪里
那程序员到了30岁,怎样提高自己的不可替代性呢?我们打算做一辈子程序员吗?敢问路在何方?
作为一个过来人、一个资深程序员,我觉得有几个方向可以选择:
(1)成为技术大拿
其实,做一辈子程序员并没有什么问题,重要的是,你必须成为一个不可替代的程序员,也就是说,你要成为技术大拿,能够解决普通程序员所不能解决的问题。技术大拿有两个版本:
一 是程序员加强版。你仍然是一个程序员,但你是一个很牛的程序员,凭借多年的积累,你在知识广度和深度方面均已不是等闲之辈。从汇编到java,你样样精 通。你在意数据结构和算法,对系统的优化有独到见解,对设计模式如 数家珍,你还有完备的工具箱和自己的专用类库。其实,加强版程序员有非常独特的价值,可惜的是,在现实中却很少见,因为对任何一个公司而言,人才总是很稀缺的。老板的眼睛是雪亮的,他怎么会对你这种技术大牛视而不见呢,在你还没有成为真正的 大拿之前,早已经被任命为系统架构师、项目经理或者更高的职位了。因此,你想守住自己的一亩三分地,悠闲的做自己的大拿,往往是不可能的。
二 是程序员升级版。虽然你的内在仍然是一个程序员,但你的职位已经升级了,你成为了系统分析师或系统架构师。这是非常自然和现实的选择。程序员与系统分析师或架构师之间并有鸿沟,只需一步而已,你就可以从崎岖山路驶向宽阔的大马路。但这一步却并不容易,需要几年时间不断思考、学习、实践,才能化蛹成蝶。
(2)成为行业专家
行业专家也是一个公司不可缺少的角色,他们对公司的行业知识、业务流程和细节了如指掌。行业专家一般并不是从外部招聘的一个只懂业务、不懂技术的超人,而往 往是从程序员经过多年的摸爬滚打成长起来的。作为从程序员成长起来的行业专家,你往往还肩负系统分析师之职。在公司里,对业务有一般了解的人很多, 但专 家级别的往往很少,为了后30年的职业生涯,你必须成为专家。
(3)朝管理方向发展
向管理方向发展的第一步,一般是被任命为项目经理。在大部分IT公司里, 项目经理是最小的管理岗位了,可能你不会觉得有太多惊喜,工资也没有大的提升,但这个转变,可以说会成为你一生中最重要的转变之一。
不 要小看了项目经理。有人说,项目经理是一个古老的职业。也人有人说,21世纪是项目管理的世纪。事实上,从人类有组织以来,就一直有项目管理,以前的项目 经理可能是部落首领,一次集体打猎、一次攻城拔寨,都可以视为一个项目。项目管理的知识可以应用到我们生活的方方面面,大至登月计划的实施,小至家庭聚会 的组织,都离不开项目管理。
一个优秀的项目经理,不仅需要高智商,还需要高情商。可以不夸张的说,如果你能胜任项目管理,你就可以胜任战术层的所有管理岗位,甚至你有家庭生活质量,也会提高到新层次。
然而,要成为一名优秀的项目经理,并不是一件容易的事情。可以说,需要一定的天分,有些人无师自通,有些人却永远也学不会。程序员属于高智商人群,情商却往往存在不足,这注定了只有少数程序员能够成长为项目经理,成为优秀的项目经理,则非常稀少了。
如何让自己成为大牛
那么知道了即将面临的危机,也知道了出路,如何去完成呢?怎么样成为技术大牛?
这里有几个认知上的误区:
拜大牛为师
知乎上有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务。我个人是反对这种方法的,主要的原因有几个:
大牛很忙,不太可能单独给你开小灶,更不可能每天都给你开1个小时的小灶;而且一个团队里面,如果大牛平时经常给你开小灶,难免会引起其他团队成员的疑惑,我个人认为如果团队里的大牛如果真正有心的话,多给团队培训是最好的。然而做过培训的都知道,准备一场培训是很耗费时间的,课件和材料至少2个小时(还不能是碎片时间),讲解1个小时,大牛们一个月做一次培训已经是很高频了。
因为第一个原因,所以一般要找大牛,都是带着问题去请教或者探讨。因为回答或者探讨问题无需太多的时间,更多的是靠经验和积累,这种情况下大牛们都是很乐意的,毕竟影响力是大牛的一个重要指标嘛。然而也要特别注意:如果经常问那些书本或者google能够很容易查到的知识,大牛们也会很不耐烦的,毕竟时间宝贵。经常有网友问我诸如“jvm的-Xmn参数如何配置”这类问题,我都是直接回答“请直接去google”,因为这样的问题实在是太多了,如果自己不去系统学习,每个都要问是非常浪费自己和别人的时间的。而且大牛不多,不太可能每个团队都有技术大牛,只能说团队里面会有比你水平高的人,即使他每天给你开小灶,最终你也只能提升到他的水平。
业务代码一样很牛逼
知乎上有的回答认为写业务代码一样可以很牛逼,理由是业务代码一样可以有各种技巧,例如可以使用封装和抽象使得业务代码更具可扩展性,可以通过和产品多交流以便更好的理解和实现业务,日志记录好了问题定位效率可以提升10倍……等等。
业务代码一样有技术含量,这点是肯定的,业务代码中的技术是每个程序员的基础,但只是掌握了这些技巧,并不能成为技术大牛,就像游戏中升级打怪一样,开始打小怪,经验值很高,越到后面经验值越少,打小怪已经不能提升经验值了,这个时候就需要打一些更高级的怪,刷一些有挑战的副本了,没看到哪个游戏只要一直打小怪就能升到顶级的。
成为技术大牛的路也是类似的,你要不断的提升自己的水平,然后面临更大的挑战,通过应对这些挑战从而使自己水平更上一级,然后如此往复,最终达到技术大牛甚至业界大牛的境界,写业务代码只是这个打怪升级路上的一个挑战而已,而且我认为是比较初级的一个挑战。
所以我认为:业务代码都写不好的程序员肯定无法成为技术大牛,但只把业务代码写好的程序员也还不能成为技术大牛。
上班太忙没时间自己学习
很多人认为自己没有成为技术大牛并不是自己不聪明,也不是自己不努力,而是中国的这个环境下,技术人员加班都太多了,导致自己没有额外的时间进行学习。
这个理由有一定的客观性,毕竟和欧美相比,我们的加班确实要多一些,但这个因素只是一个需要克服的问题,并不是不可逾越的鸿沟,毕竟我们身边还是有那么多的大牛也是在中国这个环境成长起来的。
对于这种回答也是真的不知道该如何回答了,那些比你厉害的人难道不用上班?每天就很闲?
项目怎么又延期,你说“没有时间”;
怎么不学习英语,你说“没有时间”;
一起去操场跑步,你说“没有时间”那你的时间都花在哪里去了?你的收获是什么?
我只能说不要用你身体的勤奋,掩盖你精神的懒惰,刚看完一本书,名字叫作:“《哪有没时间这回事》”
你总是很忙,但是你忙来忙去的一点收获也没有,或者说忙的没有效率,为什么不想想自己的时间都忙去哪了?知道自己有很多的地方做的不好,但是总是不能抓住一个去改正?这本书,给了一个很重要的提示,也是时间管理过程中我们容易忽略的一个重要的点,那就是——早睡早起。
分享我的经验
作为一名java程序员如何成为大牛、架构师呢?
第一阶段:java基础知识要牢固,java编程思想,设计模式,effective java这些都算是基础知识。在这基础上,要结合多种项目经验,利用实践来提高基础能力。
第二阶段:开阔眼光,借鉴优秀的项目或开源代码。例如jstorm、hadoop等开源软件,可以下载后利用业余时间研读,提升能力。
第三阶段:结合业务进行架构设计和实践,并多与行业高手交流,提升领域建模等能力
选一个方向,然后多阅读一些高质量代码,站在前辈架构师的肩膀上,才能比较快速的进步,长时间的技术积累,业务项目的积累,合理的方案解决通用问题。多读多写多思考。多读的目的是开拓自己的视野,让自己具备举一反三触类旁通的能力。多写是脚踏实地,避免夸夸其谈纸上谈兵。多思考是融会贯通所读所写。
架构师的学习之路也正式开始。
那么我们应该学习哪些源码呢?那就要看哪些框架最常用了,希望下面的图比较全:
再者,你在这这个阶段已经不能局限于满足于讲代码写出来,此时此刻的你需要追求高质量高性能的代码了,你此时需要研究的知识就会如下图所示:
是不是学习了上面做这些技术就够了呢?相信看到这里的码友已经知道答案了,没错,你还需要知道分布式架构的知识
另外,目前企业有大小,平台有限制,甚至对开放的方式方案都出现了独立的方式,Facebook每个模块的功能从设计到开发再到维护,由后端到前端再到客户端都是通过一程序员来进行的,这些就是所谓的全栈工程师,那么java开发中,我们服务器也有其自身的独到性;那么如何将庞大的后台系统分部成为多个功能独立,部署独立,维护独立,松耦合的独立服务呢?从而减少企业的沟通成本和维护成本呢?毫无疑问,这就是微服务。
最后,如果说开发是一个战场,那么程序猿们就是勇猛的战士,我们的战斗需要协调合作,统一调度,统一部署。那么完美的配合自然需要优秀的开发工具,那就就是我们的团队协作工具的学习。
团队协作开发
Git
Maven
Jenkins
Sonar
如果不结合实战,那么说什么都是空话,最后来看看B2C商城项目实战。当你面对Hr的时候,是不是可以跟Ta说你有一个落地的大型互联网B2C商城项目,你的商城项目是前后端分离的,用到了ZooKeep,Redis,Monggodb等等一些热门的技术,这样子是否会显得更有逼格呢?
系统设计
用户管理子系统
商品管理子系统
搜索子系统
订单子系统
支付系统
分布式调度系统
后台系统
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!