在不少人的眼中,可能十年,甚至五年以后,自己的辛苦积累的编程知识就没用了。
其实并不是这样,我们要把后端的需要掌握的技术分为三个层次来看。
计算机基础
主要是操作系统、数据库、数据结构和算法、计算机组成原理、计算机网络 、编译原理,这些知识几十年都没有变化,再过十年也不会变。
基础稳如泰山,对它们进行投资永不亏本。
中间层和应用层
这两层随着时代的变迁在剧烈地重构。
但是一个人积累的知识10年后还剩下多少, 要看一个人入行的时间处于技术发展的哪个阶段。
技术的发展也不是颠覆性的,而是渐进性的,它不会一下子消失,只会边缘化。
小李在90年代中后期入行,他之前花大精力学习了VB、PB、Delphi这些开发C/S应用的软件,准备大显身手,可是那个时候正是桌面时代向互联网迁移的关键点,十年之后他就会发现桌面C/S应用被边缘化了。
小张在互联网早期的时候入行,他陆陆续续接触到了ASP,JSP,EJB,Websphere, Weblogic,Struts、jQuery、SOA、Ruby on Rails,这些技术十年,甚至二十年之后还在用,只不过只能在遗留系统来维护了。
小刘在移动互联网火爆的时候入行,他一上来接触的可能就是nginx、 Redis、ElasticSearch 、Kafka、Docker、k8s之类的技术,十年之后,只要没有大到足以干掉移动互联网的技术变革,这些技术应该还会在。
技术消失的原因
技术的消失和边缘化主要有两个原因:
1.不好用
EJB笨重繁琐,被轻量级的Spring替代。
ASP,JSP写网页,很容易把逻辑和显示混到一起,把代码搞得一团糟,最后被前后端分离的技术替代。
Struts配置繁琐,被SpringMVC,SpringBoot彻底淘汰
2. 不够用
互联网和移动互联网的爆发式发展,对于高并发,大流量,大数据产生了强烈的需求:
例如为了解决C10k,C100k问题,出现了epoll(2002)和nginx(2004)这样的大杀器。
为了解决数据库读写缓慢,出现了Redis(2009)、ElasticSearch(2010)。
为了解决数据库单机性能不足的问题,出现了主从分离,数据复制......
为了单体应用维护成本高、无法灵活扩展,部署周期长的问题,出现了微服务(2012),服务发现,熔断,负载均衡,注册中心等相关技术。
为了解决分布式环境下高吞吐的消息订阅,出现了Kafka(2011)。
为了解决环境不一致,应用部署的问题,出现了docker(2013), k8s(2014)。
......
程序员所在的残酷环境
理论上来说,很多技术的本质并没有变化,变化的只是形式。
无论是ASP、JSP、Struts、EAD4J、SpringMVC,RoR......都是Web编程,要解决的本质问题都是URL和代码的映射,数据的验证、转换和绑定,Web安全....
无论是Hibernate、MyBatis、ActiveRecord,都属于ORM的范畴。
Spring Cloud那些服务注册和发现,很明显有着SOA时代的痕迹。
只要把原理搞定了,就像黑客帝国中的Neo看透Matrix一样,可以在技术领域任意驰骋。
现在最大问题在于,互联网发展太快,编程技术层出不穷,学不过来。
由于技术太多,每一项技术都需要花费大量的精力去学习,想要精通所有知识几乎不可能。
有基础的老程序员会学得更快,他们能迅速掌握、理解其中的技术原理,但是在技术的细节,最佳实践层面,老程序员和新程序员不容易拉开差距。
对于兼顾管理的技术人来说,更不可能深入这些技术的细枝末节,能在理解原理后在关键点上和团队成员进行讨论就不错了。
如果公司主要浮在应用层搞业务的定制开发,就不需要去研究底层的操作系统、数据库、编译、计算机网络、分布式系统,也就不需要深厚的技术沉淀, 大家都是CRUD Boy,调包侠,面向Google/Stackoverlfow/百度编程......
那老程序员积累下来的经验就没什么用,相对新程序员的性价比就不高。
可惜,这样的公司在国内是大多数,互联网行业烈火烹油之时大家都好,一旦形势变化,裁员就会落到薪水更高的老程序员身上。
在中国软件业,不是技术在淘汰人,是人在淘汰人。