软件工程与学习工程吴明晖1,2,杨珂21浙江大学城市学院计算机系,浙江杭州,3100152浙江大学计算机学院,浙江杭州,310027摘要本文比较论证了软件工程与学习工程在系统背景、生命周期、思路方法三方面的相似性,为两种工程相互借鉴发展提供了新思路。通过考察软件工程和学习工程的诞生背景,从历时态角度比较了两者的相似性。通过平行列举软件周期和学习周期各对应阶段,介绍了两个系统同时态的相似性。通过列举学习中各种思路方法所对应的软件开发方法,得出软件方法可以向学习方法持续借鉴的结论。关键词软件工程、学习工程、方法论、类比SoftwareEngineeringandStudyEngineeringMinghuiWu1,2,KeYang21Dept.ComputerSci.&Tech.,CityCollege,ZhejiangUniv.,3100152CollegeofComputerSci.&Tech.,ZhejiangUniv.,310027AbstractThispaperprovidesananalogybetweensoftwareengineeringandstudyengineeringinthreesystematicalaspects:background,lifecycleandtechniques.Historicalbackgroundsofthetwosystemsareanalogizedandrelated.Eachphaseofthetwolifecyclesisexaminedinapairtoshowtheirsimilarities.Severalmethodologiesandstrategiesineachsystemareanalogizedtoshowthepossibilityoffurtheringsoftwareengineeringbyreferencingstudymethods.Keywordssoftwareengineering,studyengineering,methodology,analogy引言学习知识的过程作为一个工程,可被称为学习工程。本文以大学学习为学习工程的例子,对比了软件工程与学习工程的历史背景、生命周期和思路方法,论证了通过类比两个相似系统来发现新方法的有效性。第一节考察软件工程和学习工程两系统的历史背景和基本原则,论证两系统的历时态相似性。第二节平行描述软件开发周期和学习周期,论证了两周期各对应阶段的同时态相似性。第三节描述学习中的多种思路方法,列举软件工程的对应策略,为两系统相互借鉴得到新方法提供了思路。1.历时态比较1.1诞生背景1960年代后期,由于个人程序员的生产力不再能适应大型软件的生产关系,软件系统的复杂性与软件作者个人认知系统的有限性之间的矛盾激化,军用和商用的软件露出危机的端倪。教训总结为[2]:1,项目没有被很好地理解;2,计划不周,最终导致进度拖延;3,没有充分的文档,影响开发,并使交流、维护困难;4,软件可靠性缺少度量的标准,质量无法保证;5,软件难以维护,不易升级;知识的学习过程中,以大学生为例,封闭式个人学习不再能适应知识爆炸时代的要求,造成知识领域的复杂性与学习者认知系统的有限性之间的矛盾激化,诞生学习危机。问题在于:1,关于“大学的任务”没有很好地理解;2,学习计划不周,最终导致进度拖延;3,听课没有记好笔记,影响理解,并使复习困难;4,课后作业未能按时独立完成,学习效果的可靠性缺少度量的标准,无法测试对知识的实用能力,不了解知识缺失在哪里;5,难以将书本知识用到工作中去。1.2基本原理“软件工程[1]”这一术语于1968年在联邦德国正式使用,同时提出运用工程学的基本原理和方法来组织和实施软件生产。B.W.Boehm[2]在1983年提出确保软件质量和效率的7条最小原理集合:分阶段管理;阶段评审;基线配置;先进的程序设计技术;结果应能清楚地审查;开发人员少而精;承认不断改进软件工程实践的必要性。以一门大学课程的学习为例来类比这些原则,Boehm的7条原理的含义是:分阶段安排学习;要有单元测验或自测;要持之以恒;要用最先进的学习工具(如电脑和网络);学习效果应能清楚地让老师和自己审查;学习小组应小而精(如导师不能招收过多研究生);承认不断改进学习方法的必要性。1.3联系与区别软件科学家们经过不断实践得出的结论是:按工程化的原则和方法组织软件开发工作是有效的,也是摆脱软件危机的一个主要出路。在知识学习方面,国家也采取了工程化的方式,将科学家个人创新限制在团队科研的空间里。工程是物理世界与人类内心体验的桥梁,是自然科学和人文科学的中介,是客观与主观的翻译者。软件工程起于认知活动,终于比特流,它本质是工程,却与传统工程有很大不同,它不是纯粹精神活动,却接近精神活动。一方面,与造船、采矿等传统工程相比,软件工程在表达上极端抽象,在操作上极度准确,其原材料和产品均为电磁波,原子级别、无处不在、无价格、无物理熵变,接近于非物质。它所需要的工具不是起重机这样物理变化的工具,而仅是人脑和电脑两种信号处理工具。另一方面,软件工程非常接近学习这种精神活动,经历了从个人英雄主义到团队合作的进化,目标是自动化――能够制造工具的工具,而学习的目的是能够诞生新知识的知识。可以说,软件工程是最高级的逻辑在最低级的物理上的表达。2.同时态比较2.1瀑布模型正如有机体的智能部分,一次软件活动和一次学习活动都有孕育、诞生、成长、成熟、衰亡的生存过程,从需求定义直至投入实践为止。最常见的软件生存周期模型为瀑布模型(其中时间安排用分数标出,来自《人月神话》[4]):图1软件工程瀑布模型而学习一门课的过程是知识工程,其周期为图2学习工程瀑布模型每个阶段的原则和对应关系具体为:表1软件工程与学习工程分阶段比较问题定义:定义要实现的软件课程介绍:每学期前两周为了解课程时间,可以自由听课及退课可行性分析:确定是否可解或值得解,技术上、操作上、经济上可行性选课:技术上,是否学过先修课,是否容易通过;操作上,时间是否足够;经济上,是否时间成本过高,是否带来近期和长远收益,等等需求分析包括:教学目标:通过试听,复查复查定义,明确限制的约束;研究老系统对课程的定位准确;研究历届课本和考卷、咨询学长,结合以往类似课程的经验进行成本/效益分析,风险分析及对策分析课时数、学分数,要牺牲的其它时间,不及格的可能影响通过粗泛的系统流程图、数据流图、数据字典、进度规划来明确需求课程表,学期计划,资料清单总体设计包括:学习计划包括:自顶向下的各种粒度的计划每周计划,复习计划等等90-90规则,原因可能是:测定进度有问题,没有可用的量化度量;项目计划有问题;没有明确地考虑风险期末常常发现很多知识未掌握,原因:练习不充分;计划不现实;没有考虑清楚后果里程碑策略分阶段考试将需求分析中的数据流图细化,至每个子功能都明白易懂;HIPO图每个模块完成一个子功能;每层模块合成一个高一级的功能。课本的目录为结构设计,首先按目录泛读,以了解宏观的主题和论述范围,然后逐步细致读各章节测试计划:包括单元测试,集成测试等单元测试:每次课后做习题;集成测试:期中、期末考试模块化原理:模块规模要适中,太大则不易理解,太小则接口开销过大;信息隐蔽;模块独立性;模块间低耦合、高内聚课本和教纲的安排遵从模块化原理,每次课时的知识量和深度适中,否则影响学生的接受和衔接;每堂课集中在一个主题,与其它主题间的接口清晰,一堂课的效果尽量少耦合后继主题详细设计包括:详细设计图有:程序流程图、盒图、PAD图、判定树、伪码、Jackson图、Warnier图具体知识细节:脑图、“复习表解”、“语法图解”编码:推迟程序实现理解知识:掌握清楚概念为先,不急于做作业测试:发现错误,覆盖各个功能模块,Pareto原则:大部分问题集中在少数模块。由独立的第三方来构造测试。复习:查漏补缺,做题需全面。问题常常集中在少数薄弱环节。课本和老师作为第三方提供考试。维护,软件复用:对标准构件的演绎是代码段的复用,对设计模式的演绎是过程复用,前者仅是较低层次的复用,后者才是理想意义上的复用学到老:将学校中所学知识用到工作中去,仅是低层次的复用,而能将学习方法、思维模式带到工作中才是理想的学习2.2其它模型除了瀑布模型,软件生命周期还有:1,演化模型,源于初始阶段对需求不够清晰,返工在所难免,故先做旨在探索可行性、弄清需求的试验性的原型开发。对于一门课的学习工程,对应策略有:提前浏览课本、历届考卷、上课,弄清课程需求,估计自己是否能成功通过。2,螺旋模型,源于对复杂的大型软件,开发一个原型往往达不到要求,故将瀑布模型与演化模型结合起来。对于一门课的学习工程,对应策略是在学习的每个阶段之初都预习将要学习的内容,将原型和瀑布两种过程在时间上不停地递归进行。3,喷泉模型,源于面向对象开发时在迭代中演进,分析、设计和编码各层之间不存在明显的边界,像喷泉一样从高层回流到低层,同时又从低层推进到高层,迭代中没有间隙。在学习中,对应方式是课前做预习分析、听课、课后整理笔记文档、做作业时又复习课文中的概念,等等。4,变换模型:源于关键性软件对正确性的苛刻要求,因而用形式化符号系统(如ZNotation)做软件规格说明,把测试与调试提前到设计中,保证逻辑完备性、穷尽测试。然后进行自动的或半自动的程序变换,最终映射成为计算机系统能够接受的程序系统。学习中,一些教育选拔机制对考试正确性的要求较为苛刻,于是对应的策略是“题海战术”,将能找到的所有题目做完,保证考试时不出错。3.思路方法比较通过比较两个类似系统的对等概念来互补完善,是一种发现新方法的重要方式。人类学习的历史远比软件工程的历史悠久,下面枚举一些学习思路方法,是在软件工程中已存在对应方法的:表2学习方法和软件方法比较经典的线性的程序学习法:符合学问本身逻辑组织地得到完整的知识过程化开发语言和开发方法经典的五步学习法[5]:浏览,略读,精读,复述,复习瀑布模型:问题定义,概要设计,详细设计,编码,测试带题求解学习法:目的明确,完成一步后做总结、制订下一步目标测试先行方法主线展开法:一次迭代只抓住一条主线或侧重面,以保极限编程[6]中的Iterationplanning:在每个迭代的开始证精力集中、保证效果召集计划会议,明确本次迭代任务多人LOVE法:1,Listen,一个人说,另一人听;2,Outline,听者准备提纲;3,Verbalize,听者回忆主要观点;4,Evaluate,说者评价并纠正极限编程的结对编程,Movepeoplearound和Stand-upmeeting然而更多的学习思路方法是软件工程中不存在对应的,让软件工程的设计模式广泛借鉴学习活动的思维模式,则有助于推动软件技术。经典的思维方法包括[5]:形象思维、辩证思维、求异思维、侧向思维、灵感思维、类比思维、反馈思维、全息思维、直觉思维、横向思维、纵向思维、反向思维、偏向思维法、分合思维、颠倒思维、辐射思维、辐集思维、归纳和演绎、系统和具体、分析和综合、比较和归纳、抽象和概括、想象,等等。此外,学习方法中的时间管理、文档管理有许多成熟的方法,软件工程中尚有很大借鉴余地,求得新的思路和策略。3.结论本文举例论证了软件工程和学习工程在背景、原理、结构、方法等方面都具有相似性,从而得出两者的内容可以相互借鉴的结论。让仅有四十年经验的软件工程借鉴人类几千年学习过程中的经验,将对软件工程的发展起到巨大的推动作用。(本文以演化模型写成)4.参考文献[1]B.Randell,Softwareengineeringin1968,Proceedingsofthe4thinternationalconferenceonSoftwareengineering,p.1-10,September17-19,1979[2]BWBoehm,SevenBasicPrinciplesofSoftwareEngineering,J.SystemsandSoftware,p.3