一個優秀的軟體工程師必然是全棧工程師(圖靈訪談)

ituring發表於2015-06-16

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

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

相關文章