分享下在美国读研期间的一些计算机课程作业

分享下在美国读研期间的一些计算机课程作业

以前我做过一些培训工作,前不久还给南通大学帮做了一学期助教工作,所以也算是有当老师的经历。真正当老师的时候,一个很有挑战的工作就是如何设置合理的作业,让学生通过作业去学习和巩固所学的知识,这也是我当老师时比较头疼的地方。所以现在以学生身份上课的时候,会特别去留意老师是怎么布置作业的。正好一个学年即将结束,有几门计算机课程的作业布置,颇有些值得学习和借鉴的地方,简单总结分享一下。

面向对象课程作业,通过完整项目学习应用面向对象和设计模式

第一学期有门课叫《Object-Oriented Software Development》,主要是讲面向对象和设计模式,为了帮助同学们更好的理解面向对象和设计模式,老师精心设计了一个股票交易的系统,用面向对象思想来设计实现,并且应用像Factory、Flyweight、Data Transfer Object、Singleton、Observer等设计模式。

当然如果你以为老师只是一个简单的需求,就指望学生们能设计出一个很好的架构并且还能应用各个设计模式,你就太高估学生们的水平了。考虑到同学们的水平参次不齐,所以老师采取了一些措施来保证最终作业质量:

  • 将学生分组,3个人一组,水平高的带着水平低的
  • 将作业分成4期,以保证每个阶段有检查点,不至于到期末突击还完不成任务。
  • 提供详细设计文档,细致到接口、类和方法,同学们只要按照说明实现方法即可,如下图所示:

  • 既然分成了四个阶段来完成,而且每个阶段都需要依赖前一个阶段的结果,那么怎么保证每个阶段的结果正确呢?老师帮助写了很多单元测试代码,要确认代码没有问题,先保证单元测试都能测试通过。
            Tradable tradable1 = null;
            Quote quote1 = null;
    
            System.out.println("1) Create and print the content of a valid Order using Tradable reference:");
            try {
                tradable1 = new Order("USER1", "GE", PriceFactory.makeLimitPrice("$21.59"), 250, "BUY");
                System.out.println("Tradable's toString: " + tradable1 + "\n");
            } catch (Exception e) {
                System.out.println("An unexpected exception occurred: " + e.getMessage());
                e.printStackTrace();
            }
    
            System.out.println("2) Create and print the content of a TradableDTO:");
            TradableDTO tDTO = new TradableDTO(tradable1.getProduct(), tradable1.getPrice(), tradable1.getOriginalVolume(), tradable1.getRemainingVolume(),
                    tradable1.getCancelledVolume(), tradable1.getUser(), tradable1.getSide(), tradable1.isQuote(), tradable1.getId());
            System.out.println("TradableDTO's toString: " + tDTO + "\n");
    
    ... ...
    
    

这样一个学期下来,一个股票交易系统就算是做好了,最终做出来效果还是挺不错的。

另外,为了避免有些同学编程能力不足,或者前期发挥不好,老师还提供了额外的附加作业,这些作业可以提供附加分数,这样努力一点也能有个不错的分数。

程序语言概念作业,通过Git提交作业,详细的单元测试,

这学期选了一门课《PROGRAM LANGUAGE CONCEPTS》,讲各种程序语言概念的,编程语言以Scala为主,作业也是Scala语言,这门作业有几点设计的蛮好:

  • 统一使用git提交代码,代码托管在 Bitbucket 上面,开学初老师就让每个同学注册了一个Bitbucket账号,然后给同学们初始化好作业相关的Repository,后面的作业都通过BitBucket来提交
  • 每道题提供了详细的注释说明,什么该用什么不该用都写的很清楚
  • 提供完整单元测试代码供测试。为了确保程序正确,老师针对每个方法写了很多单元测试代码,基本上单元测试能通过就表示程序没什么问题。
  • 每节课开始前点评讲解上一次的作业。实际上能这么做的老师很少,但是对学生来讲,及时的反馈和点评上一次的作业非常有帮助,这样可以知道标准的做法是什么,自己为什么会错。

iOS移动App开发,与时俱进,涵盖各个知识点,考试是自主开发一个完整的App

这学期还选了一门iOS的课程,作为一个已经有多年iOS开发经验的人来说,这门课对我没什么难度,从老师的课程内容和作业设置来看,老师对iOS和swift语言的发展跟进非常及时,所有的内容都基于最新的iOS 9和Swift2.0展开,作业设置也比较合理。从简单的HelloWorld到稍微复杂一点的计算器,再到复杂的TableView,最后考试是自主开发一个完整的App,综合运用前面所学的知识。

每一次作业老师的要求都很明确,包括:

  • 截止日期和提交注意事项
  • 作业的目标
  • 详细的需求说明
  • 难点提示

在作业的设计上,比较注意难易度的梯度,前后作业的关系,一学期的作业安排如下:

  1. Hello World项目,没什么难度,只要输出一个HelloWorld即可,重点是搭建iOS开发所需要的环境
  2. 使用Playground写几个简单的Swift算法,熟悉Swift语言
  3. 实现一个简易的计算器,只要求实现加减法,进一步了解Swift语言,学会查文档,使用基本控件
  4. 简易电视遥控器界面,相对复杂的界面,需要和数据进行绑定

  5. 购物清单,学习文本输入框的使用
  6. 基于第四次作业升级,实现DVR播放器界面,还要能在两个界面之间切换。主要是熟悉界面动画,应用对话框

  7. 实现对遥控器数据的配置,同时整合电视遥控器和DVR遥控器。熟悉UITabController的使用,以及多界面之间的数据共享
  8. 实现一个列表详情的App,应用动态列表和导航
  9. 大作业,等于期末考试,自主命题,但是要求应用到所学的知识。

如果要对这些作业做个简单的总结,我觉得主要还是在以下几个方面:

要求明确,目标清晰

以iOS作业为例,每次作业都会清楚的说明提交的要求,作业的目标,详细的需求,还有难点的提示。

难度适中

比如面向对象作业,虽然是一个很复杂的系统,但是通过组队和详细设计文档,还是能保证同学们一起完成这些项目。像iOS的期末大作业,也可以让能力比较强的同学有发挥的机会。

及时反馈

有些作业,老师会提供单元测试代码,我觉得这是一个非常好的反馈方式,通过单元测试,同学们可以养成良好的喜欢,另外也不至于写出来的代码有太大偏差。另外像程序语言概念这门课老师,每节课都会讲解点评上一堂课的作业,这样可以及时的直到问题所在,及时改正。

严格要求

在美国,对于抄袭是0容忍的,经常能听到有同学作弊被开除的新闻,所以基本上大家都不会有这样的想法。另外对于规定好的截止日期,如果没有按时交,当次作业的分数就会是0分。

同时,有些课程的老师还会提供一些附加题,让犯了错误的同学也有弥补的机会。

发布于 2016-03-01

文章被以下专栏收录