软件开发是什么、如何作

From:http://www.jdon.com/46159html

-------------------------------------------------------------------------------------------------------------ajax

1、软件开发是什么

有形的工具是人类肢体的延伸;计算机系统则是人类大脑的延伸:
将人脑中的系统模型放到计算机系统中运行,从而将人脑解放出来作更有价值的事情。

“人脑中的系统模型”能够比喻成导演脑中的电影,在真正拍摄以前,导演会在本身的脑中播放,而后经过演员、道具等再现一遍。抑或比喻成电器设计师脑中的电器设备,在投产以前,在设计师脑中是有完整的电器仿真的。

将 “人脑中的系统模型”变成能够在计算机系统中可运行的系统的过程即为软件开发。

设计师脑中的电器模型必须和当前的生产工艺和技术水平相适应才能生产出产品,超前设计只能停留在概念阶段;导演天马行空的想象若是超越现实的拍摄技术限制也没法拍成电影。 “人脑中的系统模型”要最终变成可运行的计算机系统也受到计算机技术发展水平的限制(包括硬件技术和软件技术的限制),必须作一些适应性的调整,咱们只是但愿随着计算机技术的发展,这样的调整幅度愈来愈小,不要让咱们的设想被迫打个折扣。

在计算机技术发展初期,计算机只能作一些科学计算,人类只能将一些“科学计算模型”交由计算机实现;随着计算机技术的发展,能够胜任更复杂的任务时,咱们但愿计算机系统可以帮助咱们作更多事情,不只仅是计算,还能作一些管理工做或处理一些繁琐的事务。



2、软件开发如何作

最开始,计算机只能用于一些科学计算,只能将人脑中的计算过程模型放到计算机中运行,软件开发的思考方式很天然地是面向过程的,这一阶段的编程语言也是面向过程的。后来的结构化编程也只是代码层面的优化,即“改善程序的明晰性、品质,而且避免写出面条式代码”。

随着计算机硬件技术的发展和计算能力、存储能力的提升,计算机被应用到更多的领域,这些领域内的模型已经不是线性的了,而是立体的有层次的,可是软件世界中因为受历史编程语言和编程思想的限制,还再继续用面向过程的编程思想和编程语言刻画人脑中模型,这中间须要进行转换——将立体的有层次的模型转换成线性的过程模型,二者之间不能天然衔接。程序自己也由于不能直接反映人脑中的模型而显得晦涩难懂。

针对这些问题,面向对象思惟开始兴起。面向对象编程起源于 Doug Englebart的观点:计算机是人类大脑的延伸。Alan Kay's Dynabook 后来建立了一门编程语言(Smalltalk)将他的观点经过代码实现。实际上,这位面向对象编程的先锋的目的就是用代码捕捉人们头脑中的模型。今天,图形交互界面的繁荣和面向对象语言的控制地位正是当年这些面向对象思惟的结果。

可是"用代码捕捉人们头脑中的模型"的目标到目前也没有彻底实现,当前处于控制地位的面向对象编程语言如Java,C++,C#等都不能很好的捕获人脑中的模型。

人脑中模型大致上能够分为有生命的动态模型(人、组织和动物等)、响应式静态模型(机器、电子设备等)和彻底静态模型(建筑、结构等)。现代的计算机系统通常是代替人类去处理事务,相似一我的或组织,刻画的是人脑中的“有生命的动态模型”。 计算机系统有时也用于一些仿真、模拟等,刻画的是人脑中的“响应式静态模型和彻底静态模型”。现代编程语言能够很好地刻画后两个模型,但不能很好地刻画“有生命的动态模型”。现代面向对象编程语言中的对象和“响应式静态模型和彻底静态模型”很接近,都是没有生命的,只在线程看到它并调用它时才有昙花一现的执行过程,即使如此现代面向对象编程语言在刻画静态模型时仍是有不少问题,好比人类中的“响应式静态模型和彻底静态模型”多是一个电子设备,受到物理和几何特性的限制,组成电子设备的各组件之间是松耦合高内聚的,组件接口清晰、明确,组件之间的组装很是天然、容易。可是咱们的程序中的对象却常常不是松耦合高内聚的,咱们总认为比大天然可以作的更好,却每每陷入困境。因此才产生了那么多的设计原则、设计模式等来指导咱们进行设计。

虽然经过设计原则、设计模式等的指导,咱们能够比较完美的刻画人脑中的“响应式静态模型和彻底静态模型”,可是在刻画“有生命的动态模型”时仍是有些先天不足,语言层面不支持捕获模型中有生命的对象、角色变化和通讯方式等。好比组织单位中的每一个人是独立的有生命的对象,其角色多是多重的或可变换的,人与人之间的交流多是直接的、同步的、异步的或间接经过对话机制进行交流。这些模型还没法经过现代面向对象语言直接进行表达。

将人脑中的模型放到计算机系统中运行的一个理想过程多是这样的:
(1)人脑首先发挥其长处按照天然的方式(不按程序思惟或计算机思惟)创建业务模型
(2)业务模型不断细化成为能够完成业务需求的模型系统,并可以在人脑中顺畅的演绎运行。这个阶段应该输出最终的详细模型。
(3)计算机系统理解上一步输出的详细模型并发挥计算机相对于人脑的优点更好的运行这个模型,提供模型中预先定义的服务。

在(2)和(3)之间理想状况应该如上述那样无缝衔接,或者至少可以比较天然、容易地进行衔接。可是现代的编程语言还不能很好的刻画人脑中的模型以达到天然地、容易地进行衔接的目的。下面就来谈谈现代面向对象语言的问题。

(一)、现代面向对象语言的是与非

1. 封装泄露问题
(1)对象的私有属性可能就是对象
(2)全部对象都生活在人人均可访问的堆空间中

私有属性可能会被共享出去——有时是故意设计成这样,但经常是意外的(咱们只须要将属性对象的引用传递出去),不管哪一种缘由,都意味着失去了对私有属性的本地控制,也失去了本地简单推理的的正确性,数据封装容易破坏。表面上某个对象只能经过其公开的方法访问私有属性,可是却有不少隐藏的方式(直接修改私有属性引用的对象、经过反射机制访问私有属性等)访问到私有属性。

2. 内部状态一致性问题
即使对象的私有属性是原始类型(如int, long等),也不能保证安全,例以下面的类A:


class A
{
private int count;
Thing thing = new Thing();
public void method1()
{
.....
count = 42;
thing.f();
......
}

}

method1中count=42;thing.f()执行以后,count的值时多少呢?没法肯定,由于thing.f()调用可能会修改count的值。这种不肯定性有时防不胜防,就像咱们似曾相识的全局变量问题。

上述的对象问题致使咱们看到的(头脑中的模型)和实际执行的(计算机系统模型)不同,很容易犯错,犯了错还意识不到。

3. 现代面向对象语言中的对象和咱们OO思想中的对象不同
(1)全部的对象都是死的,没有本身的生命
(2)全部的对象方法必须由外部线程调用--他们必须面向调用者
(3)任意看见对象的线程均可以调用对象的方法,对象自己不能阻止对方法的调用
(4)即便对象自己处于不合适的状态下,也不能阻止别人的访问,对象没法控制本身
(5)每一个线程在调用对象方法时带给对象昙花一现的生命
(6)线程能够随意穿越对象的边界,绝不关注底层结构的状态是否失衡



(二)、回归面向对象思想
(1)对象封装数据和操做数据的算法
(2)对象中的数据和算法是私有的,外界没法看到数据,也不能直接执行组件中的方法 
(3)对象有本身的生命(线程),对象中的算法有内部生命体执行
(4)对象之间通讯方式有多种:同步、异步、直接、间接、一对多、多对1、多对多等等,但都不是直接的方法调用,而是发送消息算法