如何學好Java語言編程

決定好想學什麼編程語言了嗎,現在就讓我們開始學習吧。所有你需要做的就是打開一本書,然後開始閱讀,是這樣的嗎?不全是這樣的。

如何學好Java語言編程

  learn-first

我會給出學習第一門編程語言的理想方法佈局,你不僅應該學習這個佈局方法,還應該享受精通它——如果不能掌握的話。

學習第一門編程語言或許是學習編程最困難的事情,但並非一定會這樣。

大多數程序員——包括我自己 ——通過閱讀一本書嘗試做一些東西出來,遇到挫折難題,然後再重讀並繼續嘗試的事情,直到終於可以按預期工作。

我將與大家分享的東西來自於教導和訓練軟件開發人員學習第一門編程語言和提高語言技能的經驗。我也加進去了我自己學習語言,如C++,C#和Java的經驗。

基本上,在這篇文章中,我將展示給你我做的一些事情——我現在瞭解的東西——如果我是你,並且現在要去學習第一門編程語言的話。

從看一個正在工作的應用程序開始

大多數程序員,當他們想學習編程的時候,往往是從一本書開始。

雖然有一些優秀的書籍會手把手地教你編程,但我認爲最佳的開始是查看一個能實際工作的應用程序的源代碼,然後試着儘可能多地找出正在發生的事情。這很難。

它會讓人覺得不舒服,但是不要畏懼。要習慣這種不舒服的感覺。這是讓人成長的唯一路徑。

  learn-first-01

我想要你做的是選擇一個開源應用程序——最好是流行的,纔有可能被精心設計——然後瀏覽它的源代碼。你可以在GitHub上找到大量項目,因此我建議你去那裏尋找。

並且,你最好可以下載這些代碼,自己構建並運行這個應用程序——雖然這樣說的話超出了這本書的範圍。如果你有一個朋友可以幫助你做這些事情,那就更棒了。當然沒有,也沒有關係。

重要的是,你要去探索代碼,從而瞭解編程語言的語法看起來是什麼感覺,並試着閱讀代碼看看你能否理解或弄清楚意思。

使用應用程序本身,如果可能的話,這樣你才能夠感覺到代碼和代碼作用之間的關係。

就像我說的,這讓人感到很不舒服。你可能會覺得你看不懂任何東西。

再說一遍,那沒關係。你只需要竭盡全力看看你能夠搞清楚一兩件事是如何工作的,或在代碼中你可以做哪些變動以便於用某種方式改變功能。

此外,大致瞭解代碼如何命名以及如何被組織的。就像你是一個考古學家試圖瞭解一些古文明的著作一樣。這樣的開始可以讓你比大多數不知道將要學習的編程語言是什麼樣的程序員要更有目的性。

在沒有開始旅程之前先大致瞭解當地情況總歸是好的。編程沒什麼不同。

找一些好的資源或書籍,大致看一遍

要想在啓航之前,更進一步地瞭解當地情況,接下來要做的並不是反覆閱讀編程書籍,而是挑選一些其他資源——如視頻,文章,或教程——大致看一遍。同樣的,這又讓人覺得有些不舒服,因爲很多你看到的內容你並不明白它是什麼意思。

但是……你需要涉足這個領域。你只要能夠差不多瞭解這個東西到底有多大,你要學習的是什麼以及常見概念是什麼就可以了。

這些前提工作在你大概明白要學習什麼類型的東西以及概念是如何建立在彼此之上的時候,會收到效果。

  learn-first-02

  瞭解如何創建“Hello World”

好的,關於這一點你依然不用“閱讀”或上手編程。

以後會讓你做到想吐的——如果你想的話。(不遵循這些步驟,實際上你也能學習編程語言。)

此時你要做的是儘可能地創建最基本的程序,無論你學習的是什麼編程語言。

還記得我們談到過的“如何開發技術技能”嗎?這正是此處的目標。你想要儘快開始,這樣你就有足夠的信心和知識學以致用。

你所要開始的一個非常基本的程序叫“Hello World”。大多數編程書籍一開始都會讓你去創建一個“Hello World”程序,這通常指的是輸出“Hello World”到屏幕上。

這可能並不需要太多關於編程語言的知識,但是需要熟悉並測試用來構建和運行程序所需的基本工具鏈。

如果你正在閱讀有關編程語言的書,那麼書中應該包含一個“Hello World”程序便於你創建。

如果沒有,那就谷歌搜索“Hello World +你的編程語言”。馬上就能找到例子。通過創建“Hello World”程序,你還可以學到該編程語言程序的基本結構。

學習基本構造,並用真正的問題測試

如果你使用相應的書籍或某種形式的教程學習編程語言,那麼現在你可以通過它們來學習了。

此時,你會覺得正在閱讀的書或上的課程並沒有你剛開始認爲的那麼神祕。

現在你要做的是熟悉所學編程語言的每個基本結構,然後使用這些構造編寫一些代碼。

你需要儘可能實際地嘗試和思考將所學的東西與問題和應用程序聯繫起來,當你將技能應用到實際問題的時候,這樣才能更好地理解和記住這些知識。

  learn-first-03

  下面是大多數編程語言所包含的一些基本結構:

能夠輸出到屏幕上

基本的數學能力

作爲一個變量存儲信息

組織代碼成函數,方法,或模塊

調用函數或方法

布爾邏輯評估的性能

分支條件語句(if / else)

循環語句

下面是一些好消息。

一旦你瞭解這些基本結構並知道如何使用它們,你就具備了語言的基礎知識。是的,語法可能不同,但這是編程的核心。你可能會花費大量時間在這個階段。

用你自己的方式去做,一次一個地去學習編程語言的結構,並通過實際編寫一些代碼來應用每個結構。如果你採取的是自己的方式,那麼你需要確定結構是什麼以及學習的順序。

如果你正在閱讀書籍或學習教程(最好是多本書籍和多個教程),那麼具體路徑應該已經呈現在你眼前,甚至有一些例子和挑戰任務。儘量確保明白你正在學習的內容以及如何應用它們。

現在可以回去看看你第一步看的源代碼了,看看你能明白多少。

  知道語言功能和庫之間的區別

經常絆倒初級程序員的一件事——尤其是今天的編程語言——是知道語言的部分是什麼,以及語言自帶的標準庫的部分是什麼。

通常情況下,區別不是很清楚,因爲,習慣上看,你會非常頻繁地使用標準庫編寫代碼。

沒關係。你需要了解所學編程語言的編程約定,但你應該特別小心地去嘗試並指出實際語言部分以及常用於語言的庫的部分。

這似乎有點雞蛋裏面挑骨頭,但我認爲這很重要,因爲它可以擼順此刻在你腦中雜亂無章一塌糊塗的語法,並幫助你更有意義地分類和組織。

你會明白,對於大多數編程語言,語言的實際部分本身並不是很大,並且比較容易學,但標準庫很大,用你的方式瞭解它們相對而言要困難得多。

現在的編程,比起說是做語言絕對的專家,更多的是關於知道如何使用庫和框架。這就是爲什麼這種區別顯得重要的原因之一。

通過認識到哪些並非語言的一部分,而是庫的一部分,並瞭解如何查找庫來完成相應語言中的常見任務,你會成爲一個更好的程序員。

審查現有代碼,理解每一行代碼的意思

此時,你應該已經熟悉所有所學編程語言的主要概念,並在實際例子中用過大多數編程語言功能。

  learn-first-04

你對語言本身和與語言結合使用的庫之間的差異也有了深入瞭解。但你對編程語言可能仍然覺得沒有那麼舒服,或者你實際上還不懂。

這是一個你感覺自己可以理解所有一切是如何工作的階段,但卻不知道如何把它們放在一起,寫出一個真正的應用程序。許多初級程序員往往會因此而停留在這個階段,感到沮喪,覺得他們永遠成不了一個真正的程序員。

脫離這個困境並確保在知識上不會有欠缺的最好方法之一是,查看現有的代碼,一行一行地,確保你能準確理解每一行和每一個聲明在代碼中是做什麼用的。(即使你有時不知道原因,知道具體的過程依然是一種進步。)

這裏的現有代碼可以用你在第一步時看的'項目的源代碼裏面隨機的項目文件。打開一個文件並仔細檢查文件中的每一行代碼,確保你知道它到底是做什麼的。

如果你不明白——話說會有很多東西你都不明白——那就花一些時間思考一下,仔細查看你不明白的地方。有點乏味。甚至可能是枯燥的,但是值得。

當你到達一個你覺得你可以讀懂任意一行代碼並理解它做什麼的階段——同樣的,知道爲什麼在此時也並沒有那麼重要——說明你已經做好了繼續前進的準備。

構建東西,構建很多東西

現在是時候真正開始使用編程語言了。

此時,你已經能寫一些小程序了,使用大部分的語言特性,但只有真正實際去構建應用程序,你才能更深刻地感受編程語言。

  learn-first-05

挑幾個小項目——別太大——然後構建應用程序。

不要太雄心勃勃,要知道一口吃不成個大胖子,所以在這個階段不要試圖做任何相關於平臺或UI密集的東西。最好你的應用程序只輸出文本到屏幕上,並暫時只從鍵盤中接受輸入。

目的是爲了建立專注於使用編程語言和標準庫的簡單應用,不要額外添加針對於平臺功能的框架——接下來會涉及這方面。

這樣做可以幫助你增加使用編程語言的信心,並瞭解爲了完成目標你需要使用什麼樣的語言構造。

下面是一些幫助你開始的簡單的項目點子:

創建一個解決數學問題的程序,從用戶獲取輸入。

創造一個可選擇冒險類型的程序,從用戶輸入來確定接下來會發生什麼。

創建一個非常簡單的基於文本的冒險遊戲,用戶可以發出命令來拾起對象,在房間移動等。

創建一個能夠從一個文本文件中讀取輸入並輸出寫入到不同文本文件的程序。

創建一個聊天機器人,能和用戶交流,假裝是人或給出幽默的回覆。

應用編程語言到特定技術或平臺

到了這個時候,你主要學習了關於在封閉條件下如何使用編程語言。

這是有意的,因爲你需要在增加環境和用於構建真正應用程序所需框架這些額外的複雜性之前,瞭解並熟悉編程語言本身和它的標準庫。

爲了用編程語言創造一些有用的東西,你需要應用語言到特定的技術或平臺。

所以,這個時候,你需要確定幾個可以完成的需要在特定平臺上使用編程語言的小項目。

舉個例子,假設你正在學習Java。到現在爲止,你會編寫Java代碼,代碼可工作在任意Java可運行的平臺上,因爲你大多數時間會使用標準庫,並且只會輸入和輸出到屏幕或文件。

此時,你可能會決定使用Java來構建一個Android應用程序。你需要學習如何構建Android應用程序以及有關Android框架的知識。 但是,由於你已經熟悉Java,所以就沒有必要一次性學習大量的東西。

當然,你可以一起學習Android和Java,事實上,我做了一個Pluralsight課程來教授如何做到這一點——但爲了實際掌握語言並且避免混淆,從平臺或技術獨立語言,然後再結合它們可能會容易得多。

現在,你用編程語言來發展特定和專業技能,在找工作時會很有用。

選擇任何你想要使用的任何平臺或技術,用這些平臺或技術來創建一些小的應用程序。

我還建議你在這個時候最好還是隻專注於單個技術或平臺。以後你總能學到更多。

通過這種專攻的方式,你不僅可以瞭解你需要學習的東西,還能讓你更深刻地瞭解知識和掌握特定技術,而這能讓你更有自信,大大提高你的技能的市場化能力。

解決困難的算法問題以便於更好地掌握語言

到現在爲止,你對你所學的編程語言應該感覺舒服多了。

你已經對它知之甚深,並且已經在各種不同的應用程序中使用過了。

你應該有了一個應用技能的特定技術或平臺,並且使用此技術來創建基本的應用程序感覺已經趁手和舒服多了。

儘管如此,你可能還是不覺得你掌握了這種編程語言。

不要擔心;這也是正常的。

  learn-first-06

當我第一次學習C ++的時候,我記得即使在我知道關於語言的一切,並且已經用這種編程語言實際創建了多個應用程序,甚至還被聘爲一個編寫C ++代碼的開發人員的時候,我仍然不覺得我真正掌握了這門編程語言。

我覺得我是一個很好的C ++程序員,但並非是偉大的。我真的很想提升我的C ++技能,但我不知道怎麼辦。然後,我發現了這個叫TopCoder的編碼競賽網站。

每個星期,那裏都會有一系列新的編程挑戰,你可以和其他的程序員一起比賽着解決一些相當困難的算法問題。起初我怕極了。我甚至連最簡單的問題也解決不了。

我去看其他人的解決方案,我不知道他們是如何想出這個解決方案的,也不知道他們的代碼是如何工作的。他們用着一種我萬萬沒有想到的方式使用C ++代碼。但後來,隨着時間的推移,隨着我鍥而不捨地去嘗試解決問題,以及看別人是如何解決問題的,我漸漸成長起來了……一點一點,越來越優秀。

我發現瞭解決某些類型問題的模式。我開始真正瞭解如何利用我以前忽略了的C ++特性。我學會了如何高效地使用標準庫和語言功能以及數據結構來解決複雜的問題。我變得不僅擅長於C+ +,而且非常出色。我終於覺得自己貌似掌握了這門編程語言。這就是我要你做的。

你不必去TopCoder參與競爭,有很多你可以練習解決算法類型編程問題的地方。

對於這類問題,我已經提到了一個很好的資源,還有一些是:

這些問題一開始你解決起來會覺得極其困難,沒有關係。本來就是這樣的。

你會發現,隨着時間的推移,你會開始認識到,只有屈指可數的一些問題類型,並且你能立馬指出如何解決這些問題。

起初,你毫無頭緒,不知道該做什麼,就像我說的,沒關係——只要繼續努力即可。

另外,不要忘了去看看其他人是如何解決這些讓你疲於應對的問題的。嘗試着去理解爲什麼他們要用這樣的方式去解決特定的問題。

這是我用於學習如何解決這類問題的最佳途徑之一。

我會看看TopCoder上頂級程序員的解決方案,從中我學到了很多東西。

一旦你可以用你所學的編程語言解決這些類型的編程問題,那麼你不僅相當接近於掌握語言,而且通過編碼面試將會成爲一件輕而易舉的事情,因爲其他的候選人碰到問題只能汗流浹背,自愧不如。

即使是寫一本書也一個相當大的事業,我很高興能踏上這個旅程。

我希望你能和我在這條道路上一起前行。