又到了下学期的排课期,排课就涉用到教材选用问题。
教学中人(老师,学生)无疑是最重要的要素,「老师强烈的教学意愿、学生强烈的学习意愿」是教学有良好的效果最重要的保证。
之后,教学中最重要的就是选一本好教材了。教材是教学和学习所依据的材料,与教学计划和教学大纲构成教学内容的重要部分。教材选择不能随随便便,我每次开课都会花大量时间选一本教材,同一门课,有时年年换教材,这样经过几年才能定下一本适用的教材。
比如:C语言教材众多,经过多年的比较,我选择了裘宗燕老师的《从问题到程序(电子版)》,课上遇到C语言基础不好的学生,我都推荐先看看这本书。
本学期自己开新课,我暑假花了两个月的时间,浏览了三十多本、精读了十多本教材,才选到一本完美的、理想的教材,我记录下我从多个角度选择教材的过程,供老师们和同学们参考。同学们也可以用这种方法找一本自己最适用的教材作为重要学习参考,如果你们老师选择的教材和你选择的不一致的话。
本文的要点是:
选一本理想的教材要花心思的,我们可以从朋友圏开始,从教材、PPT、习题集、实践指导、MOOC支持、实践平台等考虑,不光简单看目录,还要深入研究教材内容才能选到一本好教材
给老师们推荐清华大学出版社的“书圈”公众号(手机上长按下面的二维码关注)和电子工业出版社的华信教育资源网,他们提供了优秀、方便的教师服务,特别是样书服务,可以让老师方便获取最新的教材作为深入选择的基础。虽然我每年都买很多书,看很多书,但不会买几十本内容相似的教材。学校图书馆可以解决部分问题,出版社的样书服务也很重要。
选教材的过程就像找女朋友,在没有遇到合适的、喜欢的人的时候,你有众多条件,遇到心仪的人,什么条件都不是条件了。
我选教材的过程就是这样,开始有语言、MOOC支持、PPT等等要求,最后发现教学内容、教学理念和教学方法才是最重要的,最能引发自己的共鸣,不是Java语言写的问题不大,没有MOOC支持也行。
选择一本好教材是一件不容易的事情。比如网络空间安全作为一个新学科,教材建设远远满足不了需求,每次上课所选教材中的内容近半与讲课内容(大纲)不一致,这对老师和学生都是一件很痛苦的事。相比而言,计算机学科就很成熟了,市面上有很多优秀教材,如何选择也是一个问题。
选择一本好教材不是一件随便的事情。一般学校对教材选择都有个基本要求,一定意义上防止了一些教师随意选教材的情况。比如我们学校的要求是:
当然这种要求会对教材的选择是个不好的限制,我发现的一点就是我用心选择的不少教材,就不符合这里面所有的要求。比如上面提到的裘宗燕老师的《从问题到程序(电子版)》。
还好学校是对其他教材的选择开了个口子的。就是比较麻烦,还要审批:
我这学期开了三门课:
《信息安全系统设计基础》说明了我选教材多年来坚持的原则:优先选用国外优秀教材或国外优秀教材的翻译版。这门课有一个很重要的功能是给信息安全专业的同学加强计算机系统的知识,我选用了《深入理解计算机系统(第三版)(英文版,官网)》,教材质量,习题质量,实践类题目质量都是很高的。遗憾的是因为学校没有英文网址和内容,我一直无法获取教师材料,通过机械工业出版社、Pearson都没能得到。
《Linux内核原理与分析》是特色课程,也找不到合适的教材,我选用的是我和孟宁老师(微博)共同编写的《庖丁解牛Linux内核》(即将由电子工业出版社出版)。这也是广受欢迎的MOOC 《Linux内核分析》的配套教材。
《程序设计与数据结构》这学期主要讲数据结构和算法。我下面主要说一下这门课教材的选定情况。
在互联网模式下,出版社的选题思路、服务手段、营销方式和销售渠道都要有很大的变化。出版社对老师的服务对教材的影响很大,这方面要表扬一下:清华大学出版社和电子工业出版社,他们良好的样书服务对我选定教材的影响很大。
清华大学出版社计算机与信息分社最新推出微信公众号“书圈”,教师可以微信索要课件和密码,在线申请样书以及其他服务,虽然《数据结构》没选清华大学出版社的教材,下学期的《Java程序设计》我选了他们的。下面是我申请的部分样书:
电子工业出版社的华信教育资源网服务也很好,比清华大学出版社更好的是不限制老师申请的数量,收到教材后有反馈,可以继续申请,这对我最终选定电子工业出版社的教材也有一定的影响。
我经常说,我是学完数据结构后才感到编程入门的。我上学时数据结构老师选的是严蔚敏老师的《数据结构》,学得是相当痛苦,硬着头皮把书中的代码都调试了一遍,写出可以运行的程序,才算基本理解程序设计。后来发现有人写了一本《大话数据结构》,我看完的感觉就是严蔚敏老师的《数据结构》的可执行版本,就是大学我学数据结构做过事情。从这有个认识:不同的教材的学习效果,学习感受是不一样的,当然,人还是最重要的,如果愿意学,教材就不是问题了。
一开始我觉得教材不难选择,我们的编程语言是Java,有国外翻译版的优先,我这有几个选项:
- Data Structures and Algorithm Analysis in Java, Third Edition
- 数据结构与抽象(原书第4版)
- 数据结构与算法分析(Java语言描述)
- 数据结构与问题求解(Java语言版)
- 数据结构和Java集合框架
- ......
我最想选第一本《Data Structures and Algorithm Analysis in Java, Third Edition》可惜没有中文版。还有最近几年使用混合式教学模式,希望有MOOC,微课的支持。
然后转向了朋友圈:
这三门课都有MOOC支持,都有学习指导或上机指导,MOOC制作精良,老师认真负责。但我把这几本书看完后发现内容都达不到我读《Data Structures and Algorithm Analysis in Java, Third Edition》的期待:我希望以数据结构为主,还是要有算法设计思想的。还有一个问题,这几本教材都不是用Java讲的,虽然不满意,暑假前我最后还是准备选 用邓俊辉老师的《数据结构》,授课语言不是Java,我想在暑假用Java把邓老师书中的示例改写一遍,邓老师以前也写过Java版的数据结构,可以参考,还有MOOC中可以看到邓老师的字写得越来越好了,这很让我这个书法爱好者有好感,但现在我天天跟着邓老师练字,他的书和MOOC只是个教学参考了。邓老师的书的质量、PPT质量、MOOC质量都是我很认可的,都是国内超一流水平,只是教学内容设计和教学方法上没达到我的要求, 不适合我用。
暑假前,我还在学校图书馆借了好多本《数据结构》和算法相关的书,也没有找到满意的。
在用邓俊辉老师的《数据结构》备课时,我收到电子工业出版社的两本样书:
叶核亚老师编写的《数据结构(Java版)(第四版)》,Java语言,还有MOOC支持。一度曾想选这本书,后来因为MOOC支持不了了之,只作为参考书。
还有一本是周幸妮老师编写的《数据结构与算法分析新视角》,读了真是相见恨晚,这简直就是为我定制的一本书,暑假读了三遍,这本书也成为我向我的学生推荐学习《数据结构与算法》的首选图书。
选教材前我多次读刘未鹏(博客,微博,豆瓣) 的「知其所以然(以算法学习为例)」
这几年我推荐读书当读电子书,我现在80%以上的读书时间都花在了电子书上了。我教的课程多跟计算机系统紧密相关,在多看上发现一本邹恒明老师的《操作系统之哲学原理(第2版)》,读了之后感觉作者水平比较高,虽然哲学原理有点虚,内容讲的还是挺好的,较好的做到了抽象提升、联系生活、模块整合、逻辑贯通和系统关联。按作者找书,发现邹恒明老师还写了一本《数据结构:炫动的0、1之弦》,从软件设计师和系统架构师的视角对数据结构进行阐述。通过两个角度的对望,以实际生活中的“问题”为驱动,以计算机软件设计师的“使用”为轴线,对每一种数据结构出现的动机、发展逻辑、表示方式、实现细节进行演绎,再现了数据结构的本质和内涵。在前言中,邹老师说学习数据结构的概念不难,难点是:
如何实现从数据结构概念到程序设计实现的跨越(即如何实现一个数据结构)
如何实现从实际应用到数据结构抽象的跨越(即如何利用数据结构解决实际问题)
这和我的教学理念不谋而合。我在2016-2017-2《程序设计与数据结构》课程总结中说:
课程作为教学改革的一个试点,把传统的《程序设计》和《数据结构》合并成一门课程
对于数据结构的使用,我们要先会用现明理
这也是我推荐使用Java、C++这类有数据结构和算法的标准库(Java Collections API,STL)的语言作为数据结构的教学语言的一个重要原因,在教语言的时候,我们就解决了「如何实现从实际应用到数据结构抽象的跨越(即如何利用数据结构解决实际问题)」,而C语言本没有数据结构的库,在学语言的阶段不好解决「如何利用数据结构解决实际问题」的问题。
象邹欣老师(博客,微博,豆瓣)和潘柱廷(大潘)(博客,微博)这样的业界高手同时又热心教育的都英雄所见略同的提倡教学中要解决真实问题,提供真实场景。2016-2017-2《程序设计与数据结构》课程总结我给出了自己的做法示例,在Linux下学习,实现学习内容相关Linux命令,比如通过实现dc来学习栈的应用。
在数据结构课上我们解决「如何实现从数据结构概念到程序设计实现的跨越(即如何实现一个数据结构)」,与「以数据结构和算法为核心,语言只是工具」的讲法不同,我的想法是要从程序设计的角度讨论数据结构和算法的。
周幸妮老师也深入研究了刘未鹏(博客,微博,豆瓣) 的博客,编写的《数据结构与算法分析新视角》也秉承了邹恒明老师和我一样的教学理念。
周老师说:
之所以要有上述两个鸿沟要“跨越”,也是由于学校的传统教科书教法和实际的应用要求脱节造成的。 弗里德里希.威廉.尼采曾写道:“人们无法理解他没有经历过的事情。”换句话来说,我们只接受与过去早已理解的事物相关的信息。这是一种比较学习的过程,在这个过程中,大脑要寻找每条信息之间的联系,借助以往经验来理解新事物。
传统数据结构教科书的一般模式都是给出问题,然后直接给出算法,而实际上要用计算机解决问题,必须要考虑的处理步骤有:如何分析问题中的已知信息,如何提炼数据及数据间的联系(数据的逻辑结构),如何选用合适的存储方式(数据的存储结构)将逻辑结构存到计算机中,然后在存储结构之上按照自顶向下逐步细化的方法给出算法,这才是真正解决实际问题的思维方法和步骤,也是软件开发中实际采用的方法。传统教科书的问题在于没有一个思维过程的引导与分析,致使概念论述、实现细节有余,设计实现过程描述不足,让学生看到的只是一个个问题具体的详解,而把握不住算法设计的总方法和原则。
本书尝试从学以致用的角度,注意给出问题或算法的知识背景或应用背景,增加一些在实际软件开发中的算法应用背景或实例;强调算法的分析方法、设计思路、给出重要算法的测试及调试分析,弥补上述传统教科书中的不足。教学生以“软件开发的方法”处理问题,使学生容易理解并掌握它,在实际的软件开发过程中能灵活地选择适当的逻辑结构、存储结构及相应的算法,设计性能优、效率高、可读性强、易维护的程序,达到数据结构课程最终的目的。
对于编程,周老师说涉及下面的诸多方面:
程序的解题思路——算法是基本运算及规定的运算顺序所构成的完整的解题步骤,是程序的灵魂,算法的优劣直接影响程序的效率。本书的算法描述方法见稍后的说明。
程序的运行速度——程序运行的速度受很多因素的影响。用户对程序的运行速度往往是有要求的,如实时响应系统。
程序的运行空间——代码运行需要相应的内存空间及相关运行环境。在有些应用场合,对程序占用空间是有限制的,如嵌入式系统。
代码规范——代码要按照一定的规范格式书写,以保证代码的一致性,便于交流和维护。
程序的结构—— 一个功能复杂的程序由多个功能相对独立的模块组成。模块内高内聚,模块间低耦合,是判断程序结构是否合理的标准。
模块接口——模块间的信息交流通过接口完成,模块间信息传递参数的设置应该合理有效。
程序的测试与调试——要有精心设计的测试样例来测试程序是否正确。调试是高效率完成软件产品的有效方法。一个程序高手,也是调试专家,调试的经验方法多数都是实践中得到的。
我特别欣赏书中关于算法与程序实现增加的内容,因为我就是这么教学的:
1.增加测试样例的设计
从程序健壮性的角度出发,测试样例的设计是开始程序设计就应该考虑的一个重要内容。一般的程序设计与数据结构教科书很少考虑测试样例问题,本书在最初基本的算法设计中,给出了基础程序的测试样例设计,也是让学习者以专业的方法学习程序设计,养成良好的设计习惯。
2.增加函数结构的设计
对初学者而言,在学习数据结构时,程序设计语言基础并不扎实,特别是函数结构的设计不熟练。根据给定的功能、输入输出信息,在调用与被调用的函数关系中,信息是怎样传递的,往往存在多种可能的选择,该怎样确定合适的形参类型、函数类型,初学者经常会无所适从,从而造成编程困难。根据这种情况,本书特别给出了典型数据结构运算的多种方案实现,在同一问题不同函数结构设计的比较中,让读者发现各种信息传递的方式和特点,巩固和熟练编程知识和技巧,达到理论与实践的统一。
3.增加重要程序的调试
程序设计的过程也是一个测试与调试的过程,程序的编与调是密不可分的。对于初学者而言,若调试不熟练,容易丧失继续学习的信心。根据多年的教学经验,若有程序调试演示,则相关程序比较容易掌握,特别是在学习链表等内容时,光是解释数据结构、结点联系,学生总觉得抽象难懂,若通过演示调试,观察各结点间的联系如何动态建立、消除等,则生动直观,一目了然。由于调试过程步骤较多,学生看过了明白了,但要再回想并模拟跟踪过程,则是不容易的事情,所以本书把一些重点例子的程序跟踪过程记录下来,以便学生学习。本书所有的源码均以C语言编制,并在VS IDE环境下通过调试和测试。
4.算法描述方法
- 测试用例设计
- 数据结构描述
- 函数结构设计
- 算法伪代码描述
- 程序实现
- 算法效率分析
欢迎关注“rocedu”微信公众号(手机上长按二维码)
做中教,做中学,实践*同进步!
版权声明:*转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”