一月读书笔记:寻找目标

又好久没有写东西了,主要是因为工作和生活都比较忙碌。这段时间ChatGPT比较火,也在知乎参与了一些讨论。作为一个NLP圈内人,其实早在大众之前我们就已经关注到这个模型。不过除了模型的强大,OpenAI CEO奥特曼的生平事迹也很有冲击力,恰巧也和今天想写的东西有点关系。 在陪产假和春节假期期间,除了初为人父的喜悦,最大的收获就是读了两本书。一本是冯友兰先生的《中国哲学简史》,另一本是畅销书《认知觉醒》。说实话哲学简史这本读起来还挺费力的,因为好多诸子百家的观点是直接引用文言文且没有注释。也正是因为这个原因,才挑了一本现代书籍搭配起来阅读,好在《认知觉醒》还挺不错。 按照《认知觉醒》里的方法,读完一本书要留下一些最打动自己的东西,写出来。所以今天这篇的主题也很聚焦,就是“寻找目标”。哲学简史里讲到儒家的时候,有一节是《知命》,里面引用了论语里的名句 君子坦荡荡,小人长戚戚 不知道大家是否准确知道这句话的意思,翻译成汉语是“君子光明磊落、心胸坦荡,小人则是斤斤计较,患得患失。”。在书里,冯先生更多讨论的是个人和外界的关系,知命的人可以 竭尽己力,成败在所不计 但我认为这里的命,也和自身有关,是自己的使命。唯有找到使命,方有竭尽己力的方向。孔子自然是知道自己的使命,他希望在乱世之中重建礼乐秩序,而且一生为之奋斗。奥特曼身上我感觉也有这种气质,才能在大模型这条路上坚持下来。 反观自己,在这方面还有很大的欠缺。因为没有找到”使命“,只能退而保证”先把每件事做好“,虽然看上去也能取得一些小成果,但这种模式很难产生系统性的大成果,也更容易计较当前的得失。要捡多少芝麻才能拼成一个西瓜?这种模式的天花板实在太低。 也不是没想过要寻找可以作为使命的目标,但之前确实犯了一些错误,导致效果不佳。比较大的一个问题是“过犹不及”、“眼高手低”——太想定一个宏大的目标了。我们能看到的成功案例往往是非常难得的,几千年只出了一个孔子,这么多公司也只有一个乔布斯,如果一上来就把他们的成就作为标准去找目标是不合适的。特别是像我这种早年求学经历比较顺利的人,很容易有这个问题,总想着、等着干大事,觉得一些当下可以干的事情不够性感。其结果就是没有目标,先随大流,让自己保持选择的权利。我现在感觉可以逐渐提高目标的难度,先尝试定2-5年内的目标,再扩展到10年、15年。 《认知觉醒》里有一节专门介绍了如何寻找人生使命,虽然有些泛(比较适合用来定15年甚至更长时间的大目标),大家也可以参考 真正的觉醒者往往会有意无意地用感知力来代替思考力,比如《美好人生运营指南》一书的作者一稼就提出了6条寻找人生使命的建议。 这个世界有很多事情可以做,你最想帮助哪些人? 什么事让你废寝忘食? 你在做什么事情的时候最让自己感动? 你最让人感动的时刻是什么? 如果没有任何经济压力,你会如何度过余生? 闲暇的时候,你关注最多的是哪方面的信息? 今年,给自己定一个预目标,就是找到未来5年的目标。 2023.2.12更新 这几天朋友圈都在传精仪师兄们刚上市的公司禾赛,点进李师兄朋友圈,他对自己上市演讲视频配的文字是 To achieve great things, two things are needed: A PLAN, AND NOT QUITE ENOUGH TIME.

February 9, 2023 · 1 min · Yuanhao

ChatGPT在内容创作行业,依据现有的法律,它创作的内容是否享有著作权?如不能,如何界定内容的归属?

很实际的问题,之前并不是很了解。看了一些资料勉强答一波。 首先,我国《著作权法》所保护的对象是“作品”,其定义在第3条进行了列明,即“文学、艺术和科学领域内具有独创性并能以一定形式表现的智力成果”。在这里跟本题最相关的一个作品属性是“独创性”。根据资料2的论述,法律界对目前AI的认识我感觉还是比较到位的,即当前的所谓AI并不具备创造性,因此ChatGPT之类的AI工具,性质为“帮助自然人进行创作活动的工具”,其自身无法自主思考,不是进行自主创作主体,AI软件对文章的生成是开发者意志的延伸。 《著作权法》第2条规定了“中国公民、法人或者非法人组织的作品,不论是否发表,依照本法享有著作权”。因此著作权仅能由民事主体享有,但AI并不是民事主体,因此AI本身无法作为作品的作者,但使用AI的人是可以的。 至于人是否可以享有AI生产作品的著作权,也要根据实际情况判定。主要的依据也是上面的独创性。 下面是两个案例,第一个是不享有著作权的 在北京知识产权法院于2020年审结的“北京菲林律所诉百度公司著作权侵权案”中,菲林律所发布的大数据报告被他人在未经同意的情况下转载至百度百家号,菲林律所由此认为百度公司侵犯了其著作权中的信息网络传播权,遂向百度公司主张侵权赔偿。法院经审理,认为菲林律所所提交的大数据报告仅是根据现有数据搜集并分析而形成,不具备独创性,不属于《著作权法》的保护范围。 第二个是受著作权保护的 2018年8月,腾讯公司在其下属网站中发布了一篇由腾讯旗下人工智能写作软件Dreamwriter生成的新闻,而该文在当日即被网贷之家转载,腾讯公司遂向法院起诉。法院经审理认为,相关文章“外在表现符合文字作品的形式要求,其表现的内容体现出对当日上午相关股市信息、数据的选择、分析、判断,文章结构合理、表达逻辑清晰,具有一定的独创性”,同时认为“该文章的表现形式是由原告主创团队相关人员个性化的安排与选择所决定的,其表现形式并非唯一,具有一定的独创性”,并最终确认该篇由人工智能软件生成的文章属于《著作权法》下的“文字作品”,受到我国法律的保护。 最后,我想说,权利和义务是伴随的。ChatGPT之类的工具,经过大量语料训练,有一定概率会有侵犯他人著作权的情况出现。作为使用者,平常玩玩无所谓,一旦用于正式文本的产出一定要把好关。避免自己陷入侵权的窘境。 参考资料 https://www.sohu.com/a/592470873_398071 http://www.anlilaw.com/100031/200 我在知乎的原回答

February 3, 2023 · 1 min · Yuanhao

依据现有 AI 的发展速度,类似 ChatGPT 这样的产品,距诞生自我意识还有多远?

这个问题其实可以用两个著名的思想实验,从技术和哲学两个角度来回答。 第一个是“中文房间”,是一个著名的思维实验。它是由美国哲学家约翰·赛尔在上世纪八十年代设计的。 这个实验是说你想象一个只会说英语的人身处一个房间里,这个房间除了门上有个小窗户,其他地方全都是封闭的。这个人有一本用英语写成的书,里面指示了该如何处理接受到的中文信息,并且用中文进行回复。房间外面的人不停地向房间里塞进用中文写成的问题,房间里那个说英语的人查阅手边的那本指导书将合适的中文回答递出房间。 虽然房间里的人可以和房间外的人对答如流,房间外的人以为房间里作着个懂中文的人,但实际上那个人只会说英语,只是那本包罗万象的指导书太牛逼了。 套在这个问题里,ChatGPT就像那本指导书,如今的技术让人类真的可以造出这样的东西了。ChatGPT巨大的训练语料就意味着这个模型可能阅读过这个世界上相当大比例的文本,不管是书籍、论文还是博客文章,甚至是代码片段,然后给你一种无所不知的感觉,这也是为什么ChatGPT可以有如此令人惊艳效果的原因。作为在屋外的人们,很有可能认为屋里的人有理解能力,甚至有意识。 如果对技术有一定了解就会知道,当给定输入的时候,ChatGPT这样的模型做的最多的就是非常确定性的加减乘除等等数学运算,在某些环节,这些模型会输出一个概率分布,通过在这个输出的分布上进行随机采样,来达到一种丰富、随机应变的效果。 关于生成式模型的输出采样,可以参考我之前的文章:https://zhuanlan.zhihu.com/p/114669778 和https://zhuanlan.zhihu.com/p/115076102。 不夸张的说,如果把这种随机采样换成贪心采样,也就是每次都取概率最大的输出,那这个ChatGPT一下就会从牛逼闪闪变成木讷呆板。所以,从技术角度说,ChatGPT距离自我意识还相当遥远。 另一个词是“图灵测试”。 图灵测试的内容我直接摘抄维基百科 1950年,图灵发表了一篇划时代的论文,文中预言了创造出具有真正智能的机器的可能性。由于注意到“智能”这一概念难以确切定义,他提出了著名的图灵测试:如果一台机器能够与人类展开对话(透过电传设备)而不被辨别出其机器身份,那么称这台机器具有智能。这一简化使得图灵能够令人信服地说明“思考的机器”是可能的。论文中还回答了对这一假说的各种常见质疑。图灵测试是人工智能哲学方面首个严肃的提案。 或者是这样 如果一个人(代号C)使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题。对象为:一个是正常思维的人(代号B)、一个是机器(代号A)。如果经过若干询问以后,C不能得出实质的区别来分辨A与B的不同,则此机器A通过图灵测试。 我相信当下的ChatGPT已经非常接近或者已经可以通过图灵测试了。那么从这个角度来说,机器已经相当与能思考,或者说有自我意识了。 我在知乎的原回答

February 3, 2023 · 1 min · Yuanhao

ChatGPT渗入到内容行业后,是否会造成剽窃、作弊成灾?会扼杀人类的内容创造力吗?

我的想法是剽窃、作弊成灾是会的,但扼杀人类的内容创造力是不会的。 首先人工智能模型造成剽窃、作弊的现象是近几年才出现的新情况,这也是模型水平进步的一个表现。而且,这种模型导致的剽窃和作弊相比于原来的形式还有比较明显的差别。要理解这件事情,还需要稍微了解一下这些模型的训练方法。 以ChatGPT为例,它最重要的一个环节是语言模型的预训练。它所依赖的语言模型是来自OpenAI的GPT-3.5。以他的前身GPT3来说,训练这个模型的数据来源如下 来自https://en.wikipedia.org/wiki/GPT-3#GPT-3.5 从表里可以看到,即使是让普通人觉得已经无所不包的维基百科只占到了训练数据的3%,可见训练一个顶级的语言模型需要多少数据。训练的过程有点像填字游戏,让模型看一小段文本,让它猜测后面接着的文本是什么。是不是有点像人类的背诵? 而这么巨大的训练语料就意味着这个模型可能阅读过这个世界上相当大比例的文本,不管是书籍、论文还是博客文章,甚至是代码片段,这也是为什么ChatGPT可以有如此令人惊艳效果的原因。它看过的这些文本,最终是形成了一个巨大的概率分布,例如看到“世界”,它会知道后面也许会跟着“杯”或者“地图”,它们有着不同的概率。 所以这种模型的剽窃和作弊是隐性且抽象的,需要人类用问题把模型的知识“钩”出来。虽然稍微不一样的钩子就有可能从模型钩出很不一样的结果,但由于这写结果本质上都符合模型训练时语料的概率分布,所以很有可能就会触发剽窃和抄袭。这确实是一个两难的问题,如果没有这海量的训练数据,就没有令人惊艳的模型,但这么大量的数据要把版权问题搞得清清爽爽也绝不是一件易事。 但对人类创造力的扼杀的担心我觉得大可不必。首先,模型暂时还没有实时进化的能力,ChatGPT的训练数据停留在2021年,它并不知道2022年底中国会突然放开防疫政策,那以此为题材的创作显然与他无缘。 其次,真正的创造欲望和创造力哪会因为创作之后会有人剽窃就减弱?那是一种使命感,是不吐不快的感觉。 大家都知道保护知识产权有利于激发社会创新创造,但近几十年来的开源运动也证明了这不是唯一的路径。在人人为我我为人人的开源软件世界,这种开放反而极大地促进了技术的进步和传播。说不定以后在AI模型领域也会有这样的运动,人们贡献出自己产生的语料供模型学习,然后用适当的license系统保证产出的模型可以被合理、公平地被使用。 我在知乎的原回答

January 31, 2023 · 1 min · Yuanhao

以 ChatGPT 为代表的「大模型」会是多大的技术革命?如果要发生技术革命需要具备哪些条件?

作为一个近几年语言模型大潮的经历者谈一谈自己的看法。 ChatGPT is ’not particularly innovative,’ and ’nothing revolutionary’, says Meta’s chief AI scientist 上面一句话是Yann Lecun说的,虽然被网友群嘲柠檬精,但我是比较认同的。我感觉”大模型“确实是一个革命,但ChatGPT更适合作为这场革命阶段性胜利的一个里程碑。而其实这场革命的火种早就已经播下了。 这场革命如果往早了说,我觉得可以追溯到连接主义的诞生。 连接主义(connectionism),又称为仿生学派或生理学派,其主要原理为神经网络及神经网络间的连接机制与学习算法。 这一学派相信神经网络是实现人工智能的方式,上世纪40年代就出现了。但它的发展历程很曲折,经历过很多高光时刻,也多次陷入低谷 我们先来看一组数据: 人脑是一个极其复杂的器官,由大约1000亿个神经元、大致相同数量的非神经元细胞和数万亿个神经连接组成。 如果你希望要用神经网络来实现人工智能,自然的想法就是神经网络的规模要跟人类大脑相当。也就是说足够”大“会是一个非常朴素的需求,他并不是最近才出现的。 前几天横空出世的AI 爆款产品ChatGPT,可以聊天、写代码、解答难题、写小说,其技术底座正是GPT3.5 大模型,参数量多达1750 亿个。 从上面的数据可以看出,目前牛逼的神经网络参数量已经跟人脑的神经元数量相当了。但了解神经网络的朋友应该会知道,上面所说的GPT3.5的参数量实际上是要跟人脑中的神经连接数进行类比,而不是神经元个数。也就是说目前最牛逼的神经网络容量和我们的脑容量还有数量级的差距。 在当下,大部分人都会相信我们堆更大的模型用更多的数据还能够提高神经网络的能力。于是短短几年间,从BERT的1M参数已经进步到GPT3.5的175B参数。 但在若干年前,这个事情还不是这样,人们想大也大不起来。因为没有找到合适的结构,也没有合适的训练方法,可能硬件也不够给力来让神经网络越大越好这件事成为现实。直到Transformers模型和基于掩码的非监督训练方式出现,事情才发生转机。所以往近了说,这场革命应该归功于这两件事,ChatGPT的祖宗GPT在2018年就出现了。 要说这革命有多大,我感觉目前的结果还是不如前面第一和第二次工业革命大。那两次都是极大地改变了人类的生产方式,丰富了人类的物质生活,实现了例如探索宇宙这样之前无法办到的事情。现在的ChatGPT相比起来还差一些。但是AI4Science领域也有很多激动人心的结果,未来还有很大的潜力。 我在知乎的原回答

January 30, 2023 · 1 min · Yuanhao

目前ChatGPT 已应用到论文写作、剧本创作、媒体内容生产,是解放生产力的机会还是被AI支配的开始?

我感觉问题中的两个选项并不是互斥的,而且所谓被AI支配的开始甚至都不是一个合格的选项,为什么这个开始是ChatGPT,不是计算机的发明,甚至是二极管的发明呢?但是我认为说ChatGPT是“解放生产力的机会”还是比较靠谱的。 它解放生产力的能力已经被大量的报道了,以剧本创作为例,假如你有一个绝妙的故事创意,你可以让ChatGPT快速地帮你产生好几个版本的剧本。这种机器辅助的模式可以极大地增加内容生产的效率。 但ChatGPT并不是一个可以自主创作的人工智能,它是一个以对话机器人的形式呈现的算法模型。就像是一个从不主动说话,但几乎有问必答,且学富五车的人。要把它的知识或者创造力激发出来,需要有适合它的问题。而我一直觉得提问题是一个比回答问题更有难度、更体现创意的事情。还是以前面的剧本创作为例,正是因为你有了一个绝妙的故事创意,ChatGPT才能在此基础上写出一个好的剧本,你在这个创作中的贡献是无可替代的。 以此展开,人类创作者还有很多能力是ChatGPT目前不具有的,例如ChatGPT没有情绪。他不会因失恋而难过,也没法因为看到一个漂亮的风景而开心。但很多时候,情绪才是创作的源头。 也就是说,ChatGPT是一个次时代的工具,但创作的主动权,仍然在使用它的人类手上。或者可以说,ChatGPT只会作,而不会创。在内容生产领域如果说真的会被AI支配,我认为应该是被善于使用这种次时代工具的人支配。这也是我们大家可以在其中寻找的机会。如果一个人能够快速获取大量优质的prompt(也就是给ChatGPT的问题),那确实可以在内容生产这个行当里获得远高于一般人的经济回报。但我认为,在内容或者说创意行业,几乎不可能有个体或组织可以达到“支配”行业的程度。这是一个非常分散、个性化的行当,受众的喜好五花八门,萝卜青菜都有人爱。即使好莱坞再强,世界上的其他地方还是可以拍出叫好叫座的电影。 反过来看,今天ChatGPT可以做的事情有多少是真正的创作呢?回答一些答案明确的问题?完成一些格式相对固定的文案?写一个常见功能代码?AI是面镜子,可以让人类反思到底哪些工作是真正的创意工作。当基于统计的模型(ChatGPT也是基于统计的模型)可以把一个问题解决得差不离,那它的创意属性基本上就消失殆尽了。 我在知乎的原回答

January 30, 2023 · 1 min · Yuanhao

协同滤波和它的子孙们

2022年Q4,在项目里接触了一些跟召回相关的工作,但坦白讲做的比较匆忙。整好最近在家带娃,空余时间比较系统地学习了一下,这篇小作文做个总结。 本文总结的算法都有一个共同的发端,就是大名鼎鼎的协同滤波(collaborative filtering,CF)算法。这个协同只看字面也看不出个所以然,维基百科的解释如下 协同过滤(collaborative filtering)是一种在推荐系统中广泛使用的技术。 该技术通过分析用户或者事物之间的相似性(“协同”),来预测用户可能感兴趣的内容并将此内容推荐给用户。 经典CF 最早的CF算法是user CF。这种算法包含两个主要步骤 对于当前用户,在所有用户中寻找与他最相似的一些用户 用相似用户对item的评价来作为当前用户对item的评价 我做的几个召回渠道也是基于CF的。如果把这个技术用在召回里,就是对于当前user,返回在与之相似的用户中受欢迎的item。这里面用户相似度的评价方式比较重要,例如通过计算两个用户交互过item的Jaccard距离来作为相似度。这种做法在用户集合很大时计算复杂度相当高。在早期的系统里,item的数量可能远远少于用户的数量,并且用户的相似度会随着用户行为的变化而变化。所以有人提出在item与item之间直接计算相似度,这种相似度相对稳定,离线计算好一个相似度关系表之后在线可以直接使用,这样就可以避免相似用户计算这个耗时的步骤,这种做法称为item CF。 矩阵分解 Matrix Factorization 上面的经典CF算法实际是个间接推荐的方法,人们发现可以从用户和item的交互历史中得到用户和item的关系,从而进行直接推荐。基本的思路是将user-item交互矩阵近似为user矩阵和item矩阵的乘积。具体来说,若用户数为N,item数为M,则交互矩阵为N*M,希望把它近似为N*K和M*K两个矩阵的乘积。K可以远小于N和M,这样相似度的计算复杂度将比jaccard大大降低。实际上也就是获得了K维的user和item的embedding。交互矩阵通常是0,1矩阵(称为implicit feedback data),上面的操作实际上要让有交互的user和item embedding之间的点积接近1,没有交互的embedding点积远离1。 以下图为例,我们获得了4个用户和5部电影的交互矩阵,右边是矩阵分解之后的结果。左边4*2的矩阵为用户矩阵,在一个二维空间对用户进行表征,上面5*2的矩阵是电影矩阵,在同一个二维空间对电影进行表征。右边的大矩阵是这两个矩阵相乘的结果,和左侧0,1矩阵是比较接近但不完全一致的(毕竟降维了)。对于一个user未交互过的item,我们可以拿user的embedding和item embedding做点积来预测用户发生交互的概率。 {: .align-center style=“width:80%”} Matrix Factorization示意图 {: .align-caption style=“text-align:center;font-size:smaller”} 这个算法实际上优化的是下面这个目标 $$ \min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} |A - U V^T|_F^2. $$ 学过数值分析的话会知道矩阵分解有一些经典算法,例如SVD。但这个交互矩阵A实在是太稀疏且太大了,经典算法比较难处理,因此实用的损失函数是这样 $$ \min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 + w_0 \sum_{(i, j) \not \in \text{obs}} (\langle U_i, V_j\rangle)^2....

December 23, 2022 · 1 min · Yuanhao

也聊一下ChatGPT

最近ChatGPT火了,而且火出圈了。好多不是做技术的朋友都开始关注甚至转发相关文章。从广为流传的一些例子看,ChatGPT确实做出了让大家眼前一亮的效果。聊天机器人搞了这么些年,也终于有了一个让大家都比较认可的产品。 {: .align-center style=“width:80%”} ChatGPT的结果令人惊艳 {: .align-caption style=“text-align:center;font-size:smaller”} 小迷思 前几天几个小伙伴聊天,说起ChatGPT和OpenAI,纷纷感叹为什么国内没有这样的创新公司和突破性产品涌现。几个大厂的研究院,比如阿里达摩院、字节AI Lab虽然成果也很多,但跟deepmind、OpenAI比起来差距还是很大。其实ChatGPT背后的东西并不是有多难,但为什么做出来的是他们? 今天在知乎上发现也有类似的问题,还挺火的。不少回答都从大环境的角度分析,有说我们还穷的,有说国内资源和人才不匹配的。这些固然对,但作为个体我们也可以从自己身上找找原因。前几天看到一个做AI架构的大佬在朋友圈感叹,18年就在某大厂实现了500块GPU并行训练transformer,但大家都不知道这东西能干嘛。所以有的时候并不全是资源不到位的问题。我不禁想起了马老师“因为相信,所以看见”的观点,我感觉就是差在这个境界上。从学校毕业五年多了,我感觉这也是自己目前比较大的一个问题,我们有把事情做好的能力,但却缺少真正相信且原意长期坚持的东西。 ChatGPT背后的技术 还是聊回技术。ChatGPT还没有公开的论文,根据OpenAI的博客,基本上使用的技术和他们在今年早些时候公布的InstructGPT差不多。 We trained this model using Reinforcement Learning from Human Feedback (RLHF), using the same methods as InstructGPT, but with slight differences in the data collection setup. {: .align-center style=“width:80%”} ChatGPT训练流程 {: .align-caption style=“text-align:center;font-size:smaller”} 上面是ChatGPT博客上的训练流程图,下面是早先InstructGPT论文里的训练流程图,嗯,可以说是一模一样,比较大的差别是基础语言模型从GPT3升级到了GPT3.5。 {: .align-center style=“width:80%”} InstructGPT训练流程 {: .align-caption style=“text-align:center;font-size:smaller”} InstructGPT的介绍还有图例,更容易讲清楚ChatGPT是如何训练的。这个模型的训练分为3个步骤: 从预训练语言模型出发,用标注者产生的数据fine tune一个根据提示(prompt)生成答案的模型,这一步称为SFT 用上一步训练的模型生成大量的答案,每一个prompt都生成多组,并让标注者对这些答案进行排序。用这样获得的数据训练一个奖励模型(Reward Model,RM)。这个模型会作为后续强化学习环节的世界模型。 强化学习训练。这一步有点左右互搏的意思,用RM模型作为世界模型,SFT之后的生成模型做agent,进行训练,让生成模型尽可能地在RM模型那里拿到高分。这一步使用的算法也来自OpenAI,为2017年发布的PPO算法。 {: .align-center style=“width:80%”} 强化学习基本流程 {: .align-caption style=“text-align:center;font-size:smaller”} 我对强化学习并不熟悉,只是稍微看了下PPO的介绍,这个算法的目标函数可以用下面的公式来概括,这个目标函数包含了三个部分,第一部分是标准的强化学习目标,即在reward model那得高分;第二部分是PPO的创新点,即KL惩罚,目的是让强化学习的每一步都不要更新太多(新模型和老模型的KL散度要小);第三部分是针对语言模型精调新加的,为了防止语言模型在精调的时候退化,他们在精调时把语言模型loss也加了进来。三个部分通过两个超参数β和γ进行调节。...

December 10, 2022 · 1 min · Yuanhao

大教堂与集市-part1

《The Cathedral & the Bazaar》 By:Eric Steven Raymond, 1997 基础版本:https://github.com/crazyangelo/Cathedral-and-Bazaar 基础版译注:原始版本為 1999 年 5 月 5 日,由謝志昌所翻譯;英文最新版為 2002 年 8 月 2 日的 3.0 版,由於內容更動處不少,因此逐一更新;翻譯以語句通順達意為主要考量,難免與英文版的字詞有所不同,為求盡善盡美,以 CC 授權釋出,希望各方同好自由修改散佈。 本版译注:将繁体字改成简体,并修正了一些词汇表达 第一章 教堂与市集 Linux 打破了许多软件发展的传统,这个世界级的操作系统在五年前(1991 年)仅仅靠着如丝般的网际网路,神奇地联合了散布在全世界数以千计兼职的玩家们来发展它,谁曾料到会发生这样的事情呢? 我当然也没料到,Linux 出现在我电脑萤幕是在 1993 年初,当时我埋首于 UNIX 及开放性原始码的软件发展已有十年,1980 年代中期,我是 GNU 专案首批的贡献者之一,我写过许多开放性原始码的软件放到网路上供人使用,也曾独立或协同发展好几个程序(nethack,Emacs 的 VC 和 GUD 功能,xlife,…等等),这些程序到今天仍广泛地为人所用,我想我知道这是怎么办到的。 GNU 是自由软件基金会(Free Software Fundation)的一个专案,目标是发展出 UNIX 上所有程序的自由版本,Emacs 是自由软件基会发展出来的一支程序,可做文字编辑器,提供写程序的整合发展环境,用来读电子邮件,新闻群组,甚至浏览网页。更详细的资讯请参考 http://www.gnu.org。 ―― 译注。 Linux 扭转了许多我认为我已知道的观念。多年来我一直宣扬使用小工具集、快速原型发展及程序进化的 UNIX 福音。但我也相信对于有一定复杂度的程序必需使用集中和有经验的方法来开发,我相信最重要的软件(操作系统以及庞大的工具程序如 Emacs)必须如建造一座教堂般,由个别的高手或一小群专家在光辉的孤立中小心翼翼地精雕细琢,时机未到之前,不会释出测试版。 Linus Torvald[^2] 的软件发展风格(尽早并经常发表新版本,授权每一件作者可以委托的事,不拒绝几乎到混乱程度的程序)的出现如同一个惊奇,没有令人肃然起敬的教堂,甚至 Linux 的同好们似乎组成了一个有不同流程和不同方式的大市集(Linux 的档案服务站台就是它适切的象征,每个人都服从着自由的规则),以这个风格发展出来的 Linux 既一致又稳定,表面上看来真是一连串的奇迹。...

December 9, 2022 · 3 min · Yuanhao

大教堂与集市-part2

第五章 有多少眼球驯服了复杂度 可以很明显地观察到市集模式极大地加速了除错与程序演化。另一件可以清楚明白的是,在微观上,开发者与测试者的每天活动中,市集模式如何与为何可以达到这样的成果。在本章(初版完成三年后,依据开发者多次亲身体验过的洞察力),我们将仔细的检查它的实际机制。非技术性倾向的读者可以略过这一章,直接跳到下一章去。 一个关键点是,为何没有源代码意识的使用者所报告的错不会太有用。没有源代码意识的使用者倾向报告表面上的问题,他们把自己的使用环境视为理所当然,所以他们会忽视重要的背景资料,报告错误时很少会包括可信赖的过程。 这里的问题是测试者与开发者对问题的视角不同,测试者由外向内看,开发者由内向外看。在封闭源代码的体系中,两者只会固守自己的角度谈论事情,因而对另一方深深的失望。 开源的体系则打破这条界线,使测试者与开发者可以站在同样的角度来讨论事情,这有高效多了。实践中,这将有巨大的差异,一者是只报告表象的症状,一者是以开发者那种以源代码为基础的角度来看问题。 大部分的时候,大多数的bug是可以由描述开发层级的特征来除错的,即使是不完整的描述。当一个 beta 测试者告诉你在那一行代码有边界的问题时,或告诉你在 X、Y 跟 Z 的情形下,有个变量有问题,指出有问题的代码通常就足够找出问题并修正它。 因此,对于 beta 测试者与核心开发者来说,有源代码意识的人对于双方都可以强化沟通与合作。换句话说,核心开发者的时间被节省了,即使是在有很多共同开发者的情形下。 另一个开源方式的特征是节省开发者的时间,而这是典型开源项目的沟通结构。上面我使用了「核心开发者」(core developer)这个字来区别项目核心(project core,通常很小;一个开发者是常见的,一到三个开发者则是很典型的)与项目圈(project halo)的 beta 测试者跟贡献者(通常有数百个)。 传统软件开发组织的根本问题是「Brooks法则」︰在落后的项目,增加越多程序员会使得项目更落后。一般的状况下,「Brooks法则」的预测是,随着开发者的人数增加,复杂度与沟通成本随着人数的平方上升,而完成的工作却只成线性上升。 「Brooks法则」依据的经验是,bug会在由不同的人编写的代码的接口上大量出现,而沟通损耗会随着项目参与人数的升高而升高。因此,问题的规模会随着开发者间的沟通路径而呈现平方上升。(精确的说,是 N x (N-1)/2,N 是开发者的数目。) 「Brooks法则」的分析建立在一个隐藏的假设基础上︰项目的沟通结构必须是完全图(complete graph),每个人都可以跟每个人沟通。但是在开源的项目中,开发者在有效平行分割的子项目中彼此很少互动;程序更改与bug报告是透过核心团体来处理的,只有在这样的小团体中,「Brooks法则」的分析才成立1。 还有其它原因让源代码层级的bug报告变得有效率。事实是一个错误常常会有许多可能的症状,取决于使用的的使用状况与使用环境。这些错误是一些复杂与微妙的bug(像是内存管理错误或视窗的随意中断),也是最难被发现或靠静态分析来捕捉的,这在长期的开发中造成最多的问题。 当一个测试者发出一个尝试性的源代码层级的多症状bug报告(例如,我看来在第 1250 行代码有个窗口在做讯号处理,或你在哪里把那个缓存清空),可能会给开发者一个关键的线索来发现半打的症状,这些开发者通常因为太靠近底层代码而无法发现这样的问题。在这种案例中,很难找出可从外部看见的不正确动作是从哪个bug引起的,甚至是不可能的 ―― 但是透过经常发布,就不需要知道了。其他的合作者会迅速找出bug是否已被修正。在很多案例中,导致不正常动作的源代码层级bug将被移除,甚至在还没有被报告之前就被移除。 复杂的多症状错误,通常有很多从表面症状来的方式可以找出真正的bug。这种能让测试者与开发者找出问题的方式,可能与开发环境有关,也可能会随着时间而有无法预期的变化。实际上,当测试者或开发者追踪一个症状时,都是在程序空间的一个集合中「半随机」(semi-random)取样。bug越微妙复杂,越难找出相关的样本。 对于简单与容易复现的bug,重点在于「半」(semi)而非在「随机」(random);debug技巧、对程序与架构的熟练都是关键。但对于复杂的bug来说,重点就是「随机」(random),这时人多比人少好 ―― 即使这些少数人是平均技巧较高的。 如果从表面的症状找出bug的难度大,像是一些无法从表面症状预测的,上述的结果会进一步增强。单一的开发者可能会以一个困难的方式来做第一次尝试,但其实也可以从简单的方式达到同样的结果。另一方面,假如很多人随着频繁的版本一起测试,可能就会有一个人可以用最简单的方式找到bug,节省了大量的时间。项目管理者将会发现,随着新版本发布,许多人一起用各种复杂方法追踪同一个bug的时代将会过去,尤其是在众人浪费太多时间之前2。 第六章 今花非昨花? 由 Linus 行为的研究中,我们得到了一个能解释他为什么成功的理论,所以我想要在我的新项目(当然不如 Linux 内核程序复杂和雄心勃勃)中来测试这个理论。 但我做的第一件事情是大力重组和简化 popclient 的程序,Carl Harris 的实现非常扎实,可是却像许多的 C 程序员一样,含括了一种不必要的复杂,他以代码为主,数据结构为辅,因此代码看起来漂亮,但数据结构却很特殊,甚至可以说是丑陋的(至少以这位老资格 Lisp 高手的高标准而言)。 然而,我重写程序除了改良原来代码和数据结构的设计外,还有其他目的,就是把它发展到我可以完全了解,否则负责修补你不懂的程序是一件很无趣的事。 项目进行的第一个月,我简单地依循着 Carl 原来基本设计的用意,第一个重大的改变是我加入 IMAP 协议的支持,我重构原来处理协议的程序,改成一个较为通用的驱动程序再加上三个驱动它的方法表(即 POP2,POP3 和 IMAP)。这个改变阐释了一个广义的原则,特别在像 C 这种先天上未提供动态类型的程序语言,程序员们最好谨记在心︰ 格言9︰聪明的数据结构配上笨拙的代码要比相反的组合好。3 Brooks 在《人月神话》的第九章中也说︰「光给我看你的代码,而不给我看它用的数据结构,我会一头雾水。给我看你程序的数据结构,我通常不需要再看你的代码,因为已经够明白了4。」...

December 9, 2022 · 2 min · Yuanhao