生物信息學需要掌握C++嗎?
我最近在學習上有些疑問,自己在網上找了很久,也沒有頭緒。我自己在學C++,剛剛入門,也慢慢開始懂得相關的一些其他語言,也因此有些迷茫,如果我以後想從事生物信息的話,需要精通C++嗎?還是說把時間再用來學習javascript之類的腳本語言呢?此外,我還想知道對於資料庫我需要掌握到什麼地步呢?希望能給我指明方向,不然我在學習的過程中產生很大的迷茫,不知道現在學的東西日後是否有用,我希望有的放矢,謝謝!
先說一個觀點,凡屬搞計算的,C語言都是應該學學的。沒有一點C語言基礎,很多計算機的基本概念都理解不對。lh3大神的BWA是C寫的:lh3/bwa 現在流行的FPGA也頂多就抽象到C語言了。
回到樓主說的C++:
計算機背景的,要做演算法和工具開發的,C++還是很重要的。直接用C寫還是太痛苦了。比如,比如 @銳邦 @李英睿 余昶和李瑞強等人開發的SOAP系列,基本上都是C++寫的。如果要調用CUDA一類的東西,C++也少不了。
如果是生物、醫學背景,更多是應用層面的工作,做流程設計和開發,對結果進行分析解釋的,C++的重要性就低很多了,我看很多沒學C++的也做得很好。Python現在是主流了,R也經常用,翻完小駱駝準備點Perl的基礎知識也不錯。絕大部分情況都能搞定了。
統計或者搞機器學習的,就看具體需求了。一般的建模和測試在R、Python裡面也都能搞定了,TensorFlow這類系統也解決了很多問題。hadoop的整個生態也都有Python的介面。
想繼續修行的話,生物信息這行業涉及的東西太雜了,而且經常要用到別人開發的工具,多學點反正都沒壞處。把握好自己的核心能力就行。
碩士寫了3萬行 C++代碼(個人感覺那時代碼質量不算高)。博士寫了快四年C++代碼。
中間用過python,perl,java,scala。
如果你是純做數據分析的話,學C++是吃飽了撐的。
但是如果做演算法,寫各種軟體,需要掌握C++。大部分生物信息工具都是用C++寫的。
因為C++程序運行快,內存消耗少,並行,編譯器優化都非常牛逼。
C++11出來之後,寫代碼的速度也明顯提升了。
C++之父Bjarne Stroustrup在剛剛開幕的CppCon 2017上的第一篇演講里舉了一個例子
他看到一個生物學家用python跑了三個月來獲得想要的數據
而它覺得這事情十分鐘就能搞定了
學好C++還是很重要的
c++的應用場景應該是那些非常偏工程的場景,追求高速度啥的。就一般研究而言,R perl python matlab shell使用居多。
需要。
首先生物信息學也是計算機相關學科。凡是和編程和演算法相關的專業,我覺得C語言是基礎,是必須要學一學的。C語言能教給你的最重要的事情,就是讓你對「計算機計算」這件事情有一個不錯的了解。對計算機能做的事情充分掌握。當然這些東西通過學習計算理論、計算機系統結構、演算法導論等課程都能掌握,聽起來也沒有什麼非學C的必要。不過使用C/C++編程的時候對這些的親身體會更為重要一些。
如果你自己覺得自己是非計算機的,比如本科是生物或者醫學出身的。演算法和程序不需要了解太深,那麼不學C也是可以的。
相對的,你也只能處在底層的利用別人的工具分析的階段,一旦這些工具中出什麼問題或者想針對自己的需求修改這些工具的結果就很困難了。
再加上數據挖掘、機器學習其實離生物信息學並不是那麼遠。
而且只會C/C++肯定是不行的,選擇方便自己的工具也是很重要的。C/C++也只是工具的一種。在統計分析方面R就很方便。如果想自己做神經網路結構的話,python也很好用。
不過到了實用的方面,你做的東西走向產品化。C++就變得非常重要了。C++經常被使用在需要效率的地方,而生物信息學不少方面的數據處理的數據量並不小。我自己就重構過一個關於DNA數據分析的python-&>C++的優化,目的就是提高效率,結果是快了約1000倍。現在看到有些人為了繼續提高效率都開始上FPGA了。所以做生物信息不需要關注效率可能是個偽命題。
當然你說不會C/C++影不影響出研究成果,我覺得基本是不影響的。研究還是點子更重要。
就不能說點真話?怎樣的水平才能寫出速度快過numpy+numba+cython的python程序?放心吧,python那層糊的性能損失,jit會給你優化的。
掌握了c++還搞個毛的生物信息。
不要。只要你不打算做底層優化,別說 C++,整個計算機系統的知識都用不到。
演算法是語言無關的,拿 Python 實現說不定要省事一些。
遇到性能瓶頸的時候,如果你實在懶得搞 C++,多買幾個顯卡,玩 CUDA,這個玩意兒提供多種語言的介面。
另外如果你熟悉 Java 的話,Java9 引入了 AOT,把那個 JVM 扔掉之後,性能說不定就能達到要求了。也是一個選擇。
看課題方向啦
如果是側重於數據分析或者統計建模/機器學習,用python即可。python可做膠水語言,也可做數值計算,做這兩樣時速度不比c++慢,而且開發起來方便很多。
如果開發bwa、bedtools之類的處理序列數據的演算法和工具,還是用c++更合適一些。有點驚訝這樣好的問題沒有清華的同學來回答一下......
學生物當然要掌握C++啊,這可是吃飯的本事。
要是我當年報考的是生物系,也許現在我已經是個優秀的C++程序員了(手動滑稽)
博士做的課題應該也能勉強劃入生物信息的範疇,強答一下
博士至今兩年,大概一年半花在碼代碼上,碼的代碼是C++。
最早我的演算法是用MATLAB寫完的時候,我的工作站(12核志強)大概得跑一年多才能跑完我想跑的(其實是老闆想要的)東西。我想著這不行,博士畢不了業了。後來入坑C++,雖然十多年前初高中接觸過C++,可是如今的C++已經幾乎面目全非,說的就是C++11,邊實現演算法邊學,期間大概學了怎麼寫並行,怎麼寫cache友好的代碼,怎麼跨平台,也包括怎麼寫matlab的mex擴展以及未來打算也寫一個Python的擴展。隨著不斷的學習,演算法也有改進,目前是大概半個月就能把我想跑的東西跑完了。
如果跑出來的結果能發多一點牛一點的paper,就好了。
要是想入門的話,還是先別想著學什麼語言了,先結合著論文把各種類型的應用場景跑一跑,比如:醫學檢測類(reads-bam-vcf-注釋excel),轉錄組方向(比對計算差異表達基因等),基因組裝方向,微生物風度/多樣性計算,腫瘤方向等。
再說編程語言,
比較基礎的底層的工具如比對,組裝用C/C++的比較多,以後估計也是,但是感覺好像該有的差不多都有了。
變異檢測GATK,JAVA寫的,夠用。也有其他的比如SV/CNV檢測可以再發展發展,語言無所謂,速度湊合。準確性要有保障就行。
最上層的就是數據展示了,學學R,JS之類的,看上去才高大上。
總之,做生物信息的別把自己真當成程序員,入門時候多研究生物問題,有基礎了多搞搞統計演算法,等你有威望有聲譽時候規劃幾個HGP層級的項目
如果想要讓自己走的更遠,可以去嘗試
就大多數人對生物信息學的理解來講,可能確實用不到。
我在此推薦一個思考邏輯吧
- 首先,你要更明白自己需要解決什麼樣的問題,這個才是關鍵。
涉及對性能有追求的(例如大量高精度計算),學一學C++。(即使是這樣,其實上手也沒想像的那麼慢的,並不用掌握C++的全部才能讓你開始做事)
僅僅是一般規模的計算,或者算力性能不是瓶頸,學學腳本語言比如python,會上手比較快。
2. 問問你實驗室師兄師姐,老闆,他們用什麼你就用什麼。先上道。後來理解深了,知道想要什麼了,也不會來這裡再問,需要啥就直接去學。
只想說,如果做數據處理,很管用,c++處理文本數據的效率,不僅超過其他語言,就是不同的編譯器,速度都會幾十倍的差別
學Python吧,簡單易學,功能強大。很多機器學習,大數據處理,分析,有現成的包。c++,就沒必要了,等你精通c++,你也畢業了,不要買櫝還珠,對你來說這只是工具
語言的選擇取決於你自己未來的方向。
如果你準備從事生信的科研,聽@鄒一禾 的。如果你準備畢業後走向社會,聽@陳鋼 的。這主要看你從事的方向。
如果是科學方向,不追求用戶體驗,不追求速度和資源佔用,perl或者python,再加上會一點R語言足夠了,還可以搞搞SQL語言。
如果是技術方向,尤其是搞演算法寫軟體的,追求用戶體驗,會C++或者Java什麼的還是很有用的。
希望能幫到你。
生物信息入門的話還是學perl、R比較好。腳本語言大多會用perl,統計作圖等用R。這兩種用溜了就能解決大多數問題了。後期想要提升還可以學一學python之類的。不想著轉計算機的話完全沒必要學C艹。
推薦閱讀:
※如何實現一個C++反射庫?
※如何勸說上級更新 GCC 和 VS 的版本,並把項目遷移至 C++11?
※關於C++虛函數表構造?
※是否有去除c++多餘頭文件的工具?