对软件开发的反思之一--什么是软件

1. 关于软件的实质

什么是软件?它从哪里来,它有生命吗?当我在想到这个问题的时候,就像是哲学中要解决的一个根本问题,我们来自哪里,我们是什么,人生的意义又是什么?也就是冯友兰先生在《中国哲学简 史》中综合了古今中外的哲学思想后得出了一个我认为适合中国人的哲学定义:对于人生的有系统的反思的思想。

每一个人,只要他没有死,他都在人生中。这种思想,所以谓之反思的,因为它以人生为对象。人生论,宇宙论,知识论都是从这个类型的思想产生的。宇宙论的产生,是因为宇宙是人生的背景,是人生戏剧演出的舞台。知识论的出现,是因为思想本身就是知识。为了思想,我们必须首先明了我们能够思想什么; 这就是说,在我们对人生开始思想之前,我们必须首先“思想我们的思想”。

对于软件,我们大多数人认为,软件是人类思想的外延,软件是人类利用自己知识形态的技术,使用一种特殊的符号体系,它的生命来自于人类思维的过程,是人类将自己的思想传送给计算机这种工具,当产生的可执行文件被激活来运行时,这时软件就是人类意图的重现。也可以理解为人要做什么软件在做什么,因此说软件是人类思维程序的外化。

2. 抽象与具体

抽象不能脱离具体而独自存在。抽象化主要是为了使复杂度降低,以得到论域中较简单的概念,好让人们能够控制其过程或以综观的角度来了解许多特定的事态。

哲学中通常所说的抽象,指在认识上把事物的规定、属性、关系从原来有机联系的整体中孤立地抽取出来;具体是指尚未经过这种抽象的感性对象。黑格尔延伸了承认前面所说的抽象为抽象,但并不承认感性对象为具体。黑格尔认为具体是理性的具体,即具体概念,也就是以概念为本质的一切事物的多方面的规定、属 性、关系的有机整体性,以及它们在认识中的反映。认识开始只能得到一些抽象的规定性,它们是孤立的、片面的。随着认识的前进,愈是在后的概念所包含的规定 性愈多,因而内容愈丰富、愈具体、愈真实。

在软件设计中,设计模式可谓是将抽象与具体的关系发挥得最具淋漓的思想。我们随便从GOF的《设计模式:可复用面向对象软件的基础》中的设计原则,如针对接口编程,优先使用组合,封装变化,重构。都是对不同 使用场景下的抽象与具体,而做出的合理选择。

在软件整体设计与架构中,这种思想尤其重要,当需要考虑模块化解决方案时,可以定出多个抽象级别。抽象的层次要从总体设计到详细设计逐步降低。在软件总体设计中的模块分层也是由抽象到具体逐步分析和构造出来的。

抽象就是有选择的忽略,如何保证软件的灵活性设计,其核心思想就是面向对象中的抽象思想。“设计模式”、“架构”等等一系列的时髦的概念,其实就是 为了实现一个抽象层次的编程,以保证软件的灵活性。合理的利用抽象性,那么我们的软件的可读性、可维护性、灵活性、可扩展性等都会得很大的提高。我们也不能说抽象层次越高越好,我们说软件设计的上下文是不同的,我们不能为了抽象而抽象,毕竟我们不是慈善机构,开发软件的目的是为了客户满意,公司满意,我们满意,如果过于抽象就会增加培训、沟通成本,延长工期,甚至让项目遥遥无期。抽象与具体存在着一定的辩证联系。你要用发展的眼光去看待这个问题。

3. 发展的观点

我们经常在媒体中听到这样的观点:国家出现了很多社会现象,这些都是发展中的问题,如果你不发展,就不会有这些问题,只有不断的发展才能解决这些问题,发展的问题要用发展的眼光来解决。

事物总是在不断变化的,没有绝对静止的事物。世界上没有一成不变的东西,社会在变,政策在变,人的素质在提高,这是常态,我们应该明白这其中的道理。

计算机技术在发展,诸多的因素使得软件应用的环境也在不断发生变化,因此必须对软件进行改正性维护、完善性维护和预防性维护。我们在现在流利的软件开发方法,极限编程,可以很明白的看到这种思想在软件开发中的应用。正是我们使用这种发展的眼光,不断的迭带,不断的完善产品,不断的增加功能,而每一个版本都是一个可使用的版本这样的思路,我们总有可运行产品出现,从而使软件处于不断的改进之中。

4. 主客观的对立与统一

其实,哲学的产生本身就是主观与客观的对立统一。我 们以为我们自己为例,人的机能活动原理,是地球上固有的吗?如果没有客观物质,怎么会有人的发生活动原理?这就足以证明,主观与客观是不可分的相互作用, 即对立又统一。如果只在主观因素上说事,不但不通,相比之下,更显得思维之局限性。连一个有些哲学常识的人都能发现,很多的双生双灭现象,也就是由于链条 的关系,很多事物不能独存。其实,就是对立统一。这种对立存在,说明白就是不可能只存在一个的单一性,要有都有,事物就存在。要没有就都没有,什么也不存 在。那么,怎么会只有主观而没有客观呢? 哲学是理性很强的学问。如果,没有合理的逻辑推理,那么,只能说明思维理论存在纰漏或错误。哲学是人的机能活动的理性的产物。

由以上分析,我们知道,人们对客观事物的认识是客观事物的特性或特征在我们头脑中的反映,客观事物的存在不以我们的意志为转移。

认识到主客体之间的关系,我们很显示的观察到在软件生存期的各个阶段都可能发生主观认知与客观实际不一致的情况。在我们熟知的软件工程中,软件需求分析工作是软件生存期中决定性的一步。用户必须对软件功能和性能提出具体要求,并澄清一些模糊概念。而软件分析人员则要认真了解用户的需 求,把用户“做什么”的要求转换成逻辑模型并写出软件的需求规格说明,准确地表达用户的要求。软件工程师通常是在为他们原本不熟悉的专业领域的 用户群开发软件。而用户通常对计算机软件领域知识不熟悉。专业的差别以及每个人的知识阅历等客观条件的不同,会使得他们看待问题的角度也不同。在这种情况 下如果双方交流不充分,就会产生误解以及更严重的各说各理,“驴头不对马嘴”,大家可能觉得这不可思议,怎么可能呢,很无奈的是在我所从业的现实中这种现 象很普遍。这将严重影响需求规格说明的质量,最终导致软件工程的失败。

我们必须摒弃自以为是的狭隘意识,不要以自己的主观甚至是臆断影响 对事物的正确判断,从来做出错误的决策,而给软件的后续开发造成很大的困扰。

5. 联系的观点

一只蝴蝶翅膀的扇动,也可能会引起北美的一次飓风。主义认为,世界是普遍联系的整体,任何事物内部各要素之间以及事物之间都存在着相互影响、相互制约和相互作用的关系,恩格斯曾指出:“当我们深思熟虑地考察自然界或人类历史或我们自己的精神活动的时候,首先呈现在我们眼 前的,是一幅由种种联系和相互作用无穷无尽地交织起来的画面” 。这说明,世界上没有孤立存在的事物,联系是事物的客观本性,事物的联系是事物本身所固有的,而不是人们主观臆想出来的,没有联系的事物在世界上是不可能存在的。

从宏观的角度看,没有哪一个事物是孤立存在的。它总是和其他事物有着千丝万缕的联系。 所谓牵一发而动全身。

我们再来看看在软件工程中的现象。从某种意义上来说,软件生存期的前一阶段的工作总是为下一阶段做准备的,这个过程就是逐步的向前推进。如果前一阶段完成的质量不高,就会给后续工作带来更大的麻烦,从而会影响整个软件工程的进度。有人认为,人类能够创造的最复杂的产物是计算机软件。软件的复杂性来源于现实世界的复杂性,也就是说主要是来自它所反映的实际问题的复杂性。一般来说,现代软件已经早已经脱离那种手工作坊式的生产方式,一个软件会涉及多门学 科、多个领域、多个部门。要使开发的软件能够让用户满意,必须考虑到问题的方方面面,任何一处的疏漏都可能造成非常严重的后果。

6. 关于内容与形式

内容与形式是任何事物都具有的两个方面,软件开发也不例外,也必然有内容和形式的关系。内容与形式的对立使内容和形式成为两个可以分开的层面, 内容本身具有一定的形式,同时形式又是内容的外在表现。

这个思想主要体现在软件的用户界面是形式,而功能及性能是内容。作为用户与计算机的接口。没有良好的用户界面,就会导致用户体验差,从而直接影响用户对这个软件的印象。从我的经验来看,这决不是一件小事情,很多我们自认为很强大的功能,客户并不买账,因为也许是我们从开发人员的使用角度来设计的,没有考虑到用户的真实使用习惯,这样一来用户当然不会满意了。用户界面好坏其实直接影响到软件的竞争力。但归根结底来说,内容是最重要的。就算用户界面做的再精美,没有强大的功能、可靠的性能。这样的软件也是不会受到用户青睐的。两者的关系,正是内容与形式的关系,值得我们细细的思索。

7. 人在软件开发中的作用

二十一世纪最重要的是什么?是人才!这是勿庸置疑的。从人类起源开始的人类文明,无不是人类利用工具改造自然,社会,并在这一过程中所形成文化思想的文明过程。

当我想到计算机软件人的因素的时候,我首先想到了人与机器的关系,我们可以从很多经典的电影看到,如《终结者》,《黑客帝国》等都有这些话题的深入 探讨。

我们就是通过软件来利用计算设备去表达自己的思想。软件无疑是人高强度脑力劳动的产品。同时人也是软件的使用者。人利用自己制造的这一工具为进一步 认识世界和改造世界服务。在这一系统中人占据核心地位,发挥着主导作用。

人才是软件业永远不会过时的核心竞争力。我们国内很多企业没有意识到这个问题,很多人在抱怨我们的环境(包括我自己),但这也是事 实,国内的软件行业环境确实不容乐观,这一部分有我们从业人员水平良莠不奇的原因,但更大的原因和大环境有关,不过我们也发现这个环境也正在向好的趋势转 化。智力资源的新陈代谢对软件行业来说就好比是流通在企业中的血液,能增强企业的生产开发能力。我们不可能要求每一个软件业中的人员都成为多面手,因此对 于整个产业而言就需要一个比较合理的人才配比结构。在像印度这样的软件强国,人才层次结构一般有管理人才、软件与相关行业分析人才和软件工人三个层次,呈 金字塔形分布。

另外,我们软件的使用者的素质高低也是软件应用成败的关键因素之一。软件使用者的操作能力和操作习惯也必须是开发人员考虑到的一个重要因素。这些使 用者可能包括单位的决策层、管理干部、普通员工,他们在软件使用中的角色和作用也不尽相同。一套成功的软件系统,特别是管理信息系统,如果没有最高决策层 的有力支持,那么成功的可能性几乎就是零。而对直接操作软件的人员来说,没有充分培训也必然会导致错误及混乱,直接影响推行。

记得“程序员部落酋长Joel谈软件”在《软件随想录》中谈到了关于优 秀程序员的重要性,其中在26节“飙高音”中有一些有趣的结论:

聪明的程序员是平庸程序员工作效率一般高到4-10倍。也就是说,由于能力的差异,程序员的生产率有5倍到10的差距。

用许多平庸的程序员取代少数优秀的程序员,这种做法的真正问题在于,不管平庸的程序员工作多长时间,他们做出来的东西都无法像优秀程序员做得 那么好。

在一些需要灵气才能解决问题的情况下,这不仅仅是“生产率高10倍” 的问题,而是“普通程序员”永远都唱不出开发优秀软件所需要的那种高音。

他从对人才的尊重的角度得出了他的商业计划:最好的工作条件,最好的程序员,最好的软件,利润!可见,优秀人才在公司中具有不可或缺性,其待遇多于 普通者数倍是必须和合理的。

8. 对象和事物

好像听过这么一句话:人类永远无法认识完整的事物。因为我们认识到的总是事物的某一方面。我们所说的对象实际上是客观事物在人头脑里的反应,而事物则是不因人的认识发生改变的客观存在。同样一根铁棒,在钢材生产厂家看来,它是成品;在机械加工厂家看来,它是原料;在废品站看来,他是商品。成品、原料、商品,这三者拥有不同的属性,有本质的不同。为什么同一事物在不同人的眼里就截然不同了呢?这是因为我们总是取对我们有用的方面来认识事物。当这根铁棒作为商品时,它的原料属性依然存在,只是我们不关心了。在同一个企业里,对同一事物的认识也是在变化的,如一根被加工的铁棒,会经历从原料到半成品,再到成品的认识过程。因此,我认为:对象只是我们认识事物的某一方面,一个事物被我们抽象成了一个多面体,事物的不同方面总是同时存在。对象的存在与否,并不依赖于事物形体的存在。事物可以消失、变化,但对实体的认识却相对稳定,不会消失。

有些并不存在的事物,我们也能认识到,比如鬼。实际上我们并不是真的认为他存在,而是他的一些属性符合对鬼的定义。比如装神弄鬼、鬼头鬼脑。实际上,同一事物的不同方面是有关系的,比如原料与成品是同一事物众多方面中的两个方面,他们之间存在一种认识叠加效应。即随着我们与事物接触的增加,我们认识事物总是越来越丰富。而后面的认识总是建立在前面认识的基础上的。例如,在机械加工企业,铁棒一开始只有原料的这一方面的属性;被加工成型后,就具有了成品的这一方面的属性;如果加工失败,则具有废品的这一方面的属性。随着我们与铁棒的交互,我们对于铁棒的认识就逐渐增加了,表现在它的属性越来越多。请注意,在同一个企业,不同的岗位对同一根铁棒的认识是不同的。原料库的人认为它是原料,成品库的人认为他是成品。当一种认识(实体)存在后,就好像事物的一张照片,只反应了事物的一面,并且可以永久存在,不管事物是否消失。唯一的差别是,这种实体认识是否对当事者有用罢了。当某种认识对所有人都没有用时,比如错误的将废品认为成品,那么才有删除它的必要。

9. 内部属性和外部属性、自然属性和社会属性

每个属性都属于某个实体(对象),直接隶属于本实体的为内部属性,通过其它实体间接属于本实体的为外部属性。内部属性大致相当于自然属性,外部属性相当于社会属性。通常情况下,自然属性依附于自然存在的事物上社会属性依附于人类创造的事物上。比如铁棒VS铁棒的入库单,就分属于自然物与社会物。而数量与价格则分属于自然属性和社会属性。如对个人而言,自己的姓名、相貌、身高、体重,这些属性离开你之后就没有意义了。但是有些属性是间接的,比如你获得了某某荣誉称号、你的财产、你的英语等级。他们分别于某次评选、某些收益、某些考试相联系。这些信息分别存在于荣誉证书、银行存折、等级证书之中。这些外部属性不宜直接作为自己的属性,因为它们与你不是内聚关系,而是耦合关系。又如,当一根铁棒入库,铁棒本身的自然属性没有任何变化,变化的只是其社会属性。而这种社会属性又有独立的属性,并依附于某种载体上。如果铁棒入库,则会产生入库单这种记录其社会属性变化的东西。这个东西以外部属性的形式连接到铁棒这个实体上。简单来说,外部属性被称作“身外之物”,生不带来,死不带去。即实体创建时,外部属性(社会属性)不会当然存在,当实体消失时,外部属性(社会属性)依附于耦合实体(人类创造物)依然存在,不会消失。当然,在描述不必准确的场合,可以忽略耦合实体,而把耦合实体的关键属性放到本实体内部。但必须明白,这样做会让本实体过于复杂。要解决复杂的问题,则需要创建耦合实体,把外部属性放到耦合实体中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值