March 2009 Archives

March 30, 2009

对Jesse Rosenfeld和Turnitin.com的看法

最近我们的计算机伦理课在讨论关于版权的问题。用到的一个案例是2003年加拿大McGill大一学生Jesse Rosenfeld拒绝使用Turnitin.com的例子(新闻原文[1][2]法院判决)。

Turnitin.com是一个自动检查你提交的论文是否非法引用了别人作品的网站。国外大学的论文对于论文引用非常重视。在论文中引用任何别人的作品,都需要在论文中使用严格的格式(如APA、MLA、IEEE等)来说明。没有这样做的学生会被认为“作弊(plagiarism)”,而这篇论文无论内容多么精彩,都不会得到高分(经常有人得到0分或F)。Turnitin.com通过比较提交的论文和本身的论文库来告诉你你的文章是否合法的引用了别的文章。许多大学要求学生在提交论文的时候,一同提交Turnitin.com的结论来证明你没有非法引用。

而在2003年在McGill大学读大一的学生Jesse Rosenfeld拒绝向Turnitin.com提交自己经济课上的论文,因此得到了0分。Rosenfeld向法院状告了Turnitin.com,理由是不想学生在事实上作弊之前被认定为是有罪的,而且Turnitin.com侵犯了他的知识产权,因为Turnitin.com会用用户提交的论文来检测日后被提交的文章,因此作为一个商业公司,Turnitin.com间接的用学生的知识产权赚了钱。有不少教授也对Turnitin.com在大学里广泛使用表达了担忧。

Rosenfeld的两点理由值得商榷。第一点理由我看来是可笑的。他认为教授在他提交Turnitin.com的结果前认定他是作弊的对他是一种伤害,这一点几乎是无可争辩的。我们在事实中有很多相似的例子:我们在考试时要求分开坐,而且有老师在考场里走来走去。我们不能说考试时老师认定每个人都是有罪的。很明显,监考老师这样做是必要的。Rosenfeld的教授只是做了同样的事情而已。即时教授在学生提交报告前确实是当作学生在作弊,问题也不应当由Turnitin.com来承担。学生入学,隐含的和学校签订了某种“合同”,就必须按照学校的要求做。如果有意见,合理的做法是选择一家不要求学生提交报告的学校。

在这一方面,Turnitin.com只是一个检查工具,而即时没有这个工具,教授一样可以认定学生作弊。我在一年前参加学校必修的写作课时,教授说他会从我们提交的论文中随机选择几句话,加上引号,放到Google里搜索。如果你作弊,那么被发现的几率非常高。

关于Turnitin.com侵犯学生的知识产权,Turnitin.com解释说,他们并不储存学生的文章,而是用某种算法来对其进行编码,然后保存这个编码。法院的报告说,Turnitin.com的行为属于版权的合理使用范围,并不侵犯上传者的知识产权。其实这种问题很常见,比如Google的爬虫可以未经许可就索引你的网站,你只有明确的设定才能不让爬虫来索引。但传统的版权法规定只有版权拥有者同意的情况下才能合理使用有版权的内容,这方面就有法律问题了(这篇文章有分析)。网页内容的索引可以用合理使用来解释,而“网页快照”的合法性问题在某些地区仍然有很大的争议。从这一点上来看,Turnitin.com是不违反版权法的。

但我觉得毕竟Turnitin.com通过索引学术资料来获利是不争的事实。与Google索引所有网页不同,我觉得我们对待学术资料的态度应该更严谨,或者说更“严厉”。就像我们通常不能随便引用.com网站上的资料一样,判别论文是否有非法引用也应该由非盈利组织来处理。通过大学等学术机构联合成立的非盈利组织来运营一个.org网站来做这些事应该是一个不错的方法。

March 22, 2009

Tim Berners-Lee关于Linked Data的演讲

今天看了Tim Berners-Lee在TED上的演讲,非常有启发。第一次看到了动态的Tim有点吃惊。从之前看过的的照片中,我一直觉得Tim是文质彬彬的非常安静睿智的人。但视频中Tim非常活跃,有点神经质,语素很快,但很清晰,中间还带动观众与他一起大叫,有做励志课程讲师的潜质。

这次的演讲的主题是Linked Data,也算是一个老掉牙的话题了。中心思想是把过去的以视觉呈现为目标的互联网编程数据呈现的互联网。几年前推广XHTML时要求大家使用严格的html语法就有部分这种思想:过去我们用font标签设定某些文字如何显式,现在我们用p之类的标签来说明这些文字是什么,而如何显式就交给CSS来管理。这种做法相当于把Linked Data的思想相当程度上简化了,使之仅仅被用于网页格式输出。Linked Data的思想则更全面,也更难做。

把数据整理成易于处理的形式,在上面加上各种联系,这就是Linked Data。把Linked Data放到互联网上,使数据可以被人们更好的应用。Tim给了我们一个例子:用Google在寻找“What proteins are involved in signal transduction and are related to pyramidal neurons?”的答案,可以得到超过200,000项网页,但没有任何可以回答这个问题,因为之前没有人在网上问过;但搜索Linked Data,Tim得到了32个答案。Google搜索的对象是网页,但常常对我们最关键的是有关联的数据。

Tim说,很多时候人们不分享手中的数据库,只用这些数据来制作漂亮的网页。但我们希望的是“Raw Data”。常常我们被拒绝获取这些数据,尽管我们付了钱。

Linked Data看上去十分美好,但从我看来似乎有很多待解决的问题:

  • 如何提取数据

    我们已经有了成千上万个包含数据的网页,让我们手工的把这些数据提取出来难度很大。怎么样通过计算来自动提取这些数据?

  • 如何记录数据

    我们有了数据,需要好的方法来记录。对于文字数据来说,类似XML的文件记录看上去是不错的方案。但如何记录图片中的数据和视频中的数据?是把他们用文字描述出来再记录,还是用另外的方式直接记录?

  • 如何表达数据

    原始数据有用,但我们不能只把干巴巴的数据扔给读者,而需要“漂亮的”网页来呈现这些数据。前人已经有关于结合XML和TeX的研究,我相信格式方面是没有问题的。但是否能通过计算来自动组织文章,则是一个大的难题。比如我们有了关于奥巴马的数据,如出生日期、教育背景、家庭背景之类的,如何能让机器用语言来组织这些数据,成为一篇奥巴马的建立。这一方面需要期待人工智能和语言研究的发展。什么时候我们能做到这一步,自动写作这个迷人的目标就算实现了。

Tim还举了一个Linked Data的成果例子:DBPedia。DBPedia通过自动索引Wikipedia上的数据,形成了一个数据库。然后用户可以设定各种条件来搜索符合条件的数据。我从这个网站上亲身体验了一下,搜索到的数据通过图形的形式动态的表达出来,形成的网络非常令人震撼。

上网上搜索了一下,Linked Data的记录是用RDF(Resource Description Framework),一种类似XML的东西来完成的。通过这种格式的文章,可以记录大部分的数据。一个例子是用来记录朋友关系,每个人都可以生成自己的rdf文档,并在里面指向其他朋友的rdf文档。我的rdf文档在这里

另外,通过维基百科之类的网站,发现关于Linked Data的中文资料相当少,例如在维基百科上,Linked DataRDF的内容相比起英文维基百科页面的内容来少的可怜,需要人们投入精力翻译。有条件的同学不妨尝试着做一下相关的贡献。

2009年3月30日更新:找到了这个演讲用的幻灯片

March 11, 2009

可惜没有Code of Ethics for Computer User

盗版软件是“计算机伦理”讨论的话题之一。所谓“职业伦理”,就是在法律的“最低限度”的基础上,人为的提升一个行业的从业人员的相关道德标准。人们公认制作、贩卖盗版软件是不符合计算机业从业人员的道德要求的,在一些国家和地区甚至属于违法行为。

似乎这些“职业伦理”并不约束相关的用户。确实,“用户”不能算作职业。因此,计算机伦理无法大力的阻止人们购买盗版软件。不止在计算机行业,在其它任何行业里,我都没有对约束用户的规则的记忆。没有了强制约束,从“囚徒困境”我们可以得出来,计算机软件用户更倾向于购买使用盗版软件。

新兴行业的伦理问题都一样严重

今天读了这么一篇文章《移民生活之理财—投资理财经历中的得与失》,作者讲述了她在加拿大的投资经验以及被投资专家误导的感想。文章中的一些话让我感觉跟在“计算机伦理”课上学的内容很相似:

我们在投资上最失败、亏损最大的就是找投资专家理的财。我并没责怪理财专家把我的财越理越少,只是对没有法律法规保障客户的利益感到不解、困惑。……投资理财专家的工作职责是什么?他们每天应该做什么?他们就应该为客户赚钱而不是亏钱,……如果他们不能为客户赚钱就是他们工作失职,而工作失职在别的行业是会受到处罚的,但投资理财专家们把客户的钱亏光了也不会受到什么处罚,……让我感到困惑的是理财专家们工作失职造成亏损不仅不受处罚还不受谴责,反倒是客户本就不该想赚钱,而应该想着亏钱。为什么就没人呼吁政府制定法律法规来约束理财专家的工作失误呢?

“投资专家”和“软件工程师”同属于比较新型的行业。我不确定投资行业有没有“Code of Ethics”,也就是所谓的“职业伦理”。但在计算机行业的伦理条款中,并没有严格的指定从业人员如何做的说明。比如说,ACM的职业伦理条款的2.1条说:

Strive to achieve the highest quality, effectiveness and dignity in both the process and products of professional work.

在职业工作的过程和产品中努力达到最高质量、效率和尊严。

在这里,条款中提到“努力”而非“必须”。而“努力”一词是一个模棱两可的概念,怎么说都行。这里的问题是我们没有一个明确的标准来判断从业人员是否“努力”到了最大程度。

另一点在传统行业里存在而在新兴行业里还不存在的是“处罚”。加拿大曼尼托巴省的律师协会的网站上有各种各样的学习案例,点进去就会看到有详细的说明这个犯错误的律师违反了“职业伦理条款”的哪一条,然后有处罚了多少钱,甚至吊销证件多长时间。而在计算机行业中,或者投资行业里,并没有类似的处罚模式。因为无论投资还是计算机领域,操作的对象都是无法预测的。没有投资专家可以保证明年投资市场会一片红,也没有计算机工程师可以保证他的作品中没有任何缺陷。

这些问题对于行业本身和行业的消费者都是非常不利的。但相较于律师、医生等传统行业,新兴行业毕竟发展时间尚短,“职业伦理”等领域大都处于真空阶段,这就需要相应的从业人员做出更深入的研究,也大概是我们学习“计算机伦理”这门课的意义所在。

March 5, 2009

翻译Python历史:Python对动态类型的使用

This post a a Chinese translation of Guido van Rossums's article "Python's Use of Dynamic Typing" on his blog named "The History of Python".

原文地址:http://python-history.blogspot.com/2009/02/pythons-use-of-dynamic-typing.html

ABC和Python间一项重要的区别是类型系统的总体特点不同。ABC是静态类型语言,意味着ABC编译器分析程序中使用的类型并判断它们被正确的使用。如果不是,程序会被拒绝并无法运行。不像今天多数静态类型语言那样,ABC使用类型推断(像Haskell那样)而不是像你在C之类的语言中看到的显式的类型声明那样。相反的,Python是动态类型语言。Python编译器高兴的对程序中类型的使用不感兴趣,所有的类型检查都在运行的时候进行。

尽管这样看上去对于ABC是一种很大的远离,但它并不如你想象的那样不同。不像其它静态类型语言,ABC不是(不曾是?它在今天确实已经是纯历史了:-))仅仅依赖于静态类型检查来确保程序不崩溃,当所有的操作执行时,它有运行期的库来为它们再次检查参数类型。这样做是因为编译器健全的类型检查算法的一部分在最初的语言原型实现中并没有被实现。运行期的库在调式的时候同样有用,因为显式的运行期类型检查可以产生漂亮的错误信息(指向实现团队),而不是解释器毫不检查参数时就盲目的运行而引起的core dump。

然而,ABC在静态类型检查外同时拥有运行期类型检查的最重要的原因是它是交互式的。在交互会话时,用户输入的ABC指令和定义在输入完成后就马上执行。在交互会话时,有可能会生成一个数字变量,删除它,然后再重新把它创建(换句话说,生成另一个有相同值的变量)成字符串。在一个单一子程序中,让一个相同的变量名先成为数字然后成为字符串是一个静态类型错误,但在交互会话中强制在不同的输入的指令里做这种类型检查并不合理,因为偶然创建的名为x的数字变量后边永远不能再用x用作其它不同类型的变量了!所以作为妥协,ABC对全局变量用了动态类型检查,但对局部变量用静态类型检查。为了简化实现,局部变量也是动态检查的。

因此,从ABC的类型检查实现方案到Python的方案只有一小步──Python简单的完全去掉了编译期类型检查。这完全符合Python的"切角"哲学,原因是如此精简实现不会引起安全问题,因为所有类型错误都在运行期中他们引起Python解释器发生故障前被捕获。

然而,一旦你决定了使用动态类型就没有回头路了。ABC的内建操作小心设计以便参数的类型可以从操作中推导出来。例如,在表达式"x^y"里编译器会推导出变量x和y是字符串,表达式的结果也是。在Python中,这样的推导基本上不能实现。例如,表达式"x+y"可能是字符串连接、数字相加、或者执行用户重载的操作。

翻译Python历史:早期语言的设计与开发

This post a a Chinese translation of Guido van Rossums’s article “Early Language Design and Development” on his blog named “The History of Python”.

原文地址:http://python-history.blogspot.com/2009/02/early-language-design-and-development.html

从ABC到Python

Python最早的、最重要的影响来源是ABC,一门由Lambert Meertens,Leo Geurts和其他CWI的人在1980年代早期设计的语言。ABC是用于教学的语言,是个人计算领域里BASIC语言的替代物。它被设计成先做编程任务的任务分析,再做许多包含严格用户测试的迭代。我在ABC小组中的任务主要是实现语言和它的集成编辑环境。

Python的缩进样式直接来自ABC,但这个想法不是最早不是从ABC开始的--它已经被Donald Knuth所提倡成为了著名的程序风格概念。(occam语言也用这种格式。)然而,ABC的作者发明了由冒号来分隔引导句子和缩进内容。在早期的用户测试没有冒号方式后,我们发现没有冒号的版本的缩进含义让初学者在开始的时候搞不清楚。冒号的添加显著的使语言清晰了:冒号引起了人们对下文的注意,并且使上下的段落处于正常的位置。

Python的主要的数据类型也继承自ABC,尽管其中的一些有了改变。ABC的列表(list)是真正的包或者多重集合,使用了一种修改了的B-树来保证它总是有序的。它的表格(table)是联合的数组,简单的按照key排序。我觉得所有的数据类型都不适合来表达,例如,从一个文件里读入几行被认为是一个常用案例。(在ABC里你要用一个table来储存这些行,而这些行是通过行号来作为key的,但这样依赖插入和删除就很复杂。)所以我把列表类型变成了一个有插入删除操作的灵活的数组,使用户可以完全的控制元素在列表里的顺序。sort方法给出偶尔需要的有序结果。

我同时也把有序的表格的实现换成了哈希表。我选择哈希表因为我相信这样比ABC的B-树实现更快、更简单。后来从理论上证明了对于各种操作在空间和时间消耗上B-树渐渐的更优化,但从实践上来说,由于B-树的复杂性,这难以被正确的实现。同样的道理,小型表格的效率也成了次级优化。

我保留了ABC的不可变的元组(tuple)类型--Python的元组打包和解包操作是直接取自ABC的。因为在内部元组是用数组表示的,我决定添加像数组一样的索引和切片。

给元组添加像数组一样的接口的结果之一是我必须想出一些方法来解决当元组长度为0或1时的情况。我从ABC那里获得的一条原则是每个数据类型在打印或转换成字符串的时候,应该被表示成合法的语言分析程序的输入的形式。所以,我需要对长度为0和长度为1的元组做记号。同时,我不想让单一元组和没有圆括号的表达式之间没有差别,因此我了一个丑陋但实用的方法:逗号把一个表达式变成长度为一的元组,“()”则代表零长度的元组。在Python的元组语法中,圆括号并不经常用到,除了这里:我觉得用“没有”来表示空元组太容易让真正的排版模糊了。

Python的字符串与ABC的字符串用非常相似的(不可变的)语义开头,但用了不同的符号和基于0的索引。因为我目前有三种可索引的类型:列表、元组、和字符串,我决定把它们泛化成一个通用概念:序列。这个泛化使一些核心操作变得非常可靠,如获得长度(len(s))、索引(s[i])、分片(s[i:j])、和迭代(for i in s)都运作在任何序列类型上。

数字是与ABC不同的地方之一。在运行期,ABC有两种数字类型:exact型表示任意精度的有理数,approximate型表示有扩展指数范围的二进制浮点数。我没有选择有理数类型。(轶事:一次我尝试着用ABC来计算我的税务。程序看上去非常直白,但用了太长的时间去计算少量简单的数字。经过调查,我发现它用上千位的精确度来运算数字,但他们最终在输出的时候被四舍五入到盾(荷兰货币单位)和分。)因此我为Python选择了更传统的机器整数和机器二进制浮点数模型。在Python的实现中,这些数字分别被简单的表示成C语言中的long类型和double类型。

感觉到无限精确的数字有它的重要性,我加入了大数(bignum)类型,并把它称作long。我在几年前改进ABC的实现的时候已经实现了大数(在ABC的原始实现中,我对ABC的最初的贡献之一是使用了内部表示的十进制数)。因此,我在Python中用了这段代码。

尽管我在Python中加入了大数,我还是要强调我不想把大数运用在所有的整数运算上。通过我和在CWI的同事们写的优化Python的程序中,我知道整数操作表示了在多数程序中占了绝大多数。到目前为止,整数最常见的用途是在内存索引序列。因此,我猜想机器整数被用在绝大多数的情况下;而大数仅仅被用在“严密数学”或者计算以分来计的国家债务上面。

数字的问题

数字的实现,尤其是整数,是我犯了许多严重设计错误的一个方面。但我也在思考Python设计的时候学到了很多。

由于Python有两种不同的整数类型,我需要想出一种方法来在程序中分辨它们。我的方案是让用户在需要long型数的时候明确的在数字的末尾加上L(如1234L)。这是Python违反ABC的用户不需要关心底层细节实现的一个方面。

不幸的是,这只是许多大程序的一小部分细节。一个更过分的错误是我对于整型(integer)和长整型(long)的实现在某些例子上有略微不同的语义!因为int类型是用机器整数表示的,运算溢出时会默默的翻转32位数,就像C的long类型那样。另外,int类型一般是有符号数,但在按位运算和移位运算时是按照无符号数来算的,并会被转化成八进制和十六进制表示。另一方面,长整型数永远被认为是有符号数。因此,在参数分别是int和long类型时,一些运算会产生不同的结果。例如,一个32位运算1<<31(1往左移31位)会产生最大的32位负整数,1<<32会产生0,但1L<<31(长整型1往左移31位)的结果是长整型数2的31次方,1L<<32的结果是2的32次方。

为了解决这个问题,我作了简单的修正。我让多数运算操作在结果无法存下时抛出OverflowError异常。(唯一的例外是上面提到的“位运算”操作,我假设用户希望的是C语言里这些操作的行为。)在没有添加这个检查时,Python用户无疑已经开始写依赖符号二进制模运算2**32的语义(像C语言那样),但修改这个问题增加了社区用户转换时的困难。

尽管添加溢出检查看上去只是一个微小的细节变化,但痛苦的调试经验让我认识到这是个有用的功能。作为我早期的Python编程实验之一,我试过实现一个简单的数学算法来计算“Meertens数”,一个由Richard Bird为了CWI里ABC作者的第25年庆发明的消遣数学算法。前几个Meertens数很小,但当我把算法翻译成代码时,我意识到计算的中间结果比32位大的多。在我发现这一点前,它耗费了我又长又痛苦的时间来调试。于是我那时决定解决所有整数操作溢出的问题,并当结果不能用C语言的long类型表示的时候抛出异常。溢出测试的额外消耗比我实现为新结果选择分配对象时花费的总开销要小。

不幸的是,我难过的说抛出溢出异常也不是正确的解决方案。那时候,我正在沉迷在C语言的规则“对数字类型T的操作返回T类型的结果”。这条规则也是我在整数语义中的犯的另一点大的错误:切断整数除法的结果,我会在后面的blog文章中讨论这一点。事后来看,我应该让会溢出的整数操作把它们的结果提升成为long类型。这是今天Python工作的方式,但用了很长时间来做出这个转换。

除了数字问题,我从这次经验中获得了一个非常正面的事情。我决定Python中不应该有没有定义结果的值,反之,在无法运算正确的返回值时,总应该抛出异常。因此,Python程序不会因为未定义的值无声的在底层传递而出错。这对语言本身和标准库来说,仍然是相当重要的一点。

March 3, 2009

怎么回事?

What's Up?

Mac OS X的Dashboard的单位换算widget。货币汇率换算方面的信息来自Yahoo Finance,估计是那边出了问题。

co.mments.com走好

我在之前的一篇文章里表达过对co.mments这款网络服务的惋惜。我也确实不明白为什么这么好的服务就没有公司有兴趣,是因为经济危机导致风投们噤若寒蝉了吗?

那篇文章的最后,我说我在co.mments的blog上看到作者说正在寻求资金来源,因此co.mments很可能不会被关闭。当时我的感觉是这么一个优秀的网站怎么会没有公司有兴趣,因此就完全放下心来,没有继续关注这件事。

今天我又想添加一个blog的留言记录,书签栏上的快捷方式运行了半天也没出结果。于是我到它的网站上看看,没想到现在网站上只剩下了这些内容:

co_mments_closed.png

看来co.mments确实是走到了尽头。尽管无限惋惜,但还是只能祝它一路走好。

March 2, 2009

囚徒困境告诉你伦理学的重要性

关于囚徒困境,可参考相关的维基百科页面

在学“计算机伦理”这门课的前几个星期,我一直不解这门课的意义所在。似乎我们学计算机的要学这门课,只是因为我们缺少其它学科内的伦理知识基础。那时我的理解是:学计算机科学就是学习编程、算法、数据结构、人工智能之类的“硬”本事,而相关的伦理,有谁不知道吗?谁不知道“盗版不合法”,“隐私需要保护”这些道理呢?

今天在阅读ACMCIPS的正式伦理条文时,忽然明白了为什么我们应该这么重视伦理学的研究了。

从囚徒困境的结论看来,一个人在面临相应的情境时,选择信赖另一方几乎被认定是肯定要吃亏的,而自己则几乎肯定会把责任推给另一方。推而广之,在任何类似的利益角逐中,参与者都肯定会选择损害他人利益而使自己获益。这是另一种“性恶论”。虽然悲观,但此结论在现实中屡试不爽。

认定了结果的悲观性质中,我们就要想办法让它在某种程度上变的更美好。其中最简单的方法是“顺其自然”,也就是“吃一堑,长一智”。这次你选择相信另一方而吃亏了,那你在下一次遇到相似的情况时,有相当大的几率就选择不信赖另一方。当群体中有足够的个体都学会了这一“智”后,我们就达到了一个从总体上看来美好的境界:每个人都不信赖对方,得到最公平的结果,即谁也不吃亏,谁也别想得到比别人多的利益。

这种方法至少有两个缺陷。一、如果在囚徒困境中选择的最坏结果是“死刑”,那么选择信赖对方的囚徒就没有了第二次机会“报复”。二、群体都这样做,虽然对大家都公平,但大家都得到的是最少的利益。这样我们就需要有工具来保证人们在选择时,都选择信赖对方,从而获得最优的结果。

在当今社会,这种工具叫做“法则”。法则在极端的例子里,就成了“法律”。比方说,在法制社会,以刑法为代表的相关法律有效的遏止了“杀人”这种罪行。在没有法律的时代,“报仇”是我们熟悉的名词。相关的文学作品中,“杀人偿命”之类的例子也屡见不鲜。而在法制社会,人们运用更有效的工具,一方面减少了“杀人率”,另一方面也减少了“报仇率”。人们更倾向与用法律来保障自己的利益,而不是通过个体的武力来解决问题。

极端的例子只是少数,社会上实际有很多问题是法律的能力范围之外的,比方说各种“纠纷”。例如早期的“工资纠纷”:由于招聘的时候没有签订合同,因此在结算工资时就无法使双方满意。“囚徒困境”的结论是老板想少给员工钱,员工想多拿老板钱。当然随着法律的不断完善,类似的纠纷会不断减少。但当我们没有法律时,就需要相应的“伦理”来解决问题。

不同于文字意义上的广义“伦理”,我们这里说的伦理可能有所不同。我理解的伦理是:一个行业里的公认准则。打个比方说,在这个页面我们可以看到ACM会员所公认的伦理中有下面几条最关键的(注:我的中文翻译不是官方条文):

  • Contribute to society and human well-being. 为社会和人类做贡献。
  • Avoid harm to others. 不伤害他人。
  • Be honesty and trustworthy. 诚实守信。
  • Be fair and take action not to discriminate. 做事公正,不歧视别人。
  • Honor property rights including copyrights and patent. 尊重财产权利,包括版权和专利权。
  • Give proper credit for intellectual property. 对知识产权给与合理的荣誉。
  • Respect the privacy of others. 尊重他人的隐私。
  • Honor confidentiality. 名誉保密。

这些是ACM的伦理条文的总括性的几条,条文后面还有更细致的条款。

行业人员在这些条款的约束下,选择我们看起来更加合理的方式来解决各自的“囚徒困境”。这样的约束,保证了行业从业者会选择互相信赖,从而使每一方的利益都最大化。