软件设计奇遇记(二):空间关系

书接上回,言归正传,

上文作为开篇,提到了我所经历和看到的软件设计史,

编程语言作为一种现象,见证了计算机硬件的发展历程。


每一个时代都有那个时代的资源限制,

同时也有局限在那个时代视角下待解决的问题。


除此之外,上文还提到,

程序设计就是一种把大脑中的想法转化成自动化任务的过程。

本文将接着这个思路往下讨论。

人机交互

如果说编写一段程序,是想法的转换过程,

那么把现存的所有程序视为一个整体的话,

编写新程序无疑就是一种与现有程序世界进行沟通的过程了。


这是一种能够影响技术人员看待自身工作的视角。

非技术人员通过语言、文字,与外界世界进行沟通,

技术人员则通过程序。


技术人员通过程序,调用现有系统所暴露出来的 API,

站在前人的肩膀上完成自己想做的事情。

这是一种空间视角,让我们看到了自身工作在整个系统中的位置。

软件形态

现有的软件各色各异,常见的都有哪几种形态呢?

我认为可以从工具、框架、系统、平台,这 4 种形态进行讨论。

1. 工具

一段时间以前,我曾以为工具是为了避免重复劳动用的,

例如,把一段常用的软件功能剥离出来,做成一个可复用的工具,

就能使其他人不用再次开发相同的功能了。


其实这样想,并没有什么不对,

不过后来才发现,这也许只能算是工具的一种附加作用吧。


因为可复用与工具,并没有什么必然的联系。


首先,可复用的代码,未必以工具形态存在,

因为我们在考察可复用的时候,往往容易忽略可复用的范围。

而在多大程度上可复用,是一项很重要的预算指标。


所以,不必为了提高复用性,而考虑可复用。

而是应该考虑其他因素,比如维护成本,或者说代码的依赖复杂度,等等。

复用和依赖,好像天平的两端,更像是一种取舍而不是对错。


其次,工具的出现未必提高了可复用性,

一个工具被剥离出来,也不一定要被多处使用,只有一个使用场景,也是可行的。


那么究竟是什么原因导致工具的形成呢?

我的理解是:信息块的粒度。

工具的出现,增大了人们日常工作中所需处理的信息块粒度。


也就是说我们不用再直接应对细节了,

所以,工具的便捷性,体现在降低了使用成本。

我们看到的不再是一粒粒的米,而是一碗碗的米饭了。

2. 框架

框架是软件约定或规约的一种自动化表示形式,

把文件放在不同的位置,或者说按照约定的某种形式编码,

就会达成某种既定的效果。


这是软件研发流水线模式的雏形,是研发工作可量产的第一步。


然而,框架虽然能极大提高熟手的生产力,

但仍然会引入不小的培训成本,这一点是最容易被忽视的。

因为框架的创造者,很难站在不具备框架知识的角度去考虑问题。


除此之外,不同框架之间进行切换,也是一件非常痛苦的事情,

堪比是在空中给飞行器替换引擎,

稍有不慎,将会引发空难。


所以,以框架形态存在的软件,更重要的是维护它的用户群体,

只有形成一定的社区规模,才能活得更好,

人们用的越多,它就越难被替换。

3. 系统

系统,原指由同类事物组成的整体,这里特指软件,

指的是一系列软件工具(也许用了某个框架,也许没有),互相衔接,

最后统一向外暴露一种交互接口。


系统可能是有状态的,也可能没有,

关键的特征是,它可以用整体和部分的方式考虑自身。


一旦软件组成了系统,就会产生一种规模效应,

它更像是一种有生命的 “活物”,不断演化不断的更新自己。

并且由于其内部具备更小的子结构,演化过程可能会变得不可预测。


它能响应外部的变化,而不必颠覆自己,只做局部的微调。


外部程序或者是人,与软件系统进行交互时,

将以被设计好的心智模型进行沟通,

就好像外部在与一个 “生命体” 进行 “聊天” 一样。


因此,系统是与演化不可分的,

如何响应外部的变化,如何更新自身,是不同系统各异的基因。

4. 平台

大部分系统的用户并不是开发人员,而是普通人,

或者说,它不是为了让用户通过代码调用它而设计的。

但仍然有一些系统,它是面向开发者的。


这些系统中,又有一小部分,提供了让用户辅助提供功能的办法,

这种提供了用户扩展方式的系统,就可以称为平台了。

平台的特点是,它可以 “吞噬” 感兴趣的功能,并为己所用。


值得一提的是,很多号称是平台的系统,其实并不具备这样的 “平台属性”。

它们只是大而全的一个复杂系统罢了。


然而,如果一开始就指望用户帮忙贡献系统特性,那就大错特错了,

这有几方面条件在制约。


其一,通常用户想要的是功能,而不是自己可以编写功能,

所以具备平台属性,更多是从软件形态考虑的,

更合适的形态,会更容易的加以管控。


其二,要让用户提供功能,就得想办法让功能的提供方式门槛更低,

否则大多数人都会望而却步。

而降低门槛的过程,无形中也会增加系统的复杂性。


所以,平台是有利有弊的,正像是每种生物都有其自身的特点一样,

会水的不必羡慕会飞的。

结语

本文首先介绍了如何从系统的(空间的)角度考察程序世界,

然后介绍了软件常见的 4 种形态:工具、框架、系统、平台。


之所以提到这些,主要是可以让我在程序世界中看清自己的定位,

当前在开发什么样的软件,或现在所写的程序,在为哪块工作增砖添瓦。


所以结合第一篇来看,我们已经可以站在特定的时空点上看到自己的工作了,

在历史长河中的哪个环节,在程序世界的哪个版块。


这可能是一件有趣的事情吧。