你們是怎麼自學一門新技術的(僅限編程)?
大致流程,獨特方法尤佳
自從大學畢業之後,我現在學習一門新的編程語言,就是用他來實現一個小javascript。實現完了我覺得基本就會了。
如果是API/Framework就更簡單了,如果文檔寫得跟msdn一樣好的話,那看完文檔也就差不多了,幾乎不用親自上手練,就可以投入實戰了。我看文檔的方法其實也不獨特,就是從about、using、reference每個字都不放過從頭看到尾。前幾年剛來M$RA為了參與一個分散式系統的debugger的項目,需要熟悉Windows API裡面的同步和非同步的部分,哪有那麼多時間給你練啊,就看了三個月的msdn,算下來應該也有幾百頁了吧,然後就直接上了。
謝邀。水平一般,不敢誤人子弟。
大學時候,php, ror等都是老師先學習入門,然後我在旁邊看,用了什麼開發環境,老師怎麼寫項目的,然後自己找個想寫的項目自己做,不懂地就問,ror之前寫了個論壇。主要找本外國人寫的中文書看看。(高中自學C語言,所以感覺沒難度,看一遍怎麼做,回頭再看書補充,不過寫地一般)唯一可以有價值的經驗是工作後,Erlang的學習經歷。
背景: 當時正好在項目進展中,我覺得用C++來完成從時間和反覆變更來說,要把人累死,然後根據最佳實踐的經驗,通過局部功能引入 Erlang,所以可以現學現用,不影響項目,同時可以減少當時項目的風險。第一階段:純學語法。
找了一本Erlang原作者Armstrong的入門書,計劃以1天1-3章節的速度,計劃在1周內看完並使用。看到一半,大體知道了有些章節暫時用不到就跳過了(項目壓力和時間問題),最後大概一周內看完。
第二階段:有壓力階段
但是我1周內看完後,我嚇壞了,書上細節都了解,但是寫Erlang項目不知如何下手。具體來說是:周邊開發工具、Erlang的設計模式經驗、Erlang的程序通常的架構等完全不知道。
還好當時辦公室旁邊的老師也開始看了Erlang,不過他著重看程序結構文章,然後推薦了幾篇(TCP和有限狀態機如何結合使用)文章,我照著做。然後過了幾天知道了構建工具等。感覺上戰場有彈藥和武器了。第三階段:摸索和耗費精力的階段
大概在2-3周後,開始真正寫Erlang的網路程序和伺服器。並且自己有了一套組織程序結構的思路。(現在看來很簡單)
第四階段:無痛苦階段
就是我現在的Eralng工作狀態,形成自己的技巧,比如根據需求構建自己的調試系統,在使用中發現一些高級特性,封裝自己的Erlang功能庫。通過閱讀其他開源項目的代碼,比如RabbitmMQ(Erlang開發的項目)源代碼,繼續提高自己的認識和技巧。
多在微博上關注這方面的牛人,可以知道最新的信息。最後想說地是,上面這個案例中,每個人學習方法不一樣,我算傳統的,一般學習語言可以直接過一遍書,能上手。那個老師可以更粗地過一遍,收集了不少周邊相關的文章來學習,最後通過項目需要的知識再翻書了解。所以,最終還是學用相結合,反覆提升。就是每個人都不太一樣。
帶過其他的學生學習,貌似彷徨和心裡沒底等內心想法促使了對學習編程的恐懼,進而影響了學習的進展。多鼓勵多樹立榜樣,一群人一起學,可以減少這方面的痛苦。(單純的讓學生0基礎自學,速度很慢,特別是沒有其他編程經驗,或者思維有偏差的,要有一個學習步驟的路徑和節點比較好,一般有其他編程經驗的人,自己會腦補)
如果工作了,就不需要這些了,項目和現實逼迫,絕對比讀書的時候,更加效率。我沒有什麼特別的技巧,就是找到一個合適的例子.
然後嘗試看明白.對著敲一個差不多的,更符合自己想法的例子.注意:1,對著敲,不是複製,粘貼,或者直接修改.因為這樣,在敲的過程中,你會注意到很多沒有看到的細節問題.
也會讓你更明白,這個/類程序的框架,結構,流程是什麼樣的.這對你開始寫自己的程序,是很有幫助的.2,嘗試編譯它.必然會有很多錯誤,這些錯誤都是因為你沒有注意引起的.修改這些錯誤,才算學習到了.如此往複,時間充足,自己又不是很熟悉的話,就多弄些例子.
時間比較緊張,或者自己比較有經驗,這個過程,可以縮短.其實這種方法的核心,就是勤奮和細心.遙想自己六年前,使用C語言,進行OpenCV編程的時候,就是這樣把幾乎一本書的例子,敲一遍的.現代語言,表達式結構基本相似,掃一眼語言的類型(強弱類型,大小寫敏感,面向之類的)然後看一下類的定義方法,函數定義方法,內存管理方式,以及看起來很炫的新(Zhuang)特(Bi)性(Dian),然後就可以上了……註:須有合適的文檔
從實踐入手。
我院培養學生的模式就是給你一個活,干吧少年。比如我之前做的一個代碼生成的項目。
我C++不太會啊怎麼辦?自學!我都沒聽說XSD怎麼辦?自學!我ARM體系結構不懂怎麼辦?自學!我沒解析過PDF啊怎麼辦?自學!我沒寫過詞法/語法解析器怎麼辦?自學!好不容易代碼寫完了發現Makefile我都不會寫怎麼辦?自學!學校教學從來都不是傳授某項技術,而是傳授思想和方法,偶爾會附帶一些技術。比如大一的程序設計基礎課一般會講C語言。我們院長一開始就十分鄙視那種為了學習某種技術/語言而去學習的做法。所以我們也不怎麼教。
但是實踐中總會遇到各種技術需要學習掌握,比如本科時候各種專業課的大作業,學編譯原理的時候要Hack OpenJDK,學資料庫原理的時候要Hack 開源資料庫(忘了名字了),學軟體工程要自己實現一個類似三國殺一樣的Online Flash Game。很多技術都不會,但作業不做會掛的……
從大四開始參與實驗室各種苦逼項目,遇到具體的技術或者新語言老師才不管你,自己搞定啊。有時候連個請教的師兄都沒有——人沒做過類似的東西不會很正常。
這種實踐驅動的好處在於你對技術的體會直觀而深刻,投入立即就有反饋。而且對技術的理解會隨著你的實踐的深入而深入。從只會實現Google到的小Demo到成為實驗室小範圍的「領域專家」,這個過程有點類似軟體開發的快速迭代。
當然,這種方法也有缺點。主要有兩點,第一是很可能淺嘗輒止。當我只學了一部分或者只學到一個淺顯的程度就能完成我的需求了,通常為了項目的進行我沒空去繼續學習。也因此實踐入手最合適的學習任務就是入門,不要期待做一個項目就能把一項技術完全掌握,也因此雖然我做過很多東西用到很多技術也沒法說我是真正的專家——對自己要有清醒的認識。第二則是有可能某些技術在使用時學習了,過了很久沒用到又會忘掉,畢竟初學的東西不反覆很難內化的。
不管怎麼樣,我還是認為這種以實踐驅動的學習方法最適合編程這個領域。- 入門階段:以教學視頻為主,可以較直觀的快速了解新語言,也可以學到一些常用小技巧。
- 進階階段:以書籍為主,重點了解該語言的獨有語法結構,這時候看視頻就顯得浪費時間了。
- 提高階段:以API文檔為主,配合看網上大牛的博文進行學習,對不懂的問題要深入鑽研。
學新編程語言: 一本語言官方推薦圖書 + 社區+ 設計一個日常使用的項目 + 官方文檔
多想想玩遊戲的過程,一直感覺玩遊戲才是最好的學習過程。
想好學這個能幹什麼,身邊是否有人學過能否交流一些(找不到就上網找社區,找不到社區就別學了)想個有用的日常使用項目,分解為多個小項目一邊完成小項目,一邊查看官方文檔如果有基礎的話,基本各個編程語言差異不大,不懂查文檔夠了。
如果比較難完成項目,就查看文檔的快速入門部分跟著敲一趟。學習新技術,感覺實實在在的用才是最重要的。學習了好多門語言,都是為了應付不同的開發場合需求。為了完成自己的項目會集中精力去思考,當項目完成時也是你已經入門了。先對著敲,然後多寫例子,最後深入的閱讀。
隨便找點入門書來看一下語法介面。剩下的就是無盡的實踐了吧。等哪一天發現自己寫的,做的雖然比較熟悉但是又醜陋無比的時候。搞一本進階的書來看一下。這時候你覺得整個人都升華了。然後又是無盡的實踐,但是目測很難改掉。。。如此痛苦一段時間,會不會有蛻變...
僅供參考
1、搭建開發環境,先參照各種入門教程完成一個「Hello World」的demo程序。
2、查資料,了解一下這門語言或者技術的適用場景,在實際開發中解決了什麼問題或者優化了哪方面的技術。
3、學習基礎語法,還是參照各種入門教程,並且用筆記的形式進行歸納整理,推薦印象筆記或者有道筆記,根據自己的能力和時間來決定筆記的詳略程度。
4、敲代碼,最好的學習方法就是實踐,如果能以模塊或者類庫的形式去完成某一個功能更好,比如PHP中的圖片上傳功能等等。
5、與別人交流,跟同事溝通,逛逛各種技術論壇,去提問或者嘗試著解答別人的問題,看看比較好的博客
6、提高,找一本關於這門語言或者技術中經典的書來讀,看看高手寫的源代碼,寫寫注釋加深理解
推薦閱讀:
※極樂技術周報(第十七期)
※分散式計算框架MapReduce
※YouTube 上有哪些自學編程的優質頻道
※編程的一些小習慣