首页 > 范文大全 > 正文

基于逆向的系统观培养探讨

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于逆向的系统观培养探讨范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:在计算机技术飞速发展而工程教育水平亟待提高的背景下,培养学生可持续发展的工程技术核心竞争力成为一个重要课题。本文首先提出了以系统观为关键核心竞争力的培养理念,然后给出了两种不同培养方式――正向构建式和逆向析构式,最后提出系统观原核,并以此为基础给出了基于逆向的培养方法相关内容与经验。相对于构建系统级软件,该方法是轻量级的,对一般院校实施具有可操作性。 关键词:系统观;正向构建式;逆向析构式;疑证思维;系统观原核;实证式教学

计算机领域技术发展极为迅速,给工程能力培养提出了严峻挑战。我们一方面面临不断开设新课程的压力,另一方面却长期承受来自业界的批评。企业实训不能解决根本问题,这根源于企业的生产特性本质上使其难以提供有深度、综合性、可持续、系统化的训练,且更难大规模实施。以电子科技大学为例,一个年级的学生有四五百人,这是任何一个真正的生产型企业都难以承受的。多个企业分担却难以保证培养的一致性。而培训型机构并不能提供真正的生产环境。事实上,对员工有较高自主能力要求的企业并不愿意接受培训式提供的学员[1]。

本文就这一问题提出了系统观培养核心竞争力的解决思路,并分析了两种培养方式,特别就逆向析构式方式进行了探讨,最后给出了其实践过程中的相关经验。 一、计算机系统观是可持续发展核心竞争力

面对不断变化的软件技术,似乎只有不断追新才能跟得上。而每种技术又必须通过撰写大量代码来了解、熟悉和掌握,可这又消耗了学生已经有限的学习时间。以电子科技大学为例,其计算机科学与技术专业2年级基本一学期接近十门课程,3年级一学期有十几门课程。如一门软件课程需要撰写3000~4000行代码,时间压力可想而知。

笔者认为相对追新面临的压力,培养核心竞争力才是治本之道。笔者曾给出例子,一些长期只从事系统级软件开发的“老”程序员却在新软件技术掌握的速度和深度上远超越那些精力投入追新的“年轻”程序员[1]。其根源就是系统能力,笔者称其为“系统观”[2]。

越来越多的研究者认识到系统能力的重要性,并进行了深入研究和系统性教学建设,如北京航空航天大学、浙江大学、清华大学、东南大学、国防科技大学等[3]。最近,东南大学的同仁也指出了“系统观”培养的重要性,他们从计算机制造者、系统程序员、应用程序员和系统管理员的角度分析了“系统观”的价值[4]。

系统观的内涵笔者尚未见非常正式的定义,有文献称其为“对计算机的深刻理解”[4]。下面笔者尝试从另外一个角度给出系统观的定义并分析为什么它是学生工程能力提升的可持续发展核心引擎。

笔者认为:计算机系统观是计算机核心知识架构和对它们不断运用所形成的思维方式的复合体,不可割裂。单纯的通用思维训练和仅仅摄取知识信息均无法形成系统观。它是能自我生长,自我完善和成长的原核。在摄取新技术和面临黑箱时,它具有极强的剖析、探索和学习能力。这赋予了高端计算机人才最重要的素质。

核心知识架构涵盖计算机领域最本质部分的规律,笔者认为应包括:计算机组成原理、系统结构、操作系统、编译和链接、算法、数据库原理和实现。

为什么系统观在学习技术和解决难题方面具有“以少胜多”和“一劳长逸”的特点呢?下面笔者试从系统观的三个功能分析。

(1)类比。因为系统观包含了核心知识架构,其涵盖的计算机领域本质规律在所有计算机应用领域均可借鉴和举一反三。应用领域的技术多是在老技术上不断包装、组合和抽象。一位云计算公司的CTO告诉笔者,他要解决存储或并发的问题时,习惯找20世纪六七十年代最早的算法文章(因为它将根本性问题描述得非常清楚),在此基础上就很容易适配到现在的问题中。笔者一位朋友很多年前做汉化DOS,后来他第一次做单片机破解,只花了一个月就将其破解并汉化。他明确指出DOS汉化经验起了很大帮助。笔者第一次面对Linux驱动的C语言编程问题时,运用面向对象的经验,花数分钟即解决了学生因回调语义错误引起的bug。因为基于接口编程思想在整个软件甚至硬件领域都是一致的,在面向对象是虚函数,在内核是回调函数。这三个例子均运用系统观中存在的基本模式和知识去类比解决第一次面临的难题,体现了系统观“少即多、旧即新、基础即先进、不变应万变”的特点。

(2)构建。系统观思维具有构建式的特点。形象地说就是“我来做怎么做”这样的思维方式,在学习新系统或技术时能首先从构建的角度分析,从而对关键点产生疑问。带着疑问学习,效率就高。笔者一次寻找hibernate操控同结构多数据库的方案时,从构建角度分析如果自己做怎么做出扩展性,假想出了可能的扩展点,然后带着这些假设用调试去检验,虽第一次接触hibernate,用了半天就解决了。笔者曾用“我来做怎么做”的思维模式训练研究生,有学生反映这是其研究生期间学到的最有价值的东西。

(3)简化。面临复杂未知时,同时面临太多未知点,人们必然无所适从,难以下手。如果能迅速化繁为简,主动“忽略”过滤掉暂时无关大局的细节,那么就能寻找到症结,从而快速击破解决难题。系统观的底层特点使其具有底层视角,再加上其反复淬炼出解析能力,使其能够完成这一简化和忽略的任务。能体现简化和忽略特性的最直接例子即逆向工程。面对高级语言源代码往往人们要找到下手点都无所适从,何况面对的是反汇编代码?要完成任务必须快速找到关键点,一击而破。在高层应用领域分析理解面向对象框架也是如此,往往从关键的虚函数入手,通过调试找到其调用关系,并最终找到可能的装配逻辑。

综上所述,因系统观涵盖计算机本质规律的掌握和运用,并具有类比、构建和简化功能,所以有很强的自我学习、扩展、探索和长效性特点。这使得学生培养了系统观后,可在其职业生涯中一直发挥核心竞争力的作用。而其覆盖本质规律的简约性,又使得其培养开销相对经济,性价比高。下图给出了系统观的概念结构。

计算机系统观概念结构图 二、如何培养计算机系统观

依据系统观的功能特性可形成两种系统观培养方法:(1)对应其构建和类比功能特性是正向构建式方法;(2)对应其简化分析特性是逆向析构式方法。

(1)正向构建式方法。该方法的核心就是“构建”,并非构建简单的应用软件,而是构建系统级软件。即撰写操作系统、编译器、链接器和数据库(非数据库应用软件)。北京航空航天大学、清华大学、浙江大学均采用该方法。以清华大学为例,他们从MIPS指令设计开始,利用FPGA自制CPU,并在该CPU上实现操作系统、编译器。该方案最大优势是自底向上完全打通软硬件,形成最完整和坚实的系统观。其限制在于时间和个体能力。即使在“985工程”高校中,也只能是优秀学生才能完成。寻找阶梯化方法普适到一般学生应该是这一方案最终成功的关键。马里兰大学操作系统的模块化做法可以借鉴[5],但也有其问题。

该方案的变种是:CPU并不做到可实现操作系统的程度,相对简单可行,而利用x86实现操作系统。其好处是难度低、耗时少,且所形成的知识集合和将来面临的工作更贴近,能利用的资源也多。电子科技大学的构建式培养系统观采用的是该方案。

(2)逆向析构式方法。该方法最大的特点是将逆向工程的剖析的特点融入整个培养中。卡耐基・梅隆大学的教材《深入理解计算机系统》的前三章是这一方法的最典型代表[6]。即从反汇编的角度,建立高层语言和底层汇编、机器码与机器的映射。复旦大学在2003年引入这门课,但因其涵盖的内容太广泛,其实施难度依然很大。东南大学正在组织力量就“计算机系统基础”这门课程撰写更加适中的教材[4]。

笔者在2012年出版的教材《老“码”识途》实施了不同理念[2]。往下采用机器码开始析构,到C语言反汇编、C++反汇编、对象模型、链接、面向对象设计、框架。整个用逆向反汇编分析为贯穿始终的线索,覆盖了从操作系统、编译链接、面向对象设计等领域,并采用实证式教学理念[7],以每个知识点可“玩”为驱动,形成了轻量级、易学以致用的系统观培养模式。

相对于构建式,逆向析构式虽无构建式全面和系统,但通过逆向贯穿、衔接,也自底向上形成了一套实用可行的培养方法。其知识点相对较小,不会像撰写系统一样需花费很长且整块的时间。学生便于安排和实践。其知识点的前后依赖性没有撰写整个系统那样强耦合,利于模块化学习。 三、基于逆向析构式的轻量级培养

1.系统观原核

教学内容方面,笔者虽采用自底向上方式,但未涵盖程序员所有视角,这与文献[6]不同。一方面因为文献[6]的内容对多数学生依然是重量级,难以有效实施;另一方面因为笔者发现只要建立一个很小的“系统观原核”,它就能帮助学生不断摄取新知识,自动完善系统观。原核至少由计算机形象思维与疑证思维组成。

(1)计算机形象思维。有句话生动地描述其重要性:“真正的黑客(原始意义上技术的狂热探索者),在他脑袋里每一个字节是怎么流动的他都清楚”。另外,以下现象也反应了形象思维的重要性:描述算法时我们喜欢用图,在描述程序结构时用UML图,数据库用E-R图,描述设计意图采用形象的设计模式名称来暗喻。

形象思维需要直观,计算机形象思维需要计算机领域的直观感建立。在计算机领域分层是一个显著特征,越高层的特征越抽象,比如面向对象就比结构化抽象。既然要建立直观,那么就应该尽量减少抽象,所以将目标定在了软件和硬件结合部位。笔者选取了程序员视角,从高级语言到汇编映射开始,并逐渐将这种映射(逆向反汇编)贯穿软件开发的几个典型部分。从C映射到汇编,从汇编映射到机器码,并让学生用机器码构建程序。从此开始,该方式将在不同阶段重复,最终建立起最形象的程序世界观。

笔者选取软件开发的典型相关部分包括:C语言到汇编映射,C++对象模型和映射,面向对象编程的底层机制支撑,动态链接和静态链接的底层机制,框架构建和底层机制的运用,线程运用中的底层机制。它们辐射到多门系统级课,如:操作系统、编译链接、计算机组成原理等。

(2)疑证思维。整个教学阶段,每一个知识点的获取几乎都遵循猜测和实证的方式。让学生自己猜测可能的答案,然后自主设计实验验证。不追求知识的系统性,在意的是所有知识点均能实证,可以“玩”。笔者称其为实证式教学[7]。该方式建立了系统观自我完善的思维引擎。

为了激发学生兴趣,体现底层和系统思维的运用价值,逆向反汇编底调试不仅有专门的案例展示实际意义,它更完全渗透到每一部分的教学内容。

笔者发现认真锤炼C语言到汇编映射后,不少学生可较好自学面向对象部分。对比发现,上过与未上该课的学生,在未涉足领域研学表现出很大差异。未上该课的优秀学生,在老师帮助下也无法完成用户级线程库;上过该课的学生却能较轻松完成。这说明系统观原核可自完善与发展。

2.教学经验

(1)实证式教学。在实验室上课,实验和课程融合。可插入即兴实验。课堂实验需有补充题目,完成简单实验可做补充题目。引导学生自主设计实验验证知识点。一个班人数控制在30~50之间,否则效果难以保证。

(2)考核机制。完全以实践为导向,平时占主要部分,期末考试为上机考试。如果不能保证平时环节的质量,结果难以保证。笔者采用了以下方法:对逆向分析类型题目要抽问。如组队,成绩按排名越后越低,抽问靠后者,如果答不上,小组分数受罚。对程序题,先布置课后作业,指出之后课堂考试从其中变化,允许考试携带作业。另外考试时尽量采用自动批改,为此,也开发了逆向底层作业自动生成和批改系统。题目必须分级,不能只有开放性的大题目,小题目很重要。考核大题目,而小题目作为自我练习不计分。

(3)效果。大量同学反映对本来枯燥的课程非常有兴趣,笔者曾经在课程半期后不点名到课率达90%以上。有意思的是,从没有人问学了何用。许多学生反馈对他们帮助很大,其中一个学生说法反映了系统观的价值:“以前出了问题就找高人,现在敢坐下来自己做,且真的解决了。”

综上所述,基于逆向析构式系统培养方法,选取了轻量级的原核建立方式,配合实证式教学和合理的考核方式,取得了较好的效果,能够在更多学生中推广。

参考文献:

[1] 韩宏,周世杰. 计算机工程能力教育的思考[J]. 实验科学与技术,2011(5).

[2] 韩宏,李林. 老“码”识途――从机器码到框架的系统观逆向修炼之路[M]. 北京:电子工业出版社,2012.

[3] 王志英,周兴社,袁春风等. 计算机专业学生系统能力培养和系统课程体系设置研究[J]. 计算机教育,2013(9).

[4] 袁春风,王帅. 大学计算机专业教育应重视“系统观”培养[J]. 中国大学教学,2013(12).

[5] 黄廷辉. 计算机操作系统实践教程[M]. 北京:清华大学出版社,2007.

[6] 布赖恩特等. 深入理解计算机系统[M]. 北京:中国电力出版社,2004.

[7] 韩宏. 一种面向计算机教育的实证式教学[J]. 实验科学与技术,2013(6).

(上接第31页)师生59名赴德国、瑞典进行了为期两周的境外专业拓展与实践研修,开拓了学生国际视野,加深了学生对工程师素养的认识与理解。 五、结束语

通过三年来的试点改革,“卓越计划”试点班的各项教学管理工作顺利推进,学生学习风气良好,在学科竞赛、开放实验、大学生科技创新等方面逐步表现出理论基础扎实,工程实践能力突出的特点。在下一步的工作中,学校将继续完善管理机制,为“卓越计划”试点的顺利实施提供人员、场地、经费和政策保障;逐步开展工程教育专业认证工作,并进一步推进卓越试点专业国际化,提升卓越工程人才培养的质量与水平。学校还将及时总结试点专业成功经验,积极稳妥推进和带动学校其他工科专业开展卓越试点工作,扩大工程教育改革受益面。

[资助项目:北京市哲学社会科学规划重点项目“面向卓越工程人才培养的首都高校管理协同创新机制研究”(13JYA001);北京高等教育教学改革联合项目“首都地方院校实施卓越工程师教育培养计划的研究与实践”(2013-lh20)]