谈谈开源软件的选择

11/05/2014 update:
博客写完之后根据往常直接同步到了 weibo 上,结果反响比较大,一小部分是敢跳出来喊支持的(毕竟软件作者也在 weibo 上,站队要正确),非常难能可贵,一半是完全中庸的态度,另外一半是大喷特喷,或者说是满嘴跑火车更恰当些。
写这篇博客的目的有二:

  1. 回答题目的问题,如何选择可能靠谱的开源产品
  2. 毫不避讳,结合上面的几点,谈谈最近用的 tcpcopy 遇到的诸多问题,证明 tcpcopy 还有很大的提升空间

对于那些满嘴跑火车的同学,建议你,仅仅是建议而已:

  1. 把全文好好看完
  2. 多看看外面的世界,别把自己限死在狭小的空间里面

还想继续乱喷的,理解了@ayanamist 说的话咱们再继续。

很意外的是,最近两天收到了几封邮件,让满嘴跑火车的同学失望的是,他们不是来继续喷的,相反,他们都表达了非常正面的观点。邮件的结尾都差不多,让我加个 QQ 交个朋友,交朋友本是件好事,但是,我这篇博客已经说的很清楚,相比 QQ(基本不用),我更偏向使用 gmail、gtalk、twitter 交流。所以,善意的提醒下,RTFB(read the friendly blog:)还是很重要的。如果有什么想交流,about/ 页面有我的联系方式,非常欢迎。


先说点背景,对一款开源软件评估,也就是最终用还是不用,无外乎从这几个方面入手。
1. 技术层面,这也是最基础的一层,即这款工具、软件是否符合你的需求,比如是否需要跨平台,是否对性能有很高的要求,是否对安全有很高的要求等等。
2. 文档,现在不少的开源软件动不动就冒出高性能(high performance),简单易用(easy to use),比竞争对手更强大的字眼,试问连个详细的文档说明都没有,跑的个 demo 连背景环境配置都没有,你敢用吗?
3. 代码整洁,有注释,尤其是后者,github 上不少代码都是从头写到尾,一行注释都没有,这个不但给自己挖坟,也给用户带来了非常多的不便。
4. 更新频率,如果最近一次更新是 5 年前,是不是要考虑下有没有用的必要。当然这个并不绝对,不少最新的稳定版本都是 3 年前甚至 5 年前的,对应的开发版本倒是蛮活跃的。另外,如果是刚刚仅仅出来了几个月的新产品,还是慎重考虑一下。
5. 社区,这个是重中之重。
5.1. 用户数量,github 某个项目如果没几个人 star,是不是需要慎重考虑下。
5.2. 参与程度,半年才提一个 issue,mail list, irc 几天都没条消息的还是暂时不要考虑了。
5.3. 用户参与方式,使用 QQ、旺旺这种娱乐软件参与开源社区确实是件荒唐的事情,这类参与方式无法将信息公开的被搜索引擎收录,并且基本上将用户群体限制在了一个非常狭小的中文社区里面。mail list、google group 之类的比他们好用更重要的是开放的多。
5.4. commit 的人数,如果常年就一人更新,想想万一哪天他不在了,你们线上的服务怎么办?
5.5. 开源软件许可,这个一般自己用都没什么大问题。

根据上面的原则,不管选什么类型的开源软件,都可以从上面的几个方面入手,国产的亦如此。文章写到这里也差不多了,上面已经回答了我题目中涉及的点了。下面谈谈最近工作中遇到的此类问题。
事情源于我们想对某个型号的网卡做一个收包方面的 benchmark,这事原本很简单,直接使用一些现成的 pkg generator 测试就能完全满足要求了,这个我在之前的一篇博客也已经提到过,并且也测完了得出结论了。结果我突然想看看真实的线上流量(同样是大量的小包)是什么样子的,于是想到了 tcpcopy,第一次知道这个还是几年前参加 velocity Beijing 的时候听到的,当时就听说被国内各大互联网公司广泛使用,于是 g 了下,惊奇的发现 github 也有接近 800 个 star 了,看上去不错,除了中国用户多了点。这里有必要说明一下,一个 repo 的 star 用户绝大部分来自同一个地方并不是件好事,很可能这个项目仅仅在该地区小范围的活跃,反映出来的就是没有被大部分(欧美用户,他们才是开源的活跃主体)的用户所接受,你自己说行没任何意义,只有别人说你行你可能才行,只有说你行的那个人被别人说行你才是真行。可类比找名人写推荐信、诺贝尔提名的概念。
于是 git clone 下来,接下来噩梦就接二连三发生了,作为一个普通的用户,为了把这款「据作者称不是一般人能用的起来,就连 twitter 也搞了三年都没搞定的」软件用起来,我们花了将近一周的时间才把他给用了起来,在某些情况下(switch mirror),我们还对他打了 patch 才能正常使用。下面对照上面的一些基本点一个一个来过一遍。

1. 技术层面,这个基本没得说,确实符合我们的需求,实时复制线上的流量到测试机器做 benchmark。
2. 文档,这个毫不客气的说,负分。不信的自己用用就知道了,没有一套完整的运行环境描述,没有一整套的运行流程记录,没有线上真实环境的数据结论,更没有针对不同版本、不同模式的、不同编译选项的细致说明,所有的所有就是那一张简单的 README 以及附带的简单的不能再简单的 FAQ,顶多加上排版十分糟糕,用词用语毫无讲究的作者的 CSDN 博客,更夸张的有些结论竟然需要到博客下面的 comment 里面才能找到。原本以为能从编译后的二进制文件的 –help 获取一些信息,很不幸,打出来的简短的不能再简短的话语让人实在摸不着头脑,再遇到前后矛盾的语句,只能往下穷举测试运行了。
3. 代码整洁,注释少的不能再少了,这也给我们后续的 debug 带来了非常多的麻烦
4. 更新频率,这个确实比较频繁,最新的已经到 1.0 版本了,可惜,由于文档非常模糊,可能很少会有人知道 1.0 跟之前的 0.9 不大一样,0.9 跟再之前的 0.5 又不大一样,至于哪里不一样,要怎么使用,还得自己摸索,唯一的信息是作者在 CSDN 上发表了一篇一句话博客。
5. 社区,糟糕的不能再糟糕了,长这么大第一次见到用 QQ 群作为主要讨论场所的。搜遍全网没找到一个 mail list,更没有 IRC。参与群体的比例结构也非常的奇葩,github 上 start 的 90% 以上都是大陆用户,也就是说,这个项目没有获得西方主流技术圈的认可。commit 的人数活跃的一只手能数得过来。
所以只要对照上面的几点,花个半个小时看一下就会发现这是一款小打小闹根本没法被主流技术圈认可的软件。
当时误入歧途,被套牢了,遇到了问题搜遍了整个互联网,除了几篇英文的介绍文档之外,其余全是千篇一律的基本使用,连适用的环境使用的版本都没有说明的八股文。
下面开始细节描写。
不得已,发邮件给作者,在这之前,我建议你看下 How to ask questions the smart way,没执行完上面所有步骤之前不要问别人问题。发邮件的目的非常简单,就是想让其确认下使用的命令选项对不对,当然里面我详细的描述了环境版本等等基本的因素,最初的几次对话虽然回复的字体不一大小不一语句不完整并且根本没能正面回答我的问题,也算能基本接受,结果越到最后越离题,来来回回了十来封,一个简单确认使用参数对不对的问题发展的最后成了又是侃大山又是让抓包的离奇分析问题方式。最后作者不耐烦的让我去 QQ 群讨论。QQ 群呐,QQ 代替了标准的 mail list,瞬间雷焦了。这事到此就也没什么了,我多少年不玩 QQ 的人了,就让我同事加了他所谓的官方 QQ 群,然后作者在群里面依然不停的让把 -F 后面的过滤条件写的详细些,尽管很早我就数据告诉了他我们测试下来详细与否对最终的结果没有什么影响(最后问题的原因也证明了不是这个原因)。几天下来作者终于不耐烦了,把我跟其对话邮件包含的一些 IP、MAC 等敏感信息给直接爆到了群里面,当然加以挖苦讽刺一番。不能做软柿子啊,当天我启用了尘封已久的 QQ 号加进了群,非常详细的列举了十条:
ok,既然王大大发火了或者说是挖苦我了,那咱们还是把这事给说清楚:
1)我当初把我们的详细信息(ip、mac)给你是信任你,你作为一个开源软件的作者也有义务保密信息,结果你把我们的机器信息发到群里了。
2)我已经说了,昨天测了一天,pf_ring 加上之后,-F 规则写的细不细,我们没有看出巨大的差异,最起码我们的机器测出来是这样的,data talks,所以请不要老跟我纠结于这个问题。
3)我问了几天一个正确的命令行怎么写,你给我说要抓包,话说,命令的语义都是错误的,抓包有什么意义。
4)我仅仅是一个普通的用户,你既然开源了这个软件,并且三番五次的想让更多的人用,就有义务来维护这么一个软件,文档除了几个零零散散的,什么都没有,代码基本没有 comment,连个基本的、完整的 demo 都没有,这让一般用户怎么使用。
5)到目前为止遇到的错误全部是命令行书写有问题,你那仅有的几篇分不清版本适用环境的文档以及 ./tcpcopy -h, ./intercept -h, ./mirror -h 打出来的帮助真不是普通人能理解的。
6)如果这个软件不是让一般用户使用的,那么请别到其他 nginx 之类的 mail list 里面打广告,那里面也仅仅是一些普通的用户。
7)开源不是 qq 群能开的起来的,一个繁荣的开源生态是少不了 mail list 的,既然没 mail list 我就发你邮件好了,结果你让我给你聊 qq,我不清楚你有没有深入使用过别的开源软件没,包括国产的 lvs。
8)混了五六年开源社区,第一次见到用  qq 作为解决问题的媒介的,用了那么多开源软件,我发个问题到 mail list、irc 作者都是很热心的回答的 ,但是到你这儿却成了一个封闭的 qq 群。
9)国外技术比你先进的多的事,twitter 也不是你说的什么搞了三年都没搞的出来,baidu 搞流量复制当然要立项来做,国内能搞这个不是只有你才行。另外,我对你软件实现有多么复杂架构有多么牛逼没任何兴趣,大部分用你这个的无非是想借你这个软件复制下流量测试下,结果到了你这里成了个非常复杂的软件。
10)最后,很负责的告诉你,开源不获得西方社会的认可,在国内的大公司搞的再火没任何意义。
接下来?接下来就就没了,说完这些我就退群了,后面据说群里面说着诸如「国内开源环境是恶劣的,斌哥有些火气也是可以理解的」,「说白了,我按我的方式开源,你按你的方式使用,但不要对彼此要求太多」之类的不疼不痒的话。
后来我把这事发到了 twitter 上,倒是有不少同学发表了跟我类似的感慨(1, 2)。
tcpcopy 的事到此为止,在获得西方主流社区认可(github 上觉得大多数的 star 来自英文母语国家)之前不会再碰了。
以上的绝对不是个例,大多数在中国做开源的都很有中国特色,就像不用 Twitter 用 Weibo,不用 Facebook 用 RenRen 一样。当然也有做的很好的,大到 Linux Deepin 系统小到 LVS、iRedMail 这类细分领域的软件。

最后,按照某些人的说法,爱用不用。

  • Pied.Kondi

    屁话太多
    废话太多

    能力不行就别jjww

    你没付费,别装的跟甲方似的
    找喷

  • yanyiwu

    写的挺好的。

  • 西红柿

    价值观有问题,只能呵呵。 你是不是还缺少一条:开源软件,不统一用英文写文档、re maillist,就是扯jb蛋子的。

    • http://jaseywang.me/ Jasey Wang

      麻烦看完全文再发表评论。
      当然了,如果想让中文社区用的开心,QQ、wechat 之类的都可以用上。

  • http://acgtyrant.com/ 御宅暴君

    后来你找到什么真正好用的替代品了吗?

    • http://jaseywang.me/ Jasey Wang

      对于一般的应用,很多都能满足,比如 gor,tcpcopy 也能用。
      我们的业务比较特殊,目前基本找不到能完全满足的。另外,我的本意也仅仅业余时间玩一下,并没打算深入研究,所以能不能行不行不是很重要。

  • http://jesusjzp.github.io Zhipeng Jiang

    深表赞同,现在用的一个国内的开源软件,star快超过一千了,里面bug很多,给作者发邮件,提交issue也都不理。。。

  • zleoz

    随便说两句:
    1. 博主过于理想化,把这个产品的开源和广义上的免费开源产品混淆了,估计博主心中开源的产品应该像tomcat,apache,nigix一样,用户众多,文档齐全,而且可以免费的使用在各个场合。我个人觉得,其实这个软件和大部分的开源商业产品没什么区别,看看它的license就知道了,没有说免费应用在商业场合,再结合其网站介绍,说这个产品在什么大的门户网站都应用了,就表明,这是一个商业产品,开源不过是吸引用户参与。QQ和旺旺只不过是一个用户和商家的交流平台。不提供文档很正常,意思就是你是大牛看得懂,你自己照样子写一个,改一个也行,你是普通用户,那么对不起,请缴费,我们给你技术支持。看看在B2C领域的opencart就知道了,网站代码全免费,随便用,国内不少用户,但是文档呢?对不起,寥寥几句话。想用的好?对不起,请买服务。
    2. 说它缺陷多,其实也没意义,确实像作者说的一样,爱用不用,觉得不好用,自己改啊,反正源代码都给你了。
    3. 做好国内市场,他能吃饱就行了,确实有没有英文交流平台也没什么,反正也没有老外用户。
    4. 得不得到西方社会认可,我到觉得没有必要妄自菲薄,国内做的好的IT项目比国外牛逼的多,比如taobao,比如工商银行,在系统的性能,复杂性,功能上比西方强了不知道多少,也没见taobao整天嚷嚷,说数据库行业一定要承认我把mysql改的好,比原版的还好一样。

  • http://www.itechdog.com Jabari_Bi

    我基本赞同博主观点。我觉得开源的本质一是降低开发成本,加速产品化进程,二是促进同行交流,推动行业技术进步,开源出来的东西这两点不能满足就意义不大了。

    看源代码跟看技术书相比,源代码的理解难度要大于技术书的,一项被充分优化过代码的开源项目,没有完备的技术文档和充分的代码注释,是很难理解作者的真正意图的,所以不要说我代码写的好我命名做的好就可以省去注释,这些相关说明的东西,真的就是多多益善,造福人类。

    国内人的思想劣根中的一点很明显的部分就是跟风性,那些star,很可能都是别人鼓吹很好,某人就上去点个star,至于是否真的那么star,其实他自己并没有实际研究,也就是说很可能这些star有刷票的部分。

    然后说QQ群交流,这个我觉得不是问题,maillist irc这些的维护成本很高,也许作者的主业工作任务繁忙也没有时间管理,maillist irc确实更适合技术型的讨论交流,废话少,还方便翻查过去的记录,方便后来的朋友从头到尾了解情况,这个QQ群完全做不到,但是考虑到作者主业还得处理日常繁忙的工作,这也是没办法了。

    国外开源项目也有做的不好的,比如著名的gcc,我曾经为了用它一个功能编译了一个多星期都没通过,最后换了台32位的机器尝试一下居然通过了,彻底无语。

    开源项目如果要做成产品级的水平要消耗的功夫太多了,这不是利用业余时间可以搞定的,我当初的同事agentzh搞OpenResty最后是辞职全职来搞的,全靠社区捐款供养,这不是普通人能做到的。在中国这个人人缺钱的大环境下,搞高质量的开源太难。

    作者讥讽人的这个行为就太没品了,但tcpcopy提供的功能确实还挺实用的,只是这样的人和作品的组合,总是让人对作品感到可惜

    • http://jaseywang.me/ Jasey Wang

      QQ 是没法交流的,第一封闭,外界用户无法检索得到已有的知识积淀;第二用户群体非常局限,几乎都是中文社区。
      如果说 irc、mail list 维护成本比较高,google group 之类要比这些好的多,除去 spam,维护成本可以忽略不计。

      • http://www.itechdog.com Jabari_Bi

        嗯,但是用QQ群的,基本都是宣传的目的大一些,这种群我加入过几个,群里的人基本水平渣不上道

  • Pingback: 通过 tcpcopy(pf_ring) 对 BCM 5719 小包做的多组 benchmark | Jasey Wang()