acm-header
登录

ACM通信

BLOG@CACM

为什么科学家和工程师必须学习编程


郭菲力头像

近年来,有一种令人钦佩的推动力量促使更多人学习编程。但是,如果我从来没有接触过编程,我为什么要投入所有的精力来学习呢?对我有什么好处?

专家们通常会给模糊的回答就像声称编程是21世纪的读写能力,它会帮助你成为一个更赋予公民,它使你能够创造神奇的工作纯粹的创造力。

尽管我同意其中的许多说法,但我不相信它们足够具体,足以激励人们投入数千小时精通编程是必要的。

我没有试图说服每个人学习编程,我有一个更谦虚的目标:鼓励科学家和工程师。以下是我对他们的价值主张:

如果你是一名科学家或工程师,编程可以让你的工作速度比不懂编程的同事快10到100倍,并能想出更有创意的解决方案。

凯文的故事

现代的科学家和工程师在电脑前工作的时间越来越长。以我的朋友凯文为例,他在海洋学和机械工程领域工作。哇,听起来他可能整天都在高科技船上组装像百战天龙这样的机械设备从水下传感器收集数据,对吧?这一定是他典型的工作日——安全帽和结实的工作手套。

实际上,凯文只有不到5%的时间在海上;其他95%的时间,他坐在电脑前编写程序,对现场收集的数据进行清理、转换、处理和提取见解。这是凯文大多数时候工作时的样子:

同样的故事也发生在各个领域的科学家和工程师身上:天文学家、生物学家、物理学家、航空航天工程师、经济学家、遗传学家、生态学家、环境工程师、神经科学家……这样的例子不胜枚举。现代科学和工程都是关于处理、分析和从数据中提取见解。

学习的三个理由

在过去的几年里,许多科学家和工程师对我抱怨说,他们在高中或大学时没有人让他们学习编程,这让他们多么愤怒。他们现在意识到,如果他们更早地培养这些技能,他们的工作效率会更高。

基于这些对话,我提出了科学家和工程师必须学习编程的三个原因:

  1. 你可以工作速度快10倍通过编写计算机程序来自动化那些需要手工完成的繁琐任务(如数据清洗和集成)。如果你知道如何编程,以前需要你一周才能完成的与计算机相关的任务现在只需要几个小时。我想不出还有什么技能能让科学家和工程师的工作效率瞬间提高10倍。
  2. 编程可以让你发现更多创造性的解决方案比你那些不懂编程的同事强多了。它让您超越了简单地使用周围所有人都在使用的工具和数据集,从而超越了同行所受到的限制。例如,您将能够编写程序来自动从新来源获取数据,将这些数据与现有数据进行清理、重新格式化和集成,并实现远比只能使用现有工具的同事更复杂的分析。通过这样做,你更有可能做出创造性的创新,而你的同事由于缺乏编程技能甚至不会想到去探索。
  3. 最后,知道如何编程可以让您与实验室雇佣的程序员进行有效沟通,这些程序员负责编写繁重的代码。我不期望你能像专业人士一样熟练,但是你对编程了解得越多,你就越能与他们建立联系并赢得他们的尊重。如果你能激励你实验室里的程序员花更多的时间帮助你解决技术问题(例如,通过编写并行程序运行在一个计算集群上),你就能做到工作速度快100倍如果你不得不独自解决这些问题。

附言

读者的回应主要有两类:

  1. 许多领域的科学家和工程师已经学习了一些编程(例如,Excel, MATLAB, Mathematica, LabVIEW)。
  2. 我们应该努力创造最终用户编程工具,让科学家和工程师在不知道自己在编程的情况下就能轻松完成他们需要的工作。

这两点我都同意。但在可预见的未来,我认为在许多技术领域,编程技能总是与创造性生产力呈正相关的。因此,对于已经掌握一定编程知识的科学家和工程师来说,学习更多的编程知识总是会比那些不那么熟练的同事更有竞争优势。也许有一天,编程会像手工计算积分一样过时,但我怀疑这种情况不会很快发生。


评论


尼古拉斯·墨菲

顺便说一句,我的研究信条(你可能知道,菲利普)是我们必须去找他们,而不是反过来。编程总是一项很好的技能,但要求拥有大量领域知识(需要数年才能获得)的人也成为熟练的程序员(另一项需要花很多时间学习才能胜任的技能)是不可行的。理想情况下,我们应该让ui和工具让他们甚至不知道自己在编程。

也许换句话说,我不认为这些领域有什么特别之处,需要进行通用编程的能力,而许多其他领域已经不得不操作数据很长一段时间,但不需要编程技能。我们已经成功地创建了一些特殊用途的工具,它们的范围足够小,可以相对容易地使用,但又足够广泛,可以涵盖大量的问题。以Excel为例。即使是像金融分析师这样的职业,在最坏的情况下也不得不与SQL进行斗争。我认为,即使这样,要求也太多了。

综上所述,也许我们会同意,当然,也许他们最终确实需要编程,但他们目前拥有的编程工具和他们需要的工具之间仍然存在巨大的不匹配。我同意他们需要学习“编程”,如果你同意我们可能需要改变他们“编程”的含义。;)


CACM管理员

嗨,尼克,

我完全同意你的观点。我希望能够达到这样一个世界:科学家的最终用户编程工具足够强大和可用,使他们能够进行所需的各种复杂分析,甚至不需要考虑他们是在编程。但就现状而言,现有工具能够完成的数量是相当有限的;因此,作为一名科学家,对编程有一定的了解总是会让你比那些只会使用Excel的同行更有优势。当编程技能不再成为科学领域的比较优势时,这是工具已经足够强大的一个标志。或许可以打个比方,如今,能够做曲面积分或几何证明,或在纸上画出相当分散的图,已经不再具有比较优势,因为基于计算机的工具使这些工作变得足够容易。


马克Guzdial

格雷格·威尔逊一直在试图定义当今科学家和工程师需要在计算的哪个部分具有生产力。他一直在改进他的软件木匠讲习班(http://software-carpentry.org),以关注科学家和工程师需要什么,而不是计算机科学家发现有价值的一切。


匿名

请允许我大胆地提出第四个必要的理由:
编程需要你把大问题分解成最小的离散组件,然后通过系统地解决那些更小的组件来解决大问题。在科学和工程领域,90%的时间都需要这种思维。一旦编程迫使您学习如何以这种方式思考,那么将其应用于非编程问题就容易得多了。

*在90/10的汗水vs灵感分解中


CACM管理员

谢谢你的指点,马克!我是Greg的“软件木匠”工作的忠实粉丝,并希望看到更多针对工作中的科学家/工程师的专门编程课程。

CS Ed社区的许多人已经在向各种各样的观众介绍编程方面做了很好的工作——例如,小学/初中的孩子,高中的机器人爱好者,有抱负的数字艺术家——我希望看到更多的延伸到科学/工程社区。

——菲利普·郭


迈克尔Monagan

我正在阅读Phil的声明,我对理由3表示怀疑,理由3声称使用并行计算机可以使工作速度提高100倍。电脑运行速度可能快100倍,但这并不能节省我99%的时间。通常,计算周期并不是衡量生产率的好方法。另一方面,我不认为我们需要“数千小时”才能成为一名程序员。我想是“几百个小时”。一所大学的典型课程是少于40小时的教学和少于120小时的作业。5个编程课程5 x 160 = 800小时就足够了。这是一个学期。这足以熟练使用Matlab / Maple / Mathematica / c++。


匿名

谢谢你的文章,我同意这里所说的。
然而,我的问题是,对于学习哪种语言有什么建议吗?
我每天都使用MatLab,我对C和Java有一定的熟练程度,足以理解发生了什么(仍然有指针问题,呵呵)。
最好的做法是什么,尝试提高我对这些语言的熟练程度,还是尝试学习一种新的语言,如python?


菲利普·郭

嗨,迈克尔,

我声称使用并行计算机比不懂编程的人快100倍(当然这是不科学的),这是在把不会编程的人与会编程的人进行比较,并把他们的请求与编写并行代码的程序员进行交流。

我的想法是,如果你懂编程,你可以花10个小时与程序员沟通你的请求,然后他会为你编写程序。如果您尝试手动执行该任务,可能会花费超过1000个小时(慢100倍)。

此外,只需要数百个小时,而不是数千个小时,就可以熟练掌握用于研究目的的编程。

匿名——这是一个很难回答的问题(听起来没有偏见)。对于初学者,我建议你看看Software Carpentry: http://software-carpentry.org/


匿名

匿名的,

他写道:“然而,我的问题是,对于学习哪种语言有什么建议吗?
我每天都使用MatLab,我对C和Java有一定的熟练程度,足以理解发生了什么(仍然有指针问题,呵呵)。
最好的做法是什么,尝试提高我对这些语言的熟练程度,还是尝试学习一门新的语言,比如python?”我想说这取决于你想做什么。

如果与你合作的大多数研究人员都在使用一种特定的语言或工具,我会说坚持下去,提高你的熟练程度。如果有多种工具,那么用“更简单”的语言学习编程技术可能是有价值的。

确保您理解如何在一段代码的上下文中应用测试来解决科学问题。主版本控制。把你的代码给同事,看看他们能不能解释给你听。然后继续学习如何优化和并行代码——当你有好的、干净的代码开始时,这样做要容易得多。

您可能会对以下预印本感兴趣:http://arxiv.org/abs/1210.0530
利益声明:我和Greg Wilson(上面提到)都是作者。

尼尔。


马丁Leisner

菲利普,

我不确定我是否同意。

使用电脑的人应该熟悉电脑的用途。

但是能够处理执行吗?取决于范围。即使在解释型语言中,您也需要花费大量时间来处理实现。

当每个人都试图“成为一名程序员”时,我认为这是可笑的。编程能力的范围是巨大的。我认为“理解”算法并表达它们比实现它们更重要。


查看更多评论

Baidu
map