软件开发是什么、如何做

14-02-25 zhanggongying
一、软件开发是什么

有形的工具是人类肢体的延伸;计算机系统则是人类大脑的延伸:

将人脑中的系统模型放到计算机系统中运行,从而将人脑解放出来做更有价值的事情。

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

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

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

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

二、软件开发如何做

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

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

针对这些问题,面向对象思维开始兴起。面向对象编程起源于 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
banq
2014-02-26 08:14
写得不错。顶一下。

EricGogh
2014-02-26 09:49
如工业时代,更多地是人的肢体与器官的延伸与替代,后工业时代即信息时代,则由计算机系统进一步解放人类大脑

[该贴被EricGogh于2014-02-26 09:49修改过]

猜你喜欢