1. 程式人生 > >學習java的5種境界

學習java的5種境界

屬於原創,轉載請註明出處,謝謝!
在這裡,我僅作拋磚引玉,打算給正準備學習java或還在抉擇是否學習java的同志們指明一個學習漸進方式和方向。 
 感言:清代文學家王國維提出的讀書三種境界:“古今之成大事業、大學問者,必經過三種之境界:‘昨夜西風凋碧樹。獨上高樓,望盡天涯路’。此第一境也。‘衣帶漸寬終不悔

,為伊消得人憔悴。’此第二境也。“眾裡尋她千百度”,驀然回首,那人卻在燈火闌珊處’。此第三境也。”如今在回想我學java的坎坷之路,頗有相似之處,如今我把我學習的歷程和我

對java體系的5種認知(也稱為5種境界吧)分享給大家,同時也為自學者指明學習的方向,少走彎路。
 從我大學第一天接觸計算機語言開始,我堅持學習微軟的vfp長達8年。我曾幻想微軟的vfp能給我們帶來強大的程式設計體系,能夠解決軟體領域的眾多問題,比如跨平臺性、原始碼公開、

分散式部署、分層架構、豐富多彩的客戶端體驗……,但是在我還在幻想的時候,微軟突然說終止vfp的開發了。
 隨著工作和認知原因,我決定重新選擇一門語言,徹底放棄vfp,擺在我面前的有ASP.NET、PHP、DEPHI、JAVA、C、C++、ASP……;我要選擇的是一門跨平臺的WEB程式語言,我排除了

C、C++、DEFPI、ASP.NET、ASP。擺在我面前的是java和php;在比較這兩種語言後,我最終選擇了java,至於java為什麼比php更優秀,網上很多達人給出了經典解釋,我這裡不再贅述。曾有一

個狐友說,你學java能夠達到你在vfp方面的高度嗎?我當時真不清楚,我甚至不知道我還能不能堅持把java學下去。
 我學java的動機就是它的優秀的MVC框架和跨平臺的能力,那麼我一開始是如何學習這麼神奇的語言呢?
 java對我來講,這是一門很陌生的語言,它的語法風格跟我所學的VFP完全不一樣,這意味著我必須從頭學起,這是一個很痛苦的過程。
 java語言的IDE(這裡是myEclipse)和VFP(VisualFoxpro9.0),ASP.NET(VS2008)幾乎完全不一樣,這也難怪,java(swing是後面的事情了,這裡先不表)和asp.net是伺服器語言,

VFP是客戶端語言(多執行緒DLL例外),於是我硬著頭皮開始了java的基本知識的學習,再這裡我要特別感謝傳智播客的畢向東老師的精彩視訊課程(我沒有正式上過他的課程),也正是這門

課程讓我不再閱讀枯燥的java入門書籍,也是這門課程讓我窺探到了java 的強大。單從java基礎這們課裡我才發現vfp是多麼的幼稚(這僅僅是我的個人見解,如果得罪狐友,請見諒,也請

狐友們捍衛我說話的權利),我在此僅僅說幾個例子,這幾個例子對我後來一些專案當中是多麼的重要。第一點要說的是IO,Java對位元組流和字元流的操作,在這裡java提供了豐富的jar包,

這個是vfp望塵莫及的;第二點要說的是多執行緒,java 利用鎖機制可以控制併發執行緒,而vfp除了對專案編譯的時候能夠選擇多執行緒外(即便如此也是一個黑盒子,因為你不知道這裡的執行原

理);第三點要說的是集合框架,這些資料型別為很多框架、跨平臺資料互動提供了強有力的支援,而vfp再這方面除了一個數組外,就蒼白的很了。當然,還有很多例子,可以這麼說,VFP

的任何一個功能,在java面前都顯得如此微不足道,即便是VFP引以為豪的ODBC技術。當我學完了畢向東老師的課程後,我對我學好java充滿了信心,我也慶幸我放棄vfp選擇java是一件多麼

美好的事情,當然我依然的感謝vfp語言,是它讓我有了程式設計的理念和思想,是它讓我苦苦思索而又無法解決某些問題,我帶著這麼多問題來學java,所以我帶著極大的興趣來學習java的

。所以我用了3個月時間,我把java基礎翻了個底朝天,這是痛苦的,也是快樂的,所以我看任何的java程式碼不再困惑,只要有jdk幫助在手,我就能夠啃下來。
 言歸正傳,java僅僅如此嗎?不!隨著我對java的認識的深入,痛苦才剛剛開始!為了讓java有具體的友好的操作,我不得不花時間學習html標籤,css/div佈局,javascript,

jquery,servlet,jsp,jdbc;這個過程是瑣碎的,瀏覽器是如何和java伺服器語言進行互動,這個十分抽象的技術對於初學者來說確實是一件很困難的事情,我建議大家學此之前一定要了解

request,response,session等概念,你理解的越深刻,你學習servlet,jsp,jquery,javascript越輕鬆。

第一重境界:經典MVC
 當我學完上面的課程後,我長長的舒了口氣,我終於可以架設分層體系,我不僅可以部署華麗的表現層,還可以部署複雜的業務邏輯層,還可以跨域資料庫做我想做的事情,當我把瀏

覽器的AJAX請求給到servlet,然後呼叫相應的servers方法,取得bean物件(獲取資料庫資料),我認為這一切都很美好。回想當年為了讓vfp有漂亮的客戶端,我花費了大量的時間做平面設

計(載入圖片超慢)。現在有了CSS/DIV,jquery,一切都變的如此簡單。動畫,導航(包括tree),表格等等,一切都可以自定義,隨心所欲。VFP當年的連線控制代碼也是一直困擾我多年的技術

瓶頸,每次的連線都是漫長的,可是有了jquery,(資料庫用了另外一個java框架),連線也變得美好,非同步互動,讓我們不重新整理頁面的情況下,繼續瀏覽其它部分。JNI技術更是讓java如虎添

翼,一些需要高效能運算的技術,直接交給C++好了,我只需要根據API傳入引數即可。
 但是問題來了,我發現我要進行下一個專案編寫時,我很多東西仍然需要重寫,很多地方仍然需要copy,這背棄了我們面向物件的思想。許可權訪問控制得不到有效保障,配置過於複雜

,不利於維護,公司的一個資深程式設計師離職後,面對html標籤和混雜的javascript程式碼,需要太多精力去閱讀,去維護,經常會因為需求的微小改動,整個應用都需要重寫。這的確讓人頭疼

,怎麼解決這些問題呢?
第二重境界:主流MVC框架SSH2
 帶著解決問題的想法,開始了全新的學習,SSH2框架(Struts2,spring,hibernate),這三個框架堪稱目前最經典的JAVA體系的MVC框架,其實些框架最重要的是要理解一些很抽象的

概念,比如,struts2的控制,spring 的依賴注入,面向切面程式設計,hibernate的orm技術,等這幾個框架學起來不難,前提是你有java相當的基礎,如果你不懂集合框架,不懂面向介面程式設計

,不懂一些經典設計模式(比如工廠模式,裝飾設計模式,單例模式等)理解這些是一件很困難的。我學這三個框架總共大學花費了3個月時間,雖然不精通(在java面前我永遠不敢說精通)

,但我已經能夠開發一些應用了,SSH2三大框架是基於java的開源框架,它的出現解決了訪問控制,業務邏輯分層,大大降低程式耦合性,程式碼質量也得到了極大的提高。
 問題又來了,Strus2雖然有豐富的標籤庫,細膩的訪問控制,可是面對一個細膩的複雜的客戶端需求,struts2做起來是多麼的吃力,程式碼複用的機會大打折扣,我又開始了不停的拷

貝除錯貼上頁面端程式碼。噩耗又開始了,如何解決呢?
第三重境界:struts2整合
 整合struts2的目的是為了讓客戶端的每個模組都能夠獨立,複用,且要課業務邏輯層解耦。OGNL表示式,SietMesh,freemarker和struts2的結合徹底解決了頁面端程式碼的重用性問題

,也徹底解決了view和dao,control層的耦合。但是問題又來了,在整合的過程中,底層程式碼沒有很好地封裝,開發人員可以隨意修改框架性程式碼;專案開發過程中,開發人員隨意新增jar包

,往往會導致jar包衝突,系統無法啟動,卻又很難排查出現問題的原因;有時候一個很小的專案卻又上百個jar包,體積臃腫,等等,怎麼解決呢?
第四重境界:團隊開發
 進了第四重境界,恭喜您,您可以組織團隊進行開發了,那麼是什麼技術可以如此神奇呢?這就是maven、nexus、jetty,Maven是一個專案管理工具,它負責管理專案開發過程中的幾

乎所有的東西,它可以讓團隊共享維護一個系統,每個人都可以完成自己的獨立模組,即使模組與模組之間有著依賴關係。nexus就是橋樑倉庫,jetty是一個高效的除錯工具。
第五重境界:
 請恕我荒誕,因為我也沒有接觸過,但我想有這麼一個境界,是一個大師(在中國,我們這裡的大師僅僅指應用開發,底層開發的人在中國很難找到,這就是為什麼優秀的框架無法

在中國誕生的原因,我們僅僅是會用別人的框架)級別的java工程師必備的技能,那就是分散式技術,試看現在網際網路的大佬,新浪、淘寶等這些運維網路,哪一個又不是分散式的呢?如果

您想到第五種境界,請學習EJB3.0+和它配套的jboss,weblogic等相關伺服器技術,這個也是我的下一個目標。