我正在开始我的工程研究生学习,并将从事计算科学项目。我注意到这里有一些关于实现自己的算法的优缺点的讨论。当您是刚开始读研究生时,实现自己的算法与使用库的成本效益分析是否不同?
学习计算方法的优先事项,我应该何时编写自己的代码与使用库作为刚开始读研究生的时间?
在我看来,作为一名刚毕业的研究生并不会改变 David Ketcheson对您在帖子中链接的问题的回答。
编写您想学习的算法的最小版本。然后把它们放在一边。编写自己的算法对学习最有用,但对于研究(或生产)代码,除非您的研究目标是编写改进现有最先进库(如果存在的话)的软件,否则您'最好使用库。除非您(或变得)非常擅长编码,否则库可能比您自己编写的代码具有更好的文档记录、更具可扩展性和更健壮。此外,可能会为您测试和调试库(当然,这取决于谁编写了库......)。您将负责支持、调试和测试您为论文编写的任何代码,并且为了节省时间,它有助于最大限度地减少您需要编写的代码量。
我能想到的唯一其他场景(即,可能还有其他场景)是:
- 没有任何库可以提供您需要的功能。考虑为现有的开源库做出贡献或编写自己的开源库,以便其他人受益。
- 您需要额外的性能,并且可以利用特殊的问题结构来获得它。然后记录和修改现有库,或者自己编写更高性能的实现。
- 主管坚持让您推出自己的软件。好吧,你一个人在那里,但我建议提出上面的观点,试图让他们相信你最好使用库(如果在你的情况下这完全可能的话)。
我想对Geoff 深思熟虑的回答提供更多的广度。特别是,我想让你对你的编程工作的价值有更多的看法,而不是你在学术生涯早期的研究工作。
您会发现,能够编写软件来增强您的科学研究将使您成为几乎任何研究团队的重要成员。但是,您的学术同行或招聘学术职位的人不一定会认为这段时间“有价值”。
来自 2011 年普林斯顿大学进行的一项研究调查,“计算科学实践调查”:
科学家花费大量研究时间进行编程。平均而言,科学家估计他们 35% 的研究时间花在编程/开发软件上。虽然最初花费一些时间重新编写代码,但相当一部分时间花费在许多乏味的活动上。例如,使用 R/Stata 的政治和社会学研究人员必须进行大量编程,才能将人口普查数据改造成 R/Stata 中的各个软件包可以理解的格式。一些化学工程研究人员不得不在原作者毕业很久之后,对执行火焰模拟的无证遗留代码进行逆向工程,以使代码适应更新的燃料......尽管如此,这些研究人员中的绝大多数人认为“他们花费比他们应该的更多的时间编程,”
这并不意味着实现或重新设计核心库或应用程序不是一个好主意,但如果您要从事任何严肃的软件开发(超过 25% 的时间都在处理代码),请保留这三个心中的想法。
随着项目规模和开发人员数量的增加,复杂性和风险呈指数级增长。在您编写或与超出实验室范围的更大的软件或开发团队合作之前,您将很难很好地理解这一点并正确预测工作量。
你需要很好。无论是作为程序员还是作为应用科学家,编写有用的软件都需要一定的成熟度。您必须知道重要的特征是什么,数字风险在哪里,并且能够预测给定特征集和稳健性的编程工作量。当然,要想变得更好,唯一的办法就是把时间花在你不是领导的项目上,或者可以安全地失败或延迟的项目上,这让我想到了我的最后一点。
尽管许多研究实验室和工业职位高度重视编程经验,但科学编程可能会对你的学术生涯造成潜在的损害,即使你的软件比你的论文更有利于科学。您花在学习如何良好编程、编程、记录代码并使其健壮的所有时间都转化为没有被编写的论文。顾问在这里并不总是考虑学生的最大利益,因为在这种情况下,学生可以提供有利于顾问团队的工作,而不会有利于学生的引用计数。在您感兴趣的领域中寻找一位或多位值得信赖的导师,并确保您清楚地了解哪些贡献被认为是有价值的。 academia.stackexchange.com是提出后续问题的好地方。
作为一个脚注:显着推进任何计算领域的单人项目的数量正在稳步减少,无论是应用领域还是诸如密集线性代数之类的更技术性的领域。越来越多的构成计算研究“面包和黄油”的软件包已经使用了 10 年或更长时间。尚未达到这种成熟程度的科学代码往往有更多的错误、更少的功能和稀疏的文档。尽量避免使用不受积极支持的不成熟代码,无论它有多旧。
我认为成本效益分析取决于您希望在学习期间达到的科学计算素养。
对于大多数使用计算机的科学家来说,精通科学计算就足够了,这需要:对所使用的主要算法有高级(抽象)理解,以及允许您有效使用软件库(构建软件、链接、使用邮件列表)。
相比之下,如果你打算成为科学计算领域的专家,则需要对数值方法、浮点运算和计算技术有深入的了解。您可以从书籍中学习这些主题的理论,但是需要通过实践获得经验来建立和保持高级技能。因此,在您学习的同时对您使用的所有内容进行编程可能是一个好主意(例如,如果您想像厨师一样做饭:您可以通过吃自己做的东西来学习,并且经常做饭!)
什么是正确的熟练程度取决于您的职业。查看您所在领域的工作人员使用的技能水平。