周三晚,9点。西北大学南校区。信息学院某教室。
讲完最后一句“谢谢大家这段时间的支持,下课”的时候,似乎仍然有点不太确定,持续了11周的《软件开发新视野》课程就这样结束。从三月初到现在,每周4小时以上的备课,每次2.5-3小时的上课,这种行为似乎成为一种习惯。每次上课的路上,都会路过一家烘焙店,递给老板四块钱,他则会很熟练的给我一块枣糕和一块小蛋糕。在旁边的小店买一瓶最便宜的水,去教室的路上把这些食物消灭干净,晚上的课程就正式开始。
去年的时候我开始对大学教育开始了深刻的反思——当然在之前也嘲讽过很多次。这些反思来自于我们的招聘。我一直搞不懂为什么具备基本编程基础的大学毕业生那么难找——即便像ThoughtWorks这样的公司,每年入职的毕业生,在我看来具备编程基础的人只能以个位数存在。大多数毕业生来到公司之后,首先最缺乏的根本不是软件相关的理论,而是在理解这些理论之前所必备的原始积累,即足够的编码行数。我看到的大多数毕业生,在入职的前几个月,都在经历痛苦的原始积累过程——在他们的生产工具:键盘和IDE上,生涩地敲击着代码。
并非说他们不够聪明。事实上在几个月的时间里,他们中的大多数经历这一过程之后(相当痛苦),他们能够开始产生主动的贡献。但我一直感到不解的是,为什么学校不能够把这种原始积累进行完成呢?学校的那些“明星”学生——写代码超厉害的(往往作为学生的一面表现欠佳,如逃课之类),他们在工作岗位的表现,是要远超于他们在学生表现的。为什么他们就没有成为大多数学生的行为楷模呢?
带着这些问题,我给自己定了一个想法:在学校里开设一门选修课,通过大跨度和高挑战的内容,以及大量的课外练习和阅读,加上丰富新颖(我希望是)的教学方式,激发起学生的学习兴趣,从而产生主动学习以及对应的代码行数的原始积累。更重要的是,让学生掌握在这个信息时代的学习方法,为以后必然存在的知识过期做好准备。课程成功与否的直接验收标准:结束的时候,具备独立编写Ruby代码并且能够主动学习的人数比例达到10%以上。
年初的时候刚好跟西北大学的一个在读博士老师一起吃饭。说到这件事情,她很鼓励。于是一来二往,这件事就成了。
这门课的核心思路是通过一个具体的编程任务(便利店),通过11次课,以Ruby语言为载体,让参与上课的人能够迅速建立用户意识(软件是为了改善人类生活),学习Ruby语言,了解版本管理,以及程序演进(从命令行演进到Web应用),了解单元测试。还有最重要的是将工作平台迁移到Linux上。除了大约30小时的上课时间之外,每次还会布置相当的编程习题(能够验收通过的产品代码大约100行左右,但为了产生这100行,学生在练习阶段的代码量应该在200-400以上。我希望能够产生总共3000行以上的练习量),以及读总共超过300万字的11本书。
面对着下面的这张课程表,学生会有什么反应呢?
在教学过程中,我采用了交互性极强的问答方式(许多是参考自Michael Sendel在"Justice"中的诘问的方式)。除了常规的学术内容外,也引用了许多鼓舞人心的视频,Richard Stallman, Linus Torvalds, Tim Ferries, DHH等等都出现在课堂上。关于技术在实际工作中的使用也颇多提及。内容还是挺吸引人的——至少自己这么认为。从最后依然坚守的同学那里得到的反馈,对于这些课程,他们也挺满意。然而,在公司每次被问起有多少人上课,我总是尴尬的回答说,十几个吧。
第一次上课的时候,老师担心报名的人太多,于是申请了一个300人的大教室……事实证明这门课完全没有这么引人注目,第一次只来了20人左右。第三次人最多,达到了40人,不过仍然是昙花一现,大多数时间里,只有十几个面容熟悉的学生听着我的课。
既然最终的验收标准是通过课程本身来吸引学生的兴趣,外部的约束是没有被采用的。例如点名、划重点、考试等等。
上完最后一课,重新审视当初设立的成功与否的条件,我不得不承认,这个实验是失败的——
同样,我不认为是由于学生不够聪明。关于原因,我做了如下猜测:
但那些留下来的同学,给发回的反馈中,我又看到了希望。许多人都提到了这门课对他们的根本性改变,对视野的开阔,思维方式的变化。虽然自己也意识到暂时没有能力完成这些学习任务,但视野和思维方式的改变,应该能在未来产生积极的影响。换句话说,这门课在他们的心里埋下了种子。
我需要感谢许多人: