當初是如何學程式語言的-心路歷程跟想法

快到年底要幹嘛,當然寫科技部計畫啊 然後又被reject QQ
自己拖延症又發作,所以乾脆來寫網誌,也彌補一年至少有寫三篇的進度。

這一篇文章想要探討的是半路出家學程式語言的心路歷程。
然後回顧的話需要注意什麼。

今年開學學期初變成學程的教務委員之一時,當下真的感覺任重道遠。其實課程安排本身是不用做太多事情的,因為之前的老師們都已經設計得很好了。

但在討論的過程中,開始思考的是所謂學生應該要有的核心能力。 就是如知道現在一個生命科學問題的研究,所需要的領域知識(domain knowledge) 和核心能力(core knowledge)。

一個所謂的核心課程,是需要搭配多少的核心能力跟領域知識呢? 之前有寫一篇 基因體學的核心,現在重新閱讀覺得當初把兩種能力糾纏在一起。因為覺得都需要學啊~

現在如果要更清楚地講出來,我定義核心能力為

如果有一天,你選擇在另一個領域耕耘下去的話,是可以用到的。

所以某一方面我也認為核心能力應該是像可轉移的技能 (transferable skills)。 像是基因體學的話我會覺得是領域知識[生物學+實驗+分析] + 核心知識 [數學] + 核心知識 [程式語言] 。

因為每個領域的增進,如生命科學,都開始跨進了高通量/面向的資料產生, 變成簡單或是制式化的軟體已經不太能去滿足分析的結果,再加上解譯語言(interpreted language)的進步如python 如果不同version env可以解決的話 讓人更好上手,程式語言某一方面從domain knowledge 變成很多領域說不定都很需要的知識,就變化成所謂的核心知識。

其實說生科增進也不盡然正確,畢竟生物學(一隻、兩隻的學問)做到最後就是生態學(多細胞、多物種、多環境、時間緯度)啊.. 只是我們有更完善的工具開始去研究現象而已。

所以,因為課程的關係再次聯想到現在學生的環境,想說是時候重新想起當初是笨笨的學。 這邊文章是分享當初的血淚史,但是重點會放在自己的心得。也會分享一些說不定可以引起深思的想法。

[前提] 我一開始接觸到程式語言是在大學時,也不是覺得課業需要所以去上課,而是打線上遊戲需要用到程式語言.. 爲什麼需要用程式語言?啊就寫外掛啊。

ropic

要寫不同腳本,鎖定地圖路線、打寶撿東西,自動升級.. 而且還是在沒有GUI (使用者介面) 的方式下執行。 印象中寫得最開心的是如果角色講什麼話,就要用regular expression 抓出來然後做回應這樣。然後再依照可能的回應再做回應。所以那些 if, elsif 那些簡單的指令就學起來了。所以玩遊戲(?)可以精進能力我是真的很同意就是了。

很抱歉當初寫外掛賺學費..,祝當初分享腳本的大大們一生平安。

[碩士] 碩士時代真的算是我被砍掉重練的時間點。

延伸閱讀: 碩士班到博士班的心路歷程

那時第一堂課直接被丟進學C++。報告是要寫出一個迷宮的程式,所以馬上接觸到基本的演算法dynamic programming。然後pointer 指來指去指到天荒地老..

細節忘了。但是記得的是一開始很崩潰,但是compile後走出迷宮的當下是一種成就感!最重要的是,好像寫程式語言也不是那麼的難!

我想這就是學程式設計課程設計的初衷吧。學生會覺得很崩潰但在控制中 (?),但是寫的程式碼到最後一定會成功,然後讓學生願意繼續下去。 這也包括了解自己的工作環境 (aka電腦),可以開始自己安裝一些軟體,然後有結果跑出來,甚至開始嘗試解釋並想下一步。

第一步就是脫離按一顆鈕 (step out of comfort zone) 的境界。
~~題外話:有些地方的生物資訊核心實驗室是好多個人+安裝geneious然後教你跑geneious. 這樣對嗎? ~~

碩士後期去了不同實驗室實習,做了幾個小專案。所以有接觸到Java 跟 Perl. 學到了有關OO, 不同databases, 然後跟同學嘴砲看誰可以寫出最短或是最長的perl 指令。這段時間很快樂。

在當時,我覺得有做了一件事讓現在回想是蠻有幫助的。就是買有關程式語言的書然後整本讀下去。 而且盡量是不用特定是對你的領域量生訂做的(如: XXX for biologists)。 因為都有讀過,會發現對特定領域打造的程式語言書其實是增加讀者的熟悉度,讓你對裡面的問題產生共鳴,而減少對新東西的恐懼感。

But, 我覺得有一部分變得說作者必須要遷就這個領域的問題,所以在解釋某些東西時反而會綁手綁腳,有時讓人更困惑。 而且大部分的課程設計也是類似,所以也不用再去買一本類似方法的書。 因為讀這些書的主要目的之一是讓你知道你現在在用的程式語言還可以做什麼,而不是說你的問題怎麼解決。

再來就是讀這些書雖然不會一次記得,但你會在大腦建構一個初步的資料庫,然後有一種 ‘這種function很實用說不定有一天會用到’ 的感覺。 我覺得這很重要。

我覺得現在很多人寫code 會是這個模式:

想解決問題 ➡️ stack overflow 時間花很久因為沒有關鍵字 ➡️ 複製貼上繼續寫 ➡️ 下一個問題 ➡️ 被問題解決

我會偏向: 自己大腦的資料庫 ➡️ 想解決問題 ➡️ stack overflow (時間花少一點因為有關鍵字) ➡️ 更新資料庫並做連結 ➡️ 下一個問題 ➡️ 可以自己解決 | stack overflow

所以第二步,我會建議就是找一本大家都在推的程式語言書,然後就一整本系統化的讀下去吧!

延伸閱讀:如果對R有興趣的話,R for data science 是一本很好的入門書。

書本恆久遠,一本永留傳

[博士] 之前寫的網誌講到 “那我應該從哪裡開始?”

“那我應該從哪裡開始?” 我問著。 (博士班)導師從他書櫃抽出了幾本書 ,還有那時剛發表的一篇Nature ,“把這些書讀了搞懂。然後把這個paper 的資料下載下來重新分析一次。只有親手算,你才知道問題與答案背後的邏輯。”。所以,博士的前五個月我把這些書跟文獻讀完,實驗開始上正軌,也重新分析了一篇Nature 的文章

這一段時間,是培養邏輯跟寫程式的功力。那時候根本沒有stack overflow, 學長姐也沒有code 傳下來. 所以我真的是邊學遺傳學的各種算式然後自己寫(因為網路上現有的不太能處理missing data),所以真的就是當作一個程式設計師(Programmer) 一直寫一直寫一直寫. 然後也接觸到不同資料的結構。所以自己的走向還是一樣,找書,然後慢慢讀。

邏輯學好了,資料的結構比較得心應手了,都會影響之後寫程式的想法跟效率。 所以第三步,就是開始練功吧。
看我這部分寫的那麼短就知道當時多痛苦XD

其實到這個階段,至少在資料處理的部分你應該就有很多經驗了。之後就是不同資料處理的方法跟累積更多經驗。

[博後] 這時其實寫程式的年資也差不多四年了。
如果是資工畢業的應該年薪百萬看千了 XD.

延伸閱讀: 博後五年的心路歷程

在當博後的這個時期 ,其實就是要挑戰你的即戰力。資料太多,如果你處理不夠快或是沒有能力解決問題,就會被叫去處理比較 ‘溫和’ 的資料。

然後被淘汰。

其實我真的到這時期才開始用很多 script 跟管線 (pipelines).
因為真的之前被其他的人的pipeline嚇到了 害死

我一直覺得pipeline 是處理人~~~~~~的問題而不是資料的問題 XD~~
~~所以當我知道如Ensemxx都是perl+pipeline的時候我嚇死了XD
~~

反正大部分的算式都是自己需要重寫等等,所以博班時期反而沒什麼用到。
但是生物資訊本來就是要連接超級多~的軟體,然後又超級多計畫,所以這邊就重新開始用很多script+pipeline+更多的eval 怕爆.

在這邊你也需要用新的系統,開始了解硬體,開始在團隊裡面一起寫。所以了解到更多硬體,效能,架構等等。真的是學無止境啊!

這邊我也覺得半路出家也有一個好處,你真的可以意識到每個專業的出發點,然後嘗試去找出一個溝通的方式。在這裡我要說這不是通才跟專才的辯論。會溝通不代表你會解決問題。有很好的能力不代表你不會被人解決(咦)。時間拉長來看,你其實就是當下需要什麼就做什麼,比較重要的反而是從很早就需要養成持續學習的習慣,並做選擇。

到這裡,我覺得第四步是做選擇。

因為四、五年放在大學其實也是一個學位了。如果是生科生轉資訊,你也可以考慮要更偏生物資訊的研究,或是直接找資工類的工作。 畢竟薪水就是高很多。我覺得沒有對錯。這也是我覺得培養核心能力的重要性。

所以要問自己,你喜歡寫軟體給大家用嗎?你喜歡追求效能嗎?你想繼續lv up 變成developer/engineer 嗎? 如果要應用甚至開公司的話這些都是必要的,甚至更多。

還是你只是拿程式語言來當作你研究的工具之一?

然後做個選擇。接下來要追求的就是domain knowledge 的增進 或是天天開始刷leetcode。

我選擇讓程式語言當我的核心能力之一,然後覺得更想知道的是演算法的部分,所以在博後時期也去修英國空中大學的數學系(差兩個學分就拿到畢業證書了 QQ)。

然後我接下來做的反而是去跟不同實驗室合作,了解並分析不同資料的面相,如何處理等等。 所以跟生物資訊的老師們比,在效能、演算法或是資料的新處理方式想法上我是望塵莫及的。但我也更了解自己的能力跟興趣所在,也知道哪些是自己能做的。

[現狀] 這是我當時的路程。那現在呢? 我很明顯能感覺到,如果是半路出家的話,現在學生只要學 import 跟知道 slack overflow 就好了(誤)。

import funding; xkcd [python](https://xkcd.com/353/)

因為資料的大爆炸,也因為越來越多人寫很好的package,讓大家可以馬上上手分析,然後馬上有結果,然後大家好棒棒。 因為package 有制式的options, arguments, 所以變成know-how 反而是怎麼微調一些參數。

這邊會有幾個問題,如學生報paper 的時候就會說他們跑這個軟體然後這樣, 但是不知道背後的演算法。 或是一開始學的能力是串很多軟體在一起,而不是系統性地學習邏輯。 回到我以前學習的方法也不是很好,畢竟一個人沒有任何幫助寫code 也是很痛苦的..

所以第五步的建議是,要了解你跑程式、演算法、程式碼背後的意義。如果你還不知道的話。

把時間拉開,可能到最後學到的知識可能都差不多,但是能更有效率的學習跟少走一些彎路是好的。 要繼續思考如何學習,不管你在哪個階段。

寫到這邊,好像也沒什麼很太多具體的建議像是要學這個還是那個。因為本來不同時間點本來就需要不同的東西。如現在我寫code 的時間越來越少,反而是看學生/人家的 code 怎麼寫,或是很快regular expression 查一下要的東西等等…

好吧,最後一步的建議是regular expression 會是你一輩子很好的朋友還有學無止境。

s/graduate/phd/gi ; xkcd [regex](https://xkcd.com/208/)

還是太多要學,大家加油。


當初是如何學程式語言的-心路歷程跟想法
https://dogoodscience.biodiv.tw/2021/11/18/howtocode/
作者
Jason Tsai
發布於
2021年11月18日
許可協議