什么是软件?如何理解软件?

来源:百度文库 编辑:神马文学网 时间:2024/04/27 13:31:02
我们这个世界正在经历一个伟大的时代的转变。这个变化就是由大规模的物理产品的生产转换到大量的社会产品的自发生产。我们知道中国正处在一个工业化的阶段。这个工业化,英国400年前完成,美国200年前完成。中国现在应该说还在工业化进程中,(以工业化和市场化导致大规模的在市场上的交易,由于大规模交易的发生而导致社会的变化。)很多制度上仍待完善。这个工业化,就是大规模的物理产品的生产。
但美国正在经历一个时代的变化。在美国,已经没有什么制造业。它的生产已经不是大规模的物理产品的生产,而是社会产品的生产。所谓物理产品,就是吃的穿的等物理上的产品。社会产品是精神上的产品,如音乐或社会需求。社会需求是多层次的,需要多种多样的社会产品的满足。在大规模物理产品的生产时代,只有有大规模需求的物品,才会被生产,所以对社会各层次的需求的满足是极其缺乏的。然而随着互联网降低交易成本及连接大众,社会产品的生产处于上亿规模的爆炸式增长。我们将看到在精神领域和社会需求领域,大量的新的“产品”将会被创造出来。这是一个非常大的空间,以前我们对这个领域的满足几乎是空白,而在社会产品的大生产时期,这个空白会逐渐被填补。
比如说独立音乐家,艺术家,他们如何实现自己的艺术,同时能够靠自己的艺术很好的养活自己。他们如何与其他领域的艺术家自由合作。比如说音乐家和摄影家合作,直接制作唱片,在网上发布。比如说如何解决老年人的相对的孤独问题。或是如何扩大年轻人的交际范围,年轻人更容易找到志同道合的朋友一起追求共同的事业。或者一个公司内部如何实现更好的合作或成为学习性的组织等等。这些都是社会需求。
而促使这些社会产品的有机生产成为可能的,则是软件和网络的发展。这里我们需要理解软件(和网络)的本质,理解软件的发展,我们才可以理解我们这个时代,并明白如何更好的去创造这个时代。
什么是软件?
计算机科学不是仅仅关于计算机的科学,它是人类世界和物理世界的桥梁。
Edsger Dijkstra 说这门学科因为被错误的贯以“计算机科学”的名字而使整个事业受到了极大的伤害。“计算机科学”的叫法,就象是把外科手术称作“刀子科学”一样。而这个概念深深的扎根于人们的意识里,人们认为“计算机科学”就是关于这些机器和它们的周边设备的科学。(“...theharm was done: the topic became known as ‘computer science’---which,
actually, is like referring to surgery as ‘knife science’ --- and it was firmly implanted in people's minds that computing science is about
machines and their peripheral equipment”)
我在高考填志愿时碰到一个问题,就是要选择文科还是理科。大几岁的兄长问我是更喜欢人的世界,还是物理世界。(当时我想,人怎么可能只去关心物理世界,那还不会疯掉吗?)我家是理工科背景,我也一直理工科成绩很好。但我自小对文科就有很大的兴趣,喜欢阅读。所以很难取舍。选了理科的很大一个原因是觉得文科没有太大的必要去作为一门专业去学。上了大学,第一次上计算机课,第一次编程,却开始对计算机一见钟情。发现其实计算机科学是人类世界和物理世界的桥梁。编程就是给你大脑中的思想给一个具体的现实的形式(Bill Joy said that software is to giveideas a concrete form.)。从我的阅读里,我知道这世界上几千年以前的人就有很好的想法,但是不能实现,因为历史条件的限制。现在社会里很多学文科的人有很多想法,但都是在脑子里,没有经过检验。而编程,却是对思想最好的检验。你要把思想用数学的模式表达出来,要能在机器上运行,还要大家都喜欢用。这就是对思想最好的检验。看着思想能够转化成代码在机器上跑,运行出结果来,真是非常美妙的事情。
Python 编程语言的创造者Guido说编程在未来将成为一个新的文盲的标准。因为编程是一个更好的表达思想的工具。一个成功的程序,就是一个人在某一领域的经验的表达。通过使用和阅读程序,就是对这些经验的学习。所以相对于文字写作,编程是更好的表达,存储和分享知识的工具。所以Guido说要设计一个每一个人都会用的编程语言。(对每一个人都能编程,应该有一个修正,就是如果你有某一领域的经验,并且能够逻辑的数学的表达你的思想,经过很短时间的训练,你就应该能够编程,用程序来表达你在这一领域的专业知识。)现在我们可能还不能完全达到,但这应该成为软件工程人的目标。
如何设计好的编程语言能够很好的表达人的思想帮助解决人的问题,这里有很多可以讲。这里不展开。只简单的说,经过这么多年的实践,我们走了很长的路,取得了很大的进展,慢慢学会了如何更好的用软件表达人的思想,以及如何处理人类社会上亿级的复杂度的问题。这条路,包括从汇编语言到对象化编程,到Agile Programming (敏捷编程)和Dynamic Languages。 开源运动和Web2.0也应该在这个背景下理解。
Agile Programming 和 Web2.0 可以说是编程人员经过数年的实践,摸索出如何写与人密切相关的软件的方法。虽然软件有主要是以操纵机械为目的的软件,但是因为软件是人类世界和物理世界的桥梁,软件的核心应该是解决社会问题,比如说教育问题。与人密切相关的软件有高度的复杂度,一直是软件人员的难题。这些难度有以下几点:
*一般来说,技术人员不懂社会问题(虽然我认为他们应该懂,而且他们的职业也要求他们懂。这大概就是Dijkstra说的已经造成的harm吧)
*即使是社会学家,对这些社会领域也不是真的理解。社会学科,在很大程度上是个笑话。比如说教育,看学术界的教育理论是浪费时间。所以软件人员在做这一类软件时,找不到好的理论作指导。他们唯一的办法是用软件去模索这些社会领域,尤其是通过让用户参与这个过程。
*社会领域很复杂。经常涉及到很多人的集体的问题。所以用户的参与就很重要。
*易变性,需要软件的弹性大,能够跟的上变化
*需要照顾到的人群很大,用户要求会有很多不同
*量大,需要有海量的内容才能检验软件的效果,比如说教育软件
总的来说,社会领域是充满着生命力的。所以社会软件(社会软件就是用软件去解决社会问题)必须是有机的,探索性的,有用户一起参与的。Agile Programming 和 Web2.0 就是经过多年实践摸索出来的行之有效的在这些社会领域编程的方法。它们包括的许许多多方面的技术和经验,许多人试图从其他一些角度去理解这些技术和经验。但你如果把他们理解成如何写与人密切相关的软件的方法就很容易理解。
Christopher Alexander 的 Nature of Order 里讲人类的社会学科受到物理学科的误导,试图用在研究物理学科时很成功的一套方法去研究社会学科,结果是误入歧途。物理世界是我们的外在世界,我们需要用物理的方法去研究。但人的世界是我们直接能够感知的世界。有个笑
话说有一个社科的研究项目,是研究为什么在监狱里的囚犯想逃跑。我在作elearning研究时看了很多的教育理论和论文,没发现一点指导意义。我们能够直接感知我们的内心世界。我们本身就是自然,所有自然的奥妙都已经在我们内心。通过禅坐和静心的方法,反观自身,我们就可以了解这个世界的一切。传统科学不能了解人的心,因为当你把你自己排除在外,你怎么去了解你自己。
人类文明的两大硕果,一是古希腊文明传承下来的科学和对人性的关注,一是古印度的哲学思想,尤其是佛教。要了解我们自己,我们从哪里来,我们的意识如何形成,可以学习佛所教的。也并不一定要学,常常反观自身,不时回归自然和儿童时代,在社会中慎行承担责任就好。而要去了解社会,去解决社会问题,软件是一个很有效的工具,因为软件有执行力。社会学科很难做到大规模的采样,而网络软件因为有很多用户的参与,则很容易做到。而Web2.0强调让用户很容易能提供自己的内容,则更是有了丰富的信息。而软件随用户的需求不断改进,则是一个摸索了解解决社会问题的路,直接有用户的反馈,直接有改进的解决方案。
所以我们可以看到由于软件是连接人类世界和物理世界的桥梁,而又由于网络的连接,使得我们有了一个很有效的直接摸索,解决社会问题的工具。
由于网络软件降低了社会交易的成本,社会产品的生产将呈现爆炸性的成长。我们将经历工业化后的又一个社会大转型,社会结构会有根本性的改变,这就好比软件编程里的refactoring。所以我这里讲的编程是个广义的编程,把整个社会看作一个编程的平台,它们本质上是相同的。这样去看,我们从计算机编程里积累的经验可以带到社会编程中去。下面,我就想讲讲Principle of playing (玩的原则)和 Build a better a playground (建一个更好的玩地)。
玩的原则是我受Python的启发而提出的。Python语言本身充分体现了这个原则。Python很容易学,有很平的学习曲线,也很好玩。用Python作的项目都有这个特点,一般大家把这种风格叫做 Pythonic。 从Python里,可以很具体的感觉到玩的原则。比如说Python
的 Interactive Console,你就是在盒子里直接玩那些objects, 而不是象Java一样的黑箱。Python的tutorial很简介扼要,容易上手,在较短的时间就能掌握基本的Python编程。其他还有许多具体的Python语言设计时的很多取舍都可以感受到玩的原则。这样的玩的原则,在unix的设计中也可以感觉到,它就是要系统管理员很容易的在系统里玩。
设计一个软件,有很多的设计理论,条条款款的很多,不容易记,也常会导致滥用,很多也要看具体的场合。但如果把持玩的原则就可以很灵活的适时处理各种情况。
下面简单总结一些玩的原则。具体的应该还有更多,当你在编程中体会到一些好的美的东西,你就可以看看是不是蕴含了玩的原则在里面。
*透明,可视性。象上面讲的,你可以直接在Python的 Interactive Console玩objects, 而不是象Java一样的黑箱。
*容易试。可以直接上手。即使很复杂的系统,由于复杂度被分层化,你可以先在底层玩,玩熟了,在那个基础上再玩高层的。
*一切都在你的指尖,很易获取。
*每一部分的独立性和完整性。当你就是玩这一部分时,不需要考虑太多的其他部分。
*沟通性。每一部分独立,但对外界很友好,有很清晰的对外界面,一看就知道是干嘛的,能做什么。
*由于每一部分的独立性完整性和沟通性,很容易将各个部分随机组合在一起玩。
*尽量简单直接,不增加不应有的复杂度
*当复杂度增加,比如说元素的数量增加到超过6个时(一般来说,人脑可以比较容易的同时把6样东西放在脑中对它们处理),就需要分层或分成不同的部分。保证每一层或每一部分的元素不要太多。
由于社会产品的剧增,社会需求会得到越来越丰富的满足,人类将进入高度复杂的社会。计算机编程最大的问题就是如何处理复杂度。而我们从计算机编程学到的处理复杂度方法,可以用于更广度的社会编程。玩的原则就可以用于我们对社会的编程。而这个社会编程,就是要建立一个更好的玩地(Build a better a playground )。
我看人类的历史是一个人类如何组织的历史,而人类社会的变迁,就是不断增加生命力和相应的复杂度,以及整个社会变成一个更好的玩地的过程。人类社会的发展有很多合力,在资本主义社会,金钱资本成为主要的力量,取代了暴力和血缘,使得社会成为一个相对于封建社会来说更好的玩地,在这个玩地上,人有更公平的机会。但获得既有地位的大资本家经不住诱惑,开始用种种手段维护他们的既得权力,开始在社会中设障,阻止人有公平的机会。这是当前西方社会的矛盾。而有一种力量,是真正社会前进的推动力,它来自社会中的每一个人。我把它叫作和平的力量,它是每一个人对美,爱和乐趣的追求。这些是每一个人心中
都有的力量。这些和平的力量一直以来处于潜伏的地位,但确是缓慢推动历史前进的力量。而在社会产品的自发生产阶段,这些和平的力量将会彰显为社会的主要力量。资本将服务于这些和平的力量,而不是支配。
在这个过程中,我们将建立一个更好的玩地。网络软件将成为这个玩地的核心骨架。从开源软件里获取的软件和组织经验将被推广到社会其他领域,从而推动社会开放组织的建立。社会组织的模式会更多样化,就好像软件里的组件一样,有时仅仅是完成在某一短时期的一项任务而形成,随着任务的完成而解散。社会组织会非常开放,每一个社会组织都应成为学习性的组织。要成为学习性的组织,就要求组织的对外对内的透明性,组织有责任承担对外的教育责任,使得外界很快能清楚组织的公用和结构,以及该组织工作领域的知识。对内组织也应该是个学习性的组织,成员间开放交流,有多种自由的合作关系,采用类似开源的合作方式(可以是内部的开源)。
在这个新的社会玩地里,会有很多组织成长起来,它们都具备开放组织的特性,满足社会某个方面的需求,整个社会成为一个很好玩的玩地。年轻人可以真的很自由的去学习,去尝试不同的东西,可以很容易找到志同道合的朋友或不同领域的艺术家进行合作。
整个社会因此而更有生命力,也成为自发的高度复杂的社会。
所以我们看到由于软件将人类大脑的世界与物理世界相连,从而开放了人类的大脑的世界,社会空间大大打开。而由于网络,每一个人都有的和平的力量被连在一起,终于成为社会中最重要的力量。通过软件,我们去探索这个人类社会的空间,丰富我们的社会,建设一个更好的玩地。这是一个艰巨的任务,也是非常好玩的事情。
这是人类历史上绝无仅有的好时机,也是人类继大工业化后的又一次社会大转型。上一次由于工业化市场化带来的社会转型,中国迟迟的落在了后面,数千年不能完成。这里我要提出一个问题,就是我们文化是不是有这种能力完成这样大的社会转型。用心揣摩一下,工业化市场化带来的社会变化有多大,比如说货币的演变就很了不起,需要很大的创新能力经过许多年的积累方可完成。那么在我们即将面临的人类世界的下一个社会大转型,我们现在中国这块土地上的文化及社会机制有没有可能有这么大的包含的能力去完成。这是我的问题。
我们应该把编程看作是广义的人类社会的编程,而不是仅仅是计算机上的编程。Interactive Computing 的理论把人和机器当作一体的computing,所以衡量软件的performance效能,就不能只看在计算机上跑的快慢,还要考虑人学习和使用软件的时间。这样设计软件时如果
要考虑performance效能的标准,就不能只考虑在计算机上跑多快,还要考虑人机界面人与机器之间的交互是不是简单自然。而如果我们认为人脑是最好的电脑,那么要提高performance效能,就应该充分考虑人如何玩这个软件。
另外,编程的过程也就是作决定的过程。做一个新领域的较大型的软件,会有上万上亿的决定需要做,涉及到好几个层面,有轻重缓急,每一个决定后面就是代价,技术上需要花多少时间。如何最有效的作这些决定,就是编程的学问。这个知识,对社会管理是一样的。
这里就粗略的讲这些,内容已经不少。更多的内容,包括如何理解生命力,和平的力量,人的意识的形成(个体意识和社会意识),人类社会中能量的转换,这些与计算机科学间的关系,, Christopher Alexander 的理论,什么是新的科学等等,这里就不再展开。
来源:软件和社会转型