当前位置: 首页 > 科技观察

Java之旅:行者的地图

时间:2023-03-12 13:26:30 科技观察

前段时间,应元整理了自己的Java知识体系,并写了一篇文章,希望对即将进入或正在Java世界跋涉的程序员有所帮助。第一张,基本图我大概在2003年左右开始了解Java(当时还在用Delphi),但是直到2004年本科毕业我才正式决定学习Java。当时觉得用Delphi写C/S架构的程序是没有意义的。当时Java提出的J2EE规范理念,企业级架构感觉各种高大上,压抑不住内心的渴望,于是开始了Java之旅。说实话,当时一进入Java世界就头晕。各种规格、概念和英文首字母缩略词,让人眼花缭乱。J2SEJ2EEJ2MEJSPJDBCJMSEJBJNDIJDBCJTA进来的时候随便回忆了一下,好多陌生的英文缩写(幸好当时Java还没有各种框架百花齐放,不然就更晕了)。不知道从哪里开始学习。而且刚好同学有一本JSP的书,我就从JSP入手。老实说,那真是一本烂书。我现在连名字都不记得了。我可能还记得从一些例子中构建了一个JSP演示站点。被各种环境和容器问题虐了上千遍,终于跑个例子了。当终于从本地浏览器看到示例中的页面时,有一秒的成就感,随即不知所措。因为搞不懂这一切是怎么工作的,它的原理是什么?绕了一大圈,走了很多弯路,如果再给我一次重来的机会,我会从基础的Java语言基础入手。依据是什么?Java是一门面向对象的语言,最重要的概念就是对象,它的所有语法都围绕着它。其他程序的基本结构和变量:sequence,loop,branch,之前有其他语言基础,只是换个形式而已。理解对象后,围绕对象的概念:类和接口是自然的扩展。当然,如果你掌握了核心概念和基本语法,你只能写出一个HelloWorld级别,但关键是你的起点对了,路就近了。在这个阶段,通过阅读好书和做一些基本练习来熟悉语言和相关的类库。在我的印象中,《Thinking In Java》是一本Java入门的好书。我的感觉是这种入门书可以多看几本书,参照一个知识点看。毕竟一个作者也可能有疏漏。横向阅读而不是从头到尾纵向啃书。一个知识点一个接一个地把握,搞定,一步踏出一个很深的脚印。别乱跑,结果一般,开始慢慢来,以后就快了。关于地基,在我看来,核心重要的部分并不多。这里我简单罗列一下:◆核心概念,对象模型,接口设计,◆类库,langcollectionsconcurrentio,核心概念这里就不多写了,基本都体现在所有的Java代码库中,随着与时俱进,区别仅在于理解和抽象的程度。JDK中的库太多了,这里只列出上面的。其实lang中最重要的就是String,很多人都忽略了。C里面没有String的概念,Java提供了这个对象,但是如果没能很好的理解和使用好这个对象,以后就会踩到无穷无尽的坑,而且还会反复踩。不信你去搜一下各种字符编码乱码还有多少低级问题,除了String引起的各种性能问题。从String的核心对象,字符的编码,字符的字节表示(大端,小端,网络字节序),对GC的影响,正则表达式,模式匹配可能是Java中最有内涵的。目的。Collections框架提供了大量常用的数据结构包,基本上让Java程序员告别了手动实现大部分你在数据结构课程中学到的常用数据结构。正确理解不同数据结构的适用场景,比手动实现有用得多。没事就看看Collections里面的代码,都是大师级的实现。记得我学Java的时候,还是JDK1.3。我开始工作后,主流是1.4。那时候还没有并发库。自己处理线程间通信的时候,各种通知漏报,提前通知,死锁,死锁。所以现在Java程序员就快乐多了。Concurrent是另一个大师级别的类库实现,大家可以看看,自己琢磨琢磨。IO库,不管是文件IO还是网络IO,都是Java程序员最常打交道的。熟悉它的API固然重要,但更重要的是了解如何对IO操作进行抽象和建模,了解不同的IO模型。其背后的本质和原理。好了,完成了以上基本内容的学习,我们就得到了第一张地图,如下图。第二个,即使你已经掌握了第一张图,想要在Java的世界里自由奔跑还是有些吃力的。Java的主流使用场景之一就是后端开发。在它的前一个时代,这个领域被J2EE(现在称为JavaEE),也称为JavaEnterpriseEdition所统治。J2EE包含的内容很多,核心是EJB。那时,我刚在学校学完分布式对象技术,并以CORBA和EJB为例进行了实现。看了好几本EJB设计模式和最佳实践的书,然后还没毕业就进公司实习了,发现大家都说现在用不了EJB。我们使用一种叫做Spring的东西。IoC、DI等新的英文缩写再次出现。一口旧血还没喷出来,我又开始了新的学习之旅。是的,在那段时间(2005年)左右,EJB逐渐脱离了主流。罗德约翰逊博士的音乐,用一本书《Expert One-on-One J2EE Development without EJB》宣告了EJB的死刑,Spring走上了历史舞台。从此,Java进入框架开发时代,SSH/SSI等技术框架的结合形成了Java开发的主流,并持续影响至今。Java框架越来越多,生态越来越大。初学者面对如此复杂的框架一定是一头雾水。感觉学无止境,学无止境。其实在实际项目中,真正用到的框架并不多。SSH/SSI基本上是JavaWeb项目的核心框架。它是你入门的核心武器,你需要掌握它。但是你需要知道为什么。Spring接管了对象创建和相互依赖管理的工作,并将设计模式隐藏在框架的应用程序中。很多人只知道怎么用,却从来没想过。Web开发从早期的JSP炖锅(HTML+CSS+JS+Java+SQL,我早期只是把这些都放在一个JSP里,想想维护起来有多难),到职责分工MVC。只有一个View层也经历了从标签库到页面模板(Velocity、Freemarker)的演变,现在更喜欢更彻底的前端分离模型。曾几何时,调整几个页面的CSS样式会浪费我的时间。专业化分工有利于效率和深度。互联网和移动互联网的大发展带来的Web版的演进,使得前端的复杂度已经不逊于后端。.那么作为Java工程师需要掌握多少框架呢?这是一个骗局,因为掌握不止一个是不够的。解决的办法是熟练掌握几个核心的,泛泛地理解大量的,掌握快速学习框架的能力。仍然以SSH/SSI为例,前端专业分工的趋势越来越明显,彻底解放了后端Java工程师的苦恼。以Spring为例的框架解决了大量的通用问题。今天的Spring比原来大了几十倍(算上所有以Spring命名的子项目),都是解决具体的通用问题。所以当你写代码突然想写一个以Util命名的类时,停下来想一想这是不是一个解决通病的类。不妨搜索现成的类库。例如,ApacheCommons可能有您需要的东西。代码。通用类库和框架使我们能够专注于业务逻辑和效率,这可能是您代码中最有价值的部分。可能有的程序员会抱怨这些不是技术,但是我觉得最有效的技术可以用来实现业务价值最大化才是最有技术含量的东西。框架就像一把武器。18种(远不止18种)武器我可能不知道全部,但我们一定要有一种能力。就像张无忌学太极剑一样,学剑对敌就能胜他。这里的诀窍是不要学习动作。举个例子,你可能认为自己对Hibernate的用法掌握得很好,但是一上线数据库就先崩溃了。这里的本质还是对关系型(SQL)数据库的理解,现在可能需要补充对具体非关系型(NoSQL)数据库的原理和机制的理解,甚至是对O/R映射本质的理解模型。所以,基础好比内功,框架好比兵器,用好就是一招。一心一意,用得其所,三者合一,则已可置身于Java世界的一方。如上所述,基于此我们有第二张地图。第三张图,扩展图,第三张图,我已经不能给出一个我认为略有普遍性的建议了。在这个阶段,每个人的成长和发展方向都会受到环境和实际情况的影响。我将以我自己为例来说明。进入互联网公司这几年,Java技术的发展开始从单一的J2EE容器化应用转向SOA和微服务。大规模分布式系统成为常态,所以我更多的相关工作都集中在这个领域。一方面,深挖持续补知识盲点。比如分布式程序的基础是RPC调用,而RPC的本质是网络加对象序列化。相应的,去吃透TCP的原理,Unix/Linux下的网络编程模型,以及几种不同的网络IO模型。然后再上去Java基于此提供的网络编程模型,BIO(阻塞),NIO(非阻塞)和AIO(异步IO),结合实际工作实践深入理解。在这个过程中,接触了大量不同的RPC技术,从Java自带的RMI到WebService技术规范。后来,一些更简洁、更强大的RPC框架相继出现,如Hessian、Thrift等。不同框架的本质是一样的。随着服务的发展,基于RPC框架进一步衍生出提供附加增值功能的服务框架,例如阿里开源的Dubbo。随着工作实践的深入,可以深入到JVM层面去分析对象的内存占用、线程的调度运行和延迟。这个阶段的核心作用仍然是如前所述的快速学习并应用到工作实践中的能力。深度的另一面是横向扩展,随着工作性质的变化,这可能需要更广泛的技术知识。比如成为架构师之后,在某些方面对技术知识广度的要求会更高。有条不紊的技术学习和涉猎技巧,让你更快地拓展技术的广度,从更高的维度审视不同的技术方向和产品,做出最有效的技术决策。这个阶段每个人可能面临不同的环境和做法,所以这个阶段形成的地图会有很大差异。下面是我的第三张图,仅供Java之旅的同路人参考。而这些截然不同的地图走过的路,恰好构成了完美的你。即使你还没有地图,也不要茫然,永远原地踏步。如果你一直往前走,你总会找到方法的。事实上,这就是我来到这里的方式。我一直不敢停下来。