学习 Java 的历程和体会『写给新手看,欢迎老司机批评和建议』
轉載出處:https://blog.csdn.net/lw_power/article/details/52502698#commentBox
Java 基礎只能說熟悉,還達不到熟練,更談不上精通。框架會用很多,但也只是停留在應用層面。
目錄
- Java 基礎
- JavaEE 基礎
- 框架學習
- 說說 SSH
- Spring
- Spring MVC
- Spring Boot
- MyBatis
- Shiro
- Lucene
- 數據源組件 Druid 、C3P0、DBCP
- JSON 格式處理組件 Json-lib、JackSon,fastjson,GSON
- Apache Commons 常用庫
- POI(處理 Word、Excel 文檔)
- HttpClient
- WebService
- MySQL
- Redis
- Markdown
- 開發工具 IDE
- 構建工具
- 1、Ant
- 2、Maven
- 3、Gradle
- 版本管理工具
- 1、SVN
- 2、Git
- 前端介紹(待添加)
- JavaScript基礎
- jQuery 庫
- BootStrap
- JQuery EasyUI
- AngularJS
- 程序員必殺技:設計模式、數據結構和算法
- 其他
- 我經常用的一些網站和工具軟件
Java 基礎
Java 基礎部分寫出來的代碼基本上通過 Main 方法或者 Junit 測試方法運行的,不需要通過服務器來執行。
下面對于這些知識做一些簡單的概括,來說明他們的作用和重要性:
繼承、封裝、多態的思想要理解透徹。這些概念雖然看過去都明白,但是隨著自己寫的代碼越來越多,對一些知識的重復學習,對這三個簡單概念的理解會更加深刻。?
例如:我們學習設計模式的時候就會發現,其實設計模式很多的時候就是利用了抽象類、接口、子類繼承父類、代碼塊、static 、final 、重載、具體類實現接口、組合、this 、 super、訪問控制符、構造器這些最最樸素的概念。所以面向對象的思想真的是太重要了。這些概念值得反復學習,反復推敲。?
一本很好的書是 《Java 編程思想》,這種經典的書是值得反復看的。
學習容器類, List、Set、Map,理解使用 Hash 這種結構對于查找元素的好處。?
從集合這個章節可以擴展到數據結構這門課程的學習。正是因為 List、Set、Map 這些類型有著良好的數據結構的設計,它們才能為我們使用于各種復雜多樣的場景、
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?
的視頻資源是非常少的。
枚舉、注解、泛型、JDBC?
在要表達有限個對象的場景下,使用枚舉讓我們的數據更加安全,代碼可讀性增加。?
注解,現在很多第三方框架都使用注解進行配置,如果我們能夠很好地運用自定義注解,可以大大提升我們的代碼格調。自定義注解往往要結合反射的知識才能發揮巨大作用。?
泛型將數據安全性的檢查提前到編譯期,泛型的另一個重要作用就是參數化類型,提高了程序的靈活性。?
JDBC 是使用 Java 代碼操作數據庫的技術,它是理解 MyBatis、Hibernate 的基礎。
多線程?
學習了多線程我們可以感受到程序可以不止一條執行流,這點體會是非常重要的,也就是培養了我們對并發這個概念的理解。我們還要熟悉線程的創建、線程的幾種狀態、線程的優先級、讓步、休眠、多線程如何通信、什么是線程中的鎖、我們的編碼應該避免造成死鎖。?
還有就是要體會到多線程的程序的理解是要靠一定想象力和代碼去驗證的,CPU 的調度具有不確定性,這個不確定性如果深入去研究下去,你會發現對底層的機制可以了解得更多。例如 JVM (Java 虛擬機),JMM (Java 內存模型),volatile 關鍵字保證內存可見性,synchronized 關鍵字保證原子性和可見性。這里只是提一些關鍵字。這些知識我也正在努力學習中。?
特別說明:在 JDK 1.5 以后出現了一個并發編程的包,這個并發編程的包,大大的提升了 Java 對于處理并發業務場景的能力,請一定留意。很可能在一開始我們經常編寫的 CURD 的業務場景里用不到,但一定要有意識給自己做相關的技術儲備。?
這里推薦一個網站:并發編程網?
http://ifeve.com/
網絡編程?
理解 TCP、UDP 是什么。在網絡中,數據是通過 IO 進行數據傳輸的。?
特別說明:網絡編程中,也設計并發編程的知識,例如以前我們服務端處理客戶端的請求,往往可以通過新開一個線程去處理,但是一條線程的創建和銷毀其實是很浪費資源的,如果我們知道并發編程,就可以通過線程池去完成。
反射?
不要被反射這個概念所迷惑了,反射其實就是通過字符串分析出類的各個元素。在反射知識的學習中,我們會看到,其實在類的外部,我們也是可以訪問到類的私有屬性的,我們可以把不同類型的對象添加到一個帶泛型的集合中。反射功能很強大,很靈活。很多第三方的框架都大量地使用了反射技術,反射技術是理解 Spring 等框架原理的核心。
多說幾句,多線程、網絡基礎、反射這些技術可能作為初級程序員剛剛參加工作的時候可能會涉及不到,但是這三門技術的知識儲備是非常重要的,
下面提一些知識點?這些知識點的學習很有意思,能讓我們更深層地了解 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?
思維導圖是一款神器,可以幫助我們理清思路,整理筆記,用于生活和學習的方方面面,關于思維導圖的說明和使用有很多書籍都有介紹,大家也可以關注一下。
總結
以上是生活随笔為你收集整理的学习 Java 的历程和体会『写给新手看,欢迎老司机批评和建议』的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天考了关于java认证的OCJP,特此
- 下一篇: 旧版苹果退款通知