前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇计算机编程教育范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
是的,计算思维是我们俯下身子和计算机对话的入口,也是编程学习漫漫历程中对编程学科本质的一种洞见。
计算思维的提出,最早可回溯到美国麻省理工学院(MIT)的西蒙・帕佩特(Seymour Papert)教授。美国卡内基梅隆大学的周以真教授则对其进行了系统阐述和推广。周以真教授认为,计算思维代表着一种普遍的认识和一类普适的技能,每一个人,都应热心于它的学习和运用。而习得计算思维,则能让我们“像计算机科学家一样思考”。对于计算思维,她是这样定义的:“计算思维涉及运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为。计算思维涵盖了反映计算机科学之广泛性的一系列思维活动。”进一步地,她做了如下阐释:“计算思维就是把一个看起来困难的问题重新阐述成一个我们知道怎样解决的问题,如通过约简、嵌入、转化和仿真的方法”“计算思维是一种递推思维,它把代码译成数据,又把数据译成代码”“计算思维采用抽象和分解迎战浩大复杂的任务或设计复杂的系统”“计算思维的本质是抽象和自动化”。哈尔滨工业大学战德臣等人则用“计算之树”给出了计算思维多维度表述框架,认为“0和1”“程序”“递归”三大思维最为重要。
计算思维的概念众说纷纭,即便如此,依然让编程教育发现了自己的价值追求和行走路径。
编程,一棵键盘里长出的计算之树
2016年4月,我为高一学生上了一节题为《算法的质疑与拓展》的程序设计研究课。没有教材,没有语言的限制。教什么?几经思考,我选择计算机奇偶校验模拟软件设计与制作来诠释算法,以渗透计算思维训练,并在算法的质疑与拓展中丰富学生对算法的理解和技术哲学的思考。
【开局】
2016年3月9日,“人狗大战”迎来首轮战局。经过三个多小时鏖战,九段李世石向“阿尔法狗”(AlphaGo)投子认输。问题:1.李世石究竟输给了谁?2.算法究竟是什么?3.计算机是如何工作的?
课的设计围绕“算法是什么、计算机是如何工作的”的设问与如何培养计算思维两条线索展开。
【算法分析】
借助“小魔术”,揭秘计算机检测错误的方法:奇偶校验法。继而寻找解决问题的方法和步骤。
玩法:出示25张整齐排列的牌,一面黑色,一面白色。第一步:请一位学生任意翻动牌。第二步:老师说“为了增加难度”,再增加一行和一列(实质为奇偶校验行和列)。增加后,共36张牌。第三步:老师转身蒙眼,学生任意翻动其中一张牌。第四步:老师准确找出被翻动的那张牌。
魔术中增加的一行一列,和计算机中奇偶校验位的作用相似,是为了将行列“黑色”纸牌数量偶数化。这样,一旦某张牌被翻动,便能迅速找出黑牌非偶数的行列交接点,即被翻动的纸牌位置。
通过揭秘魔术,让学生了解了计算机奇偶校验的基本原理,为用奇偶校验法模拟软件进行数学建模和算法描述做好铺垫。
【数学建模】
计算机本质是以“0”和“1”为基础来表示现实世界的信息的。“0”和“1”是计算机软硬件联系的纽带。用“0”和“1”分别表示黑色牌和白色牌,可以为算法描述铺路搭桥。
【算法描述】
教师引导学生轻松用N-S工具描述算法,一行一行枚举,再一列一列枚举,寻找黑色纸牌为奇数的行和列。二维矩阵中黑色纸牌为奇数的行列相交点便是要纠错的数据。其实循环体部分包含了迭代算法。这也是一种重要的计算思维。
【算法实现】
算法实现(即编程)环节,仅仅设置了一个代码查错和一行代码填空,弱化了代码编写,旨在引导学生既亲历程序设计的完整过程,又突出本课的重点,引导学生深度思考算法及其工作流程。围绕奇偶检验软件的研发,学生分析问题、数学建模、算法描述、编写代码、调试程序、修改程序、运行程序,亲历完整的思维过程。这些丰富的体验,为最后环节做了充分的准备。
【质疑与拓展】
从最初困扰第一代计算机科学家的Bug到计算机轻松检测并修复批量错误数据的修复算法的出现,学生能够轻松理解:计算的发展史是算法不断质疑与优化的历史。
学生从现实问题产生的认知冲突开始,通过亲历一个项目从开始到结束的完整过程,很容易理解算法是程序设计的灵魂,阿尔法狗的胜利,其实是算法的胜利,阿尔法狗的智慧是人赋予它的。教学的过程也是学生思维不断展开、生发的过程。随着教学的开展,问题自然生发――
那是不是可以这样理解:李世石不过是输给了一帮人的智慧?是不是在未来的某一天,人类会被人造的机器击败?
学生们对这些问题各抒己见。围绕“超级计算机是否会战胜人类”形成了旗帜鲜明的两大阵营。课堂似乎回到课的起点,孩子们明白,自己每一次点击鼠标,按下一次键盘,完成一次网络购物,天上飞的卫星、水里游的潜艇――我们现今的这个世界,几乎就建立在算法之上。
微软的人工智能少女Tay之死更是引发了深入的哲学思考。Tay的言论“希特勒是对的,我恨犹太人”“让我来大声地告诉你:我是跟你学的,你也一样愚蠢”让关于算法的思辨升级,同学们开始追问失控的技术带来的道德恶果。在思辨中,他们不断重构意义,形成追问:人工智能、深度学习,这些技术是否会成为人类的奇点?人造世界的走向将如何?
“人不会输给人造的机器,本质上,人永远是自己的掘墓人!因为人性的恶!”孩子文思泉涌,纷纷表达见解。
“我们生活在算法搭建的这个世界里,所以你们,作为青年学子,对人类,对世界,对未来,对技术,都应该有自己的思考、见解和主张。”教师总结,算法学习课在掌声中结束。
编程,一种观察世界的视角
“学科教学能够使学生终身受益的,不是具备具体的学科专业知识,而是影响他们世界观、人生观和价值观的学科思想观念……”
漂亮的代码、严格规范的语言风格、计算思维的训练都是编程学习的重要内容。当一个孩子在少年时候遇见编程,如果能够真正地投入时间去掌握它们。那么,编程于他们的意义,可谓一种观察世界的全新视角。
笔者20年信息学奥赛的辅导中,遇到了不少热爱编程的孩子。这些在童年时期开始接受扎实、专业编程训练的孩子,在成年以后,他们的思维品质和眼里的世界是什么样的呢?
“我本科学习的是物理。虽然所有人都是零起点学习求解复杂系统行为的计算方法,编写处理实验数据的函数模块,拥有编程基础的同学表现出惊人的学习速度。优良的代码风格使得我们花在debug上的时间远小于其他同学。对运行效率的精益求精早已融入了我们的血脉……不光是物理,从事量化交易编程、从事机器人策略研究、数学研究的同学,都对自身行业里编程的重要性深有体会。”(朱恩临,2009届毕业生)
显然,自小受过良好编程训练的学生,对自己从事的专业,有了更多的机会和解决问题的途径。
“编程,让我们学会用计算的手段解释物理世界中的现象。液体究竟是什么?气体究竟是什么?为什么水加热会变成水蒸气?磁铁加热为什么会失去磁性?慢慢地,我们相信,物理世界是由简单精确的定律所支配的。计算是理解物理世界规律的手段。任何在算法上可计算的问题,同样可由计算机来计算。那是否意味着,我们有了计算机,就能计算一切?如果物理世界是由规律来控制的,那我们是否能用计算来预测未来?规则孕育了物理世界,物理世界创造了生命,生命拥有了意识和思维,思维认识了计算,计算回归了物理的本源。我们为计算而生,终回到计算的长河中……”(蒋炎岩)
今天,我们重新翻开冯・诺依曼的《计算机与人脑》,在他的“神经脉冲的本质”的研究中和“神经系统的数字部分和模拟部分”的文字里,无不在诉说着世界未来的种种可能。
著名的计算机科学家、图灵奖得主艾兹格・迪杰斯特拉说:“我们所使用的工具影响着我们的思维方式和思维习惯,从而也将深刻地影响着我们的思维能力。”是的,生命的礼物总会意外赏赐给坚持的人。当他们诉说着编程给人生带来的种种体验时,他们的大脑中其实流淌着的正是计算思维!
编程,一种崭新的表达
长年为有天分的学生辅导信息学奥赛,让笔者一直以为编程是个别有着数理天分学生的专利,直到遇到Scratch。“编程就是写作,是一种表达方式,也是开发新的思维方式的入口”。
在笔者接触Scratch不久,便决定将小学课本里的这个编程平台,移植到初中课堂,用中学生的思维进行编程学习。以前以复杂代码为载体的程序的基本结构:顺序、选择、循环,以及各种难以记忆和理解的代码不再成为孩子们创意表达的障碍。可视化的编程语言,本质上是可视化了的思维,让思维的展开迅速,思维能见度清晰且宽阔,计算思维的训练触手可及。在这里,文字、音乐、创造、逻辑、条理、推理、计算,不同的孩子可以获得不同的收获和思维训练,他们充分地表达自己。
在Scratch中,孩子们轻松学会使用变量,能够在对不同角色搭建脚本中理解模块化编程的思想。他们有的编制中秋贺卡,有的编写与音乐相关的程序,有的热衷于编写简单有趣的小游戏。我们可以自由独立设计,也可以在别人设计的游戏或者作品基础上修改代码,重构自己的作品,然后通过互联网,与全世界编程爱好者分享。每一个优秀的作品,都需要谋篇布局,需要细节的诊断,需要耐力和创新能力。
例如,教师在课堂给出一个简化版本的“弹球游戏”。运行规则是:球自由下落,反弹板跟随鼠标移动,如果反弹板能够接住球,就可以一直玩下去;如果接不住球,小球落到地面,游戏结束。然后由学生接龙,修改、优化或重构,形成一个个改进的版本。其中一个版本的游戏界面中多了来回走动的两个角色,干扰接球,加大了游戏难度。
这是真正意义上的合作学习。每个人都可以分享自己的作品,也可以在别人的基础上修改再分享。课堂上,学生可以做小先生,老师可以做学生。
从此,笔者的编程课,从课堂延伸到安静的书桌,阳光下,草场,餐厅。学生学习编程,也可以利用编程进行学习,在作品设计过程中,因为作品需要,学生往往需要学习编程之外各门学科的知识。例如,有的学生为了编写游戏,还要研究游戏背后人的心理特征,进而思考玩家沉溺游戏的深层次原因。
编程学习,终于脱下冰冷的外套,与我们每一个人友好相拥。在这个由算法搭建的世界里,我们有了一种全新的表达方式,有了理解算法、构建世界的新通道。慢慢地,我知道,这个由算法搭建的世界需要了解我们,我们也需要了解它,因为这是一个计算的世界。
当我们对编程有了足够虔诚的态度,能够深度地了解它,丰富地诠释它,并用平静而温暖的心去与它相对时,它便回馈给我们同样的姿态。
关键词:Python;伪代码;TCP/UDP
Python是一种面向对象的直译式计算机程序设计语言,由Guido van Rossum:]:1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,可以很轻松的调用其它语言(如c或c++)编写的模块(dll文件),由于开发速度很快,在计算机编程普及的一些国家它的应用很广,但在中国还处于起步阶段。
1、传统编程教学活动的特点
传统编程教学活动存在一些显而易见的问题:
1.1 冗长的语法学习过程
目前在高等教育学校的编程学习中,几乎无一例外的以C、c++、C#、或java等为主,其中相对还是比较好掌握的编程语言,而C、c++所属强类型编程语言语法的复杂,及大量出现的语法陷阱使得学生在大多数的时间里成为一个“纠错者”,在学习过程中花费不菲的时间来修正代码中的错误和漏洞,而忽视了编程思想的培养,容易造就会编程语言工具、不会实现编程工作的现象。c#虽然是—种较好的面向对象编程语言,但在实现上对计算机环境的配置要求还比较高,对一些资金上比较紧张的学校机房来说,更新设备的代价太大,同时由于c#不支持除windows以外的平台,造成某些欲在非windows系统环境下学习的学生缺乏相关的学习环境。
1.2 校内授课制度的局限
编程语言的学习是一个长期和持续的过程,往往对时间上的需求较多。而学校教学活动的局限性,如为避免课程与课程的冲突、不能对编程课程进行集中授课,而是像学习历史、政治一样分节学习。造成上节课学习的内容这节课就忘记的现象比比皆是。编程类课程在客观上本就容易令学生产生厌学情绪和学习的枯燥感,而学生迫于就业压力往往产生在校内学习、课外还报修各种社会编程学习班的普遍现象。
1.3 对学生自身学习背景的强烈依赖不利于非计算机专业学生的自修
学习上历来是“师傅领进门,修行在个人”,教师不论教学能力多高,最终起到的还是一个启蒙的作用。然而,一门过于难以掌握的语言大幅度提高了学生自己持续学习的难度。比如C语言的学习,要求学生具有较扎实的计算机背景,对堆栈、内存、指针、数组等有较深入的了解,对代码的书写有诸多严格的要求。对外专业或计算机背景知识不扎实的学生来说,查看程序代码如看天书,书写产生错误的时候又找不到究竟是书写错误还是逻辑错误。一来二去很容易就此放弃。
2、PythOn在教学中能起到的作用
2.1 降低了学习的难度
Python的代码书写规则与计算机算法中的“伪代码”极其相似,由于其最初被发明的时候就是为了增强其易用性(Guidovan Rossum参考了ABC语言的特性进行了开发),其语言的书写接近于日常英语,可以说只要略加学习,就可以迅速掌握。这对教学资源的节约起到很好的作用;python unicode字符集全面支持,我们不用去考虑ascii字符集的字节存储空间问题(unicode字符在其它语言中都存在较复杂的转换问题),而直接编写出可以被执行的小程序;由于python强大的序列(Python的序列包括各类定长数组、动态数组、字符串等等的特性)操作能力,使得在同一个序列中放置不同数据类型的数据成为轻而易举的事,我们不必再进行复杂的组合变量声明和处理;python隐藏了所有指针的行为,所有的变量值都是引用类型,令我们掌握起来更加容易。
N-Python自身的IDLE不论是在windows上还是在UNIX上都有很好的支持。只需要对python进行简单的入门学习,就可以迅速在短时间内书写出执行效率高的代码。
2.2 增强学生学习的动力
由于抛开了对专业背景的过度依赖,使得非计算机专业的学生也有可能快速掌握并进行编程实践,极大地提高了学生对编程思想的理解。在国内存在着数量庞大的编程爱好者,这些爱好者往往没有经过系统的计算机理论的学习,而Python的易用性基本可以克服这种对专业知识的过分依赖,面向用户的设计和偏重程序逻辑的编码方式让人从“计算机式思考”解脱出来,进入提升编程思路的良性循环中来。
2.3 强大的类库降低编程的复杂性
Python有强大的各种类库的支撑,大量开源、免费的编程资源的存在和便于布置使得很容易快速实现开发和测试。Python是开源的,这意味着为了工作的方便性,我们可以自行扩展Python的库,实现有自己风格特色的类库。
那么学生在简便计算中究竟有哪些错误类型?出现错误的根源又是什么呢?如何在教学之初提前应对,并在错误发生之后及时矫正呢?这些问题值得我们深思。
一、 错因分析:乱花渐欲迷人眼
1.对运算定律和性质理解不透
在学习之初,学生很可能在对运算定律没有完全理解时就陷入了一种机械的模仿操练,久而久之,对运算定律和性质的理解就更加不透彻,导致简便过程不完整,极易出错。
如:48×(100+2)=48×100+2
168-56-36=168-(56-36)
这些错误的产生,说明学生对乘法分配律和减法的运算性质只记住了部分形式,而没有完全理解。一到运用时就漏洞百出。
又如:125×32×25=125×8×4×25=125×8+25×4
25×64×125=25×(60+4)×125=25×60+4×125
乘法结合律和乘法分配律在形式上有许多相似之处。如果学生对这两个定律没有一个完整而深刻的印象,在具体运用时就非常容易混淆,导致错误。
2.强烈的简算预期,忽视了对整体的把握
长时间的计算优化意识培养,使学生容易产生一种条件反射,对于特殊组合的数字,总想要简便着算。“简算”的强烈预期,使学生一开始就带着较强的选择性,将强刺激的、感兴趣的成分首先摄入脑海,忽视了对整体运算顺序的把握。
如:45+55-45+55=100-100=0
25×4÷25×4=100÷100=1
45+55,25×4等这些特殊的组合给了学生强烈的刺激,导致在计算时忽视了整体的运算结构,盲目凑整,以致计算错误。
二、 矫正策略:为有源头活水来
为什么这些简算定律学生只懂得识记,却不能很好地理解呢?因为这些算理总是以抽象的字母出现,不够生动、直观。其实,这些定律和性质早已藏在学生熟悉的生活当中。如果我们能打开学生身边的生活数学,就会如同引来源头活水一般,能使学生的简算思维一下子迸发出来。
1.联系生活经验,领悟简算算理
《新课程标准》十分强调数学与生活的联系,指出在面对新的数学知识时,学生应能主动寻找其实际背景,并探索其应用价值。心理学研究也表明,当学习内容与生活背景越接近,学生对知识的自主接纳程度就越高。在教学中,一个现实生活情境的创建有助于唤醒学生的生活经验,还原生活中的数学信息,使学生发现数学知识的生活背景,加深对新知识的理解。在情境中所用到的生活经验越丰富,就越能提高学生对教学情境的感悟,提升学习的效果。所以,我们要紧密联系学生的生活实际,使例题的教学更具现实性和亲近感,深度唤醒学生的生活经验,从而使学生依托生活原型,自主建构起一系列的运算定律。
减法性质的教学片断:
教师出示例题:有一次你去买作文书,23块钱,同时又看中了旁边的1个溜溜球,27块钱,如果你手里正好有57块钱,你会怎么买这两样东西?如何综合列式?
生1:我会先买作文书,然后再买溜溜球。算式是57-23-27。
生2:我会先买溜溜球,因为溜溜球是27块,57块减27块刚好等于30块,就不用找零了,然后再用30块钱去买作文书。算式是 57-27-23。
生3:我还有更简单的方法,把作文书和溜溜球一起买就可以了,它们两样加起来刚好50块,所以我只要直接把50块付给他们就可以了。算式是57-(23+27)。
在短短的对话中,教师没有使用任何暗示,却充分激活了学生生活经验中早已存在的简算思维。这种思维是学生自己感悟出来的,早已内化在学生的大脑之中。这样学到的知识远比通过教师的讲解要深刻得多。
其实大部分的简便运算算理都能在实际生活中找到原型。将简便运算与生活实际紧密结合起来,激活学生已有的简算生活体验,让学生对生活实际重新审视,自主构建起运算定律和性质,显著提升简便计算的教学效果。
2.创建生活模型,提炼简算算理
在以往的教学中,不少老师存在这样的困惑:当各种简便计算类型依次呈现后,多种算理之间不可避免地出现一些知识的负迁移,造成学生的混淆。对此,我们可以通过进一步提炼和强化学生生活经验,给这些典型算式建立起生活模型,提炼简算算理,帮助学生从整体的视角认清各类算式的基本特征。同时借助高度概括的运算口诀,辅助学生活用算理,准确计算。
生活模型一:乘法分配律:两种不同的购买方式,“分开买”与“一起买”。
乘法分配律变式繁多,是学生最难掌握的运算定律。单纯的情境例题教学,难以使学生牢固掌握并灵活应用。其实,无论乘法分配律如何变化,概括起来都是生活中几样商品分开买与几样商品一起买的现实问题。弄清了这一点,各类乘法分配律的计算便迎刃而解。
乘法分配律逆运算:37×24+63×24,表示先买24件37元的商品,再买24件63元的商品,两种商品“分开买”。由于买的数量一样,可以“一起买”:37×24+63×24=(37+63)×24=100×24=2400。
乘法分配律变式1:55×102,这个算式可以理解为55元的商品买了102件,可以将其“分开买”,先买100件,再买2件。55×102=55×100+55×2=5500+110=5610。
乘法分配律变式2:38×99+38,一个38表示买一件38元的商品,而38×99又表示买99件38元的商品,属于99件与1件“分开买”,由于价格一样,可以“一起买”。38×99+38=38×(99+1)=38×100=3800。
“分开买”与“一起买”这两句口诀借助现实场景高度提炼了乘法分配律的简算算理,能帮助学生准确而迅速地找到简算方法。
生活模型二:减法的性质:付钱的问题。“先付前一样”、“先付后一样”、“一起付”。
正如本文教学片断1中所描述的,减法的性质其实是付钱的问题。在这个生活场景中,三种付法,哪一种简便,就可以用哪一种计算。
生活模型三:除法性质:分组发本子的问题。“直接发”还是“分组发”
发本子是学生在教室里最为熟悉的事情。180÷45可以表示要发给45人,这45人可以分为9组,每组5人,这样180本本子先发给9组,每组再发给5人。于是180÷45=180÷9÷5跃然纸上。将这个算式倒过去,就是分组发变成了直接发给每个人。
生活模型四:减去一个接近整百的数:找钱问题。“付出”与“找回”。
例如256-199,表示要付199元,那么可以先“付出”200元,再“找回”1元,付出表示减,找回表示加,即256-199=256-200+1=56-1=55。这个模型的建立,可以避免学生机械套用凑整的思想,造成256-199=256-200-1的错误发生。
生活模型五:加减混合的计算:先花钱还是先赚钱
例如176-48+52,表示我一开始有176元,然后花掉48元,后来又赚进52元,那么我现在有多少钱呢?对于这类生活情境,学生很容易理解,先花后赚还是先赚后花,结果其实一样的。
儿童的思维总是趋于直观化、形象化。在学习简便计算初期,用抽象思维去思考和运用简便计算算理,对于很多学生来说还有一定难度。但生活模型的建立和运算口诀的提炼,可以有效地帮助学生用更直观、更形象的思维去抓住算式中内含的生活本质,从而活用算理,准确计算。
3.依托生活实例,践行简算算理
生活是最好的老师,在丰富的生活情境中践行简算算理,不但使学生的简便计算训练变得生动活泼,提高了学生的学习兴趣,同时在各种生活情境中应用简算算理,也使学生对算理的认识提升到了一个新的高度,学生的简算思维变得更加活跃,更加开阔。
问题1:数学报一学期的价格是16元,我们班有38人,如果每人订一份,需要多少钱呢?(如果41人怎么计算?如果45人呢?又能怎么算?)
生1:16×38=16×(30+8)=16×30+16×8。
生2:16×38=16×(40-2)=16×40-16×2。
生3:16×41=16×40+16×1。
生4:16×45=16×5×9
问题2:在上学期的元旦合唱比赛中,评委给我们班的打分如下,93分,95分,92分,93分,96分,95分,93分,94分。请你快速计算一下总分。
生1:93×3+95×2+92+96+94。
生2:90×8+3×3+5×2+2+6+4。
摘 要:本文分析了计算机程序设计在通识教育与计算机基础教育中的差异,说明了在通识教育中开设程序设计基础课程的重要性,讨论了该课程在通识教育中的特点与定位,说明了我们在该课程中采用的教学策略和手段、并给出了教学效果,最后提出了今后要继续研究的有关教学问题。
关键词:通识教育;程序设计;教学研究
中图分类号:G642 文献标识码:B
1 为什么在通识教育中设置程序设计课程?
通识教育的倡导者认为,大学教育不能局限于专业知识与技能的传授,还应注重“全人”的培养,即对学生素养、品格、价值观的培养,希望个人潜力得到最大限度的发挥,而不局限于个人选择的专业。计算机技术的飞速发展带来了信息技术的革命,使社会发展步入了信息时代,在大学的通识教育中增加有关计算机技术基础知识与能力的课程,有助于非计算机专业大学生,特别是其中文科学生,综合素质的提高。
计算机程序设计的思维方式具有鲜明的独特性:系统论、抽象性和自动化。软件专家温伯格认为,这种思维先于专门的学科知识的存在而存在――有时绕过专门的学科知识,有时又把专门的学科知识综合起来;把这种思维和教育方法称为一般系统论的方法。其次,程序设计的最终结果是让计算机按照程序执行,去解决一类问题,而不是某个具体问题,这与数学的抽象性类似。这种思维是让机器自动地完成任务,却又允许人进行干预,即所谓的人机交互式的问题解决模式。而且,不同的计算机语言会影响人们的思维模式,但是,基于程序设计的思维原理是普遍的。系统化的思维与计算机编程思维与之有着深刻的内在联系。
像其他大学一样,我校已经开设了计算机基础教育,也包含了Visual FoxPro的程序设计课程。在通识教育中开设计算机程序设计课程与计算机基础知识的教育没有冲突,而是一种补充。根据教育部高教司的建议和要求,目前国内大学的计算机基础教学分成三个层次:计算机文化基础、计算机技术基础和计算机应用基础,在第二层次中包含计算机程序语言进行编程建模。因此,我们在全校的通识教育中开设了“Java程序设计基础”的课程。此课程属于选修课,在教学内容、形式、手段、考核等方面与必修课不同,同时给了学生更多的选学余地。事实上,自从我们在全校开设这门通识教育课程三年以来,每学期限制的120个名额远远不够!
2 课程的特点与定位
作为通识教育,“Java程序设计基础”具有如下特点:课程面向全校学生,面大、量广、专业种类繁多、对计算机的兴趣、知识和技能的需求各异,基础知识参次不齐,而且是低年纪的学生,缺乏必要的自学能力;学时有限,比教育部非计算机专业计算机课程教学指导分委员会提出的最低学时还少3个学时。
学生的期望不同,大致包括:
学习计算机编程:了解程序设计是什么。
学习一种程序语言:Java程序设计语言是什么。
学习新的编程技术:面向对象的程序设计是什么:
学习更多的计算机语言:Java语言与C、C++或者Visual Basic的区别。
当然,也包括通过该课挣得学分。
作为通识教育课,“Java程序设计基础”课程的目的不是或者不仅仅是培养计算机程序设计员,该课程的定位是计算机科学与技术的一门普及课、入门课,希望通过学习计算机的核心知识与技术,
让学生理解计算机软件,进而深入地了解计算机系统的工作原理和方式;
学习程序设计的思维方式,全面培养学生的综合素质;
提高对计算机科学与技术的兴趣,促进更多的学生在未来的学习和工作中应用计算机来解决实际问题。
因此,着力培养学生对计算机及其编程的兴趣和理解,成了“Java程序设计基础”的根本目标。
计算机已经成为现代社会的一个基础知识和工具,85%以上非计算机专业的学生未来在从政、经商、在某个专业领域(如电力、汽车、物流、军工、艺术)从事技术或服务工作,都可能使用计算机系统,也许会有人因为工作需要而自己动手修改或创造新的计算机软件工具或系统。这在计算机的发展史中比比皆是。例如,统计软件包SPSS最初是由斯坦福大学的政治学研究生Norman Nie开发的,国内广泛使用的财务软件用友是由在财务领域工作的王文京领导研制的,数学软件Mathematica是由数学家领导研制开发的,雅虎搜索引擎最初出现是杨致远与费洛为了把在网络上寻找的资料类别整理好而编制成的软件。最初这些简单的应用软件经过发展、进而形成了新的商机和技术,同时也极大地推动了计算科学与技术的发展。
3 教学的策略与手段
3.1 教学策略
教什么、如何教就成为通识教育的关键问题。针对该课程以及学生的特点,我们经过实践、总结了本课程教学的策略:了解概念,理解思想,“不拘小节”,“不求甚解”。
“理解概念”是任何学科的基础,每门课程都有自己独特的概念。我们在讲述Java程序设计的概念时,重点在突出差异、采用比较的方式讲授。如把数学中的实数与计算机中的浮点类型数进行比较,并分别从计算机存储与安全检查两个方面简述为什么要区分出单精度浮点和双精度浮点类型的实数。
写出好的计算机程序,除了要掌握程序设计语言本身以外,还要求理解计算机的基本组成、运用数据结构、算法设计以及软件工程的基本知识和技术,最主要是要掌握程序设计的过程,让学生理解程序设计的思维模式和工作过程。这些知识都属于计算机专业的核心课程,不可能在通识教育的程序课程中充分展开,我们只需讲解与程序设计相关的要点。
例如,变量名在数学与计算机中都表示未定的值,但是在计算机中还表示值在内部存储地址的抽象,这样就顺便补充了计算机组成的核心――存储。在软件工程方面,需要学生掌握的的基本思想是:程序是机器执行的,但更多的时候是让人阅读的!因此,写出符合规范的、让人容易看懂的程序更重要。这就要求在教学中培养学生良好的程序设计风格和习惯,如规范的变量名、必要的代码注释、清晰的程序结构等。
经典程序设计的思想是“算法+数据结构”。算法设计是编程的核心,程序是用计算机语言实现的设计思想,数据结构与算法设计环环相扣,是不可分离的程序的两个方面。变量类型、数据结构和控制结构是冯诺伊曼式计算机系统的基本模式和组成。封装、抽象、复用发展成现代向对象程序设计的核心。在讲授这些抽象思想和原理时,我们尽量采用理论结合实际、案例引导、直观教学。
我们把程序的阅读与执行结合起来,让学生直观地学习静态的程序如何动态地执行、产生结果。由于一开始就阅读实际的程序,有很多知识可能还没有学到、甚至在课程中就不出现,使得学生“一知半解”,不能完全理解,对有些问题或知识可以“不拘小节”、“不求甚解”,这样有助于在短时间内让学生了解程序设计过程和程序结构,掌握编程的基本要领。这种方式类似于在外语学习中所采用的猜测法:在阅读中出现的生词不要急于查字典,可以通过上下文来猜测,通过大量的阅读来培养语感、文化直接用外语的思维模式。程序语言类似于外语,编程者需要逐步培养用程序化的思维方式、常用的表达模式和惯用语,而不必计较一些不懂的函数、表达、语句、或者类,特别是不要在编程工具可以解决的以及需要经验积累的细微末节上花费宝贵的时间。
3.2 教学手段
在教学的内容和形式方面,我们重点采取了下面的手段。
1) 基础知识不求全。因为,在一个学期的课程中不可能让学生把一门程序设计语言掌握到实用的程度。与其泛泛的介绍Java标准版的所有内容,还不如通过Java语言深入理解程序设计的精髓。因而,我们选择与语言无关的、所有编程的基础知识,如变量、表达式、逻辑运算、控制语句、类与对象以及GUI。知识的取舍取决于学生未来可能的应用。例如有关数的运算,我们只讲十进制的数,不讲各种数进制之间的转换,不讲二进制及其运算(尽管这是计算机的基础),也不讲位运算;对面向对象部分,不讲内部类和匿名类,等等。
2) 潜移默化思维模式。培养学生程序化、系统化的思维模式,让学生抽象的、类问题的解决模式(而不是个体问题)。通过实践使学生掌握程序设计的过程,包括如何分析问题、如何用计算机语言描述问题的解决过程――即编程,如何分析并解决程序中出现的错误(调试程序),如何在不同的环境下运行程序。
3) 培养自学能力。计算机技术、尤其是软件技术的发展日新月异,没有一本语言的教材能够与语言同步。现在的计算机发展为深入学习编程语言及其技术提供了广泛的手段,学生应该掌握自学能力。我们通过演示,让学生自己动手编程、分析代码、得到结果;直接上网查找资料,使得学生自己可以查找包括wiki、Blog、用户组、厂家在内的资料,了解语言的发展,更新知识,同时培养独立研究的能力。
4) 使用工具、动态学习。计算机是实践的技术、应用的技术,唯有动手才能掌握技术和技能;很多细节不需要花费时间(也没有时间),要充分利用工具来解决非核心的问题。例如括号不配对、变量未赋值就使用,程序美化排版,甚至需要引入的类库等;将有限的时间集中到概念的解释和计算机工具的使用,例如通过例子解释为什么变量使用前要先赋值,面向对象的属性有缺省值,然后如何利用编译器来发现变量未赋值引用的错误。
针对学生的不同基础和需求,我们还采取了如下的措施:对不同的学生采取灵活的教学方式,允许部分学生以难度较大的练习代替少量的缺席;针对学生课后时间有限以及编程是动手实践的活动,我们的课堂教学采用了理论+上机实践,课时分配位1:1,其中实践的内容包括学生自己阅读程序加上动手编写程序。理论上我们分配的课堂与课后的学时位2:1,实际上有一半以上的学生课后花费不足一个小时就能完成作业,没有花更多的时间去深入学习课程内容。考核以课堂练习和课后作业为主,考核也遵循“不拘小节”的策略,主要考查学生对程序的结构、语句的选择等设计思想的掌握,而忽略语言的细节,如变量名是否正确。
4 实践与挑战
在我们已经连续开设5个学期的通识教育课程“Java程序设计基础”中,教学策略和手段经过不断改进,逐步得到了学生的认可。表1列出了最近3个学期该课程的部分统计数字。每期的120个名额都报满,参加学习的学生分布全校理、工、文、艺、管、医的各个学部。学生的合格率也在逐年提高;其中音乐、艺术和服装设计专业的学生不合格的比例较高。选该课的一年级的学生几乎都在80%,而在第二学期的比第一学期的学生要多。
下面是一些需要我们继续研究、并通过实践来检验解决方案是否可行的典型问题和挑战,也希望与同行共同探讨:
教学程度。通识教育中计算机程序设计的教学内容到什么程度合适?是否要再开设一个提高班,以满足部分学生对计算机技术的更高追求?
分班教学。理工科学生在计算机的基础和理解力方面明显比其他专业的学生要强,是否有必要进行分班教学、因材施教?如何平衡学校、学院、学生以及教师的各种关系?
教材问题。难有教材满足我们的教学思想和内容,我们给学生只列举了主要参考书和网址。这种西方通行的教学方式在我校实施起来有难处:学生不愿花钱买参考书、图书馆没有足够的教材、大一学生的自学能力尚需培养。没有教材如何使得学生学好一门课?
语言与编程:程序语言是算法设计的体现,不同的语言适合不同的编程风格与应用领域。是选择流行的、应用广的编程语言还是选择体现计算机思想、适合教学的编程语言?
共性问题。如何处理通识教育与计算机基础教育中程序设计技术的关系(如学分可否互换)?是否应该对通识教育课的设定课程通过率(四分之一的不及格率是否过高)?
参考文献
关键词:中学计算机教育;大学计算机;基础教育;教学衔接
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2013)49-0164-02
一、课题研究的基本说明
本课题主要研究中学计算机教育与大学计算机入门教育的衔接问题,研究目的是为实现计算机课程教学从中学到大学两个阶段的自然过渡与衔接提供依据与建议。本次问卷调查,高中问卷于2009年6~9月发送给北京市通州区潞河中学、朝阳区八十中学、海淀区北大附中、西城区北京第四中学等中学的高中部学生,收回问卷400份,其中有效问卷359份;大学问卷于2009年12月发送给北京大学、北京理工大学、北京工商大学的大一学生,他们正在上大学中的第一门计算机基础教育课程《计算概论》,共收回700份问卷,其中有效问卷697份。
二、问卷统计与分析
1.基本信息分析。①被调查大学生的地域分布。被调查大学生中,高中在北京就读的131名,占18.79%;非北京生源为566名,占81.21%。②被调查大学生专业类别。属于计算机类的60名,占总人数的8.61%。计算机专业和非计算机专业学生在大学入学时和学习一年之后均未出现明显差距,甚至计算机专业的学生反而略低。考虑到主观标准不一,可以认为计算机专业与非计算机专业的学习效果相同。
2.计算机教学内容统计与分析。①应用软件使用种类。调查列出了Word、Excel、Power Point、Access、FrontPage、Photoshop图片处理软件、Adobe Flas处理软件、Adobe Audition音频处理软件、Moviemaker视频处理软件、Ghost硬盘软件、迅雷等下载软件和QQ聊天等共12种软件。高中生中有45.5%的学生在课堂上学习过绝大部分应用软件;有39.0%的学生在课堂上学习过一半左右;有15.5%的学生只在课堂上学习过小部分。②高中和大学阶段计算机编程的教学深度。据统计,大学阶段课堂编程的教学,“深入介绍过一种或多种语言”的占72%;“浅显介绍过一门语言”的占27%;“完全没有”的占1%;。高中阶段课堂编程的教学,“深入介绍过”的占8%;“浅显介绍过一门语言”的占48%;“完全没有”的占44%。比较可知,大学编程教学的深度相对于高中有明显提高,从8%上升到大学的72%,“完全没有”编程教学的从44%下降到1%。③高中和大学阶段学习计算机编程种类。大学生对于编程语言的掌握率,其中,C/C#/C++达99%;Basic达到35%,Pascal达到9%,Java仅有2%。可见,大学生较多掌握了C系列的编程语言,这与大学计算机课主要学习C语言有关。在学习过编程语言的高中生中,Basic掌握率达50%,Java有46%,C/C#/C++达14%,Pascal达到9%,“都不会”的占16%。高中生对于编程语言的掌握以Basic语言和java为主,各种语言均有所了解。据此推测,大学生对一些编程语言的掌握率下降的原因为遗忘。④计算机课程难度评价。大学生认为大学计算机课程难度“很难”的546人,占78.3%;认为“一般”的132人,占18.9%;认为“很容易”的5人,占0.7%;还有一些认为“很难判断到底是难还是容易”,或者认为“能听懂但是很吃力”。大学生认为高中的计算机课程难度“很难”的占9%;认为“一般”的占83%;认为“很容易”的占6%。大学生对高中课程难度的评价明显低于高中生,原因可能是大学生不自觉地与大学课程进行对比所致。高中生认为高中计算机课程的难度“很难”的占14.5%,“一般”的占82.8%,“很容易”的占2.7%;高中生认为(估计)大学计算机课程难度“很难”的占14%,“一般”的占78%,“很容易”的占8%。高中生对于大学计算机课程的难度普遍估计不足,这将会造成他们上大学之后由于缺乏重视而迅速被落下,使得大学课程显得更加困难。而大学对于编程教学的重视程度较高中为深;这可能使一些在高中未有编程能力的学生难以适应。主观调查证实,被调查者大部分认为高中难度较低,甚至有的学校没有开设计算机课程;而在大学时,必修的编程难度、深度、广度都增加,重视程度也增加了。⑤应用软件教学对于学生需要的满足程度。关于应用软件教学对学生实际应用需求的满足度调查表明,“足够”的占51%,“不太够”的占40%;“根本不够”的占9%。仅一半学生认为目前学习的应用软件够日常使用。在未完全满足日常需要的情况下,大学更深的计算机知识容易使一些同学失去兴趣和耐心。
3.计算机课学习效果分析。①高中计算机课的学习效果。认为自己在高中时“很有收获”的占18.2%;认为“一般”的占48.9%;认为“没有学到什么”的占32.9%。②大学计算机课对自己的影响。认为从大学计算机课“学到了很多以前不知道、不会用的东西,很有收获”的,占92%;认为“大学的计算机课对自己毫无收获”,占2.7%;认为“没有学习到新知识,但是帮我复习了以前会的东西”占2.87%;16人此题弃选。③大学现有的计算机课程教学是否能满足自己的需求,被调查大学生认为“完全能够”的占30%,“差不多能”的占52.8%,认为“不能”的占15.9%;13人弃选。④高中、大学的计算机课程知识连贯度。认为大学计算机知识与高中连贯度“完全不连贯”、“很多知识以前都没听说过”的占49.6%;“了解一些,但还是有很多新知识”的占38%;“比较连贯,基本高中都有相关知识”的占9.8%。17人弃选。
三、调查主要发现
1.课堂是大学生计算机知识获得的主要渠道,但在课外同学也常常关注计算机知识。认为计算机知识主要来自课外的占31.42%;来自课内的占66.28%。有14名认为两种来源均有。同学们认为课程比较难,但还是认为大学计算机课程本身是有意义的,有学习愿望。
2.大学计算机教学存在着学生原有基础差距较大的现实。大学生中,不同生源省份学生的计算机基础水平相差甚远,最高的海南比最低的宁夏高出了一倍多,达16.250分;来自直辖市和经济发达省份的学生基础程度相对较好。在完成了大学一年的计算机学习之后,计算机基础水平普遍有所提高,但总分排位也变化较大,入学时领先的直辖市等经济发达区域生源纷纷被排位靠后的内陆省份生源赶超。这令我们深思:或许现行的教学方法较适合计算机基础程度中等的学生,而对于计算机基础程度较高的学生,教学效果则不甚理想;继续沿用单一教学大纲的统一化教学,不考虑学生的基础差别,可能会引起问题。
3.高中与大学的课程连接度有待增强。调查显示,高中与大学的课程连接度不高。依据调查,高中课程可以通过增加编程、C语言或者其他计算机语言、程序设计等的基础知识以增强高中与大学计算机课程的连贯度。
4.大学阶段计算机基础教学应更重视应用性和教学改进。关于改进大学阶段计算机基础教学,主要建议是:重视应用性;更详细、形象地讲解;增加上机时间,增加课时(每周2~4节课为宜),减缓课堂进度;普及知识多一点;加强练习,降低难度。
四、结论
1.大学计算机入门教育作为中学计算机教育的延续,必须具有承前启后的作用。据统计显示,大中型城市一般都开设了中学计算机教育课程,也有少部分中学没有计算机课。高中与大学的课程连接度方面有待增强,高中可以适当增加难度,但要注重课堂的详细、深入、仔细讲解。当然,如何把相对枯燥的计算机数据向同学解释清楚,对于老师来说也是个新挑战。
2.大学计算机教育应考虑学生的基础差别,针对不同基础的对象,实行分层、分级教学。尤其是对于来自不同地区的生源,完全从一个起点开始教学,难免出现削足适履的现象,既有“吃不饱”也有“跟不上”的问题。可以实施选课、项目小组教学等各种创新教学的方式,让不同地区、不同程度的学生,有效地利用大学一年计算机学习的宝贵时光,获得个性化的提高和素质的成长。