用十年的時間學會編程

最近難得有閒暇,抽點時間和大家分享一些心得和感受,希望能夠一些在迷茫中的同學帶來一點幫助。


為什麼拒絕速成


這是我的第一篇閒聊文章,我寫的自然也是我最想寫的內容,我想我要說的大家通過標題應該就能get到了。實際上這句話的前半句並不是我說的,它來源於一篇著名的英文文章: "Teach Yourself Programming in Ten Years",即用十年的時間自學編程。原作者是Google的技術總監Peter Norvig,大家感興趣可以讀下這篇文章,雖然是英文的,但也不難懂。


在看這篇文章之前,我以為只有中國才到處都是21天精通XXX的書籍,後來發現美國也是一樣。甚至時間更短,還有書叫做如何在7天內學會Java的。

用十年的時間學會編程

在我畢業之前,我也看過買過一些這樣的書。當時看覺得還可以,雖然有些過度吹噓,但是還是有些內容的。又過了一段時間,發現這些書裡面好些書的名字雖然不同,作者也不一樣,但是講的內容大同小異,或者是有時候去網上搜索某個關鍵詞,中文的內容搜出來幾乎千篇一律。我試著看過一些,不客氣的說許多是copy and paste,或者關鍵點一筆帶過,顯然發佈者既非原創也沒有自己的思考。在我開始寫TechFlow之後,收到了好幾個出版社的出書邀請,再結合之前的經歷,我醒悟了一個道理。


在計算機專業領域,國內優秀的原創內容真的是太少了。我想這一點出版社的從業者應該體會非常深刻。


領悟了這點之後,我拒絕了這些出版社的請求,原因也很簡單,我覺得自己實力目前還不夠,不想給這個已經很亂的市場添亂。而落在學習上,我開始放棄國內的資料,轉而選擇一些

國外的頂級出版社,比如機械工業出版社OREILLy等出版的圖書。有些英文看不太明白的就找中文版,兩相對比,我感覺學習的質量和速度都提升了很多。看了一段時間,再看市面上許多暢銷的技術書,就很難做到不嫌棄了。倒不是所有書都不行,而是優秀的書太少了,挑選的成本太高


除了書之外,市面上還有各種各樣號稱可以速成的教程,往往分享者會有一個很好的頭銜,再配上一張半身照,大神的光芒閃閃發光,彷彿在說你付錢就會變強。不僅如此,還有各種培訓班的宣傳廣告裡寫著,你只要來我這裡上課,就能去BAT,拿著兩萬多的月薪,從此走向人生巔峰。

用十年的時間學會編程

我之前也在朋友圈吐槽過,為了一個無良公眾號分享的資源,我加了一個資源分享者的微信。沒想到此人在給我分享了一堆看起來唬人,但實際並沒有什麼乾貨的資料之後,向我宣傳起了一個培訓班。我看了一下海報,寫著主講人是阿里巴巴高級專家,能夠保證可以找到25K以上的工作,並且該培訓班異常火爆,已經報名超過了好幾百人,馬上就要截止了。


作為在阿里呆過的人當然不會相信,這裡的門道其實並不高深,網上隨便查下就可以知道,阿里巴巴高級專家一年收入幾百萬上下,而教一個學生才收三千,那麼他一年要收多少學生才能賺回工資?就算真的招到了幾百人,又怎麼保證教學質量,還能一對一地指導呢?


舉這些例子除了說明這些內容多不靠譜之外,更想說明一點,現在的市場和人都太浮躁了

,總想著快速,走捷徑。我現在覺得效率或有高低,但捷徑並不存在。疫情期間,中國和其他各國的應對,其實就是一個很好的例子。


巴菲特曾說過他理財的方法非常簡單,但是常人大多做不到,因為他們無法忍受用幾十年的時間慢慢變富,人們似乎也無法忍受慢慢變強,總想一蹴而就。然而世上沒有可以速成的偉大人物,即使工程師不是那麼偉大,但一個合格並且優秀的工程師也是需要長久的時間培養的。我們應該銘記這點,遠離這些讓人浮躁,或者是鼓吹浮躁的東西。


如果你真的想要學好編程或者是別的什麼技術,想要在某個領域做出成績,請做好付出幾年艱苦努力的準備。我個人認為這是一切的基礎,因為不論我們採取什麼樣的學習方法,運用什麼樣的學習資料,有著什麼樣的學習資源,持續數年的努力都是必不可少的。


我們應該怎麼樣學習


選擇合適的內容

那麼我們應該怎麼樣來學習技術相關的內容呢?這一點其實仁者見仁,有些人喜歡用視頻,有些人喜歡看書。但我個人比較傾向於看書,原因無他,因為效率高。從理論上分析,人類閱讀的速度遠高於說話的速度,再加上語言表述的問題,會導致看書的效率比看視頻高得多。


舉個簡單的例子,比如某一堂公開課的總時長是20個小時,我們按照一天看45分鐘算,需要差不多一個月才可以看完。這還只是看視頻的時間,還沒包含練習和思考以及總結,如果再考慮遺忘以及不理解的地方,折算下來這20個小時收益非常有限。當然世事無絕對,也有一些高質量的視頻內容以及講課大牛,可以做到簡單的幾句讓人茅塞頓開的效果。但是要做到這點,一來需要講課人實力超群,二來需要聽課的人自身已經有了一定的積累。我個人認為可以先看書,帶著疑問再去看大牛的視頻找答案

效果可能更好。


我看過的視頻教程不多,除了常規的Coursera和MIT公開課等內容,我很難給出更好的推薦。關於書籍的我可以多說一點,其實上文當中已經提到了,我個人比較傾向於國外經典的教材和出版社。國外的出版社喜歡一個系列一個系列地出,比如機械工業出版社出版的書都是黑色封面的大塊頭的書。再比如OREILLY出版社出版的書籍封面往往都是動物,特點比較鮮明,我們通過封面一眼就可以識別。


這個是OREILLY出版社的書:

用十年的時間學會編程

這個是機械工業出版社的書:

用十年的時間學會編程

這些知名的出版社的系列圖書往往質量都很高,基本上專業相關的書都能找到。國內也有一些不錯的出版社,大家在選書籍的時候可以多考慮一些。


學習套路


這節的標題我起的是學習套路而不是學習方法,因為我覺得每個人應該有自己的方法,我這裡只是分享我總結出來的幾個套路。


從基礎開始,循序漸進


我總結出來的第一個套路就是從基礎開始,循序漸進


現在各個領域的知識都是有相關性的,而且關聯性都很強,也就是說涉及到的知識往往是相對分散的。但我們學習的目的往往都是明確的。比如我想要以後成為算法工程師,或者是我想要學機器學習。那如果我們直接衝著我們的目標去,比如我就一股腦地去學機器學習,會發生什麼?


我之前就這麼做過,最大的感受有兩點,第一點是

經常遇到想不通的問題,第二點是經常有不知道的巨難的背景知識。比如當時我學SVM的時候,碰到了拉格朗日對偶以及KTT條件等內容,直接給我整蒙了。即使我花了很多精力,搞清楚了這些東西究竟是什麼,它的每一步都是怎麼推導的,但是我還是覺得一知半解,因為這個東西是我記住的,而不是我理解的。理解不了的原因是因為我沒有更底層的知識做支撐。


同樣的道理,如果一個沒學過數據結構的同學直接上手去學決策樹、隨機森林肯定也會懵逼。因為缺失了太多數據結構的知識,我們當然可以學習的時候查漏補缺,但是如果只是缺了一點,可以這麼幹,但是缺的多了就不行了。就好像冰山理論,即使我們把水上浮著的冰山啃透了,還有水下更多看不到的部分。


因此第一個套路就是一定要循序漸進,先把基礎打好再去學之後的內容。比如之前我在寫線性代數專題的時候把線性代數的書又看了一遍,加上寫文章加深了一些印象,現在看各種paper上的公式和推導都得心應手了很多。其實很多人並非不知道這點,只是還是因為圖快的心理在作祟,總想著迅速搞定,花費最小的代價。但

其實並沒有什麼最小的代價,不怕付出代價才是真的最小代價。


相反如果基礎紮實了,後面學習的速度會越來越快,因為你的理解能力提升了,學習的效率也會提高。這也是為什麼大牛越來越牛,後面的人越努力覺得差得越遠的原因,因為大牛的知識體系太完善了,他們理解新的知識的能力和速度遠遠超過其他人。這也是為什麼大學裡面大一大二成績出色的學生到了大三往往可以很輕鬆也獲得好成績的原因,除了他們已經養成了良好的習慣以外,也是因為他們的學習效率更高的原因。


勤於動手,從簡單開始


第二個套路是勤於動手,從簡單開始


和其他知識相比,編程能力是一個很大的概念,

既包含很多知識,又蘊含很多實踐技能。所以想要成為一個優秀的程序員並不是一件簡單的事情。不論是什麼領域的學習,如果只專注理論都會免不了紙上得來終覺淺的感覺,而且最後落到實際的工作或者是能力上,一定是以實踐能力體現的。所以動手能力非常重要,不能指望說先理論學習出成果之後再開始實踐。


一開始的時候總會覺得很困難,想要抗拒或者是逃避。這是非常正常的,針對這個問題有幾個要點,首先是從簡單開始。有些人會想積累了一定知識儲備之後再開始動手,實際上這樣做的幫助並不大。即使理論學得周全,實踐的時候依然會有很多問題。所以我們可以快速學習快速實踐,學一點實踐印證一點。我們實踐的目標越小,也就越容易,我們心裡的抗拒也就越小。


所以不要覺得我寫一個hello world或者是for loop太簡單了不屑於動手,做簡單的事情並不丟人,也不浪費時間。這也是為後面進階打好基礎。


做你需要墊腳尖才能夠到的事情


第三個套路是做你需要墊腳尖才能夠到的事情提升最快。


這個套路我聽過很多次,第一次聽是當初直接引導我開始acm之旅的學長分享給我的,第二次是在公眾號裡看到輪子哥的自述。我學長可能名頭比輪子哥差點,但也是曾經在acm中一個人出戰(一個隊伍3人)單挑銀牌,在世界級的線下編程競賽中拿過冠軍的世界級選手,兩個大牛的觀點完全相同,顯然不是巧合,所以這個道理顯然是非常珍貴的。


如果說把學習比喻成拿到一個一個的罐頭,我們站在地上拿桌上的罐頭總是簡單的,但是桌上的罐頭很小,我們拿了收益並不高。櫥櫃上的罐頭要大很多,但是它們放得高比較難拿。想要直接拿很高的罐頭也是可以的,比如可以跳起來拿。但是很有可能拿不穩,導致罐頭摔了,收益還是不大。最好的結果是我們拿那些雖然夠不到,但是踮起腳來勉強能夠摸到的罐頭。


也就是說,我們在學習的時候,應該挑那些剛好超出我們能力範圍,但是又不是太難的點下手,這樣突破舒適區提升自己的效率最高。


深挖細節,多思考


最後一個套路是深挖細節,多思考


這個套路是我自己總結出來的,目前沒有在其他人的博客上看到過。很多時候我們的學習非常籠統,舉個例子,比如我們學邏輯迴歸,就搞清楚邏輯迴歸,損失函數,梯度下降法,再多一點就是推導一下公式就結束了。書本上或者是大牛博客裡寫的也就是這些,但是有沒有想過,為什麼邏輯迴歸的損失函數不能用均方差而必須用交叉熵呢?


如果你想過這個問題,並且試著去追尋答案的話,你會發現原來是因為均方差用在sigmoid函數上在接近於0或者1的位置的梯度非常小,會導致迭代非常慢。那為什麼交叉熵不會慢呢?你會去繼續思考交叉熵的原理,去推導交叉熵的公式,帶入實際的值計算。通過對比,直觀地感受兩者的差距。


再比如你看到書上說樸素貝葉斯不太容易陷入過擬合,因此在一些正例稀疏的場景下廣泛使用。不仔細看一眼瞥過去就過去了,但是如果深入去想,又會發現許多許多問題。為什麼貝葉斯模型不容易過擬合呢?什麼樣的模型不容易過擬合,什麼樣的容易過擬合呢?為什麼不容易過擬合就使用正例稀疏的場景呢?什麼場景是典型的正例稀疏的場景呢?


你看,簡單的一句描述,深挖下去有許多許多的細節。在學習的時候,多思考不放過這些細節,你會發現你對原理的掌握和學習的能力都得到了提升。更重要的是你會完整地編織知識體系結構,並且對你自己的心態也會有非常正面的影響。


靜心與理智


最後說一點也是最重要的,就是靜心和理智


這一點其實我在知乎的回答裡分享過,我個人認為不僅是工程師也是每一個奮鬥努力的人最需要的品質,就是靜心或者是理智,下面我舉個例子仔細說說。


我想只要是工程師應該沒有人沒有遇到過bug或者是疑難問題,從前我遇到問題的時候總是容易煩躁,但發現越煩躁越不能解決。經常請教了別人,或者是自己冷靜下來一看,其實只是一個很簡單的小問題,只是自己的煩躁放大了它。後來我從一個大佬的分享當中獲得了一個技巧,我們可以經常試著站在第三方的視角也就是上帝視角來審視當下的自己。我試著幾次,真的有了蠻多感受,尤其是當我遇到問題的時候。


我發現我會覺得煩躁是兩個原因,一個是因為覺得問題出現得違反直覺,第二個原因是因為它遲遲不能解決。我覺得前者似乎是人的本能,人類討厭所有違反直覺的事物,而第二點則更多和我的性格有關。從本質上來說,我們把問題或者是bug看成了是一個不應該出現的東西。但其實,世界的本質就是運轉不完美的,黑天鵝總會出現,程序中的bug和系統裡的出乎意料的事情也是無可避免的,這是再厲害或者是再智慧的人也無法解決的,就好像物理當中的系統誤差一樣。


不管你如何覺得如何感受,它就在那裡。


當我們站在客觀的角度來看,我們寫了一段程序會出問題是正常的,能符合預期運行完美才是意外的。所以我們要做的第一件事就是轉換心態,做好迎接問題和解決問題的準備,而不是期待問題本身不出現。這是克服本能的方法,針對性格也有辦法,就是靜心。我其實一直以來都是一個急性子,從小就習慣風風火火的做事情,不管做什麼都想第一時間獲得成效,所以debug的時候尤其痛苦。如果一個bug持續一天也沒有找出原因,簡直像是要了我的半條命,絕對會讓我食不知味,睡不安寢。


直到有一天我突然意識到,我為什麼要這麼著急地做事情?我為什麼要儘快地找到bug,它究竟能改變什麼?我為什麼總是期望種下的種子立即會收穫?其實事情本身並不緊急,也沒有人拿著刀架在我的脖子上,只是我在著急。


慧能和尚說不是幡動,不是風動,仁者心動。


學習也好,debug也罷,我們著急上火也許是我們潛意識認為這些惱人的事情一開始就不應該出現。在我們的設想當中,我們學習一門技術就應該只需要7天,我們寫的代碼就是不會有bug,我們就是可以輕輕鬆鬆就走上人生巔峰。顯然,這些想法都是幻覺。我們都知道真實的世界是殘酷的,從零開始入門就是會很難,成長和進步必然伴隨著陣痛。剛開始寫代碼就是會很吃力,總是看得明白寫不出來。持續的努力就是痛苦的,成功的道路就是艱難的,遇到的所有困難和挫折都是常態,進步就是緩慢的不直觀的,所有讓我們煩躁和不安的事情,都是現實。


我們的急躁和抗拒,也許本質邏輯是我們不願意接受殘酷的現實,還殘留著一些不切實際的幻想。正因為這樣,我們的每次著急,都是內心的主觀意願在和這個世界的客觀規律抗爭。


我們都知道,這個抗爭是毫無意義的。黑天鵝總會出現,寫的程序bug總是難免,著急又有什麼用呢?出現問題了就分析問題解決問題,學習的時候按部就班,聚沙總能成塔,集腋必然成裘,我們和我們期待中的自己,就是差了幾年時間的努力,從當下開始,之後總會到達,既然路程已經確定,又何必著急呢?


種一棵樹最好的時間是十年前,其次是現在。既然今天我們種下種子,總有綠樹成蔭的那天。何況十年之後我們也還依然年輕,你覺得呢?


分享到:


相關文章: