返回到【全文目录】
目录
9.2 博客和OJ——让代码积累看得见
对于学习编程的感受,有些人觉得激情万丈,有些人认为枯燥乏味,更多的人处于中间状态。如果能够不断感受到进步,编程是一件愉快的事;而如果时时遇到阻碍,看不到自己的进步,则会情绪低落。这启示我们,是否能够找到一个合适的外部激励,体现编程的进步,帮助找到成就感?显然,一直致力于帮助学生摆脱应试思维控制的我,不会对考试有过多的依赖。
在我和我的学生的实践中,我们找到了两种途径,让初学编程的同学们能找到要做的事,能够时时感受到自己的进步,就如汽车仪表盘上的的数字增长一般,这种积累是看得见的。
用博客记录成长的历程
这两年,我带领我的大一学生们在CSDN博客频道安营扎寨,坚持用博客提交程序设计的作业。这种能让学习成果看得见的方式,支撑着我的学生持续地投入到了编程的实践中去。实践表明,这种模式值得编程初学者效仿。
我们的做法体现在每周的教学活动中。每个星期,我都会结合课程进度写出实践指导,在课前发给学生。这份实践指导中,主体是本周要实践的题目,还会加入不便于在课堂上展开,以及没有时间讲解的拓展知识与技能指导,指导学生完成课外自学。我要求学生将做完的作业,加上必要的注释,附上运行结果的图片,最好写上些心得,发表成博文。我对于学生学习状况的监控也就通过博客进行,而不再依赖于传统的作业本手段。每周的题目是超过了以往我在任课时布置作业量的2~3倍的,不过,有半数以上的学生能够将如此多的代码写完。看着能运行出正确结果的程序,可以想到他们付出了很多。学生能够有如此的表现,CSDN上开通的技术博客功不可没。
发博客交作业,帮助学生快速驶入利用网络学习的“正”道,通过记录成长历程,不断找到学习的成就感。当一名计算机类专业的学生刚刚开始IT专业学习,就进入到了CSDN这样的专业社区,了解最新进展、享受海量资源、接触专业人士、获得实践机会,也就给自己创造了一个全新、开放的展示空间,这种影响非常巨大。逐渐地,上论坛、看公开课,都是自然而然的了。会走正道,互联网将年轻人带“歪”的道路就会少走,甚至不走了。每周少则三篇,多则五六篇技术博文,让我的学生怀着我是一位博主的自豪感,经常惦记着往博客中发点文字,可能感觉还有些难度的编程学习就此坚持了下来,而且不少人一旦开写,一发不可收拾。积累一两个月,查看博文目录:原来我是如此能干,看见了点击量、积分、名次的变化,心里那个美,驱动着他继续积累。
发博客交作业,打开了我的学生与外界交流的窗口。目前的大班教学,使学生得到指导的机会变少,作为教师,有心投入,却经常力不从心。通过发博客,不少高年级的学生,甚至业内人士,在博客中为我的学生提供了直接指导。学生也关注老师、同学,以及博客中的各种牛人,主动到专业论坛中看贴、发贴,获得了和行业一线直接交互的机会。学生们自发组成了学习的小团队,互看互评博文,插浑打趣好不热闹。我也能够利用自己的任何一段空闲,随意地浏览学生的博文,针对作业中的问题指点一二,或者对其中流露出的各种情绪,或表扬,或安慰,拉近了师生的距离。
发博客交作业,让我的学生有了表达的平台,以此引发深入思考、塑造个人品牌、提高写作能力、创造成功机会。可以想象得到,当一名从大一就开始写技术博文,并将之坚持下来之后,博客将成为他展示风采的重要基地,塑造出来的,也将是一位全面发展的有竞争力的IT精英。只有参与,只有经历事情才会有体会,借助着参与专业社区,主动接触到行业中的各种话题,对行业中和一些现象有了自己的观点。通过文字的表达,写作能力与思考能力也会提高。每周能坚持发博文本身体现的也是一种品质。我在动员学生在程序中合理注释,正确缩格时是这样说的:“展示良好的职业风范,不要在世界面前丢脸!”他们做到了这点,这也是很重要的专业品质。可以想到当他们求职时,当讲出大学四年积累了N万行代码,博客为他见证时,会有多么的自豪。有时候我和学生笑谈:“就这样做下去,咱用不着求职,等着猎头来挖你吧。”
博客为我和学生营造了诚信、互信的空间。这是意外的收获。我对大学生抄袭作业的顽疾深恶痛绝,之前的教学中投入了大量的精力和感情与之斗争。大学生也知道其中的利害,但这样的一股“潮流”大有吞噬掉一切良知的威力。有这颗毒瘤在,老师的一切付出,学生的所有努力,都会成为泡影。我告诫学生不要在全世界面前丢人去抄作业,维护自己的荣誉;学生发表博文的表现不与平时成绩挂钩,解除了他们的顾虑;我会每周一次做一次记录并在课堂上展示,也给了他们适度的压力;我会更加注意没有调试通过的程序,及时给以评论,帮助他们打通瓶颈,这成了他们真实地发布半成品的动力;学生看到了老师帮助他们的努力,自觉地靠他自己和团队的力量解决问题,不给老师添麻烦,这是他们的愿望,也常令我感动;面对很容易得到的参考(先做完的同学发布的博文),他们学会了“抄之有道”。我的学生里,也有一部分由于各种原因真的无法足量完成我布置的任务,我们坦然地面对着这样的状况,在尽力的坚持中,争取捅破窗户纸的那一时刻的到来。因为真实,这样的希望一直都在。
我带着菜鸟学生在CSDN上发博文积累代码量的学习模式正在逐渐成熟,学生们大多每周能够认真地完成该做的学习任务,积分增加,排名提升,信心渐长,对专业产生了兴趣,有的已经有了其他的目标。尽管在学习中需要克服的困难依然很多,大多数的同学,已经学会利用互联网,解决自己在编程学习中遇到的各种问题,这足以保证以后的持续提高。在我和我的学生的共同努力下,用这种模式开展C++程序设计启蒙学习需要的资源,其核心内容已经初具规模,本着互联网中开放、共享的精神,我也发布到了我的博客中,全国各地有不少的大学生在利用这套方案安排自己起步学习编程的实践。
用博客记录下学习的过程,让代码的积累能够看得见,其实是每一个大学生都能做的事。在我的CSDN博客中,有几十名其他学校的学生好友,他们展示着学习成果,发表对学习的、生活和未来的感悟,还有个别的开通博客专栏,俨然已经是一副专家气派,很多大学生的表现出来独特的学习方法和学习能力令我惊讶。
关注专业核心能力的ACM竞赛
ACM的全称是ACM-ICPC(ACM International Collegiate Programming Contest,国际大学生程序设计竞赛),是国际大学生顶级的程序设计竞赛,是大学生智力与计算机解题能力的竞赛。这项已经有30余年的国际赛事近年来在国内普及的速度很快。不少学校建立起了在线评判平台(Online Judge,OJ),方便了竞赛的开展,同时也提供了非常便利的训练条件,成为编程学习中的最佳资源。国内著名的OJ系统包括了北京大学、浙江大学、同济大学、南开大学、杭州电子科技大学等。本着开放、共享的精神,这些资源对于学习者都是免费开放的,即使你所在的学校不具备条件,也完全可以“借用邻家的蛋,孵自家的鸡”。这又是互联网给我们带来的机会。
在OJ平台上刷题,其评判过程非常严格,在系统后台会对提交的程序进行严格的测试,有的题还会对运行的时间作出限制,体现了对编出的程序正确、快速的要求。ACM竞赛试题及平时的练习题目的核心在于算法设计,锻炼运用抽象思维的能力,对提高学生的编程能力有很大帮助,它要求学生具有纯熟的程序设计能力及扎实的数学基础,能够从更高的抽象层面解决问题。ACM竞赛属于智力与应用计算机解题能力的比赛,要求学生对从现实生活中抽象出来的竞赛题目进行抽象化和模型化,通过编程求解,最后经过严格的测试,这是一个完整的应用计算解决问题的过程。ACM竞赛题目常采用英文试题,OJ平台上也积累了相当多的英文题目,也为同学们在学习中使用英文提供了机会。
ACM竞赛采用3人一组的方式开展比赛,结果现场评判,在规定的时间内,做出题目多者为胜,做出题目数相同者,做题用时最少者为胜。还有一条规则是,多错误提交一次,罚时20分钟,这使得竞赛者要有十足的把握再去提交。亲历过竞赛现场的人都有体会,一边紧张地做题,同时能看到实时赛况的播报,还能看到代表成功提交题目的彩色气球在同场竞技的选手桌子上升起,ACM竞赛是培养在压力下编程,追求工作效率的项目。由于小组3人只能用1台电脑,处理问题的时间和资源都受限,3个人必须既能合理分工,又能密切合作,充分利用好各种有限的资源,最大程度地发挥小组的团队优势,才能把工作做到最优。有人将ACM竞赛视作为最能锻炼计算机编程的核心能力的专业竞赛,这一点儿不算过。
作为国际顶尖的赛事,ACM的门槛是如此之高,很多人心怀畏惧而不敢靠近。实际上,能够有机会参加国际赛事的只是凤毛麟角,参加洲际赛、各省比赛的机会也是少之又少。对大多数学习程序设计的学生而言,把接受ACM训练或通过OJ练习编程视作为提高个人能力,积累代码行数的一种方式就可以了。尤其在有些学校,在程序设计的教学中引入了OJ,老师们也建立了比较成熟的教学资源与教学体系,更是应当充分利用好这种便利与已经形成的氛围,培养专业兴趣、提高专业能力。
对于计算机类的学生而言,建议都应该拿出四年中的一段时间,接受以ACM竞赛训练为形式的编程能力训练,其间获得的编程能力的提高,将有助于塑造出未来从事技术工作的核心能力。如果参与训练后,能够有能力和机会参加一次某一级别的ACM程序设计竞赛,那更是非常值得珍惜的机会。有不少旨在普及的赛事为了降低难度,设置了单人赛的形式,有的采用中文试题,适合意在练兵的人参加。还有,不少学校利用他们建立的OJ平台,坚持每周或每月举办网上编程比赛,只要感兴趣,无论是哪个学校,哪个专业,都可以在线参加,这又是互联网时代的恩赐了。
两种方法的比较
我带着学生玩博客是在我校没有OJ系统的情况下开始的。直到借着华中科技大学的开源项目HUSTOJ建起了自己的OJ平台,我急忙让我那些发惯了博文的学生们体验了一下。出乎意料,他们更爱调试好程序以后发博文,而不是体会在OJ中AC(Accepted,题目的解答被OJ评判为正确,称为AC)的刺激。
对于这样的反差,不由得使我对这两种方案进行一番比较。
利用OJ系统是一种更易于推广的积累代码量的方式。由于OJ系统中的题目有统一的风格和格式,各个学校出的题目便于交流,积累下来的题目已经是数不胜数,学生做题目的可选余地很大,在练习中培养兴趣,增加信心。发博文的方法,在让学生积累代码量的方面本来不弱,但是题目的建设和积累却不充足。这样做的人还不多,所以在我的实践中,我每周出题的工作量很大。但是我相信随着积累,这个情况会好一些,也希望再成熟一些,我们的方法可以推广。这一方面,OJ胜出。
OJ系统能即时判分,方便了考核学生。这是老师使用OJ积极性最高的地方。有些学校施行完全的上机考试,以此给学生压力,必须要在动手能力上过关才算数,对保证程序设计的学习中,起了相当大的作用。实际上,对于程序设计而言,编出的程序对不对,运行程序即见分晓,发博文的方法将判断正误的工作交给学生的自觉。而对于初学者,对程序进行严格测试的能力还在养成之中,一定的宽容有利于保护他们的学习积极性,但纵容不严密的工作总归不好。OJ再胜出一筹。
尽管程序设计的学习中,编程方法第一,语言第二,但掌握语法规则,围绕某一语法进行专项训练还是必要的。OJ上的题目,重视解决问题方法,但针对某个语法有针对性地练习,需要依赖于对题目的合理分类,以及教师在教学中为学生提供选题指导。本来布置题目时,希望学生采用面向对象的方法完成,但学生用面向过程的方法完成,甚至用别的语言给出了正确的结果,都是AC。发博文交作业中,练习的内容也需要教师为学生把关,学生用什么样的手段完成,也需要人工控制。两者均不方便,打平。
用OJ给学生上机考试的压力,从而逼他们上机实践,形成的也是一种学习动力。我现在也对我的学生进行上机测验,OJ是个好帮手。但我不想让考试的压力常在他们的头脑中,一做题就想着考试,就想着压力,学习多么无趣。过分的外界刺激会异化学习动机,面对在高中将考试当作学习唯一目标的大一学生,抽掉他们脑袋中对考试的过分依赖,是我的追求的目标之一。重逼之下,学生们使出的应付手段岂是当老师的能掌控得了的,要么教师严加防范,要么学生铤而走险去抄袭,对双方都是伤害。把学生从考试中解放出来,追求考试成绩之外的成就感,这是大学教学应该追求的目标。这一点,发博文交作业胜出。
博客上提交的代码写上注释,用上语法着色,排版排得整整齐齐,截个图奉上运行结果,看着就舒心。OJ上代码一提交,冷冰冰地,好的来个AC,不好就WA、PE、CE1,不爽。至于写不写注释,代码风格如何,不管。
1 WA(Wrong Answer,指运行错误)、PE(Presentation Error,输出格式有误)、CE(Compile Error,编译错误)是OJ平台上提交程序结果的简写。
博客上交代码,完成任务中可以自由发挥,做一个银行系统,你的是张家银行,他的是李家财团,三次密码输不对,有人的提示是“你这个大笨蛋”,有人说“该吃补脑药了”,很热闹。OJ不好玩,算对了数字,只多输出一个空行,给出的结果不是WA就是PE。听老师的话设计的程序要用户界面友好,在用户输入前心怀好意提示一个“请输入一个整数:”,就为这,WA。
博客中的题目,我出题时敢发挥,围绕一个小问题,逐步考虑实际应用中的需求,题目越写越大,几乎快成了一个“项目”。设计一个复数类的运算符重载,加减乘除大于等于小于不等于输入输出取反所有的运算都让学生做一遍,复数加复数、复数加实数、实数加复数,光加减乘除就12个函数,这样的重复有助于学生体会应用的方法。类是实现了,测试程序还要根据需要自己写,这就是一个完整的工程。学生发完博文欣赏时才吓出了自己一身冷汗:300多行!用成员函数实现完了,再要求用友元函数来实现,又是几百行。给OJ出一个需要上百行的程序的应用题,找罪受。
发了博客,全世界看得见,涨积分,上排名,成果看得见。从“千里之外”升到20000名以内,那不是一般的自豪。走过路过的留个言,夸两句,拍个砖,过过瘾,交流的途径畅通着。在OJ上,别人的代码不让看,62% WA,20% AC,那个饼图也没有提供更多信息。封闭在这个空间里,AC过后自己也再不看,或许老师看,也就看个统计数字罢了。
通过博客,大学生可以找到更多的资源,新闻、下载链接引出一大片,大牛、大腕、菜鸟,写代码的、搞运维的、跑市场的,行业中的众生态,一应俱全。OJ里的,只是一帮学着写程序的人。
也许是我带着学生发博客已经两年,而玩OJ时间不多,还没有发掘出这个新朋友更多优点的原因。OJ用习惯后,应该也能找到更多的值得迷恋的地方。用博客营造自己可以投入的编程氛围,打开展示、交往的空间,其优势是非常明显的。不过,玩OJ靠的是技术和机制,而玩博客靠的是线上、线下的“人治”,玩好了不容易,尤其是在教学中玩,所以玩的人少。我倒希望有更多的人能够参与进来,这样可以营造一种更具人情味的玩法,去完成编程的实践。
OJ对程序苛刻些,练习者需要更加讲究算法的好坏,需要对于程序进行充分的测试。这样的“刁难”这不是坏事。为此,要提倡的是两种方法各取所长,全面进步。未来的程序员要能像在玩博客中那样疯起来,也要能像在使OJ时那样静下来;能抓狂到程序里随处加入个性的创意,也要能一板一眼不带马虎地严格按要求工作;要能一口气几百行大规模作战,也能用几小时就那两三行精打细算。
在我的构思中,刚学编程上博客,更多交流,更多张狂,到合适的时候,体验OJ,用OJ提升品质。这黑猫白猫都是抓得了老鼠的好猫,在合适的时候,发挥两者各自的优势,能有效帮助学生积累代码行数,那就是我们的追求。玩博客得到的本领足以保证下得了“厨房”,熟悉了OJ玩转了ACM,那才是上得了“厅堂”。我们的追求,既能上“厅堂”,也能下“厨房”。
有一天,我发现一名弟子OJ上AC了,立刻将之发表成了博文。我给他竖起了大拇指。