如何教授编程
教授编程一直是我生活的重要组成部分——大学时我辅修了教育学,后来转行成为软件工程师。此后,我一直全职从事编程教学,担任编程训练营讲师和开发者布道师。我非常幸运能够以各种形式参与到众多开发者的编程之旅中:从通过工作坊和我曾经任教的编程训练营教授成千上万的学生,到通过撰写像这样的博客文章与数百万人交流。在这篇文章中,我想探讨教授编程的方法,讨论如何引导学生建立良好的学习心态,讲解课程的教学机制,并提供大量教学技巧。
注:阅读我关于我们如何学习的文章可能也会有所帮助。
你可能已经教过这门课了。
你或许读完第一段后会想:“这篇文章跟我有什么关系?我又不在课堂上教代码。”我的回答是肯定的:你可能已经在以某种形式教授代码了,无论是在线回答问题、指导初级开发者、创作内容、管理团队、在会议上演讲等等。如果你参与了这些活动,你就是一位老师!而且,这里列出的一些建议也会对你有所帮助。
你为什么要教书?
教书的理由有很多。你可以巩固自己对某个领域的知识——你必须深入学习才能将其清晰地传达给别人。此外,教书也是一个学习新知识的机会:我曾经为了有效地教给学生,自学了很多知识。通过教书,你可以成为你所在领域的“专家”。在工作中,如果你能教会别人如何完成任务,就能更好地分配工作。而且,以易于理解的方式获取信息对学生也很有益处。
教学背后的思维模式
学习任何东西都很困难,尤其是编程。我对此深有体会,大学三年级时我就放弃了计算机科学专业,因为我觉得编程不适合我。设身处地地为学生着想——他们在学习过程中会遇到哪些障碍?你该如何帮助他们迎接学习这门学科的挑战?拥有成长型思维模式会让学习变得更加容易。我认为庆祝学生的进步很有帮助——庆祝课堂上取得的每一个小成就,无论大小。庆祝那些正在苦苦挣扎的学生成功编写出的函数,庆祝那些提出好问题的学生,以及那些令人惊叹的优秀项目。
此外,还要考虑学生在课堂之外的生活。尤其是在当前健康问题、政治动荡、白人至上主义抬头以及生活环境快速变化的情况下,学生的基本需求难以得到满足,这意味着学习变得尤为困难。马斯洛的需求层次理论指出,安全感是个人充分发挥潜能的前提。作为教育者,我们需要认识到这一点,并尽可能地提供帮助。例如,在“黑人的命也是命”抗议活动的高峰期,我推迟了作业截止日期,降低了对学生的要求,并明确表示学生可以根据自己的时间安排完成项目。
营造良好的课堂氛围也需要有意识地进行。要为学生设定规范,建立行为准则,并确保没有学生主导课堂讨论。鼓励学生既要给自己留出空间,也要给自己留出空间——每个人的理解方式都不一样。我本人就是一个比较安静的学生。我需要时间自己思考,然后再提出问题,而当场回答问题会让我感到焦虑。这很正常,就像有些学生会立即提出问题一样。要制定策略,让每个人都能自在地参与课堂讨论,同时也要给学生留出思考的时间,不要让他们当场回答问题。我更喜欢“暖场提问”而不是“冷场提问”——比如“这排的同学可以回答这个问题吗?”或者“3号分组讨论室的同学可以再给全班解释一下X吗?”
了解你的受众也很重要。如果你举办的是一次性工作坊,在开始前做一个简短的调查有助于你调整课程内容。如果你教授的是完整课程,我建议在开课前收集学生资料,了解他们的需求、背景以及之前学习该主题的经验。
另一个重要的理念是,你能教给学生的最好东西就是让他们学会自学。没错,一开始教授课程内容很重要,可以引导学生并纠正他们的误解。但也要教他们如何排除错误,如何查找答案,以及如何挑战自己,将所学知识运用到课程主题之外的其他领域。
课程机制
既然我们已经讨论了一些作为一名教育者应该具备并鼓励学生养成的关键行为,那么让我们来讨论一下一堂课实际是什么样子。
首先,要设定学习目标,也就是学生应该从课程中学到的具体知识点。例如,学生应该能够定义 React 组件、JSX 和虚拟 DOM;学生应该能够解释 React 在应用程序开发中的作用;学生应该能够创建一个 React 组件。在设计课程时,这些目标有助于你保持教学主题的连贯性,并为课程搭建框架。对于学生,尤其是成人学习者来说,了解学习内容有助于缓解焦虑,并避免提前提问。他们也能更清楚地知道在课堂上需要重点关注哪些方面。
接下来是“框架构建”,也就是解释某个主题的背景及其重要性。你要做的就是吸引学习者,让他们对课程产生兴趣,并告诉他们为什么需要认真听讲。你在这里为接下来的课程内容奠定了基础。在 React 课程中,“框架构建”可以包括 React 的发展历程、其广泛应用的统计数据,以及它如何简化开发过程。你还可以分享一些使用 React 创建应用程序的个人经历。
接下来是课程的“主体”部分。在这个阶段,我会反复循环三个步骤:“我讲解、我们一起做、你们做”。“我讲解”是指我向学生讲解一个主题——例如,“React 组件是 X”。“我们一起做”是指我编写代码,并希望学生尽可能在自己的电脑上进行相同的操作。例如,我们可以一起构建一个简单的 React 组件。最后,“你们做”是指让学生完成一项练习。我倾向于尽可能以小组形式进行这些练习,这样学生除了可以向老师提问之外,还可以互相学习、互相帮助。每个环节都不应该太长。循环的方式能够保持学生的注意力,而且他们也不需要等待太久就可以自己动手练习。在布置练习时,要强调过程比结果更重要。他们不一定每次都能达到预期的目标,但希望他们能从中有所收获,以便下次学习相关知识时能够更好地运用。
传统讲授式教学模式存在缺陷。人们的注意力通常只能集中11到13分钟,所以如果你讲的时间过长,人们就会走神。要尝试不同的教学模式。我非常喜欢翻转课堂,学生们先阅读或观看相关视频,然后再聚在一起讨论。此外,反复练习也很重要。编写代码是学习编程的最佳途径。
另一个现实是,学生的水平参差不齐——有些学生能很快理解,有些学生则需要更长时间。此外,每个学生的背景也各不相同。我建议你将课程重点放在班级中等水平的学生身上。你可能会让一些学生感到困惑,也可能对另一些学生的挑战性不够,这时就需要对那些学生进行一对一的辅导。你可以推荐一些额外的学习资源,安排一对一的答疑时间,并设计分级练习,确保每个人都能找到适合自己的内容。你的课程应该覆盖班级中的绝大多数学生,但也要确保能够照顾到那些在某个主题上遇到困难或表现出色学生的学习需求。
当你教授自己非常熟悉的领域时,很容易想要把所有相关知识都教给学生。但这往往会让新手感到不知所措。要教授必要的知识,而不是为了满足自己的虚荣心。
我还会每隔几分钟进行一次理解性检查,以确保学生跟上我的教学内容。检查形式多种多样,包括Slack投票和提问、在白板上书写以及口头回答问题。
最后,进行总结回顾。概括你所学的内容,并与学习目标联系起来。
教学技巧
现在,我想转而给出一些教学建议。
设定明确的期望。如果教学计划和成功标准清晰明确,学生就能取得最佳学习效果。我总是提前提供课程大纲或提纲,制定课堂行为准则,并在课前准备好教材,以便学生课前预习。不要让学生在课堂上第一次接触这些材料。尽可能提前布置阅读材料,并提供课件或教学资料。重复练习至关重要。
营造一个允许失败的安全环境。建立相应的保障措施,这样即使学生没能完成作业或答错题,也不会造成毁灭性的打击。我通常会制定重交作业的流程,允许学生错过一些作业,并且注重努力程度而非正确性来评分。
同样,如果你的学生学习的动机是外在的,比如他们想找一份编程工作,那么给成绩打分往往是无效的,甚至有害的。有些学生(咳咳,我以前在大学里就是如此)更看重这种衡量成功的标准,而不是真正地学习。我会把重点放在提供有效的反馈上,而不是试图制定一套人为设计的评分标准。我通常会设定毕业标准,但大多数作业,如果严重偏离标准(比如根本没做、明显缺乏努力、大段从网上复制的代码等等),我只会给出及格/不及格的评价。
在课堂上模拟真实的职业环境,尤其针对成人学习者。例如,通过站立会议讨论进度,使用 pull request 提交作业,或使用 issues 提出课堂问题。让学生习惯使用他们未来职业生涯中会用到的平台。
遵循最佳实践。请不要使用 foo/baz/bar 之类的示例,它们没有帮助。但请务必正确格式化代码,使用良好的变量名等等。示范你希望学生如何操作。
将新信息与他们已有的知识联系起来。孤立地学习非常困难。相反,应该将新信息置于他们已学知识的语境中。即使这些联系对更有经验的人来说可能显而易见,但明确地阐明这些联系仍然非常有帮助。例如:代码中的变量与你在代数课上学到的变量非常相似。
迎合多种学习风格。虽然“不同人学习风格各异”的说法已被否定,但务必提供视觉辅助材料、音频资料、补充阅读材料以及更多练习,以便学生能够按照自己的节奏拓展知识。图表本身就对学习大有裨益!给内容创作者的额外建议:您可以将内容以多种格式重新利用。我通常会将博客文章用作 YouTube 视频的脚本。
打破术语的固有思维。我经常看到或听到有人说教学时不应该使用术语。但我并不认同这种观点——学生在工作中需要用到本领域的术语。能够像程序员一样交流对于面试和人际沟通至关重要。话虽如此,使用术语时一定要解释清楚。反复地用口头和书面形式解释新术语。
强调死记硬背的重要性。在很多学科中,死记硬背至关重要。但在编程中,难点在于解决问题,学生在实际工作中能够运用各种资源。解释这一点非常重要,这样学生就不会觉得需要死记硬背整个API。此外,还要坦诚地展示你知识上的不足。如果你忘记了某个数组方法的名称,这比你信口开河要好得多。向他们展示你是如何通过查阅文档找到正确方法名称的。
不知道某些事情没关系。站在讲台上,你可能会觉得必须对某个主题了如指掌,但其实并非如此。充分备课固然重要,但当场发现拼写错误或程序漏洞并进行调试,对学生来说也大有裨益。有时,他们的问题确实天马行空——比如有人问我,如果用 JavaScript 打破 window 对象的边界会发生什么。你可以坦诚地说自己不知道,或者向他们展示你会如何查找答案。
我最喜欢的一些教学资源
本文包含联盟链接。如果您通过这些链接购买商品,我可能会获得少量佣金,而您无需支付任何额外费用。这有助于支付运营“We Learn Code”的相关成本。我保证只推荐我使用过且喜爱的产品!
结论
我最喜欢的名言之一是罗伯特·海因莱因的“教与学”。我从教学中获益良多,能够参与到人们的学习旅程中,我感到非常幸运。如果您有任何问题或后续话题,请在推特上联系我。
文章来源:https://dev.to/aspittel/how-to-teach-code-dim