這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這些東西是平時遇到的, 覺得有一定的價值, 所以記錄下來, 以後遇到類似的問題可以查閱, 同時分享出來也能方便需要的人, 轉載請註明來自RingOfTheC[ring.of.the.c@gmail.com]
這幾天看go文檔時看到這麼一段話:
Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs different in character from programs written in its relatives. A straightforward translation of a C++ or Java program into Go is unlikely to produce a satisfactory result—Java programs are written in Java, not Go. On the other hand, thinking about the problem from a Go perspective could produce a successful but quite different program. In other words, to write Go well, it's important to understand its properties and idioms. It's also important to know the established conventions for programming in Go, such as naming, formatting, program construction, and so on, so that programs you write will be easy for other Go programmers to understand.
譯文: Go是一門新語言. 雖然它借鑒了其他很多語言中的特性, 但是編寫一個高效的Go程式及Go語言的編程方式和其他語言是有本質區別的. 如果只是簡單的將C++和Java等代碼翻譯成為Go代碼, 那麼將不可能得到最好的Go代碼. Java程式員使用Java的思維方式, 而不是Go的思維方式. 如果使用Go的思維方式, 那麼一個問題可能有完全不同的解決方案. 因此如果想真正的用好Go語言, 你必須要理解它的語言特性和設計思想. 另外還要知道Go語言的編程風格, 比如命名方式, 格式化, 程式結構組織等, 採用通用的方式也可以便於和其他Go程式員交流.
我覺得這段話不僅適用於Go語言, 而且在學習任何語言的時候都有指導性意義, 它道出了"如何學習一門新語言"的方法. 那就是不要先入為主, 拿著新東西, 硬要去往自己的習慣上套, 當然會發現很難用或者是不適應. 不要認為可以用新語言寫出helloworld或者是echoserver, 就覺得自己懂了. 可以說差的太遠了.
記得剛開始學電腦的時候, 學習的是basic, 然後聽說某人還會c/c++/Pascal, 馬上從內心裡肅然起敬, 覺得這個人太牛了, 太厲害了. 但是隨著學習的學習和深入, 慢慢發現會再多的語言, 不如精通一門, 而且在很多地方你也可以聽到"資料結構和演算法才是根本"這樣的說辭, 的確是這樣, 語言只是工具.
當你解決問題的時候, 你需要合理的描述和組織問題, 語言就是個實現工具, 可能是從小生活在"XX萬歲, 打倒UU"的非友即敵神奇國度中, 我突然間就鄙視起以前的自己來, 這時, 如果誰說會幾門語言, 內心便不由自主的鄙視起人家, 殊不知自己也是從這個時候過來的, 這就叫成長.
但是有句名言說的好: 人類的整個曆史就是在不停的重複同一個錯誤. 在經過一段時間的學習和實踐後, 我的想法又發生了變化, 當然不是說我的演算法和資料結構有好多的意思, 而是說眼界開闊了, 見的東西多了後, 認識問題就能更深, 更客觀. 我又發現, 語言很重要, 並不是一個什麼簡單的實現工具, 什麼樣的語言, 把你帶向這麼樣的方向.
為什麼這麼說呢, 因為不同的語言是發明人當時為瞭解決不同的問題而發明的, 你能學一門語言, 也是因為它在某方面的卓越能力給你提供了價值. 所以你必然會受到來自語言中的對特定問題解決方式的影響, 什麼模式慣用法, 庫, 架構都是在潛移默化的影響你看問題的觀點和方式. 這時你有兩條路可以走:
1. 好好使用這門語言, 並強迫自己去學習更多類型的語言, 開闊自己的思路
2. 當一個語言的忠實教徒, 把自己的思路局限在該語言的發展上
從意願上大家當然願意選一, 但是不一定真能這樣做. 選一的好處就不說了, 不同語言中的世界觀和方法論將極大的豐富你的思維世界, 也就是因為這一點, 我才又一次覺得語言很總要. 有的語言你不學, 你不知道原來問題可以這樣解決, 畢竟, 能有所耳聞的語言都是有其特點的, 這就是一個巨大的財富, 而付出的就只是一些學習成本.
當然, 也可以抱著自己最喜歡語言, 其實這樣做也沒有什麼錯. 因為你來到了一個充滿寶藏的地方, 但是你卻分文不取, 這樣是沒有任何錯誤的, 只是你自己比較吃虧罷了, 我一向的觀點是道理說清楚, 路自己走, 因為畢竟生活是自己的, 別人沒有精力或者義務來勸任何人, 專心挖自己的寶藏, 然後再把自己的經驗寫成傳說吧, 有緣人自然受益.
好了, 我感覺我有點偏題太多了, 只是有感而發, 我其實想說的如何學習一門語言, 我不是什麼高手, 也不是什麼叫獸, 我只能舉一些例子來說明一下, 其中有我熟悉的, 也有不熟悉的.
c/c++/java 未知學習法, 我不知道怎麼學好
lua/js 大愛, table, 表, userdata, C API, 源碼很少, 最好是讀, 這個是有價值的, 包你不後悔, 學完lua, js自通,
GameMonkey 學了lua的情況下可以學習, 協程及其調度, 其他沒什麼, 主要是看源碼, 寫的很清晰的, 看過lua再看它很輕鬆, 注意了GM和lua是兩個放棄搶佔式調度, 選擇共用記憶體的例子.
go channel, goroutine, 記憶體模型.[準備這樣學], go和lua, gm剛好相反, 它放棄共用記憶體, 選擇搶佔式調度.這些都是學習的重點.
就是這些了, 其實歸納就是, 1.學習它有別於其他語言的特點, 2. 要選一門語言從源碼徹底搞定[為了不引起大家的不滿, 我主動注釋: 我指的是小型的動態語言, 1w上下的代碼量, 我認為去讀靜態語言的編譯器沒有益處, 很浪費時間].
我覺得比較遺憾的就是到現在對於函數式編程還是概念性的認知, 這個一定要抽空學習一下了.
當然大家都各有各的學習方法, 沒有萬能的方法, 最重要的還是堅持和追求. 我這篇純粹是談一下自己的體會, 全當拋磚引玉吧.