1. 程式人生 > >答好友困惑:Java零基礎如何入門,不知道怎麼學,迷茫ING

答好友困惑:Java零基礎如何入門,不知道怎麼學,迷茫ING

作者:程式設計師小躍

幾個星期之前,我在知乎上看到一個提問,說是:對於完全沒有經驗零基礎自身的數學底子也很弱學習Java應該怎麼學習呢?想著類似的問題我也有過回答,並且反饋還是蠻好的,就參考之前的思路回答了一遍,可惜沒在公眾號裡和大家分享,後續再整理一份好好分享下。(該問答地址見原文)

提出問題的是一位高中生,就順藤摸瓜加了我好友,讓我給指點指點。躍哥最近飄了,各種給人指點,也不知道是對是錯,但是我還是從自身的角度來分析問題,畢竟我也工作多年,給初學者一些信心是我該做的;給初學者一些指導,是我力所能及的;給初學者一些勸退,也是我要做的,畢竟很多人可能最後發現自己並不適合寫程式。

期間這位老弟和我聊了很多,我都零零散散給瞭解答。直到前幾天,他拋給我很多困惑,都是在初學的時候會面臨到的,所以我就抽時間做了一次詳細的解答,主要涉及到Java從入門到進階需要經歷哪些、如何學習Java入門、還沒開始實踐就有一堆煩惱,該怎麼辦?


本文將以問答的方式,給出一些簡單的見解,因為Java內容挺多的,可能會有遺漏,我已經讓群裡的小夥伴們做過一次篩選,讀者朋友們看到了,也可以給我更多的補充噢。

知友:哥,我前兩天也想了一些程式設計的問題向您請教請教吧,希望能得到你的幫助

第一個呢就是Java學習路線是什麼,Java各個階段需要學的知識點有什麼,課程大綱,就是和課本上似的都有目錄包含了所有的哪些知識點Java,從基礎到入門再到精通應該如何學?先學什麼知識點在學什麼?包含了什麼知識體系Java裡,辛苦你能不能和我仔細說說呢

答:

Java現在主要的領域是作為後端在應用,尤其是他的微服務領域,很多國內外知名的大廠都是使用Java作為後端,甚至有大V認為,在微服務領域Java無人能及。

所以,我們學習Java的目標就是把自己培養成微服務的人才。雖然,Android開發,部分前端也是用Java,但是結合你的實際情況,我還是建議往微服務領域走了,也就是Java後端。

Java 是一門純粹的面向物件的程式語言,所以除了基礎語法之外,必須得弄懂它的 oop 特性:封裝、繼承、多型。

關於基礎知識學習

學習基礎知識,就是讓你對Java語言有一個初步的瞭解,其實,任何語言的基礎知識都是大同小異,包含基本的資料型別以及基本的面向物件知識,面向物件是重中之重,只有有了面向物件的知識,在後續的開發中才會有更好的成長。

基礎知識包括(主要參考《Java核心技術卷》即可):

  1. 基本程式結構:基本變數型別、運算子、字串、流程控制、陣列
  2. 類與物件:類的定義和使用、靜態屬性和方法、繼承、包管理、列舉、反射
  3. 介面和抽象類:介面的定義及實現、抽象類的定義及實現
  4. 泛型:泛型類、泛型方法
  5. 集合:集合介面、列表、Map、樹、排序和查詢
  6. 異常與除錯:內建異常、宣告異常、自定義異常、捕獲異常、日誌
  7. 多執行緒:多執行緒概念、使用執行緒、同步
關於Spring等學習

有了一定的基礎知識,接下來就直奔主題,在這領域裡,Spring就是需要學習的利器,下面是編寫Spring相關,需要掌握的知識,可能不止,也可能有遺漏,後續可以再補充

  1. Maven:Maven與包管理、POM檔案、生命週期等
  2. Spring Core:依賴注入與控制反轉、Spring概述、Spring容器與生命週期、自動裝配、註解裝配、切面程式設計(AOP)
  3. HTTP協議
  4. JSON知識
  5. Servlet概念
  6. Spring MVC概念:配置Spring MVC、引數傳遞、實現REST、許可權控制等
  7. RPC框架
  8. RESTFul

關於Spring的學習資料,推薦《Spring實戰》,之前群裡有人中獎,我贈送過一本

關於應用中介軟體的學習

這一部分,就是Java開發中常見的“中介軟體”,這些中介軟體涵蓋了各個領域,包括持久化、快取、佇列、反向代理等,這些是完善一個程式的重中之重,前面屬於基礎框架,這個就是給框架裡填充必要的東西,讓程式健壯穩定。

主要包括但不限於

  1. MySQL:關係型資料庫概念,資料庫的CRUD操作
  2. MyBatis:OR對映概念,配置,對映,基本Java庫,和Spring整合
  3. Redis快取:快取概念、Redis的使用
  4. NoSQL:NoSQL概念,Mongodb的使用
  5. 佇列:佇列概念,RabbitMQ、Kafka
  6. 反向代理:反向代理概念,Nginx的配置和使用
  7. Linux:遠端連線Linux,Linux的常用命令
其他補充

其他的一些補充,主要是在於非技術相關,但是在往後的專案使用中,是肯定需要用到的。

  1. 開發工具:IDEA、Eclipse
  2. 版本控制工具:Git、SVN
  3. Docker容器:環境部署

大體上就分為上面的三個部分,但是每個部分都有很多小的部分,基礎知識最容易,也是重中之重,因為後面所有的程式碼編寫,沒有基礎知識,一些都執行不了。

問了這麼多,寫了這麼多,還是不能停留在理論,最好的方式就是實踐。


知友:第二個就是學習方法沒有找到,不知怎麼學,什麼方法學起來很容易還不會忘記也不會不想學,我現在真的很迷茫,想學但是不知道該怎麼學,特別是在你說的多實踐敲程式碼問題上也就是第三點敲程式碼

我現在的顧慮就是不知道該怎麼去靈活的敲程式碼,還有怎麼才能做到編寫程式碼很準確速度提上來呢現在吧腦子裡還沒有學究一想編寫程式碼就無所適從,不知該怎麼敲,心裡就是覺得敲程式碼很困難,無法下手去敲,更別說多去實踐了

還有就是在敲程式碼問題上如何才能按照給出的題意或者產品開發旨意編寫出程式碼來呢?問這個就是我現在感覺這個很困難,之前在學校剛學c的時候根據課本原始碼敲都敲錯了,更別說佈置的根據意思敲我直接不會,一想到這個我真的怕了所以才問自己適不適合,辛苦你了哥希望能給我仔細跟我說說

答:這幾個連在一起回答。

Java開發也好,C語言也罷,還是其他的語言學習,都是需要實踐的;這個你就把自己當成一名技術工人,泥瓦工也是經過千錘百煉才能造房子,包裝工也是經歷過千萬次的包裝才能做到得心應手。語言組織也是如此,作文就是一字一句積累起來的。

畢竟程式設計是一門技術活,不是靠單純的體力活動能勝任的,所以,這個無他,唯有熟能生巧,才能達到寫程式碼的地步。但是寫程式碼這個要求太低了,還遠遠不夠。

我經常和群友說,程式設計到最後並不是寫程式碼,寫程式碼是最最容易的事情。在寫程式碼之前,還有需求分析,技術選型(選資料庫,選中介軟體等),架構設計,流程設計,演算法選擇,這些都完成了,那你把這些轉換成程式碼就是水到渠成的事情。

這裡只是給出一個最終的目標,針對初學者,一開始不能好高騖遠,也不能被困難所嚇倒。我上面給了學習路線,你看明白了嗎?所以,你現在心裡有數,有沒有被嚇到,如果沒有,那麼請你仔細閱讀《Java核心技術卷1》,把上面的基礎知識都先掌握,出現的程式碼都在編譯器上實踐,一行一行編寫,理解他。如果已經被打到了,那後面就沒有什麼事了,好好選擇一個更好的出路即可。

等基礎知識都慢慢地學會,然後再去找一些小Demo,比如說實現一個計算器,就能檢驗你的學習成果。寫程式碼是一個循序漸進的過程,基礎先學會,逐漸就有成就感,那後面的困難就迎刃而解,否則等到後面學習演算法,專案時間,困難重重。


知友:再說個開發以外的吧,根據之前我也找到了自己的缺點應該在程式設計上會有障礙吧,我做事呢不考慮後果嚴重性,缺乏獨立思考能力,反應速度慢了思考就慢,所以就不知該怎麼做了,自己不會去獨立思考,只有等著別人叫著做什麼就做什麼自己不敢眼事,也不會儲存記憶,注意力不集中,認為小問題就不去想去揣摩,想要改變應該怎麼改變呢?哥

我確實沒怎麼寫過程式碼,之前沒接觸過也就跟著課本上照著寫,我也憂慮不會編寫,即使學了我就怕還不會敲程式碼不清楚怎麼敲,就是從心裡感覺到敲程式碼很困難

答:

寫程式除了有技術能力之外,心境也是一大重點。下面,選擇我之前學習《左耳聽風專欄》的文章一些片段來給你解答。

這裡先聊一下學習的方式,人的學習分為「被動學習」和「主動學習」兩個層次。

  • 被動學習:如聽講、閱讀、視聽、演示,學習內容的平均留存率為 5%、10%、20% 和 30%。
  • 主動學習:如通過討論、實踐、教授給他人,會將原來被動學習的內容留存率從 5% 提升到 50%、75% 和 90%。

我們可以看到,你聽別人講,或是自己看書,或是讓別人演示給你,這些都不能讓你真正獲得學習能力,因為你是在被別人灌輸,在聽別人說。

只有你開始自己思考,開始自己總結和歸納,開始找人交流討論,開始踐行,並開始對外輸出,你才會掌握到真正的學習能力。

學習不僅僅是為了知道,而更是為了思考和理解。在學習的過程中,我們不是為了知道某個事的表面是什麼,而是要通過表象去探索其內在的本質和原理。真正的學習,從來都不是很輕鬆的,而是那種你知道得越多,你的問題就會越多,你的問題越多,你就會思考得越多,你思考得越多,你就會越覺得自己知道得少,於是你就會想要了解更多。如此迴圈,是這麼一種螺旋上升上下求索的狀態。

在學習的過程中,我們要不斷地問自己,這個技術出現的初衷是什麼?是要解決什麼樣的問題?為什麼那個問題要用這種方法解?為什麼不能用別的方法解?為什麼不能簡單一些?……

這些問題都會驅使你像一個偵探一樣去探索背後的事實和真相,並在不斷的思考中一點一點地理解整個事情的內在本質、邏輯和原理。一旦理解和掌握了這些本質的東西,你就會發現,整個複雜多變的世界在變得越來越簡單。你就好像找到了所有問題的最終答案似的,一通百通了。

學習是為了改變自己的思考方式,改變自己的思維方式,改變自己與生俱來的那些垃圾和低效的演算法。總之,學習讓我們改變自己,行動和踐行,反思和改善,從而獲得成長。

總結

大家讀完了這幾個問答是什麼感受呢?這裡我簡單的總結一下。

首先,就是都關心的問題,我選擇了Java,那麼我以後能做什麼。其實Java能做的很多,只是在現階段,我們通過程式語言排行榜也能看到,Java是穩居前三,說明他有龐大的使用者群體,那麼就代表著網路上有海量的 Java 學習資料,良好的社群環境,優秀的解決方案,以及超級多的框架學習,你絲毫不用擔心自己找不到問題的解決方案,找不到學習的路徑。

我列舉了 Java 後端的學習路線,是因為現在 Java 主要在後端發揮著作用。後端 Java 一家獨大,幾乎大型的網際網路和大廠,銀行,金融體系後端都是 Java。

其次就是如何學習,我列舉的 Java 學習路線也是根據後端的學習路線來,其實還有挺多沒涉及到,但是給入門,是足夠了。

第三,就是學習方法,怎麼學。說實話,編碼一直都是取決於個人的學習情況以及自律能力。很多人在學校裡努力,在校招的時候就能有一個好的offer,有些在學校裡沒能堅持下來,可能畢業之後就放棄這條路了;還有些是一開始覺得很感興趣,後來發現自己不適合,要麼學校裡選擇轉專業,要麼出來之後轉產品,轉實施等也算是改行。那麼,就是兩個結果,用籃球季後賽的術語就是 Win or Go Home。

判斷自己是否有毅力學習下來,可以參考下我在上面的建議,當然,如果小夥伴們有更好的建議,可以在留言區給我留言,讓大家一起交流交流。

還有這位老弟的問題就是,什麼都沒去實踐,但是一直在擔心擔心,擔心自己不能寫程式碼。但是,如果你不開始實踐,怎麼知道自己是不是適合,是不是喜歡,是不是會走這條路呢,對吧。其實我剛讀大一,接觸 C 語言的時候,尤其是到了指標,連結串列,想過放棄,但是最後我斷了這個念頭,我要是不寫程式碼,我大學不是白考了,轉專業?現實點,能轉專業的,都是班裡的女生,死磕學成成績,名額都沒了。那麼你還能怎麼辦,硬著頭皮繼續吧。

就這樣,一直到畢業,我在實驗室裡看著書,敲著程式碼,大家的暑假有兩個月,我的暑假就只給自己一個月,另外一個月都在學校裡渡過,就是為了讓自己能不辜負父母的付出。

躍哥今天有點話癆了,但是句句肺腑。接下來,躍哥學習那些優秀的號主,一個系列一個系列的輸出,拿出當初程式設計學習樣子,和大家一起奔跑