含有〈软件〉标签的文章(6)

松耦合,语义界面,及人工智能

松耦合,语义界面,及人工智能
辉格
2022年6月13日

上周我就AI的当前状况做了点小思考,昨天又花了不少时间想这事情,发现许多曾经想过的点好像都串起来了,值得写一写。

让我绕远一点,从传统软件开发说起。

在遗留系统上工作过的人可能都有体会,当一个系统变得日益庞大复杂时,它会慢慢的绞成一团乱麻,添加新特性,修改旧特性,都变得越来越难以下手,因为很多地方都是牵一发而动全身,你改了这里,不知道哪里会冒出一堆bug。

因为意识到处处是地雷,新来的程序员轻易不敢动旧代码,每当要进行一项改动时,只敢小心翼翼的找到一处他认为最适宜的切入点,从那里开始插入他的新代码,结果就像在一个庞大身躯上又安装了一条新假肢,久而久之,这副躯体就变成了一头全身长满假肢的怪物,每条假肢上又接出若干条假肢,许多遥远假肢之间还常常连着一些电线,这些电线自然也是绞成一团……

这是一种非常自然的倾向,只要没有系统性的手段加以阻止,持续强力一种贯彻某种结构方案和设计原则,就必定会发生。

广而言之,任何紧耦合系统都是如此,这也是为何软件工程界如此强调松耦合,每个谈论这一话题的人都是三句不离解耦。

一个典型的紧耦合系统是生物的基因组,每个变异常会影响数千个性状,每个性状常受数千个(more...)

标签: | | | | | | | |
9001
松耦合,语义界面,及人工智能 辉格 2022年6月13日 上周我就AI的当前状况做了点小思考,昨天又花了不少时间想这事情,发现许多曾经想过的点好像都串起来了,值得写一写。 让我绕远一点,从传统软件开发说起。 在遗留系统上工作过的人可能都有体会,当一个系统变得日益庞大复杂时,它会慢慢的绞成一团乱麻,添加新特性,修改旧特性,都变得越来越难以下手,因为很多地方都是牵一发而动全身,你改了这里,不知道哪里会冒出一堆bug。 因为意识到处处是地雷,新来的程序员轻易不敢动旧代码,每当要进行一项改动时,只敢小心翼翼的找到一处他认为最适宜的切入点,从那里开始插入他的新代码,结果就像在一个庞大身躯上又安装了一条新假肢,久而久之,这副躯体就变成了一头全身长满假肢的怪物,每条假肢上又接出若干条假肢,许多遥远假肢之间还常常连着一些电线,这些电线自然也是绞成一团…… 这是一种非常自然的倾向,只要没有系统性的手段加以阻止,持续强力一种贯彻某种结构方案和设计原则,就必定会发生。 广而言之,任何紧耦合系统都是如此,这也是为何软件工程界如此强调松耦合,每个谈论这一话题的人都是三句不离解耦。 一个典型的紧耦合系统是生物的基因组,每个变异常会影响数千个性状,每个性状常受数千个基因的影响,真真是牵一发而动全身,也正因此,行为遗传学研究才如此困难,像亨廷顿舞蹈症这种单点突变性状太少了,不足以为该学科持续赢得声誉,大众更关心的那些性状,往往涉及上千基因,其中每个的贡献率都很低,需要使用高端统计工具才能从海量样本数据中捞出一点点线索,能捞出的往往也只是贡献率排名靠前的那几个因子。(参考Robert Plomin - Blueprint: How DNA Makes Us Who We Are) 基因组可能是迄今我们发现的耦合最紧的一套信息系统,绞的最乱的一团乱麻,原因当然是,它是盲眼钟表匠的作品,没有一位设计师来执行一套设计方案,贯彻一组设计原则,每项改动都是(掷飞镖+自然选择)的结果,毫无设计原则可言,而且它又那么古老,数十亿年来积累了无数补丁,不夸张的说,它就是一大包补丁组成的。 从任一时刻看,一套软件的开发似乎通常都有一位设计师在贯彻某种方案或原则,可是从长期看,设计师/程序员来来去去,换了一波又一波,其中大部分是庸人或懒人,不庸不懒的那些,也常常为了赶进度而将设计原则抛诸脑后,结果,在宏观效果上,其中每位的每项行动,最终也都不过是一支随机飞镖,测试、QA和客户则构成了他们的自然选择环境,最终系统还是会被绞乱,沦为一团乱麻。 依我看,任何紧耦合系统最终都会遭遇某种极限,在某个临界点之后,让系统在功能上变得更丰富更强大的任何努力都将是得不偿失的,系统仍然可能继续进化,但此后的进化会以一种(姑可称为)生态位漂移的方式进行,即,系统可能增加某些新特性,增强某些旧特性,但为此不得不牺牲另一些特性,在某处进行改进的同时,容忍另一些地方冒出一些难以修复的bug(因为其乱麻性质,避免或修复这些被新改动牵出的新问题成本太高了),有时候这些地方反正已经很少被用到了,所以也没人介意,久而久之,系统抛弃了某些特性,发展了另一些特性,从而适应了新的生态位。(可以想象,在很长时间内,那些被抛弃的特性的遗骸会像一条条阑尾那样继续挂在这副丑陋的庞大躯体上) 我想把紧耦合系统面临的这种发展极限称为科斯临界点,在他那篇经典论文《厂商的性质》中,科斯指出,企业与市场的边界所在,取决于组织成本与交易成本之间的权衡,企业将一些原本通过市场交易分工协调起来的生产活动纳入企业内部集中管理,避免了一些交易成本,同时带来了组织成本。 不妨(过度简化的)将企业视为紧耦合系统,市场则是松耦合系统,当你将越来越多活动纳入企业内,到某个临界点,新增组织成本将超出新减交易成本,此时继续扩大企业将是得不偿失的,这是因为(如上述),当企业这种紧耦合系统庞大且古老到一定程度,将不可避免的变成一团乱麻,任何功能新增都会变得非常困难而昂贵,这也是为何我们总是需要市场(的理由之一),我在《群居的艺术》里专门用一章(秩序的解耦#7:创造复杂性的新途径)讨论了这个问题。 (枝节:这里的企业=紧耦合/市场=松耦合的二分当然是过度简化的,实际上耦合度是一个连续谱,财务上独立的企业之间的耦合度未必很低,有些承包商与其顾客之间的耦合度和企业部门间相差无几,这也是产业聚集效应的根源所在,而同时员工与企业的耦合度也可以很低(温州有些企业里每台机床都有独立电表),张五常的论文《厂商的合约性质》是理解这一连续谱的好起点。) 用系统论术语说,从孤立生产者到市场分工合作体系的发展,是一种元系统跃迁(metasystem transition),而元系统跃迁是突破紧耦合系统发展极限的一条常见途径:当丰富壮大一个紧耦合系统的努力变得日益得不偿失时,出路不是继续改进既有系统,而是另起一个层次,将既有系统纳入一个多系统共生合作体系中,从而创造出一个具有更多层次的系统,而在该体系中,各成员系统之间是松耦合的(或者更准确的说,它们之间的耦合是足够松的)。 那么,在元系统跃迁过程中究竟发生了什么,是什么条件的存在或出现,让各成员系统之间能在松耦合条件下建立合作共生关系的? 如果你也是程序员,头脑里大概会很快冒出一个答案:关键条件是某种接口或曰界面(interface)的出现,界面的存在使得各成员之间能够发生交流和交易,同时又不必过度相互依赖与纠缠,在相当程度上能够继续各自发展自己的特性与功能,往往还能保持可替换性,即,一个成员常可以将某方面的既有合作者替换成另一个合作者,只要后者能对同一合作界面做出符合预期的响应,比如将电力供应商从一家更换成另一家,只要后者支持同样的接口标准(电压、频率、接线规范等)。 软件工程中,对付那些已经达到科斯临界点却又不愿丢弃的遗留系统时,一个常见办法就是为它创造出一套界面来,比如让它将某些数据输出到指定格式的文件中,或写入某个外部数据库里,或反过来,让它从此类来源读入数据,或将其中仍有价值的代码重新包装成支持新接口的库,或让它接受某种脚本命令并做出相应动作,甚至,可能的话,将整个系统包装成一个能对给定请求做出响应的服务,诸如此类,都是在创造界面,让它能与新体系中的其他成员展开合作,同时不必过度触碰既有代码。 其他领域的元系统跃迁也必定涉及界面的创造(或适当界面恰好已经存在),比如在真核革命中,新创生的真核细胞体系中,被捕获而最终成为线粒体的细胞与其他细胞内共生体的交互界面就是ATP,这是线粒体作为细胞电池为其他细胞活动提供能量的标准界面,所有从线粒体输出的能量都以ATP形式存在,而细胞内的所有能量用户都知道怎么利用ATP;类似的,当蚂蚁蜜蜂等昆虫发展出真社会巢群时,它们的交互界面是一组外激素信号。 那么,这一切和AI有什么关系呢?不急,我很快就会说到。 现在让我们来看神经系统。初级神经元网络是基因组之外的又一个紧耦合系统,一团乱的不能再乱的乱麻;你可以训练一个神经元网络学会某种技能,但你无法解释训练得到的结果,如果有人问你它是怎么成功执行某项功能的,你唯一能做的是把整个网络中的突触连接(及其强度)描绘一遍——它们是如此这般连接的,所以它做到了——这根本不是解释,一个解释的信息量必须小于它所解释的东西的信息量,否则就只是描绘。 这一乱麻特性使得你无法直接改动一个神经元网络令其符合你的某种意图,要让它表现的有所不同,你只能给它设定新的训练环境,施加不同的激励反馈,给它喂不同的数据,希望它能学出点新模样,但你不能直接干预训练结果,因为这些结果是难以名状的、无从理解的,你无法预料一处改动会导致何种行为改变,这一不可能性比改动乱麻遗留系统的不可能性要高出一万倍。 所以不难理解,这种神经元系统发展到一定程度,也会(和其他紧耦合系统一样)碰到科斯临界点,而突破这一局限的出路同样是创造出交互界面,虽然具体实现方式和其他领域十分不同。 高级动物的神经系统朝分层和模块化的方向发展,在一些高度专业化的皮层内,神经元被清晰严整的分入一个个层次,每个神经元的输入与输出范围都严格受限,而且扇入/扇出系数往往很小,通常都只接受来自前一层上紧邻少数几个神经元的输入,其输出也只投射到下一层的少数几个紧邻神经元。 比如在阅读过程中,从最简单的线条形状识别,到最终的字符和词汇识别,经历几个层次,其中每个神经元都只专注于一种形状,或一种线条组合,或一个独特字符,这些神经元的输出不会被随便越过几个层次或越出模块投射到其他遥远脑区,它们输出的信息在被其他脑区利用之前,通常要经过前额叶皮层中某些高级认知模块的中介,到达那里的信息已经是经过好几层加工的抽象表征,诸如“那里有朵红色的花”之类(参考:Stanislas Dehaene《脑的阅读》)。 (枝节:这种输入输出限制当然不是密不透风的,一个重要的例外是,知觉皮层的神经元会接受来自其服务对象前额叶的输入,这是一种非常关键的反馈机制,是高级认知中枢在告诉初级知觉皮层:你送来的信息是否足够有趣,就好比国家情报总监(DNI)在告诉其下属情报机构,对他们传来的某条情报有多感兴趣,这一反馈继而将影响后者的后续情报采集取向,比如,上级若对某类信息表现出高度兴趣,采集者可能会降低识别此类情形的阈值,导致更多假阳性,而在错失成本远高于误认成本的情况下,这可能是值得的。) 限制神经元投射范围,并且在进一步向其他脑区投射之前,把初级信号变成符号化的抽象表征,这一步极为关键,其实就是一种界面化,而这是大脑模块化,且模块之间实现松耦合的基础,来自各大感官的知觉系统与其他系统的交互只需通过高层符号界面进行,整个系统就不会纠缠为一团乱麻(虽然单一模块内仍然可以是一团乱麻)。 人类在认知系统界面化的方向上又跨出了一大步,人类不仅能产生符号化的知觉表征,还能对知觉行为本身进行表征,我不仅能认出一只兔子(一阶知觉),还会说(或在头脑中默想):“我看到了一只兔子”(二阶知觉),还会对自己的知觉结果提出疑问:“我好像看到了一只兔子,我会不会看错了?”——这是三阶知觉,因为我首先需要对我的二阶知觉本身形成知觉——“我觉得“我看到了一只兔子”,我的这一知觉是否正确?”,而这一二阶知觉的正确性又取决于一阶知觉“那里有一只兔子”的正确性)。 我还能对他人说出我的一阶知觉:“这是一只兔子”,从而在听者的头脑中产生二阶知觉“他看到了一只兔子”,对方可能会(如果他足够信任我)也可能不会(如果他不够信任我)将这一二阶认知转换为自己的一阶认知“那里有只兔子”。 二阶知觉能力让我们能够产生一种非常新颖高级的意识活动,动物或许也有意识(取决于定义),但它们显然没有我们这么高级的意识活动,比如斟酌与反思:“我上次在这个地方也见过一团白色东西跑过,当时我以为那是只兔子,后来的事情证明我弄错了,所以这次我得看仔细点,别再弄错了”,或“那好像只兔子,可是且慢,为何它的眼睛不是红色的?咦,它怎么发出了这种叫声?我可从来没听到兔子会叫”…… 据Stanislas Dehaene的理论(见《脑与意识》),意识是一种由前额叶皮层激发的全脑激活状态,前额叶就像DNI,当它从各知觉系统收到某些类型的情报时,会将其向全脑广播,在数百毫秒中、在分布广泛的众多脑区触发一波高度活跃的神经活动,假如Dehaene是对的,那么丹内特的多重草稿模型中的每个意识瞬间,就是来自不同知觉模块的多重草稿中成功抢到麦克风的那个,经由全脑广播而触发的一轮脑活动,这些意识瞬间继而在记忆中被组织为一套连贯的自我中心叙事,后者构成了我们对世界的体验。 就本文主题而言,重要的是,这种二阶知觉表征是符号化的,或者说是语义化的,经过了好几层抽象,早已远离了各知觉模块的初级表征,比如,当我们阅读时,经由前额叶向全脑广播的信息中,不会包括那些有关笔画线条的表征信息,甚至不会是字符表征,而是一些词汇/短语或(可能更经常的)是与这些词汇/短语有关的概念表征(除非某一时刻前额叶不知何故突然将关注点转向笔画线条本身,这种关注转向当然也是由来自其他模块的某种信号所触发)。 这就意味着,各种高级意识活动之间的互动,是通过一种语义界面进行的,因而也是松耦合的,它们之间的互动关系既有合作,也有竞争(抢麦),这一情形很像国会中发生在议员之间的事情,他们或各自表达自己的看法,提出各自主张和立场,或针对其他议员的观点提出正面或反面的证据,或支持或反对的理由,他们相互争辩或支持,站队和拉帮结派……,最终,某种决议会从中产生,它就像动作信号输出到运动或内分泌中枢,变成行动。(我在《沐猿而冠》附录〈何为理性动物〉中详细展开了这个国会隐喻) 语义界面的存在使得高级意识功能在松耦合前提下实现模块化,其后果是,我们的各种认知技能与知识构件可以各自独立发展,并通过语义界面相互合作,如此一来,我们的理性能力和知识体系便有了一个极为广阔的积累性发展空间。 让我解释一下这是什么意思。 所谓理性,并不是一个单一算法,而是由众多独立平行构件(算法)组成,比如,我们或许有一个类似三段论推理机的模块,或许有一部贝叶斯推断机,或有一个数数模块,一个四则运算模块,还有许多危险探测装置(恐高,幽闭恐惧,密集恐惧,蛇形恐惧,是最基础的几种),以及机会探测装置(有人看见美女就两眼放光,有人则对赚钱机会有着敏锐嗅觉),这些探测装置并不试图对观察对象整体建模,而只对某些特征线索敏感,但它们都是我们理性的组成部分,这些模块既相互竞争,也会相互合作与强化。 设想我们的头脑就是一部正在被生活经历所训练的人工智能系统,它不是作为一个整体而囫囵学习的,各模块、各组件有着自己独立的学习进程,每个只专注输入信息中某个特定侧面或某些特征线索,每个也有着自己不同的模型骨架(比如这是部贝叶斯推断机,那是个加法装置,还有个是逻辑矛盾探测器……)。 这种模块专业化使得系统具有一种内在保守性,不会随训练数据的变化而过度摆动,因为每个模块的输入输出和反馈回路都被其“专业兴趣”局限住了,会自动忽略训练数据中的其他方面;这一点背后的原理是世界之可理解性假设:世界的某些局部与侧面一定比其整体更稳定、更一致、更少变,否则世界便是不可理解的;经验也告诉我们,专家与非专家的一个区别就是,前者的观点更少随近期事态变动而摇摆。 举个例子,虽然我不懂围棋,但我相信,假如我们修改围棋规则,把棋盘从19x19换成21x21,顶尖棋手们的专业经验可能很大部分报废了,但也会有很多仍然有用,可是对于一个只会囫囵学习的智能系统,其经验将完全报废,一切必须从头开始。 模块的内在保守性是可积累发展的前提,每个模块保持大致稳定,各自随训练继续而精炼(即框架稳定的同时在边际上改进),同时系统时不时添加一些新模块,令其认知能力随可用模块增长而不断升级增强,变得越来越全面、老练和精到。 再举个例子,某人若是对赚钱机会有着敏锐嗅觉,他有潜力成为一位好投资者,可是如果他懂一点基础会计知识,会一点财务精算,那就有望成为更好的投资者,如果他还受过一些风险控制训练,那就更好了,重要的是,机会嗅探,财务精算,风险控制,这三个模块最好是独立存在,这样的好处是:1)它们本身会更稳定持久,持续精炼,2)它们可以被分别传授和训练,因而在缺乏实景训练数据时也可能习得,3)它们可以实现跨系统分工与合作,比如人际分工。 让我一点点说。 假如风控模块不是独立的,而是以无从辨认的形态分散于系统各处,和其他东西纠缠在一起,它就无法稳定,在繁荣期的训练数据影响下,风控标准会迅速降低,因为更有纪律的风控倾向得不到多少正面反馈,反之,在萧条期,系统的风控倾向又会摆向另一个极端,这种大幅摇摆使得它无法实现可持续积累和精炼(现实中很多投资者头脑中的风控模块正是如此)。 (为了说明模块独立性为何会带来稳定持久性,我想再多说几句,一个输入输出和反馈回路被充分局限住的模块,常常能达到一种近乎于(但不完全是)自我激励的状态,它能为自己找事做,并从结果中得到满足,因而总是自得其乐的沉醉于其中,比如男人头脑里有一个腰臀曲线探测器,从实用功能上说,这是用来探测生育期女人的裸露躯体的,这个探测器可以在输入极为有限的情况下持续自我训练和激励并乐在其中,这也是某些色情图片如此有吸引力的缘故所在,尽管在现代传播条件下该模块的这种表现其实根本得不到任何现实回报,如果系统是囫囵学习的,没有模块独立性,当代男人对色情图片的兴趣早就丧失殆尽了,所以,如果你希望系统里有一个忠实勤勉持久敏锐的风控模块,它最好像男人的腰臀曲线探测器那么自主存在和自我激励,每一次都会为自己能察觉任何风险线索而兴奋不已。) 假如风控模块不是独立的,或者不是通过语义界面与其他模块交互的,它也无法在系统间被传授,传授的好处是可以免去实景训练的高昂成本,哪怕效果差一些(因为当经验通过语义界面传输时,难免会丢失一些信息,所谓默会知识,就是那些无法穿透语义界面的知识),往往也是值得的,如果你读几本书或听一席话就能学到一些基本的风险识别技能,哪怕只是一点点,得失比也比在市场浪涛中亲身获取这些教训高多了。 假如风控模块不是独立的,或者不是通过语义界面与其他模块交互的,它也无法在系统间实现分工合作,一位投资者就无法将风控事务委托给他人完成,与此类似的任何松耦合分工合作都不可能发生,虽然仍会有一些其他形式的合作,比如对默会知识的手把手传授,但这种合作注定只能以极小的规模发生,因为它是紧耦合的。 人类认知系统跨出的一大步,就是将语义界面向外开放了,并且通过人际协调博弈而形成共同接受的语义界面;自然语言的出现,使得语义界面不仅是系统内各模块间交互的界面,还成了系统间交互的界面,正是这一步促成了人类认知与知识系统的另一次元系统跃迁,它创造了大规模分工合作体系,大型复杂社会,以及文明。 依我的有限了解,当前深度学习派人工智能所走的路线,看起来和语义界面路线是背道而驰的,深度神经元网络(DNN)虽然是分层的,但每个层次的输出到底是什么,是说不清楚的,或者说,是没有语义化的,也正因此,这种系统的学习结果是无法被检查、解释和改动的,整个一黑箱,你没办法把它打开,看看其中那条逻辑不对劲,能不能改一改,不可能,天地一笼统。 (再多解释几句,语义化的意思是,至少在模块或层次间交互的那些地方,每个神经元的特定输入输出值,必须有稳定持久的含义,唯如此,其他模块/层次才能持久的知道该如何与它互动,如何利用它输出的值,在想给它施加某种影响或希望从它那里引出某种结果时,该如何给它喂输入值,这些不能说不清楚,哪怕你凭空发明一个概念也好,那也算说清楚了(正如许多知识领域在发展过程中都会发明新概念),因为凭空发明的新概念只有在初次使用时才是不清楚的,随着它被反复使用,意思就清楚起来了——输出者在什么情况下会输出它,输入者在输入它后会做点什么——此后,只要交互各方保持对该语义约定的大致遵守,语义便稳定了下来。) 而且,好像也没有什么机制让DNN能够自发形成自主独立持久的模块(这一点和上一点其实互为因果),它比完全不分层的囫囵联结主义当然好多了,但也只好那么多,所以我的感觉是,尽管它在一些领域取得了耀眼突破,但很快会碰上极限。 话说回来,语义界面也不是没有代价,界面就是一种契约,语义界面是基于一套概念框架的一组契约,不仅契约本身是一种束缚,概念框架在帮助我们认识世界的同时,也约束了我们的认知可能性,不妨称之为范式锁入,虽然一个足够灵活开放的系统会不时引入新概念和新模块(在很多情况下这是通过类比/隐喻从旧概念中衍生出来的),但至少在特定时期内,特定任务域中,这种约束会妨碍我们的认知潜力,让我们难以跳出框架思考。 所以,在某些情况下,不受概念框架约束的囫囵学习可能是有用的,它能帮助我们发现一些在现有概念框架中难以言喻名状的情况,或许是某种风险,或者某种机会,或某种门道机巧,说不清楚它是什么,但它确实在那里,或确实管用;然后,这种发现如果被证明足够有价值,可能继而在采用语义界面的系统中促发一轮观念更新运动,一套新的概念框架被创造出来,就像库恩式科学革命中的情形。 总之,深度学习派确实取得了不小成就,其应用潜力或许也不小,但无论如何,沿这条道路大概走不到类人智能的程度。  
脚本界面

【2021-08-20】

想到一个问题,有没有什么游戏是可以让用户通过脚本程序来玩的?就是说游戏提供一种脚本语言,用户可以用它来编写一系列脚本,每个脚本包含一个带条件分支的动作序列,具体玩的时候可以调用这些脚本,也可以再写一个大脚本让它自己去调用这些小脚本,于是就成了一个 bot,

我不玩游戏,所以毫无线索,

当然,脚本不仅可以用来设计动作序列,还可以让玩家设定自己的资源分配策略、行事风格和交往原则,诸如此类,

一个明显的好处是,这可以让一个游戏玩出其设计者难以预料的无穷花(more...)

标签: | |
8775
【2021-08-20】 想到一个问题,有没有什么游戏是可以让用户通过脚本程序来玩的?就是说游戏提供一种脚本语言,用户可以用它来编写一系列脚本,每个脚本包含一个带条件分支的动作序列,具体玩的时候可以调用这些脚本,也可以再写一个大脚本让它自己去调用这些小脚本,于是就成了一个 bot, 我不玩游戏,所以毫无线索, 当然,脚本不仅可以用来设计动作序列,还可以让玩家设定自己的资源分配策略、行事风格和交往原则,诸如此类, 一个明显的好处是,这可以让一个游戏玩出其设计者难以预料的无穷花样,当然,对有些游戏商,这可能是缺点,可是市场那么大,总有些不会这么想吧? 想象一下几百万持续进化中的脚本在一起玩MUD,会怎么样? 当然,这个需求也不仅限于游戏,比如社交网,假如我能用一个脚本来设置我的时间线,或者筛选关注对象,或者设置自动洗粉策略,那就太好了, 总之,一个系统的用户若只能通过按钮菜单与之互动,就太单调了,要弄出更有意思的东西,需要一种能够表达复杂逻辑的结构性对话方式,脚本是现成的方案, 一般而论,理想情况下,软件系统的标准用户界面就应该是脚本语言,其他界面都是它的非完备替代品  
[微言]OO与柏拉图

【2013-02-22】

@外刊IT评论 最新发表《面向对象编程从骨子里就有问题——看看名人大家是如何诋毁面向对象的》:正所谓树大招风,越是流行的东西越容易变成人们的众矢之的。在编程界里,面向对象编程就是这样一个代表性事物,不论它在当今的软件开发中占有多大的 『文章地址: http://t.cn/zYXptkR 』

@tertio:哈哈,我也是

@whigzhou: 你们只是说说而已,我却改行了

@tertio “面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香(more...)

标签: | |
4883
【2013-02-22】 @外刊IT评论 最新发表《面向对象编程从骨子里就有问题——看看名人大家是如何诋毁面向对象的》:正所谓树大招风,越是流行的东西越容易变成人们的众矢之的。在编程界里,面向对象编程就是这样一个代表性事物,不论它在当今的软件开发中占有多大的 『文章地址: http://t.cn/zYXptkR 』 @tertio:哈哈,我也是 @whigzhou: 你们只是说说而已,我却改行了 @tertio “面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)----Joe的毒舌总是很精准,但他的Erlang却也没摸到真正的门在哪里 @whigzhou: 我的说法是,OO就是柏拉图主义 @whigzhou: 我是在读过波普的《开放社会的敌人》后才意识到OO问题之所在的,等读到奎因时,它就完全被我唾弃了 @whigzhou: 在柏拉图看来,先有绝对而纯粹的理念,然后投射为现实,而奎因让我认识到,概念/意义/结构都是在主体与上下文环境以及主体之间的持续互动中逐渐明确起来的,其内涵与边界都随此过程而不断变化调整,OO的问题在于,它建立的系统很不适应这种变化,每次认识变化都会冲击到整个结构 @小小nopainkiller:什么是更好的方法呢? @whigzhou: 要符合人类认知规律,即认识世界、形成和澄清观念、积累知识的规律,先具体后抽象,还有低耦合,具体怎么做我不知道,先等着看三总的成果吧 【后记】OO根子上的问题其实比这更多。
[微言]编程与知识

【2012-02-14】

@trustno1v2:这两天冒出来的一个想法。软件设计领域的所采用技术和方法,最主要的目的在于整理各种旧知识,而非发明创造新知识.说白一点,软件攻城师的工作与图书馆管理员大体相当.当然可能算法不在此列.

@庄表伟:编程的主要工作,应该是翻译吧,把人类能够理解的语言,翻译为机器能够理解的语言。这其中的确没有什么新知识。另外,在软件领域,有一些特定的问题,需要被解决,这些问题,有些在传统领域可以借鉴,有些不行,所以还是会有一些新知识出现的。

@ter(more...)

标签: | |
4107
【2012-02-14】 @trustno1v2:这两天冒出来的一个想法。软件设计领域的所采用技术和方法,最主要的目的在于整理各种旧知识,而非发明创造新知识.说白一点,软件攻城师的工作与图书馆管理员大体相当.当然可能算法不在此列. @庄表伟:编程的主要工作,应该是翻译吧,把人类能够理解的语言,翻译为机器能够理解的语言。这其中的确没有什么新知识。另外,在软件领域,有一些特定的问题,需要被解决,这些问题,有些在传统领域可以借鉴,有些不行,所以还是会有一些新知识出现的。 @tertio:非也,与科学家所做的工作是一样的。 @whigzhou: 一项知识在被按某种形式形式化之前和之后是不同的东西,在被置入某个结构之前和之后也是不同的东西,而这些形式与结构与其所容纳的知识更是不同的东西(尽管在另一个层次上看,它们也是知识) @tertio:嗯,被一种形式绑定之后,知识的含义可能会发生很多变化 @whigzhou: 所以,当你将既有知识装进一个新结构时,你确实是在创造,即便你只是将既有知识装进一个旧结构,只要它还没被这么装过,也是创造,只是后者比前者的创造性略小 【后记】 发现当时有个关键意思漏了没说:我之所以强调将旧知识放入新结构是一种创造,是因为,所谓知识(或意义、信息)就是结构,因而将旧知识放入新结构就是创造了新知识。
[微言]抽象与耦合

【2012-02-13】

@tertio:在程序设计中,抽象原则和最少耦合原则实际上是矛盾的,细究下去,还有更多的原则也是相互矛盾的。

@whigzhou: 嗯,是的。缓解的办法是,抽象的思考,松耦合的实现,这类似于交谈中,各自保留自说自话的自由,同时尽可能捕捉共同的意义

@whigzhou: 告别柏拉图,先具体,后抽象,不要把抽象的结果视为“更基本的东西”甚至“是前提”…可是,洁癖们往往做不到

@tertio:回复@whigzhou:主要是没条件。

@whigzhou: 我多年前说过,像OO这种自上而下、先抽象后具(more...)

标签: |
4104
【2012-02-13】 @tertio:在程序设计中,抽象原则和最少耦合原则实际上是矛盾的,细究下去,还有更多的原则也是相互矛盾的。 @whigzhou: 嗯,是的。缓解的办法是,抽象的思考,松耦合的实现,这类似于交谈中,各自保留自说自话的自由,同时尽可能捕捉共同的意义 @whigzhou: 告别柏拉图,先具体,后抽象,不要把抽象的结果视为“更基本的东西”甚至“是前提”...可是,洁癖们往往做不到 @tertio:回复@whigzhou:主要是没条件。 @whigzhou: 我多年前说过,像OO这种自上而下、先抽象后具体的模式,其实就是柏拉图主义,但人类认识和创造世界的过程,与柏拉图图景大相径庭 @茶博未:教科书,包括数学的,都该这么写。手册则不然 @tertio:所以新的体系是按照科学方法论的过程来设计的,实际上,就是科学方法论的代码版。 @whigzhou: 嗯,在过程性语言中,假如先实现了“电视机类”和“电饭锅类”,然后抽象出“电器类”,就要把前两个的共同部分挖出来,而在你的逻辑语言里,可能只是增加了一条更易通达的逻辑路径,前面的代码无须修改,我理解的对吧? @tertio:具体就复杂了。需要可以自动提取共性,之后可以保持映射关系或者做一个硬拷贝脱离映射关系,脱离映射关系之后还可以反过来约束具体实现。花样还可以更多,均取决于语言的表达力。(甚至完全脱离OO的语境)比如可以说:电视机X和电饭锅Y共同使用的金属。 @whigzhou: 比如可以这样,先具体:IsClass(电视机),HasProp(电视机,功率),IsClass(电饭锅),HasProp(电饭锅,功率).然后抽象:IsClass(电器),Is(电视机,电器),Is(电饭锅,电器),As(电视机.功率,电器.功率),As(电饭锅.功率,电器.功率).这样,抽象和松耦合便同时做到了,对吧? @tertio:对,两个As可以默认,除非名字不一样。此刻IDE应提供电视机和电饭锅的两个版本的定义,原来的定义和有抽象之后的定义。之后的问题在于,谁约束谁?是抽象约束具体实现还是具体实现约束抽象? @tertio: 之后的问题在于,谁约束谁?是抽象约束具体实现还是具体实现约束抽象? @whigzhou: 回复@tertio:这个我觉得应该按照对象被声明为什么类,假如X最初被声明为Isa(X,电视机)就受两个类的双重约束,假如被声明为Isa(X,电器),便只受一个类约束 @tertio:回复@whigzhou:事实上,不会做任何约定。这句话(按照对象...,假如...假如...便...)的含义本身是用代码表达出来的。其基础机制,是逻辑上的,有的论断是推理出来的,随着前提变化而变,而有的论断,推理出来之后会成为独立的事实,不随前提改变。
饭文#R4: 软件专利权已成创新绊脚索

软件专利权已成创新绊脚索
辉格
2011年4月28日

日前,谷歌输掉了一桩软件专利案,被判侵权成立,赔偿500万美元;尽管金额不高,但由于同案被告包括了雅虎、亚马逊、PayPal和AOL等行业巨头,且涉案代码属应用范围极广的Linux内核,此案备受开源界关注,判决结果引发了业界对专利陷阱的广泛担忧,以Linux为命根子的Red Hat虽未被列入被告,却已自告奋勇提起反制诉讼,要求判定该专利无效。

这是一个典型的案例,说明软件专利权会如何被滥用,原告Bedrock是一家专业专利钓鱼公司,并不以软件为业,其老板是一位资深专利法律师,而声称被侵犯的专利根本算不上创新,它听起来就像:一个保持冰箱整洁的新方法,每次打开冰箱存取物品时,顺便拿几样东西看看,假如有东西过期了,给它贴个标签(more...)

标签: | | | |
1803
软件专利权已成创新绊脚索 辉格 2011年4月28日 日前,谷歌输掉了一桩软件专利案,被判侵权成立,赔偿500万美元;尽管金额不高,但由于同案被告包括了雅虎、亚马逊、PayPal和AOL等行业巨头,且涉案代码属应用范围极广的Linux内核,此案备受开源界关注,判决结果引发了业界对专利陷阱的广泛担忧,以Linux为命根子的Red Hat虽未被列入被告,却已自告奋勇提起反制诉讼,要求判定该专利无效。 这是一个典型的案例,说明软件专利权会如何被滥用,原告Bedrock是一家专业专利钓鱼公司,并不以软件为业,其老板是一位资深专利法律师,而声称被侵犯的专利根本算不上创新,它听起来就像:一个保持冰箱整洁的新方法,每次打开冰箱存取物品时,顺便拿几样东西看看,假如有东西过期了,给它贴个标签,假如看见有东西贴着标签,把它扔掉。(实际上比这要含糊的多) 有意思的是,这位专利法专家David Garrod原本是专利法改革的积极分子,曾免费帮助[[PubPat]]打赢过多宗专利虚假标注案件,PubPat是一家反专利滥用的非政府组织,也是专利制度改革的积极推动者,并明确反对将专利法适用于软件。 或许正是因为Garrod深谙专利制度的缺陷所在,才能成功构造陷阱并打赢官司,他知道如此琐碎的“发明”和如此明显的钓鱼很难获得法庭支持,所以刻意挑选了素以专利钓鱼亲善著称的得克萨斯东区法庭,为让案件能被该法庭受理,他把CityWare这家早在2004年开业不久便倒闭的小公司列入了被告。 对专利制度的合理性,历来有许多争议,与它对创新的妨碍和高昂的防范与执行成本相比,它对创新的激励作用究竟是否物有所值,是值得追问和检验的;而在法理基础上,它也有着根本的缺陷,这些缺陷的错误激励作用导致了系统性的无效率。 首先,任何产权都是在行为空间中划出的一个排他性空间,而从无主空间中创立产权通常遵循的是先来先得原则,比如谁先在一块无主土地上耕种或居住就可取得产权,专利权表面上也是先来先得,其实不然,耕种和居住是实际的占有行动,而注册专利只是在行为空间里画个圈,并未实施圈内的行为,它类似于国内校园里流行的用象征性物品占座的习俗,或在月球模型上插面旗来宣布主权。 这种象征性占有的成本很低,它会激励人们不负责任的四处随意圈地,但占了茅坑又不拉屎,等别人想拉时又漫天要价。 其次,通常产权所涉及行为空间会随占有行动而自动变得“拥挤”,这赋予了产权以天然的排他性;专利权则不然,它是借助国家管制能力,对原本不具有排他性的行为施加人为的排他性;这样,专利权的执行成本便转嫁给了潜在的不知情入侵者:假如无票观众进入剧院,他们会直接面临有票观众物理上的排斥,而后者也直接感受到他们带来的拥挤,但假如我无意中侵入的是专利领地,我感受不到任何拥挤,我必须用自己的全部审慎和细察来防范侵权嫌疑。 正是这一点创造了钓鱼机会:入侵之初不会遇到障碍,但你一旦形成规模,投入大量资源,对它产生依赖,钓鱼者便从角落里跳出来漫天要价了;这很像美国西进运动时的土地纠纷,当时授予北美土地的特许状在伦敦市场上被频繁交易,但实际上没人弄得清楚被交易的土地究竟在哪里,没人见过它,它们只是凭想象被画在很不靠谱的地图上,而同时,那些真正在西部开疆拓土的农民,却要时刻担忧他们亲身居住和耕种的土地不定哪天就被手持特许状的人前来索要,显然,这不是好的产权制度。 事到如今,专利制度鼓励创新的作用越来越小,特别是在软件领域,很少有公司靠购买专利来提升自己的开发能力,如今软件厂商注册和购买专利主要是用来自卫,防止被钓鱼和讹诈:当别人来讹诈你时,你也得有可以讹诈的东西;为此,你最好也大撒网式的注册专利,确保你的主要竞争对手至少会撞上其中一部分;然而,这样的游戏只有拥有专业律师团队的大公司才玩得起。 当专利制度由创新激励机制沦为相互下套使绊的工具,是时候彻底改变它了;重要的是,需要在地盘圈占对后来者所构成的障碍与圈占者所承担的代价联系起来,才能断绝对占而不用和漫天要价的无限制激励。 好在不仅产业界,法律界和学术界也逐渐意识到这个问题,PubPat的推动已取得些成效,2004年、05年和07年曾被三度召往国会,在听证会上就专利制度对创新的妨碍和可能的改革作证,尽管还没有带来实质性的变化。