為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

Java 與其他流行語言有何不同? 為什麼Java應該成為第一個學習語言? 讓我們制定一個計劃,幫助您從頭開始學習 Java,並應用其他語言的程式設計技能。 讓我們列出使用 Java 建立生產程式碼和使用其他語言進行開發之間的差異。 米哈伊爾·扎特皮亞金 (Mikhail Zatepyakin) 在面向未來參與者的會議上宣讀了這份報告 實習 Yandex 和其他初級開發人員 - Java Junior 聚會。


——大家好,我叫米莎。 我是來自 Yandex.Market 的開發人員,今天我將告訴您為什麼學習 Java 以及如何有效地學習。 你可能會問一個合理的問題:為什麼我要講述這個故事,而不是一些擁有多年經驗的強大開發人員? 事實上,我自己最近學習了Java,大約一年半前,所以我仍然記得它是什麼樣的,有什麼陷阱。

一年前,我在 Yandex.Market 獲得了實習機會。 我為 Beru 開發了後端,對於 Market 本身,您可能使用過它。 現在我繼續在那裡工作,在另一個團隊。 我們為業務合作夥伴創建了 Yandex.Market 分析平台。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

讓我們開始吧。 為什麼要從實用的角度來學習Java? 事實上,Java 是一種非常著名的程式語言。 它有一個非常大的社區。

例如有這樣一個TIOBE指數,一個程式語言流行度的流行指數,Java在那裡排名第一。 另外,在招募網站上,你可能會注意到,大部分職缺都是關於Java的,也就是說,透過Java開發,你總是能找到工作。

由於社群非常大,您的任何問題都可以在 Stack Overflow 或其他網站上找到答案。 而且,用 Java 開發時,實際上是在 JVM 上編寫程式碼,因此可以輕鬆切換到 Kotlin、Scala 等使用 JVM 的語言。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

從思想的角度來看Java有什麼好處呢? 有不同的程式語言。 他們解決不同的問題,你知道的。 例如,Python 非常適合編寫一行腳本來解決快速問題。

從好的方面來說,您可以完全控制可執行程式碼。 比如說我們有車,Yandex無人駕駛汽車,他們的程式碼是用pluses寫的。 為什麼? Java有這樣一個東西——垃圾收集器。 它清除 RAM 中不必要的物件。 這個東西自發性地啟動並且確實停止了世界,也就是說,它停止了程式的其餘部分並去計算對象,清除對象的記憶體。 如果這樣的東西在無人機上起作用,那就不酷了。 你的無人機會直線行駛,此時清除記憶,根本不看路。 因此,無人機是寫在優點上的。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

Java解決什麼問題? 它主要是一種用於開發由數十或數百人多年編寫的大型程式的語言。 特別是,Yandex.Market 中的許多後端都是用 Java 寫的。 我們在幾個城市有一個分散式團隊,每個城市有十個人。 而且程式碼很容易維護,已經支援了十年甚至更長時間,同時新人進來並理解這段程式碼。

一種語言應該具備哪些特性,才能讓其中的程式碼容易被支持,才能在大型團隊中輕鬆開發。 首先,它應該是可讀的程式碼,並且應該易於實現複雜的架構解決方案。 也就是說,應該很容易編寫高級抽像等。這一切都是Java為我們提供的。 這是一種物件導向的語言。 實現高階抽象和複雜架構確實很容易。

Java 也有很多框架和函式庫,因為該語言已有 15 多年的歷史了。 在這段時間裡,所有可以寫的東西都寫在上面了,所以有大量的庫可以滿足你可能需要的一切。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

我認為初級JA選手應該具備哪些基本技能? 首先,這是Java核心語言的知識。 接下來是某種依賴注入框架。 下一位發言者基里爾將更全面地討論這一點。 我不會說得太深。 接下來是架構和設計模式。 我們需要能夠編寫架構上漂亮的程式碼才能編寫大型應用程式。 這是某種用於處理資料庫任務的 SQL 或 ORM。 這更適用於後端。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

去! Java 核心。 我不會在這裡真正發現美國——你需要了解語言本身。 你應該注意什麼。 首先Java這幾年發布了很多版本,就是2014-2015年發布了第七個,然後是第八個、第九個、第十個,很多新的版本,裡面引入了很多新的很酷的東西,例如Java Stream API,lambda等。非常酷、新鮮、酷的東西,在生產程式碼中使用,他們在面試中問什麼以及你需要知道哪些。 因此,你不應該從Java-4圖書館書架上拿一本書去學習。 這是我們的計劃:我們學習 Java-8 或更高版本。

我們密切關注 Stream API、var 等創新,它們在面試時被問到,並在生產中不斷使用。 也就是說,Stream API 比循環酷得多,總的來說,是一個非常酷的東西。 一定要注意。

還有各種各樣的東西,像是迭代器、異常等等。 在你看來不重要的事情只要你自己寫一些小程式碼就好了。 你不需要這些例外,誰還需要它們呢? 但面試時一定會被問到,在生產上一定對你有​​用。 一般來說,你應該注意異常、迭代器和其他東西。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

資料結構。 你不能沒有結構,但如果你不只知道有集合、字典和表,那就太好了。 還有結構的不同實作。 例如,Java中同一個字典有多種實現,包括HashMap和TreeMap。 它們具有不同的漸近性,內部結構也不同。 您需要知道它們有何不同以及何時使用哪一種。

如果您知道這些資料結構的內部工作原理,那也會非常酷。 也就是說,要知道它們的漸進性並不容易——下注多少有效,通行多長時間有效,但內部結構如何運作——例如,HashMap 中的桶子是什麼。

樹和圖也值得關注。 這些在生產代碼中不太常見,但在面試中很受歡迎。 因此,您需要能夠在寬度和深度上遍歷樹、圖。 這些都是簡單的演算法。

一旦您開始編寫任何大型、複雜、使用函式庫、多類別程式碼,您就會意識到,如果不建置系統並解決依賴關係,您將很難實現。 這些主要是 Maven 和 Gradle。 它們允許您在一行中將庫匯入到您的專案中。 也就是說,您編寫一行 xml 並將庫匯入到專案中。 偉大的系統。 它們大致相同,使用其中一個 - Maven 或 Gradle。

接下來 - 某種版本控制系統。 我推薦 Git,因為它很受歡迎並且有大量教程。 幾乎每個人都使用 Git,這是一件很酷的事情,沒有它你就活不下去。

以及某種開發環境。 我推薦 IntelliJ Idea。 它大大加快了開發過程,對你有很大幫助,為你編寫了所有樣板程式碼,總的來說,這很酷。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

幻燈片中的連結: SQL動物園, 哈布拉郵政

SQL。 關於後台程式的一些資訊。 這裡其實有個有趣的案例。 第二次實習面試的前兩天,HR女孩打電話給我,說過兩天他們會問我關於SQL和HTTP的問題,我需要學習。 而且我對 SQL 或 HTTP 幾乎一無所知。 我發現了這個很酷的網站 - SQL動物園。 我在 12 小時內學會了 SQL,我的意思是,SQL 語法,如何編寫 SELECT 查詢,JOIN 等。非常酷的網站,我強烈推薦它。 事實上,我在 12 小時內就學會了我現在所知道的 90%。

了解資料庫架構也很棒。 這些是各​​種鍵、索引、規範化。 Habré 上有一系列關於此的文章。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

在Java中,除了SQL之外,還有各種物件關係映射系統,例如JPA。 有一些代碼。 第一種方法中有一些 SQL 程式碼 - SELECT id name FROM info.users WHERE id IN userIds。 從使用者資料庫的表中取得他們的 ID 和名稱。

接下來,有一個特定的映射器將物件從基礎物件轉換為 Java 物件。 下面還有第三種方法實際執行此程式碼。 所有這些都可以使用JPA用一行程式碼來替換,如下所示。 它做同樣的事情 - 查找所有 ByIdIn。 也就是說,它根據方法的名稱為您產生 SQL 查詢。

非常酷的事情。 我自己在不懂SQL的時候就用過JPA。 一般來說,要注意。 如果你懶得學 SQL,那就是一場災難。 而且,總的來說,火!

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

春天。 誰聽過 Spring 框架這樣的東西? 你看看你們有多少人嗎? 並非沒有理由。 Spring 包含在每一個 Java 後端空缺的需求中。 沒有它,大發展就無處可去。 什麼是春天? 首先,這是一個依賴注入框架。 也關於這個 會告訴 下一位發言者。 但簡而言之,這是一個可以讓您更輕鬆地將某些類別的依賴項匯入到其他類別中的東西。 也就是說,依賴關係的知識被簡化了。

Spring Boot 是 Spring 的一部分,它允許您一鍵運行伺服器應用程式。 您轉到 THID,按幾個按鈕,現在您的伺服器應用程式已在 localhost 8080 上啟動並運行。 也就是說,您還沒有編寫一行程式碼,但它已經可以運行了。 非常酷的事情。 如果你自己寫一些東西,那就火吧!

Spring是一個非常大的框架。 它不僅可以獲取您的伺服器應用程式並解決依賴注入。 它允許您做很多事情,包括建立 REST API 方法。 也就是說,您編寫了一些方法並為其附加了 Get 映射註解。 現在您已經在本機上有了一些方法來向您寫入 Hello world。 兩行程式碼就可以了。 很酷的東西。

Spring 也讓編寫測試變得更加容易。 在大型開發中沒有測試是沒有辦法的。 程式碼需要測試。 為此,Java 有一個很酷的庫 JUnit 5。和 JUnit 一樣,但最新版本是第五個。 有用於測試的一切,各種斷言和其他東西。

還有一個很棒的 Mockito 框架。 想像一下您有一些想要測試的功能。 該功能可以執行許多操作,例如,在中間的某個位置,它使用您的 ID 登入 VKontakte,並從 ID 接收 VKontakte 用戶的名字和姓氏。 您可能不會在測試中包含 VKontakte,這很奇怪。 但是你需要測試功能,所以你使用 Mockito 製作了這個類,修改它,模仿它。

您會說,當帶有這樣或那樣的 ID 的請求來到此類時,它會傳回一些姓氏,例如 Vasya Pupkin。 它會起作用的。 也就是說,您將測試一個類別的所有功能。 非常酷的事情。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

來自幻燈片的鏈接

設計模式。 這是什麼? 這些是解決開發中出現的典型問題的範本。 在開發過程中,經常會出現相同或相似的問題,如果能以某種方式很好地解決就好了。 因此,人們提出了解決這些問題的最佳實踐和某些模板。

有一個網站最受歡迎的模式——refactoring.guru,你可以閱讀它,找出有哪些模式,閱讀一堆理論。 問題是它實際上毫無用處。 事實上,沒有實踐的模式並不是特別有用。

您會聽到一些模式,例如 Singletone 或 Builder。 誰聽到了這些話? 很多人。 有一些簡單的模式您可以自己實現。 但大多數模式:策略、工廠、外觀——尚不清楚在哪裡應用它們。

除非您在實踐中看到其他人的程式碼應用了此模式,否則您將無法自行應用它。 因此,練習對於模式來說非常重要。 僅僅在 refactoring.guru 上閱讀這些內容並不是很有幫助,但絕對值得這樣做。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

為什麼需要模式? 假設您有某個使用者類別。 它有一個 ID 和一個名稱。 每個使用者都必須有一個 ID 和一個名稱。 左上角是教室。

初始化User的方法有哪些? 有兩個選項 - 建構函式或設定器。 兩種方法的缺點是什麼?

構造函數。 新用戶(7,「債券」),好的。 現在假設我們沒有 User 類,而是其他一個具有七個數字欄位的類別。 您將有一個包含七個連續數字的建構函式。 目前尚不清楚這些數字是什麼以及其中哪些屬於哪個財產。 設計師並不偉大。

第二個選項是設定器。 你清楚地寫了:setId(7), setName(“Bond”)。 您了解哪個屬性屬於哪個領域。 但二傳手有一個問題。 首先,您可能忘記分配某些內容,其次,您的物件是可變的。 這不是線程安全的,並且會稍微降低程式碼的可讀性。 這就是為什麼人們想出了一個很酷的模式——Builder。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

這是關於什麼的? 讓我們試著將 setter 和建構函式這兩種方法的優點結合在一起。 我們建立一個特定的物件 Builder,它也將具有 Id 和 Name 字段,它本身將基於 setter 構建,並且將具有一個 Build 方法,該方法會傳回一個包含所有參數的新 User。 我們得到一個不可變的物件和一個設定器。 涼爽的!

存在哪些問題? 這裡我們有經典的 Builder。 問題是我們仍然可能忘記檢查某些欄位。 如果我們忘記存取 ID,在這種情況下,在 Builder 中它會被初始化為零,因為 int 類型不可為空。 如果我們將名稱設為「Bond」並且忘記造訪 ID 辦公室,我們將有一個 id 為「0」、名稱為「Bond」的新使用者。 不酷。

讓我們試著對抗這個問題。 在 Builder 中,我們將 int 變更為 int,以便它可以為空。 現在一切都很棒。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

如果我們嘗試建立一個名為「Bond」的 User,卻忘記輸入他的 ID,我們將得到一個空指標異常,因為 ID 不可為空,而 Builder 有一個空指標異常。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

但我們仍然可能忘記輸入名稱,因此我們將物件重播設定為 null。 現在,當我們從 Builder 建立物件時,它會檢查該欄位是否不可為空。 這還不是全部。

讓我們來看最後一個例子。 在這種情況下,如果我們以某種方式將 null 放入 ID 運行時,那麼立即知道您已經這樣做了就太好了,而且現在犯了錯誤並不酷。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

您需要的不是在建立使用者時拋出錯誤,而是在將 ID 設為 null 時拋出錯誤。 因此,在Builder中我們將setter Integer改為int,他會立即發誓他們扔掉了null。

簡而言之,重點是什麼? 有一個簡單的 Builder 模式,但即使它的實作也有一些微妙之處,因此查看模式的不同實作非常酷。 每個模式都有數十種實作。 這一切都非常有趣。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

我們如何在生產程式碼中編寫Builder? 這是我們的用戶。 我們將 Lombok 庫中的 Builder 旋轉附加到它,它本身會為我們產生一個 Builder。 就是我們不寫任何程式碼,但是Java已經認為這個類別有Builder了,我們可以這樣呼叫。

我已經說過,Java 幾乎擁有所有內容的程式庫,包括 Lombok,這是一個很酷的程式庫,可以讓您避免編寫樣板檔案。 生成器,獲取。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

模式可以是架構性的-不僅與一個類別相關,而且與整個系統相關。 系統設計中有一個很酷的原則:單一職責原則。 他在說什麼? 事實上,每個類別都必須負責它自己的一些功能。 在本例中,我們有一個與使用者、JSON 物件通訊的控制器。 Facade 可以將 JSON 物件轉換為 Java 應用程式隨後可以使用的模型。 有一個具有與這些模型一起工作的複雜邏輯的服務。 有一個資料存取物件將這些模型放入資料庫並從資料庫中檢索它們。 還有資料庫本身。 換句話說,並不是所有的內容都在一個類別中,而是我們創造了五個不同的類,這是另一種模式。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

一旦您或多或少學習了 Java,就可以編寫自己的項目,該專案將具有資料庫、與其他 API 一起使用並將您的伺服器應用程式公開給 REST API 用戶端。 這將是一件很棒的事情添加到你的簡歷中,這將是你的教育的一個很酷的結束。 有了這個你就可以去找工作了。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

這是我的伺服器應用程式的範例。 第二年,我和這些人一起寫了一篇學期論文。 他們正在編寫一個用於組織活動的行動應用程式。 在那裡,用戶可以透過 VKontakte 登入、在地圖上放置點、創建活動、邀請朋友參加、保存活動圖像等。

我在專案中做了什麼? 在 Spring Boot 中編寫一個伺服器應用程序,而不使用 SQL。 我不認識他,我用過JPA。 它能做什麼呢? 透過 OAuth-2 登入 VK。 拿著用戶的token,帶著它去VK,檢查它是否是一個真實的用戶。 透過 VKontakte 接收有關用戶的信息。 它能夠透過 JPA 將資訊保存在資料庫中。 熟練地將圖片和其他文件保存在電腦記憶體中,並將它們的連結保存在資料庫中。 當時我不知道資料庫裡有CLOB對象,所以我就這麼做了。 有一個供使用者、客戶端應用程式使用的 REST API。 並且有基本功能的單元測試。

[...] 我成功學習 Java 的一個小例子。 在大學的第一年,我學習了 C# 並了解了 OOP 程式設計 - 什麼是類別、介面、抽像以及為什麼需要它們。 這對我幫助很大。 如果沒有這個,學習Java是相當困難的;不清楚為什麼需要類別。

為什麼學習 Java 以及如何有效地學習 Java。 Yandex 報告

在我大二的時候,他們又教了Java core,但我並沒有就此止步,我自己去學習Spring,寫了一篇課程論文,我的項目,就是我上面提到的。 就這樣,我去 Yandex 實習,通過了面試,進入了 Yandex.Market。 我在那裡為 Beru(這是我們的市場)以及 Yandex.Market 本身編寫了後端。

此後,六個月前,我調到同一市場內的另一個團隊。 我們為業務夥伴進行分析。 我們在分析平台,後端有我們三個人,所以我對專案的影響力非常大。 實際上,這非常有趣。 也就是說,我們實際上為商業夥伴、大型知名公司提供市場上的數據——銷售量是多少、品類是什麼、型號是什麼。 而且只有我們三個人,我們寫了這段程式碼,這非常酷。

謝謝你! 有用的連結:
- 《Java 8. 初學者指南》.
- 數據結構.
- SQL動物園.
- 資料庫規範化.
- 設計模式.
- 設計模式.
- 清潔代碼.
- 有效的Java.

來源: www.habr.com

添加評論