我学习 Java 的历程和体会(写给新手看,欢迎老司机批评和建议,持续更新中)

Java 专栏收录该内容
3 篇文章 0 订阅

我学习 Java 的历程和体会(写给新手看,欢迎老司机批评和建议,持续更新中)

最初写这篇文章的时候,是在今年的 9 月中旬。今天,我想再写写这将近两个多月以来的感受。
在今年的 10 月我来到北京求职,开阔了自己的眼界。有的东西知道和不知道就差别很大,何况是不知道和会用、熟练掌握这么技术之前的差别那就是一条鸿沟了。我不再把现在的自己定位为中级工程师了,我现在是一名初级工程师,但我的目标绝不会是初级工程师,我还在努力的道路上。我的工作经验是只有 3 年,不过是零基础的 3 年工作经验,完全是自己“一个人”在努力的 3 年,中间还有离职的空窗期。说这些不是想为自己现在技术上的尴尬找借口,推卸责任,只不过是想告诉自己,一切都要重新开始。


作者简介:李威,今年 29 岁,从事 Java 开发工作 3 年,维护过一些小项目,自己平常也写一些项目。自己定位应该算一名初级程序员吧。主要通过看视频、看书进行学习。这篇文章中分享的一些观点是我自己从事开发工作和业余学习的心得体会,不一定完全正确,有些地方也比较片面。仅供大家参考,如果有不正确的地方,还请大家多多指教和批评。

我叫李威,1987 年生,快 30 了,因为坚决不喝酒和周围环境比较单纯的原因,看起来比实际年龄年轻了一些。

我本科和研究生都是学习数学的,你要说数学没啥用,还真的是没有啥用,到现在估计也就记得一些微积分、线性代数的知识,数学专业的高级课程我也都忘得差不多了,当然这只是一句玩笑话。很遗憾的是,我没有能在数学这条路上一直走下去。

2012 年研究生毕业,按部就班地,我应该当老师去了,很奇妙的是,我去杂志社当编辑了。当编辑的工作让我认识到两个问题:第一,我没有一技之长,即使是读完了研究生,我也没有过硬的基本功能够让我在这个社会上找到一份“适合自己”的工作,毕竟研究生阶段也仅仅知识培养了我作为数学研究者来说最基本的技能和思维;第二,我不能喝酒,也不喜欢喝酒。体制内的工作让我深深地感受到这一点,以前和朋友们喝酒,他们看我不能喝了就从来没有强迫我喝下去,而且我以前待的环境也没有拼酒喝酒的氛围。以前喝酒就跟玩一样,大家看你脸红了,开开玩笑就过去了。但是在教育杂志社的工作让我开始对酒文化产生了不适应(爱喝酒的朋友们对不住了,我只是因为我自身身体的原因),到现在 4 年过去了,我还依然清晰地记得 12 年在杂志社工作和同事们喝酒的惨烈场景,估计都能成为这辈子的阴影了。

解决上面这两个问题,其实很简单。其实只要解决第一个问题,第二个问题就不用面对了。于是我迫切地希望自己能够有个一技之长,能够做个手艺人给自己混口饭吃。于是鉴于自己的性格、数学专业背景和对编程的一点点热爱(当时不能说是热爱吧,只能说是模糊的认识),我想成为一名 IT 从业人员(程序员)。 于是我辞职了。

2013 年开始工作,先后在福州、杭州、上海的三家公司工作过,这三家公司的共同特点是:小公司,氛围轻松,同事关系融洽。但缺点也是显而易见的:非技术驱动,流程不规范,没有传帮带这样的制度。对于我这样年纪大的新人来说,只有自己摸着石头过河了。

平时除了上班完成工作任务以外,我学习的途径主要有看视频、看书、看网络上的资料,当然看完以后的实践是必不可少的。

工作了 3 年以后,我想应该还有很多和我一样半路出家的人,自己在这 3 年以来走的一些弯路可以和大家做一个分享和交流。希望能够帮助到更多的朋友们。

以下描述的一些技术,有些不是必须的,有些则是非常非常重要,但又容易被我们忽视的技术。希望提出来能和大家一起学习。

我目前的技术积累如下:
Java 基础只能说熟悉,还达不到熟练,更谈不上精通。框架会用很多,但也只是停留在应用层面。

Java 基础

Java 基础部分写出来的代码基本上通过 Main 方法或者 Junit 测试方法运行的,不需要通过服务器来执行。

下面对于这些知识做一些简单的概括,来说明他们的作用和重要性:

  1. 面向对象
    继承、封装、多态的思想要理解透彻。这些概念虽然看过去都明白,但是随着自己写的代码越来越多,对一些知识的重复学习,对这三个简单概念的理解会更加深刻。
    例如:我们学习设计模式的时候就会发现,其实设计模式很多的时候就是利用了抽象类、接口、子类继承父类、代码块、static 、final 、重载、具体类实现接口、组合、this 、 super、访问控制符、构造器这些最最朴素的概念。所以面向对象的思想真的是太重要了。这些概念值得反复学习,反复推敲。
    一本很好的书是 《Java 编程思想》,这种经典的书是值得反复看的。
  2. 集合
    学习容器类, List、Set、Map,理解使用 Hash 这种结构对于查找元素的好处。
    从集合这个章节可以扩展到数据结构这门课程的学习。正是因为 List、Set、Map 这些类型有着良好的数据结构的设计,它们才能为我们使用于各种复杂多样的场景、
  3. IO 流
    IO 用于处理文件,学习 IO 流我们可以体会装饰器设计模式在 IO 体系中的应用。
    IO 流从 JDK 1.4 开始就有了新的类库,其目的在于提高速度。
    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO 基于 Channels and Buffers(通道和缓冲区)。
    我们在项目的开发中还会使用到 Apache Commons IO 这个组件中提供的大量工具类。
    特别说明:很多视频和书籍都只讲了基础的 IO 的用法,IO 流的分类,装饰器模式,会搞得你头晕眼花的,一定要耐着性子看完,写完。也千万不要忘记掉,还有 NIO 这部分的内容。要自己在网上或者买相关的书本来学习,目前 NIO
    的视频资源是非常少的。

  4. 枚举、注解、泛型、JDBC
    在要表达有限个对象的场景下,使用枚举让我们的数据更加安全,代码可读性增加。
    注解,现在很多第三方框架都使用注解进行配置,如果我们能够很好地运用自定义注解,可以大大提升我们的代码格调。自定义注解往往要结合反射的知识才能发挥巨大作用。
    泛型将数据安全性的检查提前到编译期,泛型的另一个重要作用就是参数化类型,提高了程序的灵活性。
    JDBC 是使用 Java 代码操作数据库的技术,它是理解 MyBatis、Hibernate 的基础。

  5. 多线程
    学习了多线程我们可以感受到程序可以不止一条执行流,这点体会是非常重要的,也就是培养了我们对并发这个概念的理解。我们还要熟悉线程的创建、线程的几种状态、线程的优先级、让步、休眠、多线程如何通信、什么是线程中的锁、我们的编码应该避免造成死锁。
    还有就是要体会到多线程的程序的理解是要靠一定想象力和代码去验证的,CPU 的调度具有不确定性,这个不确定性如果深入去研究下去,你会发现对底层的机制可以了解得更多。例如 JVM (Java 虚拟机),JMM (Java 内存模型),volatile 关键字保证内存可见性,synchronized 关键字保证原子性和可见性。这里只是提一些关键字。这些知识我也正在努力学习中。
    特别说明:在 JDK 1.5 以后出现了一个并发编程的包,这个并发编程的包,大大的提升了 Java 对于处理并发业务场景的能力,请一定留意。很可能在一开始我们经常编写的 CURD 的业务场景里用不到,但一定要有意识给自己做相关的技术储备。
    这里推荐一个网站:并发编程网
    http://ifeve.com/

  6. 网络编程
    理解 TCP、UDP 是什么。在网络中,数据是通过 IO 进行数据传输的。
    特别说明:网络编程中,也设计并发编程的知识,例如以前我们服务端处理客户端的请求,往往可以通过新开一个线程去处理,但是一条线程的创建和销毁其实是很浪费资源的,如果我们知道并发编程,就可以通过线程池去完成。

  7. 反射
    不要被反射这个概念所迷惑了,反射其实就是通过字符串分析出类的各个元素。在反射知识的学习中,我们会看到,其实在类的外部,我们也是可以访问到类的私有属性的,我们可以把不同类型的对象添加到一个带泛型的集合中。反射功能很强大,很灵活。很多第三方的框架都大量地使用了反射技术,反射技术是理解 Spring 等框架原理的核心。

多说几句,多线程、网络基础、反射这些技术可能作为初级程序员刚刚参加工作的时候可能会涉及不到,但是这三门技术的知识储备是非常重要的,

  1. JVM 虚拟机高级特性
    下面提一些知识点?这些知识点的学习很有意思,能让我们更深层地了解 JVM 的帮我们做的工作。
    Java 内存模型、运行时数据区域有哪些、哪些是所有线程共享、哪些是线程私有,分别的作用是什么?
    如何判断哪些对象已经存活?哪些对象已经死去?
    垃圾回收机制
    对象的引用
    垃圾回收机制的算法
    as-if-serial
    指令重排序

JavaEE 基础

之前,我们写的程序可以说是单机版的。没有服务器的概念。Java EE 技术写的程序就是让我们写的 Java 代码能够在网络上运行。Java EE 有 13 项技术。
Java EE 就是 Servlet (Jsp) 等相关的技术,Servlet 就是 Jsp,因为 Jsp 被 Tomcat 等 Java 服务器解释以后底层还是 Servlet 代码。Servlet 是编写 Web 的核心,通过 Servlet 的学习要理解一般的 Web 应用的请求响应模式(客户端请求网络资源,服务端程序解析请求,并且做出响应给客户端)。

Servlet 有一些知识点是很重要的:重定向和转发,监听器和过滤器,web.xml 文件的配置使用、过滤器、监听器。Servlet 3.0 规范以后的 Servlet 程序是可以不用写 web.xml 文件,通过注解达到相同目的。
当然学习 Servlet 之前,还须要知道一些 Html 基础,因为编写 Jsp 代码的时候,要渲染页面。要对页面实现的逻辑进行一些控制(判断、循环),就要用到标签库,标签库也有很好的现成的可以用,例如 jstl。

接下来介绍框架的学习。

框架学习

说说 SSH

SSH 个人觉得不再是主流,现在的主流是 SSM。

这里想多废话几句:SSH 即 Struts + Spring + Hibernate ,很多早的项目是使用 Struts 开发的,如果维护老的项目可能会遇到 Struts,但是越来越多新的项目已经使用了 Spring MVC,我个人也感觉 Spring MVC 真的太好用了,入门非常快。最近又爆出了 Struts 有比较严重的安全漏洞,这样 Struts 的使用就更难推广开来了。

Hibernate 我在为数不多的工作经历里面确实也没有遇到使用 Hibernate 的公司,我个人的理解是要想用好 Hibernate ,必须对 Hibernate 非常熟悉,理解 Hibernate 高度封装以后底层 SQL 的执行,一级缓存、二级缓存的使用,什么时候懒加载,什么时候又级联操作,还有就是一些比较复杂,具有一定技巧的 SQL 语句,不一定能使用 Hibernate 这种面向对象的框架编写出来。所以使用 Hibernate 操作数据库的难度就无形中增加了,因为原先我们只须要编写 SQL,但是我们现在还要考虑 SQL 和对象实体之间的转换。以上种种,对于 Hibernate 的学习成本就很高了。总结出一句话,对于很多新手来说(当然也包括在下),Hibernate 太难用了。

为什么 Hibernate 慢慢就不用了呢,那是因为有更好用的框架 MyBatis 问世了。MyBatis 前身叫 iBatis。是通过将 SQL 语句编写在 XML 文件中通过框架来调用的。

JDBC 、 MyBatis 、 Hibernate 之间的关系是这样的:
性能:JDBC 最好,MyBatis 其次,Hibernate 再次,这是因为 JDBC 是其它两个框架的基础,封装越彻底,就会损失性能。
开发效率:Hibernate 最好,MyBatis 其次,JDBC 开发效率最低。原因和上面是一样的,封装得越彻底,开发效率就越高。
所以基于 Hibernate 学习成本很高,JDBC 开发效率太低这样两点考虑,很多公司选择了使用 MyBatis 这种框架。
很遗憾,目前市面上关于 MyBatis 的书籍特别少,下面的文字中,我会介绍一些 MyBatis 很不错的网络学习资料,推荐给大家使用。

Spring 我想永远都是主流,应该没有哪一家公司,只要是用 Java 的项目,一定会用到 Spring (如果是自己的框架也会借鉴 Spring 的思想),应该会长时间占据 Web 开发的市场,因为 Spring 的设计思想,它作为一个 Ioc 容器,实现了依赖注入、控制反转。Spring 之所以流行,经久不衰,我想是因为 Spring 这个框架大大地简化了企业级项目的开发,使得会用 Spring 已经成为了 Java 程序员的必备技能,Spring 框架也成为了 JavaEE 事实上的标准。Spring 还扩展出了很多产品,例如 Spring Data、Spring Session、Spring Cache、Spring Boot、Spring Security。

Spring

Spring 最最重要的两个概念 IOC 和 AOP。IOC 最最重要,一定要理解什么是依赖注入(控制反转):我需要一个对象不是我 new 出来,而是声明在配置文件中,Spring 容器启动以后,由 Spring 容器提供给我。最典型的 Controller 调用 Service ,Service 调用 Dao,我们通过 @Autowire 注解或者 @Resource 注解以后(而不是 new 一个对象),就可以直接使用,就是 Spring IOC 的功劳,虽然这是一个很简单的事实,我使用了很久以后才明白。
AOP 实现的面向切面编程的思想是非常先进的,它有一种润物细无声的感觉,通过定义切面和切入点表达式,通过动态代理的方式,就可以实现增强逻辑,AOP 应用于日志记录、事务控制、权限控制等方面。
接下来要学习的就是 Spring JDBC 的功能、Spring 对事务的控制,Spring 与其它框架的集成。
Spring JDBC 我认为有个了解就可以了,如果公司用到的话可以去查询官方文档。Spring 对事务的控制有声明式事务和编程式事务,编程式事务太繁琐,所以不用,声明式事务通过 AOP 实现,太绝对化,一般化,不好控制。我比较认同使用 @Transactional 注解实现事务控制。因为事务控制是一个非常精细的操作,数据库的操作通常是一个软件性能的瓶颈,事务如果控制不好,会影响性能和安全,所以我们说事务的控制很重要,所以我们不能很草率地通过配置切入点表达式一刀切,虽然我们有约定大于配置,但是我们不能保证团队里的其它成员也能很好地遵循我们的约定。所以对于 Spring 事务控制的最佳实践就是使用事物注解方式 @Transactiona 进行精细的事务控制。学习 Spring 的事务的时候还要学习的就是数据的传播行为和隔离级别,这些都可以在 Spring 里面配置。

学习资源推荐:
1、官方网站(http://spring.io/);
2、尚硅谷佟刚老师视频
佟刚老师的视频知识点讲解很细致,一个知识点就是一个视频
3、孔浩老师视频
孔浩老师的视频感觉有点快,但是知识点还是很全的
孔浩个人学习空间 http://www.konghao.org/videos/19
4、张开涛老师博客
张开涛老师的博客 《跟我学 Spring》系列在网络上的点击量很高,并且张开涛老师的博客上面也详解了开发 Spring 遇到的种种问题。
博客专栏 - 跟我学spring3 http://www.iteye.com/blogs/subjects/spring3
博客专栏 - Spring杂谈 http://www.iteye.com/blogs/subjects/spring-tittle-tattle
5、书籍 《Spring 实战》
《Spring 实战》这本书已经到第 4 版本了。第 3 版到第 4 版变厚了很多。
6、慕课网上有关于 Spring 框架的视频教程,我个人感觉也是非常不错的
Spring入门篇_Spring入门视频教程-慕课网 http://www.imooc.com/learn/196
Spring事务管理-慕课网 http://www.imooc.com/learn/478

Spring 的能做的事情很多很多。

Spring MVC

Spring MVC 通过一个前端控制器 DispatchServlet ,来实现请求的分发。Spring MVC 里面有一些类是非常重要的,还有一些注解也是非常常用的,用多了我们自然就理解了。
学习 Spring MVC 的时候我们会遇到一个问题,Spring MVC 有提供一个上下文、Spring 也有提供一个上下文,要了解他们之间的关系。而且我们还要避免这两个上下文之间重复扫描了 Bean ,因为重复扫描 Bean 不但会造成资源浪费,还会造成 AOP 失效,这一点在张开涛老师的博客中有详细的说明。

学习资源推荐
同 Spring 的学习资源
孔浩个人学习空间 http://www.konghao.org/videos/23
博客专栏 - 跟开涛学SpringMVC http://www.iteye.com/blogs/subjects/kaitao-springmvc
博客专栏 - springmvc杂谈 http://www.iteye.com/blogs/subjects/springmvc-tattle
Spring MVC起步-慕课网 http://www.imooc.com/learn/47
Spring MVC拦截器教程-慕课网 http://www.imooc.com/learn/498

Spring Boot

Spring Boot 给我感觉就是大大方便了 Spring 的开发,因为不用再引入那么多依赖了,配置一个 parent ,和必要的 Java 类配置就可以了。通过一个 Main 方法启动 Web 容器也是让我大开眼界。
现在 Spring Boot 已经有很多中文资料和图书了。Spring Boot 也正在逐渐普及开来。
学习资源推荐:
1、Spring 官网,
2、汪云飞老师博客
汪云飞老师编写了一本书 《Spring Boot 实战》这本书讲解比较精炼,可以很快上手。

MyBatis

MyBatis 应该是现在很多网站都在使用的。原因上面也说了,它上手成本低,使用简单方便。

MyBatis 一开始学习的时候,有几个难点或者说重点要和大家说一下。
1、调用写在 xml 底层 SQL 的时候,有两种方式
(1)字符串的方式
(2)通过接口的方式
两种方式都可以,个人觉得接口的方式更加安全和方便。我曾经一度郁闷为什么在一个框架里是用字符串,另一个框架里是用接口直接调用,原来只是不用的使用方法而已。
2、MyBatis 如果遇到了 Spring,那么它就更加强大了,只要简单的配置,就可以让我们的 Spring 来管理 MyBatis
现在 Spring Boot 集成 MyBatis 的组件都已经有了。
3、MyBatis 还有灵活强大的拦截器插件功能,可以实现一些定制化的功能。这点可以参考慕课网的 MyBatis 高级视频。

学习资源推荐:
1、MyBatis 官方网站(两个,一个 MyBatis 的,另一个是 MyBatis 集成 Spring 的)
mybatis – MyBatis 3 | 简介 http://www.mybatis.org/mybatis-3/zh/index.html
mybatis-spring – MyBatis-Spring | 简介 http://www.mybatis.org/spring/zh/
2、尚硅谷张晓飞老师的视频
3、慕课网的视频(分初级和高级课程)
通过自动回复机器人学Mybatis_基础版-慕课网 http://www.imooc.com/learn/154
介绍了 Java Web 开发的基本知识。

通过自动回复机器人学Mybatis-加强版-慕课网 http://www.imooc.com/learn/260
介绍了 MyBatis 拦截器在分页中的应用。

Shiro

Shiro 可以帮助我们在项目中方便地实现权限控制和密码加密功能。Spring Security 也实现了类似的功能,但 Spring Security 比较笨重。

学习资源推荐:
1、官方网站
2、张开涛老师的博客
张开涛老师的博客中有个专题《跟我学 Shiro》,是目前唯一一份完整系统的中文学习资料。
博客专栏 - 跟我学Shiro http://www.iteye.com/blogs/subjects/shiro
3、孔浩老师的视频
孔浩老师的视频就是根据上面的两个学习资源讲解的。
孔浩个人学习空间 http://www.konghao.org/videos/40

Lucene

我感觉会 Lucene 的人应该能给自己的形象加不少分吧。Lucene 的功能是实现全文索引,它用于处理字符串(字符数据)。我们在一般的应用中,可以通过 SQL 语句的查询功能来实现搜索的功能,但是面对一长串的文本,想通过关键字搜索得到一个令人满意的结果。我说的这个场景就好像我们平常使用谷歌、必应、百度这样的搜索引擎来搜索网络资源一样,SQL 语句就不能实现了。
学习 Lucene 的核心在于创建索引、搜索、分词。这三块是非常基础而且重要的,特别是分词。理解分词对于我们理解搜索引擎的工作原理是非常重要的。
Lucene 高级一点的话题就是自定义分词器,搜索排序,过滤,自定义过滤器,tika,高亮等等
封装了 Lucene 更高级的框架就是 solr 。要理解 solr ,Lucene 的基础知识就必不可少了。
Lucene 的学习难度在于概念多 , API 调用比较复杂 ,需要一些时间去理解。

视频学习资料是孔浩老师的视频和曹锋老师的视频。
Lucene 的使用大致原理
(1)对文本数据进行分词;
(2)创建索引,把分词信息,原始文本信息存储在索引文件文件中,创建索引的时候可以进行权重的设置(这个就好像百度的竞价排名);
(3)通过索引查询所需要的信息,从索引文件中得到最佳片段并且设置高亮显示。
不过 Lucene 目前我学习的部分,只能完成站内搜索,对于互联网上的资料的搜索,我想可以通过 HttpClient 这样的框架或者 python 爬虫来实现,不过这些我就没有深入了解过了。

孔浩老师教学视频
孔浩个人学习空间 http://www.konghao.org/videos/30

数据源组件 Druid 、C3P0、DBCP

我们开发的时候可以访问一次数据库就连接一次,但是如果在生产环境中也这么干的话,系统的性能会被大大降低。所以,针对数据库连接我们就会接触到我们在很多地方就接触过的数据库连接池化的概念。先放好一些连接在池子中,客户端来的时候不用重新创建连接,拿现成的连接给客户端用,客户端使用完成以后,不销毁连接,把连接放回池子中等待下一个客户端的连接。要想使得连接池高效就好配置好连接池的参数,这得根据服务器的硬件、内存和客户端访问量综合决定。
目前我接触到的数据源产品主要有 Druid 、C3P0、DBCP。他们之间的性能差异我没有比较过,Druid 是阿里巴巴的工程师写的产品,有比较完善的中文说明文档,而且 Druid 还提供了一个监控页面,这是我比较喜欢的。他们的使用大同小异,就是配置 DataSource 的各种参数。

JSON 格式处理组件 Json-lib、JackSon,fastjson,GSON

没有详细比较过它们的区别,不过也就只是工具类库的学习。fastjson 是阿里巴巴的工程师写的,这个组件提供了很多方便的工具类和工具方法,大家可以了解一下。

Apache Commons 常用库

Apache Commons Logging - Overview http://commons.apache.org/proper/commons-logging/

Commons-lang:常用的工具类是 StringUtils。
Lang – Home http://commons.apache.org/proper/commons-lang/

Commons-io:封装了对 IO 的操作,使得复制、读取 IO 变得非常简单。
Commons IO – Commons IO Overview http://commons.apache.org/proper/commons-io/

Commons-BeanUtils:封装了反射、内省,是操作 bean 的有效工具。
BeanUtils - Commons http://commons.apache.org/proper/commons-beanutils/

Commons-Codec:包含一些通用的编码解码算法。
Codec – Home http://commons.apache.org/proper/commons-codec/

Commons-Collections:提供一个类包来扩展和增加标准的 Java Collection框架,例如可以实现集合的交、并、补运算。
Collections – Home http://commons.apache.org/proper/commons-collections/

Commons-FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力。如果要实现文件上传功能,还要结合 Commons-IO 包。
FileUpload – Home http://commons.apache.org/proper/commons-fileupload/

Commons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架。这个工具包特别好用,应用也很广泛,我在接下来的文字里还会专门介绍。
4、5版本:
Apache HttpComponents - Apache HttpComponents http://hc.apache.org/
3 版本:
HttpClient - HttpClient Home http://hc.apache.org/httpclient-3.x/

POI(处理 Word、Excel 文档)

在实际的业务场景中,我们会给用户下载一个 Word 表格,会让用户读取一个我们设计好的 Excel 文档让用用户填写,用户将填写好的 Excel 表格上传,我们通过程序来读。这些方便地操作 Excel 、Word 就要依赖 POI 来完成。
POI 的使用很简单,很多的代码都是程式化的,我个人觉得不用特意深入的学习,用到了再去学习也是可以的。

HttpClient

我以前只会通过写一个表单,点按钮提交请求一个服务,和通过 jQuery 的 ajax 去请求一个服务。但是这些服务的请求,都很有局限性。但是我们完全可以从服务端去请求这些服务,Java net 中有提供 URLConnection 这个类,但是封装得还不够好,好在我们有 HttpClient 。

意识到 HttpClient 很重要是因为看到现在我们很多时候开发一个功能,没有必要从头开发了,例如翻译一个单词等,我们只用通过 HttpClient 这样的工具去调用这些公司开放的 API 接口就可以了。我们可以调用很多大公司现成的、开放出来的服务,直接调用就可以了,当然这些服务有的是免费的,有的是收费的。

下面我介绍一下,我在工作中使用到的一些开放 API。
(1)有道云翻译
(2)百度语音识别 rest
我还专门写了一篇博文介绍了百度语音识别 rest 接口的调用。
(3)微信公众平台
要频繁地调用微信公众平台的 API 接口,与微信公众平台的交互很多都得通过 HttpClient 来完成,HttpClient 在 Java 的微信公众平台项目中发挥着重要的作用。

WebService

WebService 我对它学习也仅仅只是皮毛,但是给我的感觉是 WebService 是解决异构系统通信的一个方式(或者说协议或者说规范)。例如,一个 Java 写的网络程序和一个 PHP 写的网络程序要想通信,我们就约定一个通用的格式(XML),通过一种比较难理解的 WSDL 语言进行交换。
现在好像 WSDL 慢慢被 JSON 这种网络传输格式取代,通过 Http 请求来完成数据的交互。

MySQL

经典的关系型数据库。

Redis

现在常见的非关系型数据库,常用于做缓存。

Markdown

Markdown 主要用于技术类文章写作上,使用 Markdown 会使得博客的展现更加专业和规范,Markdown 已经是技术领域中一种比较流行的标准。我本人就是因为喜欢 Markdown 这种格式的博客才喜欢写博客的。

推荐 Markdown 写博客的主要原因有:
1、专业;
作为技术人员,专业是第一标志。
2、学习成本低,语法容易记住,学习起来特别快,很多博客平台上甚至有非常完整的语法提示;几乎是用简单的语法标记就能够渲染成格式好看的页面。
3、迁移方便
因为很多平台都采用了这种 Markdown 语法编写博客,那么我们在迁移博客的时候的成本就低很多了。
相比于传统的富文本编辑器的强耦合,Markdown 的优点正体现在此。
4、体积小,没有多余的代码
如果我们使用富文本编辑器,查看源码的时候,我们会发现有很多杂乱的 html 标签,使用 Markdown 语法就没有这个问题了。

我经常使用 Markdown 语法在 CSDN 上写博客,在马克飞象上记笔记,在 GitHub 项目的 READMD.md 文件中编写项目说明。

开发工具 IDE

开发工具用什么其实都可以,自己喜欢就好。但是个人觉得不要因为开发工具分散太多精力,因为学习工具不是我们的目的,我们是要通过工具完成高效的开发。例如当程序运行出现问题的时候,我们如何调试,以及通过一些关键信息,快速定位代码等等。学习工具的时候,最好能明白工具到底帮助我们做了什么?例如:IDEA 和 STS 运行前都会帮我们编译代码,我们要知道编译以后的字节码文件在哪里,如何配置使用的 JDK 版本。

(1)IntelliJ IDEA
这是我最推荐的开发工具,初学会有难度的,但是慢慢习惯了以后你就会真的觉得 IntelliJ IDEA 好用,我现在已经不用 Eclipse,自己也写了几篇文章介绍 IntelliJ IDEA 的使用,还因此获得了一个 CSDN 颁发的奖项,有资金鼓励的哟,感谢这个伟大的开发工具!

(2)Eclipse
Eclipse 体系的 IDE 中我最早使用的是 MyEclipse(Eclipse 的一个插件,集成了很多不太需要的功能),一个比较庞大的工具,后来使用 Eclipse ,后来又因为颜值和 Spring 的原因使用 STS (Spring 官网可以下载,Spring Tool Suite,图标很好看,是一个叶子),但是 Eclipse 还是有各种各样的问题,集成各种工具 (Tomcat、Maven、Gradle)以后暴露的问题更多,最终我还是放弃了。但是现在电脑里还是会安装 STS,算是一种美好的回忆吧。

构建工具

工具就是一套现成的解决方案,一般来说我们能见到的都是比较成熟的。我们学习 Java 经历了写 Main 函数、建动态 Web 项目,添加第三方依赖这样的一个过程。我们会发现自己手动添加依赖这件事情非常繁琐,经常会忘记添加一些依赖,导包的过程中会遇到一些问题。那么构建工具就是帮助我们解决这个大问题的,当然构建工具的强大作用不仅仅局限于此。
我接触的构建工具正正好也是根据构建工具的发展史来的,它们依次是 Ant、Maven 和 Gradle,下面我分别介绍。

1、Ant

在工作中,有很长一段时间,我非常傻叉地使用了增量更新的方式,增量更新就会遇到每次都要拷贝不同路径下须要更新的不同文件,组织成一个更新包覆盖到服务器上,然后重启,这一系列的过程非常繁琐,如果更新完以后,发现还有问题,又要重复上面的步骤。
Ant 能帮助我完成的就是,我输入一个待更新的字节码文件列表(全路径),执行 Ant 的命令,就可以帮助我打好一个更新包,我覆盖到服务器上就可以了。
这种方式更新传统的动态 Web 项目是完全可以的,但不高效,也不安全。

Ant 学习起来非常简单。我个人认为边用边学就可以了。
官方网站:
Apache Ant - Welcome http://ant.apache.org/

2、Maven

再后来,我就是用 Maven 构建工具编写 Web 项目,依赖完全通过 Maven 的坐标来管理,这是使用 Maven 的一个重要原因,规范化了 jar 包依赖的引入,使得整个项目的体积大大减小,方便了我们项目的携带和传输,也不会造成 Jar 包到处都有,难以管理;更新项目的时候,通过 Maven 的 package 命令,打一个 war 包实现全量更新,高效并且安全。还可以通过使用 Maveb 的 war 插件实现根据不同的环境使用不同配置文件打包的功能,增强了打包的灵活性。

可以说,Maven 是一个非常好用的构建工具。

还有一点是我感受比较深的,那就是 Maven 项目结合 Git 管理之后,我们可以很方便地上传源代码和下载别人的代码。因为我们只须要通过一个 pom.xml 文件就可以通过 Maven 工具下载到我们需要的 jar 包,如果本地正好有 Jar 包,就直接用。

Maven 和 Ant 相比,Ant 可定制化的部分更多一些,可以定制生命周期,更灵活一些,但 Maven 约定的生命周期虽然多,但是都是非常经典的生命周期。我是先接触 Ant,学习了 Maven 之后再回过头来用 Ant,发现其实它们的思想有很多相通的地方。Maven 定义了一大堆现成可用的 target,供开发者调用,Maven 也通过插件的方式提供了很多灵活调用。目前 Maven 是使用最广的构建工具,非常经典。

不过写到这里,我又想起来去年学习 Maven 的痛苦经历,Eclipse 集成 Maven 的话,如果下载包出现问题下载不来,一定要找到 .m2 文件夹(在宿主目录下),把下载到一半的依赖删了,让 Eclipse 重新下载就好,依赖下载不下来成为了让 Maven 学习者倍感痛苦的一个主要原因。

官方网站:
Maven – Welcome to Apache Maven http://maven.apache.org/
项目管理利器—maven-慕课网 http://www.imooc.com/learn/443
专著《Maven 实战》
《Maven 实战》的作者许晓斌老师的博客,今天上网一查许老师已经是阿里巴巴的技术专家了。
Maven中文 - ITeye技术网站 http://juvenshun.iteye.com/

3、Gradle

很有意思的事情是,我刚刚学会了 Maven,我又知道了 Gradle ,我当时感慨,怎么有这么多乱七八糟的技术。后来,我告诉自己,不管是 Gradle 还是 Maven 都只是工具,我们没有必要一口气吃成胖子,一开始了解基本功能,在以后的工作中慢慢深入应用就好了。

Maven 使用 xml 语言进行配置,Gradle 使用 Groovy 进行配置。当有了 Maven 学习的基础以后,学习 Gradle 也不是很难。学习 Gradle 的主要瓶颈在于:
(1)现有的学习资料不是很多,主要我们通过官方网站来学习,中文资料有翻译的《Gradle 实战》,我借来看过,但我感觉实用的部分不是很多;
(2)Maven 的体系很经典,应用很成熟广泛,并没有太多阻力,Maven 不太好的地方可能就只是在配置文件因为使用 xml 而显得比较臃肿,很多公司并没有那么赶潮流地去使用 Gradle,所以 Gradle 并没有很广泛的应用场景;
(3) Gradle 下载依赖慢,刚开始接触的时候会出现很多问题。

虽然上面好像控诉了比较多 Gradle,但是 Gradle 毕竟思想更先进,多了解一些没有什么不好。我也不排斥我因为认知的原因,还没法更多地去描述 Gradle 的先进之处。

中文学习资料:《Gradle 实战》

Gradle Build Tool I Modern Open Source Build Automation https://gradle.org/

Gradle 2用户指南_Gradle 2开发中文手册[PDF]下载-极客学院Wiki http://wiki.jikexueyuan.com/project/gradle-2-user-guide/

专栏:Gradle翻译 - 博客频道 - CSDN.NET http://blog.csdn.net/column/details/gradle-translation.html?&page=2

版本管理工具

以前我学习 SVN 的时候,知道 SVN 这种东西只有在团队开发、多人协作的时候才会用得上。后来我学习了 Git 之后,才慢慢认识到,原来一个人写项目,用版本管理工具也是非常有必要的,因为用版本管理工具可以帮助我们记录软件开发的整个生命周期,方便我们回退代码等,下面我来细说。

1、SVN

如果你还不会 SVN 的话,就不要学习 SVN 了。直接学习 Git。
SVN 的学习也不是没有曲线的,先要安装 SVN 的服务器 Subversion,然后还要安装 SVN 的客户端,而且一个人学习比较难模拟团队开发这个流程,因为内网服务器的搭建也有一些曲线,角色的转换也给学习造成了一些难度。

2、Git

Git 的入门学习是有一些曲线的,在这个模块最后,我会推荐一些资源,并且提供一些重点和难点,供新手学习。

下面我来说说使用 Git 的一些我的理解:
(1)Git 在本地就可以实现版本管理,不一定需要 Git 服务器的支持,无须联网就可以完成代码提交,等待联网以后再提交代码到 Git 服务器上。这是 SVN 做不到的;
(2)Git 用户要配置自己的 name 和 email ,就像你开车要把你的车牌挂上,告诉别人你是谁;
(3)Git 对代码的管理要先 add(暂存) 在 commit(提交),暂存可以撤销,commit 严格说也可以撤销,但是我们初学还是认为它不好撤销,commit 的时候 Git 会强制要求携带一个 message,告诉 Git 这次提交所作的更改,当然你也可以乱写,不过这样做很不规范,就失去了版本管理的重要意思,写好 commit 的 message 是非常重要的,可以方便我们追溯以前的代码,当我们看着自己提交代码的列表,会有一种很满足的感觉;
(4)add 和 commit 的操作都是在开发者本机进行的,要把代码推送到服务器、从服务器上拉取别人提交的最新代码,就要使用 push 命令(推送,从本机到服务器)和 pull 命令(拉取,从服务器到本机) 命令;
(5)使用 Git 的一个很大的好处是,作为初学的开发者而言,不用自己搭建 Git 的服务器,GitHub 和 “码云 - 开源中国”就提供了免费的代码托管服务和可视化界面,这是一个非常大的福利。你的代码提交到这些代码托管平台上,就永远不会丢失,而且你在家中和在办公室就不用通过同步盘和优盘来拷贝代码了。不过这里你首先要会配置 SSH key,这个网络上很多资源都有介绍,一点都不难,试着操作几次就会了。
(6)Git 的分支管理策略在版本管理控制中是体现得非常精妙的,这点我不拓展去说,因为自己一个人开发,分支用得比较少,但是在团队开发,一个好的迭代和流程是肯定离不来版本管理的分支理念的(例如:永远只在生产环境上发布 master 分支上的代码,dev 分支的代码不能直接上生产环境)。

Git (客户端)下载:
Git - Downloads https://git-scm.com/downloads/

下面推荐 Git 学习的优秀学习资料
1、廖雪峰的网站
说明:据说是学习 Git 的人都看过廖雪峰的 Git 教程,在这里强烈推荐
Git教程 - 廖雪峰的官方网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

2、阮一峰的两篇博客
说明:这两篇博客是我看到的讲解分支和远程操作最透彻的文章

Git远程操作详解 - 阮一峰的网络日志 http://www.ruanyifeng.com/blog/2014/06/git_remote.html

Git分支管理策略 - 阮一峰的网络日志 http://www.ruanyifeng.com/blog/2012/07/git.html

3、Git Pro 这本书,有中文电子版
Git https://git-scm.com/blog/2010/06/09/pro-git-zh.html

4、一些网站,例如放在 BootStrap 上的 Git 简易教程
git 使用简易指南 http://www.bootcss.com/p/git-guide/

Git 的学习,熟能生巧,一开始知道一些常用的基本功能就好,没有必要去研究高级功能,因为 Git 仅仅只是一个工具。

一开始 Git 的学习,推荐大家就用命令行,Git 小乌龟和 SourceTree 这样的可视化工具等到 Git 命令使用熟练以后再去使用,因为工具真的会让我们变“傻”,如果我们对工具帮我们做了什么都不清楚,就驾驭不好工具,工具就不能帮助我们事半功倍地完成想做的事情。

另外,多说一句,GitHub 和“码云 - 开源中国”这样的网站,可千万不要忽视他们的重要作用,它们不仅仅是帮你完成代码托管的,我看到过的一个很有意思的描述,说“GitHub 是全世界最大的同性交友网站”,一方面调侃了程序员这个行业男女比例严重不平衡的事实,另一方面也提醒我们不要忽视了 GitHub 和“码云 - 开源中国”这两个网站的社交功能,GitHub 是一个强大的生态圈,全世界的开发者都在上面提交代码,要想和大牛学习,可以多看看上面的开源项目,去完成一个 pull-request 流程吧。

GitHub https://github.com/

码云 - 开源中国代码托管平台 https://git.oschina.net/

关于 GitHub 在慕课网上也有相应的课程,这里就不一一列举了,欢迎大家去学习。

前端介绍(待添加)

JavaScript基础

JS 基础我学习了一些,JS 中函数是第一等对象,因为不从事前端开发,所以了解并不深入。
最经典的一本教材应该是 《JavaScript 高级程序设计》。

jQuery 库

jQuery 库简化了我们对 JS 的操作,jQuery 有一句名言,“写得越少,做得越多”。用 jQuery 以后,就很少写原生的 JS 了。

BootStrap

BootStrap 是一个前端渲染框架,提供了很多现成好看的样式,同时 BootStrap 的使用也是非常简单的。很容易上手,学习很简单,没有多少难度。
BootStrap 的一大特色还在于 BootStrap 的文档做得非常好,学习 BootStrap 给我带来的一个观念上的转变就是使用在线文档。一些对于一些技术文档,我总喜欢把文档下载到电脑上看。就是因为 BootStrap 的缘故,我习惯了在网络上看文档,因为这样既不用下载文档,以后再去找文档,也不用担心下载的文档过时和有错误。

JQuery EasyUI

JQuery EasyUI 和 BootStrap 一样,也是一款前端渲染的框架。样式没有 BootStrap 那么好看,风格和 extjs 差不多,但是提供的组件很多,功能很强大。主要适用于开发后台管理界面。因为开发的后台管理界面一般不用页面很花哨,组件风格统一,模块化,易于操作,开发效率高即可。 JQuery EasyUI 就迎合了这样的需求。

AngularJS

AngularJS 是一款前端的 MVC 框架。它与我们使用后台的 MVC 框架不同的是,使用 AnjularJS 就可以实现前端页面的跳转。我们写 Servlet、使用 Struts 和 Spring MVC 不同,我们使用这些框架是通过后台框架实现的页面跳转。

AngularJS 我了解和接触的也不多,也只能和大家介绍到这里了。

程序员必杀技:设计模式、数据结构和算法

这一点一直是我做得不好的地方,自己很多时候其实很清楚,这些才是能提升我价值的地方,但还是会“情不自禁”地沉迷在一些炫酷的工具学习中。

设计模式在项目中自己有意识地运用比较少,多是在自己的学习中去理解。
数据结构和算法了解过一些,但是在开发中也没咋应用。

要想摆脱增删改查的厄运,就要会用设计模式、数据结构和算法。

其他

比较好的免费视频资源
孔浩老师的视频
孔浩个人学习空间 http://www.konghao.org/index

曹锋老师的网站和视频
Java知识分享网-免费Java资源下载 http://www.java1234.com/

这个网站里面提供了很多技术书籍的电子版下载。建议大家先下载电子版试读,觉得合适就购买纸质版书籍。
慕课网 http://www.imooc.com/
尚硅谷培训机构免费视频
尚硅谷_全套Java视频教程|免费Java视频教程|适合自学Java视频教程 http://www.atguigu.com/download.shtml

尚学堂培训机构免费视频
【官网】北京尚学堂-[cctv央视网合作伙伴],IT培训,首选尚学堂,JAVA培训、Ios培训、android培训、大数据云计算 0元入学先就业后付款,平均9500元以上 http://www.bjsxt.com/download.html
传智播客培训机构免费视频
Java教程 - Java视频 - 博学谷视频库 http://v.itcast.cn/course/c26.html

我经常用的一些网站和工具软件

搜索工具:谷歌,谷歌搜索的结果是很不错的,同时我们还要学会用关键字和一些搜索技巧去搜索我们想获得的知识。
搜索技能也是我们作为程序员必备的一项基本技能。很多程序员同学都会感慨搜索引擎带给他们的帮助。

如果不能使用谷歌搜索引擎的话,可以使用九命狐搜索(http://www.jiuminghu.com/)(其实就是谷歌搜索上面包了一层),在没有科学(翻)上网(墙)的前提下,使用这种免费的搜索引擎也是一个不错的选择。

印象笔记
把自己学习到的知识和工作中用到的知识记载下来,日积月累就会成为我们的财富。

有道云笔记
有道云笔记和印象笔记的作用一样,可以根据个人喜好进行选择。

附加说明:我使用的是印象笔记,因为印象笔记可以集成马克飞象来用,印象笔记的高级会员功能也是十分强大的,大家有时间的话可以了解一下。

MySQL 客户端工具: SQLyog、navicat

截图工具:FSCapture
这款小工具可以截图、录像、使用屏幕标尺、取色、实现屏幕放大,谁用谁说好。

文本编辑器:Sublime、EditPlus
Sublime 是一款文本编辑神器,目前非常流行,它还有很多插件,非常好用的。
EditPlus 是老牌子的一款文本编辑器,没有太多花哨的功能,界面也十分友好。

谷歌浏览器、火狐浏览器
谷歌浏览器和火狐浏览器都有开发者工具,作为 Web 开发者,有很好的网页开发调试的功能,网上也有很多资料介绍这些开发工具。

思维导图:MindManager
思维导图是一款神器,可以帮助我们理清思路,整理笔记,用于生活和学习的方方面面,关于思维导图的说明和使用有很多书籍都有介绍,大家也可以关注一下。

评论 16 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

liweiwei1419

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值