面向对象的哲学源头与软件工业本质与未来趋势 – BradCox


亚里斯多德以来,哲学家一直在与存在概念作斗争。为什么我们要研究观察我们在世界上看到的东西?这些事物是如何在那里的?有目的吗?它们会永远存在吗?我们是由与其他所有事物一样的东西构成的,还是我们拥有其他物体所缺乏的仇恨或灵魂?
1714年,戈特弗里德·莱布尼兹(Gottfried Leibniz)出版了《拉莫纳多洛基》(La Monadologie),他在其中提出,事物对象是由不可分割的实体(称为Monads单子或原子)构成的。您看不到Monads单子内部,它具有控制其动作和激情的内部状态。Monad可以原子方式创建或销毁,但不能部分建造或部分消灭,因为它们是“没有零件的简单物质”。(banq注:这里有微事务概念,事务的原子性是要么全部创建,要么全部不创建,不会部分创建,这也是DDD聚合的重要定义)
这并不代表形而上学探索的顶峰。实际上,到20世纪,马丁·海德格尔彻底颠覆了整个领域。在他1927年的《存在与时间》简介中,他提出了你不能问“什么是存在”的问题,因为问题本身以对“是”一词的理解为前提(banq注:海德格尔的Being很难有中文词语对应,被误翻译成 “存在”,其实还有“是”的作用,“什么是存在” 等同于询问 “什么是是”?),换句话说,它依赖于对存在的理解。我们对存在存在( being of Being)的理解可以置于其中。

因此,海德格尔发起了现在所谓的现代诠释学,其中,“事实(真相)”不是在我们的经验之外代表了一个基本的真实世界,而是一种根据我们的经验,观点和历史提供的有效解释。(banq注:世界是完全主观的,没有置于我们主观认识之外的真实世界,康德认为客体不可知,我们以为的真相都是自以为是的真相,对这些真相的执着好像是对真理追求,其实是对自以为是的真理的追求)。

当然,计算机计算会花费了很长时间,而没有人质疑它与现实之间的关系。计算机被视为纯逻辑领域,在其中执行机械计算指令的过程或例程(图灵学校)或对经过数学转换的数据起作用(教会学校)。这两种范例都没有对所作用的数据本身的含义或解释保持沉默,这些数据业务含义留给使用者解读。(banq注:计算机科学只是一种形式逻辑,正如对人的说话内容不在意,而是注重说话的形式,如音调、场景和上下文和动机)

存在being的概念在形式上被逻辑学家识别为一种本体论ontology,但海德格尔称之为本体Ontics。(海德格尔说,本体论Ontology是对Being的研究,而Ontics本体只是在一个接受了存在being的系统内的事物的研究。banq注:Ontology与Ontics区别是“是”与“是什么”的区别,前者研究“是”,后者研究“确定了“是”,但它是什么呢?注重什么东西”)。
存在being概念首先缓慢地进入计算领域,然后一次性所有进入了计算领域。体现在:一开始Simula(第一个面向对象的编程语言)通过引入软件"类Class"打破了计算机外部事物与计算机编写程序之间的障碍。(banq注:计算机提供了“是”这个计算的形式,而现实世界提供了“什么对象”,用于计算的内容)。
现在,程序员已经可以说“计算机中这段代码是一颗星星(banq注:一颗星星表示什么对象或东西,代表计算机外部的、业务领域中的事物))”,或表示是一个动物细胞或一个雇员,他们可以说“所有[模拟]星星都具有有关自身的信息”,“所有[模拟]星星都可以执行这些业务操作”。
(banq注:使用计算软件的类class概念代表现实世界实体,而不是使用数据结构表达现实世界实体,是有其哲学逻辑推理背景的,不是一种拍脑袋形象比喻或模拟,喜欢形象比喻思维的人认为“class类=现实中某个实体对象”是一种比喻,比喻不是科学哲学思维,是文学思维)

Xerox PARC的研究人员在Alan Kay的Dynabook概念和Smalltalk编程环境的背景下提出了这些想法,并最终在1981年8月发行的Byte杂志上发布了有关其“面向对象”编程系统的信息。Smalltalk中的Object清楚地反映了莱布尼兹(Leibnizian)Monadic对世界的模拟:可以创建或销毁对象(单子或原子),不管它们存在或不存在。它们封装了私有数据,这些私有数据是从外部无法访问的,但是可以通过提供的函数方法或行为被访问,包括通过接收消息来更改其内部状态。至关重要的是,对象本身决定了接收消息时的处理方式,在命名过程时如果未找到对象时,这就决定了某种程度的间接性和隔离性。

充分利用这种软件结构方式意味着对软件的设计和构建方式有完全不同的思考。丹尼尔·罗布森(Daniel Robson)是Smalltalk上的Byte问题的撰稿人之一,他承认,接触新鲜事物要比从软件的程序观点转变范式容易。

……关于如何以面向对象的方式创建软件系统的基本思想对于那些对软件系统的本质没有先入之见的人来说更为自然。

面向对象的编程消除了我们要为其构建软件的事物(业务领域或需求)与所构建软件之间的概念障碍。现实世界中的所有人员,流程,组织,人工制品和自然资源都可以具有对象形式的类似软件化身,可以通过在软件系统内发送消息来进行交互。在1980年代,一小批程序员,作家和教育工作者发现,这不仅意味着改变了软件的编写方式,而且还改变了人们对软件以及软件创建环境的看法。

布拉德·考克斯就是其中之一。从表面上看,Objective-C看起来像是一种工具,用于设计在内部执行C程序的对象,实际上就是这样做的。但是,Objective-C诞生于对软件的需求,就像英特尔对硬件所做的那样,并且希望在类似于集成电路的组件模型中实现商品化算法和数据结构。

在《面向对象程序设计:一种进化方法》中,Cox提出了“软件IC”的愿景。与K&R与C或Stroustrup的书与C ++一样,对本书与Objective-C进行通常的比较是不公平的。K&R是该工具的用户手册,而C ++书籍则是有效利用复杂设计系统的指南。OOP:aEA的宣言不仅仅体现了一种完全不同的方式来筹集资金,人员配备和交付软件产品。

对于Cox来说,工业革命主要不是关于机械以及蒸汽和煤炭动力的利用(banq注:第一次工业革命是蒸汽机的发明,这种思考带有生产工具等所谓外部客观事物决定一切的哲学观),真正工业革命是依靠规模化的工业流程来代替手工、纺织工艺。而工业流程则依赖于标准化的、可互换的零件之间明确规定的接口。以前,枪匠采用端到端的工艺制作一次性步枪,而惠特尼则主张将步枪由标准组件组装而成。然后,如果野战中的螺栓失效,您只需要更换螺栓,而不是更换整个步枪即可。(banq注:枪的威力不在于火药发明或牛顿力学本身,这些都只是基础外部条件,战争需要规模化低成本大批量生产枪支,挨打者表面上是被枪支这样的东西事物打败的,其实是被“标准化批量化”打败的)。

Cox对软件生产采用了面向对象的方式,与Ivar Jacobson对业务流程进行了基于对象的方式几乎相同。他希望程序员设计对象,并发布描述对象如何工作的数据表。集成商将浏览这些数据表,并购买可以连接在一起的对象,以构建可解决其问题的高级组件。

十年后,Cox必须接受,虽然他与他人共同创立了一家公司以推广Objective-C,但该公司获得了财务上的成功,但与软件业的英特尔相距甚远。为了找出原因,我们回顾了他的另一本书的故事,《Superdistribution: Objects as Property on the Electronic Frontier(超级分发:电子疆界上的的对象》)。(banq注:超级分发是一种“标准化批量化”)

同样,Eli Whitney的故事和关于“软件工业革命”的讨论浮出水面。但是现在我们遇到了扩展软件组件销售的难题:在大多数情况下,我们不按部门出售软件。大部分成本由最初的建设承担,随后的副本免费。在扩大我们的图形应用程序的生产之前,我们不能仅仅购买几个Window对象来烦恼:我们要么许可无限的Windows(可能还许可了GUI工具包的其余部分),要么不许可。

考克斯倡导面向对象的经济。当我使用我的应用程序时,我的计算机会注册该使用情况并向应用程序作者进行小额付款。但是,该应用程序还利用了GUI工具箱对象,部分付款已从应用程序作者转移到工具箱作者。如果该工具包使用一些基础数据结构,则需要另外付款。

现在开发很便宜,因为当开发人员仅在自己的计算机上使用几个对象时,他们支付的费用就会减少。但是,当他们分发应用程序时,越来越多的用户开始使用它,他们的收入和通过“上游”的份额都会随着应用程序使用规模的增加而增加。

如Superdistribution一书中所述,面向对象的经济学要求使用自定义硬件来安全地跟踪对象的使用情况并进行正确的小额付款。使用区块链智能合约语言Solidity编写的dApp可以在以太坊网络上以智能合约评估的形式使用了小额支付。我们具有实施超级分发思想的技术能力,但仍然存在要收取大量创建软件组件费用的问题。

成功地促进大规模软件组件分发的唯一创新是免费软件许可证,许可证没有规定向其创造者付款。“Superdistribution”一书仍然值得一读,而软件工业革命背后的思想仍然对我们领域有很多启发。


HackerNews的讨论