开源路上

Published on

这篇文章是在春节前写的。

一直痒痒想写点什么,但又无从下笔。今天,在公众号上发了一篇文章《饮水思源,新年大礼》,得到了不少赞赏,便又觉得或许还是应该写一写。大家平常喜欢看到的文章都是比较有深度和高度的,我没有什么辉煌的背景和经历,自然写不了高大上的东西。不过,从小处写写我自身的经历和思考,或许也有意义吧。

我是在高中毕业那年暑假开始接触计算机的,虽然实际上只是一个小霸王的纸质键盘键位图。上大学后,我在学校机房里用到的第一台电脑是286,还买过5吋的软盘,容量是360KB。虽然我没能考取心仪的计算机系,但也不妨碍我到图书馆借书学习,其实也没学到什么,最开始就是玩各种DOS命令,PCTOOLS和ARJ。大一暑假我自学了C语言(确切的说是把书看了好几遍从来没有上机),那时候还没接触互联网。

我学习Linux是源于1999年的一则《参考消息》,讲了一个芬兰的小伙子写了一个操作系统云云。我便斥巨资70元(至少对于当时的我来说,其实70元买本书现在还不算便宜)买了一本《Linux实用大全》(陈向阳、方汉),从此了解了自由软件,知道了Rechard Stallman。但那时虚拟机还没这么发达,我又没有自己的电脑,经常是装在别人电脑上隔几天就被删除的情况下学习各种命令,以及X(那时网卡兼容性很差的,基本只能显示256色,640x480、800x600或最高1024x768)。

毕业后,很偶然的机会我进入了烟台电信(在我们毕业那年之前电信部门基本只招邮电院校的学生),然后我可以折腾各种各样的计算机。虽然破,便能用128K的ISDN上网,感觉已经很爽了。那时候开始用Google,但从那时起,Google就被封过,原因可能是搜索某关键词出来的结果是关键词是大坏蛋。

后来我也攒了自己的电脑,系统当然是Linux。但当时,我主要的工作就是在不断地解决如何在Linux上完美支持中文(实际上永远不可能完美,UTF-8一统天下还是N年后的事情),如何支持QQ、如何BT下载,如果装Linux不支持的软件,使用Wine模拟器等,但几乎从来没有真正用它来干过正事。

当然在单位里我还是干了许多事情的。我主要负责程控交换机维护,写代码只是业余爱好。我写了好多脚本和程序使命令执行和日志分析自动化。我还写了网管值班系统,真正做到了值班系统的电子化和自动化。由于工作中的绝大部分软件只能在Windows下执行,所以,基本上我是在Windows上Vim SSH到远程的Linux上开发。我的技术栈是C、PHP、和PostgreSQL。我的程序都能运行在Linux以及Tru64 UNIX上。

最值得欣慰的是我基于CakePHP开发的一款投票系统,公司一直使用至今,到今年正好是十年了。PHP不愧是世界上最好的语言,PHP5十年没有升级,那时候写的代码,到现在看还不算过时。

然而虽然我使用过很多开源软件,也编译过全套LFS,但始终没看过什么源代码,除了书上的(《操作系统:设计与实现》,上下两册,下册整本是代码 😉 ,操作系统是Minux)。我经常上的论坛是ChinaUnix和LinuxEden,但是基本只是潜水。

可是我很热爱开源软件,也希望能做点什么。我曾经尝试为LinuxFocus网站翻译过一些文章,也在自己的博客上翻译过SQLite的部分文档。其它也没有什么了。不过,这些工作对我还是有些帮助的,我至少能看英文的文档,中文表达也有所进步。

有一年我在北京小住,投了一些简历。当时没有离职的想法,只是想试试自己能值多少钱。当然,我投的心仪的公司如Google、IBM之类的都石沉大海,后来是一家小的创业公司给了我面试机会。老板都是外国人,纯英文的面试我竟然都能听懂(多看原声大片也是有好处的),虽然口语不怎么样,但2个小时下来,我也没被难住。后来,就真进了这家公司。

当年CSDN举办了Web 2.0大会。记得门票好像是1000多块,好贵,但机不可失,我毅然自己买票参加了。大开眼界。来自阿里巴巴、腾迅等的技术大侠们,看样子比我年轻很多,都站在台上滔滔不绝了。我就下定决心,抛弃『铁饭碗』辞职到了北京。那一年,是北京蓝天最多的一年。

我最开心的事就是上班的第一天我就把我的Windows电脑换成Linux,从此再也没有换回来过。当时我的职位是系统管理员。我们是一个Rails团队,那年头也算是国内最早搞Rails的团队之一了。我虽然出身草莽,但我学东西快。做运维只是我的工作而已,我还是更喜欢开发,后来,整个团队里,除了老板以外,就我算是全栈工程师了(当年好像还没听说过这个名字)。什么栈呢?Linux、C、Rails、Erlang、Lua、Javascript、Flex、HTML/Javascript,后来公司的第一个iOS程序也是我写的(基于Titanium)。

我开始可以名正言顺地研究各种开源软件,当然,大多是停留在如何部署和优化上。后来,公司一直想招一个做FreeSWITCH开发的工程师(VoIP软交换软件)但一直招不到(现在也一样招不到,太少),我就说要不我上呗,然后我就上了,然后,就结下了我与FreeSWITCH的不解之缘。

FreeSWITCH是开源的,采用MPL1.1许可证。当然,这跟Stallman大叔所提倡的自由软件还有很大不同。Stallman大叔基本上只认GPL。说到Stallman,他来清华大学演讲时我还见过(遗憾没有拍照)也有亲笔签名的书。他讲的东西其实我都知道,我还提问过HURD,不过,说到这些就有些远了。总之,我很佩服他。

FreeSWITCH不像Linux、MySQL那样成熟,当时的版本还不到1.0,文档也少。所以,那时候我基本上是一边学,一边练,一边帮忙写写Wiki什么的。我加入了邮件列表,基本上每封邮件我都看。用着用着就发现了Bug,然后慢慢的学着报Bug。很多次,我们报一Bug,睡一觉,Bug就修好了(主要开发人员都在美国)。有一次,我连续报了几个Bug和新特性需求,以至于FreeSWITCH的作者Anthony跟我说,我可以停下来休息一会了吗?我看了看我的要求基本上都已实现了,我就说,可以了。

就这样,慢慢地,学会了跟这些真正的开发者们交流。交流中还发生过一次有意思的事情。FreeSWITCH团队中有一个人叫Brian,我每次写邮件都写『Hi,Brain...』,有一次被我们老板看见了,就问我,这个人叫『脑子』吗?我说是啊,你看。他看了半天说,不对,不对,你看,人家明明叫布莱恩……

FreeSWITCH的核心开发者都是上一代的程序员,是一些真正的黑客。他们都用Emasc写程序,用邮件列表和IRC交流,技术栈基本上就是Perl和C,也不想着再学什么新的语言。但有机会跟他们聊天,才感觉真正走近了程序员。

不知从什么时候起,我想起了其实我也会C,就尝试提一些补丁,自己写些模块什么的。有些补丁竟然被官方采纳了。从那时起,我基本上每天都会看FreeSWITCH的源代码,尝试理解每一次提交。一到到现在。

中国人是善于学习的。几乎不管有个什么网站,必定有个什么什么中国。FreeSWITCH没有,因此我就建了一个,所以,我就成了FreeSWITCH中文站的站长。

我使用Google Groups做邮件列表,一个网友建了QQ群(就是群主大熊),也做了和简单的中文站静态页面,开始写些博客。但很不幸,Google Groups很快就不能用了。其实我感觉我肯定被Curse了。我们公司开始用Google Site、iGoogle、Google Reader、Gmail、后来我们用Twitter、Facebook,后来这些网站就不存在了。这是众所周知的事情,就不多说了,总之,Google Groups就一直没有人气,而在国内要做一个BBS需要至少100万的注册资本,我就一直没有做。后来的时候在香港架了一台,但这个时代已经不是BBS的时代了,因而,人气并不好。

FreeSWITCH有一个一年一度的开发者大会叫ClueCon,每年在芝加哥举行,我们老板有去讲过,有一年,我也申请去,公司也帮忙办了签证,但是,公司后来发生了一些变化,我就自费去参加了。话说当时我在FreeSWITCH社区也算跟他们混得熟了,去了也不能白去,便自己申请了一个10分钟的Lighten演讲,虽然英语口语不怎么样,但照着幻灯片基本念下来了。后来,我就每年都去,也每年都有正式的演讲了。当然,后来才发现,这是一个国际性会议,里面很多外国人,英语讲得还不如我好。

上面说到公司后来发生了变化,后面就被离职了。接着就是被创业。最开始想做呼叫中心,结果后来误打误撞做了指挥调度方向。但不管做什么,其实都不好做。做互联网久了,回头再做企业软件,不得不适配很低版本的浏览器、Windows甚至还用ActiveX这么老套的软件的时候,我感觉到很不适应。因此,我就一直都没有做好。而且,在甲方不停地拖欠项目款的时候,我心情越来越不好。我们曾想借助几个项目做成一款优秀的系统,但结果是我们做了好几个系统彼此还不兼容,都差20%没有完成但完成这20%却需要花80%的精力。所以,最终,我们几乎什么都没做成。

我们开始尝试做FreeSWITCH培训,第一次招生好像只有4个人报名,而我们的目标是至少8个人才能Cover住成本,所以取消了。现在看起来非常后悔,因为,那毕竟是一届培训班,赔点钱也应该是要做的。

我们开始做社区,学着ClueCon搞了一个FreeSWITCH技术开发者沙龙,结果每年一届就做起来了。最初两年都是车库咖啡,后来又转到了好一点的酒店。随着我对FreeSWITCH的大力宣传与鼓吹,我们的培训班也慢慢有了人气,到现在,有十几个班次了,每年不定期在北京、上海、深圳、南京等地举办。我们俨然成了一个培训公司 :D。

线下培训的一个问题就是选址,不管我们在哪儿培训,总有人说希望到他们的城市去。但不管怎么说,我们基本还是集中在北京、上海这样交通方便的大城市。线上培训现在都这么方便了,为什么还只做线下培训呢?我们的想法是这样的:其实,三天的培训就是累死我也讲不了多少东西,大部分内容还是点到为止,授人以渔。给大家一个线下交流的机会。另外,来参加培训的一般都是公司的技术骨干,如果不是专门拿出时间来线下培训,他们在公司里基本上永远都有干不完的活,能有多少时间专注于培训课程?想一想,我三天每天讲8小时的内容,如果是线下看视频的话,需要多长时间才能看完?

当然,2017年我们会尝试一些线上的玩法,比如3-5分钟的短视频解决一个很小的问题等。我们的培训采用类似飞机票的定价方式,按报名早晚从7、8、9折一直到全价,早报名优惠幅度大,其实对我们来说更重要的是我们该准备一个多大的教室,关于这一点,做过活动的人都知道,我们也是一点一点的学来的。

在中国做社区很关键的一环是QQ群。我们很早就有了QQ群。我们管理比较严,因此群里基本没有胡闹的。多年来我在群里跟大家说的最多的话就是《提问的智慧》。因为,大多数人都没法问一个好问题。简单举几个例子:

Q:有人在吗?

A:群里有问题直接问。

Q:我装了FreeSWITCH,打不了电话怎么办?

A:我也不知道。:( 你到至少把现象说清楚啊。

Q:FreeSWITCH崩溃了,有人遇到吗?

A:废话,我的FreeSWITCH几乎天天崩溃(在这些年里,光测试我不下打了几万的电话,崩溃也有几千次了)。

上面的问题是根本无法回答。当然,也有些人提供一些简单的信息,但是,我需要至少知道以下信息:

你用的什么操作系统?XP?Win7还是Win10?

FreeSWITCH是什么版本?FreeSWITCH都十年了,你让我猜?

什么现象?至少描述一下吧?

在默认的FreeSWITCH配置上,你都做过哪些改动?

为了解决这个问题,你都做过哪些努力?

你有没有收集相关的日志?

好多人根本没有意识到世界有多大,他以为他用Windows,别人也在用Windows(Windows现在也有N个版本了),他提一个问题,回答他问题的人就站在他身后能看到他当时的遇到的一切一切。

当然,有人也很努力,写了很多,但是,通篇没有一个问号!!!

说实话,虽然开源社区很热闹,但做开源是很孤独的。我花了大把时间在社区里,每一个问题都想回答,可是,就是插不上嘴。

实际上,即使是这样,很多时候大家提供一点点信息我就知道他是怎么回事,我遇到过的场景实在是太多了。但是,如果他不能好好描述他们的问题,我一般是不会回答的。我会告诉他怎么看新手指南,怎么提一个好问题,等到他终于把问题问到点子上的时候,我告诉他今天我属于他的时间片用完了,我还有更多其它的事情要做。如果还想知道答案,买商业支持吧。

是的,很多人一上来就想让我回答他的问题,一上来就私聊。我问他为什么不在群里问,他说怕打扰别人。我就问他,你不怕打扰我吗?

开源虽然是个半公益的事情,但是,我总不能把我的时间花在一对一技术指导上。如果一个问题,我在群里回答了,那么,群里所有人都能从这个问题中学到知识,但是,我没有义务只回答其中一个人。所以我一般告诉他们,私聊是收费的。是的,这就是开源社区的运行规则:如果你能公开的讨论问题,那大家都公开,共同学习进步,活跃社区。但如果你是为了一己私利想得到保姆式的指导,那就交点钱呗。

其实有时候心情好的时候私聊我也是回答的。只是,有些更可恨的情况,有些人一上来就让你回答问题,一点客气话都没有,好像你是欠他的。我们从小学习讲文明讲礼貌,最不计,难道不知道自报家门吗,我帮了也至少应该知道帮的是谁吧?

还有人跟我说,他参与的别的社区,大家都非常热情友好,有问必答,怎么我就那么多毛病?我只好客气的告诉他,谁家好你可以去谁家啊,反正我家私聊是收钱的。

其实收钱不是目的,凭这个也根本发不了财,只是,我想培养一种态度和习惯。如果一个人从来在社区里没有做对社区有意义的事情,就苛求别人免费热心回答你的问题,这是不可取的。那如果我真遇到一个紧急的问题怎么办呢?

有钱能使鬼推磨啊。

多年来,我一直坚持一种理念——知识是有价值的。如果FreeSWITCH对你有用,那就应该加入FreeSWITCH社区,想想自己能帮社区做点什么。这样,等你有困难的时候,自然也会有人帮你。这些帮助并不一定是钱或代码,文档,组织活动,甚至帮助社区维护秩序都需要有人来做,看你喜欢做什么。如果你没有时间做这些事情,当然也可以花点钱来资助别人来做这件事。如果你确实是个新人,却又遇到紧急的问题,那么多花点钱找有经验的人解决问题不是最直接的方式吗?

其实我一直想做成一个FreeSWITCH保险公司。所有FreeSWITCH用户,平时交点保险费,那么,我们就可以培养更多的专职FreeSWITCH技术人员,当你有困难的时候帮助你。当然如果你遇到紧急情况又没有保险,多花点钱我们也会帮助你。

当然,知识的定价是很难的。但无论如何,我们还是找到了一个让大家容易理解的收费方式:挂号费。

所有来咨询的客户我们都收一个类似医院的挂号费(最初是1024元,现在涨到了1500)。只有挂号了我才帮你诊断(需求分析),诊断完成后再决定治疗方案,需要理一步检查或者住院再另外收费。

进一步检查按什么标准收费呢?其实没有标准,基本上是按心情,然后再按心情价格折算成用户想要的工时成本(用户需要一个价格体系去向老板汇报申请预算……)。为什么说没有标准呢,因为,一般用户希望我们按工时报价,但是,同样是一小时的工作,我们在社区里服务是免费的,对一些小的公司也发挥不了多大作用,对大公司起和作用就会很大。比如我们有一个客户公司由于采用了FreeSWITCH光维保费用比起以前的商业软件一年就省下上亿的成本。所以,报价的标准其实不是我要花多少时间,关键是我们是否能帮客户挣到钱。

我们这种策略实行了,效果还不错。成功的挡住了 无数的那些根本不想交钱的人(或者是他的业务模式根本没法挣到钱的人)。或许也牺牲了好多潜在客户,但是,我们更愿意集中精力给愿意花钱的人做更好的服务,而不是为了获取更多的客户。

当然,也有客户会问,我们还不知道你是否能给我们提供服务,就收钱?我们就耐心地告诉他们,我们已经尽最大努力做了合情合理的解释,谁去医院不是先挂号?更进一步的解释是:你可以去花一些时间研究和调查,我们的背景,以及我们是否能够帮到你,但是,如果我们能直接收个挂号费就省去了你去调查研究的钱,这不也是钱吗?甚至,如果我们直接告诉你,这事我们不能做,你该去找谁,或者这个事不适合用FreeSWITCH做,推荐你用其它的解决方案,防止你在FreeSWITCH一条道上走到黑,节省了时间和更多潜在的损失,那这挂号费值不值呢?

当然,教育客户也是有成本的。但这是我们的信念。

我们也遇到一些大公司,由于公司的流程不能采用挂号费的规则,我们也会变通,但大多数情况下,我们不相信忽悠,一般从小项目做起。从我们的经验看,越是大的项目,赔得越多。既使工程款能全额到账,也会拖上两三年,我们体量小,跟大公司耗不起。

说着社区,就想到扯到商业支持去了。其实,这两点也是分不开的,开源也是一种商业模式。我在演讲中曾比喻开源其实就是博弈论里的智猪博弈。比如对Linux而言,IBM、Google、甚至微软都算是大猪,我们就算小猪跟在后面不劳而获。虽然像FreeSWITCH之类的小众软件做开源比较难,但是,至少我们公司到现在是活下来了,我们也不用适配各种潜规则,而是制定我们想要的规则。 其实我很佩服老罗说的那句话:“通过实现理想让人相信实现理想是可能的……即使是在中国”。

做开源是孤独的。但是,想到自己的代码被全世界的人在7x24小时的使用,也还是很欣慰的。而且,总会有人欣赏你,告诉你你帮上他了。也有人会发红包,有人会买一些技术咨询服务。

大约几年前,由于表现好,我得到了FreeSWITCH核心代码库的提交权限,后来,就把自己几年的有用代码都开源了,FreeSWITCH 1.6里面的视频部分最初基本都是我写的。那年的ClueCon,我也终于跟所有的FreeSWITCH核心开发者,站在了同一个舞台上。

写代码是很辛苦的,我原先其实没什么做视频开发的经验,只是一点点学,一点点试,不停地Crash,不停地重启……

既然开源也算商业模式,那么写代码就算是投资吧。然而,这个投资回报可不怎么高,大多数时候大家根本不会为了开源代码付费,而是,会问你,你们有没有不开源的部分?卖多少钱?

说到这里我们得说说大家为什么要用开源。开源并不意味着免费,有时候,甚至会比你买商业的系统贵。所以,在我所咨询过的客户中,我都强调要争取更多的开源预算。因为,不管什么事情,如果没有足够的预算,最后一定会失败。好多人都觉得FreeSWITCH是免费的,然后搭起来就可以卖钱了,可玩到最后,发现坑越来越多,最后还是来找到我们支持。我们就会认真地帮他们分析哪些地方走了弯路。当然,我们这儿也并不一定不是弯路,但,至少,我比大多数人更了解FreeSWITCH能做什么,能做到什么程序,至于商业模式是否成功,那还是得客户自己掂量。至于那些问我们要不开源的部分代码的用户,脑子里的水一定很多。开源有开源的好处,如果我们单独给你维护一个不开源的分支,或者仅仅是写一个不开源的模块,你就失去了社区的支持,所有的测试都得自己做、Bug都得自己修。甚至,即使你能做到,你怎么同步上游的代码吗?如果你没有BAT这样的团队,你准备好预算了吗?

值得一提的是,上面说到的『坑』真不是我们故意挖的。如果你遇到『坑』,那恭喜你,你已经是深度用户了。想一想,你很少遇到Linux、MySQL的『坑』,却遇到了很多关于FreeSWITCH的,是FreeSWITCH不如它们稳定吗?诚然,有那么一点点,但是,更多的,是你没有用到MySQL那么深入。不信,你可以问问BAT的工程师,他们有没有遇到。

我知道BAT中也有些团队在用FreeSWITCH,他们甚至打了很多补丁,也维护着自己的版本。但到目前为止,给FreeSWITCH提交补丁的中国人还是寥寥,在核心团队中拥有核心代码提交权限的也只有我一个中国人。开源,是一个生态,希望未来有更多的人参与到开源事业中来。

有一年FreeSWITCH技术沙龙的时候,我把我的博客整理了一版,印了一本小册子,叫《FreeSWITCH:VoIP实战》还卖了不少。后来,这本书就正式出版了,书名改为《FreeSWITCH权威指南》。有点标题党,不过,书真的很厚。不多说了,写书比写代码难得多。

有了书以后,QQ群里大家常见的问题基本上都可以在书上找到,我也轻松了很多。这时候,我常回答的一句是:先买本《FreeSWITCH权威指南》自己看看再问。

后来,随着使用FreeSWITCH的人越来越多,也为了照顾那些平时匆忙没时间仔细研究但又想学又不想花很多钱的人,我们建立了一个FreeSWITCH精英群QQ。通过收费入群,在那里我回答问题会宽容些。比如我会直接告诉他命令,以及详细的参数,或者书上的哪一页,甚至专门写一篇文章解释一些复杂的问题,但在免费的群里,我一般就是点到为止。

真有人就花钱加入了精英群。不知道是水土问题还是进群的人素质本来就高,总之,精英群里反而很少有烂问题,提问和回答都很高效。同样的问题,我在免费的群里,基本需要反问10遍才把背景信息和日志套出来,而在精英群里,基本一两遍就行了。

2015年是社群的元年,我们也算是为这个元年做了一点点贡献。

有时候会有人心急火燎地提问问题,说老板告诉他们今天必须搞定。对于这样的问题我基本能回答也不回答 ,最多告诉他们该买个商业服务,我们有专门的应急通道可以帮助解决这类问题,同时,提醒群里所有潜水员,如果想得到更好的服务,最好未雨绸缪早交保险费。

上面例子当然是说给老板们听的。但同时,做为技术人员,如果在老板那里申请不下经费,我觉得自己花钱买本书或进个精英群、或是参加个培训之类也还是花得起得,如果工作做好了得以升职钱不就回来了么。我们群里有很多这样的例子。投资自己才是最好的投资。对我自己而言,虽然没有升职,但我这么多年每年自费往返美国参加ClueCon,回来得以吹吹牛什么的,也算是对自己的投资吧。

从2013年开始,学着大辉和池建强做FreeSWITCH-CN微信公众号。最初写东西比较多,最近一年懒了很多,希望来年能抽出时间多写点东西。

除了FreeSWITCH之外,我还给Erlang提交过补丁,不过一两行代码的事,就不值得一提了。

做了这么多年,虽然我们小步快跑,现金流都是正的,但其实我们一直没有找到好的盈利模式,一直都在摸索。而且,做为一个小公司,随便来一个大一点的活都会把我们的主要力量拽过去。也有不少人找到我们认真的讨论收购问题,但最后基本是都是没有下文。一个主要的冲突就是,他们根本不爱开源。而如果只是拿FreeSWITCH做出一款市面上已经存在的产品,同时又不开源,那又有什么意义呢?我们做开源,其中一点就是可以自由方便地取代那些收费高昂又不自由的商业产品,现在却要我们做成我们不喜欢的那些产品,意义何在呢?

FreeSWITCH一直没有一个好用的图形用户界面,我们最近正在做一个,也是开源的。我们不知道未来是什么样子的,但我们始终相信,开源是一条可以走下去的路,也许没有捷径,但我们肯定能找到办法越走越宽。

共勉。

— ——— 华丽的分隔线 ————

上面的文章是春节前写的,今年是2017年。日月如梭,转眼这一年又过了2/3,又一届ClueCon马上就开始了。我也已经来到芝加哥瑞士酒店,等待与全世界的FreeSWITCHer们见面。终日忙碌,也只有到了美国,我才有时间整理这篇文章,不管是否通顺,还是发出来吧,即然写了,就应该跟读者见面。

从写文章到现在,我们又经历了许多事情,不过,这,要等到后面再写了。

但有些事情还是可以透露的。在ClueCon之后,8月18日,我们在北京鹏润大酒店会开一个小的Cluecon,届时,我们会宣布一些消息。我们也能在会上见到全国做通信行业的技术人员和销售人员,或许有一些合作机会。