周三晚,9点。西北大学南校区。信息学院某教室。

讲完最后一句“谢谢大家这段时间的支持,下课”的时候,似乎仍然有点不太确定,持续了11周的《软件开发新视野》课程就这样结束。从三月初到现在,每周4小时以上的备课,每次2.5-3小时的上课,这种行为似乎成为一种习惯。每次上课的路上,都会路过一家烘焙店,递给老板四块钱,他则会很熟练的给我一块枣糕和一块小蛋糕。在旁边的小店买一瓶最便宜的水,去教室的路上把这些食物消灭干净,晚上的课程就正式开始。

为什么有这门课?

去年的时候我开始对大学教育开始了深刻的反思——当然在之前也嘲讽过很多次。这些反思来自于我们的招聘。我一直搞不懂为什么具备基本编程基础的大学毕业生那么难找——即便像ThoughtWorks这样的公司,每年入职的毕业生,在我看来具备编程基础的人只能以个位数存在。大多数毕业生来到公司之后,首先最缺乏的根本不是软件相关的理论,而是在理解这些理论之前所必备的原始积累,即足够的编码行数。我看到的大多数毕业生,在入职的前几个月,都在经历痛苦的原始积累过程——在他们的生产工具:键盘和IDE上,生涩地敲击着代码。

并非说他们不够聪明。事实上在几个月的时间里,他们中的大多数经历这一过程之后(相当痛苦),他们能够开始产生主动的贡献。但我一直感到不解的是,为什么学校不能够把这种原始积累进行完成呢?学校的那些“明星”学生——写代码超厉害的(往往作为学生的一面表现欠佳,如逃课之类),他们在工作岗位的表现,是要远超于他们在学生表现的。为什么他们就没有成为大多数学生的行为楷模呢?

带着这些问题,我给自己定了一个想法:在学校里开设一门选修课,通过大跨度和高挑战的内容,以及大量的课外练习和阅读,加上丰富新颖(我希望是)的教学方式,激发起学生的学习兴趣,从而产生主动学习以及对应的代码行数的原始积累。更重要的是,让学生掌握在这个信息时代的学习方法,为以后必然存在的知识过期做好准备。课程成功与否的直接验收标准:结束的时候,具备独立编写Ruby代码并且能够主动学习的人数比例达到10%以上。

年初的时候刚好跟西北大学的一个在读博士老师一起吃饭。说到这件事情,她很鼓励。于是一来二往,这件事就成了。

这门课是什么?

这门课的核心思路是通过一个具体的编程任务(便利店),通过11次课,以Ruby语言为载体,让参与上课的人能够迅速建立用户意识(软件是为了改善人类生活),学习Ruby语言,了解版本管理,以及程序演进(从命令行演进到Web应用),了解单元测试。还有最重要的是将工作平台迁移到Linux上。除了大约30小时的上课时间之外,每次还会布置相当的编程习题(能够验收通过的产品代码大约100行左右,但为了产生这100行,学生在练习阶段的代码量应该在200-400以上。我希望能够产生总共3000行以上的练习量),以及读总共超过300万字的11本书

面对着下面的这张课程表,学生会有什么反应呢?

  1. 软件的价值(软件与软件从业者的关系?什么是好的软件?各种讨论与探寻。)
  2. 初探Linux世界(Linux世界中那些伟人,Linux设计哲学,常见命令)
  3. Ruby第一课(基本语法,基本的分支结构,编程习题)
  4. 包管理器与平台化(Linux包管理器,模块化基本手法,Ruby OO)
  5. 上机练习:Ruby现场编程
  6. 版本管理:Git与Github (版本管理简史,悲观锁/乐观锁/集中式/分布式,Git/Github等)
  7. 如何进行自动化测试(测试的分类,xUnit基本测试方式等)
  8. 上机练习:合作与冲突
  9. 开源软件:寻找与使用 (多用Google,了解Sinatra用法,了解如何寻找开源软件)
  10. 跳跃:Python(后改为Ruby on Rails入门)
  11. 总结,如何持续学习

情况如何?

在教学过程中,我采用了交互性极强的问答方式(许多是参考自Michael Sendel在”Justice”中的诘问的方式)。除了常规的学术内容外,也引用了许多鼓舞人心的视频,Richard Stallman, Linus Torvalds, Tim Ferries, DHH等等都出现在课堂上。关于技术在实际工作中的使用也颇多提及。内容还是挺吸引人的——至少自己这么认为。从最后依然坚守的同学那里得到的反馈,对于这些课程,他们也挺满意。然而,在公司每次被问起有多少人上课,我总是尴尬的回答说,十几个吧。

第一次上课的时候,老师担心报名的人太多,于是申请了一个300人的大教室……事实证明这门课完全没有这么引人注目,第一次只来了20人左右。第三次人最多,达到了40人,不过仍然是昙花一现,大多数时间里,只有十几个面容熟悉的学生听着我的课。

既然最终的验收标准是通过课程本身来吸引学生的兴趣,外部的约束是没有被采用的。例如点名、划重点、考试等等。

结论

上完最后一课,重新审视当初设立的成功与否的条件,我不得不承认,这个实验是失败的——

  • 大多数报名的学生都没有来上课(报名60多人);
  • 来上课的学生能够独立完成这些编程任务的人少之又少
  • 具备自主寻找问题答案的学生更是凤毛麟角

同样,我不认为是由于学生不够聪明。关于原因,我做了如下猜测:

  • 爱编程计算机学生是不用上课的——他们知道怎么学习
  • 这个讲师名气不够——不过助教说即便IEEE的大师来了,也不见得有多少人去听(或许是为了安慰我)
  • 课程跨度太大,太难。我的确见到有些学生之前的课都出现了,但在一次上机课受到挫折之后就再也没出现了。
  • 对课外时间要求过多——事实上这门课除了要求30小时上课之外,还包含了3000行以上的代码练习和11本书300万字以上的阅读。学生无法很好的管理自己的时间。
  • 出了上课和论坛之外,缺乏更有粘性的方式将学生组织到一起。这也是学生流失的原因之一。

但那些留下来的同学,给发回的反馈中,我又看到了希望。许多人都提到了这门课对他们的根本性改变,对视野的开阔,思维方式的变化。虽然自己也意识到暂时没有能力完成这些学习任务,但视野和思维方式的改变,应该能在未来产生积极的影响。换句话说,这门课在他们的心里埋下了种子。

致谢

我需要感谢许多人:

  • 感谢始终坚守的同学们。没有你们,我的课程毫无意义;
  • 感谢西北大学信息学院的付丽娜老师和房鼎义教授,虽然我对传统的计算机教学方式颇有微词,但你们开放的心态和勇于尝试的精神使得这次实验成为可能;(你们连个微博都没有,想链接都没办法)
  • 感谢Elian帮我备课以及上机课辅导。
  • 感谢ThoughtWorks,有你,我才能坚定的认为软件应当改善人类生活。

PS. 在学校讲课的其他的一些发现和感触:

  • 不点名还是不行的。。。并非为了点名而点名,学生需要一点点外部约束来保证时间上能够参与到必要的教学活动中。
  • 学校机房清一色的版权不明的愚蠢组合Windows XP+IE6。没有Linux,上不了RubyGems, github,也访问不了Ubuntu官方源。奇怪的是同学声称实验室可以上这些网站。
  • 教编程的老师自己是不编程的——这基本上可以解释为什么学生的动手能力不强。你见过教人做菜的厨子只拿着菜谱给人念吗?这种事情却发生在计算机教育领域。
  • 投影仪的颜色非常暗淡,基本分不清红绿,黑白灰的对比也很差。早期做的一些黑底白字的幻灯片,投影出来基本上抓瞎。后来值得放弃审美采用白底黑字……
  • 没有白板或者白板笔。好几个教室粉笔基本断档,只剩粉笔头。粉笔不是无尘的,写起来满手都是白灰。每当这个时候想起高中老师,写得满满一黑板的板书,头发上掉的都是粉笔灰,心中一阵心酸——想不到十多年后,在西北名校西北大学里,我还在重复这种日子。