Liang2's Blog

About | Talks | Archives

Coding 初學指南-總章

Last Edited: Jan, 2016

(如果內容有誤,你可以留言,或用任何管道告訴我)

雖然實驗室不是正規寫程式的地方,多數的人也沒把寫程式當成一回事。不過隨著要分析的資料、樣本數越來越多,多到自己電腦跑不動,server 也要跑很久的時候,就會顯示出程式的重要性。另一方面,現在的研究講求 reproducibility,如果要讓自己的分析在一年之後也能重現,或者讓世界上其他的研究者也能重現的話,需要基本的程式技巧。

這一系列的文章,目標讓實驗室的新生,不論是不是 CS 背景,都能了解當今軟體開發流程及基本技能。軟體開發需要一些背景知識,才能與開發者正常交流。這些背景知識包括:

  • 熟悉在 server 上工作(或 Linux 的使用)
  • 一個很多人用的軟體工具長什麼樣
  • 如何把自己的程式與別人分享
  • 多人共同開發
  • 其他人都怎麼樣寫程式

這些內容在學校課程的訓練中較少,尤其是電機背景的話在寫程式又更為隨性,但這對一個長期的軟體專案是必需的。希望大家能養成這些習慣。

這些主題需要熟練到什麼程度,見人見智,深入下去每一個都夠花幾個月的時間鑽研,但以一個實驗室專題、或要完成的軟體專案來說都不實際,至少老闆一點都不在意。所以個人覺得,最低標準就是在遇到該課題不懂的地方時,「能知道怎麼下關鍵字查」且「查完的結果能看得懂」。

系列文原本放在 Github Gist 上,但現在有自己的 blog 了,就整理到這邊順便更新。

學習方式

每一篇都會是一個主題,主題底下會列出一些資源。主題的最後有學習目標,方便讓你評估自己學到什麼程度。學習目標會給一個明確的任務,我盡量讓它能跟(宅宅的)日常生活結合。通常只要完成前一、二個目標就行了,這也不是功課所以不用給我看。但如果你不介意給我看的話,我會分享我主觀的建議。大部份的任務是沒有唯一的正確答案,只要能解決問題都是好方法。

總之,這些資源不用全看,任務不用全做,大家自己斟酌要花多少時間在不同的主題上。

挑你喜歡的東西盡量鑽,沒有 fu 的就隨便看看會了就好

我會盡量按照難易度排列,中英文的資源都放。

問:為什麼不帶大家手把手教學?

簡單地說沒空。認真地說,大家的學習速度跟底子都不一樣,同步學只是浪費各位的時間。

我大概沒有辦法一個一個項目帶大家練習,底下的很多連結只是提供一個學習的窗口,真正要學下去,都是要花一定時間的。所以也不要抱著「只要讀完這些文章就會了○○○」這樣的想法。

白話的來說,這些背景知識就像遊戲的技能樹,基礎技能要先點好才能點進階技能。要把基礎技能點滿了再練等也可能,但不必要一直練等,大家未必喜歡,現實中也不許你練等不解任務。

一開始可能碰到小問題就要查,或者要連續查很多個網頁被導向四、五次才能稍微解答自己的疑問。這個現象是非常正常的,如果大家能撐過初期這段比較挫折的時期,日後要自學軟體基本上就沒問題了。

熟練來自生活中的實踐

要很快地學好程式,我推薦練習把程式應用在生活中。例如用文字命令列來下載檔案;把自己筆電變成 linux 桌面系統,練習自己編譯軟體、解決各式安裝的狀況。讓自己的電腦成為一個自己能接受的軟體開發環境,並經常的使用它,就能降低對寫程式的陌生與不知所措感。

上面的方法可能稍難一些,負擔比較小的可以開始做「思考練習」。思考練習包含去想生活中的大小事該怎麼寫程式來控制。例如我該怎麼設計一個電梯系統?臉書怎麼呈現大家的動態?只要大概想一想就好了,想不出來也不會怎樣,也不用特別查資料。過一段時間對程式的 sense 也會提昇。

如果需要更硬派的學習方式,不妨把自己電腦安裝的軟體的源始碼都拿出來看一下,加入幾個自己平常用的軟體的專案來修改它,讓它更少問題更多功能(一般叫 contribute)。也可以把實驗室有用到的工具的原始碼拿出來看一下,例如 sratoolkit、cutadapt,看看自己能不能讀懂別人的程式碼。

給 Windows 使用者

建議大家想辦法裝個 Linux(或用 Mac)。如果不想取代掉自己的 Windows 環境話,可以安裝 VirtualBox 裝個虛擬的 Linux,或者在 Amazon 等 VPS 架一台虛擬主機。

Windows 因為對圖形介面(GUI)設計的很好,也不容易讓使用者用命令列模式(terminal, console)。雖然 Windows 上有像 command prompt、Powershell 之類的環境,但都很難用它來操控整個系統。而且它打從骨子就跟 Linux 不一樣,所以相關的指令不好在網上的教學文章中找到,而多數 Windows 的開發者也不喜歡用 terminal。

另一方面,大家對 Visual Studio 的印象都是要收錢的1,這是 Windows 上最完整最好用的開發環境,不想付費的情況下可能就會覺得「寫程式充滿障礙」,更何況 VS 也是圖形化的編輯器,也會不了解背後運作的方式。市面的開源軟體多半在 *nix 上開發,對 Windows 支援度差也加深這個障礙(「想要自己裝但都一堆限制又很容易失敗」)

不用 terminal 的壞處是很難想像自己系統中的軟體為什麼能運作。感覺要寫個有 GUI 的程式都要很厲害,跟自己學過的寫程式都不一樣。但實質上是沒有太多區別的,只是要完成一個能安裝在系統中的視窗軟體,需要的步驟多很多,一般簡單的專案都不會到那個階段。

給 OSX 使用者

Mac OSX 使用者也有這樣的現象,但因為 OSX 在底層用的是跟 FreeBSD 很相似,而 FreeBSD 跟 Linux 相似,所以它的 terminal 環境是很完整的。現在軟體開發者很多人用 OSX,因此網路上 Linux、OSX 資源都很多,兩者的經驗常能自然地移植。

如何在 OSX 上開發程式,可以參考附錄 0 的筆記,但內容很主觀,不是每個人都會像我這樣用。

文章目錄

寫一寫內容也變得蠻多的,所以把它切成了幾篇文章,請按照數字順序閱讀:

或者,用 labcoding 這個 tag 也可以找到所有的文章。


  1. Visual Studio 自 2013 後有 Community 版本,免費但內容與 Professional 版本大致無異,所以未來要有 C/C++ 32/64bit Compiler 會更容易。但多數的開源軟體還沒跟進,所以很多還在用舊的 VS 版本(就要付費),這個現象還會持續一陣。學校都有買。