新手程序員一般會走入一個誤區,就是認爲學習了一門語言,就能夠稱爲是某某語言工程師了。但事實上真的是這樣嗎?其實並不是如此。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裏常常提到的一些集合類是幹嗎的呢,由於在現實生活中有不少場景,須要用到集合類,好比說一個用戶名列表,你要怎麼存呢?
你會用一個 List 來作對不對,因此集合類的做用就是讓你在編程中更好的存儲數據。
事實上,集合類的概念最先是來源於數據結構的,由於計算機裏有不少特殊的數據存儲結構,好比文件樹,好比鏈表和數組等結構,所以計算機理論把這些存儲數據的模型抽象成一些常見的結構,統稱爲數據結構。
那麼,Java 中的併發編程又是作什麼的呢,Java 中的多線程是爲了更好地利用電腦中的CPU核心,經過併發編程,就能夠提升程序併發的效率。
可是併發編程的背後須要操做系統的支持,以及計算機硬件的支持,因此,若是你要徹底地理解多線程,毫不僅僅是理解 Java 裏的 Thread 或者是線程池就足夠了,你還須要去理解操做系統,以及計算機組成原理。
和併發編程相似,Java 裏也有網絡編程的概念,Java 裏的網絡編程和其餘語言大同小異,其實也是基於 TCP/IP 協議實現的一套 API,經過網絡編程,你就能夠在程序中把你想傳輸的數據傳輸到網絡的另外一端,有了網絡編程和併發編程以後,Java 程序員的能量已經很大了
講完這幾點以後接下來再談談,咱們一般說的 Java 後端技術究竟是什麼,就拿支付寶來舉例吧,曾經的支付寶用戶數並很少,一臺服務器,一個數據庫就能夠支持全部的業務了。
當支付寶的用戶愈來愈多的時候,一臺服務器沒法同時知足海量用戶的需求,因而開始出現了多臺服務器,多臺服務器組成了一個集羣,用戶能夠經過負載均衡的方式訪問這些服務器,每一個用戶可能會訪問到不一樣的機器上,這樣子就達到了分流的效果,服務器的壓力就會減少。
因爲數據庫須要保證數據的可靠性,萬一某一臺數據庫掛了,而且沒有備份的話,那麼這個數據就沒法訪問了,這在大型系統中是不容許出現的,因而乎,就有了數據庫的主從部署。
但事實上,隨着業務發展,數據庫的壓力也愈來愈大,主備部署並不能解決數據庫訪問性能的問題,因而乎咱們須要進行分庫分表,在數據庫主備的基礎上,咱們會把一個數據量很大的表拆成多個表,而且把數據庫請求分流到不一樣的數據上,好比說100個分庫,100個分表,就至關於把一個數據表劃分紅10000個數據表。
此時又出現一個問題,若是一個數據庫有多個備庫,而且當主庫掛掉的時候須要進行主從切換時,主備數據庫之間的數據就可能發生不一致,而這也是分佈式理論研究的問題之一,由於比較複雜,咱們這裏就略過不講。
剛纔說到了分佈式技術,其實負載均衡、分庫分表都是分佈式技術的一種實現,若是你不想作分庫分表,那還有什麼辦法可以減輕數據庫訪問的壓力呢?因而緩存就出現了,緩存可讓服務器先把請求打到緩存上,因爲緩存的數據通常在內存中,因此訪問速度會很是快,這些請求無需通過數據庫。
隨着業務發展,緩存的單點壓力也會比較大,因而乎分佈式緩存就出現了,一般來講,緩存難以保證數據的可靠性,由於它們的數據可能會丟失,同時緩存只能存儲一部分的數據,並不能解決全部問題。
因此當某些業務的請求量很是大的時候,光靠緩存也解決不了問題,此時咱們還能夠經過消息隊列來幫咱們解決大流量併發請求的問題。
咱們能夠經過消息隊列來存儲一部分的請求消息,而後根據咱們服務器處理請求的能力,把消息再逐步取出來,接着去把這些消息逐漸地進行處理,這樣就能夠很好的解決高併發的問題。固然,前提是消息隊列要保證消息存儲的可靠性,這也是大部分消息隊列都會保證的能力。
一口氣講了這麼多,算是把 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課程到如今,也已經快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程序員面試指南等乾貨資源)