背景:
目前中国大陆大学里学的编程主要有两种:
大部分同学到了工作中都用不着上面两种能力 (忘了语言细节可以查; 不用像比赛那样在短时间内搞尖端的算法) , 但是他们要写高效的,可维护的,经得起实际考验的程序,而且往往会用到大学里没有讲到的语言来做。
没有这些知识和经验的同学, 就很痛苦,例如这个同学做软工课的第一个作业:
http://www.cnblogs.com/76er/archive/2012/09/25/2703143.html
又如这个被这个同学吐槽的:
http://www.cnblogs.com/buptzym/archive/2013/05/25/3099389.html
同学们对现有的程序设计课也有很大意见:
http://www.cnblogs.com/SuperBrothers/archive/2012/12/11/2812678.html
很多人在Blog中都提到了我们大一的时候一门选修课——Java。(实质上应该叫“Java语言程序设计”),但是课上根本没有,对就是根本没有教会我们如何使用Java语言解决工程上任何实际的例子。甚至Console输出Hello World!\n 都是自己查的Baidu。 然后考核方式是“开卷答题”+“2000行Java大作业”。学了半天什么什么历史,什么什么面向对象的啥啥啥,能写程序吗?开卷考试抄就行了。大家都是80、90分。大作业怎么办?谁都不会写,写出来都是面向过程风格的C-style的代码。能完成一个工程么?肯定不能。那怎么办?只有拿别人的代码抄抄改改。 |
http://www.cnblogs.com/buaashine/archive/2012/12/10/2808107.html
这样又引申到了“很有名”的Java课。 全年级200多人,在Java课上学会Java的,我想不超过10个吧,每年每届学生都是如此,老师在讲台上空谈概念,没有课后练习,没有实际例子,考试考什么是接口,try...catch有什么用,由于是开卷考试,我们都“答出”了“标准答案”,但谁也没学会。
所以看起来这是一个缺口: 如何为了写高质量的程序而学习各种编程理论,技术和技巧。实事上可以说是我的《现代软件工程》课的前 1/3 内容: 个人项目和结对项目。
对学生的要求:
讲课的安排 (大约有12 次课):
a. 单例 (singleton)
在这个课程中, 我们想让学生有机会在实践中学到程序设计的一些原则 (我都不全懂, 也不会全讲, 或者全部强加给学生)。 例如:
Single Responsibility - a class should have only one reason to change
Open-Closed Principle – software components should be open for extension, but closed for modification.
Liskov Substitution Principle – subtypes must be substitutable for their base types
Dependency Inversion – Abstractions should not depend upon details. Details should depend upon abstractions.
Interface Segregation Principle – clients should not be forced to depend upon methods that they do not use. interfaces belong to clients, not to hierarchies.
Release-Reuse Equivalence – the granule of reuse if the granule of release.
Common Closure – the classes in a package should be closed together against the same kinds of changes.
Common Reuse – classes in a package are reused together. if you reuse one of the classes in a package, you reuse them all.
Acyclic Dependencies – Allow no cycles in the package dependency graph
Stable Dependencies – depend in the direction of stability.
Stable Abstractions – a package should be as abstract as it is stable
课怎么上?
所谓做中学 ( learning by doing), 大家写好玩的程序, 互相观摩, 看书上网查资料, 相互学习, 写点博客记录心得, 录点视频展现效果。我对编程语言懂得不多,但是手头题目倒是挺多的。 作业肯定不少,但是大量的作业不是压迫学生,而是通过有深度有难度的作业来调动、发挥学生的潜能。软件开发这么好玩,真正感兴趣的同学会做很多作业之外的探索。
怎么评分?
据说有很多考研补习班都是以 “包过” 为口号, 我觉得如果学生每个题目都认真做了, 分享了必要的博客/视频,一定会过的。
这是网络公开课么?
课是在北航计算机学院上 ( 讨论中 )。 资料尽量放到网上,学生的程序/博客/视频都是公开的。
上课时间地点:
周一晚上 6-8pm 北航 主南 210, 10/21 号起,时间不变,但是地点改在新主楼 D218。
课程质量如何?
今年是第一次开课, 大部分东西的第一版都不怎么样, 所以不要期望值太高。 然而驽马十驾, 功在不舍, 持续改进几年之后, 也许会有可观之处。
课程的教材 和 TA:
中文版 代码大全 (第二版) 斯蒂夫·迈克康奈尔 ISBN: 7121022982 Code Complete (2nd Ed) Steve McConnell ISBN: 9780735619678
Agile Software Development Principles, Patterns, and Practices, by Robert C. Martin
重构:改善既有代码的设计 Martin Fowler (马丁 福勒), Kent Back, et al.
课程的的定位和扩展:
参考 习而学的软件工程教育, 这门课的定位: “数据结构 & 算法” --> “C 或者 JAVA 语言初步” --> “现代程序设计语言 I” --> “现代软件工程”
这门课有许多内容可以放进来, 但是考虑到一般大学生的水平和时间, 一些深入的话题可以放在 现代程序设计 II 中。
未决定的议题: 可以分两门课, 由浅入深。第一门课用 C, JavaScript 语言为例, 讲程序设计基础, 第二门课扩展到 (Python,Java, C++)同时讲接口设计, 设计原则, 重用,重构等。
当然还有 @GeniusVczh 的 一系列关于程序语言的文章。
这门课不讲什么:
算法, 某种程序设计语言的基本语法,编译原理, 程序和用户的交互, 用户需求分析,项目的管理, 软件的测试。
打分:
每次作业大都要交两个部分, 代码和博客
a) 代码签入到 GitHub 中, 包括代码, 测试用例, 使用说明, 测试数据。 等。
b) 博客写到cnblogs.com 自己的博客账户中。博客写什么:
a. 程序的架构和思路
b. 自己在写这个程序的心得
c. 自己在这个作业中的时间消耗和开发效率分析 (请看软件工程师的能力和评价)
d. 程序运行结果的截屏或者效果的录像
每次作业满分10 分, 每次博客满分10 分。把同学的作业和博客按照质量分为4档:
第一档: 9 – 10 分 (不超过1/3)
第二档: 5 – 6 分 (不超过1/3)
第三档: 2 – 4 分
第四档: 1 分
迟交作业的同学: 0 分.
超过截止日期两周不交作业的同学: -5 分.
注: 一些题目:
纵横加, word search, 彩球, Programming Pearls: graph generator