最近一直在重新学习java的基础,也写了一系列的博客(重新认识java系列)。很荣幸得到了许多同学的反馈。其中有许多人是初学者,来问我一些问题,也有一些是已经有过一定的基础,看了我的博客,也有了一些新的认知,来和我讨论。当然,大部分人都是在问我怎么学习,自己不知道该怎么学了,让我出个主意啥的,真正讨论问题的并且加了我好友的,大概只有两个吧。因为总有人陆陆续续的加我并且问我怎么学习啊啥的,一个一个回复同样的内容我觉得没有什么必要,所以在这里总结一下,方便自己也方便大家。
前排提示:我不是什么大神,有n年经验的大牛。我只是一个在校本科生。不保证我说的都是对的,但是我所说的,都是我自己的亲身经历。不保证对所有人都适用,具体情况,请大家自行斟酌~
java的方向
有一些初学者在学java,但是却不知道学了java可以做什么。我来粗略的总结一下。
做桌面程序
桌面程序,就是我们平常使用的客户端。由于java是一门跨平台的语言,所以用java写的桌面程序天生就是跨平台的。但是,不得不说,awt和swing做一个桌面程序实在是太痛苦了,javafx也不咋地。所以,除非你神经大条或者只是想学习了解一下。不建议这条路。
做游戏
在我的印象里。。用java写的游戏只有mc。。。我知道肯定还有别的,但是应该都不怎么出名吧(也有可能是我孤陋寡闻)。所以,很明显,这也不是一条有前途的路,除非你也能写个mc出来。现在做游戏还是c++,lua,js,c#多一点吧。讲道理我也不太熟,但是我知道,用java写游戏不靠谱。
写服务端
这是学java的三个最好的选择之一。现在大型的网站基本上都是用java写的。虽然现在服务端百花齐放,php,nodejs,go,ror,python都在抢这一块的饭碗,但是java还是有很大的竞争力的。不信?bat现在在春招,你去看一下岗位,都有招java的,但是其他的呢?反正我是没看到。。
当然,我这不是在说java无敌,宇宙第一,而是说,java在服务端的前景还是很好的。
唯一的不好就是,学的人有点多,初级程序员满地跑,没有一定的实力还是不怎么好混的。不过,我感觉现在java服务端找工作还好。。反正我找个实习两天就找到了(大概是我要求不高。。)
android
这个就是最好的选择之二了。不多说了,有google爸爸支持,android未来n年还是死不了的。虽然现在也可以用kotlin开发,google也在推自己的dart语言。但是java的地位还是无法撼动的。
遗憾的是,听说最近android不怎么好找工作。当然,我只是听说,毕竟我不是专业的。
嵌入式
n年前,还是直板手机的年代。我记得有的手机支持java。。可以安装后缀为.jar的软件。当时觉得这种手机牛比的不得了。因为我在用这种手机之前一直在用辣鸡国产,那种叫斯凯平台的?忘了名字了,反正用键盘输入*#220807#,就可以召唤神龙的那种手机。。。。
扯远了,当时那种支持java的手机,就是使用的一种叫做javame的技术。javame就是一种轻量级的java,可以在移动设备(手机,汽车车载设备,机顶盒什么的)运行java程序。
不过现在javame差不多也死绝了吧,不清楚。。反正我没接触过,哈哈哈。
大数据
这是最后一个我推荐的方向。都说现在是数据时代。各种大数据技术层出不穷。目前处理大数据的技术有python,java,R等。虽然说java没有绝对的优势,但是也是一大霸主。不服?hadoop就是用java实现的,还用多说什么么?
要学习什么内容
先声明一下。我接下来的建议,都是针对在校的大学生或者有充足的时间的转行的人的。对于那些想要快速转行,然后找到工作的可能不是很合适,因为我的建议或者说经验是需要很多时间的。
首先,不管你以后选择什么方向。基础永远都是最重要的!!!不要觉得自己看了一套视频,或者看完一本入门的书,能写个简单的代码就叫学会了。你还差的很远。工作好几年的人也不敢说对java基础了如指掌。所以,巩固基础不分时间段,你的职业生涯的任何时刻,都应该巩固基础。并且,基础不只是java的知识,还有一些基本的算法,数据结构,计算机网络,计算机组成原理等。
所以,第一要学的,是基础!(要不断的学)
其次,现在互联网每天都在不断前进。无论是网站还是app都需要有服务端才能运行的起来(单机的和静态网站还是不多的)。所以,不管你以后会不会从事java后台的工作,我觉得了解一下还是很有好处的。而且,一般的大学应该也会开javaweb这门课吧。
所以,我觉得每个学java的人,在时间充足的情况下,可以去学习javaweb。当然,如果你本来就是想往这个方向发展的,那就更不用说了。
最后,我推荐大家了解一下大数据。为什么呢?现在是一个大数据的时代,无论你是否要往这个方向发展,多了解一些总是有好处的。分布式文件系统,分布式数据库,负载均衡等前沿技术多接触接触总是好的。
所以,我也建议大家可以多了解一些大数据方面的知识。
当然,以上是我个人的见解。每个人都应该有各自的人生规划,你也可以按照自己的规划来。
怎么学习
其实,我主要是想说这一部分。每个人都有自己的学习方式,我来分享一下我的。
大一
这个时候,刚刚接触计算机,你可能什么都不懂,听课也是一脸懵逼,什么for循环,if语句,恶心的不得了。这个时候你要做的不是抱怨,而是去努力的寻找乐趣。因为你已经入了这个坑了,除非你转专业,否则你是摆脱不了它的。
怎么寻找乐趣呢?我觉得,编程最大的魅力,就是当你成功的时候的那种发自内心的成就感。不知道大家还记不记得第一次写helloworld的时候,各种出错---分号写成中文的了,大括号少了一个---但是最后终于成功的输出了结果的那种喜悦。
对于一个刚刚接触编程的人,我觉得,写游戏是最容易获得成就感的。这里给大家推荐一个之乎专栏--- 做游戏,学编程(C语言)。专栏的作者,通过让一些学生做游戏来学习c语言。我觉得这个一个很好的学习方式,即有挑战性,又可以培养出成就感。
大学的入门语言差不多都是c或者c++吧。。如果不是,你也可以参考一下专栏里的小游戏,然后用你自己的语言试着写一下。
但是,我要重点说的是。写游戏其实是一件很有挑战性的事。有的人也许会在一开始就陷入困境,不知道如何继续下去。这个时候,如果你能坚持下去,多问问老师,学长,百度,google,把问题解决,那你以后肯定会很优秀。如果你放弃了,不要灰心,因为并不是所有的人都适合通过游戏来培养兴趣,你也可以通过做一些acm的题来提高自己。每个学校应该都有相关的网站吧。如果没有的话,可以去浙大的看看。(来我们学校的也行。。。http://cpp.zjut.edu.cn 或者 http://acm.zjut.edu.cn) 。做一些自己能力范围之内的题,也可以提高自己的兴趣。
当然,这些只是针对一部分同学,毕竟很多人其实对代码无感。。根本耐不下性子去写代码。对于这部分同学,我建议去学习html 和 css。因为它们入门超级简单,是用来写网页的。没有c语音那么复杂的逻辑,几个标签,几个css就可以设计出一个精美的网页,我想这也会很有成就感吧。
大一的这一年,是打基础,培养兴趣的一年。不需要你有多么大的成就,写出多么厉害的程序。只要你能够培养出兴趣,并且愿意在编程这条路上走下去,那么你的任务就算完成了。
所以,这一年,你要做的,就是培养兴趣,让自己爱上编程(最基本的要求)。
大二
假设你现在已经喜欢上编程了。但是一般大一只会学一门语言(默认c/c++,不要问我为什么,因为我就是这么学的。。)。所以你可能只是写了几个小游戏,写了个小管理系统或者刷了一些题。你不满足于现状,你想做一些更有意思,更好的东西。同时,这个时候,学校应该也开了java课了。(如果没开,你就自学。毕竟这篇文章讲的是java,主角再不登场就没有多少露脸的机会了)。
写在前面:大二要做的,是拓宽你的广度!!!广度!!
首先,你要好好学java。可能学校的进度是一个学期。但是我建议大家用一个月的时间学完。因为有了c和c++的基础,java其实很容易就学会了(入门级学会)。更好的情况是,你在大一结束的那个暑假,就抽时间先搞定java基础。这样当开学的时候,别人还没接触java,而你可以骄傲的和别人说,你都学完了。成就感满满的。
那么,怎么学java基础呢?我的建议是视频为主,入门书为辅,自己跟着写代码。
看书其实是一件很枯燥的事情,如果你初学java,只是看书的话可能配置一个环境变量就要搞好久,这会打击你的自信心。不要小看配置环境变量这个过程。我记得当时两天配不好环境变量最后让我帮忙的人可不少。但是视频就好多了,因为老师会亲自演示给你看,你会少走很多弯路,并且也比书有趣多了。
书为辅,是因为老师不可能记得所有的知识,总会有疏漏的地方或者讲得不太好的地方,这个时候 书就可以派上用场了。看完一节课的视频,然后关掉视频,自己写一遍相应的代码,出错了自己先试试能不能解决,是在不能的话,再看一遍视频,直到跑通。然后去看看书里对这部分知识的讲解,加深印象,查漏补缺。
这里的重点是,一定要自己写一遍代码。你看的时候觉得自己会了,可是大部分时间,你一写全是错误。所以一定要自己写。并且,在你初学的时候,不要使用编译器(eclipse idea NetBeans等),就使用notepad++这种类型的编辑器就可以。
这套流程最大的缺点就是耗时比较久,但是效果是很好的。java里有很多都和c/c++一样的,比如一些语句什么的,如果你已经掌握的很好了,直接忽略掉这些也是可以的,这就看你自己的情况了。
推荐一些学习资料(后面会给出)。
- 视频: 毕向东,马士兵,韩顺平的视频都挺好的。口碑也都不错,不信可以自己去百度一下。我看的毕向东的,讲的挺有趣的。但是每个人口味不一样,你可以多下载几套,都听一下,然后选一套自己喜欢的。
- 书籍:入门推荐《head first java 》。head first 是一个系列,这系列书最大的特点是图文并茂和案例驱动,让读书的过程不那么的枯燥。《疯狂java讲义》据说也挺不错的,但是我没有看过,不做评价。
- 编辑器推荐:notepad++ 免费,小巧。初学者够用了,直接百度下载就好。sublime , vs code, atom 也可以,挑一个自己喜欢的就好。
一个月,干掉java基础!这是你大二首先要做的事。
前面说过,这一年,你要做的是拓宽自己的广度。什么意思呢?就是说,你要尽可能的去多接触一些技术,多学一些知识,因为你以后很难再找到这么多你可以自由支配的时间了。
java基础搞定。接下来,学习java web。
你要知道,优秀的人永远都走在大部队的前面。不要学校安排什么你就学什么,学校不安排你就不学。事实上有的老师讲的不是很好,大学里真正有用的知识,都是自己学的。所以,接下来要做的是自学java web。
依旧是视频+书+写代码。
java web更重要的是实践。我当时学的时候的书就是学校的教材。。我是基本没看书的。就跟着视频一步一步来,有问题就google。在大二上学期结束的时候,完成javaweb的学习。
因为需要和前台做一些交互,所以免不了要学一点前端的知识(html + css + js)。在正式学习web之前,先学点前端知识(资料都准备好了,自取不谢)。然后按部就班的学习javaweb。
这个过程中,遇到的问题千奇百怪,我记得我当时一个小问题google了一天都没能解决,最后才知道是jar包版本的问题。。所以,遇到问题是很正常的,遇到很难解决的问题也是很正常的,只要你肯问,肯查总能解决。
好了,你现在已经有了自己写一个小网站的能力了(丑点无所谓)。接下来就厉害了。去参加比赛!进实验室!做项目!没有什么比做一个项目更能提高水平了。
所以,你大二下的任务就是尽可能的去做项目,依次来巩固你学的技术。可以参加一些比赛,或者加入实验室,或者寻求老师的帮助。总之,你要做项目!
除此之外,你需要继续扩展你的视野。前端(不是你之前学的简单的html!),python,android,ios,cocos。。。只要是你感兴趣的,就去接触一下,不需要你学的多厉害,也不需要你完全掌握。只是为了让你的视野更加开阔,知道原来还有这么多技术,原来还可以这样。
大二的一年,你需要学会java和javaweb,并且至少做一个拿得出手的项目。同时,尽可能的提高你的视野。当你觉得你一无所知,你还是个菜鸟,这一年的任务就完成了。
大三
这是很关键的一年,因为这一年你将决定是否考研。考研的我就不管了。。接下来是针对准备一毕业就工作的同学的。
写在前面:这一年,你要做的,是深度!
通过大二一年的努力,你的广度已经足够了。并且在这个过程中,你应该也找到了自己最感兴趣的方向,如果没有,那就继续研究java吧,总比你不知道学什么好。无论怎样,这一年,你的重心都应该放在一条路上。以java为例。
首先,巩固基础!
这是最重要的。怎么做呢?进阶书籍+看博客+写总结+写开源项目。
这个阶段的视频不是很多,也没有必要了。直接看书+看博客+开源项目,最后再总结就够了。我举个例子,比如,我现在要学设计模式,我买一本《head first 设计模式》然后一个模式一个模式的学,每学一个模式,看一遍书,然后google一下这个模式,看几篇高质量博客,结合书和博客自己写一个总结,甚至可以自己写一个博客专栏,让后来者也能享受到你的学习成果。同时,可以好好整理一下自己学习过程中的代码,放到github上,最好可以试着封装一下这个模式,让其他人更方便的使用这个模式。当你收获一个又一个的star时,你会非常有成就感的。
上面是学习的大致方式。学完了,怎么检查自己有没有学好呢?给大家提供一个网站牛客网,你打开就知道怎么用了。
基础都包括什么呢?
- 面向对象的思想。
- java常用类。
- 集合框架。
- io
- nio
- 多线程并发
- 设计模式
- 算法
- jvm
- 计算机网络
- spring
- orm框架
- 。。。
每个知识点,不只是要会用,更要能理解一下底层的原理,有必要的话可以看看jdk源码或者框架源码。
推荐一波资料。
- 《java编程思想》《java核心技术》《head first 设计模式》《设计模式之禅》《java并发编程实战》《重构 改善既有的代码设计》《算法导论》
你要知道,bat等大厂每年会有两次招聘,一次春招,在每年3-5月,一次秋招8-10月。春招是招实习生的,秋招是招正式员工。所以,如果你想进这些公司,就要提前做好准备。至少,上面的那些基础你是必须得都掌握的。
大三这一年,要让你的深度足够,有能力的可以继续延伸自己的广度。这个阶段,最忌讳的是朝三暮四。早上看python,下午发现go很有趣,看了一下午go,晚上听说R很厉害,又去研究R了。千万不要这样!不要成为各个领域的杂牌军,你现在要做的,是在一个方向有一些建树。
大四
实习。。。
实习的话我能给的建议不多,虽然我的实习经历还蛮多的。但是毕竟不是混迹职场多年的人,就不乱说了。
找工作,待遇,环境挺重要的。但是我觉得,这个公司的技术栈,行业背景也是很重要的。我实习的三家公司是三个不同的行业,所以我知道,不同的行业差距还是很大的。有的公司招聘的时候会要求你在这个行业有过经验啥的。所以,行业背景还是有必要注意一下的。同时,为了自己为了的前途,一定要问清楚公司的技术栈!
当然:作为一个有抱负的人,毕业设计一定要向着优秀发展!并且依旧要不断提高自己的水平。这个时候,学什么可能得根据公司的需求来了,但是,永远不要停止学习!
学习资料
这里放一些学习资料:https://github.com/CleverFan/awesome-java-datum 。简单的总结了一下,还有很多没放上去。最近公司的事情和挑战杯的比赛搞得我有点头大。。忙完这阵会都放上去的。大家可以先收藏着。。
总结
大一:培养兴趣
大二:横向发展,广度优先
大三:纵向发展,深度优先
大四:选好方向,不断提高自己
事实上,大二结束以后就可以试着去找工作了(我就是),这个阶段,不要在意工资什么的,只要有机会你就去,一定会有收获的。如果你不知道学什么了,有一个很鸡贼的方法,就是可以多去参加一些面试,多投简历,面试中一定会有你不会的问题,然后你就知道学什么了吧?(面试过了,可以不去的嘛。。。)
在你的学习过程中,你会遇到很多的bug,我建议大家把每个解决bug的过程都记录下来。因为同一个问题,你可能会遇到好几次,整理bug,不仅仅是为了下次遇到能快速解决问题,而且可以养成一种归纳整理的习惯。可以写成博客,也可以以笔记的形式记录,比如有道云笔记等,gitbook也是一个好东西~
我现在是一个大三的学生,经验和经历都有限。所以我也不确定我的学习方式,以及我的看法是不是正确的。但是这些都是我现在正在用的方式。所以我把它分享出来。如果有哪里说得不好或者不对,请路过的大神指点一下。感激不尽。
如果你还需要其他的资料,或者想和我一起学习。欢迎加群281440885。加群请备注,来自博客。刚刚建的,里面只有几个人,都是学生~
很晚了。。先写这些。有时间再补充,欢迎大家批评指正。
本文首发自csdn。