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

jopen 9年前發布 | 24K 次閱讀 軟件工程師

張虎,云巴 (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 上一樣,幾乎任何軟件也都是依賴操作系統的,軟件開發工程師對操作系統的深入理解,幾乎是成為一個高手必須具備的能力。另外,學習操作系統的編寫,也是提升能力的一個很有效的方法。

除了很底層的幾個編程語言外,幾乎所有的編程語言都是為特定領域發明的,學習一個領域的新語言,實際是學習了一個新的思維方式,可以幫助工程師從各個不同的角度思考問題。所以我個人覺得多花一點時間去多了解一門編程語言是很值得的。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!