上一篇文章我谈到锻炼身体,远离疾病的话题,表明了身体之重要,其实建立在健康基础上的精神也很重要,这次就结合哲学来谈一谈思想对我们的影响。
近几年,笔者非常喜欢读一些古今中外的哲学著作,加之笔者是也是一个软件行业的程序员,哲学是科学之王,在不断的学习用哲学的观点来指导自己软件开发与应用的工作中,自己也有了些许的感悟,以期在软件开发思维上对您有所启发。
一关于软件的实质
什么是软件?它从哪里来,它有生命吗?
当我在想到这个问题的时候,就像是哲学中要解决的一个根本问题,我们来自哪里,我们是什么,人生的意义又是什么?也就是冯友兰先生在《中国哲学简史》中综合了古今中外的哲学思想后得出了一个我认为适合中国人的哲学定义:对于人生的有系统的反思的思想。
每一个人,只要他没有死,他都在人生中。这种思想,所以谓之反思的,因为它以人生为对象。人生论,宇宙论,知识论都是从这个类型的思想产生的。宇宙论的产生,是因为宇宙是人生的背景,是人生戏剧演出的舞台。知识论的出现,是因为思想本身就是知识。为了思想,我们必须首先明了我们能够思想什么;这就是说,在我们对人生开始思想之前,我们必须首先“思想我们的思想”。
对于软件,我们大多数人认为,软件是人类思想的外延,软件是人类利用自己知识形态的技术,使用一种特殊的符号体系,它的生命来自于人类思维的过程,是人类将自己的思想传送给计算机这种工具,当产生的可执行文件被激活来运行时,这时软件就是人类意图的重现。也可以理解为人要做什么软件在做什么,因此说软件是人类思维程序的外化。
二抽象与具体
抽象不能脱离具体而独自存在。抽象化主要是为了使复杂度降低,以得到论域中较简单的概念,好让人们能够控制其过程或以综观的角度来了解许多特定的事态。
哲学中通常所说的抽象,指在认识上把事物的规定、属性、关系从原来有机联系的整体中孤立地抽取出来;具体是指尚未经过这种抽象的感性对象。黑格尔延伸了承认前面所说的抽象为抽象,但并不承认感性对象为具体。黑格尔认为具体是理性的具体,即具体概念,也就是以概念为本质的一切事物的多方面的规定、属 性、关系的有机整体性,以及它们在认识中的反映。认识开始只能得到一些抽象的规定性,它们是孤立的、片面的。随着认识的前进,愈是在后的概念所包含的规定性愈多,因而内容愈丰富、愈具体、愈真实。
在软件设计中,设计模式可谓是将抽象与具体的关系发挥得最具淋漓的思想。我们随便从GOF的《设计模式:可复用面向对象软件的基础》中的设计原则,如针对接口编程,优先使用组合,封装变化,重构。都是对不同使用场景下的抽象与具体,而做出的合理选择。
在软件整体设计与架构中,这种思想尤其重要,当需要考虑模块化解决方案时,可以定出多个抽象级别。抽象的层次要从总体设计到详细设计逐步降低。在软件总体设计中的模块分层也是由抽象到具体逐步分析和构造出来的。
抽象就是有选择的忽略,如何保证软件的灵活性设计,其核心思想就是面向对象中的抽象思想。“设计模式”、“架构”等等一系列的时髦的概念,其实就是 为了实现一个抽象层次的编程,以保证软件的灵活性。合理的利用抽象性,那么我们的软件的可读性、可维护性、灵活性、可扩展性等都会得很大的提高。我们也不能说抽象层次越高越好,我们说软件设计的上下文是不同的,我们不能为了抽象而抽象,毕竟我们不是慈善机构,开发软件的目的是为了客户满意,公司满意,我们 满意,如果过于抽象就会增加培训、沟通成本,延长工期,甚至让项目遥遥无期。
抽象与具体存在着一定的辩证联系。你要用发展的眼光去看待这个问题。
三发展的观点
我们经常在媒体中听到这样的观点:国家出现了很多社会现象,这些都是发展中的问题,如果你不发展,就不会有这些问题,只有不断的发展才能解决这些问题,发展的问题要用发展的眼光来解决。
事物总是在不断变化的,没有绝对静止的事物。世界上没有一成不变的东西,社会在变,政策在变,人的素质在提高,呵呵,就连曾经海誓山盟的恋人也会分手,这是常态,我们应该明白这其中的道理。
计算机技术在发展,诸多的因素使得软件应用的环境也在不断发生变化,因此必须对软件进行改正性维护、完善性维护和预防性维护。我们在现在流利的软件开发方法,极限编程,可以很明白的看到这种思想在软件开发中的应用。正是我们使用这种发展的眼光,不断的迭带,不断的完善产品,不断的增加功能,而每一个 版本都是一个可使用的版本这样的思路,我们总有可运行产品出现,从而使软件处于不断的改进之中。
笔者前几年曾经和朋友在一起搞了一个小公司,原来只有我一个人,后来人不断的增加,以至到后来发展到10个 人左右,再后来由于经验及能力不足,以至失败,当然这其中有很多教训。失败乃是成功之母嘛,从中吸取教训,也未尝不可。好在我明白这样的道理,不至于自己的是如此的痛苦,本来我就是两手空空嘛,没有什么可痛苦的。哲学就这一点好啦,它总能说服你,让你明白阴阳互易的道理,用发展的观点看待这些问题,看开 些,人生是在不断的发展的,每个人的人生都是大有可为的。
四主客观的对立与统一
其实,哲学的产生本身就是主观与客观的对立统一。
我 们以为我们自己为例,人的机能活动原理,是地球上固有的吗?如果没有客观物质,怎么会有人的发生活动原理?这就足以证明,主观与客观是不可分的相互作用,即对立又统一。如果只在主观因素上说事,不但不通,相比之下,更显得思维之局限性。连一个有些哲学常识的人都能发现,很多的双生双灭现象,也就是由于链条 的关系,很多事物不能独存。其实,就是对立统一。这种对立存在,说明白就是不可能只存在一个的单一性,要有都有,事物就存在。要没有就都没有,什么也不存在。那么,怎么会只有主观而没有客观呢?哲学是理性很强的学问。如果,没有合理的逻辑推理,那么,只能说明思维理论存在纰漏或错误。哲学是人的机能活动的理性的产物。
由以上分析,我们知道,人们对客观事物的认识是客观事物的特性或特征在我们头脑中的反映,客观事物的存在不以我们的意志为转移。
认识到主客体之间的关系,我们很显示的观察到在软件生存期的各个阶段都可能发生主观认知与客观实际不一致的情况。在我们熟知的软件工程中,软件需求分析工作是软件生存期中决定性的一步。用户必须对软件功能和性能提出具体要求,并澄清一些模糊概念。而软件分析人员则要认真了解用户的需求,把用户“做什么”的 要求转换成逻辑模型并写出软件的需求规格说明,准确地表达用户的要求。软件工程师通常是在为他们原本不熟悉的专业领域的用户群开发软件。而用户通常对计算机软件领域知识不熟悉。专业的差别以及每个人的知识阅历等客观条件的不同,会使得他们看待问题的角度也不同。在这种情况下如果双方交流不充分,就会产生误 解以及更严重的各说各理,“驴头不对马嘴”,大家可能觉得这不可思议,怎么可能呢,很无奈的是在我所从业的现实中这种现象很普遍。这将严重影响需求规格说明的质量,最终导致软件工程的失败。
我们必须摒弃自以为是的狭隘意识,不要以自己的主观甚至是臆断影响对事物的正确判断,从来做出错误的决策,而给软件的后续开发造成很大的困扰。
五联系的观点
一只蝴蝶翅膀的扇动,也可能会引起北美的一次飓风。
马克思主义认为,世界是普遍联系的整体,任何事物内部各要素之间以及事物之间都存在着相互影响、相互制约和相互作用的关系,恩格斯曾指出:“当我们深思熟虑地考察自然界或人类历史或我们自己的精神活动的时候,首先呈现在我们眼前的,是一幅由种种联系和相互作用无穷无尽地交织起来的画面”。这说明,世界上没有孤立存在的事物,联系是事物的客观本性,事物的联系是事物本身所固有的,而不是人们主观臆想出来的,没有联系的事物在世界上是不可能存在的。
从宏观的角度看,没有哪一个事物是孤立存在的。它总是和其他事物有着千丝万缕的联系。所谓牵一发而动全身。
我们再来看看在软件工程中的现象。从某种意义上来说,软件生存期的前一阶段的工作总是为下一阶段做准备的,这个过程就是逐步的向前推进。如果前一阶段完成的质量不高,就会给后续工作带来更大的麻烦,从而会影响整个软件工程的进度。有人认为,人类能够创造的最复杂的产物是计算机软件。软件的复杂性来源 于现实世界的复杂性,也就是说主要是来自它所反映的实际问题的复杂性。一般来说,现代软件已经早已经脱离那种手工作坊式的生产方式,一个软件会涉及多门学科、多个领域、多个部门。要使开发的软件能够让用户满意,必须考虑到问题的方方面面,任何一处的疏漏都可能造成非常严重的后果。
六关于内容与形式
内容与形式是任何事物都具有的两个方面,软件开发也不例外,也必然有内容和形式的关系。内容与形式的对立使内容和形式成为两个可以分开的层面,内容本身具有一定的形式,同时形式又是内容的外在表现。
这个思想主要体现在软件的用户界面是形式,而功能及性能是内容。作为用户与计算机的接口。没有良好的用户界面,就会导致用户体验差,从而直接影响用户对这个软件的印象。从我的经验来看,这决不是一件小事情,很多我们自认为很强大的功能,客户并不买账,因为也许是我们从开发人员的使用角度来设计的,没 有考虑到用户的真实使用习惯,这样一来用户当然不会满意了。用户界面好坏其实直接影响到软件的竞争力。但归根结底来说,内容是最重要的。就算用户界面做的再精美,没有强大的功能、可靠的性能。这样的软件也是不会受到用户青睐的。两者的关系,正是内容与形式的关系,值得我们细细的思索。
七人在软件开发中的作用
二十一世纪最重要的是什么?是人才!这是勿庸置疑的。
从人类起源开始的人类文明,无不是人类利用工具改造自然,社会,并在这一过程中所形成文化思想的文明过程。
当我想到计算机软件人的因素的时候,我首先想到了人与机器的关系,我们可以从很多经典的电影看到,如《终结者》,《黑客帝国》等都有这些话题的深入探讨。
我们就是通过软件来利用计算设备去表达自己的思想。软件无疑是人高强度脑力劳动的产品。同时人也是软件的使用者。人利用自己制造的这一工具为进一步认识世界和改造世界服务。在这一系统中人占据核心地位,发挥着主导作用。
人才是软件业永远不会过时的核心竞争力。我们国内很多企业没有意识到这个问题,很多人在抱怨我们的环境(包括我自己),但这也是事 实,国内的软件行业环境确实不容乐观,这一部分有我们从业人员水平良莠不奇的原因,但更大的原因和大环境有关,不过我们也发现这个环境也正在向好的趋势转
化。智力资源的新陈代谢对软件行业来说就好比是流通在企业中的血液,能增强企业的生产开发能力。我们不可能要求每一个软件业中的人员都成为多面手,因此对 于整个产业而言就需要一个比较合理的人才配比结构。在像印度这样的软件强国,人才层次结构一般有管理人才、软件与相关行业分析人才和软件工人三个层次,呈
金字塔形分布。
另外,我们软件的使用者的素质高低也是软件应用成败的关键因素之一。软件使用者的操作能力和操作习惯也必须是开发人员考虑到的一个重要因素。这些使用者可能包括单位的决策层、管理干部、普通员工,他们在软件使用中的角色和作用也不尽相同。一套成功的软件系统,特别是管理信息系统,如果没有最高决策层 的有力支持,那么成功的可能性几乎就是零。而对直接操作软件的人员来说,没有充分培训也必然会导致错误及混乱,直接影响推行。
记得“程序员部落酋长Joel谈软件”在《软件随想录》中谈到了关于优秀程序员的重要性,其中在26节“飙高音”中有一些有趣的结论:
聪明的程序员是平庸程序员工作效率一般高到4-10倍。也就是说,由于能力的差异,程序员的生产率有5倍到10的差距。
用许多平庸的程序员取代少数优秀的程序员,这种做法的真正问题在于,不管平庸的程序员工作多长时间,他们做出来的东西都无法像优秀程序员做得那么好。
在一些需要灵气才能解决问题的情况下,这不仅仅是“生产率高10倍”的问题,而是“普通程序员”永远都唱不出开发优秀软件所需要的那种高音。
他从对人才的尊重的角度得出了他的商业计划:最好的工作条件,最好的程序员,最好的软件,利润!可见,优秀人才在公司中具有不可或缺性,其待遇多于普通者数倍是必须和合理的。
后记:
作为一个人,我想我们不能一味沉溺于物质的享受,同时也要精神世界的丰盈。两者要兼顾的实现相容。“我们需要牛奶面包,也需要音乐艺术;我们需要挣钱活命,但也需要思想自由的飞翔”,我喜欢哲学,并非是从实用的观点来看待问题,它并非是对我们的成长没有意义的,而是通过哲学中的某些思想来关照我们的生活,工作,甚或是人生。哲学无愧是科学之王,它能站在更高远处来探视我们的思想,指导和启迪我们,使我们用理性的眼光来看待问题,发现问题,分析问题,解决问题。并能给我们平凡的人生增加更多思维的乐趣。
写这篇文章,大约花了一个下午的时间,边写边想,思路慢慢的打开,也算是对自己的所从事工作的一份更高级别的抽象和总结吧,由于笔者自感对于哲学还处于入门阶段,对事物抽象概括能力还不是很到位,有不合理之处还请各位见谅,仅以此希望能给诸位以启发。(其中有些关键概念并没有太多涉及,如主流支流,整体部分,存在论,本体论,唯物唯心,及中国哲学的入世与出世,指导科学的自然辩证法等等相关内容也很是精彩,感兴趣的朋友不妨择其一读。)