软件的本质

http://blog.csdn.net/pitt_xiong/article/details/7851368

软件是一种固化的思维。其根本组成是概念和逻辑。软件世界中的一切的故事始于一个机器模型,而这个基本的机器模型并不复杂,甚至可以用三个关键概念来概括:指令、数据以及栈。其逻辑也比较简单,即按照指定的顺序,逐步执行各条指令。但也就是这样一个简单的模型,支撑起了整个软件的世界。软件构建的过程就是从客观世界中的概念和逻辑向机器模型逐步进行映射的过程。由于编译器(或解释器)的存在,最后一重映射已经被无限简化,因此我们可以认为以编程语言为载体的代码即是固化后的思维,包含了所有固化后的概念和逻辑。
       为完成这一任务,首先软件的边界必须清楚,即“要转换的究竟是什么”必须尽可能明确,此即需求开发的根本任务。从需求向最终代码的映射可以称为软件构造。需求开发的结果:规格说明和软件构造的结果:代码表述的实质上表述的是相同的东西,所不同的只是视角,表达方法和详尽程度。需求开发姑且不论,软件构造即在确定的范围内打造概念的边界和定义概念间的逻辑关系的过程。
        打造概念边界时原则可以有许多,但手段只有一个,即抽象。从本质上讲,抽象是一种认清事物本质,并进行归类的过程。与抽象相对的是具体,但抽象的来源也是具体。假使我们需要对【人】这一名词进行定义,那么必然是要从张三,李四等等具体的人身上抽取共通特征,而后才能完成定义。最终结果是【人】这一概念来源于张三,李四,但又不是张三李四。这样一个从具体的事物中抽取共性,再进行命名的过程就是抽象。
        我们常说的功能分解(Function Decomposition),抽象数据类型(ADT),面向对象(OO)都可以看做是对事物进行抽象的具体方法。但不管使用什么样的方法,打造概念边界通常并不容易。这种困难起源于概念本身的边界并不清楚,存在模糊性。比如:当我们描述一本书的时候,那么这本书是否被借出了这种信息,是既可以作为书的基本信息的一部分,也可以通过查阅借阅人的信息来存储的。对此,哲学上的表述是:世上万物是运动的,联系的,而非静止的,孤立的。
       更困难的是一旦切换视角,相同的概念又可以有多种划分方法。好比说,我们可以很容易界定什么是人,什么是猿,但当我们试图把人猿归类的时候就依据我们的视角进行抉择。因为它似乎是人,似乎是猿,却又更是人猿。打造概念边界时正是类似人猿这类概念让我们犯难。有些问题甚至只有选择而没有答案。庄子对这种事情的观点是:自其异者视之,肝胆楚越也;自其同者视之,万物皆一也 。
       也正因此编程是一种实践多于是一种理论。
        我们可以抽象出一些指导性原则,比如开闭原则,比如里氏代换,比如高内聚低耦合,但一旦面对现实时却只能具体问题具体分析。也许有人认为这里所说的澄清概念边界专属于面向对象,其实不是。当你决定某一组函数专门负责文件操作时,你同样是定义了【文件操作】这样一个概念的边界。包,类,模块,数据结构,方法等等这些名词都可以对应到一个个具体的概念,是抽象这一工作的结果。

我们把概念之间的关系定义为逻辑。而概念间的逻辑关系可以被分为两类:一类是概念所固有的,基本不受具体应用影响的静态关系。比如:人是比老师或学生更为泛化的概念,老师或学生都需要有一个名字。这就是我们常说的继承,包含聚合(整体与局部)等。需要特别一提的是框架(或设计模式)更多的体现的是一种静态关联关系。框架把全局性,共通的部分抽象出来,固定在框架之中,把局部的,需要定制的东西开放给用户,来应对变化。与这种静态的逻辑关系相比,具体化的概念之间的动态关系显的更为繁杂。如果说概念间的静态关系体现的是一种预先存在的必然关联的话,那么概念间的动态关系体现的则是实现具体功能时体现出来的偶然关联关系。假设说我们要做一个简单的监控系统。那么大致会衍生出下面几个方面的概念(模块):

1 照相机:负责拍照
2 图像处理:负责分析照片中是否有异常
3 数据库:用于存储过往的记录
4 报告功能:一旦发现异常,对相关人等进行通知
5 控制器:根据既定的处理流程,使程序动起来。
6 ... ... 这个时候,控制器和照相机(或数据库间)的关联则是一种偶然关联,是动态关联关系。把照相机替换为摄像头也无不可。
对照实现来说的话,照相机的实例可以通过控制器的接口传入,也可以在控制器的方法中创建,但如果把照相机作为控制器成员,则和这些概念间既有的关联关系向背离,耦合度会有不必要的增加。
        在动态关系中第一重要的是动作的时序,即先后顺序。
       时空的特征决定了这世界上大多的事情皆有因果,也决定了程序中凡事必有先后。当我们明确了先做什么,再做什么,最后做什么之后,我们才能对事情真正有所把握。不管采用什么设计方法,都要让这类路线尽可能明晰。惟其如此,程序才更容易懂,因为这是正常人最基本的认知世界的方式。

对时序影响很大的一个因素是并行,并行的一个常见实现方法是启用多线程。多线程程序之所以难写,不在于线程本身的机制或同步多么难以掌握,而在于并发使整个程序中的逻辑变的更加复杂。
      最后做一点总结:软件是固化的思维,其基本组成是概念和逻辑。

时间: 2024-08-09 10:34:17

软件的本质的相关文章

Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折

Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象  1 1.2. 软件开发的过程就是不断抽象的过程 1)机器语言--> 汇编语言-->高级语言,这就是一个不断抽象的过程,1 1.3. 代码的抽象三原则_软件工程_酷勤网.htm1 1.4. "软件是存储.通信.UI(user interface)和业务逻辑的紧密结合体2 1.5. 在软件的生命周期中,较稳定的是存储和通信,最

阅读一些关于软件开发本质和开发方法的文章的体会与心得

在本次软件工程课程当中,我已经经历了一次比较成功的个人项目,一次比较失败的结对编程项目,以及即将开始的团队项目alpha阶段.在这段时间,应教师的要求,我开始阅读一些有关软件开发本质和开发方法的文章,在此记录一些体会与心得. 文章一: No Silver Bullet: Essence and Accidents of Software Engineering by Frederick P. Brooks, Jr. 文章网址: http://www.cs.umd.edu/class/spring

业务软件的本质,超越CRUD

经常写业务软件的开发会吐槽crud没有技术含量,想学新技术,但是学完新技术会发现又进入了crud的循环(学完mq发现只会发送和接收消息,学完redis发现只会读写缓存,学完zookeeper发现只会操作node节点).这种现象产生的原因是什么的?因为关注点一直是逻辑,而不是存储.而一项技术的底层和原理无非逻辑与存储.一个业务软件本质由两个部分组成:业务数据+业务逻辑,这有点像是面向过程=数据结构+算法,这道出了软件开发本质.业务数据层本质就是数据存储,storage,从组成形式来说,分为内存和磁

关于软件开发本质和开发方法的一些文章的读后感

       看了几篇与软件工程的瀑布.大泥球.教堂.集市和银弹等概念相关的经典文章,简单的谈一下自己的一些理解. 一.银弹 从自然法则上来说,我不相信银弹不会出现.或许银弹的发现会是软件工程发展的分水岭,只是不知道会不会到来,什么时候会到来. 这篇文章存在也不是一年两年了,而文章所提出的问题却还是没有得到根本性的改变.在做了这几次简单的只算得上编程而称不上软件项目的作业后,感触尤为深刻. 作者首先提出一个问题:软件开发技术的落后是由于存在软硬件发展的不协调和畸形.软件的发展远跟不上硬件.一开始

阅读软件开发本质和方法的收获

英语水品有限,好几篇英文文章看了也不懂,所以也没有看完,下面主要说说有中文翻译的几篇文章.又由于没有真正参与过大的软件工程,不好针对作者的观点进行评价,要读懂作者的意思就已经很困难了.<有人负责,才有质量:写给在集市中迷失的一代>作者觉得.COM时代泛滥是对IT/CS的一场灾难,他反对Raymond在其书中称颂的集市模式,同意Brooks在<设计原本>中提出的所谓质量只有在某人对它负责时才有意义的观点,并且认 为Unix大教堂就是一个很好的论据.作者的意思大概就是软件的架构应该由一

《SICP》读后感:关于软件本质的一点思考

摘要:软件本身不是目的,人类的需求才是目的,而软件只是达到目的的手段. 软件的本质在于控制复杂性,这个复杂性并非来自于计算机,也并非来自于现实世界,而是来自于人类的思维和知识体系. 软件被使用的广泛性,在于它所满足的人类需求的广泛性. 什么是软件? 从一个简单的例子说起,比如我想计算两个数的和,于是写下这样的python代码 print a + b 但是,这段代码是我的最终目的吗?显然不是,我需要把它在计算机上实际运行,并赋予a和b实际的数值.也许我是在水果,买了5块钱的苹果和10块钱的香蕉,然

Linux软件安装

软件安装方式: 1. rpm方式 该方式软件安装本质与Windows下安装软件方式一致,就是把软件包里面的二进制代码文件复制到系统指定目录(如 C://program files) 优点:软件安装非常方便 缺点:软件的个个组成部分比较固定,不灵活,需要手动解决依赖关系; 2.yum智能方式 该方式类似360的"一键安装",较智能. 该方式条件:1>可以上网 or 通过配置把软件放到指定位置(不联网的情况下) 好处:方便 一键安装,无需考虑软件依赖 3.源码编译安装 源码文件---

2. 软件有很多种,也有各种分类办法: ShrinkWrap (在包装盒子里面的软件,软件在CD/DVD上); Web APP (基于网页的软件); Internal Software (企业或学校或某组织内部的软件); Games (游戏); Mobile Apps (手机应用); Operating Systems (操作系统); Tools

 选取对你最相关的一类软件,  请回答:(web app)  1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的?  他们的目标都是盈利么?  他们的目标都是赚取用户的现金么?还是别的?        web最早起源于1980年蒂姆·伯纳斯-李构建的ENQUIRE项目,后英国人Tim Berners-Lee在1989年提出的web应用架构技术.从1992年开始兴起的技术包括JAVA,Javascript,Flash,Browers等技术的兴起,web app和桌

个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会

英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个原因: 1.复杂性(complexity): 首先我们来看一下作者对软件的定义,其大意是“软件的本质是对一连串相关的概念的构建”: The essence of a software entity is a construct of interlocking concepts: data sets, rela