几个星期之前,我在知乎上看到一个提问,说是:对于完全没有经验零基础自身的数学底子也很弱学习Java应该怎么学习呢?想着类似的问题我也有过回答,并且反馈还是蛮好的,就参考之前的思路回答了一遍
本文是一篇较长的学习心得,建议收藏反复观看
提出问题的是一位高中生,就顺藤摸瓜加了我好友,让我给指点指点。本着助人为乐的精神,我还是从自身的角度来分析问题,毕竟我也工作多年,给初学者一些信心是我该做的;给初学者一些指导,是我力所能及的;给初学者一些劝退,也是我要做的,毕竟很多人可能最后发现自己并不适合写程序。
期间这位老弟和我聊了很多,我都零零散散给了解答。直到前几天,他抛给我很多困惑,都是在初学的时候会面临到的,所以我就抽时间做了一次详细的解答,主要涉及到Java从入门到进阶需要经历哪些、如何学习Java入门、还没开始实践就有一堆烦恼,该怎么办?
本文将以问答的方式,给出一些简单的见解,因为Java内容挺多的,可能会有遗漏,我已经让群里的小伙伴们做过一次筛选,读者朋友们看到了,也可以给我更多的补充噢。
知友:哥,我前两天也想了一些编程的问题向您请教请教吧,希望能得到你的帮助
第一个呢就是Java学习路线是什么,Java各个阶段需要学的知识点有什么,课程大纲,就是和课本上似的都有目录包含了所有的哪些知识点Java,从基础到入门再到精通应该如何学?先学什么知识点在学什么?包含了什么知识体系Java里,辛苦你能不能和我仔细说说呢
答:
Java现在主要的领域是作为后端在应用,尤其是他的微服务领域,很多国内外知名的大厂都是使用Java作为后端,甚至有大V认为,在微服务领域Java无人能及。
所以,我们学习Java的目标就是把自己培养成微服务的人才。虽然,Android开发,部分前端也是用Java,但是结合你的实际情况,我还是建议往微服务领域走了,也就是Java后端。
Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。
关于基础知识学习
学习基础知识,就是让你对Java语言有一个初步的了解,其实,任何语言的基础知识都是大同小异,包含基本的数据类型以及基本的面向对象知识,面向对象是重中之重,只有有了面向对象的知识,在后续的开发中才会有更好的成长。
基础知识包括(主要参考《Java核心技术卷》即可):
基本程序结构:基本变量类型、运算符、字符串、流程控制、数组
类与对象:类的定义和使用、静态属性和方法、继承、包管理、枚举、反射
接口和抽象类:接口的定义及实现、抽象类的定义及实现
泛型:泛型类、泛型方法
集合:集合接口、列表、Map、树、排序和查找
异常与调试:内置异常、声明异常、自定义异常、捕获异常、日志
多线程:多线程概念、使用线程、同步
关于Spring等学习
有了一定的基础知识,接下来就直奔主题,在这领域里,Spring就是需要学习的利器,下面是编写Spring相关,需要掌握的知识,可能不止,也可能有遗漏,后续可以再补充
1.Maven:Maven与包管理、POM文件、生命周期等
2.Spring Core:依赖注入与控制反转、Spring概述、Spring容器与生命周期、自动装配、注解装配、切面编程(AOP)
3.HTTP协议
4.JSON知识
5.Servlet概念
6.Spring MVC概念:配置Spring MVC、参数传递、实现REST、权限控制等
7.RPC框架
8.RESTFul
关于Spring的学习资料,推荐《Spring实战》,之前群里有人中奖,我赠送过一本,需要文档的可以戳链接:https://shimo.im/docs/i7o2oKkDuiA319g3/《Java笔记、源码、面试、文档、视频资源免费获取》
关于应用中间件的学习
这一部分,就是Java开发中常见的“中间件”,这些中间件涵盖了各个领域,包括持久化、缓存、队列、反向代理等,这些是完善一个程序的重中之重,前面属于基础框架,这个就是给框架里填充必要的东西,让程序健壮稳定。
主要包括但不限于
MySQL:关系型数据库概念,数据库的CRUD操作
MyBatis:OR映射概念,配置,映射,基本Java库,和Spring集成
Redis缓存:缓存概念、Redis的使用
NoSQL:NoSQL概念,Mongodb的使用
队列:队列概念,RabbitMQ、Kafka
反向代理:反向代理概念,Nginx的配置和使用
Linux:远程连接Linux,Linux的常用命令
其他补充
其他的一些补充,主要是在于非技术相关,但是在往后的项目使用中,是肯定需要用到的。
开发工具:IDEA、Eclipse
版本控制工具:Git、SVN
Docker容器:环境部署
大体上就分为上面的三个部分,但是每个部分都有很多小的部分,基础知识最容易,也是重中之重,因为后面所有的代码编写,没有基础知识,一些都执行不了。
问了这么多,写了这么多,还是不能停留在理论,最好的方式就是实践。
知友:第二个就是学习方法没有找到,不知怎么学,什么方法学起来很容易还不会忘记也不会不想学,我现在真的很迷茫,想学但是不知道该怎么学,特别是在你说的多实践敲代码问题上也就是第三点敲代码
我现在的顾虑就是不知道该怎么去灵活的敲代码,还有怎么才能做到编写代码很准确速度提上来呢现在吧脑子里还没有学究一想编写代码就无所适从,不知该怎么敲,心里就是觉得敲代码很困难,无法下手去敲,更别说多去实践了
还有就是在敲代码问题上如何才能按照给出的题意或者产品开发旨意编写出代码来呢?问这个就是我现在感觉这个很困难,之前在学校刚学c的时候根据课本源代码敲都敲错了,更别说布置的根据意思敲我直接不会,一想到这个我真的怕了所以才问自己适不适合,辛苦你了哥希望能给我仔细跟我说说
答:这几个连在一起回答。
Java开发也好,C语言也罢,还是其他的语言学习,都是需要实践的;这个你就把自己当成一名技术工人,泥瓦工也是经过千锤百炼才能造房子,包装工也是经历过千万次的包装才能做到得心应手。语言组织也是如此,作文就是一字一句积累起来的。
毕竟编程是一门技术活,不是靠单纯的体力活动能胜任的,所以,这个无他,唯有熟能生巧,才能达到写代码的地步。但是写代码这个要求太低了,还远远不够。
我经常和群友说,编程到最后并不是写代码,写代码是最最容易的事情。在写代码之前,还有需求分析,技术选型(选数据库,选中间件等),架构设计,流程设计,算法选择,这些都完成了,那你把这些转换成代码就是水到渠成的事情。
这里只是给出一个最终的目标,针对初学者,一开始不能好高骛远,也不能被困难所吓倒。我上面给了学习路线,你看明白了吗?所以,你现在心里有数,有没有被吓到,如果没有,那么请你仔细阅读《Java核心技术卷1》,把上面的基础知识都先掌握,出现的代码都在编译器上实践,一行一行编写,理解他。如果已经被打到了,那后面就没有什么事了,好好选择一个更好的出路即可。
等基础知识都慢慢地学会,然后再去找一些小Demo,比如说实现一个计算器,就能检验你的学习成果。写代码是一个循序渐进的过程,基础先学会,逐渐就有成就感,那后面的困难就迎刃而解,否则等到后面学习算法,项目时间,困难重重。
知友:再说个开发以外的吧,根据之前我也找到了自己的缺点应该在编程上会有障碍吧,我做事呢不考虑后果严重性,缺乏独立思考能力,反应速度慢了思考就慢,所以就不知该怎么做了,自己不会去独立思考,只有等着别人叫着做什么就做什么自己不敢眼事,也不会储存记忆,注意力不集中,认为小问题就不去想去揣摩,想要改变应该怎么改变呢?哥我确实没怎么写过代码,之前没接触过也就跟着课本上照着写,我也忧虑不会编写,即使学了我就怕还不会敲代码不清楚怎么敲,就是从心里感觉到敲代码很困难
答:
写程序除了有技术能力之外,心境也是一大重点。
这里先聊一下学习的方式,人的学习分为「被动学习」和「主动学习」两个层次。
被动学习:如听讲、阅读、视听、演示,学习内容的平均留存率为 5%、10%、20% 和 30%。
主动学习:如通过讨论、实践、教授给他人,会将原来被动学习的内容留存率从 5% 提升到 50%、75% 和 90%。
我们可以看到,你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说。
只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。
学习不仅仅是为了知道,而更是为了思考和理解。在学习的过程中,我们不是为了知道某个事的表面是什么,而是要通过表象去探索其内在的本质和原理。真正的学习,从来都不是很轻松的,而是那种你知道得越多,你的问题就会越多,你的问题越多,你就会思考得越多,你思考得越多,你就会越觉得自己知道得少,于是你就会想要了解更多。如此循环,是这么一种螺旋上升上下求索的状态。
在学习的过程中,我们要不断地问自己,这个技术出现的初衷是什么?是要解决什么样的问题?为什么那个问题要用这种方法解?为什么不能用别的方法解?为什么不能简单一些?……
这些问题都会驱使你像一个侦探一样去探索背后的事实和真相,并在不断的思考中一点一点地理解整个事情的内在本质、逻辑和原理。一旦理解和掌握了这些本质的东西,你就会发现,整个复杂多变的世界在变得越来越简单。你就好像找到了所有问题的最终答案似的,一通百通了。
学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。
总结
大家读完了这几个问答是什么感受呢?这里我简单的总结一下。
首先,就是都关心的问题,我选择了Java,那么我以后能做什么。其实Java能做的很多,只是在现阶段,我们通过编程语言排行榜也能看到,Java是稳居前三,说明他有庞大的用户群体,那么就代表着网络上有海量的 Java 学习资料,良好的社区环境,优秀的解决方案,以及超级多的框架学习,你丝毫不用担心自己找不到问题的解决方案,找不到学习的路径。
我列举了 Java 后端的学习路线,是因为现在 Java 主要在后端发挥着作用。后端 Java 一家独大,几乎大型的互联网和大厂,银行,金融体系后端都是 Java。
其次就是如何学习,我列举的 Java 学习路线也是根据后端的学习路线来,其实还有挺多没涉及到,但是给入门,是足够了。
第三,就是学习方法,怎么学。说实话,编码一直都是取决于个人的学习情况以及自律能力。很多人在学校里努力,在校招的时候就能有一个好的offer,有些在学校里没能坚持下来,可能毕业之后就放弃这条路了;还有些是一开始觉得很感兴趣,后来发现自己不适合,要么学校里选择转专业,要么出来之后转产品,转实施等也算是改行。那么,就是两个结果,用篮球季后赛的术语就是 Win or Go Home。
判断自己是否有毅力学习下来,可以参考下我在上面的建议,当然,如果小伙伴们有更好的建议,可以在留言区给我留言,让大家一起交流交流。
还有这位老弟的问题就是,什么都没去实践,但是一直在担心担心,担心自己不能写代码。但是,如果你不开始实践,怎么知道自己是不是适合,是不是喜欢,是不是会走这条路呢,对吧。