团队阅读之 "Is 'Computer Science != Software Engineering' an excuse to teach programming poorly?"
这是邹老师博客给的第三个网址
这是一个叫programers的论坛里的一声呐喊引发的故事......
这声呐喊如题:CS!=SE是不好好教programming的借口吗?
发帖者说,常常听到抱怨说CS毕业生的开发技能低下,然后大家最后达成的解释是:CS!=SE。但是CS的课程里面明明有软件开发课,不过教的很弱,既然开设了为什么不好好教呢?他请大家回答两个问题:
1).CS!=SE是不是不好好教programming的借口?
2).如果大家能选择,是否会在CS课程中强调programming的教育?
关于这个问题,论坛中的讨论很激烈,从愤青的学生到经验老到的开发人员都给出了不同的回答。
讨论的最多的还是CS!=SE。大多数人都认为这不是借口,而是事实。
CS主要是定义问题,本质上是数学,是academia(学术界)的事。甚至有人说computer science应该改名为the science of computing,或者干脆造个词叫computology。因为CS的名字让人们误解了它,其实它和计算机的关系不大,它是一门计算的科学。Edsger Wybe Dijkstra是1972年图灵奖的获得者,他说过:“COMPUTER SCIENCE IS NO MORE ABOUT COMPUTERS THAN ASTROMY IS ABOUT TELESCOPES”,也就是说CS和计算机的关系就像天文学和望远镜的关系。它的主要研究领域是图论,算法分析,数据结构等,利用而不依赖于计算机这个机器,也不需要纠结用什么编程语言运行我的“计算”,我关注的是我要解决什么问题,怎么设计解决方法,不需要太关注怎么把它投入使用。
而SE是industry(产业)的事,是将现实问题转化成计算机的事的过程,这个转化往往不需要设计多么复杂的算法,有多么良好的数据结构。它关注的是实用性,功能实现了吗?是否易维护?是否可靠?是否可移植?最终落脚点是它的商业价值。那么SE涵盖的内容就非常丰富了,包括市场,包装,发布,维护等等。
打个比方,CS就像药剂师,SE就像药店。CS不需要关心怎么大批量的生产药品,只需要做一个又一个的实验去提升药物的性能,为SE提供生产的理论,而SE则会把粗糙的经过证明有用的药物生产成五颜六色、入口不苦、缓慢释放药性的药丸药片冲剂。
因此,CS!=SE是个很明显的事实,这一点我也很同意。为了不再这个问题上绕圈子,我把发帖者的问题作一点修改:CS!=SE是不好好教programming的原因吗?
有一部分人用CS!=SE这个事实,想要证明CS不需要学programming,他们的论据就是几个类比:难道物理学家就要学着造汽车?难道建筑师就要造房子?难道宇航员就要造飞船?也有一部分人认为CS应该学programming,因为这样当毕业生转向工作领域时才能够适应。这个时候辩论的焦点又将问题改成了:CS!=SE是不需要学programming的原因吗?
对这个问题首先我想明确一下讨论范围,我们不暂考虑毕业生由CS转向SE的那一部分,也就是说我们看看纯粹做CS的毕业生需要学programming吗?我认为需要,因为CS尽管是学术上的事,也不应该闭门造车,需要向外交流和展示,那么一个好算法的不能死在公式上吧,有个好的展示效果可以提供更为清晰的数据,并有可能发现隐藏更深的结论。同时,现在的CS是一个综合学科交叉时代下的CS,和医学、语言学等结合在一起就对programming的要求更高了。一个好的算法的价值也是体现在运用中,CSer创建一个运用性的项目,我想,应该也可以称作一个产品吧,它会随着算法的改进而维护扩展,对programming有更多认识的话,在这一部分是可以提高很多效率的。
同时,CS的目的也是为了将好的算法、好的理论运用在现实生活中,那么CSer或者SEer必须有二者之一要担当起将理论转化为实际的桥梁,学过programming的CSer就和学过算法等理论的SEer一样,在合作交流过程中一定能更好的相互理解。研究汽车的物理学家不需要亲手去造汽车,但也要在研究一种新的发动理论之后,先做一个小型的发动机来展示理论的优越性,并能在汽车制造商上门运用其理论的时候能有一定的生产知识指导新型发动机的开发。
所以我的结论是CS需要学习programming,再加上CSer的职业可能转向更多领域,programming就更是重要了。既然需要学,那么回到原来的问题:CS!=SE是不好好教programming的原因吗?
大家讨论的原因主要是,大学4年时间有限,CS的涵盖内容太丰富,而programming又是个费力不讨好的内容,所以往往即便开设了programming课程,老师也没办法让新手真正学到什么。这时候,问题似乎开始有了答案:不好好教programming的原因不是CS!=SE,而是时间太有限,算法等理论很重要,programming本身就不好教(而且相比于理论,似乎看得到的效果微乎其微),因此只好让位。
那么怎么办呢?网友有3个建议:
1).请企业中的开发者参与programming的教学
2).学生自己应该有自我发现的能力,you develop software on your own,teacher give you time to develop your skills semi--autonomously
3).programming更需要在实际的工作经验中学习
我认为这3个建议都很有道理。第一个建议可不就是我们的软工课吗,邹老师带给我们的是全新的体验,用企业化的模式让我们实实在在的动手做了很多,并在动手的过程中嵌入并体会了很多programming的知识,我认为这样的教学模式的确很有帮助。第2个建议是在团队工作中体会到的,我们的团队项目就是因为兴趣使然,大家喜欢这个想法,想做出这个游戏,就真的develop software on our own了,而且老师也给予了很多时间和支持让我们放手去做。第3个建议是很自然的,学校毕竟是学校,我们只能管中窥豹,只有实际工作才能教会我们programming。
综上所述呢,我对这两个问题的答案是:
1).不好好教programming的原因不是CS!=SE
2).CS课程里我不会为了programming而开设这门课,结果教学方法不对导致programming成了文档课。如果能邀请到经验丰富的企业中的开发者,就开设实战性的programming课(也是为了提供学生一个自主学习的机会),否则作罢,因为programming的学习更多的取决于学生本身以及未来实际的工作经历。