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

背景: 

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

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。 然后考核方式是“开卷答题”+“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 内容: 个人项目和结对项目。

 

对学生的要求:

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 语言为例, 讲程序设计基础, 第二门课扩展到 (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代软件工程 团队作业 - 软件分析和用户需求调查 (2013)

【现代软件工程 的讲义】 医学院的学生, 要解剖人体; 软件行业的从业人员, 不管是项目经理, 开发或测试人员, 都要学会解剖分析软件, 我们就来试试看。 要求: 通过定性, 定量地分析, 总结和评定某软件是否满足了目标用户的需求,并把分析的过程和结果用博客表达出来…

现代程序设计 学生情况调查

【课程设计在这里】 既然开始上课,就要把目标受众研究一下,搞清楚他们的需求。下面是我在课上做的调查。由助教整理。 (学生都是计算机学院大三上学期, 还有一些高等工程学院的学生) 黄色标注的代表是人数最多的选项 代码量…

现代程序设计 作业 第1次

第 0 次作业已经在课堂上做了。 1) 建立 GitHub 账户, 把课上做的 “最大子数组之和” 程序签入 2) 在 cnblogs.com 建立自己的博客。 写博客介绍自己的 GitHub 账户. 并把博客地址写到这个博客的留言。这样TA 可以收集信息 3) 搞到一本教科书 (三本中选一本), 并在博客中说…

现代程序设计 作业 2

我们上节课讲了 返回整数数组中最大子数组的和 这个问题。 我们第二次作业在这个基础上扩展。 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数, 见 MSDN 的定义. 当然, 行…

现代程序设计 作业 3

这个作业是采取结对编程的方式完成。 在上一个作业中, 我们尝试了各种命令行的处理,以及各种数组的处理。 现在, 我们要把 现代程序设计 作业 2 的各个结果转换成图形界面显示。这个问题看起来很难, 实际上大部分难的工作都在上一个作业完成了 (数组计…

现代程序设计 作业4

英语国家的小孩们经常玩 Word Search 的游戏, 就是在一个填满字母的矩阵中把单词找出来。 这是一个简单的例子: (来自 wikipedia) 这是一个比较复杂的例子: 这是答案: 美国的商店里还有不少 word search books 卖, 两三块钱一本。 让我们把这个有趣的…

现代程序设计 作业5

在前四个作业中, 我们体会了数组,子数组的和,二维数组,字符串和字母的处理, 简单和复杂的 UI 程序等。大家锻炼了命令行的处理,模块的持续重构和演化,单元测试,UI 程序的处理&#x…

现代程序设计 作业6 - 简单而有意义的题目

这是这个课件的一部分: 现代程序设计 (课程设计中, 征求意见稿) 好多同学们都说题目难,这回我们来一个简单而很有意义的。 :) 写代码爽还是读代码爽? 往一堆乱麻中再加上一些线索,似乎比较容易;然而从…

现代程序设计 作业7 - 更加简单的题目

在网上,当用户发现一个新东西 (海洋里捞出来的新物种,奇怪颜色的飞鸟,某种新的植物等), 大家会问下面的问题: 能吃么 好吃么 怎么吃 这三个振聋发聩的问题被吃货们简称为能好怎, 大家可以打开链接看看&…

现代程序设计 作业9 - 综合练习

经过大半学期的学习和练习, 我们把学到的东西综合起来。 在作业2 (http://www.cnblogs.com/xinz/p/3318230.html ) 中, 同学们用各种方法 (主要是动态规划,外加一些遍历)计算了一维和二维数组中最小最大子数组的和。 当然,程序在…

对微软实习生或者工作感兴趣的读者, 目前我的项目是...

从 2018/4 开始,我在微软亚洲研究院(北京)工作,做AI 工具的研发,请看:https://github.com/microsoft/ai-edu --------------- 从2014/7/28 开始,我在Windows 的中国工程团队干活: http://weibo.com/355…

现代软件工程 第一章 【概论】练习与讨论

0. 学习别人的经验和体会。 同学们在上这门课的时候,都是大二,大三,有的是跨专业考研过来的。觉得在大学里,到教室来听课有意思么?请看:你为何要来上课并且认真参与, 另外,请看&…

现代软件工程 第二章 【个人技术】 练习与讨论

1 基本作业: 从Hello World开始 要求每个读者(或者学生)开始管理自己的源代码: 每个人都有一个VSTS的客户端,系统管理员给每一个人都创建了TFS项目,每个学员都是各自项目的管理员。每个同学去申请一个GitHub [i]的项目&#xff0…

现代软件工程 第三章 【软件工程师的成长】练习与讨论

1. 选哪一种医生? 作为一个软件工程师, 你觉得自己表现如何? 有没有这样的体会: 看书的时候觉得“技止此耳”,开发项目的时候才觉得实际情况和书上讲的都有一些出入,一些重要的细节书上没有提。我们很多人是边看Asp.net的书, 边开发Asp.ne…

现代软件工程 课件 软件工程师能力自我评价表

这是《构建之法》和软件工程教学的一部分,用于学生/工程师自我评价。 软件工程师如何评价自己的能力? 有人写Java,有人用C,还有人用1980年代就出现的 Object-C, 有人写前端,有人写后端,有人偏于行业应用&a…

现代软件工程 第四章 【结对编程】练习与讨论

4.7.0 结对编程的练习题 地铁导航和遍历 4.7.1 结对项目的案例和论文 在现代软件工程教学的过程中,同学们已经总结了不少切身体会。例如: 总结1[i]:那是project到了比较关键的创造阶段,整整一天,我们俩椅子靠椅子的坐在电脑前&am…

现代软件工程 第五章 【团队和流程】练习与讨论

团队模式和团队的开发模式有什么关系?如果你领头开展一个全新的项目,你要怎么选择“合适”的团队模式?不同的团队模式如何影响团队绩效的评估?团队精神和集体主义的区别? 大家回想在小学和中学的学习过程&#xff…

现代软件工程 第六章 【敏捷流程】练习与讨论

6.3.1 什么时候适合选择敏捷 我们看了这么多方法论之后,一些同学一定比较困惑,到底选择哪一种开发方法比较好呢? 这在实践中不是难题,有学者还列出了一些简单的问题来帮助人们做决定[i]: 表6-3 问题引出方法 问题 Yes – 偏向传…

现代软件工程 第七章 【MSF】练习与讨论

7.7 移山开发方法——比TFS敏捷更精简 几个软件学院的学生来请教阿超,同学们自豪地说,我们要用全套TFS敏捷开发模式开发项目! 真的?阿超不敢相信。 同学: 对!我们要用全5个工作项类型 – 任务、缺陷、场景…

现代软件工程 第八章 【需求分析】练习与讨论

1 扩展阅读下面两篇文章也说明了软件估计的难度: Steve McConnell 软件估计的 10 种罪:http://www.ewh.ieee.org/r5/central_texas/austin_cs/presentations/2004.08.26.pdf Quora精选: 为什么软件开发周期总是预估的2~3倍http://jandan.net/201…