- 相關(guān)推薦
如何學(xué)好Java語(yǔ)言編程
決定好想學(xué)什么編程語(yǔ)言了嗎,現(xiàn)在就讓我們開始學(xué)習(xí)吧。所有你需要做的就是打開一本書,然后開始閱讀,是這樣的嗎?不全是這樣的。
learn-first
我會(huì)給出學(xué)習(xí)第一門編程語(yǔ)言的理想方法布局,你不僅應(yīng)該學(xué)習(xí)這個(gè)布局方法,還應(yīng)該享受精通它——如果不能掌握的話。
學(xué)習(xí)第一門編程語(yǔ)言或許是學(xué)習(xí)編程最困難的事情,但并非一定會(huì)這樣。
大多數(shù)程序員——包括我自己 ——通過(guò)閱讀一本書嘗試做一些東西出來(lái),遇到挫折難題,然后再重讀并繼續(xù)嘗試的事情,直到終于可以按預(yù)期工作。
我將與大家分享的東西來(lái)自于教導(dǎo)和訓(xùn)練軟件開發(fā)人員學(xué)習(xí)第一門編程語(yǔ)言和提高語(yǔ)言技能的經(jīng)驗(yàn)。我也加進(jìn)去了我自己學(xué)習(xí)語(yǔ)言,如C++,C#和Java的經(jīng)驗(yàn)。
基本上,在這篇文章中,我將展示給你我做的一些事情——我現(xiàn)在了解的東西——如果我是你,并且現(xiàn)在要去學(xué)習(xí)第一門編程語(yǔ)言的話。
從看一個(gè)正在工作的應(yīng)用程序開始
大多數(shù)程序員,當(dāng)他們想學(xué)習(xí)編程的時(shí)候,往往是從一本書開始。
雖然有一些優(yōu)秀的書籍會(huì)手把手地教你編程,但我認(rèn)為最佳的開始是查看一個(gè)能實(shí)際工作的應(yīng)用程序的源代碼,然后試著盡可能多地找出正在發(fā)生的事情。這很難。
它會(huì)讓人覺(jué)得不舒服,但是不要畏懼。要習(xí)慣這種不舒服的感覺(jué)。這是讓人成長(zhǎng)的唯一路徑。
learn-first-01
我想要你做的是選擇一個(gè)開源應(yīng)用程序——最好是流行的,才有可能被精心設(shè)計(jì)——然后瀏覽它的源代碼。你可以在GitHub上找到大量項(xiàng)目,因此我建議你去那里尋找。
并且,你最好可以下載這些代碼,自己構(gòu)建并運(yùn)行這個(gè)應(yīng)用程序——雖然這樣說(shuō)的話超出了這本書的范圍。如果你有一個(gè)朋友可以幫助你做這些事情,那就更棒了。當(dāng)然沒(méi)有,也沒(méi)有關(guān)系。
重要的是,你要去探索代碼,從而了解編程語(yǔ)言的語(yǔ)法看起來(lái)是什么感覺(jué),并試著閱讀代碼看看你能否理解或弄清楚意思。
使用應(yīng)用程序本身,如果可能的話,這樣你才能夠感覺(jué)到代碼和代碼作用之間的關(guān)系。
就像我說(shuō)的,這讓人感到很不舒服。你可能會(huì)覺(jué)得你看不懂任何東西。
再說(shuō)一遍,那沒(méi)關(guān)系。你只需要竭盡全力看看你能夠搞清楚一兩件事是如何工作的,或在代碼中你可以做哪些變動(dòng)以便于用某種方式改變功能。
此外,大致了解代碼如何命名以及如何被組織的。就像你是一個(gè)考古學(xué)家試圖了解一些古文明的著作一樣。這樣的開始可以讓你比大多數(shù)不知道將要學(xué)習(xí)的編程語(yǔ)言是什么樣的程序員要更有目的性。
在沒(méi)有開始旅程之前先大致了解當(dāng)?shù)厍闆r總歸是好的。編程沒(méi)什么不同。
找一些好的資源或書籍,大致看一遍
要想在啟航之前,更進(jìn)一步地了解當(dāng)?shù)厍闆r,接下來(lái)要做的并不是反復(fù)閱讀編程書籍,而是挑選一些其他資源——如視頻,文章,或教程——大致看一遍。同樣的,這又讓人覺(jué)得有些不舒服,因?yàn)楹芏嗄憧吹降膬?nèi)容你并不明白它是什么意思。
但是……你需要涉足這個(gè)領(lǐng)域。你只要能夠差不多了解這個(gè)東西到底有多大,你要學(xué)習(xí)的是什么以及常見(jiàn)概念是什么就可以了。
這些前提工作在你大概明白要學(xué)習(xí)什么類型的東西以及概念是如何建立在彼此之上的時(shí)候,會(huì)收到效果。
learn-first-02
了解如何創(chuàng)建“Hello World”
好的,關(guān)于這一點(diǎn)你依然不用“閱讀”或上手編程。
以后會(huì)讓你做到想吐的——如果你想的話。(不遵循這些步驟,實(shí)際上你也能學(xué)習(xí)編程語(yǔ)言。)
此時(shí)你要做的是盡可能地創(chuàng)建最基本的程序,無(wú)論你學(xué)習(xí)的是什么編程語(yǔ)言。
還記得我們談到過(guò)的“如何開發(fā)技術(shù)技能”嗎?這正是此處的目標(biāo)。你想要盡快開始,這樣你就有足夠的信心和知識(shí)學(xué)以致用。
你所要開始的一個(gè)非常基本的程序叫“Hello World”。大多數(shù)編程書籍一開始都會(huì)讓你去創(chuàng)建一個(gè)“Hello World”程序,這通常指的是輸出“Hello World”到屏幕上。
這可能并不需要太多關(guān)于編程語(yǔ)言的知識(shí),但是需要熟悉并測(cè)試用來(lái)構(gòu)建和運(yùn)行程序所需的基本工具鏈。
如果你正在閱讀有關(guān)編程語(yǔ)言的書,那么書中應(yīng)該包含一個(gè)“Hello World”程序便于你創(chuàng)建。
如果沒(méi)有,那就谷歌搜索“Hello World +你的編程語(yǔ)言”。馬上就能找到例子。通過(guò)創(chuàng)建“Hello World”程序,你還可以學(xué)到該編程語(yǔ)言程序的基本結(jié)構(gòu)。
學(xué)習(xí)基本構(gòu)造,并用真正的問(wèn)題測(cè)試
如果你使用相應(yīng)的書籍或某種形式的教程學(xué)習(xí)編程語(yǔ)言,那么現(xiàn)在你可以通過(guò)它們來(lái)學(xué)習(xí)了。
此時(shí),你會(huì)覺(jué)得正在閱讀的書或上的課程并沒(méi)有你剛開始認(rèn)為的那么神秘。
現(xiàn)在你要做的是熟悉所學(xué)編程語(yǔ)言的每個(gè)基本結(jié)構(gòu),然后使用這些構(gòu)造編寫一些代碼。
你需要盡可能實(shí)際地嘗試和思考將所學(xué)的東西與問(wèn)題和應(yīng)用程序聯(lián)系起來(lái),當(dāng)你將技能應(yīng)用到實(shí)際問(wèn)題的時(shí)候,這樣才能更好地理解和記住這些知識(shí)。
learn-first-03
下面是大多數(shù)編程語(yǔ)言所包含的一些基本結(jié)構(gòu):
能夠輸出到屏幕上
基本的數(shù)學(xué)能力
作為一個(gè)變量存儲(chǔ)信息
組織代碼成函數(shù),方法,或模塊
調(diào)用函數(shù)或方法
布爾邏輯評(píng)估的性能
分支條件語(yǔ)句(if / else)
循環(huán)語(yǔ)句
下面是一些好消息。
一旦你了解這些基本結(jié)構(gòu)并知道如何使用它們,你就具備了語(yǔ)言的基礎(chǔ)知識(shí)。是的,語(yǔ)法可能不同,但這是編程的核心。你可能會(huì)花費(fèi)大量時(shí)間在這個(gè)階段。
用你自己的方式去做,一次一個(gè)地去學(xué)習(xí)編程語(yǔ)言的結(jié)構(gòu),并通過(guò)實(shí)際編寫一些代碼來(lái)應(yīng)用每個(gè)結(jié)構(gòu)。如果你采取的是自己的方式,那么你需要確定結(jié)構(gòu)是什么以及學(xué)習(xí)的順序。
如果你正在閱讀書籍或?qū)W習(xí)教程(最好是多本書籍和多個(gè)教程),那么具體路徑應(yīng)該已經(jīng)呈現(xiàn)在你眼前,甚至有一些例子和挑戰(zhàn)任務(wù)。盡量確保明白你正在學(xué)習(xí)的內(nèi)容以及如何應(yīng)用它們。
現(xiàn)在可以回去看看你第一步看的源代碼了,看看你能明白多少。
知道語(yǔ)言功能和庫(kù)之間的區(qū)別
經(jīng)常絆倒初級(jí)程序員的一件事——尤其是今天的編程語(yǔ)言——是知道語(yǔ)言的部分是什么,以及語(yǔ)言自帶的標(biāo)準(zhǔn)庫(kù)的部分是什么。
通常情況下,區(qū)別不是很清楚,因?yàn),?xí)慣上看,你會(huì)非常頻繁地使用標(biāo)準(zhǔn)庫(kù)編寫代碼。
沒(méi)關(guān)系。你需要了解所學(xué)編程語(yǔ)言的編程約定,但你應(yīng)該特別小心地去嘗試并指出實(shí)際語(yǔ)言部分以及常用于語(yǔ)言的庫(kù)的部分。
這似乎有點(diǎn)雞蛋里面挑骨頭,但我認(rèn)為這很重要,因?yàn)樗梢詳]順此刻在你腦中雜亂無(wú)章一塌糊涂的語(yǔ)法,并幫助你更有意義地分類和組織。
你會(huì)明白,對(duì)于大多數(shù)編程語(yǔ)言,語(yǔ)言的實(shí)際部分本身并不是很大,并且比較容易學(xué),但標(biāo)準(zhǔn)庫(kù)很大,用你的方式了解它們相對(duì)而言要困難得多。
現(xiàn)在的編程,比起說(shuō)是做語(yǔ)言絕對(duì)的專家,更多的是關(guān)于知道如何使用庫(kù)和框架。這就是為什么這種區(qū)別顯得重要的原因之一。
通過(guò)認(rèn)識(shí)到哪些并非語(yǔ)言的一部分,而是庫(kù)的一部分,并了解如何查找?guī)靵?lái)完成相應(yīng)語(yǔ)言中的常見(jiàn)任務(wù),你會(huì)成為一個(gè)更好的程序員。
審查現(xiàn)有代碼,理解每一行代碼的意思
此時(shí),你應(yīng)該已經(jīng)熟悉所有所學(xué)編程語(yǔ)言的主要概念,并在實(shí)際例子中用過(guò)大多數(shù)編程語(yǔ)言功能。
learn-first-04
你對(duì)語(yǔ)言本身和與語(yǔ)言結(jié)合使用的庫(kù)之間的差異也有了深入了解。但你對(duì)編程語(yǔ)言可能仍然覺(jué)得沒(méi)有那么舒服,或者你實(shí)際上還不懂。
這是一個(gè)你感覺(jué)自己可以理解所有一切是如何工作的階段,但卻不知道如何把它們放在一起,寫出一個(gè)真正的應(yīng)用程序。許多初級(jí)程序員往往會(huì)因此而停留在這個(gè)階段,感到沮喪,覺(jué)得他們永遠(yuǎn)成不了一個(gè)真正的程序員。
脫離這個(gè)困境并確保在知識(shí)上不會(huì)有欠缺的最好方法之一是,查看現(xiàn)有的代碼,一行一行地,確保你能準(zhǔn)確理解每一行和每一個(gè)聲明在代碼中是做什么用的。(即使你有時(shí)不知道原因,知道具體的過(guò)程依然是一種進(jìn)步。)
這里的現(xiàn)有代碼可以用你在第一步時(shí)看的項(xiàng)目的源代碼里面隨機(jī)的項(xiàng)目文件。打開一個(gè)文件并仔細(xì)檢查文件中的每一行代碼,確保你知道它到底是做什么的。
如果你不明白——話說(shuō)會(huì)有很多東西你都不明白——那就花一些時(shí)間思考一下,仔細(xì)查看你不明白的地方。有點(diǎn)乏味。甚至可能是枯燥的,但是值得。
當(dāng)你到達(dá)一個(gè)你覺(jué)得你可以讀懂任意一行代碼并理解它做什么的階段——同樣的,知道為什么在此時(shí)也并沒(méi)有那么重要——說(shuō)明你已經(jīng)做好了繼續(xù)前進(jìn)的準(zhǔn)備。
構(gòu)建東西,構(gòu)建很多東西
現(xiàn)在是時(shí)候真正開始使用編程語(yǔ)言了。
此時(shí),你已經(jīng)能寫一些小程序了,使用大部分的語(yǔ)言特性,但只有真正實(shí)際去構(gòu)建應(yīng)用程序,你才能更深刻地感受編程語(yǔ)言。
learn-first-05
挑幾個(gè)小項(xiàng)目——?jiǎng)e太大——然后構(gòu)建應(yīng)用程序。
不要太雄心勃勃,要知道一口吃不成個(gè)大胖子,所以在這個(gè)階段不要試圖做任何相關(guān)于平臺(tái)或UI密集的東西。最好你的應(yīng)用程序只輸出文本到屏幕上,并暫時(shí)只從鍵盤中接受輸入。
目的是為了建立專注于使用編程語(yǔ)言和標(biāo)準(zhǔn)庫(kù)的簡(jiǎn)單應(yīng)用,不要額外添加針對(duì)于平臺(tái)功能的框架——接下來(lái)會(huì)涉及這方面。
這樣做可以幫助你增加使用編程語(yǔ)言的信心,并了解為了完成目標(biāo)你需要使用什么樣的語(yǔ)言構(gòu)造。
下面是一些幫助你開始的簡(jiǎn)單的項(xiàng)目點(diǎn)子:
創(chuàng)建一個(gè)解決數(shù)學(xué)問(wèn)題的程序,從用戶獲取輸入。
創(chuàng)造一個(gè)可選擇冒險(xiǎn)類型的程序,從用戶輸入來(lái)確定接下來(lái)會(huì)發(fā)生什么。
創(chuàng)建一個(gè)非常簡(jiǎn)單的基于文本的冒險(xiǎn)游戲,用戶可以發(fā)出命令來(lái)拾起對(duì)象,在房間移動(dòng)等。
創(chuàng)建一個(gè)能夠從一個(gè)文本文件中讀取輸入并輸出寫入到不同文本文件的程序。
創(chuàng)建一個(gè)聊天機(jī)器人,能和用戶交流,假裝是人或給出幽默的回復(fù)。
應(yīng)用編程語(yǔ)言到特定技術(shù)或平臺(tái)
到了這個(gè)時(shí)候,你主要學(xué)習(xí)了關(guān)于在封閉條件下如何使用編程語(yǔ)言。
這是有意的,因?yàn)槟阈枰谠黾迎h(huán)境和用于構(gòu)建真正應(yīng)用程序所需框架這些額外的復(fù)雜性之前,了解并熟悉編程語(yǔ)言本身和它的標(biāo)準(zhǔn)庫(kù)。
為了用編程語(yǔ)言創(chuàng)造一些有用的東西,你需要應(yīng)用語(yǔ)言到特定的技術(shù)或平臺(tái)。
所以,這個(gè)時(shí)候,你需要確定幾個(gè)可以完成的需要在特定平臺(tái)上使用編程語(yǔ)言的小項(xiàng)目。
舉個(gè)例子,假設(shè)你正在學(xué)習(xí)Java。到現(xiàn)在為止,你會(huì)編寫Java代碼,代碼可工作在任意Java可運(yùn)行的平臺(tái)上,因?yàn)槟愦蠖鄶?shù)時(shí)間會(huì)使用標(biāo)準(zhǔn)庫(kù),并且只會(huì)輸入和輸出到屏幕或文件。
此時(shí),你可能會(huì)決定使用Java來(lái)構(gòu)建一個(gè)Android應(yīng)用程序。你需要學(xué)習(xí)如何構(gòu)建Android應(yīng)用程序以及有關(guān)Android框架的知識(shí)。 但是,由于你已經(jīng)熟悉Java,所以就沒(méi)有必要一次性學(xué)習(xí)大量的東西。
當(dāng)然,你可以一起學(xué)習(xí)Android和Java,事實(shí)上,我做了一個(gè)Pluralsight課程來(lái)教授如何做到這一點(diǎn)——但為了實(shí)際掌握語(yǔ)言并且避免混淆,從平臺(tái)或技術(shù)獨(dú)立語(yǔ)言,然后再結(jié)合它們可能會(huì)容易得多。
現(xiàn)在,你用編程語(yǔ)言來(lái)發(fā)展特定和專業(yè)技能,在找工作時(shí)會(huì)很有用。
選擇任何你想要使用的任何平臺(tái)或技術(shù),用這些平臺(tái)或技術(shù)來(lái)創(chuàng)建一些小的應(yīng)用程序。
我還建議你在這個(gè)時(shí)候最好還是只專注于單個(gè)技術(shù)或平臺(tái)。以后你總能學(xué)到更多。
通過(guò)這種專攻的方式,你不僅可以了解你需要學(xué)習(xí)的東西,還能讓你更深刻地了解知識(shí)和掌握特定技術(shù),而這能讓你更有自信,大大提高你的技能的市場(chǎng)化能力。
解決困難的算法問(wèn)題以便于更好地掌握語(yǔ)言
到現(xiàn)在為止,你對(duì)你所學(xué)的編程語(yǔ)言應(yīng)該感覺(jué)舒服多了。
你已經(jīng)對(duì)它知之甚深,并且已經(jīng)在各種不同的應(yīng)用程序中使用過(guò)了。
你應(yīng)該有了一個(gè)應(yīng)用技能的特定技術(shù)或平臺(tái),并且使用此技術(shù)來(lái)創(chuàng)建基本的應(yīng)用程序感覺(jué)已經(jīng)趁手和舒服多了。
盡管如此,你可能還是不覺(jué)得你掌握了這種編程語(yǔ)言。
不要擔(dān)心;這也是正常的。
learn-first-06
當(dāng)我第一次學(xué)習(xí)C ++的時(shí)候,我記得即使在我知道關(guān)于語(yǔ)言的一切,并且已經(jīng)用這種編程語(yǔ)言實(shí)際創(chuàng)建了多個(gè)應(yīng)用程序,甚至還被聘為一個(gè)編寫C ++代碼的開發(fā)人員的時(shí)候,我仍然不覺(jué)得我真正掌握了這門編程語(yǔ)言。
我覺(jué)得我是一個(gè)很好的C ++程序員,但并非是偉大的。我真的很想提升我的C ++技能,但我不知道怎么辦。然后,我發(fā)現(xiàn)了這個(gè)叫TopCoder的編碼競(jìng)賽網(wǎng)站。
每個(gè)星期,那里都會(huì)有一系列新的編程挑戰(zhàn),你可以和其他的程序員一起比賽著解決一些相當(dāng)困難的算法問(wèn)題。起初我怕極了。我甚至連最簡(jiǎn)單的問(wèn)題也解決不了。
我去看其他人的解決方案,我不知道他們是如何想出這個(gè)解決方案的,也不知道他們的代碼是如何工作的。他們用著一種我萬(wàn)萬(wàn)沒(méi)有想到的方式使用C ++代碼。但后來(lái),隨著時(shí)間的推移,隨著我鍥而不舍地去嘗試解決問(wèn)題,以及看別人是如何解決問(wèn)題的,我漸漸成長(zhǎng)起來(lái)了……一點(diǎn)一點(diǎn),越來(lái)越優(yōu)秀。
我發(fā)現(xiàn)了解決某些類型問(wèn)題的模式。我開始真正了解如何利用我以前忽略了的C ++特性。我學(xué)會(huì)了如何高效地使用標(biāo)準(zhǔn)庫(kù)和語(yǔ)言功能以及數(shù)據(jù)結(jié)構(gòu)來(lái)解決復(fù)雜的問(wèn)題。我變得不僅擅長(zhǎng)于C+ +,而且非常出色。我終于覺(jué)得自己貌似掌握了這門編程語(yǔ)言。這就是我要你做的。
你不必去TopCoder參與競(jìng)爭(zhēng),有很多你可以練習(xí)解決算法類型編程問(wèn)題的地方。
對(duì)于這類問(wèn)題,我已經(jīng)提到了一個(gè)很好的資源,還有一些是:
這些問(wèn)題一開始你解決起來(lái)會(huì)覺(jué)得極其困難,沒(méi)有關(guān)系。本來(lái)就是這樣的。
你會(huì)發(fā)現(xiàn),隨著時(shí)間的推移,你會(huì)開始認(rèn)識(shí)到,只有屈指可數(shù)的一些問(wèn)題類型,并且你能立馬指出如何解決這些問(wèn)題。
起初,你毫無(wú)頭緒,不知道該做什么,就像我說(shuō)的,沒(méi)關(guān)系——只要繼續(xù)努力即可。
另外,不要忘了去看看其他人是如何解決這些讓你疲于應(yīng)對(duì)的問(wèn)題的。嘗試著去理解為什么他們要用這樣的方式去解決特定的問(wèn)題。
這是我用于學(xué)習(xí)如何解決這類問(wèn)題的最佳途徑之一。
我會(huì)看看TopCoder上頂級(jí)程序員的解決方案,從中我學(xué)到了很多東西。
一旦你可以用你所學(xué)的編程語(yǔ)言解決這些類型的編程問(wèn)題,那么你不僅相當(dāng)接近于掌握語(yǔ)言,而且通過(guò)編碼面試將會(huì)成為一件輕而易舉的事情,因?yàn)槠渌暮蜻x人碰到問(wèn)題只能汗流浹背,自愧不如。
即使是寫一本書也一個(gè)相當(dāng)大的事業(yè),我很高興能踏上這個(gè)旅程。
我希望你能和我在這條道路上一起前行。
【如何學(xué)好Java語(yǔ)言編程】相關(guān)文章:
如何學(xué)好java語(yǔ)言07-27
如何學(xué)好C語(yǔ)言編程01-26
Java零基礎(chǔ)如何學(xué)好Java語(yǔ)言04-05
Java編程語(yǔ)言02-10
java編程語(yǔ)言分析07-11
Java語(yǔ)言編程簡(jiǎn)介03-04