11年正式进入IT行业,成为一名程序员。那时候的技术圈还停留在语言之争上,那时候争论的是到底谁是世界上最好的编程语言,php说过自己是世界上最好的语言,C#说过自己是世界上最好的语言,那时候Python这个小兄弟还没来到Top3,彼时JAVA长期位于榜首。随着技术的进步,编程语言的排名也是不断变化。
下面这张是2011年的编程语言排名。

下面这张是2022年的编程语言排名

你可以看到,现在大热的人工智能,机器学习,python变得越来越流行,它已经占据了top1的位置。而企业中大量采用的还是Java开发语言,Java依然排在top3。
话说,各位小伙伴们,在你的从业经历中有没有见证或者亲身经历了哪门编程语言的消亡。在我的职业经历中就亲身经历了delphi这门语言的企业消退。
本文从入行开始一只使用JAVA开发语言,虽然业务会去看看其它编程语言,比如PHP,C#,Python,但局限于语法层面的,没有经历过大规模的企业应用实战开发。所以就从自身的角度聊聊那些年,我们所经历的技术变迁。
彼时的技术圈,从架构上来讲,很多都是单体化架构,前台和后台、数据库、运维几乎都干过。每个同学都是多面手,擅长多个领域的技术。本人也是,后端、前端、数据库、运维、架构、项目管理也是都经历过。
记得11年那会,去企业面试,基本都是问SSH(Spring+Struts2.x/1.x+Hibernate),甚至一些运营商的管理系统都是用这种架构来做,所以只要掌握SSH这三大框架,基本找份工作是没有什么问题。分享一个Struts2的架构,那时候SpringMvc还没那么流行,Struts2真的是无敌的存在。当然还有一些老的项目也还是使用Struts1

还记得那时候,Hibernate的教程是多如牛毛,很多培训的网站上都是讲的Hibernate,仿佛学会了Hibernate,走遍填写都不怕。而且当年写代码,还是用的基于Xml的配置,多么熟悉的味道。

至今还能找到以前学过的Hibernate古董级资料。

现在看起来真的特别有趣。仿佛真的一招鲜吃遍天。
彼时,我们用得最多的jar管理还是来得非常简单而粗暴,没有maven,没有gradle,我们简单的引入jar包,采用原始的方式,直接放在lib目录下。比如下面这种,在那个洪荒时代,加入遇到jar不兼容的情况,那就恭喜了,我们采用最原始的人工处理模式。

彼时的数据库,关系型数据库还是一枝独秀,可以凭此绝技包打天下。放一张彼时的数据库神仙打架,群雄割据的局面。

当时的大哥是Oracle,真正的一哥,那时候mysql刚发布5.5的版本,对事务有了更好的支持。办公室里还充斥着单库的优化,性能提升,可能还听得到一些存储过程这样依赖数据库的开发模式。而现在,企业级开发,恐怕用存储过程这种技术的也不多了。
而后,阿里轰轰烈烈的去IOE,数据库界迎来了新的一春。下图是阿里去IOE的关键节点。面对互联网海量数据,高性能,高可靠,最终,变成了OceanBase的全面开花,现在OceanBase已经全面对外提供服务。

当时我们开发的应用系统,不是面向互联网用户,企业用户的话,针对不同的量级有不同的部署方案。可以用集群模式,可以增加一点服务器,初步具备高可用。缓存慢慢进入我们的视野。于是在大家的技术方案或者架构中,会在技术那一层逐渐加入缓存,用来保护数据库层,避免数据库层容易被打爆。
那会,会开启ehcache,这种单例级的缓存,复杂一点也会开启memcached,它的架构图如下,一般这就是比较有流量的应用会采用的架构:

刚开始的时候,对于memcached和redis也是神仙打架,redis也还没有开启碾压式的领先,两者还是和谐共存,甚至redis还有些吃亏,memcached出道时间早些,技术圈引入的时间还早一点。而现在,memcache已经被遗忘了。redis几乎成了缓存事实的存在。
在单体化架构时代,甚至是SOA年代,微服务还未流行,很多的企业都还在搞JSP技术,稍微先进一点可能会用thymeleaf或者freemarker模板技术。前端jquery是标配,还没有现在这种前后端分离。

以前,能将Jquer用得很熟练就敢宣布自己是一个前端攻城狮,再会一点css就是全栈了。当然,现在前端继续在发展。

做过后台管理系统的恐怕对layui都不陌生,很多后台管理系统都采用过它的模板。而在2021年10月13日宣布下线,不再开源维护。

回顾历史,展望未来,我们可以看到,不论前后端户,都在往专业化的道路发展。后端的架构已经从单体化进化到SOA,到微服务,现在的的服务网格。

后端不断在进步,与前端关系更加密切,前后端攻城狮融合更加紧密,一个项目,需要团队中不同的角色一起完成。
在存储这层,newSQL发挥了越来越重要的作用,比如图数据库,文档数据库,弥补了关系型数据库的不足,让我们的系统发挥得越来越好。


更加专业的前端,我们在全面拥抱新的前端,比如Vue还有React,当然在前端界,关于Vue和React谁是前端一哥的争议也是一直居高不下,从业务的角度讲,不论选择react或者vue,只要是满足了业务需要便是好技术,至于语言的灵活性,代码的可读性和扩展性,这更考验的是技术leader的能力。
最后,作为技术人,尤其是IT圈的技术人,我们需要不断得钻研技术。这个世界上唯一不变的就是变化,这句话放在技术圈就是不容置疑的真理。朋友们,技术之路很苦,想要深耕在这条道路上,需要付出很多,需要不断清空自己的旧有思想,汲取新的营养,这样才能不被过去所迷惑,才能面向未来,从容的应对所有的变化。不论是低代码平台的流行,还是人工智能的快速发展,对会思考的程序员还是依赖的,掌握这些技术的核心,变化的都是外在的表现形式。回顾IT这条从业之路,有辛酸也有一丝成就感,祝大家都不迷茫,勇往直前。
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
例如,如果我们defc=(foo)p"hello"endc=3c=(3)并且不会打印“hello”。我知道它可以被self.c=3调用,但为什么呢?可以通过哪些其他方式调用它? 最佳答案 c=3(和c=(3),完全等同于它)总是被解释为局部变量赋值。你可能会说只有当方法c=没有在self上定义时,它才应该被解释为局部变量赋值,但是这有很多问题:至少MRI需要在解析时知道在给定范围内定义了哪些局部变量。但是,在解析时并不知道给定的方法是否已定义。所以ruby直到运行时才知道c=3是否定义了变量c或者调用了方法c=,这意味着它不会知
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在
我试图定义一个带有方法的类,以及一个缺少这些方法的类,然后允许后一个类的对象从前一个类的实例“学习”这些方法。这是我的尝试(Ruby1.9.2)-当我尝试更改lambda绑定(bind)中“self”的值时,它中断了(在注释为“BREAKS!”的行处)。如果您能想出如何解决这个问题-我很想知道。classSkillattr_accessor:nameattr_accessor:techniquedefinitialize(name,&technique_proc)@name=name@technique=lambda(&proc)endendclassPersonattr_access
我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、
文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据
目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli
我使用Nokogiri如下:require'nokogiri'require'open-uri'#GetaNokogiri::HTML::Documentforthepagewe’reinterestedin...doc=Nokogiri::HTML(open('http://www.google.com/search?q=sparklemotion'))但是我不好,可能是由于公司的防火墙,我得到了错误:C:/Ruby193/lib/ruby/1.9.1/net/http.rb:762:in`initialize':getaddrinfo:Nosuchhostisknown.(Sock