|
| 1 | +--- |
| 2 | +title: "如何学习和练习生物信息学算法,并提高编程能力" |
| 3 | +meta_title: "" |
| 4 | +description: "学习和练习生物信息学算法设计相关的经验" |
| 5 | +date: 2026-01-13T05:00:00Z |
| 6 | +categories: ["经验分享"] |
| 7 | +author: "Wei Shen" |
| 8 | +tags: ["经验", "算法", "数据结构"] |
| 9 | +draft: false |
| 10 | +--- |
| 11 | + |
| 12 | +## 如何学习算法 |
| 13 | + |
| 14 | +就像学习现有软件的使用方法一样,去官网看英文文档是最准确的方式。 |
| 15 | +中文文档读起来更快,但往往不全面,或存在翻译问题。 |
| 16 | +学习算法,最好的方式也是去读文献。 |
| 17 | +不过,如果是比较基础和应用广泛的算法,看中英文介绍也可以。 |
| 18 | +其实我看文献和长篇介绍也头大,所以有时候直接看代码,反而能更快地理解算法。 |
| 19 | + |
| 20 | +如今,大家喜欢都看视频来学习,也是一种不错的方式。 |
| 21 | +但是千万不要局限于中文视频,英文的高质量视频也很多的,多搜总有收获。 |
| 22 | +比如油管上Ben Langmead (Bowtie2 作者)的系列视频, |
| 23 | +如 Algorithms for DNA Sequencing (其实我也没看,不过我看其内容挺广的), |
| 24 | +Burrows-Wheeler Indexing (我看了,但没看完)。 |
| 25 | + |
| 26 | +最后就是,可以在Google Scholar上关注感兴趣的同行,获得特定领域的文献推送,长期关注自己感兴趣的方向,持续学习。 |
| 27 | + |
| 28 | +## 如何提高编程能力 |
| 29 | + |
| 30 | +首先,如果可以,请选择一门编译型语言,比如C/C++/Go/Rust。 |
| 31 | +当然Python也是可以的,只是性能稍差(如果不用其他语言写底层代码的话)。 |
| 32 | + |
| 33 | +接着,除了掌握基础的语法、标准库、常见数据结构之外,最好的方式是通过重写经典数据结构和算法来练手。 |
| 34 | +我重写过CountMinSketch、BWT和FM-index、Minimizer、FracMinHash、Kmers编辑码等, |
| 35 | +后来根据兴趣或需求从文献复现的有StrobeMers、LexicHash、WFA等。 |
| 36 | +WFA是做LexicMap的中途,花了4周全身心投入实现的,后续断断续续做了一些优化。 |
| 37 | +上述的包都在[Github](https://github.com/shenwei356?tab=repositories)开源了的,都能直接拿来用。 |
| 38 | + |
| 39 | +重新发明轮子其实是个很好的锻炼机会。 |
| 40 | +一是锻炼编程(算法、数据结构、性能优化)能力。甚至很多人看不上的、简单的FASTA/Q文件解析,我都迭代过很多版本,从中学到很多。 |
| 41 | +二是启发新的方向,比如[LexicMap](https://bioinf.shenwei.me/LexicMap/)核心算法基于LexicHash,但是我们做了很多大的改进。 |
| 42 | +而其中很多细节和灵感又源自于先前多个项目的积累,包括SeqKit、kmers、unikmer、TaxonKit、KMCP等。 |
| 43 | + |
| 44 | +我为什么要发明那么多轮子? |
| 45 | +因为Go语言缺少很多生物信息学的库;为了保证跨平台编译,又不想使用其他语言的库,所以只能自己写。 |
| 46 | +渐渐的,时间长了,自己也得到了锻炼。 |
| 47 | +如果大家使用的语言有现成的优秀的库,直接用就可以了。不过,原创的算法还是得自己写。 |
| 48 | + |
| 49 | +至于如何进一步提高编程能力呢,这里推荐一本书,《深入理解计算机系统》,我每读一次都能获得一些性能改进的灵感。 |
| 50 | +另外,可以结合一些性能分析软件,比如go的pprof工具,就能更快地优化软件性能。 |
| 51 | +不过有时候,还需要更复杂的技术,比如SIMD。 |
| 52 | +Go语言不支持SIMD指令,但支持Go汇编语言,我还为此花了几周时间从头学汇编语言,来优化一个[函数](https://github.com/shenwei356/pand)。 |
| 53 | + |
| 54 | +最后,一切都要源于兴趣,喜欢并投入大量的精力学习和练习,一定有收获。念念不忘(甚至游戏、洗澡、跑步的时候),必有回响。 |
0 commit comments