程序的本质

1. 现实世界

现实世界由事物与事物之间的联系构成。事物指各种相对稳定的对象,在一定时间内会保持稳定状态。联系指事物之间的交互,交互。事物之间的交互、交流会使事物改变自身的状态。

如,一个石头,如果完全没有与其它事物交互,石头就不会改变其状态。现实世界中,石头会受热受冷,与空气产生交互。在不断的冷与热中,石头会发生性质的变化。会变得更加脆弱。中国古代修栈道正是利用这样的性质,用火烤绝壁上的石头,然后用冷水烧冷,在不断的冷热变换后,很容易就可以让石头破裂。

一个事物,可以看成是一个相对稳定的整体,但同时事物本身是由更小级别的事物构成的。整个地球可以作为一个星球来看待,同时地球又由海洋、陆地组成。同时还有环绕在地球周围的大气层,以及大气层内部的生态环境。

所以说,事物本身是由小级别事物与事物之间的联系构造出来的。从而我们看世界,是站在一个级别,并考察所在级别的事物之间的联系。对于事物内部的联系,我们会则机处理。

2. 静与动

事物在一定时间内有其稳定性,这样的稳定,可以称之为静。而事物与事物之间的交互,不断地改变着事物本身,这样的不断变化,可以称之为动。

对于选定的静,有两种途径来改变它:一是其它的静与之交互,二是它内在组成部分的静改变自己。

任何一个静,对其研究到精确的程度,就是能够用数字来确定它。以下举例如:

  1. 帅锅1号(身高:175,体重:54,帅度:80%)
  2. 帅锅2号(身高:168,体重:50,帅度:92%)

通过数字,可以客观地知道两位帅锅的情况,像帅度这样的标准,看起来比较主观,但可以由N多人投票决定,从而也表达出客观的情况。

将静研究到精确的程度,需要研究者的经验和能力。同时,分析静的好与坏,取决于是否用一个适应于分析的数学模型来表达静。

3. 程序的本质

程序是一个用于辅助人去了解现实世界的动静关系并去改变现实世界的动静关系的工具。为了做到这一点,程序在根本上,就是在模拟现实世界的动静。

以 C 语言为例,以下程序计算从1到传入的参数的累加和,即 1+2+…+N = ?:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  int i;
  int number;
  int sum = 0;

  if (argc != 2) {
    printf("Usage: sum NUMBER\n");
    return 0;
  }

  number = atoi(argv[1]);

  for (i=0; i<=number; i++) {
    sum = sum + i;
  }

  printf("1 .. %d = %d\n", number, sum);

  return 0;
}

分析这个程序,这个程序可以分为两部分:

  1. 描述静的部分
  2. 描述动的部分
int main(int argc, char* argv[])
{
  int i;
  int number;
  int sum = 0;

以上程序描述的是静,所有对静的描述都可以归结为以下几个标记:

argc       -> 一个数字,代表传入的参数有几个
argv       -> 一个二维数据,保存实际传入的所有参数
i		   -> 一个数字,准备用于临时存放 1 到 N 的数字
number	   -> 一个数字,记录要累加的最大数
sum		   -> 一个数字,记录累加和

其余的程序,就是对静的动,就是对静的改变。

根据学过的累加方法,可以将

  for (i=0; i<=number; i++) {
    sum = sum + i;
  }

改变成:

  sum = (number+1)*number/2;

从而,可以知道,对于变而言,不同的变作用于相同的静可以达到同样的目的。第二静比第一种静所需要一个空间(不需要i)。对于相同的问题,也因为变的不同而决定静的不同。

通过这个举例,可以了解:

  1. 计算机是帮助人去模拟现实的(模拟现实人怎么去计算这个问题)
  2. 人要将现实分析到精确的静(要知道,解决这个问题需要多少的存放数据的地方)
  3. 人的知识越丰富,模拟动(改变静)的选择越多(可以用更加简单的方法去改变静)

从而,可以知道,程序从根本上不能解决问题,解决问题需要人去分析,将静细化到数字程度,并从各种可选的动中选择最好的动来改变静。这一切,都需要依赖人的知识。

4. 时间-空间

每一次变都消耗一定的时间,每一次变的目的都是将一定空间的内容改变。在写一个程序时,需要定义好解决问题的所需要的空间与改变空间的时间。

大学有一门重要的课程叫做《算法与数据结构》,是讲如何用一定的算法去改变数据结构,一个算法由各个小步骤组成,每个步骤都花费时间。

在写程序时,多数情况下,称程序有效率是指程序的时间占用少。程序的使用者的时间会得到节省。这时,会采用空间换时间的方法来满足使用者的高效要求。这是因为使用者的时间更加昂贵。

在曾经硬件存储很昂贵的时代,多会采用时间换空间的方式。

以下例举一个程序,该程序将两个整数的值进行交换:

首先,看看空间换时间的例子:

int i = 32;
int j = 48;
int temp;

temp = i;
i = j;
j = temp;

以下是时间换空间的例子:

int i = 32;
int j = 48;

i = i+j;
j = i-j;
i = i-j;

时间换空间的例子,少用了一个空间,但利用加减法运算进行交换处理。在整体时间上会多比前面的例子多出加减法运算的时间占用量。

在考虑程序的时候,要考虑时间与空间的平衡。

5. 历史与状态

对于大型的应用,会使用数据库技术,利用数据库来记录各种数据。可以将大型应用记录的数据分为两类:

  1. 记录当前所有状态的数据
  2. 记录状态是如何改变的数据

以一个 SNS(Social networking service) 为例,如朋友网,校内网等。社会关系服务所面对的是大量的用户,记录用户之间的关联。以方便用户利用这样的关联节约自己的时间。

如,张三是李四的朋友,李四与王五是夫妻关系,有一天,张三来到李四家见到王五,从而也认识了王五。那么,当前的所有状态数据就可以表示为

这样的关系,是对现状的表示。根据这样的关系,我们可以了解到,张三对王五有一定的认识,可能会给王五带来更多的关系。如张三把自己的伴侣介绍给王五认识。在没有认识王五之后,介绍的可能性很小,在认识了王五之后,这样的可能性很大。

以上所表述的静态关系,实际上都是通过一定的动作来实现的。这样的动作就是第二类数据。如果这类动作对于应用而言也有很大的意义,这类数据就要被记录。

根据这样的记录,可以任意取一个时间点,来了解这个时间点的状态。比如,可以了解到三年前,张三与李四是朋友,当时,李四还没有找到王五。这样的历史对于 SNS 应用而言是很有价值的信息。比如,可以对张三的所有关系进行一个时间顺序的回放,让张三了解自己曾经与人交往的先后关系。

我们了解到,程序是模拟现实世界的工具。通过对历史数据的记录,我们同样可以了解到现实状态的变化。这与前面第3章提到的改变数据的方式有所不同。第3章中,改变数据的方式是通过一定的执行流程。这里的改变,是将现实的流程记录下来。未来可以再将任何一个时刻的状态表达出来。

6. 归结

程序不能解决问题,解决问题好与坏与人的解决问题方案是否妥当有关。我所经历的很多项目,在遇到一个需求的时候,不是去考虑这个需求所提出的问题是什么,怎么解决这些问题。而是把这一切都交给程序员去实现。结果,问题终究还是没有解决。

我们利用程序这样的工具,前提是我们已经知道怎么去解决问题了。在这个前提下,让程序去按照我们提出的解决问题方案执行。这才是正确的使用程序。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值