acm-header
登录

ACM通信

BLOG@CACM

教一个高度积极的初学者编程


在过去的一年里,许多计算机科学教授和教育专家都写了关于如何做到这一点的文章mooc正在扩大CS教育的规模给成千上万的学生。我将在这里采取不同的方法,讲述我如何花了九个月的时间教计算机编程的故事一个学生。

从2011年7月到2012年3月,我教基础编程布莱恩·戈德他是旧金山湾区的一位资深企业家,在市场营销、销售和产品开发方面拥有丰富的背景。Brian一开始没有任何编程经验,但在几个月内,他就能够构建了SwearBuy这是一个免费的网络应用程序,人们可以在上面分享他们喜欢的产品的评论。更重要的是,Brian获得了独立寻找和学习更先进技术材料的能力。我最大的贡献是指导他越过那些通常会使初学者泄气的障碍。

背景

布莱恩从我的个人网站因为它包含了一些关于计算机科学教育的文章。以下是他2011年7月发给我的第一封电子邮件的节选:

我们还没见过面,但我想问问你是否能给我一些建议。

我在网上寻找能帮助我学习更多计算机编程知识的导师时发现了你们的网站。具体来说,我正在寻找一个人谁将能够与我见面1-2次/周为短,1小时的辅导会议,而我工作的方式通过CS课程的早期阶段。

我从MIT的OCW 6.00课程开始。虽然OCW和其他在线资源很好,但我认为如果有人能帮我解决问题,可以审阅我的工作并给我反馈,我可以进步得更快,提高我对概念的理解。

考虑到你在麻省理工学院和斯坦福大学的历史,我想你可能认识什么人可能感兴趣,而且很适合?或者,我应该去的地方?当然,我会为他们的时间付钱。

因为当时我不是很忙,所以我主动提出亲自辅导布莱恩。我们第一次见面是在他家,第二次是在附近的一家咖啡店。然后我去参加了一些学术会议,所以我们在那里进行了第三次辅导Skype在线视频电话服务。我们使用Skype的屏幕共享功能,这样我就可以在我们聊天时看到他电脑屏幕上的内容。这种形式非常有效,所以我们决定通过Skype进行所有后续的会议。我只亲自辅导过布莱恩两次,但我们进行了超过50个小时的Skype视频通话(大约40次)。

一开始,我们都惊讶于只在线的Skype格式在我们的会议中发挥了如此出色的作用。这甚至比我们在嘈杂的咖啡店见面,围在一个小小的笔记本电脑屏幕前要好得多。使用Skype的屏幕共享功能,我可以在自己舒适的公寓里查看布莱恩的电脑屏幕,并与他实时互动。如果我需要画草图,我会和他共享我的电脑屏幕,用一个数字笔平板电脑.(萨尔曼·汗开始制作他现在举世闻名的教育视频时,也是用类似的方式教他的表兄妹们。)

基于项目的学习

Brian的目标是学习基本的编程技能,以充实自己;他并不是想找一份专业程序员或计算机科学研究员的工作。在我们见面之前,Brian已经花了几周的时间通过遵循的课程自学Python编程语言计算机科学与程序设计导论“,(OCW 6.00)从麻省理工学院开放课程。我们在最初的几次辅导课程中学习了基于课程讲座和家庭作业的基本编程概念。

然而,我很快意识到,仅仅从学术教材中学习并不能让布莱恩充分投入,特别是他已经大学毕业将近20年了。他似乎不太热衷于把自己局限于学习计算机科学术语和做与数学相关的为本科生设计的难题。

因此,我决定教Brian成为一个实用的业余程序员,而不是一个博学的计算机科学学者。我鼓励他试着去想一个他愿意为自己和他的朋友开发的软件。我的角色是在他构建软件项目时指导他。这是一个如此简单的想法,但它运行得非常好。

布莱恩想出了一些想法,并最终致力于这个概念,并最终变成SwearBuy.在接下来的9个月里,他每周都要花上几十个小时来打造SwearBuy,经常工作到深夜。我们每周安排1到2次Skype辅导课程,每次持续1到2小时。在这些电话中,我花了大部分时间回答布莱恩的问题,帮助他发现和调试软件bug,有时结对编程和他一起写新代码。我很少一次讲课超过几分钟。除了对他来说非常吸引人之外,这种以问答为基础的形式对我来说也很方便,因为我很少需要在会议前花时间准备。

基于项目的学习非常有效,因为Brian非常关心自己初出茅庐的创作。他的学习是根据需要,而不是预先设定的千篇一律的学术课程。由于他对SwearBuy充满热情,他会想出很多新功能的想法。他将不可避免地需要学习新的编程技术来实现那些想要的功能。因此,我的职责是:

  • 评估他想要实现的想法的可行性,如果有必要,引导他实现更简单的想法,
  • 选择最适合他学习需要的编程工具、习惯用法和技巧的子集,
  • 给他找合适的资源(例如,示例代码,博客文章,在线教程,甚至书籍),这样他就可以自学,
  • 并在他难以理解或应用自学的知识时回答他的问题。

在计算机编程中,完成同样的任务有几十种甚至上百种方法;如此多的选择可能会让初学者感到不知所措。由于可能性的空间如此之大,他们根本不知道从哪里开始。我的主要工作是将可能的空间缩小为可管理的概念集,以便在Brian项目的每个阶段学习,让他自己努力学习,然后在他遇到困难时回答他的问题。

我从事和教授编程的十年经验使我能够在每个决策点上缩小可能的选择集,选择我认为对Brian的学习最好的。具体来说,我选择让他使用编程语言的基本特性,如Python、JavaScript和SQL,“从零开始”构建SwearBuy,而不是在复杂的web应用框架之上构建。尽管Brian必须编写更多的代码来“从头开始”实现所需的功能(这是一个具有误导性的术语,因为没有什么是真正从头开始的),但他能够更深入地了解各个组件是如何“在底层”工作的。

Brian的项目是我们所有Skype对话的一个很好的基础,因为我可以在任何给定的时间在他想要在他的项目中完成的背景下教授新的概念。再多编造的教科书例子也无法弥补学生亲身投入的真实应用。

Struggle-Based学习

Brian通常在与我进行1-2小时的Skype通话之前独自进行10-15小时的编程,所以他总是有很多紧急的问题和新编写的代码,他希望我帮助他调试或改进。如果我只是在没有任何背景的情况下给他上课,他就不会把课程内化得这么彻底。他可能会点头说,“嗯哼,好吧,有道理……酷。下一个是什么?”相反,因为在我们的辅导课程之前,他通常在与具体的、与代码相关的问题作斗争——常常到了沮丧和沮丧的地步——他的回答更像是这样:“呵呵,哇!现在我完全明白了!”每当我指导他解决一些他当时似乎无法解决的问题时,他就会感到很高兴。他的喜悦和轻松总是显而易见的。我认为内化知识最好的方法就是先花上几个小时的时间在这种挣扎中变得心烦,然后才得到导师的帮助。

为了让布莱恩的经历不那么痛苦,我负责it基础设施的设置和其他对他的学习没有直接帮助的“垃圾工作”。我希望他能够致力于实际的编程和构建SwearBuy,而不是将时间浪费在一些无关的问题上,如设置网页服务器或版本控制系统。(当然,如果他的目标是学习成为一名系统管理员,那么我会让他努力完成这些任务。)

有很多流行的书籍、在线课程和现场研讨会声称可以在7天或3周内教会你编程(或其他技能)。很明显,你不能掌握一项新技能几周后但我认为没有人真的相信他们能做到。这种“快速掌握技能”方案的真正危险在于,它们没有强调可持续性。这些课程就像时尚的饮食这可能会让你马上减掉10磅,但除非你养成可持续的好习惯,否则你无法保持体重。同样地,除非你坚持奋斗多年,否则你是不可能精通编程的;但是为了保持动力继续奋斗,你必须做你热爱的事情。奋斗并不有趣,所以没有适当的动力,很容易过早放弃。

当布莱恩意识到他不再需要我做他的导师时,我就知道我成功了。尽管他承认要成为一名熟练的程序员还需要多年的努力,但他开始看到如何以目前的技能水平实现这一目标。在过去的9个月里,他已经学到了足够的东西,可以继续自己学习。我很自豪,我给了他足够的知识和智慧,让他继续自己的生活,而不是给他提供另一个“快速掌握技能”的时尚减肥计划。

封闭的思想

在我们的辅导课程结束后,Brian反思道,尽管他珍视这种“边做边学”的哲学,但他仍然相信平衡基于项目的工作与基于传统计算机科学课程的教学是有很大价值的。在创建SwearBuy时,他经常使用大量谷歌搜索、技术博客阅读和复制粘贴代码,“只是为了让事情正常工作”StackOverflow线程。结果,他觉得自己经常陷入次优解决方案,或者使用自己并不深刻理解的概念。Brian的一些最大的超前思维飞跃发生在他从日常项目中后退一步,从课程或书中学习新概念,然后思考如何将它们应用到SwearBuy。

自从2012年3月我们结束了最后一次辅导课程后,我有6个月没有听到布莱恩的消息。他最近给我发了一封电子邮件,提到他刚刚写了一个Python脚本来帮助他建模个人股票投资:“我对这个剧本感到非常自豪,因为这是我第一次创作出既实用又纯粹为个人所用的剧本。我当时正在评估一项股票投资,想要模拟一系列场景。我开始在电子表格中建模场景,直到我意识到电子表格不起作用,但python是完美的。”

我很喜欢这封邮件,因为它展示了编程如何使他能够完成一项原本会很乏味或很难完成的任务。我希望每个学习编程的人都有自己的“跨越悬崖”时刻,他们开始为自己编程,而不仅仅是为了学校或工作任务。

我要重复的陈词滥调是动机是一切.布莱恩对自己的项目非常感兴趣,所以他几乎是自学的。我所要做的就是稳步地引导他走上一条有效的道路,使他的奋斗主要指向有用的学习。

我的经验对教绝大多数远不如布莱恩有上进心的学生有多大帮助?这种方法在一对一辅导之外的推广效果如何?我不知道。我所知道的是,如果你能让学生真正有动力,消除不必要的学习障碍,并在适当的时候给予他们鼓励,那么他们实际上会自学成才。


评论


匿名

菲利普好的文章!非常赞同基于项目和奋斗学习的方法。这是我们在芝加哥的新手联盟用的配方。参加我们项目的学生都很积极,想要解决个人问题。对于初学者来说,这些成分对于获得编程的良好开端是至关重要的。


匿名

太棒了!我完全同意布莱恩的看法。我一直在MIT OCW和Codecademy的CodeYear工作,如果能有一位导师不时地回答我的问题,那将是非常有帮助的。


鲁道夫Olah

这是一篇有趣的文章,我喜欢它倡导的基于项目的学习方法。我认为Alan Kay和Seymour Papert以及其他许多人都提倡这种方法当你做这样的事情时你可以在更短的时间内学到很多东西。

然而,有时需要休息,你需要分析、研究和学习一些孤立的东西。他不应该学习如何在项目的上下文中为特定的目的使用数据库,而是应该花几周的时间通过人为的例子来学习如何在其他类型的项目中使用数据库。从长远来看,增加知识的深度是必不可少的。在短期内,特别是基于web的项目需要多种语言,有一个全面的概述是可以理解的。


Aditya Athalye

@Philip,你的文章感觉就像对我生活的连续评论!“基于项目的学习”下面的3个段落几乎准确地描述了我的情况(除了布莱恩比我多了10年的工作经验)。碰巧的是,我也向别人寻求过帮助,就像布莱恩向你寻求帮助一样,我很快就会开始和他一起进行我自己的自学计划。非常感谢你的分享。对我和布莱恩这样的人来说,这是极大的肯定和鼓励。

——Aditya
http://www.linkedin.com/in/adityaathalye


匿名

感谢。这篇文章本身就很有趣,也很有启发性。


匿名

这是一篇可爱的文章,我可能不适合与Brian完全相同的鞋子,但我确实努力为我自己的股票模拟场景编写代码,并预算我的每周支出到目前为止。

这篇文章加强了我的信念,即在实践中学习,而不是在网上寻找免费的开源解决方案。通往永恒快乐的道路似乎是用大量时间蹲在电脑前铺成的。

Shekhar Karande


匿名

对于从哪里开始项目的分析和设计部分有什么建议吗?


约翰衰减器

好的文章!

我是一个自学成才的程序员,我赞同基于项目的学习方法。这样做的一个结果是,经过几年的努力,尝试构建各种东西(Stack Overflow、谷歌和本地用户组的人一直是我的主要导师),我*现在*发现我有足够的理解,可以寻找一些更学术的东西。如果我从这个角度出发,我可能就不会觉得事情如此有趣,并继续前进。

而且,我经常(或者是自己选择的,或者是不太了解)像您对Brian所做的那样——“自己做”,而不是使用现有的框架解决方案。那里的学习经验至关重要。一旦构建了自己的ORM或代码生成工具,您就会真正理解框架抽象出的底层技术在幕后发生了什么。

虽然对我来说,框架和库提供了代码重用的终极方法,但如果你想真正理解一个数据库,以及orm是如何工作的,那就构建一个数据库。想了解编译一门语言(albiet,在非常基础的水平上)需要什么吗?构建一个代码生成器。

虽然在高级语言中从零开始创建这些东西不能被认为是精通,但很难不从这个过程中带走重要的概念。更重要的是,这样做通常可以帮助一个人提出正确的问题,以寻求更深入的理解。


匿名

在学习的时候,我发现向别人解释我刚刚学到的东西是一种非常有用的技巧,既可以检查自己的心智,也可以强化自己。在早期阶段,我用我的妻子甚至我的猫作为一个发声点。随着我的进步,我找到了一个合适的论坛,如tek-tips.com,并寻找我希望能回答的问题。如果我的答案是错误的或需要改进的,比我更高级的人会迅速纠正我,增加我知识的深度和广度。随着我的进步,我回答越来越难的问题,同时仍然关注那些容易的问题,以防我能有所贡献。作为一个副作用,我经常发现自己被介绍到新的模块,概念和技术,我可能没有遇到任何其他方式。多年来,我发现这种“教学”是一种非常快速、有效和令人满意的学习方式。我还发现这个想法在哲学上令人满意:一大群人为了共同的利益而互相帮助。

seismofish


匿名

“我认为,要内化知识,最好的方法就是先花上几个小时,在这种挣扎中变得心烦意乱,然后才得到导师的帮助。”

我想说,内化知识的一个更好的方法是花上几个小时在情绪上心烦意乱,然后想办法把它们弄明白。你永远不会忘记一个问题的答案,但这让你承受了3天的压力,哈哈。


查看更多评论

Baidu
map