Contents ...
udn網路城邦
35後,自學Python
2020/06/22 09:48
瀏覽4,165
迴響0
推薦0
引用0

我在35歲前完全不會寫程式,雖然大學時有一門必修程式語言課程,但我還是完全不會寫程式。

系上一位教授常說,他無法接受物理人不會寫程式(用電腦來解物理問題),我聽了有點驚嚇,但我整個大學時期都被打工、社團、抱佛腳佔據了,每天都是跟時間賽跑,連研究所都是抱佛腳考上的...真的沒有多餘時間讓我想要不要學程式。

工作後經濟壓力小了,反而有時間。在網路知識爆炸的時代,一台電腦就能接觸各種專業領域。雖然畢業了,但我反而沉迷過天文、近代物理...等以前沒學好的東西,而且在網路上就可以輕易接收到世界充滿熱忱專家的資訊。

有一天,我意識到世界趨勢,程式語言將會成為之後的主流,許多工作都將避不開與程式接軌,我開始試著學寫程式。不過這已經接近35了,而且我還放棄好幾次。

直到有一次決定一定要學會,並且以一個工作上需要用到的功能作為目標,就這樣廢寢忘食了三周,終於成功了,嘗到這條路上的第一份雀躍,也算入了第一道門。

# Python簡單嗎?

我會選擇學Python就是聽說它簡單、好用。但問題是簡單的定義是什麼?很常聽到人說用Python就是只要調用人家寫好的套件,用幾行指令就能達到我們的目的了,那先決條件也要是你的目標「全都剛好」是套件有的功能。何況「簡單」的Python也是讓多少人學到放棄你知道嗎?

Python的套件確實很多,有了各式各樣套件後,幾乎你想做哪方面領域都有辦法做,例如要做數據處理與數據分析有Numpy、Pandas,要畫圖有Matplotlib、Seaborn,要做科學計算與統計有Scipy、Statesmodel,要做機器學習有Scikit-learn,要做深度學習有Keras、Tensorflow,要做影像處理有Opencv,要操作資料庫有Psycopg、SQLite,要操作Arduino開發板有PyFirmata,要開發GUI有tkinter,要寫手機APP,要做Web開發,要網路爬蟲也都有一堆套件(但我不清楚了),總之五花八門。

舉一個最簡單的例子,我們可能常常要算整個數列的平均值、標準差...等,以傳統的要求,我們應該要自己寫出算平均值或標準差的function,如果多個數列可能還要加個for迴圈,然後算出所有數列的平均值、標準差。但用Numpy或Pandas就只是一行代碼了。

然而你以為有Numpy與Pandas就不用會寫function與for迴圈了?除非你只是要拿Python作為輔助你工作的一個工具而已,而且你只需要用固定的套件,不然你光光是一直學新套件還不如自己直接寫function還比較快。

更高技術 v.s. 其他專業能力

因此,如果你是打算靠這技術吃飯的,有這些套件後,你不但還是要學會基礎編程能力,反而還必須會更高層的編程能力,或者對於領域知識(Domain Knowledge)的專業能力特別深入,或者你命運特別好,不然你也吃不到飯。

# 學Python須具備什麼條件

數千小時以上的練功路

很多人覺得寫程式需要頭腦比較好的,但頭腦轉不過來的人(我..)其實就只是一開始撞比較久的牆而已,等撞出去了就好了,這可能只是你這條「數千小時以上」練功路的其中一小部分而已。這條路非常漫長的,所以具有「興趣」、「熱忱」、和「堅定目標」才是重點,如果沒有這些條件你之後會痛苦很久的。

數理能力

雖然不需要特別好的頭腦,但你的數理能力一定不能差。程式語言只是一個工具,你用工具能做出多厲害的東西,和你的數理基礎有「非常大」關係,而你需要具備多少的數理基礎和你的目標是什麼及目標多大有關係。一般而言,許多的程式開發是不需要多高深的數學能力,但如果你想做數據分析或人工智慧,就至少要精通高中數學。如果你高中數學不夠好,那就必須回去重頭學到好。如果你想開發大專案,你還需要有「抽象能力」,通常數理能力好的抽象能力不會太差。

日新月異的翻新速度

雖說各行各業的技術都會翻新,但這領域的翻新速度就是要比其他領域還快上許多倍,最好在踏入之前就有基本認知。

# Python怎麼學

就算不是走正統的教育體系或者補習班,這領域的技術因為變化與淘汰非常快,因此線上課程、線上論壇、以及市售相關書籍都非常多,在學習資源上根本不會匱乏。但是也因為資源太多,範圍太廣,如果你沒有明確的目標,你可能會學了一堆不是你需要的東西。

方法+耐力

我過去就學過程中雖然成績都不算好,但是我的人生大考都是在最後百日拼出來的(從沒補習),要屢次在大考中靠自學抱佛腳成功,靠的就是「方法」和「耐力」了。因此我還是野人獻曝的分享一些自己自學Python的方法與心得。

不可能只學Python

Python的基本語法不難,但正常不該有人只單獨學基本語法的,依據你想要的方向以及你的目標有多大,你會有不同需要學習的東西。所以你可能要先問自己,決定要走哪個方向?不過可能很多人一時也不確定自己要走哪個方向,或者方向隨時都在改變,那也沒關係。這條學習路非常漫長的,需要學的東西真的太多太多,所以你要會分配「時間比重」還有「學習順序」。

『體、用』

『體、用』在中國哲學中指的是『本體』與『功用、功能』,可以套用在萬事萬物上。本體可以說是內涵,如果沒足夠內涵,會發揮不出足夠的功能,但如果都不需發揮功能,那有再強的內涵都沒意義。學習程式語言也是一樣的情況,我們學語言是為了要達到我們需要的功能,但為了要達到足夠的功能我們就必須學硬邦邦的編程基礎。

直接調用套件與使用開發好的資源確實可以很快達到我們需要的功用,但「編程基礎」、「電腦科學基礎」、「數理基礎能力」、以及你會應用到的「專業能力」才是本體。

依據你的『方向』、『目標大小』,你在整個學習歷程中必須自己做好『體、用』的時間比重分配,列舉出專屬自己的『體、用』個別項目。

不過通常列完你就會暈倒了(這條路的坑實在太多了),你可能根本就學不完或者全部只能學的粗淺,於是你可能需要把目標改小一點、或方向改窄一點。不過改太小,你會沒競爭性,而太窄,你的出路也會比較窄。

以實作為主軸

雖說『體』很重要,但程式這條路一定要以「實作」為主軸。一開始從小專題開始做起,在達到目的的過程中"一定"會遇上很多問題,如果專題越大的遇上的問題會越多,遇到了就分別一一找解法(善用「谷歌大神」和碼農救星「Stack Overflow」),最後完成專題目的,當然你也能用套件,這樣你可以比較快先做出很多你要的東西。

之後為了能夠做更大的專題,你自然就會回頭去學編程基礎以及常遇到的電腦問題以及專業知識。千萬不要以為有了套件就不需要下這些苦功了,「順序」問題而已。

不過如果你的方向是還沒確定的,那你花太多時間去學特定領域的套件就不太有效率了,不如一開始花比較多比重在編程基礎上,會少走一點白路。不過你到底有沒有學會這些基礎,其實也只有在你實際做專案時才可能知道,有時候你以為你學了很多,但你根本都不會用!很多的細節是在實做的過程中才可能會「發現」的。

我的經驗是,即使功能都是以前有寫過的,但只要實作的專案越來越大,就是考驗我們程式組織與架構的時候。同時我們也需要不斷使用「新的寫法」(設計模式的概念),這樣專案才能好擴展、維護、並且維持高效能。也就是當專案大小乘以2,如果原本寫法沒有很好,難度並不是乘以2,而是2次方。這個道理如果沒有經過實作,我絕對不會體會到。


# 線上課程資源

前面提到我學Python是自學的,其實說"自學"有一點作弊,因為我跟了幾個很厲害的線上師資學有系統、架構的課程。但因為一切的學習都是出於自我意志,沒有任何外人來強迫、規範,所以暫且稱為自學。

拜師的重要

除非萬不得已或沒辦法,不然在編程基礎(非基本語法)的部分不要真的"自己學"。能夠向老師學當然要向老師學,除了時間上差非常多,這東西很多厲害之處是「不易言傳」的,隨著老師的用心且「一步步」地帶領,你才比較有可能領會出老師想表達的思路與意涵,之後還能舉一反三。

我當時花錢買線上課程的初衷只是我覺得自己資質比較差,希望能跟老師學會比較快一點,不過學了後發現,還好有跟老師,我才知道除了我原本想學的東西之外,還有好多「新天地」!

現在拜科技所賜,許多課程都搬到網路上了,而能在網路上成名的,都是跟世界競爭過的,講師多是高手而且充滿教學熱忱。在這種情形下,看起來你都待在電腦前「自己學」,但其實你學的可能都是世界頂級的課程。所以這時代不要小看自學喔~

目前就我所知的線上教學平台真的很多,收費方式都不一樣,我初期花了滿多時間在了解各個平台的,最後因應我個人的方向、目標與特質,我定在Udemy與DataCamp這兩大平台上。

•      Udemy: https://www.udemy.com

      DataCamp: https://learn.datacamp.com

Udemy

當初我選擇Udemy而沒選Udacity(另一個知名線上教學平台)是因為Udemy是一門課一門課收費的,一門幾百元(特價時幾百元,而它經常特價),買了還有30日內無條件退款保證。而Udacity是很多課程包在一起收費,但是可能要一次幾萬元,不過課程作業會有真人幫你批改(當然你作業就一定要時程內繳交),修課結束也會有正式的證書,聽說在業界真的具有公信力,所以Udacity有一點拿學位的意味吧,和Coursera有一點點類似,不過Udacity比較偏向業界應用。

一開始我自己也不知道我會學到什麼程度,所以就選擇一堂幾百元的Udemy開始,結果到現在也算不出幾十堂了。但我買得很開心,很多都是忍不住買的,有時候還會覺得上課滿療癒的。有些特定講師出的課,只要遇特價我都一律先買再說。Udemy的付費課程,你如果有問題都可以在QA中提出問題,有在經營的老師都滿快回答問題的,光是這點就讓幾百元課程的CP值又更高到破錶。

順帶一提,這其實就是「互聯網」的概念,透過網路平台讓一個講師的課程可以非常輕易賣給全世界的人,有些熱門課程的購買人數可高達百萬人,雖然課程賣得很便宜,熱門講師都可以賺到翻過去了,完全是「三方發揮最大利益」。

DataCamp

DataCamp是只針對R與Python語言以及資料科學領域的教學平台,這個平台最大特色是他是以"編程"為主的課程,也就是每堂課都是在線上coding完成的,而且不需要自己另外灌有的沒有的就能直接coding,因此可以先專注一件事情就好。通常用這個平台的以學統計的人為主,你如果想走資料分析或資料科學,也是適用。DataCamp一次可能就要買一年,無限次上課,不過他的每門課的第一節好像都是免費的,可以先上免費的。

我覺得在不同的階段會分別適合不同型態的課程,你適合哪個平台應該是要依自己的各項需求自己規劃出來的。其他人最多就是分享自己的使用心得而已,希望我之後還能寫一篇線上課程學習心得。

# 走這條路英文要很好嗎

以上說的幾個線上教學平台,加上碼農救星Stack Overflow,都是以英文為主的,那是否英文很好才能走這條路呢?其實是不用的,但這句話的意思不是英文不用好。

英文不好的問題和頭腦不好的問題類似,就是一開始要辛苦些,之後都要靠努力補上的,這都是這條路上的其中一個關而已。我買的第一個英文課程,因為聽不懂放棄了。第二個課程是很實務的部分,我很想好好學可是完全聽不懂,老師又印度口音重。向友人求救,友人要我一句一句聽,利用「自動生成的字幕」(現在的「語音辨識自動生成字幕」很普遍,如果老師發音標準,字幕準確度滿高的)搭配教材文字說明,懂了才繼續聽下一句,不懂就查到懂。我當時聽到這樣做法時覺得滿崩潰的,但是因為友人英文程度和我差不多,他自己也是如此做的,我覺得我資質差人家那麼多,所以努力反而不該比人少,於是就用這種模式衝了。我每天聽,聽了一輪還是完全聽不懂,就再重上一次,再不懂就再上一次,痛苦撐了一個月後發現,我已經可以正常速度下聽懂超過五成的課程內容了!其實這樣就夠了,因為這樣等於「上軌道」,接下來只要持續努力就會一直往前進了。

其實也不是沒有中文課程與資源,但就是比較少,英文資源多了許多倍,你可以用最少的錢買最好的課程。而這麼做也不是只有省錢,是這條路太廣,你一定會遇到很多問題上網求助,學一段時間後很多東西都是英文才查得到的,你如果不能接受聽、看英文,我真的不知道你要如何走這條路...

# 我適合學Python嗎

我覺得如果我們在「清楚」這是一條什麼樣的路的前提下,還具有興趣,那真的非常適合,因為Python的語法相對簡單,應用很廣,未來前途看好(雖然也許命運還是很關鍵的因素)。

只是也就是因為Python相較簡單,所以我們除了語言之外必定還需要其他條件(例如高階編程能力、統計、專業領域知識...),也就是我們具有更有價值的能力。

而且不要想說一輩子就只需要精通Python就可以了,也許哪天Python被淘汰了也說不定。不過沒關係,你如果學穩了編程基礎(資料結構、演算法、物件導向、設計模式...)的話,基本道理都是不會變的。

 

你可能會有興趣的文章:

限會員,要發表迴響,請先登入