關於編程學習的一些思考

關於編程學習的一些思考

來自專欄 Data Analysis

很久以來,我一直都有這樣兩個困惑

  • 統計專業學習編程應該系統學習還是遇到問題再找答案
  • 要不要寫博客?寫博客對自己的編程水平有多大提升?把自己的技術全部分享出去是不是會被超越?

最近我才把這兩個問題徹底想清楚,而且這兩個問題的根源在同一個地方,寫在這裡和大家分享一下。

首先我來回答一下這兩個問題

  • 第一,其實系統學習和現查都是可以的,兩條路徑都可以成為大神,並沒有哪條路徑是捷徑的說法,just do it! (PS:我個人傾向於系統學習)
  • 第二,要寫博客,提升非常大,也不會被超越

為什麼是這個答案呢?因為編程語言掌握的好不好,完全在於你付出的時間多不多,會不會思考總結,而不在於你學習的途徑。只有解決了足夠多的報錯,並進行總結歸納,你對這個編程語言才會有基本的直覺,這個直覺比任何顯式的知識都重要,但卻常常為人所忽略

下面是我的理由。

系統學習還是遇到問題再找答案

我相信這個困惑是比較普遍的

  • 對於主張系統學習的人來說,他們沒有掌握這個用法是不敢直接去做項目的,總會覺得心裡沒底,遇到什麼bug解決不了怎麼辦,所以他們總會在做之前先對這個東西有一個比較系統的認識,我就是這樣。但是這又會帶來一個問題,那就是系統了解要花費大量的時間,而且學過的東西很容易忘記;最重要的是,即使系統學習過,做項目的時候還是會遇到之前沒想過的問題。
  • 對於主張遇到問題再找答案的人來說,他們會遇到找不到答案的情況,當你在毫無了解的情況下,在搜索時有時連該輸入什麼關鍵詞都不知道。還有一種情況是,明明有現成的方法,你卻不知道,自己造輪子還造不出來,陷入絕望中。

兩種人都羨慕對方的優勢,同時又畏懼按照對方那麼做而產生的弊端,於是陷入迷茫。

這時,我們如果能意識到下面這點,就不會有迷茫的感覺了。

要想成為其他人眼中的編程高手,無論走哪一條路,都是行得通的,但是都有兩個前提:要花費大量時間精力、要思考總結。

相信更多的人會主張邊做邊查,所以先說這一點。我見過這樣做成為大神的人,也見過因為這樣而被一個小bug卡住半天的人,他們的區別在哪裡?在編程上花的時間精力不一樣,對編程的興趣不一樣。

  • 大神遇到bug會搞清楚它產生的原因,保證以後不會再犯,每遇到一個bug都積累一次經驗。甚至他們會通過這個問題思考出一些新的問題,完善這方面的知識體系,積土成山。長此以往,他們的知識體系也會非常完整,對待bug有自己的一套解決方案。
  • 而小白則只要能跑出結果不報錯就滿足了,他們甚至不知道結果是不是自己想要的,更不會去深究、擴展這方面的技術細節。編程對他們來說是噩夢,沒有bug就謝天謝地,無論做了多少項目,他們依然是小白(而且他們可能會逃避這種項目,做的也沒有大神多)。

我們可以看到,大神良性循環,小白惡性循環,逐漸走到兩個極端。生活中的編程大神幾乎不會問編程問題,而小白問的問題你只要百度一下就能幫他找到答案了。這是肯不肯思考總結的差別、肯不肯花時間精力的差距。所以只要肯思考總結花精力,邊做邊查的弊端是可以完美解決的。

接下來,我們來討論系統學習的情況。系統學習中也會出現上面提到的大神和小白。這點拿我自己的經歷來說就可以了。

我在學習python的時候,廖雪峰老師的教程我看過不下5遍,每一次我都不怎麼敲代碼就覺得自己已經會了,之後也沒去用,一段時間之後就全都忘記了,之後我又會去看一遍,然後又忘記,如此循環往複。直到後來我真的去敲代碼了,用的比較多了,才逐漸熟悉python的語法的。

後來我有指導過女朋友入門python,也是看的廖雪峰老師的網站。她之前沒怎麼接觸過編程,但是學python的時候每一行代碼都會自己敲一遍,現在已經掌握的不錯了。不過從當時她問我的問題上來看,我深刻地認識到,正確的代碼就擺在那裡,你還是會敲錯,新手總是會犯在我看來非常低級的錯誤,但是每個人都會經歷那個階段。不去敲代碼,一個低級錯誤在你眼中可能就是不可逾越的高山。

我舉這個例子是想說,系統學習的一個弊端在於你學的東西可能在短時間內用不到,於是非常容易忘記。這種情況無法避免,但是這並不一定說明你的時間是浪費掉了的。如果你學習的時候只是看別人的代碼就以為自己懂了,那麼你的時間確實是浪費掉了。但是如果你是邊敲著代碼,有時還會思考出一些新的問題,並去尋找解決方法的話,這個時間完全沒有浪費掉。下面我來解釋一下二者的區別。

在我們敲代碼的時候,掌握的並不只是當前代碼的知識,而且還有一些潛移默化的、你自己可能都沒有意識到的收穫。可以這麼說,我們看教程、看幫助文檔學習一個個函數、語法、數據類型的時候,收穫最大的不是了解了這些東西,而是你寫代碼調試的過程。所以如果你只是在看,或者複製粘貼運行,沖著那些具體的「知識」去的,那就完全失去了這段時間學習的意義。

我還是拿自己的親身經歷來舉例。當初我學習R語言時,幾乎看遍了dplyr data.table ggplot2等包的幫助文檔中的所有函數,不僅運行了他們的示例代碼,而且不斷思考實際中會需要怎麼用,實際中需要什麼功能。讀者可以從下面3點中看出這樣做的好處

  • 我思考函數在實際中應用的時候,經歷了自己編寫、報錯、查找答案的過程。這個過程其實和其他人做項目時的過程沒有什麼區別,只不過一個是項目中遇到問題,一個是自己給自己提問題,都可以起到鍛煉編程能力的效果。如果說做項目可以遇到自己想不到的問題,從而更大豐富自己的經驗;那麼我要說幫助文檔中的例子、函數中形形色色的參數經常非常富有啟示性,可以達到開拓視野的作用。
  • 自己寫代碼、解決問題的過程可以讓這塊知識更難忘記,即使忘記也能留下比較清晰的痕迹,隨便查一下就可以馬上熟悉。
  • 第三個非常重要的點我稱之為信仰。你相信自己的代碼一定能正常運行,相信一個bug可以順利解決,相信看這個資源可以學到你想要的東西,這些是我所說的信仰,這些信仰是從編程中潛移默化獲得的,也是最有價值的部分。舉幾個例子
  1. 對代碼的信仰。假設你剛學會使用爬蟲抓取10個頁面的信息,現在讓你抓取1萬個頁面的信息,你心裡虛不虛。你想可以把原來循環中的10改成10000,但是又不敢確定它能正常運行。運行一會兒發現果然報錯,然後你找到了解決問題的辦法,設置了代理ip,再啟動爬蟲,你心裡還是虛的。果然,又報錯了,可能頁面增多解析時需要處理特例,修改後再運行.....心裡虛就是沒有信仰的表現,因為沒有成功實現過,就怕解決了一個問題又來一個,問題多了心態就崩了,尤其是在這個任務是很急迫的時候。
  2. 遇到bug時的信仰。在剛剛接觸編程的時候,我就聽說過stackoverflow這個網站是非常好的,幾乎你遇到的所有編程問題都可以再這個網站上找到答案。當時我也去看了一下,看到那些寥寥幾個贊的回答,心中大不以為然。直到後來編程越來越多,我才逐漸認識到,真的是幾乎所有問題都有人實現碰到過並在這個網站上討論。我認為這是一種信仰的建立,長期查找才能建立起這些途徑信仰,這可以讓你遇到新問題時知道應該怎麼找答案,甚至相信什麼樣的問題到哪裡一定能找到答案,這樣你在遇到bug或者需要了解新問題時幾乎不會有焦慮感,對編程不會有挫敗感,反而有解決問題的快感。
  3. 資源的信仰。我們經常看到,一篇文章列出了各種書籍、pdf、視頻資源,人們往往趨之若鶩,最後絕大多數都只是收藏下來再也不會翻看。其中的根本原因在於他們對這些推薦的資源沒有信仰,就算別人吹的天花爛墜,自己沒有親自看一下依然不會完全相信這是非常好的資源,沒有這種信仰自然就沒有驅動,不說當前沒有學這個的需求,即使之後有這個需求也想不起來這個時間收藏過這個東西了。
  4. 博客的信仰。學習編程很多時候是看網上的博客學習的,長期接觸一些博客也會對一些博客產生信仰,比如願意無條件接受某個公眾號的文章一定是精品。對於我來說,遇到一個bug我喜歡去stackoverflow這樣的問答社區,當需要系統掌握一塊知識(比如字元編碼)的時候,我就會去尋求博客。當搜索引擎不能幫我挑選出優質文章的時候,我一般會搜「字元編碼伯樂在線」,因為在我的印象中伯樂在線的文章沒有一篇水文。看,當你看到我這麼說的時候,你肯定對伯樂在線有點好奇,但是你肯定只是想去確認一下是不是真如我所說,甚至會認為我在打廣告,而不會建立和我一樣的信仰。而當你親自看過才有可能建立這個信仰。

系統學習對於建立信仰非常有幫助,因為這個時候不像做項目有個截止時間催著你,你可以盡情享受各種報錯和找答案的過程,逐漸培養自己的信仰。信仰也是一種直覺,是潛移默化的收穫,也是我們在討論競爭力時常常忽略的一點。但是獲得信仰的前提也是要主動去查、主動去試,花費時間精力思考總結。

總結

看完上面的論述後,再回過頭來看邊做邊查和系統學習的困惑,應該豁然開朗了。無論哪種方式,要想在編程方面達到很高的水平,都需要付出大量的精力,沒有捷徑可以走,只有一直在寫代碼,一直總結,才可以成為大神。區別只在於這個人是不是想成為大神了。

而邊做邊查和系統學習這兩種學習方法則是因人而異,首先看你習慣哪一種,其次看你能不能接觸到項目。

這一點擴展到是否要寫博客的問題上也很清楚了。

以我自己寫博客的經歷來看,寫博客能極大促進自己思考,解決以往會迴避的問題。因為我以前學習可能會糊弄自己,但是現在我不能糊弄讀者,這應該算是一種責任。

以前我看別人博客學習的方式是,跟著博客的思路學習那些函數、用法等;而且學了一篇我就覺得掌握了80%的東西,就認為自己已經掌握了。

而現在我看別人的博客從來不跟著他的思路,我會按照自己要寫的文章的思路進行學習。一個知識點我要寫成一篇文章,需要進行下面這些步驟

  • 首先模稜兩可的概念我需要查清楚了才能寫下來
  • 然後我會思考關於這個知識點我曾經遇到過的所有有關的問題,全部列出來
  • 對於我列出來的點,可能有一些東西只是處於知道的層次我要查資料搞清楚
  • 然後關於這個知識點,我要看網上的文章都寫了哪些東西,是否有一些我之前沒有接觸到的點
  • 整理好所有的點之後,我要排列先後順序、組織哪些點放在一起講、用什麼樣的示例等,還要用通俗易懂的語言講出來
  • 最後我寫出來的文章必須是網上能找到的教程中最全面,還要是能看懂的

可以看到,我通過寫博客來掌握知識,就會力求掌握該領域100%的知識。這樣做我很明顯發現,我學過的東西真的沒有那麼容易忘記,而且複習起來很快,這應該也是跑那些困難的程序帶來的信仰。

所以說寫博客對自己編程水平的提升是非常顯著的。當然,寫那種複製粘貼官網代碼,毫不重新組織思路的博客是沒有什麼幫助的。

最後只剩下一個問題:寫的這麼辛苦的博客,被別人看了會被超越嗎?

我相信這個問題的根源在於,覺得別人會比自己更快地學會這些知識,自己的努力完全就是在給他人做嫁衣。

那麼我們不談別人能不能看全你所有文章的問題,也不談他是不是走馬觀花不自己寫代碼運行,就看那些知道該怎麼學的人非常精緻地扒著你的博客來學的人。

就算有人能做到這一點,他也不會輕易超過你,因為他這麼精緻地學習,即使有你的博客做輔助,也是要花費大量的時間的,這個時間不亞於你當初學習的時間。我們舉一個例子,你在博客中說如果這個參數換成某某,結果就大不相同,讀者自己嘗試。你這麼寫肯定是嘗試過了,他如果不自己再嘗試一下,只是知道了,並不會產生和你一樣的對這個參數的信仰。這一點的外在表現是,他在跟別人說這個參數的時候,不會有自信說一定會得到這個結果,只敢說應該會,因為他自己沒有試過,有時候相同的代碼在不同機子上結果就是不一樣(有時用的不同IDE就會不一樣)。

更何況他沒有自己組織邏輯的過程,思考也不會比你更深入。你什麼都在博客里解決了,他也喪失了自己去查資料的機會,在信仰這方面的收穫就缺失了。

最後還是那句話,顯式知識的學習不如潛移默化的提升更有價值,當你的信仰建立起來,學什麼知識都是手到擒來。編程能力是要靠大量時間堆積起來的。開始寫博客吧!

如果覺得本文有幫助希望點個贊支持一下!


推薦閱讀:

TAG:編程 | R編程語言 | 學習方法 |