今天的世界大不同,表現在生命科學研究領域,就是一切都開始進入了大數據時代,無論是DNA序列,顯微圖片,還是質譜數據,研究人員都越來越需要對這些龐大的信息進行收集、整合、處理和詮釋。
對於許多生物學家們來說,這並不容易完成,傳統的科研培訓方式主要集中於科學的基礎原理和實驗方法,而不是計算機編程和數據統計,因此當不少研究人員發現自己需要面對大量的數據量時,他們不知道如何處理這些問題。
目前其實也不乏現成的計算工具,而且不少都是免費的,但對於門外漢來說還是有些難。通常情況下研究人員還是需要深入了解這些界面並未友好的程序,才能運行,而這需要計算運行的深厚知識。
這就會導致研究人員在進行大數據研究的時候,不得不自己編寫一些程序來進行可重複和得到證實的信息處理。然而這些過程也需要小心處理,一不留意犯錯了,就有可能危及數據本身。
近期The Scientist雜誌聯繫了幾位科學程式設計師,了解他們所使用的工具是什麼,如果是菜鳥需要進行哪些訓練等。
選擇一種語言
生物學家可以從各種各樣的程式語言中選擇一種,對於許多應用來說,隨便選擇一種都可以,不過目前最流行的可能就是Python 和 R。「就目前而言,這就像是科學研究的二重奏」,來自加州大學戴維斯分校的生物信息學家Vince Buffalo說,他剛完成了一本名為《生物信息學數據分析技巧》(O』Reilly Media Inc.)的新書。
Python 和 R相對來說都比較好用,但前者能完成多項任務,而後者主要針對的是統計方面的內容,兩種語言都有其各自的使用用戶群,因此具有特定功能預生成代碼(prebuilt code)數據文庫,比如以R語言為基礎的Bioconductor Project (www.bioconductor.org),能為顯微,測序和晶片數據提供模塊。另外Python 公共文庫也有:Anaconda (continuum.io/downloads)。
來自華盛頓大學基因組科學系的助理教授Cole Trapnell利用R語言完成了單細胞基因組數據集的處理,「單一細胞基因組學問題牽涉到許多的統計學方面的內容,R語言很適合。」
此外,還有一種受到大家認可的語言,那就C/C++(Julia (www.julialang.org)),這種語言特別合適用於那些相對較慢或內存密集型任務,Trapnell說。如果能將Python的語法,R語言的圖形靈敏性和C++的速度結合在一起,那就完美了,「這也就是說,這種代碼很好編寫,而且也很快,」,來自加州大學戴維斯分校的遺傳學副教授Titus Brown說,但這需要你花費大量經歷掌握這些語言,他建議,可以選擇你同事已經在應用的語言,這樣他就能幫助你解惑。
所需的工具UNIX 和 Linux系統都有預安裝軟體,如果你沒有,那麼通過作業系統管理員也很容易獲取。Macs系統包含一個現成的Python 解釋器和C/C++ 編譯器,但必須單獨安裝 R(www.r-project.org)。Windows系統在默認狀態下,不包含任何一種程式語言,因此你可能需要自己安裝。
程式設計師還需要的一個工具就是一個好用的文本編輯器,這是用於處理純文本文件的程序,與之相對的就是處理特殊格式的程序,如Microsoft Word。核心程式設計師通常喜歡使用命令行編輯器 vi 或 emacs,在Linux 和 Mac系統中這兩者都有預裝。現在也有一些很強大的可配置程序,但是對於新手來說很難掌握,「這要求你自己想代碼,因此我還是建議使用自己擅長的方法,」Trapnell說。
同時你還需要找到一種能夠用特定顏色標記特殊語言關鍵詞(「syntax highlighting」),語法檢查 (比如說要能找到錯誤的方括號和圓括號),代碼格式,以及處理多種文件的編輯器。
常用的兩種就是Windows系統的Notepad++ (notepad-plus-plus.org),以及Mac和Windows、Linux系統通用的Sublime Text (www.sublimetext.com)。同時還有一種Mac界面可用的AquaMacs (aquamacs.org)。
「我向我的學生強調的關鍵一點就是,儘量少用滑鼠,」威斯康辛大學麥迪遜分校生物統計學和醫學信息學教授Karl Broman說,「每當你將手從鍵盤中移開的時候,就在減慢速度。」
另外,如果你計劃在某個平臺(如 Mac 或 Windows)上從一種特殊語言開始的話,那麼也許你應該嘗試一下集成開發環境(IDE,integrated development environment),這是用於程序開發環境的應用程式,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面工具,這能簡化你的工作。
Mac C/C++程式設計師可以用免費的Xcode (developer.apple.com/xcode), Windows 用戶可以使用Microsoft Visual Studio (www.visualstudio.com)。而對於 R 編程來說,常用的一種選擇就是RStudio (www.rstudio.com)。Eclipse IDE (eclipse.org/ide)是一種支持多種語言的模塊化工具,所有這些平臺的基本版本都是免費下載,有些適用於高級用戶的附加功能也可以獲取。
如何使用命令行
並不是每次遇到問題都需要編程的,可以嘗試調用一些已經完成的命令行簡單腳本,也就是Bash,「Bash可以用於處理文件,」Brown解釋說,「移動文件,循環訪問,重命名等」。使用Bash可以將預生成的工具組裝成自動化工作流程,例如可以利用Bash從一組測序數據中篩選高質量讀長數據,然後連結到一個新文件中,將這一文件傳遞到一組預定義參數分析程序中。
值得參考的命令行工具:cli.learncodethehardway.org/book/.
調試工具
新手程式設計師通常會避免使用複雜的調試工具,如用於描述程序所處的某個點(X代表現在進入這段代碼)的一些代碼。但是調試工具能幫助程式設計師在某個特殊的代碼上停止軟體運行,看看情況,調整錯誤代碼,這在尋找bug的時候尤為關鍵,「每種語言都有一個調試器,這些工具總是值得學習如何使用的,」來自加州大學歐文分校生態學和進化生物學副教授Kevin Thornton說,目前也有一些在線教程,「因此Google會是你最好的朋友。」
使用版本控制程序
Rachel Slaybaugh是來自加州大學伯克利分校的一位核工程學助理教授,她使用C++ 和Python 開發了一種能模擬中子傳遞的計算方法,同時她也研發了他們實驗室最好用的一套代碼訓練方法,但她表示這需要確認實驗室中的版本控制。
版本控制程序(Version-control software),如最受歡迎的 Git (git-scm.com)軟體,能幫助程式設計師精確的了解一個程序版本與另外一個版本之間的區別,而且關鍵在於,如果需要的話還能調轉回去。Git程序是一種免費的開放程序,方便團隊之間的合作,可以分享代碼,利用「fork」,程式設計師能在無需破壞現有代碼的前提下就能驗證新的運算法則,追蹤並融合這些版本差異等等功能。
Git託管伺服器GitHub提供無成本分享,分發和在線存檔代碼的服務,而且也能為你提供指向你軟體的穩定連結。如果需要升級,那麼就需要每月付出7美元(當地價格)。
雖然Git只是一段複雜的程序,但是這「極為重要」,Buffalo說,「而且更重要的是,這種程序有時能力挽狂瀾,如果我的程序中出現了一個bug,我就會去舊的版本中找出它來,然後一個一個版本測試,看看它什麼時候出現的。」
還有一些研究人員傾向於選擇版本控制程序Mercurial (mercurial.selenic.com) ,其伺服器是BitBucket (bitbucket.org),這對前五位使用者免費,其中包括無限制private repositories.
自動化與歸檔
加州大學戴維斯分校的C. Titus Brown近期在PLoS Biology雜誌上發表了一篇經典論文:「Best Practices for Scientific Computing」,被不少本領域同行稱為最佳軟體開發實踐指導指南,這篇文章不僅提到了程序運用的一個關鍵問題,也指出了程式設計師的一些基本概念,如給人寫程序,而不是給計算機;只在軟體能正確的工作後才可優化;文檔裡描述的應該是設計思路和目的,而不是技術細節等等。
其中還有一個基本準則就是讓重複性的工作自動化,「讓一切都自動化,」他說。換句話說,就是每次運行程序的時候不用手動輸入參數,可以將參數輸入到命令行腳本,自動執行程序。這樣就能無誤的操作數據,將數據從一個文件移動到另外一個文件,同時也可實現可重複性。
假設你在運行一個本地建模算法,「如果需要運行10遍,那麼就可以寫一個shell腳本,讓它自動運行10遍。最好不要用手動輸入,因為你有可能會忘了運行的內容,而且也有可能會漏掉部分內容,」Brown解釋道,這些腳本也需要是版本控制程序,這樣你可以將其與幾周前的結果進行比對。
另外一個重要的方面就是不要忘記記錄一切,Slaybaugh 說,在你的代碼上加上批註,告訴同事也提醒你自己相關的內容。如果你計劃與你的同事共享這些代碼,那麼可以用一種稱為「doxygen」 (www.stack.nl/~dimitri/doxygen)的工具進行記錄。doxygen可以根據正確注釋的各種語言原始碼自動創建程序檔案,或者研究人員也可以使用Jupyter Project (jupyter.org, 之前稱為 the IPython Project),以在線注釋的方式交換代碼,數據和文件(Python、R 和其它語言)。
測試你的代碼
Slaybaugh 為新手程式設計師提出了一個建議:開發一個測試包,其組成成分就是簡單的一套能確保程序按你所想的那樣進行操作的函數和數據。這樣當你編寫好自己的程序的時候,就能確保不會改變基底的運算法則,比如引入hard-to-track bug時,「你就能檢測系統,看看是否能通過,」她解釋道,這個過程就像是使用了基準線上的陰性和陽性對照。
Buffalo則說了一個簡單的例子「假設你有一個函數(「add」) ,也就是加合兩個數字,那麼就可以設置一個「test_add」的函數來確保在程序改變的時候,2+3依然等於5。
將數據保存為「只讀」
對於你來之不易的數據,保存時需要額外謹慎,Buffalo說,「可以將數據保存為只讀,」也就是說不要用原始數據進行後續工作,可以拷貝一份,「比如你在Excel電子表格中保存了數據,後來又做一些改動,那麼原始數據就永久不在了。」
尋求幫助
新手程式設計師可以首先找到一個豐富的在線資源,從中尋找幫助,選擇自己想要的代碼語言。Software Carpentry project (software-carpentry.org) 就是這樣的一個免費工作交流組,主要用於科學編程的交流,其中大部分教學材料都可以在線獲取。
Brown也是其組織者之一,他表示這樣的交流組可以安排在一些「成本不是很高」的地點,這樣你就只需要支付旅行和食宿的費用。同時也有一些在線的網站,如Codecademy (www.codecademy.com),還有一些在線的大學教程(例如,lifehacker.com/tag/lifehacker-u)。StackOverflow Web site (stackoverflow.com) 也值得推薦,在上面你可以找到一些答案。此外,你也可以請教你的同事。
尋找好的項目
最後請記住,編程並不是霧裡看花的技能,而是需要解決特定的問題。因此,當你第一次坐下來學習編程的時候,一定是要有需要解決的問題,否則進步會很慢,而且也會缺乏動力。
Buffalo說,如果沒有,那麼也可以嘗試在使用的開放源碼軟體上增加缺失的功能,「找到了想要做的事,就可以挑戰自我,用一種新語言來嘗試,這確實能讓人進步。」