goland编辑区中文字体样式设置
如何系统的学习JAVA?
如何系统的学习JAVA?
java的整体生态和积累实在是太大了。95年至今20多年的积累,几乎涉及到计算机软硬件的方方面面。我暂且就认为,提主所说的精通,是指jdk本身和一些必要的数据结构以及常用框架和面向对象的基本思想吧。
从11年初至今,一直在学习java相关的知识。其中也走了不少弯路。按自己的积累,给出提主一个自认为合理且有一定深度的学习路线。大致分下面几个阶段吧。
1.首先应尽可能的打牢基础的数据结构和简单的算法基础。
可以去快速的学习一些简单的小型系统,来满足软件学习的兴趣和初期成就感。但,一定要回过头,仔细的巩固数据结构基础和简单算法。类似于这种书就可以。
2.熟练使用Java类库和java第三方工具框架。
学习使用java的语法,尝试理解Java语法设计的逻辑。熟练掌握jdk类库本身,以及各种第三方类库工具包和第三方框架的简单使用。这里学习的同时,推荐看看《设计模式》,《代码整洁之道》,《spring源码解读》,《Spring揭秘》等这一类的书集。
3.理解学习jdk类库本身的应用源码实现和主流第三方框架的源码和架构设计。
比如jdk本身的数据结构二叉树,红黑树,treemap,以及异步包的unsafe,同步阻塞队列,call-future等等包源码,以及线程基础类的实现,各个类库设计的结构和设计模式。吃透第三方框架的设计思想,理解学习第三方框架的核心源码。
当然,这里面可能会涉及到其他的事务,分布式协议等,这里不再展开。这个过程并非一朝一夕,可能需要大量的时间和技术感悟。当然,《设计模式》,《代码整洁之道》,《spring源码解读与设计详析》,《Spring揭秘》等等这一大类书,在这个过程可以理解大差不差了。
4.理解jdk,jre即jvm原理和实现。
这里我推荐看下葛老师的《实战java虚拟机》,里面讲解比较偏实操。容易上手理解。
首先,可以从jdk自带的工具学习来入手。
比如:jstat,jmap,jstack,jps,jdb.......甚至还有直接可以窥视运行期间实际内存数据的HSDB。当然,作为学习初步,我们只需要理解常用的几个命令,并知道其代表的意义即可。毕竟,第三方监控工具,包括jdk本身也提供了3个可视化的监控。
其次,理解jvm的运行加载原理,搞懂class文件结构。
这个过程我们可以借助之前会用的监控工具,理解jvm加载的基本原理。可以参考官方各个版本的jvm标准,学习看懂class文件。在此基础上可以使用如classpy等工具,方便我们直接阅读class文件。也可以试试支持class字节码级别的单步调试工具。甚至,可以尝试用用jvm汇编编码工具。
接下来,理解jvm的垃圾回收机制发展历史和各个主流垃圾回收器的工作原理。
这个过程其实非常复杂。垃圾回收器有各种串行,并行,新声代/swap和老年代,以及回收警戒线,full触发条件,各种个样的基本参数和不怎么用的超参数,以及G1的H区,ZGC等等。。。还好的是,GC并不属于jvm官方规范的一部分。
然后,动手做一些jvm的实践和实战,
比如,jvm常见的故障排查和故障总结,性能调优,热加载,class字节码的动态操作,asm等。
最后,可以尝试实现自己的jvm。(当然这个步骤,对很多同学来说不是必须了)
这里我推荐几本书,也是彻底搞懂jvm规范的学习路径。最好自己实现垃圾回收器。
周老师的《深入理解Java虚拟机》。
接下来是《深入嵌入式java虚拟机》和配套源码。这个cldc的jvm源码只有1M多。目前在oracle的官网上,仍然可以下载。是一个设计非常精简的jvm实现。
接下来,可以去阅读《自己动手写java 虚拟机》。这本书的jvm实现是采用go语言编写。当然其中也有很多设计并不是非常合理。但基本都遵循了jvm规范。
这个时候就可以去看看github上各种jvm的开源实现了。有go,scalajvm,javainjava,ajvm,python-jvm,lua,各个版本各个不同的jvm实现。
当然,这些实现都只是基本原理。
后面推荐你去看《实战hotspot》豹子书,关注高级语言虚拟机的圈子。
当然,垃圾回收的书籍比较少,这里还是推荐给你垃圾回收的经典书《The Garbage Collection Cookbook》。实际上对新的垃圾回收算法有兴趣,可以去知乎搜索相关的论文和GC算法开源实现的demo。
5.当然,我的建议只是针对Java本身。
真正要达到完全学好java生态,软件工程,计算机网络,大数据基础知识,mahuot,sparklib,分布式搜索架构,各种消息中间件,缓存中间件,数据库,DNS/CDN。。。。。这些都是做互联网应用,避无可避的。
只能建议,通用知识熟练,钻研方向精通,相关生态了解。
由于提问是针对java本身。我就不再展开说其他具体方向了。描述的是大的技术方向,并没有其他答主那样,具体去讨论语法糖这种级别。希望对提主有所帮助。
有任何问题,欢迎关注回复,与我讨论。谢谢。
前端开发和后端开发有什么区别?
前端,也称web前端、web客户端、通常是指网站的前台部分,运行在PC端、移动端等浏览器上展现给用户浏览的网页,包括网站的表现层和结构层,通俗点就是用户可以看到的部分,前端与后端(服务端)相对应,前端调取后端(服务端)的数据展现给用户。
打开百度APP,查看更多高清图片
Hotodo导学
前端开发做什么?
前端工程师,又叫web前端开发,前端开发是从网页制作演变而来。早期的网页制作主要内容都是静态地,以文字图片为主,用户使用网站也以浏览为主。随着互联网的发展,现代网页更佳美观,交互效果更加显著,功能更加强大,于是网站开发细分成了前端开发和后端开发。
前端工程师通过前端技术完成界面设计、界面展现,交互效果,页面维护、网站优化等等。通俗点讲,就是设计、制作网页,实现网页上各种各样的特效和功能。
前端开发需要具备什么技能?
前端开发的主要语言是JavaScript,JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaScript实现的。简单地说,JavaScript是一种运行在浏览器中的解释性的编程语言。在当今Web世界里,只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互,你没有其它选择。
现在前端开发的主要技术通常是指html、css、javascript技术和一些前端框架的使用,如Bootstrap,jquery,react,vue,angular等。
前端开发的一般要求如下:
计算机或相关专业,熟悉常用的数据结构和算法;掌握操作系统与计算机网络等专业知识;
熟悉HTML、JavaScript、Ajax、CSS、HTML5、ES6、CSS3等web开发技术;
掌握至少一种主流的前端框架(react/vue/angular),对于可视化开发有一定经验,具备一定的框架设计能力;
熟悉Web应用系统开发,对HTTP、TCP/IP协议有深入了解;
熟悉Nodejs,对前后端分离模式有深入理解并有实际项目经验;
具有较强的沟通能力与团队合作精神;具有良好的分析问题、解决问题的能力以及较强的学习能力。
什么是服务端(后端)开发?服务端开发做什么?
服务端(后端)是相对于前端(客户端)而言的,服务端,顾名思义是提供资源服务的,客户端发送的请求交给服务器端处理,服务器端根据用户的需求,处理完毕后以response对象的形式返回所需资源(数据)给客户端。客户端,通常以request对象的形式发送请求给服务器端处理。现在的应用,不管是web应用还是独立APP,并不是所有功能都请求服务端处理,有些功能比如简单的数据统计,客户端就直接处理了,但很多功能是需要服务端统一处理的。这就像水龙头和自来水厂的分工,用户需要水,打开水龙头就相当于给服务端发送请求,供应的水质好不好、水源足不足取决于服务端自来水厂,而希望水来的缓慢一点,在客户端调节水龙头就可以实现了,就没有必要通知自来水厂去做任何处理。
?
服务端开发,就是开发运行在服务器端的程序,为客户端提供API接口服务。软件客户端和服务端的协作,分为B/S(浏览器/服务器)和C/S(客户端/服务器)两种模式,浏览器就是一种通用的客户端,现在流行的APP就相当于个性化的客户端,无论B/S还是C/S都要有相应的服务器端程序提供服务。对于绝大部分应用,服务端的核心就是数据库,服务器端的程序就是根据应用需求来管理和操作服务端的数据库,通过对数据库的操作,返回满足用户需求的数据。那么服务端开发,使用什么语言和数据库呢?
?
几乎任何一种开发语言都能作为服务端程序语言,但每种语言的流行度和学习成本不一样,各自的特性也有较大差异。当前比较流行的服务端语言有Java、Python、NodeJS、PHP、Go语言(Golang)、C语言、C 、C#等。入门学习,NodeJS很不错,因为是跟前端开发的生态是一样的,都是用JavaScript语言,最容易上手;其次是Python和Go语言,这两个语法都很简洁,都属于后起之秀,但Go语言的性能要比Python高很多,Go语言的开源轮子没有Python多;PHP很容易上手,前几年聚集的开发者也很多,但近几年逐渐被NodeJS所取代;Java语言流行的最久,其生态也很完善,但其语法和生态复杂、学习成本较高,开发者有可能会转移到其它后起之秀的语言;C语言通常用于底层与硬件结合的驱动、固件以及高性能计算等软件开发,是一门经久不衰的开发语言;C 和C#通常用于PC桌面客户端应用程序开发,PC客户端和服务端都能用C 和C#实现,C 因为性能卓越与C是近亲而且比C语言更面向对象、开发效率比C语言高,一直不温不火,而C#开发者已开始越来越少。就像没有十全十美的人一样,也没有十全十美的开发语言,开发者主要根据学习成本、语言流行度、生态完善度和应用场景去选择学习那种开发语言。快速入门,建议选择NodeJS;进阶追求开发效率和性能,建议选择Go语言(Golang)。
?
服务端开发除了至少要精通一门开发语言之外,常用的数据库是必须要会用的。在当今的互联网应用中,最常见的数据库模型主要有两种,即关系型数据库和非关系型数据库。常用的关系型数据库有Access、SQLite、MySQL、MariaDB、SQL Server、Postgre、Oracle等。常用的非关系型数据库主要有键值(key-value)存储数据库Memcached、Redis、MemcacheDB,列存储(Column-oriented)数据库Cassandra、HBase,面向文档的(Document-Oriented)数据库MongoDB、CouchDB,图形数据库Neo4J、InforGrid。一般只要掌握了Redis、MySQL和MongoDB这三种数据库,就能满足绝大多数应用需求,掌握了这三种数据库之后,学习其它数据库也就非常容易了。