Java是啥 新手程式員通常會走入一個誤區,就是認為學習了一門語言,就可以稱為是某某語言工程師了。但事實上真的是這樣嗎?其實並非如此。 今天我們就來聊一聊,Java 開發工程師到底開發的是什麼東西。準確點來說,Java後端到底在做什麼? 基礎 大家都知道 Java 是一門後端語言,後端指的就是服務端 ...
Java是啥
新手程式員通常會走入一個誤區,就是認為學習了一門語言,就可以稱為是某某語言工程師了。但事實上真的是這樣嗎?其實並非如此。
今天我們就來聊一聊,Java 開發工程師到底開發的是什麼東西。準確點來說,Java後端到底在做什麼?
基礎
大家都知道 Java 是一門後端語言,後端指的就是服務端,服務端代碼一般運行在伺服器上,通常我們運行Java 程式的伺服器都是 Linux 伺服器。
這些伺服器在互聯網公司中一般放在一個叫做機房的地方里,於是像我們這類 Java 程式員的代碼一般也運行在這些機房裡的伺服器中。
Java 里有一個概念叫做虛擬機,你可以把它理解為一個安卓的模擬器,比如你在電腦上裝了一個安卓模擬器,就可以通過它來運行安卓應用程式,比如裝個 APP,手機游戲什麼的。
所以當你在電腦上安裝了一個叫做 JDK 的東西時,電腦里就有了 JRE 也就是 Java 運行環境,有了這個運行環境,你就可以運行 Java 應用程式了。
知道 Java 程式如何運行在電腦上之後,我們再來講一講平時學的一些 Java 基礎知識,它們到底有什麼用?
其實平時這一些 Java 基礎語法都僅僅是你寫代碼的一些基礎知識,就相當於英語中的 26 個字母,常見的有基本類型變數、for 迴圈、if else 等等基本語法,掌握了這些基礎知識之後,你就可以上手寫一些很簡單的代碼了。
除此之外,Java 還有一些比較特別的概念,比如面向對象的特性,其中有類、介面等概念。為什麼 Java 要引入這些東西呢,其實就是想讓使用者更好地進行設計、抽象和編程。
對於新手來說,你不需要理解得特別的深刻,因為這些東西只有你在你真正寫代碼之後才能逐步去理解。
Java核心技術
說完基本知識之後,我想你也會好奇,Java里經常提到的一些集合類是幹嘛的呢,因為在現實生活中有很多場景,需要用到集合類,比如說一個用戶名列表,你要怎麼存呢?
你會用一個 List 來做對不對,所以集合類的作用就是讓你在編程中更好的存儲數據。
事實上,集合類的概念最早是來源於數據結構的,因為電腦里有很多特殊的數據存儲結構,比如文件樹,比如鏈表和數組等結構,因此電腦理論把這些存儲數據的模型抽象成一些常見的結構,統稱為數據結構。
那麼,Java 中的併發編程又是做什麼的呢,Java 中的多線程是為了更好地利用電腦中的CPU核心,通過併發編程,就可以提高程式併發的效率。
但是併發編程的背後需要操作系統的支持,以及電腦硬體的支持,所以,如果你要完全地理解多線程,絕不僅僅是理解 Java 里的 Thread 或者是線程池就足夠了,你還需要去理解操作系統,以及電腦組成原理。
和併發編程類似,Java 里也有網路編程的概念,Java 里的網路編程和其他語言大同小異,其實也是基於 TCP/IP 協議實現的一套 API,通過網路編程,你就可以在程式中把你想傳輸的數據傳輸到網路的另一端,有了網路編程和併發編程之後,Java 程式員的能量已經很大了
講完這幾點之後接下來再談談,我們通常說的 Java 後端技術到底是什麼,就拿支付寶來舉例吧,曾經的支付寶用戶數並不多,一臺伺服器,一個資料庫就可以支持所有的業務了。
後端技術
當支付寶的用戶越來越多的時候,一臺伺服器無法同時滿足海量用戶的需求,於是開始出現了多台伺服器,多台伺服器組成了一個集群,用戶可以通過負載均衡的方式訪問這些伺服器,每個用戶可能會訪問到不同的機器上,這樣子就達到了分流的效果,伺服器的壓力就會減小。
由於資料庫需要保證數據的可靠性,萬一某一臺資料庫掛了,並且沒有備份的話,那麼這個數據就無法訪問了,這在大型系統中是不允許出現的,於是乎,就有了資料庫的主從部署。
但事實上,隨著業務發展,資料庫的壓力也越來越大,主備部署並不能解決資料庫訪問性能的問題,於是乎我們需要進行分庫分表,在資料庫主備的基礎上,我們會把一個數據量很大的表拆成多個表,並且把資料庫請求分流到不同的數據上,比如說100個分庫,100個分表,就相當於把一個數據表劃分成10000個數據表。
此時又出現一個問題,如果一個資料庫有多個備庫,並且當主庫掛掉的時候需要進行主從切換時,主備資料庫之間的數據就可能發生不一致,而這也是分散式理論研究的問題之一,因為比較複雜,我們這裡就略過不講。
分散式
剛纔說到了分散式技術,其實負載均衡、分庫分表都是分散式技術的一種實現,如果你不想做分庫分表,那還有什麼辦法能夠減輕資料庫訪問的壓力呢?於是緩存就出現了,緩存可以讓伺服器先把請求打到緩存上,由於緩存的數據一般在記憶體中,所以訪問速度會非常快,這些請求無需經過資料庫。
隨著業務發展,緩存的單點壓力也會比較大,於是乎分散式緩存就出現了,通常來說,緩存難以保證數據的可靠性,因為它們的數據可能會丟失,同時緩存只能存儲一部分的數據,並不能解決所有問題。
所以當某些業務的請求量非常大的時候,光靠緩存也解決不了問題,此時我們還可以通過消息隊列來幫我們解決大流量併發請求的問題。
我們可以通過消息隊列來存儲一部分的請求消息,然後根據我們伺服器處理請求的能力,把消息再逐步取出來,接著去把這些消息逐漸地進行處理,這樣就可以很好的解決高併發的問題。當然,前提是消息隊列要保證消息存儲的可靠性,這也是大部分消息隊列都會保證的能力。
一口氣講了這麼多,算是把 Java 後端的大概面貌介紹清楚了,除此之外還有很多東西沒講到,真要講完的話一晚上也說不完。
總體來說,Java 後端技術,說難不難說簡單也不簡單,我儘量把這些內容都講的比較通俗易懂,事實上每項技術的背後都有特別多複雜的實現原理,當然,在你理解了 Java 後端技術的整體概念以後,相信對於你之後的學習會更有幫助。
為什麼我要選擇Java
最近有一些小伙伴問我,為什麼當初選擇走Java這條路,為什麼不做C++、前端之類的方向呢,另外還有一些聲音:研究生不是應該去做演算法方向麽,本科生不就可以做開發了嗎,為什麼還要讀研呢。其實吧,這個問題擱在不同人身上,回答可能也是完全不一樣的。我可能還是主要以我的角度出發,結合一些讀者的問題,來說一說為什麼要選擇Java這條路。
談談我的技術方向選擇
我最早接觸的語言應該是c,再後來又接觸了前端、php、C#等語言,對這些語言的瞭解也僅限於懂得基本語法,寫過一些小demo而已,那時候覺得掌握一門語言就是掌握它的語法就行了,於是會在簡歷上寫,瞭解各種語言,現在想想實在是太可笑了。
不過真的很多初學者都會這麼認為,覺得自己不管選哪個方向都可以,這是因為他們不知道自己的技術方向到底是什麼,因為他們不管哪個方向都不精。
後來慢慢接觸了Android開發,能自己寫一些app,覺得這個方向還挺有趣的,於是想著以後乾脆做這個吧。不過我那時候也明白自己離進大廠還有很遠的距離,於是打算考研。巧的是,讀研前的那個假期,去了一家公司實習,做的是Java Web,那時候才覺得Android比Java Web簡單多了呀,完全不需要學那麼多框架、技術啊,於是更堅定了做Android的決心,只不過那時候也同樣發現了,Java web是更加熱門的方向,崗位需求量也更大。
讀研的時候,一開始也是打算做Android方向的,買了各類Android書籍開始啃,那時候剛好遇到了個實踐課程,讓我們選方向,有Java、Android、C++等等。當時妹子做前端,為了帶上妹子一起做項目,乾脆就選了Java Web這個方向,想著應該不影響我做Android啊,於是接下來的時間里就開始學Java Web了。
時間一長,發現這個方向也沒有想象的那麼難,相反還挺有意思的,畢竟能用到各種各樣的框架,技術棧的內容也很豐富,看起來好像比Android的技術含量高很多,加上自己之前學過Java,也有Java Web的學習經歷,簡歷上也能寫的好看一點,於是一不做二不休,就開始做Java方向了。就這樣,我找到了第一份Java實習,看了一遍Java後端書單,慢慢地在這條路上越走越遠,後來我才發現,Java Web遠沒有想象中那麼簡單,Java後端技術棧也遠不止Java Web這點內容,特別是對於大廠來說,要掌握的東西實在太多了,比如分散式、網路編程、中間件等等。
所以,選擇方向這件事,有時候就是看興趣,看機遇,看你能堅持多久,如果你對一個方向感興趣,並且願意持續學習,不斷深挖,這個方向可能就適合你,當你在這個方向投入了一定時間之後,有了一定積累和經驗,就不太容易再改變方向了。
談談各個技術方向的前景
之前也有很多讀者問過這個問題,做哪個方向更有前景,更有錢景。雖然我只做過一個方向,但是對其他方向也有一些瞭解和涉獵,不敢說瞭解得非常多,但是結合自己身邊的同學、朋友的情況,還是可以給出一些比較中肯的建議。
其實我最早打算做的是游戲開發的,所以我們先聊聊游戲開發這個方向。
網易游戲在前幾年對游戲開發的招聘要求是985碩士以上學歷,當時我就是衝著這個要求考了研,後來卻沒有去做游戲開發,主要原因是游戲開發主要用的是C++,並且主要的崗位要求是客戶端方向的技術,比如圖形學、引擎技術,以及對C++的掌握程度。
當時自認為有一些Java基礎,不願意轉C++,同時也感覺游戲行業大廠太少了,除了騰訊網易就沒有什麼大公司了,職業發展的空間可能也不大。自己雖然愛玩游戲,但是做開發和玩游戲畢竟是兩碼事。當然,近兩年游戲開發的崗位需求其實還是很大的,因為現在做游戲開發的人太少了,導致網易游
戲放寬了研發工程師的標準,只要求211以上即可,所以,想要從事游戲開發的朋友,其實現在進大廠的機會可能比之前更多了。
說完游戲開發,說一說C++ ,C++ 方向和Java一樣主要是做後端的,雖然游戲開發大部分也用的是C++,但是C++ 服務端的需求量確實沒有Java大,加上C++ 的學習難度稍微搞一點,所以我沒有選擇這個方向。
當然,現在做CV等演算法方向的同學都會用到C++ ,所以相對Java來說,C++ 方向選擇崗位的範圍可能也更多一些。不過,正如Java也能做大數據開發一樣,選擇方向並不是選擇語言,比如你做游戲開發或者演算法方向,要學的遠不止C++ ,做大數據方向,Java也只是很小的一部分而已。
除此之外,前端、測試、移動端等方向也有很多機會,這些方向的學習難度可能要稍微簡單那麼一點,所以有很多女生會選擇這些方向,如果你想進大廠卻對自己不是很有信心,那麼這些方向也是很不錯的選擇。
研究生就應該做演算法麽?
再聊聊現在很火的人工智慧、機器學習方向,這個方向說實話最難的地方在於理論知識,也就是機器學習理論、演算法模型、統計學知識等內容。很多人對這個方向趨之若鶩的原因,很大程度上是因為這個方向的薪資高,並且相對工程方向來說,工作強度要低一些。
但是,這麼熱門的方向,競爭有多激烈就不用多說了,大廠的演算法崗簡歷多到數不勝數,你沒有論文、實習經歷或者比賽為你背書,基本上連簡歷篩選都過不去,就算你的簡歷很漂亮,但是很多時候由於崗位需求量不多,只要你不是特別優秀,就可能被安排到研發崗位,這也是我身邊很多同學親身經歷的。再有一點,就是有很多演算法方向的博士畢業生也會和你競爭,這就有點嚇人了,總之,演算法方向還是比研發方向更加有難度的,不管是學習難度、面試難度,還競爭激烈程度,都更加明顯。
很多人覺得讀研就應該做演算法,本科生才做研發,我對此不敢苟同,因為主要還是還看個人實際情況,如果你想進大廠,那麼至少本科的時候就要有很扎實的基礎實力,這對大部分同學來說都是比較困難的,如果你不是名校出身,我覺得進大廠的難度還是比較大的。
很多名校背景的本科生確實可以拿到大廠的研發offer,於是他們會覺得沒必要讀研,但是對於我這種跨專業的人來說,研究生才是我開始的第一步,跟他們沒有什麼可比性,所以對於從零開始的我來說,做研發比演算法要靠譜的多,對於很多要轉行做程式員的人來說,也是一樣的道理,應該選擇更加符合自己實力的崗位方向,不要好高騖遠。
以上內容純屬個人觀點!
我是如何學Java的?
教練,我想學Java!
怎麼學Java,一個簡單的命題,我自己也折騰了好幾年,現在雖不能說是Java高手,但也算是小有所成,至少還不至於搞不懂一些基本概念和技術原理。
從我大三那一年第一次在課堂上聽老師講JAVA課程到現在,也已經快4年的時間了,回顧我的學習歷程,可以說是充滿艱辛的,但又是不斷在進步的,所謂道路是曲折的,前途是光明的,大抵就是這個意思吧。
第一個方法:上課
這裡的上課,一般還是指學校里的課程,不包括培訓班。學校里的Java課程一般都比較簡單,課程內容也不會太多,但對於當初我們這些小白來說,還是很有難度的。
比如講基礎數據類型,int、double、float分別占用幾個位元組,我們壓根不知道為什麼要這麼分,講面向對象、類和介面,更是一臉懵逼。到了期末,大家刷刷題,背背答案,也就這麼過了,誰也沒把這些知識太放在心上。
可能絕大部分人的大學Java課程都是這麼學的,只能當成新手入門,算是為小白打開了新世界的大門。
第二個方法:看視頻
上課和看視頻的差異在於,看視頻是一個自學的過程,你可以自己把握課程進度,配合完成練習。
在我初學Java的階段,我非常喜歡看視頻這種學習方法,很輕鬆,而且不懂的地方可以反覆看,雖然效率不算高,視頻質量也參差不齊,但是對新手來說,是很友好的。
慢慢地,你就會習慣通過看視頻學習,並且找到自己喜歡的課程視頻,嘗試加速播放,配合視頻完成一些練習,不斷地提升自己。
第三個方法:培訓
培訓班和大學上課不一樣,整體的教學速度是很快的,並且更加註重實踐,畢竟都自稱是“速成班”、“包就業”,肯定要保證教學速度,同時儘快培養學員的實踐能力。
我沒有真正上過培訓班,倒是上學期間學校讓我們參加了一周的Android短期培訓,其實和培訓班的上課方式也差不多,老師會做好PPT,然後帶著一起學習,一邊敲代碼一邊講解,還是挺有意思的,一周的時間內我們就已經大概地瞭解了Android的基本控制項和一些編程方法。
第四個方法:看書
都說優秀的程式員總歸是要看書的,書中有顏如玉也有黃金屋,更有程式員最需要學習的一些基礎知識和技術原理。比如作為一個Java工程師,你必須要看過《深入理解JVM虛擬機》否則永遠上不了一個檔次,不瞭解實現原理,卻喜歡直接開始做項目,就如同空中樓閣一樣不可靠。
看書,需要耗費時間,精力,需要你很認真地解讀那些專業名詞的含義,所以閱讀難度往往是一個很高的門檻。但是,讀完的人都知道,必須要硬著頭皮堅持下去,才能得到你要的真知。
第五個方法:看博客
博客,不知道從何時起,變成了技術人最活躍的領地,在博客園、CSDN,或者是掘金,segmentfault等技術社區,都可以看到一些不錯的技術文章,這往往是前人通過看書、實戰後提煉出來的東西。
雖然現在的博客質量也是良莠不齊,但是如果能找到優質的博客,要比你自己去提煉總結輕鬆多了。
有時候看書看不懂,那麼就去看博客吧。
第六個方法:寫博客
我打心底裡佩服那些能寫出優質技術文章的大牛們,他們總是非常準確地提煉出一個個概念,並且加以總結,有的甚至可以把這些枯燥的知識點變成生動的故事或者是漫畫。
這樣的大牛很多,比如劉欣老師,程式員小灰。
寫博客最大的好處,就是可以讓自己對所寫內容學的更透徹,有科學研究表明,把知識教給他人,是讓自己掌握這一知識的最有效方法。
在這方面我自愧不如,只寫過一些粗淺的Java文章,除此之外基本沒有能寫出什麼有深度的技術文章,希望在有幾年技術積累後,我也能和他們一樣寫出優質的文章。
結語:
這些方法的共同特點就是,你需要實踐,不管是書上的、博客上的、自己寫的、參考別人的,最終還是通過實踐來加以鞏固。
選擇適合自己的方法,不跟風,不強求,但請堅持。
更多內容請關註微信公眾號【Java技術江湖】
一位阿裡 Java 工程師的技術小站。作者黃小斜,專註 Java 相關技術:SSM、SpringBoot、MySQL、分散式、中間件、集群、Linux、網路、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!(關註公眾號後回覆”Java“即可領取 Java基礎、進階、項目和架構師等免費學習資料,更有資料庫、分散式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送作者原創的Java學習指南、Java程式員面試指南等乾貨資源)