博士随笔:开源软件对你意味着啥

 

夏耐博士任教于南京大学计算机系。在开源社区活跃了十几年。这是夏耐博士的一篇随笔。...



首先感谢来自夏耐博士的约稿。这个稿子传给我,我看了三遍。耐博谦虚地说,是瞎写的。我觉得写得很好。夏耐博士在南京大学计算机系任教。在Linux操作系统方面和开源软件的一些领域有十几年的经验。我也感到即便是朋友之间聊天和认真读对方的文章学习到的内容还是不一样的。

开源软件已经盛行很多年,在当代的IT行业,开源软件已经有一个举足轻重的地位。开源软件是一个奇迹,就如同任何一个轰轰烈烈的革命事业,都开始于精神层面,但最终还是落地在非常具体的物质层面上一样,开源软件走到今天,绝不仅仅等价于“自由、分享”的开源精神,而开源软件的开发者们,也远不再是纯粹兴趣爱好者们。那么,开源之与你个人,到底意味着啥。笔者仅就自己的经历谈谈一些自己的看法。

1.     精神层面的问题

相信很多开源软件的爱好者早年都是顺着RMS和Linus的传奇故事,开始学习开源软件,甚至为开源软件贡献自己力量的。开源之与他们来说,意味着“开放、自由、协作、共享、乐趣……”。不否认,肯定有人在参与开源的过程中享受到了精神的愉悦,但,开源的这种精神象征也许在这个运动的早年还具有鲜明的特征。

在当代的IT行业,这种精神层面的标志性正在淡化。这从开源软件的开发者群体的变化就可以看出来。拿最有代表性的开源软件Linux内核来说,早年围绕在Linus周围的程序员们都是出于兴趣在写代码,以至于Linus写了本书《Just for fun》来讲述Linux内核的发展过程。

但是时过境迁,现在每年Linux内核代码的主要贡献者,事实上是各大商业公司(甚至包括早年斥Linux为癌症的微软)的专职程序员们。他们完成的可能事实上是公司的一个个项目,他们的考评可能是贡献了多少社区补丁。商业公司总是趋利的, “开放、自由、协作”只可能是它们的口号,绝不会是他们的本质目标。如果参与某个有影响力的开源社区的讨论,你很容易发现社区中很多时候“政治”气氛是很浓厚的,为了利益拉帮结派、党同伐异也是常有的事情。

如果你是本着非常纯粹的精神追求来想投入到开源事业当中去,是想来寻找一个技术的“乌托邦”,那抱歉估计你会失望的。从个人角度把它当做“江湖”看待,更合适点,有人的地方就有江湖,很自然 。从整个社会层面来说,我觉得将开源定义成“资本主义高级阶段的一种社会化大生产的方式”更合理一些,这也就解释了为啥天朝的开源软件仍然不成气候的一个主要原因(这个话题要侃起来比较长,这里就暂不展开了)。

所以总结成一句话:也许你值得去那个江湖去闯一闯,但是那里没有乌托邦。

2.     使用性的问题

平常我如果和非IT行业的朋友们提到开源软件 ,很多朋友估计根本不知道开源软件到底为何物,为啥要用开源软件。那其实只是他们不知道而已,现在从智能手机、智能家居到互联网,普通人日常都直接或者间接地和开源软件交互着信息。因此,作为一个非专业人士并不用刻意去想是否用开源软件来完成某个功能的问题。而作为业内人士,可能就要面临一个选择性的问题。

一般选择性的问题都很主观,如果你已经有很强的用户习惯自然就没啥好讨论的,只要你喜欢就行 (开源界里面关于vim与emacs,KDE与Gnome都曾经是用户使用辩论的焦点性问题)。如果你目前使用还不多,那笔者按照经验主义(十八年前开始第一次使用开源软件,知名的开源软件基本上都接触)给一些总体的建议描绘如下:

·    开源软件一般来说都是一流的命令行(Shell),二流的GUI

介于目前Linux和开源软件是当前互联网的基础设施的实事,如果你是一个码农,用好命令行下面的一套开源软件基本上是必须的。懂得如何通过命令行控制某个发行版的Linux的正常运转(如CentOS, Ubuntu)几乎是互联网从业技术人员的基本素质。但是开源的桌面环境么,实在是有点抓不上手。笔者基本经历了KDE,和Gnome两个主要开源桌面从1.0版本到目前的成长过程,早年精力旺盛的时候还喜欢折腾这些桌面Linux环境,到后来,逐渐明白,其实自己只是想要一个能正常工作的方便的Unix环境的GUI,于是OSX反而成了唯一的选择:笔者感觉近10年,当整个开源界也喜欢飚版本号以后,几乎就没用过一个稳定的Linux桌面。一个完整的Linux桌面包含了很多个开源软件,哪怕是有了Canonical这样的商业支持,都很难将这么多个开源桌面软件完美地集成到一起。总是有些很常见的功能不能正常工作:不同应用打开以后,里面的字体大小不一、浏览器flash插件经常异常、不能正常休眠等等,每次升级一个主要版本,都得好好折腾一番,而折腾桌面软件并不如折腾服务器软件来的涨功力。

·    开源软件一般都强调一个小工具/命令解决一个单纯的问题,通过若干个小工具的拼接来解决一个相对更复杂的任务

这个是传统的UNIX的KISS理念(Keep It Simple and Stupid)。这在命令行的开源软件中体现的非常淋漓尽致,商业软件很难与之匹敌(君不见连windows自身虽然已有powershell,都开始拥抱bash了)。然而,如果涉及到非常复杂的功能的软件,显然开源软件和商业软件还是有较大差距的。这样的例子有很多,如Blend(开源)与3DMAX(商业),Octave与Matlab,各类以vim/emacs+插件打造的开发环境与商业IDE等等,凡是本着客观态度使用过的朋友估计都能有所体会。因此,如果你刚进入开源世界,被无数的“强大”如emacs这样的软件包围的时候,你还是需要回归一个客观的心态,问一下自己到底想完成一个什么任务,多尝试比较,才好判定到底是开源还是商业软件更合适你。

3.     学习性的问题

开源软件传入天朝,并非全是好处,客观的来说是个双刃剑。一方面它教化无数了大天朝懵懂的程序员,另一方面,它又使得天朝逐渐丧失了真正自主研发某些核心软件的能力。关于这后一个方面,笔者暂不想展开多谈。这里单说如何从开源软件中学习更多的技术知识和能力。朝内的大部分有志青年,基本上都经历过应试填鸭式的教育,而学习开源软件更多意味着是自己折腾和自学,因此在刚开始肯定多多少少会有不适应的一些感觉。笔者根据自己的经验,大体会给初学者以下建议:

·    要学一个开源软件的工作原理,首先是用好它,不要一上来就抱着一本原理性的书开啃。

同样拿Linux内核为例,如果你想学内核,那么一开头就看内核的书肯定是云里雾里。先学UNIX编程,了解内核到底向应用层提供了哪些接口,再开始学习内核才是合理的。

·      尽信书则不如无书。奋战在开源世界的工程师们是很累的,写代码已经很累,很多人都根本没有时间也没有兴趣写技术书,再加上出书的周期长,很难有一本原理性的书能将某个当代开源软件诠释的很完美,错误、缺陷、过时的描述都难免出现。相比较经典的数学、物理之类的一丝不苟的教科书,因此看此类书的时候,重要的是掌握设计思想、整体结构,不要尽信书本。剩下来更多的去看一些鲜活的资料,比如项目的在线文档、blog、代码目录树里的Doc目录,邮件列表等等,当然最重要的就是代码本身了。很多设计性的描述是出现在代码的注释中的,因此学习开源软件就像在玩一个拼图游戏,你必须用你找到的所有的信息和材料将整个拼图拼凑起来。

·   你以为自己懂了,而这往往可能是错觉。这是在动手之前,常产生的一个错觉。

你真的开始懂一组代码是发生在你真的试图改动这段代码开始。仅仅读文档、读代码是很难理解的透的。一开始,可能你并不知道到底该改动什么,那么你可以从邮件列表中挖掘,凡是有bug汇报的点,都是可以动手的点。如果一开始不知道该如何动手,可以看开发者们是如何修补这些bug的。开发者们新添加的功能性的补丁也是很好的学习资料,它会教会你,如果要添加新的功能,会涉及到的改动范围,需要考虑的因素。

·    不要无谓地浪费讨论的时间。

其实每款开源软件,在国内都有对应的技术论坛,但往往这些论坛里面大都是爱好者,鲜有真正的开发者。如果是讨论使用经验,可能还有点获益,但一堆对原理半通的人在一起讨论设计性的话题,往往就会对你有误导了。所以真的涨功力的讨论场所,永远是开发者的邮件列表。这样的邮件列表一般都会有些门槛,太初等的问题,可能大家都不太愿意回复,但是一旦如果你能融入进去开展有意义的讨论,那么你会获益匪浅的,有些很难通过代码表面理解的深层次逻辑,可能设计者能一句话就点明。你也可以将自己的深入的想法和开发者们共享,集思广益。在你能深入之前,你可以花一段时间观察别人是怎么讨论的,哪些是他们感兴趣的话题,慢慢的你也就清楚自己改如何开口了。

长按二维码加入讨论:


    关注 海啸TechTalk


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册