超硬核的Java工程師分享,什麼是Java?爲何我要作Java,我是如何學習Java的?

Java是啥

新手程序員一般會走入一個誤區,就是認爲學習了一門語言,就能夠稱爲是某某語言工程師了。但事實上真的是這樣嗎?其實並不是如此。php

今天咱們就來聊一聊,Java 開發工程師到底開發的是什麼東西。準確點來講,Java後端到底在作什麼?前端

基礎

你們都知道 Java 是一門後端語言,後端指的就是服務端,服務端代碼通常運行在服務器上,一般咱們運行Java 程序的服務器都是 Linux 服務器。程序員

這些服務器在互聯網公司中通常放在一個叫作機房的地方里,因而像咱們這類 Java 程序員的代碼通常也運行在這些機房裏的服務器中。web

Java 裏有一個概念叫作虛擬機,你能夠把它理解爲一個安卓的模擬器,好比你在電腦上裝了一個安卓模擬器,就能夠經過它來運行安卓應用程序,好比裝個 APP,手機遊戲什麼的。面試

因此當你在電腦上安裝了一個叫作 JDK 的東西時,電腦裏就有了 JRE 也就是 Java 運行環境,有了這個運行環境,你就能夠運行 Java 應用程序了。算法

知道 Java 程序如何運行在計算機上以後,咱們再來說一講平時學的一些 Java 基礎知識,它們到底有什麼用?數據庫

其實平時這一些 Java 基礎語法都僅僅是你寫代碼的一些基礎知識,就至關於英語中的 26 個字母,常見的有基本類型變量、for 循環、if else 等等基本語法,掌握了這些基礎知識以後,你就能夠上手寫一些很簡單的代碼了。編程

除此以外,Java 還有一些比較特別的概念,好比面向對象的特性,其中有類、接口等概念。爲何 Java 要引入這些東西呢,其實就是想讓使用者更好地進行設計、抽象和編程。segmentfault

對於新手來講,你不須要理解得特別的深入,由於這些東西只有你在你真正寫代碼以後才能逐步去理解。後端

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程序員面試指南等乾貨資源)

超硬核的Java工程師分享,什麼是Java?爲何我要作Java,我是如何學習Java的?超硬核的Java工程師分享,什麼是Java?爲何我要作Java,我是如何學習Java的?

相關文章
相關標籤/搜索