早期关于课程的回顾和一些感想
课程如何定位
移动应用软件开发这门课程是在大三春季学期开,在这之前同学们已经有了丰富的编程课程基础了,学习过了程序语言设计、操作系统、计算机网络等课程,数据库课程在这一学期同步在上,实际上已经具备了很多应用开发的基础了。对于一门在大三的跟编程有关的课,如何来准备其实一开始是很让我头痛的一个事情,如果设计得不好,那就just another program language course,这不是我的想法,对于同学们来说再学习一门编程语言也未必是最好的方式,从我提前了解来看也不是大家最想看到的,得设计出大三的深度和特色来。我一直在思考,课程的基本任务和目标是什么,课程能够上出什么特色来。后来初步确定了课程几个不同层面的基本目标,第一就是树立科学精神和计算机系统思维,第二就是培养探索能力,第三就是学习移动系统相关概念、思想和方法,最后就是掌握移动应用开发的具体技术(对于很多同学来说可能还有些奇怪,这个怎么反而成为最后的一个目标了。当然了,最后一个目标不代表最不重要)。这个设计思路也成为了准备课程时候的指导,仔细一想跟学校提出的三位一体的教育理念是很符合的。后面就是围绕着这个基本目标来设计课程内容,以及如何评价每一个目标的学习成效。
讲什么不讲什么
除了常规的内容准备外,我发现课程内容一定得有所取舍,否则时间不够、广度不够、深度也不够。调研了一大圈,在完全同样的课程上能够直接拿来参考的并不太多,给课程内容设计带来了不少麻烦,不过有类似课程给了我很多不同的启发。我就先从减法做起,在课程内容设计上,我首先确定了有几个不讲:应用相关函数API用法不讲;各种界面控件使用不讲;复杂应用解析不讲。这样原因主要有这么几个,第一就是API用法可以在网上查询,不需要课上来介绍,虽然我知道有很多大家看到的材料里面主要是讲这一些用法,讲这些内容会使大家在初步接触这门课程的时候“感觉学到的东西最多”。第二就是很多API和控件等更新很快。第三就是API和控件等总类很多,讲的过程中很容易顾此失彼。这些不讲的内容在第一次上课的时候我就跟大家讲清楚了。再有就是应用是基于基础知识的,课上跟注重基础部分,基础打好了应用可以后续不断提高。
对于课上讲什么,如何组织这些讲的内容,跟课程的目标相对应,主要课程内容设计的思路如下。科学精神和计算机系统思维:将移动开发与现有计算机系统其他技术结合起来介绍,希望能够触类旁通,例如跟操作系统、计算机网络、嵌入式系统、数据库系统、图形图像等;培养探索能力:探讨每一个技术背后设计的根本原因和原理,如果是我们自己来设计会如何来做;学习移动系统相关概念、思想和方法:从大的层面上讲清楚移动应用系统开发的基本层面、基本模块(与具体技术无关部分,可能其他系统开发也有类似的基本层面和模块);具体移动开发技术:这个就是具体的技术部分了。
内容设计
在具体的内容设计上,我尽量按照这三个目标来,例如为了体现计算机系统的思维,课程中介绍了移动操作系统的基本原理,这个是移动应用与开发的基础,只有理解了移动操作系统,才能真正的理解移动应用开发,应用开发不仅是知道每一个功能怎么用,而是得理解背后的设计逻辑。另外我希望探讨移动应用开发过程中每一个功能背后的原理和出现的意义,例如在讲到移动应用开发四大组件之一service,我就结合这多线程的信息跟大家一起介绍,探讨service与多线程的关系,service出现的可能背景和原因以及它的本质是什么,对应到操作系统里面的什么概念和技术。避免简单直接的说“service就是使用这个方法来调用,大家记住这个用法就可以了…”。
再比如讲到另外界面控件如何使用的时候,如果只是罗列控件的用法,无法讲清楚界面和控件的关键原理。因此在设计过程中我不是罗列不同用法,例如对于界面原理,我希望展开来探讨(1)理解用户界面处理的重要基础是理解事件。(2)按钮点击操作是如何产生和如何被处理的,点击操作与操作系统有什么关系。(3)手指滑动这些复杂事件又与按钮点击处理有什么关系,如何产生和处理的。(4)其他类型的事件是如何产生和被处理的。(5)这些事件产生过程中还涉及到了之前操作系统过程中的哪些技术,这些事件还可以用什么的方法来进行处理。(6)这些事件与用户界面最后具体是什么关系,如何被关联起来的。以上面的思路为基础探讨界面产生的原理、事件处理的方法等,梳理底层原理的主要脉络,理解了这一原理之后,能够有助于更深刻理解界面设计和控件使用中的问题。由于我之前的嵌入式操操作系统相关基础,这一部分内容对于我来说还是比较熟悉。另外一方面,考虑到大家的知识储备,我希望通过这样的探讨将已有知识串联起来,加强对计算机技术的整体理解。控件的用法是会不断发展,但是基本原理基本一致,掌握了基本原理可以在具体技术实现不断变化时仍然能够快速学习,对于适应计算机学科快速发展是非常重要的。
当然,在上课过程中,为了增加直观感受,我尽量在每一部分加入了实际展示案例,展示实际代码,希望能够方便大家来理解课程内容,这样在原理和实际编写代码中有一个平衡。
如何评价成效
这门课程的成效评价其实是一个不小的挑战。对于每一个目标,我设计了不同的评价方式, 对于最后一个目标,这个相对比较好办,通过课后作业来评价。本学期我设计了不少次的作业,作业我整体设计的原则就是覆盖广、难度适中、目标明确。每一次作业应该从难度上来说都不太高,主要督促大家动手实际实验,增强对当时课程部分技术的理解,覆盖还是比较全面。前几次作业都是通过我们自己搭建的自动判分平台来给分的,很遗憾到后面的作业发现很多情况无法处理,后面变成了手动模式。 对于前面三个目标,主要通过课上的练习、讨论和课程项目来评价,这一部分是课程检验的重要部分。 所有的作业包括课程项目,我都自己实现并完成了一遍,以确保题目设计得较为合理。
课程项目设计
项目设计是从给定4个选题中选择一个完成一个移动应用,或者也可以自选题目来完成。给定的4个选题难度大致相当,选题主要考虑要包括移动应用开发过程中基本组件用法、前台和后台搭建、网络使用、数据库使用等。每一个选题都有人选择,基本比较均衡。自选题目中也有很多很有意思的应用。 课上讲得再多,也不一定就能很好的完成项目(这个毕竟只是检测其中一个学习成效),一开始就有不少同学碰到了这个问题。为了帮助大家完成项目,有更大的收获又不至于感到太难过,首先我觉得不能简单地降低难度,那怎么办呢?首先开展了几次详细的培训,培训给定了前端和后端的一个基本框架,适当减轻一些紧张感,从实际大家参与的情况来看大家在培训过程中应该还是有收获的。然后我自己也完成了项目,进行了代码实现,并将实际实现的结果在课堂上展示,希望能够加深大家对项目的直观理解,从心理上减轻大家的负担。
最后,我觉得很重要的一步是要制订详细的评分标准。现在流传着一个词叫做内卷,具体意思我就不说了。我还专门分析过内卷出现过主要影响因素,以后有机会可以专门来说一说。有一个重要的原因的是在考核指标中的分数曲线分布(或者说难度和分数对应曲线分布),直观上看,如果把难度作为横轴,所占分数比例作为纵轴,这个曲线斜率如果不断增长,内卷程度可能就越大。近几年使用的等级制分数的记法,其实就将曲线分段,每一小段内部斜率都为0,这样一定程度缓解内卷,鼓励大家不要太过于注重自己的分数。
对我们这个课程而言,我觉得首先一个基本要求是评价大家有没有掌握课程知识,而不是一定要给大家分一个先后,或者是谁掌握的“更”多,也不是判断大家掌握的相对程度,这个应该是有一个绝对量的。相对的部分占多大比例我还是努力掌握好。以这个为出发点,项目设计的时候也是平缓这一曲线,我们制定了比较固定的评分标准,这一部分占有了很大一部分比例的分数。如果没有这一部分评分标准的话,大家一方面容易太分散,另外一方面容易过于焦虑,通过评分标准的制定,使大家有一个初始努力的目标。当然在标准设置的时候一定要给大家充分的发挥空间,不能限制大家发挥。
思考与改进
很遗憾,这门课第一次开课就是线上,并没有能够与同学们面对面的在教师上课,给收集大家的直观反馈增加了难度,不过从不同渠道得到的反馈,以及我自己的思考,下次课程中计划做如下的一些改进。1)增加课前预习,督促同学们进行课前预习,这门课程学习的质量跟课前预习有很大的关系,希望下次课上能够增加这一部分。2)增加与工业界的互动,这门课程是一门与实践紧密联系的课程,因此后面课程上我会努力创造机会提供高质量的与工业界的交流,目前这个事情也在筹划之中了。3)改进作业和project,主要从以下几个方面,首先降低作业量,上次作业从我最后回顾来看,考虑到同学们整个学期学习压力,会适当降低作业量,第二使作业和project更加体系化,作业和project相辅相成,完成作业和课堂学习能够有效支撑完成project,尽力提高同学们收获。4)降低课程在课外要求大家花的时间,鼓励学有余力的同学多去探索,但是尽力降低课外时间要求。
最后感想
感谢课程助教对课程的大力支持,他们十分的辛苦、负责和给力。除了课程助教之外,我们有一个课程准备小组在一块讨论和准备材料,与大家讨论的过程对于课程设计非常有帮助,讨论本身也是一段有意思的过程。谢谢大家! 这是一门新课,对于学院来说是一门新开的课程,对于我来说是一门新课,春季学期正好又是以一种新的形式来上课,希望大家都有实实在在的收获。最近自己对课程进行回顾总结,随笔写了一些感想,感觉到了课程还有许多需要改进的地方,请大家多提建议。
2020年10月
现在看起来这个领域实在变化太快,早期的很多想法也未必适用,尤其是大模型的出现改变了很多事情。
“The only thing that is constant is change.” —— 赫拉克利特