陸陸續續學Java也快一年多了,從開始的一竅不通到現在的初窺門徑,我努力過,迷茫過,痛過,樂過,反思過,沉淀過。趁著新年,我希望能把這些東西記下來,就當是我一路走來的腳印。
一、初識網站應用
記得第一次接觸Java,是寫一個小網站,當時用servlet+tomcat做服務端,數據庫是mysql。那時我對于網站應用的概念一片空白,之前接觸的都是C++和MFC寫桌面程序。我花了一周時間看完了《java servlet programming》這本書,然后我就開始寫代碼了。但是,真的當我寫代碼的時候,我卻發現無從下手,因為那本書講的很細,對于系統學習servlet很有幫助,但要想迅速建立一個demo,卻并不是太適合。于是,我去找了本國人寫的書,前面是理論,后面有一些小小的項目。我就照著某個小例子的代碼寫了一遍。代碼寫完了,tomcat也運行起來了(運行起來的過程中也遇到了大量的坑),用瀏覽器訪問的時候卻偏偏無法訪問,查看tomcat的異常,發現一些類無法加載。去網上查了以后才知道,Java程序和mysql之間通信是需要驅動的。就這樣搞了大概兩天時間,我才把一個最簡單的hello world完成了。搞完hello world只是萬里長征的第一步,即使是做我那個小網站,也只是最開始的開始,后面有無數的坑等著我,我除了踩坑爬坑,別無選擇。
接下來的一周,我花了很長時間去學習html和css,順便繼續開發我的servlet程序,但是,當我學完html和css后,同樣的問題有來了,我無從下手??!我覺得作為一個新人,要想迅速上手一門技術是很難的,除非你有類似技術的開發經驗(比如C#的人去搞Java),你唯一可以做的就是去模仿別人的東西,不斷的寫代碼,不斷的琢磨,然后慢慢變成自己的東西。我當時很絕望,于是上網直接找了套現成的皮膚,然后稍微改改,就作為了我的網站的前端頁面。
前前后后,我一共花了半個月的時間,完成了我的小網站,雖然很丑,雖然漏洞百出,雖然不斷被坑,但是,我還是學到了很多東西:servlet的基礎知識,JSP的基礎知識,Java的基礎語法和常用的類,mysql驅動和JDBC,sql的增刪改查,mysql的DDL語句,html和css的知識,tomcat應用部署和啟動關閉。正是因為這半個月的堅持和努力,讓我第一次獲得了寫代碼的樂趣,也讓我走進了Java的世界。
二、低谷
第一次編寫小網站帶給我的喜悅沒有持續多久,我便陷入了迷茫。那時的我,并不知道Java是什么,它可以干些什么。我在圖書館逛了很久,也在網上找了很多資料,漸漸的知道了Java的兩大體系:Java SE和Java EE,其中Java SE是開發Java程序的基礎,Java EE是企業級開發。當時,我對Java SE只是停留在Java語法的基礎上,并沒有去了解JDK的龐大體系,而對Java EE也只是停留在servlet+jsp的層次,至于對于大量中間件、分布式應用等等則完全沒有概念。一個人的眼界決定了他的走多遠。接下來的一個月,我花了大量時間去學習servlet、jsp、jdbc,還把EL標簽和JSTL標簽也學完了。通過使用這些技術,我又做了幾個小網站,那時的我覺得自己是多么的牛逼(現在看其實很傻比),也漸漸驕傲起來,覺得Java EE不過如此,這也導致了我接下來的一段時間幾乎沒有在去碰過網站技術。
也就是在那段不碰網站技術的日子里,我買了本書,叫《Java典型模塊精解》。那時的我覺得那上面的東西都很高大上,什么電子相冊模塊,郵件發送模塊等等。于是,我花了大概半個月的時間去模仿里面的代碼,可是模仿來模仿去,我始終覺得自己的技術沒有什么大的提高,唯一的提高就是了解了Java swing。我甚至發現,這些所謂的模塊,其實都是類似的結構,swing作為程序顯示部分,后臺邏輯要么是操作數據庫,要么是使用一些輔助工具(比如Java的郵件發送工具 Java mail),而且,swing的庫實在太大,模仿了半天,要想自己寫個程序出來,最后還是得去看書。就這樣,沒多久我就對這本書不感興趣了。
三、基礎!基礎!
對待技術就像對待妹子,相處久了會膩,離開久了會想,即使你表面不承認。
我重拾Java是個不經意的選擇,那時我只是恰好碰到本Java的書,于是隨便翻翻,沒想到越翻越來勁。以前我學Java,都是用到那就學到那,這一次,我決定系統學習Java,特別是Java的基礎知識。我找了本Java的基礎教材,從語法開始重新學起,到面向對象,集合框架,I/O,網絡,數據庫等。我把每個例子都敲了一遍代碼,花了大概一個禮拜的時間,過了一遍書。
說實話,過一遍書還是有好處的。過了一遍之后,以前用過的東西會覺得好理解了很多,以前沒用過的東西,則大概有個印象,但和我心中的預期還是有很大的落差。我以為過了一遍書,我就能把Java的基礎知識都掌握了,但我畢竟圖樣圖森破啊。我很失落,也開始反思,我覺得這一定是書的問題,不是自己的問題,于是,我求助于網友。網友都推薦《thinking in Java》,我也很天真的買了這本書,開始啃。啃著啃著發現,很多代碼能看懂,但作者寫的話就是不理解,啃再多遍都是一樣的結果。我后來才知道,對技術的理解,必須建立在自己的閱歷之上,常讀常新,不是同一時間讀一百遍會有一百種感受,而是每年讀一遍會有不同的理解。
四、框架
框架是一個好東西,它將我帶出了servlet體系,把我帶進了一個更為廣闊的天地:開源世界。
第一次使用框架是參加一個創新比賽,我學習并使用了struts2、spring和iBATIS這三個框架,俗稱ssi。后來我一發不可收拾,先是用框架開發了幾個web應用,然后借了struts2和ibatis的書閱讀,把這兩個框架用的十分熟練。這些技術也讓我有能力去接一些小型的網站項目,雖然掙不來太多的錢,但它所帶來的成就感卻不是錢能夠衡量的。這種成就感也驅使我去接觸其他開源項目,比如說hibernate、Lucene、netty等。
開源框架在很長時間內都是我心目中Java的終結,我一直以為學會Java就是學會使用這些開源框架,但是,我錯了。我發現我錯的時候,是在我第一次看開源框架源代碼的時候。開源框架的復雜代碼讓我感到震驚和恐懼,我認識到我是有多么的無知。會使用開源框架和會使用servlet有什么區別?都是打字員干的活??!創造這些框架的人,才是真正的程序員!
框架給我帶來的是更廣闊的世界,但卻讓我更加迷茫,就像一只剛會飛翔的海燕,面對狂風暴雨的大海,內心充滿的是敬畏和恐懼。
五、教學視頻
如果我在一開始就去看教學視頻,而不是自己摸索,我會少踩很多坑。
我遇到網絡上的教學視頻的時候,我已經對Java有了一定的基礎了,但我還是花了很多時間去看視頻。從Java基礎,到多線程、俄羅斯方塊游戲開發、ssi框架視頻、mysql視頻、前端視頻、jdbc高級視頻、Java web、EJB、電子商務網站項目等等。這些視頻對我的幫助的確很大,它們幫我把以前零零散散學習的知識在短時間內串了起來。但是無論看多少視頻,我的水平都沒有發生質變,因為錄視頻的老師的水平,不足以讓我產生質變。我始終相信,高手無法量產,一流的高手都是自學成才。教學視頻僅僅是編程世界入門的通信證,而不是編程世界的終結。
六、面向對象和UML
開源框架源代碼雖然可怕,但那也是人寫出來的。
我最終還是下定決心去看源代碼。當時選擇的第一份閱讀材料是iBATIS中使用的DBCP中使用的commons-pool。雖然commons-pool就區區幾十個類,但是這些類結合在一起,卻十分復雜。我嘗試去理解代碼,但看著看著就看不懂了,最后不得不放棄。后來我又試了好幾次,都以失敗告終。那時的我真的很痛苦,天花板看到了,可就是打不破,而安于現狀又不甘心。直到有一天,我遇到了UML,我遇到了類圖和序列圖,我看到了有人使用這些圖來分析源代碼,面對這些分析我也第一次有點理解面向對象的精髓。于是,我嘗試著使用類圖和序列圖去分析commons-pool,將靜態的繼承層次以及類與類之間的關聯關系表達出來,將動態的程序調用順序給畫出來,就這樣,我竟然理解了commons-pool的內部實現原理。我知道,我突破了這塊天花板,我也知道,我接下來要面對的,是更復雜廣闊的開源世界!后來,我又把DBCP和iBATIS的代碼分析了一遍,收貨頗豐。
七、尾聲
未來的路一定是自己走的,但好的東西可以分享,俗話說它山之石可以攻玉,這也是我開博客的原因之一。希望在新的一年里,我能夠多分享一些有意思也有意義的東西,和所有熱愛技術的人一起成長。
備注:這是我兩年前的心路歷程,原文發表博客園,現在原封不動轉過來
版權印為您的作品印上版權