生物信息学——用好源代码的技巧与心法

如果你是一名科研人员,在研究的过程中需要用到代码,那么你可能不需要像专业码农那样从头到尾一句一句去写完整的,而是可以将网上的一段符合应用场景的现成代码拿过来直接用。

这听起来是不是很简单?然而实际上...

学会使用他人的代码是现代学术生活的重要组成部分。

本文主要在将行业、现有文献和一些科研人员自己的经验结合起来,为学术研究人员提供相对实用的十条规则。

这10条规则可以分为计划、理解、更改和发布类别。

doi.org/10.1371/journal.pcbi.1011031.g002

下面我们就来详细看一下。

01

明确目标

在正式开始动手写之前,先想一想,你真正想要实现的目标是什么?

是需要计算一些东西吗?

还是需要添加一些代码中当前不存在的功能?

不同的目标需要对应不同的方法。

如果需要计算,那么关键的要求是确信计算是正确的;而如果要添加某些功能,那么可能需要更多地理解代码。

试想一下,是不是每次都需要通过浏览整个代码库,理解每一行代码来实现呢?

明确目标会防止你做无用功,提升效率。这是一个有用的练习。

当你建立对代码的理解时,你的目标可能会改变,这会影响到你如何改变以及是否做出改变。

在学习或者写代码的过程中,要记住这个一开始就已明确的目标,一旦发现行动走偏的时候不断把自己拉回来,不断回到问题,从而以轻松高效的方式完成。

02

选择你的代码库

如果要使用别人写好的程序,你需要在网上搜索,选择一个合适的代码库。那么问题来了,所谓的“合适的代码库”怎么选呢?

几个要点:

当然,其他还可以考虑:

代码库的可访问性、代码的可读性。

也可以考虑选择其他熟悉的编程语言。

有时候别人的代码看不懂,自己的又跑不通,很容易把它全部扔掉,然后重新开始。

到底是否需要重新写一遍代码?

重新写一遍代码也是一种选择。

好处是可以让你更深入地理解代码的功能和运作方式,也就是说可以学到深度知识,这些知识在使用他人代码时很难挖掘到。

一位计算机科学博士说,他们更喜欢编写自己版本的算法来完全理解它们,一旦完成,他们就会使用现有的库。

主要缺点是复制已经完成的工作,这可能很耗时,也不必要。

当然,可以阅读现有的代码和文档,了解如何构建自己的版本。也可以使用旧代码来测试新代码,并检查是否正常。

同时也别忘了第一条,明确目标,从而确定是不是要重新写一遍。

03

阅读文档

阅读文档有什么用?

文档,就像是代码的翻译官,可以帮你理解它们。虽然不需要像看小说一样读完整个文档,但是拿来当参考还是蛮重要的。刚开始接触他人的代码时,简单地浏览一下文档可以帮助你大概了解它们的结构。

文档里有哪些内容?

如果卡在了某个问题上,也可以去文档里找答案。文档通常会包含一些重要、难懂的部分,这些部分我们读了以后会更清楚。即使文档不太好或者太少,也应该去看一看。如果文档实在少得可怜,那么这说明代码可能不太靠谱,不是遵循最佳实践编写的。

文档不仅包括README文件或在线API,还包括代码注释、文档字符串、变量和函数名,以及任何写下来的测试。好的项目通常会有在线文档,里面可能包含“入门教程”,对你上手很有帮助。

如果文档不存在(或不正确),自己加文档

这不仅对你自己很有帮助,而且还能帮助未来其他使用代码的人。文档不一定要多么正式或完美,它就是你对代码的注释。在探索代码时,你可能会记录很多笔记,把它们保存成文档,过个几周或几个月后可以更容易回到代码中学习或修改。

如何加文档?

加文档可以简单地创建一个README文件,该文件通常从较高的层次解释功能,但也可能包括安装步骤或强调如何通过API调用特定函数。另外,你也可以在代码本身中添加或更改注释,解释特定部分是如何工作的。

一个很好的建议是:

想象你下一年回到这段代码时已经忘记了所有内容,这时候你添加文档就相当于在帮助未来的自己。

04

弄清楚怎么跑通它

使用他人代码时的一个基本问题是首先得让它跑的通。这看起来很简单,但实际上却是非常困难的一步。

很多因素导致别人的代码不一定能跑通

不同的代码需要不同的操作系统、编程语言、数据库甚至是硬件,在一台计算机上跑通的代码在另一台计算机可能不行。如果环境不匹配,代码就无法正常运行。

通常,运行他人代码的主要问题是使用正确版本的编程语言和代码依赖关系。编程语言和单个软件包经常更新,有时这些更改是在考虑向后兼容性的情况下进行的,因此旧代码在新版本中仍然可以工作,但有时情况并非如此。

除了编程语言和依赖性之外,使用特定的操作系统、安装特定的数据库或图形卡、传感器等硬件,甚至需要软盘驱动器等。

发现跑不通的时候应该怎么办?

——看error提示

为了弄清楚如何运行代码,最好的第一步是简单地尝试在当前环境中按原样运行它。如果不行,计算机可能会发出一个error,让你知道出了什么问题。

——查看文档

好的文档会清楚地说明预期的环境,包括所需的编程语言和软件包版本。不幸的是,并不是所有的文档都包括这些。

——使用互联网搜索

找出编写代码时软件的最新版本,并从那里往回推。

——创建虚拟环境来运行

当你确定代码需要运行的特定环境时,可以开始在计算机上复制该环境。如果不想更改计算机上的环境,我们可以创建一个虚拟环境来运行代码。虚拟环境允许使用特定版本的编程语言和程序包运行代码。

除此之外,虚拟机可以模拟整个计算机系统(例如,在Mac上运行虚拟Windows实例)。虚拟化有很多选项,最佳选项取决于当前的计算机和要虚拟化的系统。

——目前已有的配置虚拟环境工具

可能是其他人已经制定了运行代码的虚拟化设置。例如:

Conda和DockerHub都是社区驱动的平台,你也可以贡献自己的虚拟化设置来帮助他人(以及未来的自己)。

——利用调试工具深入挖掘代码

可能你遇到的问题不仅仅是寻找合适的环境。例如,可能不清楚需要什么样的输入。当代码的其他部分出现错误时,某些功能可能会正常工作。混淆这些问题,错误信息本身可能无法为问题提供很好的线索。在这些情况下,你可能需要更深入地挖掘代码的各个部分,并尝试弄清楚它是如何工作的。这可能很耗时,需要耐心和毅力。

调试工具可以在这里提供帮助,一步一步地跟踪代码的执行,并查看正在使用的资源和数据类型。当然,代码的某些部分是有可能被破坏的,可能需要进行更严格的测试或进行更改。

05

测试——它是否符合你的期望

为什么要做测试?

一个警示故事:

2006年,GeoffreyChang因软件bug撤回了《科学》杂志上的几篇引人注目的论文。在这些论文中,Chang使用了一些代码来计算蛋白质的结构。

不幸的是,这个从另一个实验室继承的代码包含了一个小错误,这意味着由此产生的蛋白质结构是不正确的。如果进行更好的软件测试,这个问题可能会更早发现。

当使用他人的代码时,测试是一个好方法,可以检查代码做了什么(或没做什么),并验证它是否真的有效。

运行现有的测试

通常,一个项目已经有了测试,找到并运行这些测试应该是起点。这些通常可以在一个叫“tests”或类似的文件夹中找到,理想情况下,文档将包括运行这些测试的说明。

运行测试你会进一步熟悉代码库,也是一种衡量他人代码质量的方法。你甚至可能会发现测试失败,在这种情况下,可以考虑进行更改来修复代码。

编写自己的测试

除了现有的测试之外,你可能还想编写自己的测试。一个好的起点是健全性检查,这可以检验代码是否给出了期待的正确答案。

注:健全性检查是一种数据完整性检查方法,用于确保数据的准确性和一致性,是数据管理的重要组成部分。

健全性检查是值得的,不过自动化测试更彻底。这可以简单到通过编写测试来检查函数的输出是否正确,从而自动进行健全性检查。

——单元测试

通常,这是通过使用“assert”语句来实现的,如果输出不是预期的,则该语句会引发错误。这是一种单元测试的形式,它检查软件的特定单元,在这种情况下是一个功能,是否按预期工作。大多数编程语言都包括单元测试功能或库,其中包括断言语句以及快速轻松地运行许多测试的方法。

——功能测试

另一种常见的测试类型是功能测试,可以检查整个软件是否符合期望。

例如,你可能打算从论文中复制一个图形,这将作为对用于生成图形分析的软件的一种测试。功能测试可以是一种很好的方法,可以检查代码是否做了它应该做的事情,而不必太了解代码是如何工作的。

对于单元测试和功能测试,需要一些数据来检查结果

代码库可能已经包括了一些演示数据,这是一个很好的起点,也是代码所需数据格式的一个好例子。你可能需要添加自己的测试数据,这些数据可能是真实数据,例如在复制图形的情况下。

或者可以模拟数据,例如,可以模拟具有已知参数的数据,以检查拟合算法是否给出合理的结果。

对于真实或模拟的数据集,你可能不知道“正确”的答案,因此在可能的情况下,通常使用另一种现有工具来验证结果。

总的来说,需要的测试的深度和类型将取决于你的具体目标。在许多情况下,一些简单的健全性检查就足以验证代码是否按预期工作。当对代码的质量有疑问时,以及当代码的正确性能至关重要时,需要进行更严格的测试。

06

拆解问题,画出来

一种很好的策略:

将问题分解为较小的单元或模块,然后将这些单元放在一起解决复杂的问题。

同样的事情也适用于使用其他人的代码。拆解代码并弄清楚代码的每一部分做什么,这通常比一次完成要容易得多。

这种方法的具体操作之一是:

绘制代码是如何工作的以及各部分是如何交互的。

这不需要完美,可以简单地用纸笔或黑板快速绘制草图。你可能想可视化代码的结构、数据的传递方式、哪些函数调用其他函数等。只要把一些东西写在纸上就可以帮助可视化系统。

根据项目和目标,你可能会决定通过使用可视化软件设计图形来正式化这些图纸。

可以将其包含在项目的编写中,也可以将其添加到代码库的文档中。对于那些感兴趣的人,你甚至可以使用统一建模语言,这是一种可视化软件系统的通用方法。

07

寻求帮助

研究有时候也是需要合作努力。协作在处理代码时尤其有用,因为每个人在各种编程语言和范式中具有不同的知识和技能水平。利用现有知识是提高自己研究效率的一个很好的策略。

获得帮助的途径有很多:

谷歌(或其他搜索引擎)

-小tips:

一个好的搜索策略是:直接把错误消息复制粘贴到谷歌中。

StackOverflow

StackOverflow是一个有用的资源,经常出现在谷歌搜索结果中。该在线门户允许用户询问和回答特定的编码问题。

一般来说,你的问题已经有人问过并回答过问题。如果你无法通过搜索找到解决方案,那么也可以自己问,基本上会很快得到答案。

也有可能你正在处理的代码库过于模糊,无法直接引用。就算这样,也可以发布代码块或提出更一般的问题并获得帮助。

其他有用的门户网站包括W3Schools和Quora,还有专门研究特定研究领域的论坛,如生物信息学的BioStars。

github

许多项目都会在GitHub上托管代码,这是托管和共享代码库的行业和学术标准。

如果你对代码有问题,比如bug、建议的新功能,或者只是一个问题,那么你可以在GitHubIssues中提出这个问题,项目开发人员会回答或解决这个问题。这是最佳实践,也是许多开发人员提出问题的首选方式。

在提出问题之前,可以浏览你过去的问题,看看是否得到了解决。

其他项目门户网站

正在进行的软件项目通常有各种在线资源来获得帮助。这可能包括Slack、Gitter、Discord和论坛等平台。这些可以从GitHub页面链接,也可以通过谷歌搜索找到。

合作者

如果你有合作者,可以问他们。他们可能愿意提供帮助,甚至可能在过去使用过该代码。

其他研究人员

如果代码托管在GitHub上,可以在存储库页面上检查问题,或者查看它是否已被分叉。或者在GitHub中搜索存储库名称并查找其他版本。

如果运气好的话,可能已经有人熟悉了这个代码库,他们可能会愿意为你提供资源,甚至成为你的合作伙伴。

原作者

值得与原作者联系,他们应该愿意回答特定的问题,甚至提供一些在网上找不到的文档,或者他们可能也想合作。你用他们的代码,他们也会高兴。如果你们合作起来,说不定他们会为你增加一些新功能或修复一些bug呢。

研究软件工程师

08

在改代码之前先思考

当我们想要使用别人的代码时,总是想着要去写代码,改进代码。但是有没有想过:

我们真的需要去改变它吗?

改变代码可能会带来很多意想不到的麻烦,特别是当你不太了解代码的运作方式或者理解不到位时,这种后果就更加可能发生。有些你看起来垃圾的代码可能是出于某种重要的原因而写成这样的。一旦你改变了代码,你就改变了代码的本质,不能确定它是按预期的,还是因为你的改变引起的。

关于修改代码,有本书叫《代码修改的艺术(WorkingEffectivelywithLegacyCode)》

该书指出改代码有

四个原因:

·修复bug

·添加新功能

·重构设计

·优化性能

改代码的目的不是要破坏原有功能,而是尽可能有效地完成改动。所以,我们需要明确改动的目的,只做必要的改动。

改代码的最佳实践应该是什么样的?

在你做任何改动之前,最好先写一些单元测试,覆盖现有的功能,以及覆盖你想要添加的新功能。一旦做出改变,你可以运行这些测试来检查是否破坏了任何东西,更改是否生效。这个过程相对简单。

比如,如果你要重构一个特定的函数,你可以先写一些自动化测试,基于当前函数的输出(也就是特征测试)。改了代码后,你可以运行这些测试,确保重构没有改变功能。另外,记得把改过的地方记录在文档中,包括更改的内容,为什么要更改等。

09

使用版本控制

版本控制是备份、共享、协作和跟踪代码的最佳方式。

很多人会通过电子邮件、共享文件夹来传输代码,或者根本不备份,如果你不经常使用版本控制,那么这条很重要。

当我们谈到版本控制时,通常会想到Git和GitHub。GitHub提供免费账户,其中包括无限的代码存储库,可以是私有的,也可以是公共的。

还有其他选择,比如BitBucket。如果代码(或数据)是敏感的,不能发送到GitHub的服务器上,那么还有像GitLab这样的选择,可以让你运行自己的私人的Git服务器。

学习使用Git难不难?有哪些资源推荐?

学习使用Git实际上入门很简单。你不需要成为专家,只要能够推动和拉动更改就足够了。在这里,我们不会重复介绍如何使用Git的指南,已经有很多现成的资源了。

对于更感兴趣的人,ProGit书籍是一个有用的资源,还有许多其他的在线指南和教程。

如果你拿来的代码没有存储在版本控制的存储库中怎么办?

遇到这样的情况,你可以开始将现有代码移动到一个Git存储库中,并创建一个起始提交,将所有文件添加进去。你自己所做的任何更改都可以像往常一样进行跟踪,使用后续的提交。这样做可以确保始终可以将代码恢复到以前的状态,即使引入了错误,也不用担心继承的原始版本代码丢失。

Git还有什么其他功能?

对于高级用户,Git还提供了一系列有用的工具,例如GitHubActions,可以自动化工作流程的某些部分。这可以包括自动化测试,检查代码更改是否破坏了任何东西,并且项目中的测试是否仍然能通过。

10

为什么要在网上发布代码?有什么好处?

——为研究社区做出贡献

——帮助你的职业发展

在线发布代码将建立你的在线个人资料和声誉,这在申请工作或其他机会时非常有帮助。

——优化代码、书写更加规范

可能有其他人帮你的代码库做出贡献和改进,或者只是发现你忽略的bug。

发布代码是一个好习惯。通常,如果我们知道代码将被发布,那就会有意识地写得更加规范,避免那些可能带来问题的懒惰捷径。

在研究项目的同时发布代码的趋势越来越明显,如果你已经养成了这个习惯,就会变得更加容易。

——增加合作机会

其他研究人员看到你的代码,可能会联系你进行合作。发布代码还将使其他人或者你自己在未来更容易地复制你的工作。

有研究人员讲述了这么一个故事:

在他们发布了几年后有人联系他们合作一个类似的项目,这是一个很好的机会,但他们差点拒绝了——因为他们找不到代码,之前写在一台旧笔记本电脑上的,现在已经无法访问了。幸运的是,他们意识到当时已经在GitHub上发布了代码,因此才有可能达成合作。

GitHub是共享代码的标准平台

在研究和工业领域,共享代码的标准是GitHub。如果代码已经作为现有的GitHub存储库发布,那么你可以“fork”创建一个包含更改的存储库副本。根据这些更改的内容,你甚至可以向现有存储库发起“pullrequest”,将你的更改合并到原始代码库中。

发布更改前需检查软件许可证

如果没有现有的存储库,那么你可以创建一个新的存储库。但是,在发布更改之前,需要注意一点:最好检查一下软件许可证是否允许这样做。

许可证通常在主项目目录中,命名为“LICENSE.txt”或类似的名称。虽然许多研究软件都是在宽松的开源许可证下发布的,但并不是每一个都这样,需要进行检查。即使是开源许可证也可能有一些条件,例如必须注明原作者。

结语

以上总结了使用他人的代码的一些经验,供大家参考交流。学会用好他人的代码,对于自身代码水平的提升也有帮助。毕竟在接触不同的编码实践、设计模式、工具的过程中,你的编程知识和视野都在拓宽。

THE END
1.操作失误!“达观数据”软件受骗背后蚓制毓?操作错了背后猫腻网恋有风险,交友需谨慎!针对网上素未谋面的网友、网上老师推荐网上理财、炒期货的、做外汇的、炒数字货币、虚拟币的、网络交友的等等都是骗局,广大市民对此要提高警惕,遇到此类情况一概不要相信! 达观数据被骗可以追回吗? 达观数据是不是诈骗软件? 达观数据是不是正规公司? http://www.jinmidou.com/23328.html
2.软件安全吗?《达观数据》被骗真相曝光!受骗不能出金有猫腻软件修复数据不让提现怎么办? 软件补信誉分无法出提现怎么追回? 平台操作失误不能提现怎么追回?是真的还是假的? 怎么样被骗了是骗局不让提现怎么追回? 近年来,骗子的手法也是越来越有针对性,据统计,我国还有四千多万男青年处于打着光棍,这无疑给骗子制造了一个巨大的市场。“美女”同城匹配和你约会,先视频确http://www.jujuwan.cn/58842.html
3.警惕让你帮忙测数据的app吐槽|警惕让你帮忙测数据的 网友,说自己做什么平台维护什么的。还没恋呢,就叫我帮他测试数据 这种脑子也来骗人?已举报,长点心吧!别傻乎乎的被爱情冲昏头脑。https://www.douban.com/group/topic/235746084/
4.史上最全数据体验好就好吗?—体验度量篇教程其实在我们的工作中有很多设计方法可以辅助我们设计更好的设计方案,比如用户调研,竞品分析,产品测试等。这些方法都是通过对用户数据的反馈和整理来判断去发掘方案里面的问题、验证最终方案是用户是否满意。 用户调研:可以把字拆解开来看就两个字面意思,调查:反映客观事实。研究:分析客观事实 https://www.ui.cn/detail/606390.html
5.怎样在测试环境使用线上数据验证新功能正常我们在做项目时,通常都会有多个环境,本地开发环境,日常测试环境,预发环境,正式环境等等。 一般各个环境之间除了代码一致之外,其他的或多或少都会有一定的差异,例如配置信息,数据库信息等,其中最大的差异就是项目实际运行过程中产生的各种数据。 那我们怎样才能打造一个和线上环境尽可能相同的测试环境呢,我相信应该https://blog.csdn.net/weixin_38405253/article/details/100806999
6.军人喊我测试数据有风险吗军人喊我测试数据有风险,存在诈骗风险,建议谨慎对待,对方很可能不是军人,不要轻信“数据测试”。随着时代发展,投资诈骗的套路也在不断迭代更新,但凡有陌生人以帮助进行平台的数据测试为由投入资金的,请一定不要轻信,要注意有可能是骗子。网络诈骗是指以非法占有为目的,利用互联网采用虚构事实或者隐瞒https://wen.baidu.com/question/1701973208405209468.html
7.南平市财政局南平市财政局福建省政府采购网上公开信息系统(南平分南平市公共资源交易中心采用单一来源采购方式组织南平市财政局南平市财政局福建省政府采购网上公开信息系统(南平分网)实施运维服务服务类采购项目政府采购项目(以下简称:“本项目或者采购项目”)的采购活动,特邀请下列供应商参加本项目特定合同包的协商。现将本项目有关事项告知如下: http://zfcg.np.gov.cn/upload/document/20221102/60406999b0d6480b9432702f5bf67011.html
8.用mysql语句创建课程信息表mysql创建course表四、测试数据(数据来源于网上搜索的) -- 插入学生表测试数据 INSERT INTO Student VALUES(1, '赵雷' , '1990-01-01' , '男'); INSERT INTO Student VALUES(2, '钱电' , '1990-12-21' , '男'); INSERT INTO Student VALUES(3, '孙风' , '1990-05-20' , '男'); https://blog.51cto.com/u_16099326/9209011
9.网址安卓ap网上买时时彩麻将连连看2 实时现场博彩 捕1.76复古传奇赌博技巧 战神国际娱乐成 超级大乐透开奖号码 百家乐是怎麽骗人的? 澳门一日游攻略 bet体育365官网怎么样 时时彩万能5码 中山利高广场 博彩世界 www 22324cnm 足球官方网站 捕WWW,122pp,COM 凤凰娱乐城备用网址 18.53MB 0好评 225期博彩e族小http://tjzd.cinaoaish.cn/