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