英文原文:Teaching Programming To A Highly Motivated Beginner
作者:Philip Guo
译者:zhongqi
过去的一年中,许多计算机专业的教授和教育专家都写了关于 MOOC 如何扩大计算机教育服务的规模,使得成千上万的学生都能享受到。而我想从另外一个角度,说一说我是如何在 9 个月的时间里向 1 位学生教授计算机编程的。
2011 年 7 月到 2012 年 3 月之间,我给 Brian Goler 教授基本的编程知识;他是旧金山湾区一位有经验的企业家,在市场、销售和产品开发等方面都有广泛的经验。Brian 之前没有编程经验,但在几个月的时间里,他就做出了 SwearBuy,一个让那个人们对喜爱的产品发表评论的免费 web 应用程序。更重要的是,Brian 获得了自学的能力,能够接下来自己搜寻、学习更高阶的技术内容。我的主要贡献,是指导他克服一些通常会打击初学者的障碍。
背景
Brian 通过我的个人网站上知道了我,因为里边有几篇计算机科学教育的文章。下面摘录他在 2011 年 7 月给我发的第一封邮件里的一段内容:
我们没见过面,但我想试试看能否从您这儿得到些建议。
我在网上搜寻能帮我学习编程的导师的时候发现了你的网站。更准确地说,我在上一门计算机课程,我希望找一个导师,每周能当面辅导我 1-2 次,每次 1 小时左右。
我正在上 MIT 的 OCW 6.00 课程。尽管 OCW 和其他的在线课程都很棒,但我觉得如果有个人可以请教、还能检查我的作业,并给与反馈,那我的进度应该会更快些,对概念的理解也会更深入。
您在 MIT 和 Stanford 都待过,应该认识一些合适的人吧?或者,可以给我推荐下去哪儿找合适的人?当然,我会向辅导的人付钱的。
因为那会儿我刚好不忙,于是我就亲自辅导 Brian。我们第一次的一小时会面是在他家,第二次是在附近的一家咖啡馆。之后我去参加某个学术会议,于是第三次的辅导我们就通过 Skype 在线视频电话进行。我们用了 Skype 的屏幕共享功能,这样在聊天的时候我就能同时看到他的电脑屏幕。这种形式非常适合辅导,于是我们决定接下来的所有辅导都通过 Skype 进行。我只当面辅导过 Brian 两次,而我们的 Skype 视频通话时长高达 50 小时(大约 40 次)。
在 Skype 上的在线辅导进行的如此顺畅,我们都感到很惊喜。这甚至比我们当面聊天更有效,那样还会受困于嘈杂的咖啡厅和狭小的笔记本电脑屏幕。借助 Skype 的屏幕共享功能,我能在我自己的公寓里边舒服地看到 Brian 的电脑屏幕,并且与他实时互动。如果我需要画些草图来说明,那我只需要共享屏幕,然后用绘图板来画就行了。(Salman Khan 就是用类似的办法教他的表弟,于是就有了现在知名的可汗学院教育视频。)
基于项目的学习
Brian 的目标是学习基本的编程技巧,提高自己;而不是要获得一份程序员的工作,或是成为一名研究人员。在见我之前,Brian 已经通过上 MIT 开放课程中的计算机科学与编程基础,自学了几周 Python 编程。开始的几次辅导中,我们通过课程讲义和作业,复习了基本的编程概念。
然而,我很快就意识到,仅仅通过学院式的课程资料来学习,无法让 Brian 足够投入,尤其考虑到他已经大学毕业 20 年这个现实。他看起来并不满足于只学习一些计算机学科的术语、做一些针对大学生的数学相关的小练习。
因此,我决定教 Brian 成为一个实用主义的业余程序员,而不是一个博学的计算机科学专家。我鼓励他想出一个给自己或朋友用、自己也愿意做的软件。相应地,我将指导他完成这个软件项目。这个想法如此简单,但效果却异常好。
Brian 提出了一些 idea,并最终决定实现其中的一个,也就是后来的 SwearBuy。在接下来的 9 个月里,他每周都投入十几个小时的时间编写 SwearBuy,常常干到深夜。我们每周都有一到两次的 Skype 辅导,每次持续一到两个小时。辅导中的大部分时间,我都用来回答 Brian 的问题,帮他调试 bug,有时还跟他结对编程,一起写点儿代码。我每次讲的时间都只有几分钟。除了能让他的注意力高度集中外,这种基于问答的形式对我来说也很不错,因为我几乎不必花时间提前做什么准备。
基于项目的学习十分高效,因为 Brian十分重视他自己的第一个项目。他的学习被需求牵着走,而不是一些预先设置好的的学术课程。因为他对 Swearbuy 的热情非常高,所以常常会想出很多新功能的点子。为了实现这些功能,他必然要学习一些新的编程技术。因此,我的角色就变成了:
评估他想实现的功能的可行性,如果需要的话,指导他完成一个简单版本;
挑选最适合他需要的编程工具、风格以及技巧;
给他找到合适的自学资料(比如代码示例、博客、在线教程、书等);
在他努力理解和应用自学的内容时,回答他的疑问。
编程实现一个任务,常常有几十种甚至上百种方式;这种选择的多样性常常让初学者手足无措。因为选择太多,他们反而不知从何入手。我要做的,主要就是帮他将选择范围缩小到一个可控的范畴,适合他各个阶段的学习;然后让他去自学,遇到问题时我再解答他的疑问。
我十多年的编程和教授编程的经验,使得我在每个需要选择的点上,都能将选择范围缩小到我认为最适合Brian学习的程度。比如,我选择让他用最基本的编程语言(比如 Python, JavaScript, SQL)功能来“从头”搭建 SwearBuy,而不是在已有的一些复杂的 web 应用开发框架上开始。尽管为此 Brian 不得不写更多的代码来“从头”(这个词儿可能有些不准确,因为不可能完全从零开始)开始实现期望的功能,但他通过这个过程,能够深入到内部原理,深入理解各个部分是如何组合到一起的。
Brian 的项目是我们 Skype 会话的绝好的基础,因为我能将自己要教授的新概念融入到他想实现的新功能中去。再多的刻意的课后练习所发挥的作用,也比不上一个属于学生自己的的应用程序。
在挣扎中学习
在我们每次 1-2 小时的 Skype 辅导开始前,Brian 通常会编程 10-15 个小时,所以他总是用大量急切的问题要问,有很多新写的代码需要我帮他来调试和优化。如果我只是给他讲课,而不基于任何背景,那他不可能消化的这么彻底,很可能只是点点头,然后说“嗯,好吧,好像是这么回事儿……不错,然后呢?”相反,因为他在每次辅导之前,都一直在和具体的代码相关的问题纠缠——甚至经常因此而受挫和沮丧——所以每当我给他解释清楚了什么之前看起来好像不可逾越的问题时,他的反应往往是“喔喔喔,哇哦!现在我算是彻底明白了!”。他的喜悦和释然每次都那么明显。我觉得对消化知识来说,没有比这更好的方式了:先花上几个小时努力解决问题,不断积累心中烦躁的情绪,然后再接受导师的指导。
为了减少 Brian 的痛苦,我帮他搭建了开发环境,做了一些乏味的工作,因为这些东西不会直接促进他的学习。我希望他把精力花费在编程和搭建 SwearBuy 上,而不要浪费时间做些不相关的事情,比如搭建服务器或是版本控制系统。(当然了,如果他的目标是成为一个系统管理员,那我尽可以让他去纠结那些细节。)
有很多时髦的书、在线教程以及直播节目,都宣称能让你在 7 天或是 3 周时间里学会编程(或者别的什么技能)。很明显,你不可能在几周里就掌握一门新技能,而且我觉得也没几个人真的相信他们可以。这些“快速获取技能”计划的真正问题在于,他们忽视了可持续性。这些课程就好像减肥食谱一样,可能会让你马上减掉 10 磅体重,但却无法让你保持住,除非你真正地养成了好的习惯。类似的,除非你不断努力很多年,否则也无法精通编程;为了激励自己不断努力,你必须是在做自己有热情的事情。努力挣扎可不是什么有趣的事儿,如果没有适当的激励,太容易早早地放弃了。
当 Brian 意识到他不再需要我的辅导时,我知道我成功了。尽管他也承认要成为一名技艺精湛的程序员,自己还需要努力好几年,但他已经知道在现有的水平下,如何努力才能到达那个高度。在过去的九个月里,他学到了足够多的东西,能够支持他继续自学下去。对于自己给了他足够的方法和智慧来继续自学,而不是填鸭式地应付一个学生,我感到很自豪。
最后的思考
在我们的辅导结束之后,Brian 反映说,尽管他受益于这种“通过做来学习”的方法,但他仍然认为,将基于项目的学习和传统的计算机课程学习结合起来,有很大的价值。在构建 SwearBuy 的过程中,他经常通过 Google、阅读技术博客、从 StackOverflow 上拷贝代码等方式,来临时解决自己的问题。结果,他发现自己经常得出并非最优的方案,而且用的东西自己都无法完全理解。Brian 的一些巨大的进步,来自于他从项目中抽身出来,转而去学习书中或课程中遇到的新的概念,然后想着如何将其用到 SwearBuy 中。
自从我们 2012 年 3 月结束最后一次的辅导以来,我 6 个月没有收到 Brian 的消息了。最近他给我发的电子邮件中提到,他刚刚写了个 Python 脚本,帮自己给个人股票投资建立模型:“对这个脚本我感到很自豪,因为这是我做的第一个实用的自用工具。我过去一直都在评估股票投资项目,一直想模拟各种场景;一开始我用的是 Excel,但后来终于发现 Python 才是做这件事儿的不二之选。”
我很喜欢这封邮件,因为它展示了编程技能的作用,让原本无聊且困难的任务能够轻松完成。我希望每个学习编程的人都能有迈过那道坎儿的时刻,从那以后就不仅是为学校或公司的活儿而编程,而更多的是为自己而编程。
我还想说一遍那句老话,积极性意味着一切(motivation is everything)。Brian 的积极性来自自己的项目,所以实际上他是自学的。我要做的仅仅是定期指导一下他,帮他最有效地进步,让他的努力变为有效的学习。
我的这些经验如何才能推广到教授大批的自我激励的程度远不及 Brian 的学生的教学实践中去?我摸索出的这些技巧如何能不再局限于一对一的辅导这种形式?我也不知道。我只知道,如果你能让学生产生真正的积极性,帮他们移除学习中一些不必要的障碍,而且在适当的时候拉他们一把,那么实际上他们就完全可以自学。