我与软件工程

讲授《软件工程》这门课断断续续已经有十个年头了,现在回过头总结一下自己的思考历程,与大家分享。

1、史前

我所在的学校是一所职业技术学校(学院),1997年刚调去的时候,我们计算机系才建系不久,连带系主任总共只有八个人。那时,我刚开始从事计算机教学工作,我能做的无非是把过去在学校学的内容,鹦鹉学舌地搬给学生。教学计划也是系主任参考其他学校的计划,删减而成。但随着教学经验的积累,开始从体系的角度考虑教学内容的内在关系。后来在讨论02级的教学计划时,我力主增设《软件工程》这门课。

2、开始

在02级的第五学期(04年下半年),我开始为他们讲授《软件工程》课,选用的教材是清华大学出版社出版的郑人杰编著的专科版教材,这是一本讲授传统的面向过程为主的教程,有一部分OO的内容(其实,我当时对OO的认识并不是很深,以为学习了OO的语言,就理解了OO)。为了激发学生的积极性,我把这门纯理论教学的课程加入了实践的内容,即我将每个班的学生编为5至8人的项目设计小组,由他们选择我提供的若干项目或自选一个项目为设计课题,作业分为分析和设计两个阶段的文档,另外包括一个数据库设计文档。我一边讲授理论,他们一边用我讲授的理论作分析、设计文档,每个文档都规定了提交时间限制,与成绩挂钩。我用大约整个授课学时的60%左右的时间做讲授,等我讲授完成后,他们用剩余的时间分组在课堂上讨论他们设计文档。没想到这一做法取得了异乎寻常的效果,几乎每个班的讨论都热烈而积极,也取得了一批很好的学生设计成果。这之后,在06级、08级……直到现在14级,陆续讲授很多届学生的《软件工程》。

3、OO

在以后的专业学习中,我陆续读了一些网上介绍的各种名著。大约在05年我逐渐领悟到整个软件领域包含两个复杂的需要人们花费功夫的价值点。一个是解决问题的算法问题,另一个是解决软件本身的复杂性的问题,随着软件规模越来越大,软件的内在结构的合理性已经成为行业的一个价值点。

与我03年初在书店偶然发现《设计模式》、《重构》等名著不同,05年底我在有了上述想法后,就专门去书店有找相关的书籍,很幸运,我一下就找到了Bob大叔《敏捷软件开发》一书,于是就开始迷恋XP,并一度在教学中让成绩较好的学生,演示其中的保龄球计分程序的演练,效果也不错。

这时,由于高职学校强调对外合作办学,我们系开始与北大青鸟开始软件工程师的合作项目,我发现他们的技术培训讲师(高级技术支持),和我那时一样也存在着为模式而模式的过度模式的倾向,尽管我并没有完全看懂GOF的《设计模式》(后来在网上看了李建忠老师的系列讲座,才算真懂了),在内心还是把它们像神一样敬着。

在成为我校的第一批青鸟合作教师之后,开始接触青鸟的教学模式,它最大的特点是将实践引入到教学中。其实,计算机学科本身就是一门实验学科,只是由于早期国家穷,实验条件无法满足教学需要,才不得不偏向理论。当前,在实验硬件条件已经大幅改善的状况下,回归以实践为主的教学已是必然,但由于积重难返,这个过程将持续一段时间。而且,由于没有认真思考计算机理论实践的关系,另一种极端的完全抛弃理论知识,为实践而实践的做法开始泛滥。

在青鸟的培训学习过程中,我开始在青鸟的实践项目中接触三层的软件架构,并以此为开端,陆续学习了胡协刚的培训教程,马丁﹒福勒的《企业应用架构设计》,《Microsoft﹒NET企业级应用架构设计》等关于软件架构方面的书,开始认识到OO软件包括微观、中观、和宏观三个层面。

所谓OO软件的微观层面,就是OOPL的三大语法:封装、继承、多态。能将多态的虚函数实现机制掌握了,就基本算到位了。这一点我在早期看侯捷老师的《深入浅出MFC》的时候就弄懂了,这也使我认为学习了OOPL就学会了OO,并固执了许多年,直到接触设计模式。

OO软件的中观层面,就是建立在对OO原则的深刻认识之上而形成的OO设计模式。主要包括GOF经典的23个以及IOC。它是OO精华的所在,值得学习,也值得欣赏。以它们为基础,进一步实现了规模更大(宏观)的框架和架构。

OO软件的宏观层面就是框架和架构。架构是一个软件全局性的、唯一的框架,而其它的框架则是局部的复用半成品。

4、冲突

在学习胡协刚的软件架构资料的时候,谈到了“不要陷入极限编程的陷阱”,提出对软件的复杂性要有全局的设计,提出软件开发应该从宏观着手的观点。而这一观点与《敏捷软件开发》一书中介绍的XP方法,从中观层面着手的轻量级方法不同。

这使我陷入了一个困局,究竟是从大的方面着手的,还是从小的方面着手,去实现一个教学实例系统呢?

5、释然

直到最近,开始阅读范钢老师的《大话重构》才最终找到答案。原来,当前软件是一个因不断应对新的需求带来的复杂性的提升,而其结构在不断演化的动态过程。

让我们先从软件的来源数学说起,据说,图灵机是图灵对人们使用纸笔进行数学运算的过程进行抽象而得来。所以,用计算机解决问题,就是一个复杂的解题过程。但是,我们的解题算法是如何描述呢?

“目前几乎所有的算法书的讲解方式都是欧几里德式的、瀑布式的、自上而下的、每一个推导步骤都是精准制导直接面向目标的。由因到果,定义、引理、定理、证明一样不少,井井有条一丝不乱毫无赘肉。而实际上,这完全把人类大脑创造发明的步骤给反过来了。看起来是阳关大道,实际上车马不通。”

“算法诞生过程中的思路往往包含了比实际算法更本质得多的知识,实际算法乃至算法的某个特定语言的实现包含了太多表面的不相干知识,它们会阻碍对本质的理解。” (见刘未鹏的博客《知其所以然》)

对软件的结构也是一样,软件模式如果也是如此的精准制导直接面向目标的。就直接使用它们,为模式而模式,堆砌出一个超出我们需要的复杂度的软件结构,从而引入不必要的复杂。

在《大话重构》一书中作者提出的“恰如其分地规划,演进式地开发”使我找到了问题答案,我觉得我可以开始写我的教学实例软件了,它应该是一个不断为需求推动的而演进的软件系列。

时间: 2024-10-16 16:19:40

我与软件工程的相关文章

软件工程——《构建之法》读后困惑

通过一周多对这本新书的快速阅读,发现自己存在很大的问题, 如下: 一.软件工程这门课与JAVA,C++等这些面向对象程序设计应该怎样对接起来? 二.软件工程这门课,除了在上课的时候认真跟着老师的思路走,课后空闲时间,我们该怎样单独,或者在团队里怎么学习? 三.提高我们这门课的能力是通过敲代码,还是提高自己的逻辑思维能力? 四.在即将到来的人工智能时代,软件工程师这个职业是否能一直活下去?

软件工程第二次作业--师兄采访

我采访的是李权师兄,虽然之前也有人采访过他,问题都是同样的问题,不过我挖掘出了和其他同学不一样的信息. 问题:    师兄,当时你们做的项目是什么,有多少用户, 现在还有人用吗? 李权师兄: 当时我们的项目名是约跑APP,当时用户有8人.在用户的手机上测试通过,能让用户找到一起跑步的小伙伴.现在已经没有人用了. 追问:该app给用户提供了什么样的服务? 李权师兄:app能提供给用户认识新朋友的平台.通过app,用户可以约人一起跑步. 第二个问题:师兄这个项目能否给我们团队继续开发,源代码还有么?

软件工程进阶

一直向往 it 行业, 不敢说有很深入的了解, 但一直有想法, 想做自己想做的, 想有我的 team 然而什么都计较那么清楚, 最后把自己吓傻了, 也不去做, 这种结局真的最没什么意思了, 曾经还有很多人还对未来充满决心, 2年内一些人陆续放下了梦想和计划, 上课,打游戏, 吃饭这些是多数人的轨迹, 我觉得可怕, 于是更坚持自己, 尽管知识浅薄, 但也在用心学习每个有帮助的课程, 老师说得对, 实际工作,沟通能力很重要, 软件工程这门课程我同样会用心, 希望有一天,以我之才,何须屈人之下. 也希

软件工程课程设计之XMAL

前言 最近做软件工程课设,因为需要用到可视化界面,经过仔细考察,在小组成员的建议下,最后决定使用XMAL做前台. 题目分析 题目:物理环境包括温度.湿度.大气压力.光照等参量.软件能够以图形化方式,实时显示各参量的状态,比如,显示温度的实时曲线图.具有参量报警功能,能够提供出行意见,具有历史数据查询功能.假设数据以存放在数据库中或文件中. 题目要求用图形化方式实时显示各参量状态,所以前台程序务必足够美观,选用XAML设计窗口界面,C#构建后台.这里主要总结一下XMAL.(我用到的,其实很少很水,

【集美大学1411_助教博客】2017软件工程开跑啦。。。

一.自我介绍 各位同学大家好,我是各位同学本学期软件工程这门课的助教,我叫郑蕊,现工作于吉林省长春市.很荣幸能再一次为<构建之法>担当助教,在之前担当助教的过程中,我已经获益良多,在此还是要感谢周老师和邹老师,感谢两位老师给我树立的优秀榜样,也感谢两位老师对我的教导和引导.很高兴这次能担当集美大学软工课的助教,在15年冬,我曾去过集美大学,那真的是一所风景非常优美的院校,从暴雪的东北到达绿意盎然的夏门,在集美大学的校园中漫步真是一件让人享受的事.希望本学期能和集美大学的同学们共同探讨软件工程,

云计算对于传统软件工程的影响

云计算对传统软件工程的影响 传统软件工程的概念 传统软件工程采用的一是结构化泛型,基本阶段按顺序如下:需求阶段.规格说明阶段.设计阶段.实现阶段.集成阶段.维护阶段.退役等,这是一种适用于代码量适中的传统软件开发方式. 而随着社会进步与技术发展,软件越来越复杂,计算越来越繁琐,代码量也越来越大,存储和处理的信息越来越多,软件规模也越来越大.而传统的结构化设计方法在大规模的软件的开发组织和维护方面困难重重,软件的复用性能也不好.于是发展出了云计算的概念. 云计算的概念 云计算是以数据为中心的一种数

敏捷软件开发VS传统软件工程

敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同,相对于"非敏捷",更强调程序员团队与业务专家之间的紧密协作.面对面的沟通(认为比书面的文档更有效).频繁交付新的软件版本.紧凑而自我组织型的团队.能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中"人"的作用. 本文将介绍敏捷软件开发的历史背景与发展,

10.2: 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下-------------答题者:徐潇瑞

10.2: 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下 - 当时的项目有多少用户,给用户多少价值? 现在还有人用吗? - 这个项目能否给我们团队继续开发,源代码/文档还有么? - 项目开发有什么经验和教训 - 对学好软件工程有什么建议 写成一个博客   #团队博客作业2 根据老师的作业要求,我们采访了以前本科认识的一个同学,他在读本科的时候出去实习,参与了一些项目.他参与了手机外卖app的开发,根据他的回答,当时用户有1

软件工程学期总结

软件工程. 我觉得软件工程的知识其实就是一个软件开发的方法论,给你一套前人总结出来的经验教训,让你少走弯路.做一件项目之前来个“可行性分析”(包括目的.要求和自己能力的估算) 这可能是我做事情之前缺少的一个步骤,然后到最后连自己要做什么都忘记了.这是做事的前提:先看事情是否应该做,是否值得去做,能否做成功.最后再去努力实现. 一个学期的软件工程,涉足java,web前后端和安卓...一个学期下来就一个感受:TM忙的屁滚尿流的.

《软件工程》课程总结

随着时间的推移,学期进入了尾声,我们的软件工程课也将告一段落.下面是我对这学期进行的总结: 通过这16周的学习,我收获了很多,学习上的漏洞.同学之间的沟通及配合.自己处理事情的能力和开发程序的宝贵经验.在上课期间,老师说过我们的软件工程课上所讲的东西和毕业设计有关,例如:可能性分析和需求分析.就拿需求分析来说,在一个程序的开发初期所要做的就是深入的了解分析形成需求分析.通过用户调研了解用户需求,明确用户想要用这个程序干什么,适用于什么人群去使用,之后再通过需求分析框架能明确程序的设计目的,只有通