`
izuoyan
  • 浏览: 8937009 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

今天我们怎样学软件技术,怎样教软件课程?

阅读更多
今天我们怎样学软件技术,怎样教软件课程?
==================
注:
本文是我这几年以来针对软件技术学习与教学方式所思索问题的一个阶段性总结,写出来与朋友们交流。
金旭亮
2008-5-9
===============================
自从人类社会进入信息时代,知识总量急剧膨胀,软件技术更是进入了一个快速增长的新阶段,新的理论不断提出,新的技术不断出现,让软件从业者无不感到巨大的竞争压力。就拿微软技术而言,老的Win 32还没弄明白,2002年就蹦出了个.NET,桌面开发刚熟悉了Windows Form,2007年又变成了WPF,Web开发更是变化巨大,先是老的ASP退出江湖,ASP.NET取而代之,没多久又加上了AJAX,晃一晃眼Silverlight又在那儿向你招手……,从2002年发布.NET 1.0开始,5年左右的时间,.NET版本就从1.0一路蹦到3.5,原有的许多技术或被淘汰或被更新,短短几年时间,微软技术的各个领域几乎全都洗了一轮牌。许多人都感叹,老的东西还未掌握,新的东西又出来了!然而,“人在江湖,身不由已”,既要在IT业里混,就得认命。面对着这一切的挑战,该怎么办?
也许经验丰富的你会坚持“以不变应万变”的原则,结果却可能发现自己成了一只迟钝的鸵鸟,知识老化,面临着后辈强劲的冲击。
也许你不断地追踪最新技术的进展,但却疲于奔命,最终发现自己不过是一株“技术风暴”中的墙头草,永远跟在别人屁股后头跑,根本就看不到超越的希望。
我是一名IT教育工作者,有过十多年的软件技术自学经历,也有五年多的从教生涯,承担着向青年学生讲授现代软件开发技术的职责,这么些年来,我在高校中先后讲授过“Java/C++程序设计”、“面向对象分析与设计”、“.NET技术基础”几门与软件开发技术密切相关的课程,接触到了许多学生。由于工作的缘故,我一直在琢磨着这样两个问题:软件技术应该怎样学,又应该怎样教?
学习是我的骨头!
著名作家王蒙[1]在其自述——《我的人生哲学》一书中说:“我是学生,学习是我的骨头,是人生的‘第一智慧’与‘第一本源’,思想美丽,学习着也是美丽的”。在王蒙先生看来,人生就是一个不断学习与成长的过程,在这个漫长的过程中,人应该通过不断的学习而完善自身,获得智慧。这应该是学习的本来面目与最终目的。
如果能从这个角度来看待学习,学习就不是一个负担了。然而,现实中我们大都是为了“谋生”而学习,说穿了,软件技术不过是实现个人攫取“名”和“利”的一种手段罢了,我怀疑,有多少人真能达到王蒙先生的那种境界?
当前浮燥之风弥漫社会,诺大的中国,很难有人能静下心来钻研技术和做点研究。我漫步于大学校园,曾见过“XXXXX让你10天成为.NET 程序员!”的大横幅在风中飘扬,我不禁苦笑,如果10天就能培养出一名.NET程序员,那象我这样愚笨之人,居然学了那么多年还无所成,岂不应该赶快找块豆腐一头撞死?
因急功近利而想速成,是软件技术学习的大敌。
务于精熟与观其大略
南宋人郑樵所著之《诸葛亮传》说:“初,亮在荆州,与元直及汝南孟公威、颖川石广元游学,三人务于精熟,而亮独观其大略。”
请注意诸葛亮与元直等三人的学习方法的重大差别。元直等“务于精熟”的学习方法,其实正是当前我国高校中所占据绝对主导地位的思想,在这种主导思想下,许多课程的教学安排是讲授得细之又细,比如计算机系所学之高等数学一般要讲两个学期,而象北大所编之本科生教材《离散数学教程》,更是按照3个学期共220学时设计的。我怀疑这种门门课都深挖细掘的教学方式,在现在这个知识爆炸的时代,是不是也应该有所调整?要知道,一个学生在学校里使用的学习方法,将会不自觉地跟随着他很多年,而这种学习习惯,恐怕难以应对软件技术的现实,问一下:你现在有多少的时间和精力对各种技术(哪怕是很重要的主流技术)进行“深挖细掘”?
是否在软件技术的学习上和教学上都有所调整,走一走“观其大略”的路子?
IT作者,请把厚书写薄!
既要学习,就要选择好书。请到书店看看,有关软件开发的书往往占据科技书店的半壁江山。国内计算机图书市场前几年是泥沙俱下,读者在网上怨声载道。这几年好些了,各大出版社或影印或翻译或原创,都出版了许多有一定质量的书籍,但我感觉好书仍然不多。
现在不少的技术书籍,一本比一本厚,装帧越来越精美,相应地价格也涨船高,但其中的“干货”却很少。如果给书籍减减肥,不仅节约读者金钱,更节约了读者宝贵的时间和精力。
我看过不少的书籍,其实要讲的东西就那么多,浓缩一下,许多篇幅可以压缩三分之二还多。不要将书籍变成满是图片的“操作手册”,或整页都是代码的程序清单。
我个人感觉,一本真正有价值的技术书籍,要不能引发读者深入的思索,要不就能帮助读者形成对某个软件技术领域的全局观,在此全局观下去学习具体的编程技术,就能事半而功倍。
著名数学家华罗庚先生曾有言:学习数学要先把书读厚,再把书读薄。移到软件技术书籍这一领域,我觉得把书写厚很容易,而要把厚书写薄很难。
期望能看到有质量的“薄书”来帮助我们高效地学习软件技术!
互联网带来的“见木不见林”学习困境
软件技术是个庞大的体系,任何一个软件学习者都很容易陷入“见木不见林”的困境,而互联网如果应用不当,会加剧陷入这种困境的可能性。
许多人非常推崇搜索引擎对学习的重要性,有问题“谷歌”、“百度”一下,一切就有答案了。因此,现在有不少软件工程师(尤其是初学者)高度依赖于互联网来帮助解决软件开发中遇到的实际问题,这种方式的确非常有效,值得大力推崇,但要知道,“万应灵丹”也有不灵的时候,有不少困难的问题,在互联网上根本就找不到有效的解决方案。
另外,通过互联网学习软件技术有其难以克服的弊端,可以简单分析一下:
第一:通过互联网得到的知识往往正确与错误并存,这就要求具备较强的鉴别与判断能力的,不是每个人都天然地具备这种素质的。
第二:通过互联网得到的知识往往是是零散的,而且信息量过于庞大,要由这些碎片“拼”出某个技术领域完整的知识框架,在许多情况下非常困难。
我感觉,对软件技术的学习,应该是先有一个某个技术领域的全局观,然后再去深入钻研某个技术子领域,即“先见林后见木”。而要想形成全局观,阅读经典的技术书籍与综述文章,听相关领域专家的访谈或其讲授的各种课程,以及参加各种技术讲座,是一个有效的方法。在形成对技术的全局观上,通过互联网搜索来的鱼龙混杂的知识有可能是帮了倒忙。
因此,软件技术学习者要对互联网有正确的认识,才能尽其利而避其弊。
理性知识感性掌握
前面说到学习软件技术要“先见林后见木”,要想“见林”,必须高度注重计算机科学理论的学习。因为理论往往是现实的概括,是认识的深化,是“见林”重要手段,在理论的指导下学习技术和进行实践,往往“事半而功倍”。
然而,计算机科学有许多理论是比较抽象难懂的,怎么学习它是一个值得深入探讨的问题。有这么一种观点很流行:
不要以为在大学里学习的许多抽象复杂的理论课没有用,要好好地认真学习,别去问它们有什么用,等你们工作以后,就会慢慢地体会到这些知识的作用了。
几乎每个老师都这么说,学生对此也不敢有任何的怀疑,难道这有什么错吗?
然而,我却渐渐地怀疑起这个观点来。因为如果不明了某个计算机科学理论的实际背景,有可能把握住它的精髓吗?我看不可能,而且这种观点有些情况下还成了教师在教学上不负责任的“挡箭牌”。据我所知,在当前教育方式下,计算机专业学生一个学期往往要学它七八门专业课,其中还有五六门是闭卷考试,根本就没有足够的时间去消化与吸收知识,煮成夹生饭是正常,煮熟了才是怪事。
但我并不是反对认真学习软件科学理论,而只是强调软件科学理论的教学与学习方式应有所转变,要遵循“理性知识感性掌握”的基本原则。
为什么会这么说?
因为抽象的理性的知识要转化为具体的感性的形式后才能为人所掌握
这个不是什么新观点。就拿公认为抽象难学的数学来说,多位杰出的数学家就说过:只有把抽象的数学定理形象化,才算是真懂。当代数学家徐利治[2]曾多次撰文强调中国数学教育要改革,要培养学生的数学直觉,要给学生讲授数学史,要锻炼右脑的形象思维,要教会学生运用科学归纳法而不是只讲授演绎法,能从特殊例子中发现一般性的东西……。
这些观点对于我们学习也比较抽象的软件理论非常有帮助和启发。比如不动手做一个小的编译器出来,就很难对相关编译理论有深入的理解。又如在项目中需要为某个实际问题建立模型,设计算法并评估解决方案时,才可能会体会到算法理论的作用。
在归纳的基础上演绎,在感性的基础上抽象,是行之有效的学习方法。
脱离理论的历史渊源与现实背景去学习理论,以考试为目的对理论死记硬背和生搬硬套,不可能真正掌握理论。
现有软件教学方式的改革
基于对软件技术学习与教学相关问题的思索,我自己进行了一些实践。从2003年开始,在北京理工大学为本科生开设了“.NET软件技术基础”通识选修课(面向全校各专业的学生),我在教学中渗透了以下的原则:
(1)兴趣是学习的第一动力。我自行设计和收集了可现场演示的大量软件实例(比如将数学与软件技术结合起来创建出绚美的计算机图形),向学生展示“现代软件技术能做这么多有趣的事情”,以此来激发他们对软件开发的兴趣。
(2)理性知识感性掌握。通过现场设计并完成一个小的软件实例(比如设计一个小程序自动生成数学练习题,给小学生练习四则运算),向学生形象地展示出软件开发的典型过程,从而帮助他们直观地理解软件工程理论。我觉得课堂讲授的重点是帮助学生形成对某个技术领域的感性认识,并指出如何在感性认识的基础上形成技术全局观和上升为理性知识的途径,而将理性认识的形成留给学生自己去完成,不需要在课堂上详细讲授示例中的每个技术细节与编程技巧。
(3)先见林后见木。比如在介绍ADO.NET时,先根据自己的理解将其整个技术的“骨架”抽取出来,点出其中的关键点,然后再分析具体的实例。我觉得一名软件技术教师应该是一名导游,带着学生在“软件王国”里“旅游”,告诉他们这儿有什么风景,那个又有什么景观,整个“技术森林”是什么样的,大致分为哪几大块区域,每一块森林子区域中又有哪几种具体的“技术之树”,要先用“望远镜”去了解“技术森林”的全貌,然后再用“放大镜”去研究具体的“技术之树”……。
(4)技术学习与社会现实相结合。《.NET软件技术基础》共32学时,讲10次课,每次课我都带领学生到某个 “.NET技术景点”去“旅游”,展示其技术发展的趋势和脉络,而最后一次课更是抛开具体的技术专讲“故事”——介绍IT业的风云变幻,以开拓学生的视野。
我这门课几乎每学期都能挖掘出几名好学生,而且成功激发了有些学生原先潜在着的对软件开发的兴趣,执续努力两到三年自学软件技术,在本科毕业时跨专业直接报考计算机专业研究生,或者在毕业时进入IT行业的知名企业。
在每学期针对每门课程进行的学生评教中,我这门课得分从未低过85,而在最近一次2007~2008学年第二学期的学生评教中,这门课程更得到了96.9的平均分,为我从教5年以来的最高分。
从教学实践上看,“观其大略”的“见木又见林”,而以“见林”为主的教学原则是有一定效果的。我相信这对于软件技术的自学者也有一定的借鉴意义。
软件技术学习与教育进入个性化时代
互联网的普及给传统的软件学习与教育方式以巨大的冲击,我个人感觉基于互联网的在线教育可能是整个变革的突破口。软件技术学习与教育将进入一个个性化的新时代。
可以看看当前互联网软件技术学习与教育的一些现状:
现在有多家IT培训机构在网上招生,诸如网易等各大网站也纷纷提供在线教育的功能。拿微软公司为例,在MSDN上介绍其最新技术的Web Cast拥有很高的下载量。互联网上还可以搜索到许多集声音、动画和视频为一体的教学课件(比如众多的Flash格式的电脑教程),其下载量惊人,甚至于许多传统的软件技术书籍,现在也要在配书光盘中附上相关的视频教学内容。这一切都说明人们通过互联网以多媒体的方式来学习新知识已成为一种现实。
虽然现在基于互联网的在线教育有了很大的发展,但我个人认为整个还处于初期发展阶段,比如现有Flash形式提供的课件虽然很好,但仍是人与机器间的“单向沟通”,无法实现学习者间的相互交流。这可以类比于早期的单机版电脑游戏,虽然单机版电脑游戏精品很多,但最终还是由玩家可以互动与交流的网络游戏主导了电脑游戏产业。
另一方面,网上在线教育与传统的教育模式相比有着自己的独特的优点和缺点,“老革命遇见了新问题”,传统的教育理论与方法必须要有新的突破和思路。
计算机技术的飞速进步和IT行业竞争的空前激烈,使得不断学习与提高自己的能力和素质成为每一个IT人的迫切需求,这其中隐藏着巨大的机遇。
我很关注着网络教育的发展,从去年下半年开始,我与CSDN合作共同在ITCAST教育平台(http://www.itcast.net)上进行网络在线教育实践,试图搭建一个基于互联网的虚拟学习社区,通过一系列的循序渐进的系列课程,帮助学员掌握.NET软件开发技术,降低其学习成本,提高其学习效率。第一个.NET入门教学系列于去年底上线以后,先后举办了几期试验班,出乎意料之外的是,学员90%以上是在职IT从业人员而非在校学生,这也从一个侧面说明了 “终身学习”时代的确已经开始。从实验班得到的数据上看,如果课程设计合理,在线学习的学员由于目的明确,主动性强,对知识与技能的掌握程度并不比传统的面对面授课低多少。而且线上教育成本低廉,方式灵活,学员在学习时间和学习内容上可以各取所需,拥有很大的自主权,则是传统教育方式所无法比拟的。另一方面,从教学组织方式上看,线上教育可以随时跟进知识和技术的最新进展,并且可以通过互联网为学习者搭建一个跨越地区界限的平等的学习交流平台,具有独特的优势。
我认为在线教育是一个方兴未艾的新的教育领域,其发展前景广阔。基于互联网在线教育的发展,对于打破我国现有教育资源分配的垄断与不平衡状态,提升全民族的教育水平有着巨大的推动。一流强国必有一流的教育,而一流的教育将培养出大批高素质的国民,这对我国发展成为文明和民主的现代化国家起着决定性的作用,百年大计,教育为本!


[1] 王蒙,现代著名作家,主要著作有《青春万岁》、《活动变人形》等,1958年的“右派”,1963年被“发配”新疆逾16年,人生境遇坎坷,1986至1989年任文化部长,著作等身。
[2] 徐利治,当代数学家,西南联大毕业,师从华罗庚等数学大师,其重要成果有“徐氏逼近”、“徐氏渐近公式”,“Gould-Hsu反演公式”等。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics