现代程序设计 (课程设计中, 征求意见稿)

背景: 

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

1)      学编程为了应付考试,偏重于静态的知识点, 语言细节。以闭卷考试为主。有些学校的数据结构和算法课有许多实际的练习,也有的课程练习很少。

2)      学编程为了ACM 算法比赛,偏重于算法, 解决抽象的问题。主要是由兴趣小组/面向比赛方式。

 

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

 

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

 

      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 内容: 个人项目和结对项目。

 

对学生的要求:

1)  针对大学二/三年级学生; 假设学生已经会了数据结构/基本算法, C/Java 的基本语法和一些程序设计常识并有一些实践。

2)   先修课:  数据结构和算法;

 

 

 

讲课的安排 (大约有12 次课):

1)   建立和维护自己的源代码库 (GitHub),  基本操作; 建立和维护自己的技术博客, 开始每个学生报告目前会的语言和代码量.

2)   程序如何处理用户的输入

3)   写容易懂的程序  (代码复审,结对编程), 程序理解,写让人懂的程序  (代码可读性)

4)    C/C++  语言中的基本设计模式  

a.    单例 (singleton)

5)    程序如何测试效能 (Performance)

6)    如何做单元测试

7)    一个进程里面的线程如何通讯

8)    模块之间如何通讯 (API 的设计)

9)    程序之间如何通讯,  怎么让不同语言写的程序互相通讯, RESTful 设计

10)   如何设计程序去测试别的程序

11)   写能处理大数据的程序

12)   可扩展的程序

 

 

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

  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 的 一系列关于程序语言的文章

 

 

这门课不讲什么:

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

 

打分:

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

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

posted @ 2013-08-17 18:23  SoftwareTeacher  阅读(5911)  评论(8编辑  收藏  举报