软件工程发展趋势

注册

 

发新话题 回复该主题

MIT讲师AnaBell安娜贝尔推荐 [复制链接]

1#

计算机是如何工作的?什么是精心编制的代码?你怎么写算法?安娜贝尔是麻省理工学院电气工程和计算机科学系讲师,为您选择最好的书籍来学习计算机科学和编程。

在我们开始读为您选择的书籍之前,既然我们要讨论学习计算机科学和编程,我很想知道你自己的学习途径。你是否很早就对计算机产生了兴趣,还是在上大学的时候就做出了这样的选择?

那是我生命的早期。是通过我爸爸,他是一名软件工程师和电气工程师。在我十一、十二岁左右的时候,他开始建立自己的电脑,让我妹妹和我帮忙。然后他向我展示了Java编程语言,并开始教我Java的基础知识。

听起来像个好爸爸!然后你选择了计算机科学作为本科和研究生课程,从那里你获得了计算生物学的博士学位?

对,在普林斯顿。

生物学通常被选为计算机科学博士相关的学科,但人们并不总是停留在这个领域。这是你的情况还是你还在研究基因组学?

我不再研究基因组学了。当我进入研究生院时,我对计算机科学的生物学应用产生了兴趣,所以我决定把重点放在这一点上。但不幸的是,我没有从本科生那里得到必要的培训,我只参加了生物学基础课程。所以,我经常依靠实验室里的其他学生来帮助分析机器学习结果的领域知识部分。我决定我不想学习基因组学,但我真的很喜欢我在研究生院所做的教学,所以我的职业生涯改变了。

让我们开始讨论学习编程。你对“学会编码”的辩论有什么看法吗?几年前,每个人似乎都认为我们都应该学习如何编码。最近几年甚至几个月,其他人开始说:“实际上,这是一项有趣的技能,但没有基本的计数,写作和阅读才非常重要”。你认为学习编程对每个人都有好处吗?还是说它仍然是一种只对那些想要编程的人感兴趣的高级技能?

这是每个人都应该具备的技能。一旦你能以计算的方式解决一个问题,它很容易自动化,让计算机非常快地为你做需要很多次重复的任务。编程部分很容易获得,您可以在网上找到许多资源,您可以自己学习任何语言。这是一种你可以在日常生活中使用并提高它的技能。

“每个人都应该有计算思维的能力”

但是我们在这里学到的技能是用逻辑或计算的方式思考的想法。它是关于学习一种语言的语法。所以你要有数学背景,你需要懂英语,要想在这两个领域都取得优异成绩,你需要一种不同的思维方式。计算机科学,或者说,以计算的方式思考,在中间的某个地方:你确实需要有一种逻辑的思维方式,但也要有一点点的创造性。每个人都应该有计算思维的技能。

我想这是项目的目标应该是让年轻的学生专注于计算和算法方面的知识,而不是语法?

确切地说,对于孩子们来说,最简单的方法就是使用可视化软件。拖放某些控件,立即看到结果和变化。这是一种很好的教学方式,也是一种直观的学习方式。

你教的是年龄在18到20岁之间的本科生。如果我们把它扩大到任何有兴趣学习编程的人,不管他们的年龄和高等教育背景如何,你会说这有多难?人们常说编程是一种很好的自学技能,在大学里没学过的人以后也可以学。你会同意这一点吗?还是你认为追求适当的大学学位会让你成为一个更好的程序员?

如果你只想学习如何编程,你绝对可以自己去做。甚至小孩子也能学会编程。一个人不容易掌握的困难部分是用计算的方式思考。很难理解一个算法只是一个菜谱,而自己想出新的菜谱就更难了。你需要经常暴露自己,通过编码练习,讲座,与人聊天,或视觉画出想法。我认为,要理解算法,就必须学习一门课程或其他更正式的课程。

另一种普遍观点是,编程在以后的生活中很难学习。你对五十多岁或六十多岁的人有什么经验吗?

你可以在以后的生活中学到它,但它更难。当然,生物学方面是显而易见的:随着年龄的增长,学习任何东西都变得更加困难。但我负责麻省理工学院edX入门课程的在线版本,我们的学生才11岁就上了这门课。这是一个艰难的过程,他们艰难地度过了难关,但是他们中的一些人确实做到了,他们感觉很棒。我们有70岁的人也在参与,他们也能成功。参加edX课程的年轻或老年学生不多,但只要坚持不懈,他们就能做得很好。生物学是一回事,但我认为成功更多地取决于个人。

让我们开始讨论你选择的计算机编程书籍。第一本书是《代码:计算机软硬件的隐藏语言(CodeheHiddenLanguageofComputerHardwareandSoftware)》,作者查尔斯·佩佐德。我以前从未听说过这个,但似乎很有趣。这是一个很好的第一步,来检查你对这个话题有多感兴趣?

我选它是因为它告诉你计算机是如何工作的。很多时候,人们认为显示器就是计算机。我不知道这种误解有多普遍,但这绝对是一种误解!这本书谈到了所有的芯片和门电路,它从一个非常低的水平一直往上走。它让你可以用你的想象力来构建一台计算机。它很容易阅读,你可以躺在沙发上享受它--这不是一本教科书。它揭开了计算机的魔力和它是什么。没有涉及到任何理论,相反,它展示了组件和它们是如何结合在一起的。

所以你会把这本书推荐给所有对计算机编程感兴趣的人,即使他们不想自己开始编码?

一点儿没错。如果你不想学习如何编码,但仍然想知道计算机是什么和它背后的一点历史,这是一本非常好的书。它从组成计算机的芯片一直延伸到像屏幕和键盘这样的外围设备。自从Petzold写了这本书以来,我们如何建造计算机的细节并没有改变。但事情的规模已经变了!

然后,在这本关于编程的入门书之后,如果读者发现他们真的感兴趣并想学习编程,这将是选择一种语言的一个好的出发点。是那么回事吗?

是的,第一本书告诉你硬件的情况。然后,如果您想学习如何编程,您将需要学习一种编程语言。要做到这一点,你不必使用一本书,网上有很多教程。

对于初学者来说,一个不可避免的问题是:“我应该从哪种语言开始呢?”为什么Python经常被推荐?十到十五年前,计算机科学专业的学生开始使用C/C++或Java等低级语言,近年来发生了很大的变化,尽管Python从20世纪90年代就出现了。你觉得有什么特别的原因吗?

第一个原因是更多的人想要学习如何编程,而像C/C++和Java这样的语言很麻烦,所以语法就不那么容易理解了。是什么使Python有趣和容易学的是,它就像一个粗略的英文翻译成代码。你说的是这种蹩脚的英语,如果你大声读Python代码,你经常可以知道发生了什么,这很好。在Python中,您也不必像在C/C++或Java中那样声明变量类型;这使得它更容易访问。你不需要考虑这个方面,语言是为你做的。消除了这些烦人的小事情使Python让每个人都感到愉快。

“很难理解一个算法只是一个菜谱,而自己想出新的菜谱就更难了”

另一个原因是对数据科学的推动,并且通常使用大量的数据。它使Python使用起来更好,因为它接近于Matlab或R等语言,使用Python可以编写简单快捷的脚本,而不需要太多烦人的语言细节。许多不是计算机科学家或程序员的人想要进入这个数据科学的领域,并分析即将到来的数据。可用性使Python成为一种非常有吸引力的语言。

因此,Python肯定是您的明显推荐,或者您认为初学者有其他选择吗?

Python是最容易学习的,如果您不打算从事计算机科学和编程领域的工作,也就足够了。除此之外,Java是我推荐的另外一种编程语言,然后是C++。在这些语言中,您拥有更多的控制,您的代码变得更加高效。如果您处理的是一个关键的应用程序,比如驾驶飞机,那么您将不希望用Python编写该软件!

你最近写了你自己的编程简介,《理解编程:学习使用Python编写代码(GetProgrammingearntocodewithPython)》.你一定从你在麻省理工学院教给数百名学生的经历中收集了很多见解。你在书中做了什么特别的事情,有时在教编程的时候做错了什么?

教授编程没有正确或错误的方法,但有一个特点是,在第四章之前,我并没有真正进入代码的讲解。我的重点是让读者了解什么是计算机科学,并让他们了解事物的思维方式。

Python之所以有趣和容易学,是因为它就像将英语粗略地翻译成代码一样

最早的章节之一是“学习编程语言的原则”,这是一个事实,即你只做别人告诉你做的事情。作为人类,我们可以推断事物;如果有人告诉你做晚饭,你知道这意味着去厨房,拿锅碗瓢盆,使用食材等。但是如果你对电脑说“做晚餐”,它就不知道从哪里开始。所以我试着让读者理解计算机需要非常具体的命令,因为它不知道如何推断任何东西。然后,这本书继续学习Python,同时继续强调这些要点。

在我们深入研究剩下的选择之前,最后一个问题。当然,在五本书中,我们对人们最喜欢的书很感兴趣,但是网上有那么多的资源可以学习编程。你认为用书本学习计算机科学还值得吗?

你这么说真有趣。当我开始考虑这次采访和我会选择的书籍时,我的第一反应是你几乎不需要再读书了。在线搜索要容易得多,速度也快得多。当您有一个问题时,可能有几个人已经在StackOverflow这样的网站上询问并回答了这个问题。书籍无法与之竞争。你能从编程书中学到的是思想背后的思想过程。语言相对于所呈现的概念来说是次要的,因为书中的思想应该对任何编程语言都是通用的。他们应该是相关的初学者,以及那些已经编程20年的人,并与今天的相关,当人们开始编程。我试着把注意力集中在呈现这一点的书籍上:不是特定于语言的书籍,而是那些提出你应该知道的想法的书籍,不管你的编程背景以及是今年还是哪一年的。

你的第二本书是《清洁代码(CleanCode)》作者:RobertC.Martin。它的副标题是敏捷软件艺术手册(AHandbookofAgileSoftwareCraftsmanship)。你能告诉我们这本书是关于什么的吗?

本书将向您展示如何编写自己或其他人可以阅读的代码。Martin以一种非常平易近人的方式编写了它,当我读到它时,我喜欢的是它马上就开始谈论代码。它实际上从最基本的事情开始,就是如何在代码中命名对象。在编程时,您一直在使用对象;因此,要使代码可读性,需要为变量使用正确的名称。这是第一章,这经常被忽视,所以我很高兴看到这一点。

这本书的语气很健谈。再说一遍,你可以坐在沙发上阅读它;你不需要编码。如果你根本不知道如何编程,你实际上可以享受它。每一章的开头都是一个小场景,通常是两个人之间的对话,它为这一章将要讨论的内容设置了场景。这是非常有帮助的,它使它成为一本非常好的书可以坐下来阅读。

这种可读代码的想法是一个传统的建议,特别是从老师到学生。但是可读性,尤其是备注,常常被视为编程中最无聊的部分之一。你如何让自己的学生相信,这不是浪费时间,干净的代码对阅读他们的程序的其他人都是有价值的,但对他们未来的自我也是有价值的?

好吧,我还是没能说服我的学生这很重要!我不知道这是否可能。有时甚至连我都不去做,但是后来会后悔。这是一个不去做的问题,然后在几周后回到你的代码,不记得你做了什么,并从这些经验中学习!我选择的两本书专注于使您的代码具有可读性;因此,是的,它非常重要。

对于初学者或不编程的人来说,“编码艺术”这样的概念往往很难理解。你能解释什么是通常理解的--或者你自己的定义--什么是精心制作的代码?

首先,精心编制的代码是可读的代码.这意味着有描述思想过程和代码试图做什么的注释,而不是它是如何做到的。好的变量名称也属于这一类别。另一部分是组织你的代码。这意味着使用适当数量的类和函数,并立即使用它们。你不想写太多的代码,但是你也不应该写得太少,这样你拥有的代码就很复杂,也不容易理解。您希望有适当的数量使其有用和可重用。

这是完美构建代码的两个主要条件。它们之间的平衡是你无法在自己身上学到的东西。在那里,您需要大量的练习,或者与其他人一起工作,或者阅读其他人的代码。这些是发现坏代码片段的好方法,但是您也会发现完美和完全可以理解的程序。这一工艺部分是编程的创造性之处,也是什么使它有别于仅仅是关于数学的地方。以这种方式更接近学习英语了。

你的第三本书是《完整代码:一本实用的软件构建手册(CodeComplete:APracticalHandbookofSoftwareConstruction)》,作者SteveMcConnell,这是进一步深入到相同的想法,还是这本书添加了不同的东西?

这是一本很长的书。就像《清洁代码》一样,但它走得更远。《清洁代码》给出Java的例子;而这本书的例子用几种不同的语言,强调它所教授的概念不是特定于语言的,应该适用于任何语言。它不教你代码,它教你软件结构:注释,类,调试,重构…

当《清洁代码》向为自己编写代码的个人教授最佳实践,而《完整代码》是为在工业领域工作的人,为公司编写软件,这意味着他们把他们编写的代码给了其他人。它甚至在书中的关键点有很少的清单;如果您在行业中,您可以通过查看这些核对表并确保您涉及到所有方面来确保您的代码是可读的和可调试的。所以它肯定更倾向于工业。如果你对此有兴趣的话,这将是你要读的书。这是一本很旧的书,但仍然很相关。我记得我爸爸读过。

你认为这两本书中提出的概念是什么让你从会编程的人变成程序写得很好的人吗?

《完整代码》除了清理代码之外,还要确保代码也是可部署的,或者在公司或行业中进行更大规模的工作。但是,拥有干净的代码就足以成为一个相当好的程序员。

让我们继续看你的第四本书,关于一个不同的主题:它叫做《算法(Algorithms)》,作者:RobertSedgewick和凯文·韦恩。这是一本关于算法的详尽的书籍。关于这本书你能告诉我们些什么?

这本书使用Java介绍了一些非常基本的算法。这是两位作者写的,我在普林斯顿的研究生院工作过。大学里有两本关于算法的主要书籍,这是其中之一。它们都给出了您需要知道的重要算法,但这一种算法以一种更加平易近人的方式实现。书中看到的每一个算法也都是用Java实现的,所以如果您想要运行它,您可以复制代码并自己执行它。我喜欢它,因为这太实用了。它不会让你陷入数学术语和证明过程之中,这也是我喜欢的。

我不建议你坐在沙发上读这本书,因为你需要更积极一点。但就算法书籍而言,这一本书是相当平易近人的。我想说,如果你要去参加节目面试,这也是很有帮助的。他们通常要求你要么编写一些算法,要么编写一段代码,而事先阅读这本书对于做好准备是非常有用的。

在过去的几年里,“算法”这个词似乎在媒体上对人们对黑匣子和操纵的恐惧有着巨大的意义。我觉得这很奇怪,因为当你学习计算机科学时,算法实际上不是黑匣子。他们是非常清楚,一步一步的程序,你从一个问题到一个详细的解决方案。你认为教育人们什么是算法是有益的,并使我们减少对它们的恐惧感吗?

这是个很好的观点。算法听起来有点神秘,但事实并非如此。它们是菜谱,有一系列从输入到输出的步骤。这很简单,没有什么神秘的或恶意的。如果你要学习计算机科学,或者你想开始编程,你应该在某个时候学习一些关于算法的知识。甚至公众也应该知道,算法并没有什么疯狂的事情发生,即使这个词被随处可见却没有太多的意义。这很简单,就像你用食谱烤面包,或者做一件宜家家具一样。

最后,你推荐的第五本书是《类型和编程语言(TypesandProgrammingLanguages)),作者:BenjaminC.Pierce。这本书似乎深入探讨了计算机编程背后的一些数学理论。你能否试着向我们的读者解释什么是类型理论,以及为什么理解它是重要的?

这本最后一本书相当先进。它是关于编程语言设计的。解释它的最好方法是在物理世界和编程语言之间画一个平行图。如果你想到我们周围的物理世界--物体,自然界的事物,等等--我们已经提出了数学来帮助我们用系统和逻辑的方式来描述正在发生的事情。计算机科学也是一样的,但是对于计算机内部发生的事情来说。围绕这种计算思想,你可以构建类型系统。类型系统是我们想出的数学,它们帮助我们描述计算,或者程序中发生了什么,发生了什么操作。它们帮助我们思考程序在做什么,并且经常帮助程序员在编写代码时避免出错。例如,一个类型系统可能会说:“你试图用一个十进制数乘以一个单词,这没有任何意义。”

你确实需要对数学有很强的掌握,但不是人们所认为的传统数学

这不是一本写给初学者的书,但如果你对编程语言背后的理论感兴趣,它是一本好书。在第一本书中,您了解了硬件,在下一本书中,您了解了好的代码,然后是算法。现在,您可以了解编程语言本身:如何编写一种程序语言,以及它们如何完成自己应该做的事情。

这就引出了另一个我们还没谈过的方面:人们常说,要研究计算机科学,你就需要善长数学。当计算机在抽象层背后隐藏了大量的计算理论,或者你认为要编程好,你还需要对数学有很强的理解吗?

这是个很棒的问题。你确实需要对数学有很强的掌握,但不是人们所想到的传统数学。当人们想到数学时,他们会想到运算,添加东西,做计算。你所需要的数学理解更多的是在逻辑方面:思考二元选择--一些“正确”或“错误”的东西。这种逻辑思维方式,即计算机思维方式,也是数学的一个分支。不幸的是,你只在本科教育中学习它,但你在生活中遇到了很多方面的问题,例如当你在做一个在线测试时,你按照流程图来找出你是哪种狗,你是在用逻辑来找出一些东西。这种数学是非常有用的,这也是程序员的思维方式。但是你必须改变你的思维过程,用编程语言来思考语句,而不是狗的图片!

回到计算机科学的总体上来,这是一个以缺乏多样性而臭名昭著的领域,女性和有色人种的比例非常低。你注意到在过去的几年里有什么进步吗?你在向本科生教授计算机科学方面所扮演的角色似乎是朝着正确方向迈出的一步。

在许多教育水平上都有明显的进步。很多女性参加了我的计算机科学入门课程,因为她们认识到这是一项有用的技能。在我的班上,我们有大约40%的女性,这是相当高的。我们的工作人员有点多--我们有15名助教--其中大多数实际上是妇女。很多时候,女学生会选修这门课程,她们会喜欢这门课,他们将主修计算机科学,最后他们会想要回报。我喜欢这样,因为他们经常想当助教,而且他们非常敬业,他们做得很好。因为我们有80%的员工是女性,那么这个循环就开始了:参加课堂的学生看到大部分的助教都是女性,所以他们认为‘我也能做到!’,这有助于推高收费。当然,推动普通高中计算机科学教育也肯定会有所帮助。

这是我最后一个问题的一个很好的转变:你会给那些想要开始计算机科学事业的高中生提供什么建议?

我会说去争取吧。选择掌握一种语言,坚持下去,尽可能多地学习。不管是哪种语言,即使你从像Scratch这样的视觉语言开始,那也太棒了。它让你开始思考计算机科学,以及计算机思维的逻辑方式。这是成功迈向计算机科学大专院校的一大步。

分享 转发
TOP
发新话题 回复该主题