背景: 

      目前中国大陆大学里学的编程主要有两种:

 

大部分同学到了工作中都用不着上面两种能力 (忘了语言细节可以查;  不用像比赛那样在短时间内搞尖端的算法) , 但是他们要写高效的,可维护的,经得起实际考验的程序,而且往往会用到大学里没有讲到的语言来做。 

 

没有这些知识和经验的同学就很痛苦,例如这个同学做软工课的第一个作业:

 

      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。 然后考核方式是“开卷答题”+2000Java大作业”。学了半天什么什么历史,什么什么面向对象的啥啥啥,能写程序吗?开卷考试抄就行了。大家都是8090分。大作业怎么办?谁都不会写,写出来都是面向过程风格的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)

 

 

在这个课程中, 我们想让学生有机会在实践中学到程序设计的一些原则 (我都不全懂, 也不会全讲, 或者全部强加给学生)。 例如:

  1. Single Responsibility - a class should have only one reason to change

  2. Open-Closed Principle – software components should be open for extension, but closed for modification.

  3. Liskov Substitution Principle – subtypes must be substitutable for their base types

  4. Dependency Inversion – Abstractions should not depend upon details.  Details should depend upon abstractions.

  5. Interface Segregation Principle – clients should not be forced to depend upon methods that they do not use.  interfaces belong to clients, not to hierarchies.

  6. Release-Reuse Equivalence – the granule of reuse if the granule of release.

  7. Common Closure – the classes in a package should be closed together against the same kinds of changes.

  8. Common Reuse – classes in a package are reused together.  if you reuse one of the classes in a package, you reuse them all.

  9. Acyclic Dependencies – Allow no cycles in the package dependency graph

  10. Stable Dependencies – depend in the direction of stability.

  11. 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.

 

助教的博客: http://www.cnblogs.com/softwareTA/ 

 

 

 

课程的的定位和扩展:

参考  习而学的软件工程教育, 这门课的定位:   “数据结构 & 算法”     --> “C 或者 JAVA 语言初步”   -->  “现代程序设计语言 I”   --> “现代软件工程”

 

这门课有许多内容可以放进来,  但是考虑到一般大学生的水平和时间,  一些深入的话题可以放在  现代程序设计 II 中。

 

未决定的议题:   可以分两门课,  由浅入深。第一门课用 C, JavaScript 语言为例讲程序设计基础第二门课扩展到 (PythonJava C++)同时讲接口设计设计原则重用,重构等。

 

当然还有 @GeniusVczh 的 一系列关于程序语言的文章

 

 

这门课不讲什么:

算法, 某种程序设计语言的基本语法,编译原理,   程序和用户的交互,  用户需求分析,项目的管理, 软件的测试。

 

打分:

每次作业大都要交两个部分,  代码和博客

  1. a)      代码签入到 GitHub 包括代码测试用例, 使用说明, 测试数据。 等。 

  2. b)      博客写到cnblogs.com 自己的博客账户中。博客写什么:

a.       程序的架构和思路

b.      自己在写这个程序的心得

c.       自己在这个作业中的时间消耗和开发效率分析 (请看软件工程师的能力和评价

d.      程序运行结果的截屏或者效果的录像

 

每次作业满分10 ,  每次博客满分10 分。把同学的作业和博客按照质量分为4:

第一档:  9 – 10    (不超过1/3)

第二档: 5 – 6      (不超过1/3)

第三档: 2 – 4 

第四档:  

迟交作业的同学: 0  .

超过截止日期两周不交作业的同学 -5 .

 

 

 

 注: 一些题目:

        纵横加,  word search,  彩球, Programming Pearls: graph generator