2016-2017-2 《程序设计与数据结构》课程总结
《程序设计与数据结构》是为北京电子科技学院计算机系「信息管理与信息系统专业」开设的专业基础限选课程。
课程作为教学改革的一个试点,把传统的《程序设计》和《数据结构》合并成一门课程,96课内学时,30个实践学时。
本课程的教学目标是让学生理解程序设计的基础知识、基本方法和基本技能,能用计算机分析和解决问题;培养行学生的抽象思维能力以及数据结构和算法的应用和实现能力,初步具备大型程序的设计能力。课程要让学生掌握Java和Android应用系统的开发方法、掌握Java和Android开发的工具、掌握优秀程序设计实践、理解面向对象设计思想,并为专业课的学习培养良好的编程基础。本课程培养举一反三学习其他面向对象语言和移动平台开发的自学能力。
课程内容涉及面向对象思想、Java程序设计语言、Android程序开发、UML系统建模、敏捷开发实践、算法分析、数据结构的应用和实现。教学重点是面向对象思想与Java的结合,算法分析与数据结构的应用,同时也让学生掌握实际软件开发中常用的开发、设计、建模、敏捷工具,掌握软件开发的基本过程。
本课程实践性很强,课程应注重理论联系实践,培养学生的创新能力、自学能力。课程提倡学生“做中学”的学习理念,教师“做教练”的教学理念,以学生为主体,以老师为主导,提倡因材施教。采用教材和微课进行混合式教学,引入游戏化理论,过程化考核,博客驱动的作业,git驱动的代码实践等。课程保障同学们不低于10000行代码的实践量和一定量的优秀代码阅读分析(工业级代码Java Collection API的分析)。
很重要的一点是厘清“教是老师的责任,学是学生的责任”,也就是“老师当教练,学生做中学”。
有了SPOC平台蓝墨云班课 ,教学工具上也基本完善了:
教学内容设计
- 第一章 程序设计概论 4学时
- 第二章 Java语言基础 4学时
- 第三章 Java程序控制:分支与循环 4学时
- 第四章 类与方法 6学时:
- 第五章 继承、多态与接口 4学时
- 第六章 异常与I/O 4学时
- 第七章 网络编程与安全 6学时
- 第八章 软件开发方法 2学时
- 第九章 Android程序设计 14学时
- 第十章 Java泛型与集合类 6学时
- 第十一章 数据结构与算法分析基础 2学时
- 第十二章 线性结构 12学时
- 第十三章 树 12学时
- 第十四章 图 6学时
- 第十五章 查找与排序 10学时
我在程序设计学习上有一个基本的体会是:
-
开始不会编程,最好的学习方式是抄教材,敲代码,还专门写了一篇指导《积极主动敲代码,使用Junit学习Java程序设计》,我认为积极主动敲5000行左右的代码,应该能解决基本语法的问题,基本程序设计的问题,基本工具(git,jdb,junit,idea...)的使用问题
-
然后独立编写5000行左右的代码,解决程序逻辑错误的调试,模块分解,问题解决的一般过程等相关问题
-
有了10000行代码的基础,后面的学习提高要依靠代码阅读了,比如JUnit的源码,JHotdraw的源码,Java Collection API的源码,Java JCE的源码等
教学中也是想通过这三个步骤进行训练。基本上所有同学都完成了一学期输入不少于5000行代码的目标。
看了范飞龙博士(博客,微博)的“如何设计题目”和“近发展区/脚手架”,写了“2016-2017-2 《Java 程序设计》课堂实践项目”解决第二层次的问题,从Hello World通过一个个小练习不断迭代,来一步一步提高大家使用Java来解决具体问题的能力。
代码(Java Collection API)阅读在下学期结合数据结构和算法的相关内容进行。
代码学习通过问题驱动来讲解,课程内容主要在Linux下完成,课上结合Java内容和Linux命令来进行:
- Linux 命令能做什么? 学习某个Linux命令的学习
- 它是如何实现的? 推导出命令实现的伪代码
- 能不能自己用Java实现? 用Java实现该命令
比如讲解栈的应用时,计算后缀表达式是典型的例子。我们在上课是遵循上面的步骤:
- 通过dc命令的使用让学生了解什么是后缀表达式
- 讲解如何使用栈来实现后缀表达式的求值的伪代码,并让学生上课动手验证算法的正确性(与dc命令对比)
- 设立一个栈,存放运算符,首先栈为空;
- 从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
- 若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
- 若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
- 当栈变成空时,输出的结果即为后缀表达式。
- 在课上让学生用Java完成dc命令的实现,考试课堂时间的限制,学生实际水平和学习重点,提供代码脚手架,只让学生实现核心伪代码:
这样同学们对学习编程是为了解决实际问题有了深刻的认识。比如String类的讲解就不用罗列API了,我们上课通过实现Linux的sort,comm等命令来让学生掌握相应知识点。
学生的反馈:
虽然很害怕这种形式的课堂检查,但我不得不承认这种方式对于我们应用能力有较大的提高作用。以前我很害怕自己写代码,连书上的PP都得借助其他同学的帮助。这样的课堂实践环节解决了这个问题,让我们换一个方式来主动敲代码。
比如像这个MySort的测试,加强了对于sort方法的理解。学习了一学期后我明白了,Java的学习不能仅仅限于理论知识,更多的应该在于实际应用。用代码解决问题才是编程的核心,不将理论知识应用到代码上,那一切理论都是浮云。
课堂上在一定的时间段内要求自己独立动手完成一个项目,对自己的编程能力的提高很有帮助,也能提高我们编程的效率。
实践是对所学知识的考察和巩固。可以帮助我们更好理解教材上的知识点,对我们的总结和临场使用能力有帮助。
课堂上多练习,有助于我们更快的掌握知识,而且训练了我们的思维能力。
过程化考核
课程采用过程化考核,通过翻转课堂考核,实验考核,知识深化和实践考核促进同学们加大平时的学习投入,提高学习效率。
成绩计算方式:8 * 5 + 5 * 5 + 35 = 100,具体计算过程如下:
-
翻转课堂随堂考试共8次,每次考试卷面成绩20-30分,实际成绩除以4-6进行规格化,满分计5分,共计40分;不论什么原因缺考的都不提供补考机会,但可以做最多两次至多十分的附加题(附加题目一般为实践类题目)。对要求的学习内容及时学习,按时提交学习笔记的不扣分,不及时学习、不按时发布学习笔记的扣1分,超过三分之一不交的取消考试资格。
-
五次实验每次实验5分共计25分。实验过程和问答等验收环节占3分,实验报告及问题解决方案占2分;对实验过程一无所知、不能正确回答老师提出问题的得0分,实验报告及解决方案抄袭得0分,实验成绩每人总计不超过25分。
-
知识深化类和综合实践类题目35分;每节课学习提供深入学习题目,每道题目根据难度分为I级、II级、III级难度,每道题目可以由一个同学独立完成,或者一个小组(两名同学)合作完成,合作完成的二人成绩要有不同,并且必须要有答辩。难度I级、II级、II级的正确完成分别得1分,3分,5分;知识深化类题目考虑平衡,每节课单个学生最多不能超过5分,该类题目总分不能超过25分。综合实践类题目,每题10分,实践类题目要有答辩过程,需要包含完整的设计、编码实现、单元测试等过程;每个小组的分数根据具体的分工以及贡献大小打分;知识深化类和实践类题目每人总计不超过35分。
-
需要答辩的,同一问题一次通过给满分,第二次通过给一半分数,最多两次答辩机会。
-
附加分:附加题、研究性题目,本学期信息安全学科竞赛等增加最多10分的加分,为生病等原因请假不能全部参加考核的同学一个补救机会。
翻转课堂
翻转课堂采用优秀的SPOC平台蓝墨云班课和博客园的班级教育应用,我们也使用博客园课程管理,兼顾封闭与开放。
翻转课堂不是老师让学生自学就完了,学生要自学,老师也要做大量的工作,付出巨大的努力。
首先要安排好每周的学习内容,我们这学期的教学进程参见:2016-2017-2学期《程序设计与数据结构》教学进程:
每周都给出明确的学习目标,详细的学习资源和有最后期限的学习任务:
虽然有些死板,但同学们缺的就是这些死板严格的要求,要求不明确,学生根本无法享受「灵活」带来的好处,不少人随便糊弄一下就过去了,这么细致的要求,也还是有同学糊弄的。
我们的主要学习资源有教材,课程内容配套的微课。教材学习指导是同学们学习的重要指导,相当于传统课堂要讲授的内容,用好了能大大减少学习时间,提高学习效率。教材学习指导初期几乎是一页一页的指导,详细到每段代码如何阅读,取得了良好的指导效果:
这样还不够,学生学习过程中还是会有问题的,多年实践证明微信群,QQ群不适合答疑:问答很快被冲掉,一个问题要回答多遍,问答无法积累。后来在博客园建立了课程答疑论坛进行答疑,承诺同学们有问题24小时内回复。
与以往答疑时间无人提问不同,从以老师教为主转变为学生学为主后,在每周的学习过程中同学们总能提出一些问题,有问题才说明学了。我们的课程答疑论坛应用效率很高的一个证明是,开课期间在博客园的排名一直是数一数二的。博客园承诺同学们的问题24小时内解决。问题数量,质量有了大大的提高。但还是不够及时,同学们之间的交流才是最及时的。蓝墨云班课解决了这个问题,老师要做的大多是给提问和解答的同学都加分就可以了,很少需要回答问题了,大大激发了同学们学习的积极性:
我认为以上措施解决了以往同学们学习中的各种障碍,只要想学习的同学,就没有什么学习上的障碍了,剩下的是自己的学习态度和努力程度的问题了。
过程化考核对每周的教学效果进行检测,老师可以根据成绩和出错多的题目对教学内容,教学重点进行调整。如果没有100分的限制,这学期学得好的同学可以拿150分,学得差的就只能50-60分。我经常让同学们体会「学过」和「学会」的差别,我们老师也要体会「教过」和「教会」的差别。翻转课堂以前我特别不理解,上课强调了那么多遍的重点内容,甚至有些题目和答案都讲了,考试为什么还有学生不会。过程化考试让我了解到,由于基础和态度问题,很多同学根本没听或听不懂,所以学生的结论是老师没教。过程化考试让老师很早就知道学生有那些该掌握的知识没有掌握,可以通过反复讲解和反复考核来解决重点,难点的学习问题。
学习完每周内容后,同学们要发学习博客。体会到写博客的好处的同学的学习热情很高,有经验和心得就通过写博客分享。
同学们写的博客,我每篇都阅读了,并且对绝大多数博客都有点评,甚至多次点评,这是通过博客交作业的好处。我几乎每天都要花几个小时点评博客,本学期不少同学的学习积极高,有的博客点评与老师,同学互动十几次,一学期来共点评学生2400多次。博客点评是因才施教的一个重要方面,愿意好好学的老师就多指导,学习中非常重要的一点是反馈,老师的点评是很重要的反馈,与老师互动多的同学都是学习态度好,学习积极性高的,他们进步都非常大。一周花十几个小时用来点评博客,回答问题,与同学们互动,累但值得。学是认认真真的学,教是实实在在的教。
每周我们都有考核,检测本周学习的效果,考核后会公布试题和答案,这是学习中非常重要的反馈,我希望同学们能对照答案,找出不足,查漏补缺,一些重点内容和错得多的题目会多次考核。实践中发现有了答案还有不少人看不懂,后面的课上增加了错题讲解的环节。我还是认为这一定程度上反映了学生的学习动力不足和学习积极性不高的问题。
使用了蓝墨云班课,效果更好,可以实时反馈,了解学生的学习盲点,让课上的讲解更具针对性:
考试后会公布成绩和排名:
最终成绩情况:本学期30名同学,4个100分,90分以上的11人,80-89分的9人,70-79分 的6人,60-69分的4人。平均分86分,基本符合正态分布。大一的学生相对学习更努力些,成绩也比较好。
每周的排行榜对同学们的学习促进作用还是很明显的,排在前面有奖励,排在后面的有督促。
这学期继续游戏化,每周奖励一下总分排第一的同学,本学期奖励范围从T恤扩大到图书和程序员茶杯:
获奖同学如下,他们的博客值得大家好好学习:
平时考核图书获奖学生:
和助教谢涛老师,王志强老师协商后,以下同学作为动手能力的代表各奖一件"做中学"T恤衫:
新经验
蓝墨云班课
有了蓝墨云班课这个SPOC平台,翻转课堂的控制更加方便了,解决了多年的平台问题。用了三个月经验值就超过全国96%的老师。
就本门课程而言,发布博客教程,视频,作业等资源87个,开展课堂提问,课堂考核,实验检查,课堂实践等学习活动63次,设计包含500多道试题的题库(其中部分为以)。
教学周报可以清晰地看到每周在教学上做的工作,包括为学生提供线上学习的资源,为学生在云班课上设计的课堂活动。
教学资源分析
翻转课堂要给学生提供合适的线上学习资源,实现必要的课前预习,保证课前学习效果。
以前使用微信群,QQ群发送资源时,老师不知道学生看了没有,现在有了详细的数据,老师提供的学习资源还是有30%左右的学生没好好看,其实上课遇到的很多问题在学习资源里都有了解答。
老师提供的微课资源就是等价于传统课堂的上课讲解。微课的内容含量是传统课堂的三倍左右,同学们可以根据自己的情况跳着听,完整听,多次听直到掌握,从而做到了因材施教。微课的一个要义是基础好的可以少听或不听,基础差的要多次听,可惜的是事实是基本上是基础差的没有好好看视频学习,反而抱怨上课老师不讲教材内容。当然也存在打开视频不看的钻空子现象。
教学活动分析
课堂上的教学活动是我在教学中最为关注的部分,也是要课堂效果的关键点,在每节课前我都会通过蓝墨云班课进行活动设计,云班课的各种活动组件都能很好地满足我的活动设计要求,而且非常方便简易,用手机开展活动的课堂效果也很好。
头脑风暴活动让全班同学都参与到开放性问题的思考回答,随堂测试能马上得到学生知识点学习情况的数据反馈,点名签到节省了传统点名的时间,讨论答疑突破了时间空间的限制让我和学生随时随地交流学习问题,摇一摇选人增加了课堂的趣味性......
头脑风暴活动是我用的最多的活动,我用它来向全班同学提问,设置实验的检查点,提交课上实践的截图..., 这些头脑风暴活动大大提高了学生的教学参与度。
教学活动的参与度都很高:
学情分析
在过程性考核中,经验值的获得方式,也可以从下图中看出来,其中参与课堂活动是最为关键的,课堂上是没有逃课现象的,学生也基本没有时间去玩手机了,因为手机被用来参与我的课堂活动了。
从下图可以分析出,大部分同学非常努力,入门的3位有两位是助教。学习感觉任务重的是成绩好的同学,大约1/4的同学下的功夫还不到。
对学习资源进行分类,分成必学,选学是非常有必要的,这样会提高学习效率。
学习过程中可以随时查看学生的学习状态,比如这名同学比较不适应翻转课堂,老师提供的学习资源资源一半没有学习,视频才看了3个,了解了这些情况,老师和班主任对其严格要求,在本人的努力下,最后也及格了。
同学们的反馈
蓝墨云班课上的答疑讨论比较实用,对我的学习有促进,可以随时提出或者解决大家的问题,有时候参考大家的问题去学习也是一种不错的方式,同时也方便了老师管理学生和教学,可以及时地上传一些视频或文件供大家下载。当然,蓝墨云班课也是有缺陷的,比如说我要时时刻刻关注老师是否发布了新的学习任务,因为只有打开了蓝墨云班课才知道,所以在一段时间里,我看手机的频率很高,然而有时只是频繁地翻来翻去,感觉有些不适应。
这个APP是非常好非常实用的,尤其是对我们样的课程来说,因为所有的作业或是什么都是在网上完成的,对于群体信息的沟通来说这是非常方便的,老师每周下放任务,指定时间然后我们按时完成,既保证了速度也保证了效率,可以继续实行!
对学习有很大促进,拉近了师生的距离,能够很方便的得到一些资源
在这个平台上学习资料更加集中,便于我们查找,而且学习经验排名也能提高我们的学习积极性。建议在这个平台上上传更多的学习资料和参考文献,这样也有助于我们学习。
蓝墨云班课对我的学习很有帮助,希望老师能够多加利用,并且加入更多的学习资料
蓝墨云班课有它独特的教学管理系统,操作方便,相比较于博客园,蓝墨云班课能够上传的资源类型更多,所以对我的学习有很大得到促进作用。希望以后的课程也能够用蓝墨云班课作为教学的辅助软件。
助教机制
计算机系非常重视课程改革,为我们这们课程配了助教王志强老师,我备课,设计安排教学进程和教学内容,设计试题,设计实验,作业点评,答疑等工作,王志强老师负责了改卷,答疑,日常辅导等大量工作,为教学效果的提升付出了很多。
我们课上使用了《构建之法》的教学方法,邹欣老师(博客,微博,豆瓣)、周筠老师(知乎,微博,豆瓣)出资给我们请了谢涛老师给我们做助教.谢涛老师弥补了教师工业经验不足的问题,让同学们一开始就能体会到业界是怎么开发软件的。谢涛老师经验丰富,善于学习,工作认真细致,赢得了师生一致的好评。
业界助教谢涛老师
谢涛老师在助教总结中说,助教工作对作业博客总共评论约870条,评论互动约260条,平均和每名同学交互30多条,除去一些不与老师互动的同学,大概平均与每名同学交互50多条,这些反馈对同学们来说是非常有益,非常难得的,值得大家倍加珍惜。
谢涛老师写了十多篇教学相关的博客:
谢涛老师主导了两次有意义的结对编程事件:
我自认是一名认真负责的老师,谢涛老师作业打分的认真细致程度让我自叹弗如:
我们的作业同学们做了,国内一些顶尖程序员也做了,谢涛老师和知乎三软狗之一的轮子哥的交流记录下来,写出了四则运算(挑战出题)解答之轮子哥版,同学们好好看看,能学到不少课堂上学不到的知识,当然还有学习态度,工作态度。
谢涛老师说:
本次助教工作使得我更加敬佩尽职尽责的老师,因为每一个细小的问题累积起来都是几十倍甚至上百倍的量,同学们都是思维及其活跃的个体,每个人都有着不同的情况,老师都得一一处理,没有亲自经历,是难以体会老师的这种用心良苦。
我很羡慕我们的同学有这样的学习机会,也为有的同学不珍惜这种学习机会感到惋惜。谢涛老师:
一学期下来,很少有同学主动找老师沟通自己遇到的困难和疑惑(至少很少找我),反倒是成绩公布之后发现问题,有同学跑来纠结成绩。这里希望同学们能自己多思考,多提问,保持主动。
这一定程度上反应了我们的学风问题,有的同学喊累,有的同学打着老师要求学习的幌子争取时间,争取资源玩游戏,甚至上课在老师的眼皮底下还玩游戏。
同学们表达了对谢涛老师的感谢和敬佩:
尽管我们在平时的作业或者结对编程中犯了很多重复的错误,但老师总是耐心的提醒我们。我们的每一篇博客几乎都有老师的建议或者鼓励,而这些评论常常在老师本该休息的时间。真心感谢谢涛老师的辛勤付出。
非常感谢谢涛老师的辛勤付出,上文中提到谢涛老师可以让我在周末晚上保持学习的动力,除此之外,谢涛老师是一个非常敬业的老师,虽然至今没有见过我们,不太了解我们每个人的性格,但是依然按时评价着我们的博客,对于每个人的博客又可以提出不同程度的问题。我看到一些同学的commit提交一直有问题,谢涛老师就一直提醒,直到最后一周的总结博客他也没有放过。
从谢涛老师每次发布的作业中也能看出他的良苦用心,每次都会及时与娄老师、邹欣老师、范飞龙老师等共同讨论发布这样的作业合不合适,同学们能不能接受,同学们需要多少时间完成,确保合理之后才发出来。在成绩总结的博客中,他的分数分配非常精细,在检查我们代码时很认真,能测试的一个都不放过,当然有时候也难免会出现一些错误。
首先先要感谢谢涛老师,他在我们本学期的课程中也付出了很多,尤其是对我们博客中所提到的问题对我们深入的追问,使得我们进一步学习,虽然我们认为老师有时候有些死板,但是毕竟老师也没有见过我们,并不了解我们每个人的情况,只是从博客来了解我们还是有些片面的。综上对于谢涛老师在本学期做的工作,我深表感谢!
谢涛老师十分的负责,是结对编程的大魔王,大BOSS。每次的结对编程实验谢老师总会很仔细到找出问题,并不留余力的让你改正。嘿嘿,总之,谢老师人还是很好的,加油!
谢涛老师在工作上非常负责,基本上在熬夜在每周日博客提交截止后及时给各个同学指出不足并进行互动。而且还会耗费精力在我们的结对项目上,逐一编译并给我们指出问题。在打分的方面也非常仔细,可以让每一个同学都可以拿到相对公平的成绩。
我觉得谢涛老师是个非常认真负责的老师,在结对编程中他提出了很多我们没有发现的细节问题,在结束后也对我们组的问题提供了解决方案。最后打分时的分数点比较清晰明确,能够从中看出自己还存在什么不足之处做到及时改进。
我要给这位良心助教点个赞,在我们学习的过程中给了我们很多帮助,每个同学的问题他都认真指出,十分具有责任心。建议谢涛老师在日后能给我们提出更多的指导。
谢老师非常的认真,为我们的学习提供了许多帮助。在我们学习遇到困难的时候,老师很耐心的点拨我们。
谢涛老师真的是一个十分负责的老师,他总会在第一时间给我们评论。并且在四则运算的项目上花那么多时间,单单给我就在低下评论了十几次,十分感谢谢涛老师一学期的教导。
感谢老师的辛勤付出。每篇博客都看,认真评论,给出意见。提醒老师注意休息。
谢涛老师严谨慎重,对提高我们的代码质量做出了不可磨灭的贡献,他提出的很多建议都十分的新颖实用,他的严格要求也让我们意识到当一名合格的程序员并没有想象中的那么简单,也激发了我们向上的斗志。
第一次接触谢老师便是那次老师帮忙修我的虚拟机,远程操控我的电脑,在帮忙之后还给我相关博客链接,让我学会处理类似情况。在我的博客中有很多老师的评论,非常谢谢老师能够提出许多有价值的建议,帮助我成长。谢老师布置的四则运算相关作业,让我们收获不少,老师的评价工作特别认真客观,感谢老师的付出。
很感谢老师一学期以来认真负责地帮我们每一位同学批阅试卷,评论博客,验收代码,遇到有困难的问题,老师也总能热心地指导解决,给出建议,对这门课的学习起到实质性的帮助。
首先要感谢谢涛老师,我对谢涛老师给予很高的评价。他的认真、仔细、负责值得我们的钦佩,谢涛老师对代码的细节非常关注,同时,谢老师还是一位很有原则的老师,同学的作业必须按要求来完成,加分减分也严格按照标准来执行。感谢谢老师!
谢老师非常的负责任,我们的每篇博客他都会认真的去看,给我们提出问题并帮助我们解决。一开始心里是非常恨谢老师的,就想着,你怎们又提问题?这么多事等等,而现在却有着完全不同看法,随着心智的成熟以及知识的进步,我也学会了感谢老师,谢老师付出了那么多,值得我们点赞!
即使成绩不好,学生也能意识到自己的问题:
谢涛老师是一个很负责任的老师,同学们发的博客他都会第一时间作出评论。但我的态度没有对得起谢涛老师的负责。
学校助教王志强老师
王志强老师点评学生的博客以及交流了300多次:
王志强老师对学生每周的作业都进行了总结,写了十多博客:
王志强老师每次都指出同学们学习中的突出问题,并且给作业打出细致的分数:
为了支持我的游戏化学习理念,王志强老师利用自己的科研经费购买十多本《浪潮之巅》作为成绩优秀的同学的奖品来激励同学们努力学习。
使用蓝墨云班课前,我们打印试卷进行随堂考试,为了让实验验收更加公平,我们也出试题进行考核,王志强老师批改了300多份作业和实验的试卷,还查看了同学们的每一行代码。付出巨多。
感谢王老师!!
预备作业
为了增进师生了解,在开课前我布置了三次预备作业:
- 预备作业01:你期望的师生关系是什么?: 让同学们了解「Trainer/Trainee」是最好的师生关系,副作用是让同学们学会了Markdown。
- 预备作业02 : 体会做中学(Learning By Doing):让同学们了解「做中学(Learing By Doing)」的学习方法与刻意训练在技能获取中的重要性,副作用是让同学们展示自己,老师了解学生。
- 预备作业03:课程基础:利用搜商,打下课程的Linux基础,初步体会什么叫学习上的举一反三,融会贯通。老师教十个你会6个就及格了?不,应该是老师教十个,你会100个乃至更多,至少具备这样的潜能。
这些预备作业得到国内不少高校的老师的赞同和效仿。我也把收获总结在 学生的头脑是容器还是火把?这篇博客中。
三次预备作业让我认识到了同学们的优秀,认为“同学们掌握了做好一件事情的正确方法,学好专业课中的程序设计不是一件难事。”
事实上,他们的确是至今我教过的班级中最认真,真正投入最多的一个。
三次预备作业的一个问题是大大增加了我对同学们的期望,导致提的学习要求稍有点高,相当一部分同学也不能或者说不愿把“掌握了做好一件事情的正确方法迁移到学好专业课中的程序设计”中来。
班主任深度参与
教好学生是教师的责任还是学生工作老师的责任?我一直认为是共同的责任。
刘瑾老师是位认真负责的老师,参与了我们课程学生博客的点评,军心的维护,前期听课,落后学生的督促等工作。为我们课程改革的推进和教学效果的提升提供了很大的帮助。
我认为张旭升同学的进步是班主任深度参与教学促进教学效果的一个案例。在课程总结中,张旭升同学说:
- 学习方法上:这门课程的学习打破了之前所有学习共用的方法——“先理解后实践”,我们实在实践中理解,实践中学习,从最基础的学起。
- 学习能容上:班主任在班会上也告诉过我们,大学的高等教育与高中的初等教育最大的不同就在于学习内容的广度和宽度,以前的学习中我们所学的基本上都是一些狭义的知识,并不会展开来讲,而现在就比如我们学的计算机方面的知识,它本就是许多的人经过多少年的研究形成的,本就是一个很大的体系,所以我们并不能直接从哪一块去理论的学习,最好的方法也就是这样的先用后懂。
- 学习心态上:在课程学习中,我们每周都会遇到无数的问题,然后我们先尝试着自己解决,如果不行再去向别人求助,最后将这些问题都呈现在自己的每周的总结博客中。就是在这种编译->出错->改正->编译->出错->···->编译->运行->异常->修改->···->成功一步步中我们才开始成长。
张旭升同学其他课程基础比较薄弱,刘老师鼓励他从大家都没接触过的编程努力学好,增强学习的自信心。张旭升同学的动手能力现在是数一数二的。
感谢刘老师!
全面走向开放
这几年,从封闭的有道云协作 全面开放走向博客园,老师和同学们都经历了不适应到习惯的过程,现在也都尝到了开放的好处。
实验楼课堂提供了学习环境,对学生的学习时间有统计,是个好工具。
学生实践的代码都在码云git@OSC托管。实践情况也都是公开的。
即使使用了蓝墨云班课这个SPOC平台,作业的布置,学习指导,学习进程也都是在博客园公开后再引用。
公开也就意味着更公正!
Git与代码托管
课程实践性强,动手实践就非常重要,虽然有「代码驱动的程序设计学习」的这么详细的学习指导。学生踏踏实实使用GDB进行反馈,加点代码,改点代码的还是不多,排名前三分之一的同学问题不大,后面的还是要加强控制,如果老师一个一个的检查,花费时间会非常多,通过git log --pretty=format:"%h - %an, %ar : %s
截图的结果,和`wc -l 'find src -name *.c``代码量统计截图,可以自动化检查学生的实践情况,然后重点抽查。
通过git log --pretty=format:"%h - %an, %ar : %s
的截图,谁在什么时候提交了代码清清楚楚。
通过`wc -l 'find src -name *.java``的截图,一学期的代码量明明白白。
这学期同学们有了3000至10000行的代码训练,大多数同学超过了5000行的目标,使用git的好处显现。
可是这样有的同学还是没有达到掌握Java基本编程技巧,用来解决简单问题的目标,原因同学们的总结说的好:
通过这一学期的学习真的不难看出代码行数与编程水平真的有一定关系,但也存在bug,所谓学而不思与思而不学,我班马平川同学的代码行数是最少的,但他的编程能力是最强的,同理,代码行数最多的同学编程能力也不是最好的,敲代码固然重要,但编程过程中的学习和思考也是十分重要的,没有总结反思,再多的代码也是别人的,自己学不到什么。
刻意练习,积极思考做的还不够!!
下学期一定加强用“伪代码,产品代码,测试代码”解决问题,构建代码框架的训练。
代码托管还体现了开放的好处,我们在课堂上明确反对用汉字命名标识符,我们学生的实践引发国内不少高校老师和程序员的争论:
http://www.cnblogs.com/yangjingdian/p/6852380.html 用中文作类名、变量名、方法名一般只停留在讨论上,这位同学在作业中这么做了。大家有什么看法?
对学习吃力学生加强管理
本学期待及格同学的管理办法:
- 查看http://www.cnblogs.com/rocedu/p/5826175.html,学习考核方法,了解本学期100分的构成
- 每周考试总分5分,平均分低于3分的为待及格同学。
- 待及格同学一定关注老师博客,这样才能及时看到老师点评,不会的学习一下http://www.cnblogs.com/rocedu/p/5145864.html
- 从本周起,待及格同学每周至少发两篇学习博客,周四前一篇,周日前一篇。鼓励大家天天发学习博客。周四前不发的扣一分,认真学习写得好的加一分。
- 待及格同学每周至少找老师验收一次学习情况,主要是代码、教程习题的完成情况
- 鼓励学的好的和成绩差的结对学习,对成绩好的有一定的加分。
微信公众号
本学期更多的使用了教学微信公众号「rocedu」,发布教学,读书学习的相关信息,与同行,同学们有了更多的交流。
也欢迎大家关注交流(手机上可以长按下面的二维码关注):
课程总结
同学们的收获还是很大的:
- 20162330 2016-2017-2《程序设计与数据结构》课程总结是最认真的一篇总结了,有前言,目录,老师的要求都有了,学习态度值得大家学习,注意刻意训练,我想他日后可以学得更好:
本学期的《程序设计与数据结构》课程即将告一段落,在本学期的“做中学”演练中,我的收获颇多。从第一周的迷茫到第十六周的冷静,我现在正处于新手向高级新手过渡的阶段。相比起新手,我不再那么急于求成了,我遇到问题时不再那么焦虑了,渐渐地我开始学着去深入思考,并尽可能自己解决遇到的问题。而相比起高级新手,思考程度又显得有些肤浅,代码理解程度也不够
最大的收获就是了解了如何用“做中学”的方式学习,这种方式虽然耗时,虽然有争议,但是再怎么说你也会受益匪浅,毕竟这个问题是通过你自己独立思考解决的,你会很有成就感。其次,我通过“做中学”逐渐学会了应该如何深入思考,虽然现在我的一些问题还很基础,但是这都是在为以后做铺垫。
还有就是写博客的收获,上文中以提到,我的markdown技术也随着博客的数量一起进步,从预备作业01到这篇博客,我可以感受到我的收获越来越多,虽然有些以前博客中提到的知识有遗忘,但是当我再次复习时,我会有很深刻的印象,包括当时我是怎么解决这个问题的,当时我是怎么想的。另外,我经常在焦虑的时候翻看一些博客园上IT精英们的神级博客,博客园本身就是一个面向开发者的知识分享社区,这么多高质量的博客,虽然大部分看不懂,但是有的博客却可以调动你学习的兴趣,所以看博客的收获也很大。除此之外,及时回复老师的问题也使我学到了很多。
- 20162308马平川同学方法得当,是学得相当明白的同学,基本能够举一反三了,代码量并不多,有效代码量应该是数一数二的了:
这个课程比较大的收获是老师提供了很多方向,能够让我去接触很多技术,这个是非常大的收获。另外一个是对设计模式和OOP原则的讲解,能够初步地体会和理解大型软件工程项目中的设计方法。
他的学习建议是非常有效的,大家应该多读读:
积极主动敲代码。程序设计课如果连代码都懒得敲,那这么课程就是纸上谈兵,什么都学不会。积极主动的更进一步就是自我驱动地学习知识,因为程序设计课程的覆盖面太广,很多知识都是浅尝辄止,可以选取课上感兴趣的、没听明白的地方去深入。
遇到问题,先自己想办法解决。可以去百度、查书等等,推荐看stackoverflow上其他优秀程序员的解决思路,或者用英文在这个平台上提问,找同学解决固然是一种方法,但是看看其他业界程序员的解决方案可能会给你提供更多思路。
充分利用Git工具。利用Git不止可以用于自己的项目的版本控制,也可以去看其他的优秀开源项目的代码,去学习别人的编程思路。
最后一点,知易行难。很多人听了很多道理,依然过不好这一生,上面三点建议,关键在于做的过程。
首先在学习方法上。我们曾经习惯着老师将重要的知识点传授给我们,这样省时不费力。而这学期Java的学习则完全颠覆了传统的学习方法,大部分都是通过自学或者借助网络来获得知识。这种教学方式一开始让我们难以接受,因为这样的学习太耗精力了。但这样的方法在运用了半个学期后,同学们的抱怨也渐渐变少,我们也习惯了遇到问题上百度的解决方式,靠自己获得知识和技能。其实在很多课程的学习上,大学与初高中的教学方式都不一样。提高自己的自学方式让我们在其他科目中也能更加游刃有余。我相信即使离开大学的学习氛围,我们也能够通过自己掌握需要或想要学习的内容。
在效率问题上也获得了不小的进步。还记得刚开始写博客的时候得花上周六一整天,后来写着写着熟悉以后,写博客还是挺快的。在平时学习过程中,将遇到的问题该记下的马上就记下,周六写博客直接将这些问题和解决方法总结一下就行。
还有碰到问题时的心态。以前我很怕碰到问题然后让我去解决,习惯性的逃避来处理。就像刚开始装虚拟机,碰到问题就重装,用粗暴的方式解决。但是现在慢慢的开始欣喜于碰到问题,每次git出现问题或者教材上有看不懂的地方,我就会主动停下来解决它,而不是逃避。并且将问题记录下来,给碰到同样问题的人提供解决方法。
刚开始学习java的时候没有任何基础,通过这一个学期的学习,我掌握了很多java方面的技能,可以独立的写出程序了。更重要的是,培养了独立学习的能力,遇到问题可以独立解决。
收获最大的莫过于结队编程的好处。当我与我的搭档马军结队编程时,我们对问题会有更多的见解,除了我的想法以及他的想法外,通过取其长,补自短,我们还能想到两个人都想不到的方法。这也为我们对问题有区别于其他人更为独特的见解。另外,结队编程可以提高编程的速度,各自负责相应的部分后,我们每个人编的代码也要少了点,从而减轻了代码负担,也提高了效率。最重要的是:当两个人把代码给编出来时,内心深处涌上的个人以及自豪以及集体成就感更是无可比拟的,这是一个人的时候体验不到的。
学习方法上,从以前的传统教学模式转变为现在的翻转课堂,在一开始的学习中并不是十分的适应这种教学模式但是到了后期才越来越发觉这种教学模式是适合我们这种实验课的,只有做中学才能培养我自己的动手能力,而不是只会理论。编程需要的是思考与实践,而不是单纯的理论学习。
懂得遇到问题去自己查找答案,而不是像以前那样,什么问题都去找老师。学会了如何把问题丢到百度上,学会了如何去查API文档
- 20162311 2016-2017-2《程序设计与数据结构》课程总结也非常认真,学会了使用目录:
最大的收获是学会了自学。学会了通过看博客、查百度、查API文档来解决问题,而不是一碰到问题就去问老师,问同学。当然这也要投入大量的时间,现在看来,这些投入是值得的。
- 20162317 2016-2017-2 《程序设计与数据结构》课程总结体会到了结对的了好处:
收获最大的莫过于结队编程的好处。当我与我的搭档马军结队编程时,我们对问题会有更多的见解,除了我的想法以及他的想法外,通过取其长,补自短,我们还能想到两个人都想不到的方法。这也为我们对问题有区别于其他人更为独特的见解。另外,结队编程可以提高编程的速度,各自负责相应的部分后,我们每个人编的代码也要少了点,从而减轻了代码负担,也提高了效率。最重要的是:当两个人把代码给编出来时,内心深处涌上的个人以及自豪以及集体成就感更是无可比拟的,这是一个人的时候体验不到的。
对改进教学提出的建议
同学们提出不少好建议,这些建议我在后面的课程中落实:
- 加强课堂时间
- 课后PP的讲解
- 内容拓展,内容深化上可以多做工作
- 进行小组项目的实践
- 待及格定在70分,好多及格的同学其实做的并不好而只是刚刚及格,并不见得好好学了
- 每周选5篇同学博客要求所有人点评,促进学习交流,对交流多的同学奖励
- 督促学生做课堂笔记,结合有道云笔记电子化,并作为一个考核点
- 学习博客中加入每周考试错题更正情况
- 实践考核这块要求代码加注
教学过程中的好措施
老师教学方法中得到大多同学认可的做法有:
0. 蓝墨云班课的引入,应用
- 结对学习
- 通过博客,git交作业
- 内容串讲,错题讲解
- 课堂实践
- 写学习指导,督促同学们多理解、运行代码
- 各种学习资料的提供
- 做中学
- 过程化考核
教学反思
同学们提出来的问题有:
- 加强课堂控制,利用好课堂时间:后面要充分安排好每一节的内容
- 博客互评的参与度不高: 采纳前面学生的建议,试验了并不好,后面只让结对互评
- 英语出题: 工具安装错误,编译器错误即使很简单,不少同学还不看,后面加强英语的学习指导和应用
- 代码量与有效代码量:继续刻意练习的指导
我自己感到要加强的地方有:
- 进度条的作用没发挥好: 时间管理,效率提升,学习过程效率提高的过程参考《构建之法》监控
- 项目,应用上多下功夫,引入大课建设内容:吸收其他学校项目管理经验
- 指导学生掌握学习方法,提高学习效率,引入PSP的做法
- 加强英语的应用:基础试题,解答使用英语
- 刻意练习
- 鼓励多思考
- 教学视频的学习指导
致谢
特别感谢邹欣老师(博客,微博,豆瓣)、周筠老师(知乎,微博,豆瓣),范飞龙博士(博客,微博)以及人民邮电出版社的陈冀康编辑。邹老师,周老师,龙博士点评我们学生的博客,鼓励我们的同学,激发了不少同学的学习兴趣;感谢人民邮电出版社赞助的T恤。
感谢北京航空航天大学 的罗杰老师(博客),福州大学的张栋老师(博客),东北师范大学的杨贵福老师(博客),教学中跟你们学了不少方法,有你们这些负责的老师做榜样,我教学更有积极性了,看到你们的教学效果,也给我了不少压力。希望后面能越来越好!
在此,对博客园表示衷心的感谢,特别感谢园主杜勇和工程师阿春,有什么问题基本都是当天解决。
感谢贺利坚老师(博客园博客,CSDN博客,新浪博客)。贺老师向我推荐了蓝墨云班课让我的教学有如虎添翼的感觉!
感谢蓝墨云班课原总耐心细致的回答,蓝墨还邀请我向全国的老师分享翻转课堂和做中学的经验:
感谢同学们的大力配合,与你们一起体会教学相长是一件幸福的事情!
欢迎关注“rocedu”微信公众号(手机上长按二维码)
做中教,做中学,实践中共同进步!
-
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”