集市中迷失的一代:FreeBSD核心开发者反思开源软件质量

摘要:本文作者Poul-Henning Kamp (phk@FreeBSD.org) ,26年的计算机程序员,他编写的软件以底层构建块的形式广泛被开源和商业产品采用。讲述作者在看完《设计原本》这本书后所引发的共鸣!

13年前,新兴的草根开源软件运动如火如荼,而Eric Raymond的《大教堂与集市》(O'Reilly Media, 2001)一书则重新定义了我们的词汇表,几乎预言了瀑布模型和大型软件公司的终结。这本书有煽动性,但却没有说服我。与此同时,由于我正全身心投入开源运动,也就情不自禁地宁愿相信他是对的。

而今年夏天我带到海滨别墅来的这本书,同样有煽动性,比Raymond那本更甚(但这本书在提到《大教堂与集市》时是相当正面的),那就是 Frederick P. Brooks的《设计原本》(Addison-Wesley Professional, 2010)。Brooks这本书不断引发我的共鸣,我也越来越佩服他的语言表达能力和他提出的观点,然而越是有共鸣,就越感到难过和失望。

enter image description here

13年前,正值.COM热潮涌动,年轻的Web程序员比比皆是,辍学创业的大学生也屡见不鲜。在向其中一些人传授过去那些编程技巧的同时,我也获得了很多乐趣。像什么测试恢复备份、写脚本安装操作系统、版本控制等等。当然,现在再看,也就那么回事(有些事并不像你印象中那么激动人心,对吧)。而且,我们已经无路可逃,整个.COM时代总体上对IT/CS而言就是一场灾难,尤其对软件质量和Unix来说,更是如此。

好像从来没有人分析过.COM泛滥那些年,IT行业增长了多少。以我个人的经验,我估计整个行业(包括IT行业由此新增的就业机会)大概增长了两个数量级,或者更确切地说,达到了原来的百分之一万(100倍)。

学会计算机编程很容易,就像学会用钉子把两块木板钉到一起一样简单。但问题是——打个不恰当的比方,市场对“钉在一起的两块木板”的需求,除了“自豪的爷爷”的那点天伦之乐以外,真的是太小了。而且,由此再进一步学习钉椅子或做碗橱,都需要天分、实践和训练。我们增长的这99倍恰恰都来自那些既没有实践经验,又没有受过良好训练的人。等这些人有时间学习和接受训练了,聚会已然结束,大多数人失去了工作。可以乐观地假定那些坚持下来的人最有天分,而且经验也最多,即便如此我们还是无路可逃,因为作为IT专业人士,由于缺乏基本功,他们大多数都很滥!

不幸的是,Raymond鼓吹的——与.COM泡沫之前精心建造大教堂的理念恰恰相反的集市模因(meme)1——“对付过去就行”,并没有随.COM泡沫破裂死去。今天,Unix这艘大船正因为难堪重负而迅速沉没。

模因论是基于达尔文进化论的观点解释文化进化规律的新理论。参见这里。——译者注

我刚升级了自己的笔记本电脑。到现在,我运行FreeBSD开发版已经足足有18个年头了,但从源代码编译我的Spartan工作环境仍然要花一整天时间,因为它必须理清头绪,在Raymond那乱糟糟的软件集市中建起一座大教堂来。

宏观上讲,FreeBSD的Ports Collection会尽力为这个集市画一幅地图,以便FreeBSD用户轻易找到自己的应用。目前来看,这幅地图由22198个文件构成,而这些文件就是集市中每个摊位的简要说明:用寥寥数语告诉你某个摊位卖什么,要了解详细信息再去哪里找。此外,还有23214个Makefile,告诉你可以对每个摊位上的软件做什么。这些Makefile还想让你知道自己都有哪些选择,要选择什么,以及不作选择时用什么默认值比较明智。为方便起见,这幅地图还提供24400个补丁文件,以便弥补这些玩艺儿在制作工艺上的瑕疵,但一般来说,还是因为它们携带(portability)不便,所以才催生了这些补丁。

最后,地图提供一些建设性意见,比如要是你想要www/firefox,那得先得到devel/nspr、security/nss、databases/sqlite3,等等。在你手拿地图,查到这些依赖,以及这些依赖的依赖之后,你会发现自己的购物清单上已经记满了122个包,你必须在能买www/firefox之前买全它们。

当然啦,模块化和代码重用都是好主意。可是,就算在最简单的情况下,CS/IT的代码重用信条在集市里也没有用武之地:FreeBSD Ports Collection中的软件最少都包含1342个复制粘贴加密算法。

如果有人奋不顾身或者偏听偏信,非要代码重用,结果真制造出了自身完备且无依赖的软件包,那要换得这个容易管理的包,享受代码重用的成果,就算多花点银子也值啊!但这样的事并没有发生过:各种包把Web搞得一团糟, 随便依赖,互相纠缠,代码越重用,浪费越严重。

举个浪费的例子吧。Sam Leffler的graphics/libtiff是前面提到在安装www/firefox之前必须安装的122个包中的一个,但安装后的Firefox浏览器却无法渲染TIFF图片。问题出在哪里我还没来得及查清楚,但这122个包中的10个需要Perl,7个需要Python;这其中又有一个devel/glib20,同时有赖于Perl和Python,至于为什么,我到现在都没想通。

继续往下看你的购物清单,你会不断会发现满足彼得定律的应用。所谓彼得定律,就是说在一个根据人的业绩、成就和价值来提拔人的组织中,最终会把一些人提拔到他们并不胜任的位置上。这个定律经常被通俗地说成“把员工提拔到他们不胜任的职位上”。软件行业也一样,你会发现自己需要三个不同版本的make程序、一个宏处理器、一个汇编器和其他一些必要的包。而在这个“食物链”的末端,则是libtool,它试图掩盖一个事实,即在Unix中没有构建共享库的标准方式。的确没有适用于所有Unix变体的标准方式——比如给ld(1)命令加个标签之类的;而此时彼得定律就适用了:这个工作被交给了libtool。此时此刻,彼得定律确实牛,devel/libtool的源代码达到了414 740行,而其中有一半是测试用例。原则上讲,这倒是值得称赞的,但实际上这却是彼得定律的结果:这些测试煞费苦心地在那里验证一个本来就不该存在的问题的复杂方案是否功能齐备!更让抓狂的是,其中31 085行代码都保存一个叫configure的shell脚本里,代码格式之乱,任谁也难看明白。这样做是想让configure脚本执行大约200个自动测试,从而免除用户手工配置libtool之苦。这个想法很滥,早在1980年代刚刚出现时,就招来很多非议。因为源代码是靠configure脚本的伪装才让人感觉它可移植的,而实际上并非真正可移植。可以说它是配置思想的余孽。

1980年代出现过很多不同的Unix实现:Cray-1s及其24位指针、Amdahl UTS主机Unix、来自微机制造商的大量的SysV+BSD混搭、Data General等公司开发的准Unix“垫片”,甚至连油漆厂Mark Williams都有纯粹的Unix克隆Coherent。

当时的configure脚本是用手写的,用于检测当前系统是BSD还是SysV风格的Unix,然后根据检测结果把一个或另一个Makefile(有时候还带一个.h文件)复制到指定位置。后来,这个configure脚本的神通越来越大,而且不折不扣地印证了彼得定律。我们没有看到Unix采用标准做法来消除对该脚本的依赖,反倒是有人写了一个叫autoconf的程序,用来自动生成configure脚本。

今天,Unix/Posix一脉的操作系统,就连IBM的z/OS主机版,都跟1980年代那些完全一样;libtool这个configure脚本中的31 085行代码仍然还要检测<sys/stat.h><stdlib.h>是否存在,即便是没有这两个文件的Unix变体,在既没有足够内存执行libtool,也没有足够硬盘保存其16MB源代码的情况下。

为什么会这样呢?

由于尚不知晓的原因,autoconf是用晦涩的M4宏语言写的,因而实际的测试代码如下:

  1. ## Whether `make' supports order-only prerequisites.  
  2. AC_CACHE_CHECK([whether ${MAKE-make} supports order-only prerequisites],  
  3.   [lt_cv_make_order_only],  
  4.   [mkdir conftest.dir  
  5.    cd conftest.dir  
  6.    touch b  
  7.    touch a  
  8. cat >confmk << 'END'  
  9. a: b | c  
  10. a b c:  
  11.        touch $[]@  
  12. END  
  13.   touch c  
  14.   if ${MAKE-make} -s -q -f confmk >/dev/null 2>&1; then  
  15.     lt_cv_make_order_only=yes 
  16.   else  
  17.     lt_cv_make_order_only=no 
  18.   fi  
  19.   cd ..  
  20.   rm -rf conftest.dir  
  21. ])  
  22. if test $lt_cv_make_order_only = yes; then  
  23.   ORDER='|' 
  24. else  
  25.   ORDER='' 
  26. fi  
  27. AC_SUBST([ORDER])  

毋庸讳言,这超出了大多数程序员的承受能力。即便有人有这个能力,但给autoconf指定输入文件都是用复制粘贴的,所以就让人不容易发现日益膨胀的那些涵盖诸如前述“标准测试”的标准宏,这些宏都是为了处理20年前并不存在的兼容性问题。

可能这就是为什么针对我系统里根本没有的Fortan编译器,libtool的配置探针就有不少于26个名字,而且还要再执行26个测试,检测这些根本不存在的Fortran编译器分别支不支持-g选项的原因。

这是由Raymond在其书中称颂的集市模式导致的悲哀的现实:一坨脓包似的权宜代码,被一群盲目的根本不知IT架构为何物的所谓IT“专业人士” 永无休止地复制着,粘贴着。这事儿放在今天你也许很难相信,但就是在这令人无比尴尬的混沌之下,沉睡着美轮美奂的Unix大教堂的遗迹,而它正是因设计简约、功能实用、执行优雅而著称于世的。(世间荣耀就此消失……)

Brooks提出了很多有见地的观点,其中一个就是所谓质量,只有在某人对它负责时才有意义,而这个“某人”只能是一个人,不能是几个人——二重奏除外。我有点奇怪,为什么Brooks不把Unix作为他这个观点的论据,因为我们可以精确地指出Unix走向分裂的时间点:1990年代初,AT&T抛弃Unix,将其商业化,抢走其架构师的那一刻。

最近几年,不止一个人像Brooks一样得出相同的结论。有些人企图粉饰太平,假装正经,还有人通过制定技术标准的形式来达到类似立法的目的,希冀着在集市中引入秩序和结构。到目前为止,他们的努力全部以失败告终,因为集市迷失的这一代.COM神奇小子,从来就没有见过大教堂,也不可能知道你为什么需要大教堂,更不用说去想象教堂是个什么样子了。这么挖苦别人,其实我心里也很难过。真的,那些最需要看看《设计原本》的人,可能会发现这本书完全无法理解。但对于那些怀疑过构建一个Web浏览器要使用M4宏来配置autoconf,要写shell脚本,要检测26种Fortran编译器,而感觉这怎么说都有点南辕北辙的人,Brooks也谨慎地指出了方向:还有更好的方式。

作者:Poul-Henning Kamp (phk@FreeBSD.org) ,26年的计算机程序员,个人网站http://bikeshed.org/。他编写的软件以底层构建块的形式广泛被开源和商业产品采用。他最近正在做的项目叫Varnish HTTP加速器,用于加快Facebook这样访问量网站的响应速度。

原文出自:A Generation Lost in the Bazaar

译文来自:图灵社区


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点击表格弹窗获取另外一套数据之后,原表格相关数据的调用

用H5新属性&#xff0c;data-*&#xff0c; $获取方式&#xff1a; 待续。。。。。。。 转载于:https://www.cnblogs.com/He-tao-yuan/p/9888316.html

面试经历(二)

前面说到用数据库中的锁机制对并发事务进行控制&#xff0c;这节来说说事务方法和事务方法发生嵌套调用时事务如何进行传播。例如&#xff1a;方法可能继续在现有事务中运行&#xff0c;也可能开启一个新事务&#xff0c;并在自己的事务中运行。例如&#xff1a;方法可能继续在…

最有价值的编程忠告

摘要&#xff1a;本文是来自贝尔实验室Plan 9操作系统的创始人Rob Pike给大家分享的编程忠告&#xff01;Rob Pike&#xff0c;目前谷歌公司最著名的软件工程师之一&#xff0c;曾是贝尔实验室Unix开发团队成员&#xff0c;缔造Go语言和Limbo语言的核心人物。 Rob Pike&#xf…

Kinect2.0-空间长度测量

1. 鼠标左键按下选择起点&#xff0c;拖动鼠标&#xff0c;左键放开&#xff0c;确定终点。 实现效果1实现效果22. 在linux下使用libfreenect2开源多平台驱动来获取kinect2.0的传感器信息&#xff0c;得到深度信息&#xff0c;并通过libfreenect2提供的getPointXYZ函数&#xf…

没有完美的软件:编程永远不容易

摘要&#xff1a;很多人想用十全十美来修饰一样东西&#xff0c;比如软件&#xff0c;对于客户来说&#xff0c;当然希望他们的软件能做到完美。虽然很多专家说利用一些规范可以让软件达到更好&#xff01;但是在现实开发中&#xff0c;真的会有那么完美的软件吗&#xff1f; 最…

代码审查“思维导图”

摘要&#xff1a;随着人们对软件质量要求的不断提高&#xff0c;软件开发的每一个环节都应该得到十足的重视&#xff0c;俗话说&#xff1a;“细节决定成败”&#xff0c;就此&#xff0c;本文提供了一个代码审查“思维导图”&#xff0c;希望对所有码农们有所帮助。 代码审查&…

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 tomcat启动报务后访问页面报错&#xff1a; org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/co…

优秀程序员和一般程序员差别在哪?

摘要&#xff1a;在这个世界上有两种程序员&#xff1a;Day Programmers&#xff08;白班程序员&#xff09;和Night Programmers&#xff08;夜猫子程序员&#xff09;&#xff0c;你知道优秀程序员和一般程序员有哪些差别吗&#xff1f;你又是哪一类型的呢&#xff1f;俗话说…

Navicat工具导出mySQL数据库某个视图结构的.sql脚本

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 用Navicat工具怎么都导不出来mySQL数据库的某个视图.sql脚本&#xff0c;即使导出来也只是包含视图记录&#xff0c;不包含视图结构。经…

瞧瞧苹果OS X如何干掉Linux

摘要&#xff1a;如果你去过Facebook或者其它一些创业类科技公司&#xff0c;你会发现随处可见的Mac&#xff0c;无论是CEO还是开发者&#xff0c;都可能在使用Mac。而以往很受IT人士青睐的Linux好像在消失&#xff0c;这是真的吗&#xff1f;苹果OS X是如何干掉Linux的&#x…

超全十大经典排序算法及其分析

文章目录0.算法概述0.1 算法分类0.2 算法复杂度0.3 相关概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法描述&#xff1a;1.2 图解演示1.3 代码实现1.4 优化过程1.5 性能分析2. 选择排序&#xff08;Selection Sort&#xff09;2.1 算法描述&#xff1a;2.2 图解演…

eclipse安装JAVA反编译插件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言&#xff1a;在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作&#xff0c;对于一些框架的代码我们总怀有一些好奇之心&a…

noip2014生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样&#xff0c;则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主角之…

聊聊毕业设计系列 --- 系统实现

效果展示 github moment-server github地址 moment github地址 moment-manage github地址 articles 聊聊毕业设计系列 --- 项目介绍 聊聊毕业设计系列 --- 系统实现 前言 在上一篇文章中&#xff0c;主要是对项目做了介绍&#xff0c;并且对系统分析和系统设计做了大概的介绍。…

js 实现用window.print()打印页面中的部分内容,局部打印

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如下方法&#xff1a; function printProof(){var printData document.getElementById("forPrint").innerHTML; // 只打印 f…

Spring 之注解事务 @Transactional

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 先让我们看代码吧&#xff01; 以下代码为在“Spring3事务管理——基于tx/aop命名空间的配置”基础上修改。首先修改applicationContext…

超级程序员神话

摘要&#xff1a;大部分的程序员在思想里都会某种程度的承认&#xff0c;承认自己只是一个普通的程序员&#xff0c;但这世界上确实有一些超级程序员&#xff0c;在一个为企业开发应用的程序员和一个为谷歌写搜索算法的程序员之间&#xff0c;或和一个开发用来控制读写头从磁盘…

HashMap30连问,彻底搞懂HashMap

文章目录一、背景知识1、什么是Map&#xff1f;2、什么是Hash&#xff1f;3、什么是哈希表&#xff1f;4、什么是HashMap?5、如何使用HashMap&#xff1f;6、HashMap有哪些核心参数&#xff1f;7、HashMap与HashTable的对比&#xff1f;8、HashMap和HashSet的区别&#xff1f;…

如何使用postman做接口测试

1、get请求传参 只要是get请求都可以在浏览器中直接发&#xff1a; 在访问地址后面拼 ?keyvalue&keyvalue 例如&#xff1a;在浏览器中直接输入访问地址&#xff0c;后面直接拼需要传给服务器的参数http://api.nnzhp.cn/api/user/stu_info?stu_name小黑2、post请求&…

【狂神说】分析前后端分离开源项目?

文章目录1.如何分析开源项目项目简介项目源码2.观察开源项目3.开源项目下载4.跑起来是第一步5.前后端分离项目固定套路6.如何找到一个开源项目1.如何分析开源项目 学习的方式&#xff1a; 不知道这个代码怎么来的这个代码跑不起来这个项目对我们有什么帮助&#xff0c;不会模…