故事還得從幾年前說起。
很久以前,我在電信(後來叫網通)做過程控交換機的維護,機型主要是上海貝爾的S1240和華為的CC08,也了解西門子EWSD、朗迅5ESS等機型以及各種接入網設備等。由於喜歡寫些小程序,所以在工作中也寫過一些與交換機交互的程序,但大都是一些執行命令創建和刪除用戶,收集和分析日誌等的操作,從來沒有涉及呼叫控制方面的。
有一年去北京,一次偶然的機會認識了Jonathan。他正在做英語在線教學的項目,從他那裡我了解到了Asterisk。當時,Asterisk都已經七八歲的樣子了,我卻是第一次聽說,可見處於體制內的我是多麼的坐井觀天。
在運營商工作的好處就是能接觸到各種程控交換機、大型的伺服器以及各種UNIX和各種資料庫,雖然我的工作主要是維護,但我還是利用工作和業餘時間開發了許多程序,開發語言主要是C和PHP,把跟我工作相關的交換機和OA等系統全部融合起來。我的很多理念和想法以及具體實現都是比較超前的,系統也是很好用的。但是,在支撐系統全市統一、全省統一、全國統一的大環境下,我寫的東西很顯然推廣不開。而且,後來,公司內部越來越輕運維,重市場,搞起了全員營銷。說白了就是你必須發展多少小靈通用戶,辦多少寬帶等。我越來越不喜歡那種工作狀態,就準備去北京投奔Jonathan。
在去北京之前,我研究了一陣Asterisk,在淘寶上買了一個單口的語音卡,接上我的辦公電話,有人打進來就先放IVR,然後通過逃生口接上話機,我再跟他們通話,感覺很神奇。我甚至配置了路由,可以在家裡用軟電話通過網絡利用辦公室的電話線往外打「免費」的電話。
後來Jonathan說Asterisk有問題,他準備換FreeSWITCH,問我有什麼意見。我對FreeSWITCH其實沒有什麼研究,便趕緊上FreeSWITCH的官方網站看了看,下載、編譯都很順利,簡單測試了一下,有些功能用起來竟然比Asterisk還方便。我便跟Jonathan說:值得換。那時候,FreeSWITCH還沒有出1.0版。
後來到了北京,我的職位是系統管理員,主要是搞定教學平臺的各種安裝和部署。我很欣慰,像我這種自學成才的Linux菜鳥在整個團隊中卻成了Linux專家。而且,更讓我喜歡的是,我可以完全使用Linux桌面工作了,以前的各種Windows上專用的軟體都見鬼去了(後來有了錢,電腦換成了Mac)。在工作中,我學會了Ruby、Ruby on Rails、SVN以及後來的Erlang等技術。我很勤奮,分內的分外的事情我都做,以至於後來整個系統從最底層到最上層我都懂。
FreeSWITCH在我們的系統裡是一個重要的部分,在使用和維護過程中,我也會發現一些系統的Bug,並漸漸跟FreeSWITCH社區有了交流。
其實,FreeSWITCH最初相關的開發都是由Jonathan負責的,公司也一直想招一個專門做VoIP開發的人員,但就是一直沒招到。後來Jonathan公務越來越忙,我又什麼都會,FreeSWITCH相關的開發任務也落在了我身上。當然,我後來也忙不過來,就又招了一名系統管理員給我打下手。這樣,我的工作重點就轉到了研發,以及系統架構。
外企的工作環境還是很寬鬆的。雖然工作不少,但我勤奮啊,在北京只有我一個人,因此,除了公司以及團隊自發組織的各種業餘活動,不管是晚上還是周末,我都抱著電腦。當然,有一件比較悲催的事情是,我跟公司幾個客服(其它他們銷售和客服什麼都幹)人員住在一起,因此,系統一有問題,便總能找到我。所以其實我大部分的業餘時間是為公司奉獻了。當他們不找我的時候,我就自己優化系統。
我也跟Jonathan開玩笑說,我其實大部分時間都是在修他寫的Bug。
Jonathan是個天才,他學東西非常快,想做的東西也很快就實現了。但如上面所說,他沒有時間做精細的調試和打磨,因此,我正好是一個很好的補充。所以,我最初的FreeSWITCH技術全都是跟他學的,包括混進FreeSWITCH社區。
我們是屬於使用FreeSWITCH比較早的一批用戶。在我們基於FreeSWITCH的系統上線後的幾天內,FreeSWITCH發布了1.0.0鳳凰版。
當然,在使用開源軟體的同時我們也有所貢獻。最初主要是報Bug和寫Wiki,後來,就開始提交補丁了。那時候,FreeSWITCH的開發人員都很專注,因此,Bug修得很快,基本上都是我們今天報上去,第二天上班一看就修好了(美國人在我們睡覺的時候工作)。有一陣,我接連不斷的提交新特性的建議和補丁,在打完最後一個補丁後Anthony跟我說,我可以休息一下了嗎?我說,可以了。
我基於一個G729庫寫了FreeSWITCH中最初的G729轉碼模塊,後來網上流傳的很多版本都是基於我的版本修改的(頭文件裡還有我的名字呢)。不過,寫這個模塊其實是一個錯誤。我後來才了解到,原來FreeSWITCH內部早就實現了G729的轉碼,只是,由於專利原因,無法對外發布。對此專利細節我不了解,但是,據我所知,在世界上絕大多數國家,即使你自己實現了G729的編碼,也要交專利費。由於我的錯誤,FreeSWITCH關閉了Wiki上G729頁面的修改權限,也禁止在郵件列表裡討論G729轉碼。後來,FreeSWITCH官方在Linux上實現了G729的Licence機制,10美元買一個編碼器和一個解碼器,FreeSWITCH最終才有了G729的解決方案。當然,那都是後話了。
當然,我們(外企)是很重視專利和版權問題的。所以,後來,我寫的模塊僅用於試驗,但沒用於生產。用於生產的,是我寫的另外一個模塊,叫mod_recpld,是Record Payload的縮寫。實現想法是,不經過轉碼,而把G729的內容直接錄下來,後面,再用其它程序將G729轉成mp3文件。而我們有這個「其它程序」的G729許可證。其實這種錄音方法後來在FreeSWITCH核心中也實現了。另外,我們也後來也發現G729編碼在網際網路上的聲音質量不如iLBC,因此,在我們決定不再使用一個僅提供G729編碼的PSTN落地提供商的線路後,我們也不再使用G729了。
通過寫上面兩個模塊,我深入了解到了FreeSWITCH內部的機理。以後再改代碼,就容易得多了。
除了在線教育平臺外,我們的銷售和客服團隊也逐漸壯大,因此,需要一個呼叫中心系統了。最初的呼叫中心是用Trixbox搭的,Trixbox是一個集成CentOS和Asterisk的一個發行套件,使用起來很簡單。我們使用很老的只有700多M內存的奔騰機器跑這個應用,竟也能帶十來個座席。當時,使用的是「淘」來的Asterisk兼容卡連接模擬外線。我們甚至還用了OSLEC做回聲消除。後來,隨著需求越來越多,我們將它換成了FreeSWITCH,我們自己實現了CRM,跟我們的系統緊密集成。多緊密呢?我們用Erlang實現了IVR功能,當有電話打進來時,它便播放歡迎詞,同時,根據主叫號碼,異步的到美國的伺服器上去查詢這個是誰的客戶,進而分配座席和彈屏。去美國的伺服器查詢比較費時,但是我們用Erlang很優雅地通過異步操作實現了該功能。
另外,我們也購買了一個Global IP Sound的庫,實現了自己的SIP客戶端。沒想到,後來Global IP Sound變成了Global IP Solutions,後來又賣給了Google,Google又把那些代碼開源了。
再回到我們的教學平臺上。由於我們在美國的老師都是Work-At-Home(在家工作)類型的,他們分布在全美各地,因此,實際上我們的教學平臺就是一個分布式的呼叫中心系統。有一套很複雜的算法,根據老師上課的數量和質量給他們發錢。我們的平臺用到了Ruby on Rails,Erlang,Lua 和FreeSWITCH,每個技術都有它們最擅長的地方。
同時,我們也在不斷的招聘老師。我們做了一個自動面試程序,面試者在Web頁面上註冊,根據提示,輸入自己的電話號碼,我們呼叫他們的電話,閱讀我們指定的文字並錄音。這一切都是自動的,電話跟頁面也是同步的。通過幾輪自動面試之後,我們才會有相關的人員人工聯繫他們進行更深入的面試。這些,也都是用FreeSWITCH做的。
當然,這麼多「分布式」的老師要開會啊,因而,我們又用FreeSWITCH實現了會議系統。
還有一個有意思的事情。當時,由於國內的網絡條件和對VoIP的限制,我們在國內是直接使用PSTN電話跟學生連線的。有些學生反應他們的手機處於漫遊狀態(如從外地到北京上新東方培訓班),接電話很貴。因此我們又做到了FreeSWITCH跟Skype和Google Talk的互通。這樣,我們就可以在FreeSWITCH中打電話到學生的Skype或Google Talk客戶端上。
當然,事情也不是永遠一帆風順,最初跟Skype和GTalk互通,FreeSWITCH總是崩潰,我們報了一些Bug,打了一些補丁才解決。這也決定了我們的基礎架構——我們專門起了幾個FreeSWITCH進程,用於跟Skype或GTalk連,即使其中一個崩潰了,我們也可以迅速切換到另一個(為此,我們也註冊了很多Skype帳號 :) )。
總之,正是由於不斷的「折騰」,我們的FreeSWITCH技術才不斷進步。
花開兩朵,各表一枝。再倒回去說說FreeSWITCH社區的事情。
一來二去,我在FreeSWITCH社區裡混得熟了,便萌生了一個做FreeSWITCH中文社區的想法。我對開源很熱愛的,我曾在Linux Focus上翻譯文章,翻譯SQLite的文檔等。中國人也都很厲害,幾乎任何東西都有了中文版,有了中文社區,但當時,FreeSWITCH還沒有。
我很快註冊了域名,FreeSWITCH-CN開張了。
在任何圈子裡,總會找到志同道合的人,我發現了大熊。我發現他幾乎在同一時間建立了FreeSWITCH QQ群,我甚至不記得我是怎麼發現他的了。大熊人非常好,把我升級成了QQ群的管理員。他從來都很低調,不知道的還以為我是QQ群的群主呢。
對於QQ,我以前不大用。最早註冊的QQ號都忘記了,後來工作後一個同事讓給我一個QQ號我使用至今。我前些年折騰Linux,而Linux上的QQ總是各種不好用。後來在外企大家都用MSN和Skype,而我的工作平臺也由Linux換成了Mac。離開外企之後,沒有人用MSN了,而Mac版的QQ也開始爭氣了(比Windows上老是彈出垃圾廣告好多了),所以我QQ就用得多了。
我很快取得了FreeSWITCH SVN Contrib 代碼庫的提交權限。Contrib 就是FreeSWITCH外圍的一些代碼庫,FreeSWITCH屌絲們可以把自己實現的一些好玩的東西提交上去,全世界共享。我提交了一些我寫的代碼,後來,發現我在代碼中「發明」的方法被大家廣泛使用。甚至,有一次,在ClueCon上,一個保加利亞的哥們不非常不流利的英文跟我說那幾個腳本真是太好用了,幫了他大忙。
再後來,由於我在FreeSWITCH社區表現突出,提交的補丁也得到了社區的認可,就取得了FreeSWITCH核心代碼的提交權限。而這時,FreeSWITCH的代碼庫也早已從SVN遷移到了Git。
我最初建立社區的想法很簡單,中文網站只是一個網站,用Google Groups做郵件列表,進行討論,用QQ群做即時的討論(我甚至也想過IRC)。關於郵件列表,英文社區裡也有很多討論,到底郵件列表好還是一個BBS好?社區的管理人員認為郵件列表好,因為你可以用任何你喜歡的郵件客戶端參與討論。而有不服氣的人去建了BBS,結果就是沒有人氣。我受他們的影響很大,因此,從來沒有建BBS的想法。但很遺憾,Google Groups很快就無法訪問了。我好像是受了詛咒一樣,我註冊了Twitter,Twitter不好用了,我註冊了Facebook,用了幾天不好用了,我用DropBox,隔幾天就連不上了,我建立了FreeSWITCH-CN Google Groups中文討論區,也無法訪問了。到今天,我偶爾還會在Google Groups裡發郵件,但是,無論如何都沒大有人氣。
而關於建立BBS,在國內也是很困難的。你必須備案,必須有人監管,必須……。總之,有很多人提出我們該有個BBS,但我總是沒有精力去做這件事,我也說過有人願意捐贈伺服器並搞定一切事情的話,我們也可以建立個BBS,但到今天還是沒有結果。
我想,也許,大家有問題的話還是到專業的社區上去討論吧,因此,我開了知乎專欄(zhuanlan.zhihu.com/freeswitch),並鼓勵大家到那裡去提問FreeSWITCH有關的問題。
QQ群裡的成員倒不少,目前也是最主要的交流平臺了,群裡風氣很好,也沒大有廣告,我很高興看到大家都在討論技術。
最初,我在群裡回答問題是很積極的,但是大家好像不怎麼配合,總問些沒法回答的問題。我便寫了一系列的文章告訴大家應該怎麼把問題描述清楚,也就是如何問到點子上,如何收集日誌並貼到Pastebin上。後來,的確起到了一些效果,有些人已經學會了如何先把日誌貼到Pastebin上再提問題了。
不可避免的,你需要一遍一遍的回答各種問題。因此,我想寫一本書,給大家講一些基礎的知識。我的想法就是,再有人提問時,告訴他看書的第幾頁。但寫一本書談何容易,因此,最初我把寫的東西以博客的形式發布出來,供大家免費閱讀和挑刺。但我很討厭把我的文章轉載到自己的博客裡去掉作者姓名當自己原創的人,也很討厭那些把文檔製成Word版上傳到各種文檔分享網站換積分的人。為此,我還專門跟百度幹了一架。但得到的後果是在百度上搜FreeSWITCH,再也到不了我們的網站了。
因此,後來,我的寫作就不積極了,有時候寫了也不願意發。兩年前,在我們國內FreeSWITCH-CN第一屆沙龍前夕,我把書印了出來,大家竟然非常喜歡。也有讀者告訴我,越看越愛看,每看都有收穫,甚至在草原上放羊的時候也看。
但無論如何,小冊子總有「非法出版物」之嫌。因此,能夠正式出版,一直是我的一個夙願。值得欣慰的是,經過四年多的積累,在華章公司的支持下,這本書《FreeSWITCH權威指南》終於跟讀者見面了。這是我的第一本書,也是國內第一本講FreeSWITCH的書,但就在第一本書上出現了「權威」二字,我還是有點心虛的。我確實想把我所知道的都寫進書裡,但是,既使每個主題都沒有深入進去,這本書也已經很厚了。無論取捨是否得當,總之,這是我真心想送給廣大FreeSWITCH愛好者的一個禮物。同時,也歡迎各種批評。
2011年,我第一次參加在美國芝加哥舉辦的ClueCon,我不想錯過任何機會,便找了個空子上臺講了幾句。第一次用不流利的英文在200多個純老外面前演講,真的很緊張,不過,堅持下來了,反應還不錯。
2012年,我就有備上臺了,英文也稍微好了一點點。我用了幾個性感美女圖片轟動全場。
2013年,FreeSWITCH三劍客(Anthony、Brian、Mike)都在下面認真聽我的演講(以前他們基本都在外面跟別人聊天),讓我在臺上小激動了一把。
當年,還有一個好玩的事情。一個加拿大的哥們跟我說,我寫得東西真好,他有問題了就到我的網站上找答案,看不懂中文就用Google Translate翻譯。還把他做的系統演示給我看(他確實做得很好)。
2014年的ClueCon上,我在兩個比賽上——FreeSWITCH Hack-A-Thon和Dangerouse Demos都得了獎。最後,還跟FreeSWITCH核心團隊在臺上拍照留念,算是正式成了FreeSWITCH團隊的一員。
2012年開始,我們FreeSWITCH-CN中文社區也學著ClueCon的樣子在國內搞活動,為避免版權問題,我們不叫ClueCon,叫FreeSWITCH開發者沙龍。隨著大家對FreeSWITCH的關注的提高,我們的活動竟也有模有樣。前兩屆都在車庫咖啡,去年在北郵科技酒店,今年在鵬潤國際酒店,感覺一年比一年好。
2013年開始,我開始做公開的FreeSWITCH培訓班,每批都有二、三十名學員,感覺也還不錯。今年最後一次FreeSWITCH培訓是在煙臺舉辦的,這也是我把FreeSWITCH陣地轉到煙臺的第一次嘗試。
再往回穿越幾年。大約就在我第一次參加ClueCon的時候,我們原先的公司因為各種原因,部分解散了,其中也包括我。
在老的沒人要的時候,只能去創業了。
創業的過程是艱苦的,我們也學到了很多東西。在這些年裡,我潛心研究FreeSWITCH,實現了MSRP、實現了類似IMS的架構、實現了RTMP基於Flash的視頻(有大熊的支持)、實現了RTSP、VLC視頻、實現了視頻轉發、視頻轉碼、視頻會議、視頻錄像、做了N個版本的指揮調度系統。這些系統有的是實驗性地,有的還不很完善,也大部分沒有開源,不過,我一直惦記著開源這回事呢。
關於做開源與賺錢的問題,我也一直在思考,在嘗試。我確實沒有認真的考慮過怎麼發財,幾年下來,接近溫飽。我骨子裡是個技術人員,不會動不動就談模式、談顛覆。但,我卻一直在嘗試做與眾不同的東西。
關於我的創業的故事,如果接下來有時間我或許會寫一寫。今天,先到這裡吧。
與諸君共勉。