我在阿拉斯加州东南部的一所小高中教书,每年我都教授编程课的导论(介绍)。最近我学会了如何用IPython Notebook,并且它已经彻底改变了我教课的方式。对于CS(计算机科学)教育而言,美国的K-12教育体系中还有很多地方需要提升,因此分享我们的故事和资源对于我们提供给学生的(帮助)会有长远的影响。
我的第一堂编程课
如同很多教授编程课简介的人一样,我没有一个正式的CS(计算机科学)学位。当我还是个孩子的时候,我开始学习编程,并且之后攻读到了物理学位。我一直把编程当做乐趣(为了乐趣而编程),然而,最近我对待编程的态度开始认真了起来。由于我已经对自己的编程更加认真了,我编开始寻找一些方法将其带入到我的课(堂)上来。
我第一次教授编程导论的时候,我觉得每天的课都有创新(创造了每天的课),并且想出一些练习和挑战让学生们去尝试。学生们喜欢这种课程,因为他们大部分时间都在试着将他们正学到的知识运用到他们能够解决的问题上来。从第一堂课开始,他们就像真正的程序员一样。作为一个编程教师来说,这门课对我来说是一个不错的开始,但这种方式并没有持续多久。只是因为创造一堂能够跟上我那些更有才能的学生的步伐的课程实在太难了。由于没有一个正式的CS背景,这一路上我也有很多知识需要自己先弄清楚。
第二次(授课)时,我试着基于一个既定的课程之上来讲我的课。我试图用Zed Shaw的《笨办法学Python》来指导我的课程,因为我曾在所有我参加过的技术社区中听说过这个教程有着持续的好处。然而这个方法并没有奏效,因为学生们只是没有跟上LPTHW(《笨办法学Python》)中讲的方法。我指导LPTHW要求学生自己编写程序,但对于那些刚开始接触编程的新手来说,即使有个老师在教室中指导,他们也还是有太多的东西需要弄清楚。我的(班里)有个学生真正喜欢这个教程,但对于大多数学生来讲,我的第二次课并没有比第一次授课进步太多,相反,在他们前进的道路上少了许多乐趣。这并不是对Zed的教程的批判,只能说明我没有用他的课程抓住我学生对于编程的兴趣。基于刚学习的知识,我的学生们似乎对于非常具体的习题做出更好的反应,循序渐进的转向练习和挑战能够使他们运用自己的想法,结合刚学到的知识(来解决问题)。
今年的课程
这次的课程,我想要重新回到自己创造讲课方式的方法上,并且要比之前有更高的效率。同时我也需要一份备用计划来应对那些超过我教学进度的学生。去年的每天我都在PyCon听到IPython Notebook,所以我决定去看一看究竟。一旦我习惯了它,我简直不敢相信如果用IPython Notebook来做教学工具的话会有多么高的效率。
如果你对于IPython Notebook不熟悉的话,它基本上可以让你在同一页面上混合Python 代码和文本,并且可以让你的代码块作为单独的程序来运行。IPython Notebook 是为科学计算编程而开发的,你可以通过一系列较小的程序来解决比较大的问题,同时能对程序的进展做注释。这种讲注释单独注释到文本文件的方法比写一系列单独的编程文件的工作效率高的多。
作为一个老师来说,我发现这是个创建课程的完美的工具。关于一个题目我写了一些注释,之后写了一个小程序来说明怎样用代码实现这个题目。IPython Notebook让这些课程变得容易教学,GitHub让这notebooks能够非常方便的存储在可公开访问的地方。之后IPython Notebook的浏览者可以使其以一种便于阅读的方式打开。
我的基本工作流程:
我创建一个笔记来记录我要遵循的课程大纲。
对于大纲中的每个主题,我创建一个本地的笔记,其中包括了本次课程中这个主题中的所有内容。
当我有时间的适合,我在家创建课程并且使内容变得生动。
在我教学的过程中,我总是使我的电脑连着投影仪,当我在课堂上搞清楚一些问题时,我在课后会尽可能及时的把变动放到GitHub上去。
如果我在课上完成了一个新的主题,我在其中一个笔记中直接写上我的例子,如果这些东西笔记清楚易懂,我会把它们直接传到GitHub上去。如果当堂的工作需要再梳理一下,我会本地提交,当我有机会更仔细的看这些笔记时,我会在课后提交。
如果有个学生开始超越我(的进度),我可以引导他们学习更系统的东西,如Udacity或者Coursera。这些东西是需要学生更独立自主的学习才可能取得成功的。
目前为止的成果
到目前为止,我和学生对于这个工作流程都很满意,我们都和我第一年教编程课时一样有乐趣,但我们也覆盖了更多的知识,并且学的更快。在这个工作流程中我能感受到一些好处:
- 学生可以在自己电脑上打开所有课程的材料的副本,并且在课堂外也可以用(访问)。
- 我们可以根据整个课堂的意愿增加或者修改练习题和挑战。
- 学生们能够逐步接触一些当他们编程更加熟练后要用到工具,如git, GitHub, IPython等等。
接下来做什么?
我真的想找到一种方式使编程在全学年都融入到我们学校的文化中去,以下是我对于怎样推进这一目标的一些想法:
- 本学期中继续发扬notebooks。这个涉及到将一些曾经发布过的旧博客转为IPython notebooks的工作。
- 制定一系列学生能够在任何课上做的核心工作,让他们的用自己的编程能力在其他课程上帮助他们。举个例子,用你对Python字典的理解来追踪你正在学习的每堂课的关键词。
- 建立一个体系,使那些对编程有一定的理解,到达一定技术水平的学生开始用我们的课程资料教授新学员,这将减轻我一直要教授导论课程的压力,并且可以让我教一些更加高级的编程课。
- 清理笔记,使学生独立思考而不是为课堂笔记而学习。眼下,学生们如果要自主学习读这些笔记还是不够的,这可以被改善,虽然它们可能不该变得太冗长。
协作
如果你想和这些notebooks玩,查看GitHub上的这些项目,我会很乐意与您合作构建这些资源,因此如果你想做出贡献就联系我们。可以通过邮件联系我,gmail上的ehmatthes,或者在twitter上@ehmatthes。如果你在GitHub上很活跃,你也可以在Issue#10下面留下反馈。