怎么才能有效學好編程和代碼
怎么才能有效學好編程和代碼
無論對于何種計算機編程語言,其核心編程思想都是一樣的。一起來看看怎么才能有效學好編程和代碼吧!以下是學習啦小編分享給大家的學好編程和代碼的方法,希望可以幫到你!
學好編程和代碼的方法
一、多總結(jié)
多總結(jié)才能加深理解、增強記憶。舉例,Go 中有 slice、map、channal 類型,它們都可以用 make 生成實例,但 slice 和 map 還可以用以下形式初始化,也是編程規(guī)范中建議的初始化方式:
colors := map[string]string{}
slice := []int{}
但注意了,channal 則沒有這樣的語法:msg := chan string{}
上面兩句是生成實例,表示空集合,但下面兩句則表示實例不存在,值為 nil
var colors map[string]string
var slice []int
另外,結(jié)構(gòu)體指針 slice 還可以象下面這樣初始化,結(jié)構(gòu)體實例不用明確地指定類型(使用了類型推導)、不用明確地取地址運算(&)。
type Product struct {name stringprice float64}
products := []*Product{{"Spanner", 3.99}, {"Wrench", 2.49}, {"Screwdriver", 1.99}}
看到?jīng)]有,如果不經(jīng)??偨Y(jié),這一圈學下來會把你整的稀里糊涂的。
二、多比較
學一門新語言一定要與你之前已經(jīng)熟悉的語言經(jīng)常作比較,找出它們的相同與不同,這樣才能加深記憶和理解,否則學完之后腦子里會一片混亂,搞不清誰是誰非了。
就拿數(shù)組來說吧,在 Java、Scala、Go 中定義、實例化、賦值是不一樣的。
//Java
int[] arr;//定義數(shù)組,不可以指定數(shù)組長度
arr = new int[5];//創(chuàng)建數(shù)組對象(實例化),指定數(shù)組長度
arr[1] = 8;//賦值
//Scala
val arr = new Array[Int](5) //數(shù)組在Scala里用的是泛型類,構(gòu)造函數(shù)參數(shù)指定數(shù)組大小
arr(1) = 8 //賦值,注意用的是括弧
//Go
arr := [5]int{} //創(chuàng)建數(shù)組,初始化5個元素都為0,注意如果不指定數(shù)組長度,則是另外一種類型Slice
arr[1] = 8 //賦值
再比如 Map 在 Scala 與 Go 語言里定義、初始化、訪問也是不同的,作了以下比較后印象會非常深刻,把它們記下來,這樣以后使用就不會搞混了。
//Scala
val capital = Map("France" -> "Paris", "Japan" -> "Tokyo")
println(capital.get("France"))
//Go
capital := map[string]string{"France": "Paris", "Japan": "Tokyo"}
fmt.Println(capital["France"])
Go 同時給多個變量賦值在 Scala 里可以用模式匹配做到,如下:
//Scala(使用樣本類的模式匹配)
case class Tao(name: String, age: Int);
val Tao(myName, myAge) = Tao("taozs", 18);
println(myName)
println(myAge)
//Go
myName, myAge := "taozs", 18
fmt.Println(myName)
fmt.Println(myAge)
//Scala(使用元組的模式匹配)
val (myNumber, myString) = (123, "abe")println(myNumber)println(myString)//GomyNumber, myString := 123, "abe"fmt.Println(myNumber)fmt.Println(myString)
除了在 Scala 和 Go 里都可以類型推導外,在 Scala 里還可以這樣定義函數(shù):
//Scala
val increase = (_: Int) + 1
為方便自己將來隨時查閱,可以建立下面這樣的對比表格,描述不一定要求規(guī)范,自己能看懂就行。
三、轉(zhuǎn)變思維方式,
學會用這門語言去思考
學會用語言去思考是關(guān)鍵。如果你以前是學 C 的,轉(zhuǎn)學 Java,你一定要改變以前面向過程的思維,學會用面向?qū)ο蟮乃季S去分析問題;以前學 Java 的,轉(zhuǎn)學 Scala 則要學會用函數(shù)式的編程思維解決問題。
舉一個函數(shù)式編程的例子,以下是 Java 語言常用的 for 循環(huán),循環(huán)變量從 1 到 10 執(zhí)行 10 次循環(huán)體:
// 命令式編程for (int i = 1; i < 10; i++) {// 此處是循環(huán)體做10次}
這被稱為命令式編程 (Imperative Programming),但學了 Scala 的函數(shù)式編程 (Functional Programming) 后,解決同樣的問題,我們可以換一種思維:構(gòu)建 1 到 10 的列表序列,針對列表中的每個元素分別執(zhí)行函數(shù),如下:
//函數(shù)式編程
val autoList = (1 to 10).map(i => /*此處是函數(shù)體,針對1到10的每一個分別調(diào)用 1次*/)
已經(jīng)習慣了 Java 編程的,對 Scala 的函數(shù)式編程、樣本類、模式匹配、不可變對象、隱式轉(zhuǎn)換等需要一個逐步適應(yīng)的過程,要漸漸學會用它們思考和解決問題。
再舉個 Scala 與 Go 思維方式不同的例子,要實現(xiàn)對一個字符串里的每個字符加 1 的操作,Scala 里可以這樣:
"abc".map(cc => cc + 1)
"abc"是一個字符串對象,調(diào)用它的方法 map,這是純面向?qū)ο蟮乃季S,但在 Go 里就要轉(zhuǎn)變?yōu)槊嫦蜻^程的思維:
name := "abc"second := strings.Map(func(x rune) rune {return x + 1}, name)
注意,這里的 strings 是包 (package),調(diào)用它的公共函數(shù) Map,被操作的對象 name 字符串作為函數(shù)參數(shù)傳入。Go 提供的函數(shù) len、cap、append、delete 等其實都是面向過程的,雖然 Go 也提供有面向?qū)ο蟮闹С郑呀?jīng)習慣了面向?qū)ο缶幊痰?,剛開始學 Go 語言需要特別留意這一點。
四、多看開源代碼
學一門語言就是學一種思維方式,如今 GitHub 上可下載的開源代碼海量級,通過看別人的代碼,學習別人是如何解決問題的,養(yǎng)成用該語言思考的習慣,另外還能學習到一些非常有用的技巧。
這個意思是指剛進入程序時執(zhí)行 Start( ) 函數(shù),程序退出前調(diào)用 Stop( ) 函數(shù),非常好的技巧啊!可以用于需要在程序執(zhí)行前和程序完成后分別執(zhí)行一段邏輯的場景。再看 Start( ) 函數(shù)是怎么實現(xiàn)的:
func Start(options ...func(*Profile)) interface {Stop()} {...return &prof}
該函數(shù)返回了一個實現(xiàn)了含有 Stop( ) 函數(shù)接口的對象,如此才能在調(diào)用 Start 調(diào)用后連調(diào) Stop。
五、優(yōu)先學會使用代碼分析工具
代碼分析的工具包括靜態(tài)檢查、測試、測試覆蓋率分析、性能分析(內(nèi)存、CPU)、調(diào)試工具等,工具的價值在于它可以有效幫我們發(fā)現(xiàn)代碼問題,這在我們剛開始學一門編程語言時意義尤其重大。
例如,以下這句 Java 賦值語句估計沒有哪本教科書會告訴你有性能問題:
String sb = new String(“Hello World”);
以下這段 Java 代碼你也不一定能意識到有多線程問題:
synchronized public void send(authuserPacket pkt, Thread t, String flowNo) throws IOException
連接不可用,直接拋出異常,等待接收線程連接服務(wù)器成功
如果我們及時用 FindBugs 工具檢查就會發(fā)現(xiàn)上面這些問題,進而你會去分析研究為什么,如此,你對這門語言的了解也會越來越多。
另外,Go 語言自帶的 vet/test/cover/pprof/trace 都是非常有用的工具,一邊學一邊使用這些工具分析代碼,能加深對語言的理解。
六、多練習、多實踐
就象學自然語言一樣,如果只知道語法不去練是沒有任何效果的,只有反復地練習,慢慢才能變成自己的一項技能。書本上的例子代碼最好能從頭到尾親自敲一遍,多運行、多嘗試,另外再找一些題目來練習,如能有機會參與項目開發(fā)則更好啦,勤動手、勤實踐是最好的學習方法。
其它的方法還有:
做好筆記,把學習中遇到的關(guān)鍵點和自己的思考記下來,便于后面復習和對比;
復習,學習一定要重復、重復、再重復;
學習貴在堅持,每天學一點(比如堅持每天學 1 小時),日積月累。
學好編程和代碼的技巧
一、前期階段
前期的學習興趣引導至關(guān)重要,選擇自己感興趣的類型逐漸深入學習。
從嘗試多種不同的學習課程入手,找到最適合自己的學習方式和最讓自己感興趣的項目類型。剛開始你要思維開闊,不要理會那些告訴你應(yīng)該學什么的建議……在這個階段學什么都是一樣的。
選擇一個編程項目,感覺它適合自己就要堅持學下去。完整學習整個入門教程,你會從中學到寫基礎(chǔ)腳本和應(yīng)用需要的所有基礎(chǔ)知識。接著,就要準備好開始創(chuàng)建工程。
二、中期階段
每個人都要經(jīng)歷這個階段,因為成為一名開發(fā)者的唯一途徑就是不斷去開發(fā)。
如何過渡到獨立地創(chuàng)建工程,下面有三個建議:
1、和他人一起工作,哪怕同樣是菜鳥。
你會驚訝地發(fā)現(xiàn),兩雙眼睛更容易調(diào)試出一個不可能的錯誤。
2、閱讀他人的代碼,熟悉好的模式。
盡量理解為什么作者這么做。同樣的道理,不讀書是不會想成為一名小說家的,對吧?現(xiàn)在,請仔細注意其他人對任何小問題或工程提出的解決方案。
3、從小事做起,不斷嘗試。
對于將來,你應(yīng)該想過做一些有趣的大工程,但你也必須適應(yīng)調(diào)試的過程,搜索一些帶有小型挑戰(zhàn)的學習資源。經(jīng)驗是無可替代的。
一旦適應(yīng)了調(diào)試過程,你還需要做好三點:
擁有一個強烈的目標想去實現(xiàn),否則,什么有趣但沒用的東西都學的話,最終不過瞎忙活一場。如果你在學習之外還有充裕的時間,請忽略這一條……
找到一條有效的路徑能直達你設(shè)定的目標,并且要驗證其可行性。你必須深入思考“這個方法到底能不能幫我實現(xiàn)目標?”
專注,避免分心。因為你如果是個對學習編程很有興趣的人,那你肯定也會對所有美妙的事情感興趣。當編程遇到了困難,你需要進一步解決這個問題,而不是另起爐灶。
如果能確定一條路并堅持走下去,你最終一定會進入到下一個階段,而不是花費了數(shù)月或數(shù)年,最終只是徒勞。
三、后期階段
成功的關(guān)鍵所在,注意自身技能的完善和提升。
這個階段是最棘手的過渡階段之一。盡管你能開發(fā)出應(yīng)用程序,但你實際上想成為一名web開發(fā)人員。通過這個階段并找到工作,你需要做三件事情:
1、為編程尋找最佳實踐,并效仿。
你需要理解一個普通方案和最佳方案之間的差別。自己一味悶頭鉆研,遠遠比不上別人在真實工作環(huán)境下寫出的產(chǎn)品級代碼,而最佳實踐樣例很好地體現(xiàn)了這其中的差距。
2、檢驗?zāi)愕募僭O(shè)。
因為你可能回避了一些自己知識體系中的漏洞,甚至你自己都不知道有這些漏洞的存在。你需要檢查并修復這些漏洞。
3、正確對待那些并不吸引人的技能。
盡管它們很少被強調(diào),但是你要過渡到一個專業(yè)環(huán)境,它們還是相當重要的。這些技能包括測試、數(shù)據(jù)建模、架構(gòu)和部署,我們很容易忽略它們,但它們都是優(yōu)秀開發(fā)的基礎(chǔ)。
要做到上面這些并通過最后階段,關(guān)鍵是要不斷獲得他人的反饋。你需要和那些會懷疑你假設(shè)的人們一起學習工作,他們會提出尖銳的后續(xù)問題,并迫使你對自己的知識體系進行查缺補漏。
學好編程和代碼的建議
01、讀>寫代碼>讀>寫代碼(日復一日)
關(guān)于如何高效學習編程我要給出的第一條建議是在閱讀代碼和編寫代碼之間循環(huán)往復。閱讀代碼(書籍,博客文章,開源代碼)將幫助你查看解決方案,了解最佳做法,并大致了解語言或系統(tǒng)。但是在你這樣做之后,你需要自己實際去寫代碼。可以是任何東西。可以是書本編碼練習或業(yè)余項目,但確保你能將之付諸于實踐,并學會總結(jié),歸納你學到的東西。
02、對答案的渴求
人類自然科學的發(fā)展史就是一個渴求得到答案的過程,即使只能知道答案的一小部分也值得我們?nèi)ジ冻?。只要你堅定信念,一定要找到問題的答案,你才會付出精力去探索,即使最后沒有得到答案,在過程中你也會學到很多東西。
03、不要怕陷入僵局,多請求幫忙
推薦三件事情:第一是試著總是閱讀更多關(guān)于你使用的技術(shù),并總體掌握正在發(fā)生什么。通常,當你陷入困境時,意味著你對需要澄清的事情做出了不正確的假設(shè)。第二是咨詢互聯(lián)網(wǎng)。這一點很顯然,但依然值得一提。在網(wǎng)上查找并詢問有過這個問題的人是一個非常重要的技能。我的第三個建議是向你認識的人請求幫助。通常,你或許已經(jīng)理解了技術(shù),而且有了問題,但是你可能需要更高層次的上下文才能真正解開謎團。不要膽怯,大著膽子上前去問吧。
04、以項目促進學習
在我的經(jīng)驗中,沒有什么比做自己的小項目更有學習興趣了,更高效率了。有了一個點子并試圖實現(xiàn)這個點子是非常具有挑戰(zhàn)性的。它需要很強的自律心。但是,通過嘗試實際做一件事情,你可以學到如何分解問題并應(yīng)用技術(shù)。你面對的各種問題,以及你如何解決它們才真正是所謂的編程。此外,想要完成項目的動力是繼續(xù)學習的動力。從項目獲得的滿足感遠遠超過你在抽象中學習東西的滿足感。
05、與其他程序員交談
學習編程的一個很好的方法就是和其他的程序員交談。不必談?wù)撊魏翁囟ǖ膬?nèi)容。可以是你正在學習的東西,可以是你認為很酷的東西,可以是你正在工作的東西,皆可。你會發(fā)現(xiàn)很多程序員并不喜歡只是聊編程。這樣做可能會讓你學到很多關(guān)于庫,服務(wù),編程語言和模式方面的知識。但是,最重要的是,你將了解到其他人是如何看待編程的。你會發(fā)現(xiàn),你認為理所當然或從來沒有考慮的事情在人與人之間是非常不同的。
猜你喜歡:
4.學習編程的方法