抽象的层次

软件开发之所以复杂,是因为业务需求与程序语言之间存在的巨大鸿沟,有太多的变数。

你无法清晰和准确的描述你所想要的东西,而即便你能,你也很难最后实现出来的东西是不是你所想要的。因为,在软件业,宏观的业务需求很多时候竟然是程序员决定的,要确定一个特性具体会怎样体现,你竟然不得不去看源代码。就好比说,制作一架航天飞机,你不得不从每一个螺丝钉开始考虑。软件太虚幻了,以至于你无法从外观上看出,一个exe程序到底是游戏呢,还是文字处理,或者会格式化你的硬盘。所以,软件的变数太多了,你无法掌控。

 

软件的灵活是好处,也是坏处。开发人员总是说,你想要怎样都可以,只要你告诉我,就能给你实现出来,几乎没有任何的成本。既然这样没有成本,所以外部的需求总是在变,今天这样明天那样。

 

软件的外部行为是无法预测的,所以我认为病毒是会永远存在的,就像好人和坏人你从来不能完全分清。这种无法预测性,同时也给模块之间的配合带来了很大的障碍,就像你不知道如何跟一个无法捉摸的人合作一样。于是,就像人与人之间建立了契约关系一样,软件业也开始有了接口的概念。软件模块的外部行为,于是由其接口进行描述,这样的配合就好多了。

 

对外行为已经公开了,那么自己对外的要求呢?如何表达对世界的意图?

 

程序之所以复杂,是因为系统底层不知道上层应用的具体意图,无法优化......或者说,缺少更大的视图。每一个小动作的意图都很明确,但是组合起来的效果却不知道会怎样。就像直接阅读一段计算机的操作指令码0101的,你知道到底最后要干嘛?就是直接看C代码,你能猜出这是要发射卫星还是播放电影?不能,除非你阅读了很多的上下文的代码。所以,我相信,如果要让计算机执行更复杂的工作,我们需要更高层次的语言,能够把更高层次的意图表达出来。就像C语言对计算机系统的抽象,SQL对关系型数据的抽象。

 

抽象又几个层次,首先你会先创建一个函数来封装复杂的操作。 在后来,你会创建更加的完备的代码框架来处理同样领域的各种问题。接着,是用一种抽象的模式来囊括不同领域的类似问题。最后,你会发明一种特定的语言来方便表达。解决方案从开始到后来变得越越抽象,但是适应范围也越广,表达也更简洁。

 

以为业务需求与程序语言之间存在的巨大鸿沟,弥补起来就会有偏差,我们需要在中间不断的设立参照物,或者是中间产物。共产主义尚且还有分三步走呢,何况软件开发。这种中间的参照物就是函数库,代码框架,模式和语言,一层层的转换,而且要保证每一层之间转换的准确性。

 

所以软件开发,就是不断地从高层次的抽象不断向下转换,而每一个抽象上都要把自己的意图准确表达。现在的编程语言也在往这方面发展,企图在不增加新的抽象层的情况下,对现有语言进行改造。比如.NET里的Attribute编程,还有XAML里使用标签来描述界面布局和程序行为。这就是所谓的Declarative编程,与以前用很多代码来描述的Imperative编程有很大不同。Declarative编程的最大优点是,它准备的表达了自己的意图,而Imperative编程就很难琢磨。前者对开发工具的支持也比较好,而后者则要求开发工具有很高的智能!

 

一时兴起,胡言乱语了一番。以上想法,多来自去年看过的《Software Factory》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值