在官场上,曾经有一个 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 程序员如何成为大牛、架构师呢?
一、源码分析
源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。
源码阅读,我觉得最核心有三点:技术基础 + 强烈的求知欲 + 耐心。
我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次 (很偏激哦):
1、只关注项目本身,不懂就 baidu 一下。
2、除了做好项目,还会阅读和项目有关的技术书籍,看 wikipedia。
3、除了阅读和项目相关的书外,还会阅读 IT 行业的书,比如学 Java 时,还会去了解函数语言,如 LISP。
4、找一些开源项目看看,大量试用第三方框架,还会写写 demo。
5、阅读基础框架、J2EE 规范、Debug 服务器内核。
大多数程序都是第 1 种,到第 5 种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的
耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如 API 结构、框架的设计图。
下图是我总结出目前最应该学习的源码知识点:
二、分布式架构
分布式系统是一个古老而宽泛的话题,而近几年因为 “大数据” 概念的兴起,又焕发出了新的青春与活力。除此之外,分布式系统也是一门理论模型与工程技法并重的学科内容。相比于机器学习这样的研究方向,学习分布式系统的同学往往会感觉:“入门容易,深入难”。的确,学习分布式系统几乎不需要太多数学知识。
分布式系统是一个复杂且宽泛的研究领域,学习一两门在线课程,看一两本书可能都是不能完全覆盖其所有内容的。
总的来说,分布式系统要做的任务就是把多台机器有机的组合、连接起来,让其协同完成一件任务,可以是计算任务,也可以是存储任务。如果一定要给近些年的分布式系统研究做一个分类的话,我个人认为大概可以包括三大部分:
分布式存储系统
分布式计算系统
分布式管理系统
下图是我总结近几年目前分布式最主流的技术:
三、微服务
当前微服务很热,大家都号称在使用微服务架构,但究竟什么是微服务架构?微服务架构是不是发展趋势?对于这些问题,我们都缺乏清楚的认识。
为解决单体架构下的各种问题,微服务架构应运而生。与其构建一个臃肿庞大、难以驯服的怪兽,还不如及早将服务拆分。微服务的核心思想便是服务拆分与解耦,降低复杂性。微服务强调将功能合理拆解,尽可能保证每个服务的功能单一,按照单一责任原则(Single Responsibility Principle)明确角色。 将各个服务做轻,从而做到灵活、可复用,亦可根据各个服务自身资源需求,单独布署,单独作横向扩展。
下图是我总结出微服务需要学习的知识点:
四、性能优化
不管是应付前端面试还是改进产品体验,性能优化都是躲不开的话题。
优化的目的是让用户有“快”的感受,那如何让用户感受到快呢?
加载速度真的很快,用户打开输入网址按下回车立即看到了页面
加载速度并没有变快,但用户感觉你的网站很快
性能优化取决于多个因素,包括垃圾收集、虚拟机和底层操作系统(OS)设置。有多个工具可供开发人员进行分析和优化时使用,你可以通过阅读 Java Tools for Source Code Optimization and Analysis 来学习和使用它们。
必须要明白的是,没有两个应用程序可以使用相同的优化方式,也没有完美的优化 java 应用程序的参考路径。使用最佳实践并且坚持采用适当的方式处理性能优化。想要达到真正最高的性能优化,你作为一个 Java 开发人员,需要对 Java 虚拟机(JVM)和底层操作系统有正确的理解。
以上五大知识体系是我从业多年总结出来的经验,都是当前最主流的技术。想学习这些技术的朋友可以加群:650385180。群里会分享这些技术知识点供大家学习免费下载
下图是我总结性能优化应该学习理解的几大知识体系:
五、Java 工程化
工欲善其事,必先利其器,不管是小白,还是资深开发,都需要先选择好的工具。提升开发效率何团队协作效率。让自己有更多时间来思考。
“大话架构”阿里架构师分享的 Java 程序员需要突破的技术要点
注:加入要求
1、具有 1-5 工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对 java 工作机制,常用设计思想,常用 java 开发框架掌握熟练的,可以加。
4、觉得自己很牛 B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5. 阿里 Java 高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
6. 小号或者小白之类加群一律不给过,谢谢。
目标已经有了,下面就看行动了!记住:学习永远是自己的事情,你不学时间也不会多,你学了有时候却能够使用自己学到的知识换得更多自由自在的美好时光!时间是生命的基本组成部分,也是万物存在的根本尺度,我们的时间在那里我们的生活就在那里!我们价值也将在那里提升或消弭!Java 程序员,加油吧
如果你觉得这几方面都合适,那你还有几条出路:
一是塌塌实实混日子。
说老实话,做老实人,办老实事,拿老实的工资,这种员工公司也是非常需要的,一般不会遭遇炒鱿鱼的命运;二是转行或者创业。
因 为这个行业已经不再适合你,已经没有更大的发展前途,只能转行。如果可以转行,未必是坏事,也许在新的环境中,可以激发出更强的能量,创造出一番事业来。 至于创业,那就更具有挑战性了,建议你在创业之前,已经成为了一名优秀的项目经理。试想,如果转不动一个项目,如何能转动一个公司?