假如時光倒流,我會這麼學習Java

来源:http://www.cnblogs.com/aishangJava/archive/2017/07/25/7231974.html
-Advertisement-
Play Games

回頭看看, 我進入Java 領域已經快15個年頭了, 雖然學的也一般, 但是分享下我的心得,估計也能幫大家少走點彎路。 [入門] 我在2001年之前是C/C++陣營, 有C和麵向對象的基礎, 後來轉到Java ,發現沒有指針的Java真是好簡單, 另外Java 的類庫好用的讓人哭啊。 後來我就看《T ...


回頭看看, 我進入Java 領域已經快15個年頭了, 雖然學的也一般, 但是分享下我的心得,估計也能幫大家少走點彎路。

[入門]

我在2001年之前是C/C++陣營, 有C和麵向對象的基礎, 後來轉到Java ,發現沒有指針的Java真是好簡單, 另外Java 的類庫好用的讓人哭啊。

後來我就看《Thinking in Java》 ,《 Java 核心技術 》, 感覺也不吃力。

如果我之前沒學過別的語言,或者半路出家轉到電腦行業, 我不會先看上面那兩本, 相反我會選《Head First Java》, 這本書非常適合零基礎的小白, 讀起來輕鬆搞笑, 不信你看看第一頁

但是光看書也挺無趣的,不妨和視頻結合著看, 我覺得傳智播客的Java基礎視頻很不錯 (唉, 給傳智打了個廣告), 網上一搜就有,真搜不到就來我的QQ群里吧(群號碼:523047986)

註意:視頻的好處就是能看到敲代碼的過程, 代碼是活的, 這點很爽。 如果視頻只是按PPT講編程, 果斷扔掉。

書也有書的好處,能寫成書的, 肯定是作者經過系統化思考,梳理才能形成的東西, 所以系統性比較強。

書還有其他優點, 例如可以隨便的翻, 找到重點反覆的看。

所以混合著看經典書+優秀的視頻 應該是最好的入門。

Java 入門, 我不會去上培訓班,白白浪費錢 ,自學就夠了。

自學過程中如果有實戰經驗豐富的高人指導一下, 給我繪出路線圖, 指出攀登的方向,哪些地方有陷阱, 哪些地方不應該浪費時間, 我的自學就可以減少摸索,少走彎路,

很不幸, 我當年沒有遇到, 如果時光倒流, 我會想辦法找一個來指導我。

[實踐]

軟體行業的一大特點就是光看不做永遠都學不會,編碼不到10萬行都不好意思出去打招呼。

所以實踐,實踐,實踐!

在校期間,我還是會儘可能的去找項目做(參見我的另一篇文章《從現在開始豐富你的簡歷》, 回覆“簡歷”查看) , 實在沒找到,也可以先把基礎打好

我上大學的時候用的是嚴蔚敏的《數據結構》, 當時我也把習題都做了一遍,考高級程式員的時候, 成績非常好。

後來我知道了一本更好的演算法入門書《演算法》, 如果時光能夠重來, 我還是會這本書上提到的所有數據結構和演算法用Java 都實現一遍, 課後作業也爭取都做一遍。

這是個非常重要的訓練,因為我知道, 真的做了, 就會發現工作以後只要不是設計演算法, 基本的數據結構沒有能難住我的。

【Java SE】

對於Java集合框架, 不但要學會用, 我還會嘗試著實現一遍,List, ArrayList, Set ,HashSet, Map ,HashSet 等等, 要是不知道怎麼寫, 看看JDK的源碼就可以了, 那裡有最好的老師。

實現一遍能更好的明白麵向對象的設計, 介面,抽象類, 具體類的關係, 怎麼分離職責,會學習到設計模式中的模板方法, Iterator 等 。

值得一提的是Iterator, 很有趣, 我還清楚的記得那一年自己實現集合框架中 Iterator 的時候的激動心情啊 :-)

在實現Java 集合框架的時候, 可以順便把泛型也學了, 不學不行,要不然實現不了啊。

Java 世界里,萬事萬物都是對象, 大家都知道封裝,繼承,多態, 但是僅僅瞭解這些只是入了門, 不可能做出真正的面向對象的程式。

有一本經典的書《敏捷軟體開發, 原則,模式,實踐》,裡邊詳細的講解了一個薪水支付案例,是迄今為止最好的面向對象設計的例子

我會用Java 把它實現一遍, 真正的體會一下OOD, 瞭解怎麼才能把合適的責任分給合適的類, 什麼叫面向介面而不是面向實現編程, 什麼是優先使用組合而不是繼承。

對於Java線程, 重點還是理解概念, 因為我知道在以後的工作中(除非從事系統級編程) ,自己寫線程/線程池的機會是非常罕見的,都被類庫,框架給封裝好了。所以重點是理解,

看書的話就當然是《Java併發編程實戰》 ,一大群大牛寫的啊。

對於Java IO, 我覺得架構設計的很優雅,典型的學院派, 可就是不太實用, 打開讀取一個文件都得用裝飾者模式包裝來包裝去, 太累了。

項目實戰中呢,也就是讀取個property 文件, xml 文件。 我還是重點去理解概念和設計吧。

不過自己寫個簡單的xml 解析器倒是不錯。

至於 AWT, Swing , 簡單看看就行了, 我不會去深入研究, Java 是典型的伺服器端的語言, 開發客戶端程式的極少, 你想想, 你用Swing/AWT搞個桌面程式出來, 還得讓客戶裝個JRE才能運行, 是不是有點過分 ? 據我所知,也即是銀行的一些應用在用Swing ,AWT了。 有人可能說 Applet, 它曾經流行過, 現在早都沒人用了。

所以我不會在Swing和AWT上浪費時間。

Java Reflection 看起來沒有集合框架,線程,OO等那麼耀眼, 但它可是很多框架(SSH) 的基礎啊(回覆“反射”查看相關文章), 先把基礎學會,後面的Java EE得用到它。

想真正的學好Java ,不瞭解Java 虛擬機怎麼可能? 《深入理解Java 虛擬機》一定得看,看完的目標就是寫個簡單的Java 反編譯器。

【做個有素養的Java碼農】

我記得08的時候, 我的IBM經理說設計模式是必備技能, 不懂設計模式的我們不能要了。

所以設計模式是必學, 其實Java裡邊用的非常多,簡直就是設計模式的活教材, 工廠方法,單例,模板方法, 裝飾者,責任鏈都有體現。

當然我會去先看一下輕鬆的《Head First Design》, 《設計模式》的作者之一 Eric Gamma 都大力推薦, 絕對不容錯過。

又過了幾年, 我的IBM經理又說,現在我們預設設計模式大家都會了, 敏捷實踐是必備技能 !

所以, JUnit 我得會, 重構我得會, TDD,持續集成這些最最基本的敏捷實踐也得知道, 要不然會被人鄙視啊。

作為一個有追求的Java碼農, 我寫代碼的時候要遵循Java 的編碼規範,例如類名首字母大寫, 報名要小寫, 方法名要首字母小寫...等等。

作為代碼潔癖, 我受不了臟代碼, 我會不斷的打磨自己的代碼,直到它像一個工藝品。

Java 的最佳實踐 《effective java》 怎麼能錯過? 裡邊滿滿的全是JDK的作者們總結出來的java 編程最佳用法。

不過翻譯的實在是不咋滴, 很多句子都得仔細的琢磨一下才知道什麼意思, 所以我打算錄一系列視頻講解一下,敬請期待。

【Java EE】

走了這麼遠, 終於來到Java EE了, Java 不就是寫伺服器端的Web應用的嗎?

我會自己寫個Web程式, 可以考慮把上面提到的經典的薪水支付案例改造成Web 版, 用最基礎的技術Servlet/jsp/jdbc 。

然後 研究struts, 自己寫個簡單mvc框架, 在自己的Web 程式中用起來, 這叫吃自己的狗糧。

然後研究Hibenete , 自己寫個簡單的OR mapping框架, 再吃一次自己的狗糧。

然後讀一下經典的書《J2EE development without EJB》 , 對,就是spring 的作者Rod Johnson寫的, 它顛覆了大家對於重量級EJB的認識, 開啟了新的時代。

有了這本書的鋪墊, 自己寫個簡化的依賴註入也不是難事, 寫好後還是在自己的Web程式中用起來, 最後一次吃自己的狗糧。

等你做了就知道, 所有這些,都依賴Java Reflection。

再往後走, 就應該是找真正的項目做, 或者去找實習了, 那是另外一個話題了,以後再聊。

【閱讀代碼】

熟讀唐詩三百首,不會作詩也會吟

模仿是最好的學習! 多看看大牛們的代碼是怎麼寫的, 潛移默化,自己的武功也能提高。

我身邊要是有個好師傅, 跟著他,看著他編程, 提高的該有多快啊。

在學習Java SE和Java EE的同時, 我會讀一下這些源代碼:

JDK中的 Java Collection 源碼 : 老祖宗的東西絕對經典

JUnit 源碼 : 看看Eric Gamma 和 Kent beck 是怎麼通過模式來創建系統的 (回覆"JUnit"查看)

SpringSide : 以Spring Framework為核心的,Pragmatic風格的JavaEE應用參考示例,是JavaEE世界中的主流技術選型,最佳實踐的總結與演示。

國人開發的,大力推薦一下。

此外我還是會研究下本世紀初著名的Jive論壇, 雖然非常古老, 雖然源碼學院派十足, 但簡直是設計模式的大本營, 都是活生生的應用的例子

裡邊有個用代理模式實現許可權控制, 讓我記憶猶新。

另外如果有餘力的,有興趣的話, 當然可以閱讀Struts, Spring, hibernate的源碼, 甚至參與進去開發了。

如何學習Java ,這是我這麼多年來的感受, 也只是我的一家之談。 歡迎和我交流 。

學習編程從來就不是一件容易的事情, 不可能看看視頻,看看書就學會, 需要大量的編程和實踐。 編程雖然是極為辛苦的腦力和體力勞動, 但其中蘊含的創造的樂趣也是無與倫比的。 希望每個人都能夠享受這個過程,樂在其中。

Java學習交流QQ群:523047986  禁止閑聊,非喜勿進!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ////////HTTPGET HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "text/html;charset=UTF- ...
  • 18位號碼: 15位號碼: ...
  • 目錄 "簡介" "安裝" "主從複製" "備份與恢復" "API" AddOrUpdate GetOrAdd DeleteByPattern SearchKeys TransExcute Subscribe/Publish "命令" Todo Sentinel .NET Core Configura ...
  • 基於 Quartz.NET 實現可中斷的任務 Quartz.NET 是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理數據等。 Quartz.NET 允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關 ...
  • 題目背景 二分圖 題目描述 給定一個二分圖,結點個數分別為n,m,邊數為e,求二分圖最大匹配數 輸入輸出格式 輸入格式: 第一行,n,m,e 第二至e+1行,每行兩個正整數u,v,表示u,v有一條連邊 輸出格式: 共一行,二分圖最大匹配 輸入輸出樣例 輸入樣例#1: 1 1 1 1 1 輸出樣例#1 ...
  • 1.攔截器與過濾器的區別 相同點:攔截器其實也是一種過濾器,都用於對請求和響應做攔截進行額外的處理. 不同點:攔截器主要是通過過濾器來調用的,功能實現主要放在攔截器中,而過濾器主要是用來調用攔截器.而且過濾器屬於java web中的概念範疇,而攔截器只有在struts2框架中採用這一概念 2.str ...
  • http://www.cnblogs.com/hoojo/archive/2011/08/11/2134638.html 可擴展標記語言——eXtensible Markup Language 用戶可以自己定義語言標記,只要有開始和閉合標簽即可。 xsl裝飾、修飾xml的顯示結果。 dtd約束xml ...
  • ILSVRC(ImageNet Large Scale Visual Recognition Challenge)分類比賽。AlexNet 2012年冠軍(top-5錯誤率16.4%,額外數據15.3%,8層神經網路)。VGGNet 2014年亞軍(top-5錯誤率7.3%,19層神經網路)。Goo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...