关于编程学习的一些思考
▼生物信息學習的正確姿勢(第三版)
NGS系列文章包括NGS基礎、轉錄組分析?(Nature重磅綜述|關于RNA-seq你想知道的全在這)、ChIP-seq分析?(ChIP-seq基本分析流程)、單細胞測序分析?(重磅綜述:三萬字長文讀懂單細胞RNA測序分析的最佳實踐教程 (原理、代碼和評述))、DNA甲基化分析、重測序分析、GEO數據挖掘(典型醫學設計實驗GEO數據分析 (step-by-step) - Limma差異分析、火山圖、功能富集)等內容。
較早時發表的生物信息之程序學習闡述了我自己學習程序的歷程,這次學習下廈大統計系Dwzb同學關于編程的一些思考,關鍵兩點:輸入和輸出;即是程序的輸入和輸出,也是知識的輸入和輸出,更是腦力的輸入和輸出。讀進來的知識是別人的,能寫出的東西才是自己的。有出有進,才能細水長流,匯成江河。
?
作者:?Dwzb?, 公眾號Python愛好者社區專欄作者 ,授權轉載?
廈門大學統計專業學生
知乎專欄:https://zhuanlan.zhihu.com/Data-Analysis
很久以來,我一直都有這樣兩個困惑:
統計專業學習編程應該系統學習還是遇到問題再找答案?
要不要寫博客?寫博客對自己的編程水平有多大提升?把自己的技術全部分享出去是不是會被超越?
最近我才把這兩個問題徹底想清楚,而且這兩個問題的根源在同一個地方,寫在這里和大家分享一下。
首先我來回答一下這兩個問題:
第一,其實系統學習和現查都是可以的,兩條路徑都可以成為大神,并沒有哪條路徑是捷徑的說法,just do it! (PS:我個人傾向于系統學習)
第二,要寫博客,提升非常大,也不會被超越
為什么是這個答案呢?因為編程語言掌握的好不好,完全在于你付出的時間多不多,會不會思考總結,而不在于你學習的途徑。只有解決了足夠多的報錯,并進行總結歸納,你對這個編程語言才會有基本的直覺,這個直覺比任何顯式的知識都重要,但卻常常為人所忽略。
下面是我的理由。
系統學習還是遇到問題再找答案
我相信這個困惑是比較普遍的
對于主張系統學習的人來說,他們沒有掌握這個用法是不敢直接去做項目的,總會覺得心里沒底,遇到什么bug解決不了怎么辦,所以他們總會在做之前先對這個東西有一個比較系統的認識,我就是這樣。但是這又會帶來一個問題,那就是系統了解要花費大量的時間,而且學過的東西很容易忘記;最重要的是,即使系統學習過,做項目的時候還是會遇到之前沒想過的問題。
對于主張遇到問題再找答案的人來說,他們會遇到找不到答案的情況,當你在毫無了解的情況下,在搜索時有時連該輸入什么關鍵詞都不知道。還有一種情況是,明明有現成的方法,你卻不知道,自己造輪子還造不出來,陷入絕望中。
兩種人都羨慕對方的優勢,同時又畏懼按照對方那么做而產生的弊端,于是陷入迷茫。我在學習生信的系列書籍中一提到過我自己的一點理解。
這時,我們如果能意識到下面這點,就不會有迷茫的感覺了。
要想成為其他人眼中的編程高手,無論走哪一條路,都是行得通的,但是都有兩個前提:要花費大量時間精力、要思考總結。
相信更多的人會主張邊做邊查,所以先說這一點。我見過這樣做成為大神的人,也見過因為這樣而被一個小bug卡住半天的人,他們的區別在哪里?在編程上花的時間精力不一樣,對編程的興趣不一樣。
大神遇到bug會搞清楚它產生的原因,保證以后不會再犯,每遇到一個bug都積累一次經驗。甚至他們會通過這個問題思考出一些新的問題,完善這方面的知識體系,積土成山。長此以往,他們的知識體系也會非常完整,對待bug有自己的一套解決方案。
而小白則只要能跑出結果不報錯就滿足了,他們甚至不知道結果是不是自己想要的,更不會去深究、擴展這方面的技術細節。編程對他們來說是噩夢,沒有bug就謝天謝地,無論做了多少項目,他們依然是小白(而且他們可能會逃避這種項目,做的也沒有大神多)。
我們可以看到,大神良性循環,小白惡性循環,逐漸走到兩個極端。生活中的編程大神幾乎不會問編程問題,而小白問的問題你只要百度一下就能幫他找到答案了。這是肯不肯思考總結的差別、肯不肯花時間精力的差距。所以只要肯思考總結花精力,邊做邊查的弊端是可以完美解決的。
接下來,我們來討論系統學習的情況。系統學習中也會出現上面提到的大神和小白。這點拿我自己的經歷來說就可以了。
我在學習python的時候,廖雪峰老師的教程我看過不下5遍,每一次我都不怎么敲代碼就覺得自己已經會了,之后也沒去用,一段時間之后就全都忘記了,之后我又會去看一遍,然后又忘記,如此循環往復。直到后來我真的去敲代碼了,用的比較多了,才逐漸熟悉python的語法的。
后來我有指導過女朋友入門python,也是看的廖雪峰老師的網站。她之前沒怎么接觸過編程,但是學python的時候每一行代碼都會自己敲一遍,現在已經掌握的不錯了。不過從當時她問我的問題上來看,我深刻地認識到,正確的代碼就擺在那里,你還是會敲錯,新手總是會犯在我看來非常低級的錯誤,但是每個人都會經歷那個階段。不去敲代碼,一個低級錯誤在你眼中可能就是不可逾越的高山。
我舉這個例子是想說,系統學習的一個弊端在于你學的東西可能在短時間內用不到,于是非常容易忘記。這種情況無法避免,但是這并不一定說明你的時間是浪費掉了的。如果你學習的時候只是看別人的代碼就以為自己懂了,那么你的時間確實是浪費掉了。但是如果你是邊敲著代碼,有時還會思考出一些新的問題,并去尋找解決方法的話,這個時間完全沒有浪費掉。下面我來解釋一下二者的區別。
在我們敲代碼的時候,掌握的并不只是當前代碼的知識,而且還有一些潛移默化的、你自己可能都沒有意識到的收獲??梢赃@么說,我們看教程、看幫助文檔學習一個個函數、語法、數據類型的時候,收獲最大的不是了解了這些東西,而是你寫代碼調試的過程。所以如果你只是在看,或者復制粘貼運行,沖著那些具體的“知識”去的,那就完全失去了這段時間學習的意義。
我還是拿自己的親身經歷來舉例。當初我學習R語言時,幾乎看遍了dplyr data.table ggplot2等包的幫助文檔中的所有函數,不僅運行了他們的示例代碼,而且不斷思考實際中會需要怎么用,實際中需要什么功能。讀者可以從下面3點中看出這樣做的好處
我思考函數在實際中應用的時候,經歷了自己編寫、報錯、查找答案的過程。這個過程其實和其他人做項目時的過程沒有什么區別,只不過一個是項目中遇到問題,一個是自己給自己提問題,都可以起到鍛煉編程能力的效果。如果說做項目可以遇到自己想不到的問題,從而更大豐富自己的經驗;那么我要說幫助文檔中的例子、函數中形形色色的參數經常非常富有啟示性,可以達到開拓視野的作用。
自己寫代碼、解決問題的過程可以讓這塊知識更難忘記,即使忘記也能留下比較清晰的痕跡,隨便查一下就可以馬上熟悉。
第三個非常重要的點我稱之為信仰。你相信自己的代碼一定能正常運行,相信一個bug可以順利解決,相信看這個資源可以學到你想要的東西,這些是我所說的信仰,這些信仰是從編程中潛移默化獲得的,也是最有價值的部分。舉幾個例子
對代碼的信仰。假設你剛學會使用爬蟲抓取10個頁面的信息,現在讓你抓取1萬個頁面的信息,你心里虛不虛。你想可以把原來循環中的10改成10000,但是又不敢確定它能正常運行。運行一會兒發現果然報錯,然后你找到了解決問題的辦法,設置了代理ip,再啟動爬蟲,你心里還是虛的。果然,又報錯了,可能頁面增多解析時需要處理特例,修改后再運行.....心里虛就是沒有信仰的表現,因為沒有成功實現過,就怕解決了一個問題又來一個,問題多了心態就崩了,尤其是在這個任務是很急迫的時候。
遇到bug時的信仰。在剛剛接觸編程的時候,我就聽說過stackoverflow這個網站是非常好的,幾乎你遇到的所有編程問題都可以再這個網站上找到答案。當時我也去看了一下,看到那些寥寥幾個贊的回答,心中大不以為然。直到后來編程越來越多,我才逐漸認識到,真的是幾乎所有問題都有人實現碰到過并在這個網站上討論。我認為這是一種信仰的建立,長期查找才能建立起這些途徑信仰,這可以讓你遇到新問題時知道應該怎么找答案,甚至相信什么樣的問題到哪里一定能找到答案,這樣你在遇到bug或者需要了解新問題時幾乎不會有焦慮感,對編程不會有挫敗感,反而有解決問題的快感。
資源的信仰。我們經常看到,一篇文章列出了各種書籍、pdf、視頻資源,人們往往趨之若鶩,最后絕大多數都只是收藏下來再也不會翻看。其中的根本原因在于他們對這些推薦的資源沒有信仰,就算別人吹的天花爛墜,自己沒有親自看一下依然不會完全相信這是非常好的資源,沒有這種信仰自然就沒有驅動,不說當前沒有學這個的需求,即使之后有這個需求也想不起來這個時間收藏過這個東西了。
博客的信仰。學習編程很多時候是看網上的博客學習的,長期接觸一些博客也會對一些博客產生信仰,比如愿意無條件接受某個公眾號的文章一定是精品。對于我來說,遇到一個bug我喜歡去stackoverflow這樣的問答社區,當需要系統掌握一塊知識(比如字符編碼)的時候,我就會去尋求博客。當搜索引擎不能幫我挑選出優質文章的時候,我一般會搜“字符編碼伯樂在線”,因為在我的印象中伯樂在線的文章沒有一篇水文???#xff0c;當你看到我這么說的時候,你肯定對伯樂在線有點好奇,但是你肯定只是想去確認一下是不是真如我所說,甚至會認為我在打廣告,而不會建立和我一樣的信仰。而當你親自看過才有可能建立這個信仰。
系統學習對于建立信仰非常有幫助,因為這個時候不像做項目有個截止時間催著你,你可以盡情享受各種報錯和找答案的過程,逐漸培養自己的信仰。信仰也是一種直覺,是潛移默化的收獲,也是我們在討論競爭力時常常忽略的一點。但是獲得信仰的前提也是要主動去查、主動去試,花費時間精力思考總結。
總結
看完上面的論述后,再回過頭來看邊做邊查和系統學習的困惑,應該豁然開朗了。無論哪種方式,要想在編程方面達到很高的水平,都需要付出大量的精力,沒有捷徑可以走,只有一直在寫代碼,一直總結,才可以成為大神。區別只在于這個人是不是想成為大神了。
而邊做邊查和系統學習這兩種學習方法則是因人而異,首先看你習慣哪一種,其次看你能不能接觸到項目。
這一點擴展到是否要寫博客的問題上也很清楚了。
以我自己寫博客的經歷來看,寫博客能極大促進自己思考,解決以往會回避的問題。因為我以前學習可能會糊弄自己,但是現在我不能糊弄讀者,這應該算是一種責任。
以前我看別人博客學習的方式是,跟著博客的思路學習那些函數、用法等;而且學了一篇我就覺得掌握了80%的東西,就認為自己已經掌握了。
而現在我看別人的博客從來不跟著他的思路,我會按照自己要寫的文章的思路進行學習。一個知識點我要寫成一篇文章,需要進行下面這些步驟
首先模棱兩可的概念我需要查清楚了才能寫下來
然后我會思考關于這個知識點我曾經遇到過的所有有關的問題,全部列出來
對于我列出來的點,可能有一些東西只是處于知道的層次我要查資料搞清楚
然后關于這個知識點,我要看網上的文章都寫了哪些東西,是否有一些我之前沒有接觸到的點
整理好所有的點之后,我要排列先后順序、組織哪些點放在一起講、用什么樣的示例等,還要用通俗易懂的語言講出來
最后我寫出來的文章必須是網上能找到的教程中最全面,還要是能看懂的
可以看到,我通過寫博客來掌握知識,就會力求掌握該領域100%的知識。這樣做我很明顯發現,我學過的東西真的沒有那么容易忘記,而且復習起來很快,這應該也是跑那些困難的程序帶來的信仰。
所以說寫博客對自己編程水平的提升是非常顯著的。當然,寫那種復制粘貼官網代碼,毫不重新組織思路的博客是沒有什么幫助的。
最后只剩下一個問題:寫的這么辛苦的博客,被別人看了會被超越嗎?
我相信這個問題的根源在于,覺得別人會比自己更快地學會這些知識,自己的努力完全就是在給他人做嫁衣。
那么我們不談別人能不能看全你所有文章的問題,也不談他是不是走馬觀花不自己寫代碼運行,就看那些知道該怎么學的人非常精致地扒著你的博客來學的人。
就算有人能做到這一點,他也不會輕易超過你,因為他這么精致地學習,即使有你的博客做輔助,也是要花費大量的時間的,這個時間不亞于你當初學習的時間。我們舉一個例子,你在博客中說如果這個參數換成某某,結果就大不相同,讀者自己嘗試。你這么寫肯定是嘗試過了,他如果不自己再嘗試一下,只是知道了,并不會產生和你一樣的對這個參數的信仰。這一點的外在表現是,他在跟別人說這個參數的時候,不會有自信說一定會得到這個結果,只敢說應該會,因為他自己沒有試過,有時候相同的代碼在不同機子上結果就是不一樣(有時用的不同IDE就會不一樣)。
更何況他沒有自己組織邏輯的過程,思考也不會比你更深入。你什么都在博客里解決了,也喪失了自己去查資料的機會,在信仰這方面的收獲就缺失了。
最后還是那句話,顯式知識的學習不如潛移默化的提升更有價值,當你的信仰建立起來,學什么知識都是手到擒來。編程能力是要靠大量時間堆積起來的。開始寫博客吧!
如果覺得本文有幫助希望點個贊支持一下!
授權轉載自:Python愛好者社區。
Python
Python學習 - 可視化變量賦值、循環、程序運行過程
Python極簡教程(一)
Python極簡教程(二)
Python極簡教程(三)
Python極簡教程(四)
Python極簡教程(五)
Python極簡教程(六)
Pandas,讓Python像R一樣處理數據,但快
Python解析psiBlast輸出的JSON文件結果
為啥我的Python這么慢 - 項查找 (二)
為啥我的Python這么慢 (一)
Python資源
關于Python中的main和編程模板
莫煩Python機器學習
編程新手入門踩過的25個“坑”,你犯過其中哪些錯誤?
往期精品(點擊圖片直達文字對應教程)
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的关于编程学习的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019文献汇总 | 单细胞与病毒感染
- 下一篇: 推荐几个单细胞数据分享和展示平台 | 短