文章目錄
- 1. 前言
- 2. 十年自學編程成才
- 2.1 為什么每個人都是匆匆忙忙的?
- 2.2 十年時間學習編程(刻意練習)
- 2.3 程式員成功之路
- 3. 揚帆起航
1. 前言
??我是herosunly,從985院校碩士畢業,現擔任演算法研究員一職,CSDN博客專家,2020年博客之星TOP,曾獲得阿里云天池比賽第一名等Top名次,擁有多項發明專利,對機器學習和深度學習擁有自己獨到的見解,曾經輔導過若干個非計算機專業的學生進入到演算法行業就業,

??最近有幾個初入編程的同學咨詢我如何學好編程,其中和有個同學的對話,讓我對新手學編程有了新的認識,為了幫助更多的同學,特意分享給大家:
- 同學: 學編程是不是特別容易呢?
- 我: 沒有覺得呢,為什么會這么想呢?
- 同學: 網上不是有很多幾小時或者幾天精通編程的課程嗎?
- 我: 資訊不對稱真的是可怕,一時也說不清這個問題,等我過幾天寫篇博客給你看吧,

??之所以不少同學會輕易相信,是不良商家們針對人性的弱點(急于求成)進行巧妙的營銷,那么問題來了,學習編程的正確姿勢是什么呢?是時候拿出我初學編程讀到的經典文章:《十年自學編程成才》,
2. 十年自學編程成才
2.1 為什么每個人都是匆匆忙忙的?
??不管是在書店里,還是在博客網站中,總不免會看到幾個小時學會某門編程語言(C、Java、Ruby等)的書籍或者帖子,如果在亞馬遜中搜索標題為teach yourself hours,書籍發表時間在2000以后,就會找到512本書,大家在學習編程時總是想著急于求成,似乎編程要比其他事情要更簡單,Felleisen等人在《How to Design Programs》一書中表示,他們也深切感受到了這種趨勢,并且表明糟糕的編程習慣是很容易形成的,讓我們分析一下,在24小時內學會C++到底意味著什么呢?
- 在24小時的時間內,是沒有充足的時間完成重大的程式,因為除錯往往比開發要花更多的時間,沒有太多實踐的編程學習,是學不到太多內容的,所以這本書更多的討論的是膚淺的內容,所以無法讓讀者進行深刻的理解,正如Alexander Pope所說,淺嘗輒止往往是一件很危險的事情,
- 在24小時內,可以學完C++的部分語法,但是無法學到如何去實際應用它,簡單地說,如果是一個Basic程式員,在24小時學習之后,他能夠使用Basic風格的C++代碼,但是無法體會到C++的優點,那有什么意義呢?Alan Perlis曾經說過:如果一門編程語言沒有影響開發者的思維方式,那么這門語言就不值得學習,另外一種觀點是說,由于作業需求必須要學習一部分的C++(或者Javascript),只是為了完成既定的作業,那么,這就不是在學習編程,而只是完成任務,
??從個人的經驗來說,如果僅僅想用24個小時學好編程,那肯定是從入門到放棄了,

2.2 十年時間學習編程(刻意練習)
??研究人員Bloom、Bryan和Harter、Hayes、Simmon和Chase表明,要成為任何一個領域的專家,至少需要投入十年的時間,就比如下象棋、編曲、發電報、繪畫、彈鋼琴、游泳、打乒乓球以及科學研究,成功的關鍵在于刻意練習,那什么是刻意練習呢?刻意練習不只是重復的進行練習,更重要的是要對超出自己能力范圍以外的事物進行練習,具體步驟是:勇于嘗試,進行事前和事后分析,并且及時修正錯誤,然后進行不斷地重復,看起來是沒有捷徑的:即使是莫扎特,在四歲時已經是音樂天才,也花費了13年以上的時間才產生了世界級的音樂,在另外一種音樂型別上,1964年披頭士樂隊憑借一連串的熱門單曲和Ed Sullivan的表演一炮走紅,但實際上從1957年開始,他們就在利物浦、漢堡等地的小型俱樂部進行表演,雖然他們很早就表現出了吸引力,但第一個非凡的成功之作Sgt Pepper是在1967年發行的,
??Malcolm Gladwell表明要想在一個領域內取得成功,需要在該領域上投入一萬個小時,而不是跨越十年,Henri Cartier-Bresson則有另外另外一個衡量標準:前10000張照片是最糟糕的(在他的年代里沒有數碼相機,現如今人們一周就可能超過標準),真正的專業知識往往要耗費人的一生:Samuel Johnson說過任何的卓越只能通過一生的努力來實作;少量的努力是絕對無法達到的,And Chaucer則感嘆道:“生命如此短促,學習之路卻是如此之長,”希波克拉底(西方醫學奠基人)的名言是生命短暫,藝術長存,
??當然,沒有哪個數字是準確的答案,假設所有技能(例如編程、下棋、和演奏音樂)都需要花費相同的時間來掌握是并不合理的,不同人掌握同一門技能花費相同的時間也是不合理的,正如K. Anders Ericsson教授所說,“在大多數領域,即使是最有天賦的人也需要花費大量時間才能達到專家級水平,一萬個小時只是給你一個概念,一個天才,如果每周練習10到20個小時的時間,仍然需要數年時間才能達到專家級別的水平,”
??如果大家對刻意練習感興趣,可以再深入閱讀刻意練習一書:

2.3 程式員成功之路
??以下是走向編程成功之路的一些有效方法(拋磚引玉,希望每個同學都能找到最適合自己的方法):
-
要對編程感興趣,就要從中不斷地獲得快樂,保證編程足夠有趣,這樣才能讓你花10年的時間或者10000個小時在上面也不覺得枯燥無味,
-
動手編程,最好的學習方法是邊學邊做,常言道:“人的最高功力并不能通過做一天和尚撞一天鐘這樣的重復經驗獲得,但是,最高的功力可以通過有針對性的日復一日年復一年的訓練來獲得,”并且,“最有效果的學習需要有針對性的任務,這些任務的難度還要因人而異,并且有合理的反饋渠道,并能夠根據這些反饋作出相應的改進,”這些觀點參考自《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》這本書里,
-
和其他的程式員交流;閱讀別人的代碼,這比看書或者參加培訓課程要重要,
-
如果可能的話,建議在大學里系統學習計算機知識(或者再讀個研),這樣更容易獲得作業機會,從而更容易獲得對該領域更加深入的了解,如果有機會,直接去作業也能獲得相同的經驗,無論是什么情況,死讀書肯定是不行的,計算機科學不會讓你成為編程專家,就像學習畫筆和顏料不可能讓你成為畫家一樣,這是Eric Raymond說的,他是New Hacker’s Dictionary字典的作者,很多程式員大佬的學歷并不高,他們依然創造了不少偉大的軟體,
-
和其他的程式員一起參與專案,在專案中努力成為最出色的程式員,在當最出色的程式員的時候,可以嘗試領導專案,用自己的視野來啟發別人,如果你是專案中最差的那個,要學習牛人們在做什么,如果他們不喜歡做的,你要拿來做,
-
接手并推進別人的專案,理解其他人寫的代碼,如果別人有沒有考慮到的問題,你能理解并修復這些問題,思考并設計你的軟體,讓這些軟體容易被他人維護,
-
學習至少6種編程語言,這6種語言中,包括一種支持面向物件的語言(例如Java或者C++),一種支持函式式編程的語言(Lisp, ML或者Haskell),一種支持語意抽象的語言(Lisp),一種支持宣告規范的(Prolog或者C++模板),還有一種支持并發的(Clojure或Go),
-
記住,在“計算機科學”中在“計算機”這個詞語,理解執行一條指令要花多長時間,從記憶體中取一個字(要考慮快取有沒有命中的情況)要多久,從硬碟中連續讀位元組要多久,在硬碟中尋址定位要多久?
-
參加語言的標準化作業,這可能是有關 ANSI C++ 委員會,也可能是縮進的風格是兩格縮進或四格縮進,無論如何,你能從中學到其他人對語言的喜好,也能了解到他們熱愛的程度,甚至也許能知道一點他們為什么他們會這樣認為?
-
知道何時能從標準化語言的作業中脫身,越快越好,
弗雷德·布魯克斯在他的書《沒有銀彈》中給出了三條建議:
- 盡早地系統地識別出頂級設計師
- 每個人給分配一個職業規劃的導師
- 讓成長中的設計師有機會互相切磋武藝
??有一部分人天生就有成為偉大設計師的潛質,然后,能做的最好的事情就是去正確引導他們,艾倫·佩里斯一針見血地說:”假如每個人都可以學會雕刻,那就得教米開朗基羅哪些事不要去做,對于偉大程式員,也是如此,”Perlis認為,偉大的人有一種內在的特質,這種特質往往比接受訓練更重要,但是,這些特質是從哪里來的呢?與生俱來的?還是通過后天勤奮而來的?正如影片片《料理鼠王》里的幻象大廚Auguste Gusteau說的那樣:“誰都能做飯,但只有那些無所畏懼的人才能成為大廚!”個人認為可以把練習的態度轉變成心甘情愿的奉獻,就跟耐心培養自己的孩子一樣,這樣往往就更容易走向成功之路,
3. 揚帆起航
??說了很多了,有沒有比較具體的學習方法呢?那必須安排上啊!咱們就以學習Python為例,首先,我們要正確認識自己的編程水平,先做個簡單的分類,把同學分為沒有完整學過基礎語法以及學過兩個類別,
??首先說下沒有學過基礎語法的同學,其中包含正在學習基礎語法的同學,請在學習程序中保持“愛玩”的心態,可以嘗試將不同的操作進行組合,具體該如何操作呢?,舉幾個栗子,請大家看到例子后思考并實踐驗證,例子如下所示:
- 四則運算的組合:
a = 1
a *+1
- 賦值運算:
b = (a = 1)
- 函式體與區域變數
x = 10
def foo():
print(x)
x += 1
??以上例子皆是拋磚引玉(甚至我們可以在鍵盤上亂打一通,然后猜一下會不會報錯,報錯的話會在哪里報錯),希望大家能在學習語法中自主構建新的例子,從而加深對原有知識的理解,新手可以訂閱系統講解Python學習方法和語法的專欄:Python新手快速入門,
??最后再說下已經學過Python語法的同學,既然已經系統學習過語法了,那就請開始實戰吧,在實戰程序中請記得也是在玩,也不是在做枯燥乏味的練習題,就像玩游戲一樣,學會了基本的操作就開始敞開玩耍吧,那么問題來了,究竟進行什么樣的實戰呢?
??選擇非常之多,可以用Python來創建游戲,例如使用pygame來創建植物大戰僵尸等小游戲;

??可以通過爬蟲完成各種自動化操作,例如CSDN自動點贊與評論、自動收取螞蟻森林能量等,爬蟲適合于絕大多數人,在實戰和學習程序中會對Python、前端、后端都有更加深刻的理解,下圖為每天早上7點15分自動偷取能量的截圖,想要學習爬蟲的同學可以訂閱我的專欄:Python爬蟲實戰教程

??當然,現在如火如荼的機器學習方向也是一個不錯的選擇,但相對來說,門檻要比之前的方向更高一些,想要學習機器學習的同學也可以訂閱我的專欄:機器學習入門之工具篇和AI比賽教程,
??大家在學習中還有什么想法或者疑問的話,也歡迎大家留言交流,一起進步,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286913.html
標籤:其他
