选软件工程这个方向已经快半个学期了,发现这门课包含的信息量挺大的,需要我们对知识的理解和贯通性。
几乎每个程序员都知道“软件=数据结构+算法”这句名言。但在实际运用中,并没有这么方便。源程序是建立在数据结构上的一些算法。程序要对数据进行操作,这些数据有些是静态的,有些是动态的。但是光有代码和静态数据还是不行,工程师要把他们构建为机器能懂的可执行代码。构建不仅仅是cc和link命令,一个复杂的软件不但要有合理的软件架构、软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数等。这些都是软件构建的过程。我们做软件就是为了能服务大众,广义上的软件工程包括用户体验、用户界面设计等,所以软件=程序+软件工程,一个扩展的推论是软件企业=软件+商业模式。
软件工程这个概念是1968年第一次被提出的,它迄今为止经历了4个重大阶段,分别是玩具阶段、业余爱好阶段、探索阶段和成熟阶段。软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。人们在开发、运营、微虎软件的过程中有很多技术、做法和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
软件和人类制造出来的其他产品相比,有许多共性,也有一些特殊性。他们都是解决某种需求。软件开发的过程中存在着一些难题。首先是复杂。软件各个模块之间有各种显性或者隐形的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往已几何级数的速度增长。其次是不可见。软件工程师能够直接看见源代码,但是源代码不是软件本身。在一些商用软件出错时,工程师只能看到程序出错瞬间留下的痕迹,但是无法完整重现到底程序出了什么错。程序的易变也是令程序员烦恼的一个问题。软件看上去很容易修改,修改软件比修改硬件容易多了。但是正确的修改软件却是一件很困难的事情。软件的服从性和非连续性也是不可忽视的问题。人们比较容易理解连续的系统:增加输入,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输入上很小的变化,会引起输出上极大的变化。