软件设计出现的较早。由于早期程序变得越来越大,那么模块化程序,让不同的开发人员相互配合就形成了一个主题。多个程序员之间要遵从一定的规范进行编程,然后相互调用,Z终使用各个模块进行组合。这种Z早的形式也伴随着新的面向过程语言的出现。
软件设计的原始目的是非常简单的,就是我们要去理解一个完成的功能(软件的雏形),然后把不同的功能分化成细节的模块,然后使用一个团队进行协同开发。在这个设计活动中又找出了诸多的开发方法论(如面向过程,面向对象及现在的面向切片等等),同时也发现了诸多开发的模型(如瀑布模型,原型模型,极限编程及敏捷开发等等)。进而形成一个涉及到管理、设计等方面的细化工作,形成统一的软件工程学。同时对于软件设计也相当细化和规范(如算法、时空代价——占用空间及占用运算时间的代价)。所以现在基本上软件设计就是根据系统分师所指派的横块内进行细分(更小的模块),不同的方法论下,不同的开发模型下将功能块分为更细致的小模块(如面向对象的类,结构等)完成更细致的功能。
基本上来说,软件设计与程序设计被混为一谈,狭义的软件设计指就是程序设计,ZD在于算法上的设计;广义上的软件设计其实就是对系统进行的设计,要考虑到将来软件的部署及要部署的硬件(包括软件方面与硬件方面)。也就是说,程序员不管是在算法设计上还是程序设计上都是称自己软件设计,而系统分师也在设计整个系统也称为软件设计。这是由于习惯的问题而出现的两种理解——系统设计师与分析师设计的是整个软件系统,涉及内容巨大,从部署到软件性能功能移植性等各个方面的考虑,其目的就是构造一个当前适用并具有一定前瞻性、扩展性的软件系统来支撑整个或大部分公司运行的系统。他们再把系统细分为子系统以对应公司或系统中某个相对独立的系统功能。软件设计师把自身分派到的子系统任务再进行细分,实现不同的层与模块的调用(子系统可以理解为可以相互配合的一个完整的某个方面的功能),其目的就是将理解系统进而设计为可以开发的或进行开发准备的工作;而高程与程序员则对模块功能进行分析,然后进入到开发,开发出相应的功能模块。他们所谓的软件设计设计模块内调用层次(如分层开发等),设计算法与程序以达到指定的功能要求或非功能要求。
所以软件设计在不同的范围内有不同的理解,出现这种混淆的原因也是由于软件规模的差别——让你构造一个系统时考虑的内容与构造一个工具软件所考虑的内容显然是不同的。而有些需求是一个公司的整个系统或子系统,而有些只是让你开发一个工具或一个简单的网站而已。所以各层次对于软件设计的理解也不尽相同。
基于上来说软件设计从大角度出发,其目的就是把理解变为可编程的文档。或者可以认为包括在需求分析之内的。也正是因为如此,虽然我们把软件设计挂在嘴上,但软件工程的流程中其实并不包括名词的严格定义。
软件工程中,我们按需求分析阶段、设计阶段、开发编程阶段与部署维护四个大的阶段。需求分析阶段包含可行性分析,需求采集,需求分析(包含功能需求与非功能需求)几个过程,设计阶段包含概要设计、详细设计几个过程,而编码开发阶段就编码、测试(包含单元测试,集成测试等),而部署方面包含部署、验证、维护、迁移等各个过程,事实上对于软件设计的这个不太好的定义规避掉了。所以软件设计方面的广义已逐渐被软件程所取代。