如何學(xué)Java?介紹點(diǎn)不太一樣的學(xué)習(xí)方式
首先聲明,這篇文章不是賣課程、介紹培訓(xùn)班的廣告。
最近有不少讀者通過(guò)微信問(wèn)我:小白應(yīng)該怎么學(xué)好 Java?
提問(wèn)的人里有在校大學(xué)生、有剛參加工作的、有想轉(zhuǎn)行做程序員的,還有一部分是最近找工作不順的。
現(xiàn)在行情不好,很多人都焦慮,但是光跟著焦慮不解決問(wèn)題。作為程序員,還不如靜下心來(lái),少受干擾,專心提高自己。
繼續(xù)說(shuō)回到學(xué) Java 這個(gè)問(wèn)題上來(lái),網(wǎng)上 95% 以上的文章都是說(shuō)介紹學(xué)習(xí)路線、Java書籍和視頻的。
學(xué)習(xí)路線無(wú)非就是:
- Java:語(yǔ)法、面向?qū)ο?、IO、集合、異常、多線程……
- Java WEB:Tomcat、servlet、Struts、Spring……
- 持久化相關(guān):MySQL、Hibernate、MyBatis……
- …………
書籍、視頻說(shuō)的比較多的有:
- 《Head First Java》、《Java 編程思想》、《Effective Java》……
- 畢向東、劉意等老師的視頻。
Java 家族成員太多,學(xué)個(gè) Java 怎么要學(xué)這么多東西?
學(xué)習(xí)資料越收集越多,這要學(xué)到什么年頭?很多人都是收藏從未停止,學(xué)習(xí)從未開(kāi)始。
我今天就和大家說(shuō)點(diǎn)不一樣的,我學(xué) Java 中對(duì)我?guī)椭畲蟮娜谓?jīng)歷。這三段經(jīng)歷都是發(fā)生在我剛工作的前 5 年中,我個(gè)人認(rèn)為,程序員的前 5 年是技術(shù)突飛猛進(jìn)的階段,這個(gè)階段非常重要。
經(jīng)歷一:遇到了志同道合的好基友
這段經(jīng)歷是從我工作之后第三個(gè)年頭開(kāi)始的,因?yàn)橹匾?,所以先說(shuō)。
那時(shí)候我跳槽去了一家新公司,在這家公司就干了不到一年,如果不是因?yàn)檎J(rèn)識(shí)了兩個(gè)程序員,這段經(jīng)歷幾乎都快忘記了。
這兩個(gè)程序員和我年齡相仿,都姓劉,為了省事,后面統(tǒng)稱二劉吧。對(duì)我來(lái)說(shuō),如果用一個(gè)詞來(lái)形容他倆,就是:良師益友。
認(rèn)識(shí)二劉之前,我覺(jué)得自己水平還可以:會(huì)寫 CRUD、JSP,會(huì)用 Struts,會(huì)扯幾個(gè)設(shè)計(jì)模式?,F(xiàn)在看來(lái),就是一個(gè)能熟練寫代碼的程序員而已,動(dòng)手能力還湊合,腦子里的知識(shí)不成體系。
從認(rèn)識(shí)二劉的第一天起,就被全面碾壓。學(xué)校、專業(yè)的碾壓就不用說(shuō)了,關(guān)鍵是從他們嘴中我聽(tīng)了很多之前都沒(méi)聽(tīng)過(guò)的名詞:敏捷開(kāi)發(fā)、重構(gòu)、結(jié)對(duì)編程、領(lǐng)域模型……
說(shuō)實(shí)話,當(dāng)初剛接觸這些的時(shí)候,我是很排斥的。舉幾個(gè)例子:
- 看到二劉結(jié)對(duì)編程,心想一個(gè)人干活、一個(gè)人閑著,這不是偷懶嗎?
- 重構(gòu)代碼:程序跑的好好的,我為啥要改我的代碼?有重復(fù)代碼怎么了?有重構(gòu)的時(shí)間,還不如再實(shí)現(xiàn)倆新功能。
- 單元測(cè)試:代碼還寫不過(guò)來(lái),哪有時(shí)間寫單元測(cè)試,再說(shuō)了,不是有專門的測(cè)試嗎。
- 領(lǐng)域模型:別和我說(shuō)什么貧血不貧血,我的 JavaBean 里就只有 getter、setter。
好在二劉足夠有耐心,對(duì)我不拋棄不放棄,反復(fù)給我洗腦,終于讓我這個(gè)思想落后青年,接受了他們的思想,后面經(jīng)常和他倆一起學(xué)習(xí)、實(shí)踐、交流。
學(xué) Java 很辛苦,大部分人自制力差,一個(gè)人學(xué)容易偷懶。找?guī)讉€(gè)好基友一起學(xué),確實(shí)提高快。在這里要感謝一下當(dāng)初二劉對(duì)我的幫助。
到現(xiàn)在我和二劉還是好朋友,跟他們一起學(xué)到的重構(gòu)、DDD、TDD、架構(gòu)模式這些思想,讓我受益至今。相比于Struts、Hibernate那些技術(shù)來(lái)說(shuō),這些更像是程序員的內(nèi)功,內(nèi)功不會(huì)很快過(guò)時(shí)。
經(jīng)歷二:找到了組織——BJUG
如果說(shuō)認(rèn)識(shí)二劉是我上了一條賊船,那么加入 BJUG 就是上了一艘航母。加入 BJUG 還是通過(guò)二劉,你看好基友是多么重要。
舊文中提到過(guò) BJUG 這個(gè)名字:
Beijing Java User Group的簡(jiǎn)稱就是 BJUG。從名字就能看出來(lái),是一群在北京工作的 Java 程序員聚在一起的一個(gè)小團(tuán)體。
BJUG 是一個(gè)非?;钴S的技術(shù)社區(qū),我們都有哪些活動(dòng)呢?
最主要的活動(dòng)是線下技術(shù)分享,分享基本都在周六下午,一下午能分享 2-4 個(gè)主題。
現(xiàn)在還能百度到當(dāng)時(shí)的信息,給大家貼幾張圖。
從這幾張圖上,大家能看出了,我們當(dāng)時(shí)分享的都是技術(shù)干貨。在冰云的熱心組織下,社區(qū)弄得還可以,成為 Top 50 的 Java User Group。
除了技術(shù)分享,我們還一起翻譯資料、書籍。當(dāng)然還少不了一起聚餐腐敗。
BJUG 不僅僅是一個(gè)技術(shù)社區(qū),還是一個(gè)有愛(ài)的社區(qū)。曾經(jīng)一名核心會(huì)員得了重癥需要換骨髓,面對(duì)伙伴的不幸,大家捐款相助,為伙伴的康復(fù)貢獻(xiàn)了綿薄之力。
可惜的是,BJUG 后期人變多了,人多了之后交流的質(zhì)量我感覺(jué)反而降低了,后面慢慢活動(dòng)越來(lái)越少了?,F(xiàn)在看來(lái),人多不一定是好事,小圈子反而更有效率。
當(dāng)時(shí)在 BJUG 里我好像沒(méi)做過(guò)主題分享,因?yàn)椴蛔孕牛际浅洚?dāng)聽(tīng)眾,這也算一個(gè)遺憾吧。
不管怎么說(shuō),BJUG 里牛人非常多,我屬于那里邊最菜的了。能跟那些牛人學(xué)多少東西,你們可以自己想象一下。
總之,經(jīng)歷了二劉和 BJUG 的洗禮之后,后面幾年我找工作面試的時(shí)候,沒(méi)被技術(shù)面試卡住過(guò)。
經(jīng)歷三:擼幾萬(wàn)行代碼
終于可以把時(shí)間調(diào)回到我剛工作的頭兩年了。
我的大學(xué)一般般,非 985、211,我也不是計(jì)算機(jī)專業(yè)的,大四參加了一個(gè) Java 培訓(xùn)班。參加培訓(xùn)班之前的計(jì)算機(jī)水平:QQ 熟練、紅警精通。
培訓(xùn)半年之后的水平也不咋地,畢業(yè)之后能找到程序員的工作,主要因?yàn)橼s上了好時(shí)候,那時(shí)候缺程序員啊,大學(xué)剛擴(kuò)招,哪有現(xiàn)在這么多畢業(yè)生,而且大學(xué)還沒(méi)教 Java。大部分培訓(xùn)機(jī)構(gòu)還在教網(wǎng)頁(yè)三劍客,能教 Java 的老師就很少。
有了培訓(xùn)班的基礎(chǔ),我工作之后也能湊合干,不過(guò)還有太多太多不會(huì)的知識(shí),不會(huì)就學(xué)唄。
最開(kāi)始我學(xué)習(xí)靠看書,看《Java 編程思想》,也不知道是書太難了,還是翻譯的太晦澀了,看書真看不懂啊,書又厚,我看了幾個(gè)月愣是一遍都沒(méi)看完,經(jīng)常是看了后面忘了前面。
后來(lái)我干脆就把書扔一邊去了,直接擼代碼!
起初是擼簡(jiǎn)單的,擼各種常用類、常用方法的例子,這樣方便以后拿起來(lái)就用。另外,擼的多了,慢慢攢出了自己的一套工具類,包括String、數(shù)組、日期、類型轉(zhuǎn)換等等這些的,在三方工具類沒(méi)有普及之前,這套工具類陪了我很多年。估計(jì)很多老程序員,都有一套自己積累的工具類。
后來(lái)是擼項(xiàng)目代碼,當(dāng)時(shí)找的是著名的 PetStore 項(xiàng)目,雖然是個(gè)示例項(xiàng)目,項(xiàng)目很小,但是麻雀雖小五臟俱全。最開(kāi)始是看一行寫一行,照著抄代碼。抄了 n 遍之后,感覺(jué)都會(huì)了,然后自己默寫,磕磕絆絆默寫出來(lái)之后,根本跑不起來(lái),一堆 bug。解決完 bug,能跑起來(lái)了,下一步就是把自己寫的代碼和原始代碼作比較,看看差異在哪,琢磨人家為什么要那么寫。
擼了一定數(shù)量代碼之后,我再回過(guò)頭去看書,可能以前看不懂的,突然就明白了。
印象最深的一個(gè)事是,當(dāng)初第一次抄完抽象類的代碼,我壓根就不知道還有抽象類這一說(shuō),我以為一度懷疑這個(gè)類沒(méi)寫完整,會(huì)編譯不通過(guò)……
總的來(lái)說(shuō),擼代碼對(duì)我度過(guò)小白階段來(lái)說(shuō),非常非常重要。
我感覺(jué)學(xué) Java,除了學(xué)知識(shí),還離不開(kāi)動(dòng)手實(shí)踐。上面寫的我擼代碼的方式,也不一定適合所有人,每個(gè)人情況不一樣,大家參考就好。
其他補(bǔ)充
除了個(gè)人經(jīng)歷,再補(bǔ)充幾點(diǎn)學(xué)習(xí)技巧:
補(bǔ)充1:看大廠的開(kāi)發(fā)規(guī)范
例如阿里的《Java 開(kāi)發(fā)手冊(cè)》,是阿里巴巴集團(tuán)技術(shù)團(tuán)隊(duì)的集體智慧結(jié)晶和經(jīng)驗(yàn)總結(jié)。
看這目錄:
分為編程規(guī)約、異常日志、單元測(cè)試、安全規(guī)約、MySQL數(shù)據(jù)庫(kù)、工程結(jié)構(gòu)、設(shè)計(jì)規(guī)約七個(gè)維度,再根據(jù)內(nèi)容特征,細(xì)分成若干二級(jí)子目錄。另外,規(guī)約依次分為強(qiáng)制、推薦、參考三大類。在延伸信息中,“說(shuō)明”對(duì)規(guī)約做了適當(dāng)擴(kuò)展和解釋;“正例”提倡什么樣的編碼和實(shí)現(xiàn)方式;“反例”說(shuō)明需要提防的雷區(qū),以及真實(shí)的錯(cuò)誤案例。
真的是大廠的智慧結(jié)晶和經(jīng)驗(yàn)總結(jié),新人看完可以少踩很多坑!
補(bǔ)充2:找到學(xué)習(xí)重點(diǎn)
Java 全家桶包括的東西太多,對(duì)小白來(lái)說(shuō)一個(gè)難點(diǎn)就是:不知道學(xué)習(xí)重點(diǎn)。
學(xué)習(xí)重點(diǎn)就是那些在招聘需求、面試問(wèn)題中高頻出現(xiàn)的。
把主要精力放在學(xué)重點(diǎn)上,剩下的可以慢慢學(xué),學(xué)習(xí)是一個(gè)長(zhǎng)期的過(guò)程,別想著一口吃成胖子。
另外,對(duì)小白來(lái)說(shuō),太復(fù)雜、太高級(jí)的可以先知道個(gè)大概,不用奢望一下學(xué)得很透。就像我們和小朋友說(shuō)“等你以后長(zhǎng)大了,慢慢就懂了”一個(gè)道理。
還有,有些知識(shí)可以不用學(xué)了,例如Swing、JSP現(xiàn)在幾乎沒(méi)人用了,學(xué)這個(gè)就是浪費(fèi)時(shí)間。就連Struts、Hibernate現(xiàn)在用的也少了,學(xué)習(xí)的優(yōu)先級(jí)也往后放。
補(bǔ)充3:資料不用貪多
不要盲目收集資料,收集太多資料你也看不完,更多是自我安慰。
資料在精不在多,遇到好的資料,該花錢就花錢,對(duì)自己學(xué)習(xí)不要摳門。有的資料、課程也不貴,少下一次館子、少買件衣服、少看一場(chǎng)電影就有了。花錢買了別人的經(jīng)驗(yàn),省了自己的時(shí)間。
但是,花錢也別盲目,現(xiàn)在濫竽充數(shù)的老師、培訓(xùn)太多。
總結(jié)
這篇文章寫了很多個(gè)人經(jīng)歷,我覺(jué)得只有親自經(jīng)歷的,自己驗(yàn)證有效的,才好意思推薦給你們。
經(jīng)歷里,我特意打亂時(shí)間順序,按照學(xué)習(xí)效果來(lái)寫的。
強(qiáng)烈建議你們找到身邊的學(xué)習(xí)圈子。如果沒(méi)有現(xiàn)成的,你是不是可以組建一個(gè)?大家一起學(xué)習(xí)、一起分享、一起寫代碼看代碼。
圈子人數(shù)不用多,十個(gè)人以內(nèi)就挺好的。
這個(gè)圈子,不是微信里面學(xué)習(xí)交流群(我加了不少群,大部分消息沒(méi)啥價(jià)值,慢慢成了死群),最好都在一個(gè)城市的,能一起線下約活動(dòng)。
有了圈子,除了技術(shù)提高,對(duì)你以后跳槽也有好處。
除了圈子,學(xué) Java 要多敲代碼,不要只是聽(tīng)和看。
寫到這里,我突然想到了學(xué)習(xí)金字塔:
看完這個(gè)圖,用什么方式去學(xué) Java,你心里就有譜了吧。
就說(shuō)這么多吧,希望你能轉(zhuǎn)發(fā)、點(diǎn)在看,說(shuō)不定和你日后一起學(xué)習(xí)的好基友會(huì)看到這篇文章。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:



長(zhǎng)按訂閱更多精彩▼

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!