作者:程序员小跃

几个星期之前,我在知乎上看到一个提问,说是:对于完全没有经验零基础自身的数学底子也很弱学习Java应该怎么学习呢?想着类似的问题我也有过回答,并且反馈还是蛮好的,就参考之前的思路回答了一遍,可惜没在公众号里和大家分享,后续再整理一份好好分享下。(该问答地址见原文

提出问题的是一位高中生,就顺藤摸瓜加了我好友,让我给指点指点。跃哥最近飘了,各种给人指点,也不知道是对是错,但是我还是从自身的角度来分析问题,毕竟我也工作多年,给初学者一些信心是我该做的;给初学者一些指导,是我力所能及的;给初学者一些劝退,也是我要做的,毕竟很多人可能最后发现自己并不适合写程序。

期间这位老弟和我聊了很多,我都零零散散给了解答。直到前几天,他抛给我很多困惑,都是在初学的时候会面临到的,所以我就抽时间做了一次详细的解答,主要涉及到Java从入门到进阶需要经历哪些如何学习Java入门还没开始实践就有一堆烦恼,该怎么办?


本文将以问答的方式,给出一些简单的见解,因为Java内容挺多的,可能会有遗漏,我已经让群里的小伙伴们做过一次筛选,读者朋友们看到了,也可以给我更多的补充噢。

知友:哥,我前两天也想了一些编程的问题向您请教请教吧,希望能得到你的帮助

第一个呢就是Java学习路线是什么,Java各个阶段需要学的知识点有什么,课程大纲,就是和课本上似的都有目录包含了所有的哪些知识点Java,从基础到入门再到精通应该如何学?先学什么知识点在学什么?包含了什么知识体系Java里,辛苦你能不能和我仔细说说呢

答:

Java现在主要的领域是作为后端在应用,尤其是他的微服务领域,很多国内外知名的大厂都是使用Java作为后端,甚至有大V认为,在微服务领域Java无人能及。

所以,我们学习Java的目标就是把自己培养成微服务的人才。虽然,Android开发,部分前端也是用Java,但是结合你的实际情况,我还是建议往微服务领域走了,也就是Java后端。

Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。

关于基础知识学习

学习基础知识,就是让你对Java语言有一个初步的了解,其实,任何语言的基础知识都是大同小异,包含基本的数据类型以及基本的面向对象知识,面向对象是重中之重,只有有了面向对象的知识,在后续的开发中才会有更好的成长。

基础知识包括(主要参考《Java核心技术卷》即可):

  1. 基本程序结构:基本变量类型、运算符、字符串、流程控制、数组
  2. 类与对象:类的定义和使用、静态属性和方法、继承、包管理、枚举、反射
  3. 接口和抽象类:接口的定义及实现、抽象类的定义及实现
  4. 泛型:泛型类、泛型方法
  5. 集合:集合接口、列表、Map、树、排序和查找
  6. 异常与调试:内置异常、声明异常、自定义异常、捕获异常、日志
  7. 多线程:多线程概念、使用线程、同步
关于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实战》,之前群里有人中奖,我赠送过一本

关于应用中间件的学习

这一部分,就是Java开发中常见的“中间件”,这些中间件涵盖了各个领域,包括持久化、缓存、队列、反向代理等,这些是完善一个程序的重中之重,前面属于基础框架,这个就是给框架里填充必要的东西,让程序健壮稳定。

主要包括但不限于

  1. MySQL:关系型数据库概念,数据库的CRUD操作
  2. MyBatis:OR映射概念,配置,映射,基本Java库,和Spring集成
  3. Redis缓存:缓存概念、Redis的使用
  4. NoSQL:NoSQL概念,Mongodb的使用
  5. 队列:队列概念,RabbitMQ、Kafka
  6. 反向代理:反向代理概念,Nginx的配置和使用
  7. Linux:远程连接Linux,Linux的常用命令
其他补充

其他的一些补充,主要是在于非技术相关,但是在往后的项目使用中,是肯定需要用到的。

  1. 开发工具:IDEA、Eclipse
  2. 版本控制工具:Git、SVN
  3. 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

判断自己是否有毅力学习下来,可以参考下我在上面的建议,当然,如果小伙伴们有更好的建议,可以在留言区给我留言,让大家一起交流交流。

还有这位老弟的问题就是,什么都没去实践,但是一直在担心担心,担心自己不能写代码。但是,如果你不开始实践,怎么知道自己是不是适合,是不是喜欢,是不是会走这条路呢,对吧。其实我刚读大一,接触 C 语言的时候,尤其是到了指针,链表,想过放弃,但是最后我断了这个念头,我要是不写代码,我大学不是白考了,转专业?现实点,能转专业的,都是班里的女生,死磕学成成绩,名额都没了。那么你还能怎么办,硬着头皮继续吧。

就这样,一直到毕业,我在实验室里看着书,敲着代码,大家的暑假有两个月,我的暑假就只给自己一个月,另外一个月都在学校里渡过,就是为了让自己能不辜负父母的付出。

跃哥今天有点话痨了,但是句句肺腑。接下来,跃哥学习那些优秀的号主,一个系列一个系列的输出,拿出当初编程学习样子,和大家一起奔跑。

答好友困惑:Java零基础如何入门,不知道怎么学,迷茫ING的更多相关文章

  1. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    开发环境搭建好之后,还需要一个集成开发环境也就是IDE来进行编程.这里推荐的IDE是IDEA,那个老掉牙的Eclipse还是先放一边吧,(手动滑稽). IDEA的下载地址:http://www.jet ...

  2. 【JAVA零基础入门系列】Day4 变量与常量

    这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...

  3. 【JAVA零基础入门系列】Day5 Java中的运算符

    运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...

  4. 【JAVA零基础入门系列】Day6 Java字符串

    字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...

  5. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

  6. 【JAVA零基础入门系列】Day9 Java中的那个大数值

    什么是大数值?用脚趾头想也知道,当然是"大"的数值(233).Java中有两个用于表示大数值的类,BigInteger和BigDecimal,那到底能表示多大的数值呢?理论上,可以 ...

  7. 【JAVA零基础入门系列】Day10 Java中的数组

    什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...

  8. 【JAVA零基础入门系列】Day11 Java中的类和对象

    今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...

  9. 【JAVA零基础入门系列】Day12 Java类的简单应用

    俗话说的好,实践出真知,所以除了理论知识掌握扎实以外,更重要的是要多加操练,这样才能掌握核心科技. 今天我们就用刚学会的类来实践一下,目标便是完成上一篇中的剁手任务. 我们的商品类已经准备好了,代码重 ...

随机推荐

  1. 小程序中内容审核功能的使用(后台使用thinkPHP5.1)

    本文包含文本和图片的检测 //接收要检测的文本内容并调用检测方法 public function textCheck(Request $request){ //内容安全识别 $data['conten ...

  2. docker redis安装及配置(外网访问 关闭安全限制 设置密码)

    docker run -p 6379:6379 --name redis -v /usr/local/redis/etc/redis.conf:/etc/redis/redis.conf -v /us ...

  3. Systematic comparison of strategies for the enrichment of lysosomes by data independent acquisition 通过DIA技术系统比较各溶酶体富集策略 (解读人:王欣然)

    文献名:Systematic comparison of strategies for the enrichment of lysosomes by data independent acquisit ...

  4. git 更换push 提交地址

    git 删除远程地址 1.找到对应项目 右键点击 GIT Bash Here 2.输入命令 git remote rm origin 3.对应项目 右键点击 GIT Sync..... 4.点击Man ...

  5. drf-jwt的过滤,筛选,排序,分页组件

    目录 自定义drf-jwt配置 案例:实现多方式登陆签发token urls.py models.py serializers.py views.py 案例:自定义认证反爬规则的认证类 urls.py ...

  6. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之六(四十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  7. MongoDB操作符之$elemMatch

    问题 如果MongoDB 数据库集合中仅存在一条记录 { "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"), " ...

  8. MySQL逻辑分层介绍

    上一篇文章主要介绍了MySQL在Ubuntu18.04系统上的安装,以及安装过程中可能会遇到的一些问题的解决方案. 在这篇文章里,开始介绍MySQL数据库的逻辑分层.通过本文的介绍,可以大致了解到My ...

  9. 2020面试整理【java】

    spring面试题 1.你对spring的理解 Spring 是个Java企业级应用的开源开发框架. Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用. Sprin ...

  10. 在Windows Python3.4 上安装NumPy、Matplotlib、SciPy和IPython

    NumPy 下载地址: http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ SciPy 下载地址: http://sourceforge. ...