雲巴創始人張虎:一個優秀的軟件工程師必然是全棧工程師

張虎,雲巴 (yunba.io) 創始人兼CEO,致力於爲開發者提供優質雲後端服務。他有十幾年的軟件研發經驗,精通嵌入式系統、服務器端架構、虛擬化等。張虎曾就任於華爲、Oracle,他是Oracle VM 的創始團隊成員。離開Oracle後,他創立了極光推送,曾任CTO,他創意並主導開發的系統爲過萬開發者、過億終端用戶提供推送服務。張虎長期關注業界新技術、新實踐,並持續引入到團隊實踐驗證。前端

圖片描述

問:你是從何時開始編程的?程序員

高中開始用學習機時就對學習機產生興趣,當時玩過一點BASIC。正式學習編程是從大學階段開始的。面試

問:關於計算機和軟件的知識是經過什麼渠道得到的?對於大學的計算機教育你有什麼見解?數據庫

大學學的是數學和機械方面的專業,計算機的基礎知識都是靠自學。大學期間,有段時間個人全部活動不是編程就是踢球,或者是在上課時看計算機相關書籍。每當看到好玩的遊戲、好用的軟件,第一時間想到的都是我本身可否也寫一個相似的出來。剛開始工做時,我對操做系統癡迷到了一種幾乎狂熱的地步,連續花了幾年時間研究了不少系統的源代碼。編程

我我的不太贊同目前的大學計算機教育方式,這幾年面試了來自各類學校的大學生,廣泛的感受就是基礎知識不夠牢固。不少大學的計算機教育的核心就是編程,以教授C++,Java這些高級語言爲主。可是,高級語言掩蓋了太多的細節。雖然它確實有利於你快速編寫出可用的軟件、提升生產力,但在學習階段,卻不利於基礎知識的累積。後端

問:你是如何加入Oracle的?又是如何成爲Oracle VM創始團隊成員的?服務器

我是2006年離開華爲後加入Oracle的,那時候基於Xen的虛擬化剛開始有一些影響力。Oracle在深圳和北京的一個團隊開始啓動開發Oracle VM。我當時對虛擬化特別感興趣,就申請加入了團隊。微信

問:在Oracle工做的經歷對你來講最大的收穫是什麼?網絡

在Oracle的工做經歷讓我意識到一個軟件產品的開發不只僅須要在技術上到位,還須要有匹配的品牌包裝和市場宣傳。在產品開發的過程當中根據產品需求,咱們須要不斷地對產品的方向和定位作一些調整。好的產品除了在技術上要有創新以外,還必定要很好地爲市場需求服務。前端工程師

問:做爲國內第三方推送的發起者,你在創立極光推送的時候國內尚未相似的服務,請問你當時是怎麼想到從這個角度開始創業的?

我當時比較關注Android在中國的發展,也有不少朋友聊過關於推送方面的問題。當時面臨的問題是Google的 C2DM(如今的GCM)在國內由於種種緣由不能使用,而國內的Android廠商各作各的推送系統,對開發者來講沒有一個統一的解決方案,我感受市場須要有一個面向開發者,獨立於廠商的第三方推送產品。正好,當時有個前同事,創業即將失敗,帳戶上還有一點錢,通過溝通,咱們就啓動了這個產品,也就是後來的極光推送(JPush)。

問:請問你離開極光推送的緣由是什麼?

由於當初我是以加入一家現有公司的形式啓動極光推送這個產品的,當時在股權結構上就有不合理的隱患。後來,公司以前的產品徹底放棄,全面投入作極光推送,其結果是團隊裏不少原來的創始人實際沒參與過極光推送。

我做爲極光推送的發起人和創始人,卻對公司運做的實際控制權有限,管理團隊成員之間不免會產生問題,影響了產品和公司的發展,最終促使我作出了離開的決定。

問:在第一次創業過程當中遇到過什麼困難?這些經歷幫助你在如今的創業路上作出了哪些不一樣的選擇?

極光推送能夠說是個人第一次創業。如今回頭看,當時對創業能夠說不是很瞭解。我只是對產品、服務、技術有本身的認識,知道怎麼去作,知道方向是什麼,可是對整個創業過程,好比怎麼跟團隊談股份,怎麼分配你們角色,怎麼跟資本溝通,卻經驗有限。因此經常以爲若是當時能有一個導師指引就行了,這樣整個團隊的發展可能會到一個更高的層面。

通過這件事以後,我對於在公司初創、發展,以及取得成績以後的各個階段中的人員協調、利益保障都有了比較清楚的認識,也所以將這些經驗運用到了建立和管理雲巴上面。

問:如何想到要創立雲巴這個平臺?如今的發展方向和最初的想法是否有一些不一樣?

計算機的網絡,除了計算、存儲的功能之外,還有個重要的功能就是信息的交換,換句話說就是通信。隨着網絡和硬件的發展,通信逐漸被劃分爲人與人之間的通信、人與機器之間的通信,以及機器和機器之間的通信。

人與人之間的通信已經有不少企業在作了,好比QQ、微信還有企業內部通信工具這些。每每被人們忽略的是人與機器以及機器和機器之間的通信,這比人與人之間的通信量大得多,並且通訊的方式存在較大的區別。

機器之間發消息,作不到「他沒理我,我再給他打個電話」。目前我想作的就是找到兩個傳統領域的結合點,從人們認爲沒有太大聯繫的二者中找到結合的機會,而不是盲目地進入已經成熟的領域。目前國內市場並無一個真正適合的產品。

目前公司發展的方向和當初的設定基本一致,但在宣傳和市場開發的側重點上略有調整。之前的想法仍是以移動互聯網App爲主,結合智能硬件、物聯網。通過過去一年的驗證,咱們發現如今不少產品實際都是以智能硬件爲中心,手機上的App管理智能硬件,因此咱們如今對智能硬件、物聯網開發者的支持度不斷增強

另外,價格策略咱們也在不斷微調中。咱們但願爲開發者提供起步門檻足夠低,按使用量付費,體驗良好,而且可靠、可持續發展的產品。

問:雲巴的用戶案例中展現了掌閱、Yo、以及雲巴小車的案例,這些案例是否表明了雲巴提供的主要產品類型?來自各類用戶的不一樣需求是否也對雲巴的產品產生了影響?

幾個不一樣的案例展現了咱們產品在不一樣場景不一樣需求下的使用。包括手機App、智能硬件。另外還有一些智能家居的產品,也在使用雲巴服務。

咱們在跟不一樣的用戶溝通的過程當中,發現用戶對服務的極低延遲、可靠性、機房的本地化部署都很是關注,這也直接影響了咱們對雲巴系統設計的調整,甚至是開發語言的選擇。目前,咱們產品絕大部分模塊的集羣管理、業務邏輯代碼都用Erlang改寫。

問:如今雲巴面臨的最大挑戰是什麼?(新產品開發、性能提高、或者技術轉型?)

天天,不一樣的手機App、智能硬件、服務器經過雲巴系統進行數千萬的實時消息通訊。如何爲全部的平臺提供實時、可靠、高效的服務,是雲巴面臨的最大挑戰。

圍繞這些挑戰,具體來講咱們目前在攻克幾個技術點,包括:

  • 高可用、高併發、極低延遲,而且支持複雜數據類型的內存數據庫系統;
  • 多機房多活的部署方案。

問:在創業之初,大家在團隊的分工問題上(開發、測試、運維各司其職)走過彎路,後來用Devops的方式解決了這個問題。請問Devops是值得推薦給全部初創團隊的工做方式嗎?

DevOps是開發和運維這二者的有機結合,我認爲初創團隊均可以嘗試一下這種聯合開發模式。目前的互聯網創業最重要的是要快速響應市場的需求,而在傳統的開發模式下技術部門和運維部門是脫節的,他們有不一樣的目標需求。一款產品須要知足市場上的現有需求,開發部花了很大的心思和精力,完善功能,用了很厲害的新技術,以後一股腦的丟給運維部門。這時運維部門是很慌的,可能這款優秀的產品根本就沒法運行,或者他們徹底不瞭解這個產品的新功能,這樣運維部門會不斷地給開發部門提出改進需求。這樣一去一來等產品真正完成了,早已通過了產品上線的黃金時間。有很牛的開發者,有很牛的運維人員,更須要協調統一這二者的步調和目標,而DevOps正好提供了這個方法。

雖然DevOps對產品開發的過程很重要,但團隊更須要在乎的是整個項目方向的正確性。

問:你對不少新的語言和技術都很關注,好比Rust和Elixir,請問你我的和你的團隊都是經過什麼方式學習和考察新技術的?

咱們團隊過去一年(2014)從零基礎開始學習 Erlang,而且把咱們系統大部分模塊用 Erlang 改寫。

最初期,從我本身開始,調研了現有使用Erlang的產品,特別是實時高併發的產品,我閱讀他們的博客和發表的文章,瞭解他們的心得。後來我開始寫一些產品的原型,團隊部分紅員開始嘗試解決一些小bug,慢慢開始寫一些小模塊。這段時間我會review全部代碼,引導團隊學習正確的方法。通過一段時間的積累,部分紅員就慢慢能獨立編碼,再發展就有人能參與review代碼了。

咱們對於編程語言的選擇首先從穩定性、分佈式,以及可以長期運行等方面去考慮,不能只一味地跟風現有最「時尚」的語言或者使用人數最多的語言,由於咱們的產品須要面向海量併發服務,合適的纔是最好的。

另外,咱們團隊也在持續關注新的語言和平臺,好比 Rust、Golang 這些最近新出現的語言。Elixir 這種在現有平臺上產生、對開發者更友好的語言,咱們也在嘗試準備引入。

問:在雲巴的招聘要求中,對於全棧軟件工程師和前端工程師的要求是最高的,請問雲巴的前端工程師和全棧工程師是如何合做的?

雲巴的全棧工程師主要負責對後端功能的實現,後端系統的成熟度直接影響整個產品的成熟度。

前端工程師的工做目標是把咱們的產品優雅地呈現給咱們的用戶。視覺、交互體驗,直接影響用戶對咱們產品的喜愛,因此咱們也很是重視。

在咱們團隊內部,咱們常常說前端就是咱們系統的一個HTML5 App,後端的工做就是提供友好的接口,幫助這個App達到良好的用戶體驗。

問:有一種流行的說法是掌握了Node.js的前端工程師就是全棧工程師,而云巴的全棧工程師彷佛更像是傳統意義上的後端工程師。請問對你來講,全棧工程師意味着什麼?

咱們定義的全棧工程師,更強調對一個完整系統的各個環節原理的理解,包括操做系統、網絡、編譯系統,還包括問題定位、性能測量、性能調優等方面的動手能力。而不像咱們常常看到的傳統後端工程師,每每強調對某種特定語言的掌握。咱們的全棧工程師實際上都掌握多種語言,以知足不一樣方向上的工做須要。

從某種意義上來講,一個優秀的軟件工程師必然是一個全棧工程師。在一個以技術爲導向的公司,頂級工程師的能力直接決定了整個公司的能力。

問:你喜歡「玩」操做系統和各類編程語言,你在招人的時候也會以這樣的標準來要求程序員嗎?

剛開始工做時,我連續花了幾年的時間研究 Linux Kernal、uCOS、Nucleus、vxWorks 等系統的源代碼,嘗試幾乎全部的編程語言,包括彙編在內。

「玩」這些東西除了是我本身的興趣外,也是工做須要。可是不必定每一個人都有機會在工做中接觸到這些東西,因此咱們對工程師也沒有這樣的硬性要求。

可是,就像任何代碼都運行在 CPU 上同樣,幾乎任何軟件也都是依賴操做系統的,軟件開發工程師對操做系統的深刻理解,幾乎是成爲一個高手必須具有的能力。另外,學習操做系統的編寫,也是提高能力的一個頗有效的方法。

除了很底層的幾個編程語言外,幾乎全部的編程語言都是爲特定領域發明的,學習一個領域的新語言,實際是學習了一個新的思惟方式,能夠幫助工程師從各個不一樣的角度思考問題。因此我我的以爲多花一點時間去多瞭解一門編程語言是很值得的。


更多精彩,加入圖靈訪談微信!

圖片描述

相關文章
相關標籤/搜索