R编程语言的创建者推荐的面向数据工程师的最佳的计算机科学书籍

作者:

日期:2022-05-21

注:数据科学通常被认为建立在三大支柱之上:领域专业知识,统计学和编程。Hadley Wickham是RStudio的首席科学家,也是R编程语言的许多软件包的创建者,他选择了最好的书籍来帮助有抱负的数据科学家和编程人员来构建坚实的计算机科学基础知识。

RStudio,的首席科学家Hadley Wickham

以下使媒体对Hadley Wickham的采访:

媒体:让我们谈谈你的数据和计算机科学之旅。今天,你是RStudio的首席科学家,也是数据科学界备受尊敬的人物。然而,你最初的学习和从业背景是人类生物学和统计学。是什么让您走到今天这一步?你是如何开始成为一名程序员的,你是什么时候开始从事数据科学的?

这几乎是一个消除的过程。它始于从高中我直接进入新西兰的医学院,一年后意识到我不想成为一名医生。我决定回到高中时真正喜欢的地方,那就是编程和数学。我很早就开始编程了。我父亲有一台用于工作的电脑,所以我开始探索Word,Excel和Access之类的东西,并编写小程序和宏。我在高中花了一些时间为人们运行数据库,还学习了一些PHP来创建网站。

所以当我开始攻读统计学和计算机科学学士学位时,我已经在做一些编程了。我对计算机科学学位的理论方面的知识与我编程时实际经历的差距感到惊讶。这个学位在当时感觉几乎没用。例如,我上了一门关于算法的课程,在课程中,我了解到将程序的运行速度提高一倍并不是特别有趣,我认为这是一件荒谬的事情(具有讽刺意味的是,这是今天仍然对我有用的少数几门课程之一)。所以我不太喜欢计算机科学部分,但我真的很喜欢统计学部分。

我在奥克兰大学学习,那里是R编程语言的所在地。几乎每个人都在使用它,作为一名学生,我不得不用它来做统计。我发现它非常有用和有趣,并且是一种结合了我兴趣的技能。从那时起,我继续在奥克兰攻读统计学 M.Sc(硕士),并在美国攻读博士学位。

媒体:然后,你是如何决定开始编写自己的 R 软件包的?

作为美国的博士生,我真的很幸运。通常你被分配到你所在部门的一门课程的助教职位,但我得到了一个咨询职位,在那里我帮助其他部门的学生进行统计分析。这给了我源源不断的有统计问题的学生。这让我意识到安装模型是容易的部分。困难的是以一种有意义的方式组织数据,而不是不断努力以正确的形式获得数据,然后将其可视化以了解正在发生的事情。很明显,我反复努力重塑和可视化数据可以被封装在有用的软件包中。

这实际上并不是一个新想法。这是对关系数据库中第二和第三范式的改写,这是我最初的编程背景。但这两种正常形式听起来非常复杂。如果你花了数年时间在数据库上工作,它们是有道理的,但大多数人根本不会理解它们。因此,从某种意义上说,“整洁的数据”包括以对统计学家和数据科学家有意义的方式陈述这些规范。

媒体:在我们深入研究这些书之前,您在学习数据科学时对编程语言有何看法?显然,你最大的贡献是在R中,但你也参与了试图桥接R和Python的项目,你在幕后编写的许多代码都使用C++。如果数据科学家想为自己构建坚实的计算机科学基础,你认为他们是否还应该学习R之外的另一种通用编程语言吗?

这是一个有趣的问题。C++对我来说是一个工具,非常重要,但我的工作目标是编写C++代码,而数据科学家就不必这样做了。作为一名程序员,我认为学习编程语言,看看其他语言如何看待指令和数据,在智力上是令人满意的。但是现在许多数据科学课程将尝试在同一门课程中教授Bash,SQL,Python和R,我认为这是一个坏主意;你永远不会参加一个语言课程,在那里你会被要求尝试同时学习法语,德语,意大利语和日语。

媒体:因此“作为一名程序员,学习编程语言以及他们如何看待指令和数据在智力和知识技能上是令人满意的”

实际上,如果你是一名数据科学家,学习SQL的基础知识非常重要。你还应该对R和Python有最低限度的阅读知识,因为很多数据科学团队都使用这两者。然后我认为你最好专注于这两种语言之一,并真正擅长它,而不是把自己太瘦,在几种语言上平庸。显然,我认为R是一种很棒的语言,但并不是因为我反对Python......我只是觉得R真的很棒!

媒体:在R世界之外,你对数据科学最着名的贡献是所谓的“整洁数据”,这是你在2014年发表的一篇论文中提出的一个概念。您能解释一下什么是整洁的数据,以及为什么它如此重要吗?

我最近意识到这篇论文是四年前才发表的。感觉它过去的时间比这长得多!整洁数据的想法是让人们以一致的方式存储数据,以便他们所有的工具都可以有效地使用它,而不必每次都回忆和重塑它。基本概念非常简单:在处理数据时,请确保每列都是一个变量,以便每行都是一个观察值。当您像这样存储数据时,您的编程生活就会变得更加轻松。

媒体:让我们开始谈谈你给读者推荐的最佳的计算机科学书籍。第一本书是《计算机程序的结构和解释》。这是一本著名的教科书,最初支持麻省理工学院的同名计算机科学入门课程。从那时起,它迅速成为各地计算机科学学习者的参考书籍。为什么它是一本如此重要的书?

一个有趣的轶事是,麻省理工学院不再用这本书来教授它对计算机科学的介绍。他们已经改用Python而不是Scheme,这是本书中教授的语言。这背后的原因是这个世界不再需要更多的计算机科学家;它需要一些,但总的来说,它需要的是知道如何使用编程语言并实现目标的工程师,而不是考虑计算机科学的原子成分。

但是这本书对于像我这样具有高级工程语言(如VBA,PHP和R)经验的人来说非常有用。它们是非常有用的语言,但计算机科学家通常不屑一顾,因为它们在理论上并不纯粹或美丽。本书向你展示了如何构建语言。它给你的最有价值的东西是去创建自己的编程语言的信心和知识。您可以很好地理解在设计语言时必须做出的一些权衡。例如,R做了很多在编程语言中非常不寻常的事情,其中一些可能被认为是错误,但其中很多都存在,因为R试图实现一个特定的目标,因此是按照特定和合理的约束设计的。

《计算机程序的结构和解释》

另一本类似且有趣的书是《计算机编程的概念,技术和模型》,它解释了计算机语言的所有模型以及它们如何组合在一起。但它甚至比计算机程序的结构和解释更复杂,所以我会坚持为初学者推荐这个选择。

媒体:正如你所说,它通过使用Scheme来教授这些概念,Scheme是Lisp语言的一种方言。你认为数据科学家应该努力理解它的基础知识,尽管有语言障碍吗?Scheme是一种具有非常特定语法的语言,在大多数大学中不再向本科生教授。

我不会将Scheme描述为一种有用的语言。这又回到了为什么你应该使用一种编程语言而不是另一种编程语言的问题。你不应该根据每种语言的技术优点做出决定,而应该根据使用它并试图解决像你这样的问题的人的社区来做出决定。今天使用Scheme的社区很小,而且有些深奥,但无论如何,在语言中都有有趣的想法需要学习。R本身是S的混合体,S以及Scheme是1970年代从纯统计学角度设计的语言;所以我学会了它,以满足我的好奇心:为什么R的创造者认为Scheme是如此伟大。最后,Scheme是一种函数式编程语言,而不是面向对象的编程语言。函数式编程目前正在经历使用者兴趣的复苏。

媒体:你选择的第二本书是《算法设计手册》。算法是计算机科学知识的重要组成部分。你能解释一下为什么你认为了解它们仍然很重要,是因为它们大多数都是由像你这样的人为数据科学家实现的吗?

对我来说,这本书说明了名字的力量。今天,在谷歌时代,如果你知道某样东西的名字,你可以通过简单的搜索找到它。但是,如果您不知道要查找的内容,则会突然变得更难找到它。在你的脑海里有一个帮助你解决问题的常见算法的名称真的很强大。当你发现一个新问题时,它可以帮助你提出想法,例如使用广度优先搜索或二叉树等。

《算法设计手册》

媒体:这本书还涵盖了计算复杂性和Big O符号的重要主题。同样,对于数据科学家来说,研究这些主题是否重要,不一定是因为他们需要经常使用它们,而是为了获得需要n*log(n)计算的东西比需要n²计算的东西更可取的直觉?

是的,获得这种直觉是件好事。许多统计理论都是关于测量当一些变量x变为无穷大时数学属性会发生什么,而不考虑计算属性会发生什么。但是,如果你的算法需要n²计算,那么x是否达到无穷大并不重要,因为你永远无法计算它。

媒体:你的第三个选择是《务实的程序员:从熟练工到大师》。这是另一外一本著名的,经常在大学中使用的教材。那么这本书是关于什么的?

《务实的程序员:从熟练工到大师》

这是关于软件开发的艺术,以及思考如何生成好的代码。顾名思义,这是一本非常务实和动手的书籍。它真的帮助我作为一名软件工程师的旅程,能够日复一日地编写高质量的代码,并确信它会正常工作。这是我们在我的计算机科学教育中从未真正谈论过的事情,当然也是统计学家很少想到的事情。目标是将脑海中的想法转化为有效的代码,并且可以与他人共享。

媒体:那么,您将如何定义“好代码”呢?

我认为有三个主要部分。首先,代码要好,它首先必须是正确的,并做你认为它能做的事情。理想情况下,您希望通过编写单元测试来正式验证代码的正确性。单元测试的想法与复式记账相同:如果你在两个地方都记录了所有内容,那么你在同一个项目的两个地方同时出错的可能性就非常低了。因此,单元测试不能保证您的代码是正确的,但它们使它更有可能是正确的。

但是,代码的要求也会随着时间的推移而变化。因此,第二部分,也许是更大的部分,是编写将来正确的代码,即易于维护的代码。例如,编写能够清楚地传达其意图的代码非常重要;因为六个月后你会回来,也许完全忘记了你当时想做什么。因此,代码的可读性越强越容易被理解并了解正在发生的事情越容易,将来添加新功能也就越容易。

“在编写代码时,您总是再与未来的您合作;以及过去您没有回复的电子邮件”

第三部分是确保它能运行得足够快,这样它就不会成为瓶颈。很容易(而且很有趣!)被这冲昏头脑,并痴迷于编写速度呈指数级增长的代码。重要的是要确保没有任何东西会过度减慢执行速度,以至于中断分析进程,或者意味着要求程序必须在一夜之间完成运行。但是,如果你的代码不正确和不可维护,那么你的代码有多快并不重要。

媒体:在类似的主题上,您推荐的第四本参考书籍是《可读代码的艺术:编写更好代码的简单实用技术》。在学习编程时,特别是在与他人协作时,经常强调编写可读代码的重要性;但这也是一个在日常工作中容易被忽视的方面。这本书对此有何帮助?

《可读代码的艺术:编写更好代码的简单实用技术》

编写可读代码的问题不在于识别问题;你可以很容易地判断你的代码是否可读可以容易被理解。挑战在于知道如何让它变得更好。软件开发社区经常使用代码“闻起来”的说法,说它写得很糟糕。我喜欢这本书的原因是,它给了你一系列的技巧来让这种气味消失。

媒体:这与你的第五本选择的书籍密切相关,但这可能是一个不太受期待的选择 ——《风格:清晰和恩典的教训》。这也是关于编写的,但不一定是编写代码。你为什么会选择它?

同样,很容易看到一个句子或一个段落,并说它没有意义或写得很糟糕。这本书给了我分析文本的工具,并找出它不起作用的原因,例如只在段落中间陈述一个段落的主题。我发现有意识地分析我自己的写作非常有用。这对编程很重要,因为显然你正在与计算机交流,但更重要的是你正在与其他人交流。人类更难相处,因为你不能写单元测试来检查他们的理解。即使你是唯一一个在特定项目上工作的程序员,你实际上总是在和未来的你合作。以及过去 - 您没有回复的电子邮件。

《风格:清晰和恩典的教训》

“写得好,描述得好,对一个好的程序员来说,是非常有价值的,对一个数据科学家来说更有价值”

知道如何清楚地编写有助于你清楚地编写的代码,也有助于你编写好的文档并解释你正在做什么的意图。即使是非常好的代码也只会告诉你某些东西是如何实现的。它不会告诉你为什么选择特定的技术。写得好,描述得好,对一个好的程序员来说非常有价值,对一个数据科学家来说更有价值。如果你不能向别人解释你做了什么,为什么它有意义,以及从中得到什么,那么你的数据分析有多棒就并不重要了。

媒体:你区分了为计算机写作和为人类写作,但你工作的特征之一是使用风格和清晰度的元素来增强R语言。您经常谈论代码中语义和语法的重要性,例如在ggplot2中,这是基于图形语法理论的数据可视化软件包。在tidyverse完全改变了数据科学家用R编写代码的方式(包括标志性的“管道”)中也可以看到这一点。是什么让你在编程中如此重视语义和语法的?

部分原因是另一本书几乎进入了我的书单中:Martin Fowler的《领域特定语言》。它谈到了在另一种语言中编写一种小语言的想法,以表达特定领域的想法,以及“流利”界面的想法,你可以像阅读和写作人类语言一样阅读和写作。实际上,例如苹果公司(Apple)曾试图编写与人类语言完全相同的编程语言,我认为这是一个错误,因为人类语言效率极低,并且依赖于语气和肢体语言之类的东西来澄清歧义。但是,考虑如何使计算机语言尽可能类似于人类语言非常重要。它可以采取简单的形式,比如将函数视为动词,将对象视为名词,因此您可以利用来自人类语言的语法直觉。

我最近一直在探索的另一件事是外语问题。tidyverse让你可以访问所有这些动词,但它们都是英语。我们应该有整洁的翻译吗?我们能有一个西班牙语的整洁语,与西班牙语动词的等价物吗?当然,这引发了许多问题,最大的问题是StackOverflow等网站上75%的可用资源都是英文的,所以答案不再是通用的。但这是一个有趣的领域,我们正在进行小型实验。有一群讲西班牙语的人正在翻译《R for Data Science》的书,其中包括翻译其中使用的一些数据集。我非常有兴趣看看它的发展方向,以及它对各地有抱负的数据科学家有多大用处,特别是当R迅速各地的使用者对该主题的访问时,而这远远超出了学术界。