8

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

 3 years ago
source link: https://zhuanlan.zhihu.com/p/20610349
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

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

fb73a471b777aa39c73f6c8887700fb4_720w.jpg当然如果你以为老师只是一个简单的需求,就指望学生们能设计出一个很好的架构并且还能应用各个设计模式,你就太高估学生们的水平了。考虑到同学们的水平参次不齐,所以老师采取了一些措施来保证最终作业质量:
  • 将学生分组,3个人一组,水平高的带着水平低的
  • 将作业分成4期,以保证每个阶段有检查点,不至于到期末突击还完不成任务。d89d8a3df896c2d1b9167b87b4ada441_720w.jpg
  • 提供详细设计文档,细致到接口、类和方法,同学们只要按照说明实现方法即可,如下图所示:
dcdbf7383046ced5dbc5b4a33d1f9fed_720w.jpg
  • 既然分成了四个阶段来完成,而且每个阶段都需要依赖前一个阶段的结果,那么怎么保证每个阶段的结果正确呢?老师帮助写了很多单元测试代码,要确认代码没有问题,先保证单元测试都能测试通过。
            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分。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK