面向对象,启航2018

我们从酷热的夏天开始,在经历了补给站课程和预备性的先导课程之后,又开始着手准备2018年的OO课程。OO这一年来就从来没有离开我们教学团队的手头热词。赞我们的教学团队、STAR团队和系统开发团队。相比较于2017年,我们在2018年引入的新举措之多,力度之大,难度之艰,差不多只能用疯狂这个词来形容了。能够解释这个疯狂决策和行动的理由,恐怕也就是我们爱教学啦。我们真的有些“贱”,自嘲一下。

上图摘自课件。需要注明的是“资深工程师”是来自七牛的白顺龙先生。这里必须感谢许先生和白先生,为他们对教育的热爱和无私奉献的精神而感动。新的一年启航,除了上述7个举措,我们同时也在持续优化课程的相关设计和规则。该篇博客的重点是公告课程规格说明,帮助同学们和尊敬的读者更好理解OO课程,特别后续逐渐发布出来的精彩内容。

《面向对象设计与构造》课程说明书

1.   前言

作为北京航空航天大学计算机学院的一门标杆课程,《面向对象设计与构造》(下简称为OO课程)采用了“大课重课”模式进行持续的建设和改进。目前,课程建设受到了学校“凡舟”项目、教育产学研项目(华为)、新工科项目(腾讯、北航)等的支持。突出复杂软件能力培养、采用竞争性学习方法是OO课程的主要特色。制定该说明书的目的是系统完整的阐述OO课程的目标、训练方法、训练的设计考虑、作业流程和组织与沟通等,从而帮助同学们更好理解这门课程,并在实践训练中能够形成相应的能力。

2.   课程目标

任何一门课程都承载着传承知识的目标,OO课程也不例外。然而,对于软件开发类课程而言,我们的理解是,所有的规则和要求都来自于前辈们在实际开发中的总结提炼,既有经验教训,也有内在的预见性洞察。训练是让书本或互联网上的经验、知识变成同学们自己内在体会和理解的关键性手段。OO课程通过“大小周期”相结合的训练来让同学们掌握扎实的开发能力和测试能力。所谓大周期指每周一个作业,小周期则是指在一次作业中,分成了若干阶段,并都有具体的截止时间要求。OO课程团队在领会和理解计算机学院的培养体系基础上,为这门课程设置了如下的培养目标:

(1)     培养软件开发能力。开发能力指能够在规定时间内,针对给定的软件需求和设计要求,开发出满足相应要求的高质量软件。

(2)     培养软件测试能力。测试能力指能够在规定时间内,针对给定的软件需求和设计要求,在给定的代码实现中通过明确的测试用例来发现尽可能多的缺陷。

针对软件开发方法与技术的发展和企业的实战要求,课程强调规格化设计、线程安全、层次化设计、均衡性设计、自动化测试、基于规格的正确性验证等知识点和技术,它们构成了开发能力与测试能力的具体内涵。课程训练项目的规模和难度迭代上升,从第一次大致300行规模开始,直到最后能够在一周内设计实现2000行左右的代码,且能够使用逻辑论证的方式来确认程序的正确性。

3.   课程采用的训练方法

课程采用竞争性训练方法,这是一种得到了很多应用的学习训练方法,其基本思路是构造竞争性任务,通过在同学之间建立竞争关系来调动同学们的学习投入。这种方法在应用中取得了很好的效果,本课程采用竞争性学习的主要考虑包括:

(1)     开发与测试内在具有竞争关系。在大部分软件开发类企业中,都设置有独立的开发团队和测试团队,这两个团队之间的配合就是通过竞争机制来实现的。如果开发团队所提交的代码被发现的bug数量上升,表明开发团队的工作出现了问题;如果软件产品在发布之后发现的bug增多,表明测试团队的工作出现了问题。

(2)     个体之间的竞争在学习和职业过程中是常态。只要存在资源受限,就一定有竞争。适应并合理善用竞争也是一个重要的能力。

(3)     竞争性学习是能够在有限时间内,以开发与测试并重的方式来训练和培养开发能力和测试能力的有效办法。

OO课程采用了竞争性学习方法,有如下三种具体的竞争场景:

(1)     双盲互测竞争。这是最主要的竞争,也是源自于开发与测试的内在竞争关系。为了避免过度竞争,课程引入了带有分类树的公共测试,限制和约束了竞争的空间,避免了同学们因一次作业没做好而直接导致通过课程考核出现巨大风险的问题。

(2)     无效bug的申诉竞争。如果开发者所收到的bug是重复报告的bug,或者是因测试者对指导书的误解,而把实际上不是bug的情况误报为bug,开发同学可以提起申诉。在申诉过程中,延续开发者与测试者的竞争关系,在解决分歧的过程中需要“摆事实、讲道理”。如果申诉成功,则移除相应的bug报告,开发者之前被扣的分数还回来,而测试者之前所得的分数则退回去。

(3)     积分排位竞争。每个同学在每次作业中都会取得积分,累加到总积分后按照体育比赛中积分排位的方法来进行排序。排序之间的关系会在一定程度上影响最终的成绩评定。

4.   课程训练的设计考虑

OO课程按内容划分成四个教学模块,在每个教学模块中通过3次开发测试训练和1次总结博客。在开发测试训练中,既有新项目,也有在之前项目基础上的增量式开发测试,对应企业开发中的两种经典场景。在新项目训练中,同学们要注意对需求的整体进行分析,并开展具有一定扩展性的设计,以备将来需求的调整变化。在增量式项目中,一方面训练学生如何对程序的设计和实现进行必要的扩展和重构,另一方面训练修复bug的能力。

设计是本课程关注的重点。如何从代码编写体验提升到自觉的设计体验,进而具备优秀的架构设计能力是本课程的一个重要训练要点。因此,除了在作业指导书中明确设计要求之外,本课程更是把规格化设计作为重要的训练内容,要求同学们通过撰写规格,并确保代码和规格一致来培养严格和精细化的软件设计能力。

测试的重要性毋庸置疑,测试用例设计是其中最关键的能力。本课程的项目训练中会涉及到三类不同的测试设计:

(1)     基于输入和输出关系的测试设计。这是一种常见,也是比较简单的测试场景,按照需求中关于输入和输出的划分来组合设计相应的测试用例,在测试设计中不需考虑程序的执行过程状态变化。

(2)     基于对象状态的测试设计。这是一种常见,有一定难度的测试场景,除了考虑输入和输出,还需要对象状态作为一个隐含变量考虑进来设计测试用例。在设计时需要把相关对象的状态进行划分,并与输入数据进行组合,通常可以有效发现隐藏的缺陷。

(3)     基于线程状态的测试设计。这是一种难度较大的测试场景,要考虑多个线程的调度状态、交互关系、共享数据的状态、以及同步控制机制等来综合设计测试用例。这种测试设计很好的综合了上述两种测试设计场景。

总结提炼是能力提升的重要环节。通过总结来把相关的知识、理解、存在的问题和所掌握的技术进行融合,从而形成内在的能力。总结博客作业是非常重要的一环。OO课程的项目代码和测试用例并不会在公共网络环境公开,而总结博客则会依托相关的网络平台公开发布,将会有更多的人来分享同学们的进步。社会对总结博客的评价,也是对这门课程的评价。这是一个开放性的尝试,为课程改进提供宝贵意见。

必须注意到软件开发在不断的发展,包括编程语言、设计方法、测试方法、开发模式、开发环境等。本课程使用Java语言,未来会考虑如何融合最新的面向对象语言。在设计方法、测试方法、开发模式和开发环境四个方面,本课程分别采取了如下训练设计考虑:

(1)     设计方法:强调层次化设计、均衡性设计和更一般化的设计原则,在此基础上训练规格化设计。所有的设计训练都融合在开发测试训练中,服务于代码质量。

(2)     测试方法:强调如上所述的三种测试设计,并结合具体的项目训练来实施。此外,本课程最后还要使用junit来开展测试自动化的训练。

(3)     开发模式:传统课程范畴内的开发都是在本地建立一个项目,通过目录来管理不同的代码版本。本课程要求按照git来管理开发,作业提交也通过git协议来自动拉取代码文件。

(4)     开发环境:随着技术的发展,开发环境越来越复杂,涉及到多种不同版本的组件在一起,特别是对于大规模项目开发而言,开发环境的配置是个非常麻烦的事情。本课程实施基于云的开发训练,在云端统一配置相应的开发环境和测试环境,避免本地机器在操作系统、java环境和IDE配置上的差异导致运行出现不同的效果。

5.   作业流程

流程化的作业管理是本课程的一个特色,包括如下几个阶段:

(1)     项目发布。在该阶段,发布指导书和相应的MOOC视频,同学们可以在系统中交流对指导书的理解,助教也会回答其中的相关问题。

(2)     项目开发。在拿到指导书之后,同学们需要开展设计、开发和自测试。开发有明确的deadline要求,务必要在规定时间内把完整和最新的代码提交到git库,否则造成无法拉取到有效的代码文件,由同学个人负责。在项目开发阶段,需要围绕需求和设计要求做必要的调研和学习,仅仅依靠课件并不能完成项目。

(3)     项目有效性检查。在项目开发deadline之后,系统会自动拉取代码文件,然后自动执行两个任务:抄袭检测和有效性检测。抄袭检测会自动与历届同学的代码进行语法树层次的代码相似度检查,超出了一定相似度后,系统会自动给相关同学一个通知,要求务必进行确认,并指出抄袭者。否则两个人视为共同抄袭。值得指出的是,OO课程对抄袭是零容忍。一旦出现抄袭,抄袭者就不可能通过课程考核。有效性检测则是基于有效性规则自动进行检查,助教会对疑似无效作业进行再次检查确认。

(4)     测试分配。只有有效的作业才会进入测试分配。测试分配也是一个自动化的后台任务,会根据同学们的成绩排名情况,给每个人分配一个排位相近的同学所提交的代码文件,以进行双盲测试。系统确保不会出现A测试B,B测试A这种情况。每次测试分配时,系统会查询上次的分配情况,并尽量避开重复配对情况。

(5)     项目测试。在测试阶段,同学们可以看到公共测试结果,并按照要求实施互测。所有的bug都以在系统中的报告为准,要求分类树的每个分支最多只能有一个bug报告。公共测试如果在某个分支没有发现bug,同学们可以在该分支去探索发现可能的bug。也可以根据情况对分类树进行扩展,来报告自己所发现的bug。目前课程规定最多只能对分类树扩展两个分支。项目测试阶段也有deadline控制,务必注意时间节点。

(6)     测试结果发布。在测试结束之后,系统会自动整理bug报告和公共测试结果,并推送到每个人的账户中,同学们可以查看自己所写程序被发现了多少个bug,自己发现了别人多少个bug,公共测试的通过情况等,也可以了解自己的成绩排位情况。

(7)     Bug分歧申诉。该阶段针对测试者所报告bug可能有重复或者误报的情况,开发者需要在系统中提起申诉,填写相应的客观证据。要求测试者进行回应。如果双方不能达成一致意见,助教会介入处理。

6.   课程成绩评定

本课程借鉴体育比赛的积分排位制度,即累计每次作业所取得的积分,然后排序。课程会根据同学们的作业完成情况确定及格线,排名越高,成绩相对越高。

每次作业能够取得的积分包括:

(1)     作业训练基准分。按照指导书确认项目的难度和工作量,综合决定基准分。

(2)     公共测试通过情况。根据所通过的公共测试用例及相应的权重,获得的加权积分。

(3)     测试所发现的bug分。针对所报告bug的类别和个数,综合决定的分数。

(4)     实验任务完成分。完成了实验任务后,会根据完成情况和质量获得相应的积分。

(5)     被发现的bug扣分。所写程序被发现了bug后,会形成相应的负积分。

(6)     奖励积分。会在课程结束时综合评价同学们在课程期间的表现,特别是努力程度、排位提升情况、基于云的开发效率,以及对课程所提供的支持等,给予一定量的合理积分奖励。

注意,关于bug形成的正积分和负积分,会因为申诉而发生变化。

6. 实验课考核方式

课程设置了8次实验课(2学时/次),针对性训练同学们的调试、测试和代码补全能力。实验课的内容包括程序的调试、改错、代码填空、规格填空以及使用相关工具进行程序性能观察等形式。

实验课要求所有同学到指定电子教室现场参加实验,在规定时间内完成实验并按照实验指导书的要求提供实验报告。实验课的考核依据出勤情况和最终提交的实验报告。按照五个等级来评定同学们在每次实验中取得的成绩,A\B\C\D\E档,A档为最高,E档为最低。所有实验结束之后,将历次实验的单次成绩进行汇总,得到一个向量(xA, xB, xC, xD, xE),五个分量的和<=8。如果一个同学未参加实验,则自动获得0.5个E档成绩。最后由成绩向量映射到百分制分值,即为实验课最终成绩。实验课成绩在整个课程中的成绩占比为30%。

7.   课程组织与助教工作安排

课程开设四个授课班,采用相同的课件。所有同学统一参与作业训练,不区分授课班级和行政班级。课程建立STAR助教团队和企业助教,分别承担如下工作:

(1)     窗口助教:由STAR助教团队成员承担,按照行政班级划分,窗口助教受理相应行政班级同学的所有关于课程训练的咨询、疑问和建议,并分析所负责行政班级同学的学习状况、成绩排位,帮助有困难同学尽快提升。

(2)     专项任务助教:由STAR助教团队成员承担,开展无效作业审查、申诉处理、代码抽查、测试结果分析等相关专项工作。

(3)     博客评阅和推介:由企业助教为主负责,STAR团队和老师共同参与,对同学们所撰写的总结博客进行评论,并推送给相关群体。

 

posted @ 2018-03-19 18:39  知北游手记  阅读(636)  评论(1编辑  收藏  举报