1. 程式人生 > >寫給那些傻傻想做服務器開發的朋友

寫給那些傻傻想做服務器開發的朋友

需要 基礎上 技術 由於 災難 高可用 兩個 部分 SQ

很久以前看過一篇標題為《寫給那些傻傻的,想做服務器開發的應屆生》文章,無意中看到知乎上也對這篇文章進行了激烈的討論。下面談談我的看法。

寫在前面的話

我在七八年前就看過這篇文章,那個時候我還是一名學生,它深深地影響了我學生時代以及後來的人生軌跡。(所以原文絕對不是首次發表於2015年,我猜想可能是後來的作者2015年修改了原作者的一些內容,並增加了一些自己的東西,讓它"與時俱進")。我學生時代深受這篇文章的影響,以至於我印象中的服務器開發的樣子和地位就是這篇文章中所描述的。

我的工作經歷

我畢業的時候,一心想做出Windows C/C++客戶端開發,當時為了做這個開發放棄了我熟悉的flash編程和web開發,當然薪資也是比較低的。做了幾年Windows客戶端後,我毅然以一定的代價轉到了linux服務器開發。到今天為止,大致做過股票資訊、交易系統、遊戲服務器、即時通訊系統和直播類型的服務器,架構的能力也由最初的千人到後來的百萬在線。我從不後悔我當初轉行服務器開發,甚至很慶幸當初的抉擇,然而我可能更喜歡的還是客戶端開發。

寫給那些傻傻的,想做服務器開發的應屆生》一文中的有些觀點,根據我的經歷,我不敢贊同,或者說我的感受與之大相徑庭。

加班的情況

首先說下加班的情況,不管是大公司還是小公司,由於現在的各種測試、預警機制、監控策略和公司發布流程的不斷完善,一個月內經常為各種服務器bug、和應急的情況加班的現狀已經大為改善不少,當然偶爾發版或者趕項目加班還是有的,不過一個月的頻率也就那麽一兩次。如果你們團隊頻繁地為了修正緊急bug、解決服務器穩定性問題,那麽你們真要好好考慮你們的方法是不是有問題了。

服務器開發與輪子

其次,服務器開發,不僅僅如文中所說的,利用或者組裝各種輪子。一個穩定的服務器架構,必須是建立在設計師良好的基礎知識和見多識廣的經驗基礎上,即使是使用現有的輪子,也是對這個輪子足夠熟悉的基礎上,才能讓輪子最大地適用自己的公司的業務。也就是說,服務器核心項目人員雖然不一定要造輪子,但一定要具備造輪子的能力。開源的東西好用是好用,但是要麽不出問題,一旦出問題往往很難修改。我們去年做類似“沖頂大會”、“百萬英雄”這類直播答題應用,由於這類遊戲是從美國HQ刮過來的風,國內各大公司為了迅速搶占市場與用戶,都想著要比別人早點做出來上線,所以我們公司當時deadline壓得比較緊。我們那個時候,最不想看到的人就是項目經理,天天跟著我們後面催項目的進度。項目進度緊不說,另外還有一個技術挑戰,由於節目比較火熱,同一個房間裏面可能會達到百萬人同時在線,而這百萬人可能同時都會發彈幕消息。假設某個時刻,房間裏面有n個人,某個人發一條消息,其他n-1個人收到,服務器需要推送n-1次。如果n個人同時發消息,那麽服務器同一時間就要推送n*n,如果n等於1百萬的時候,那麽單秒的數據量將非常恐怖,這個是我們需要解決的一個技術難題,解決目標是最少延遲的情況下,彈幕最多的送達率;另外一個難題就是,保證出題和答案不能有太多的延時(小於1秒),並在用戶給出答案後,服務器能夠迅速統計出答案結果並應答客戶端。(沒辦法,所以此時主持人的作用就發揮了,萬一延遲太厲害,主持人可以和觀眾各種嘮嗑,當然這是下下策,如果頻繁出現這種情況,領導的臉色肯定也不好看,我們做技術的臉上也沒有光彩。)那段時間基本上是周六周日都要加班,甚至連周末都可能要到淩晨才能回去。註意:我把這段經歷並沒有放在上面的關於服務器開發是否頻繁地加班的欄目下,這裏我想說明的並不是服務器開發要經常加班,我想說的是,如果你平常只會用輪子,而不註重基礎內功的修養,這種場景你是很難應對的,首先是單機服務性能要做到極致,其次是多個服務之間的高效配合。很多人可能覺得這種場景也不難,甚至有的人號稱單機服務就能解決,這些都是站著說話不腰疼了。像熊貓tv的“沖頂大會”和西瓜視頻的“百萬英雄”前幾次的答題活動中,也出現了服務中斷或者題目延遲厲害,甚至“百萬英雄”還出現過一次因技術問題答題活動被迫延期的事故。

技術與產品思維

接著說下,技術和產品方面的,服務器開發與客戶端開發的思維方式和理念其實是不一樣的,如果說客戶端產品是一個產品的臉面,那麽服務器端就是產品的靈魂。這裏可能比喻有點不恰當,與客戶端開發相比,優秀的服務器開發應該盡量在單機服務上的性能做到極致,必須盡量利用少的資源給盡可能多的客戶端服務(在資源總量有限的情況下,你為單個客戶端服務使用的資源越少,你才可能為越多的客戶服務)。而服務器開發必須有條不紊地處理與每個客戶端的交互,不能糾結或把資源花費在某一個客戶端上。但是客戶端不一樣,客戶端只需要管理好自己的一畝三分地就可以了,而且客戶端的大多數邏輯和細節在界面(UI)邏輯上。但是我不贊成文中作者所說的客戶端代碼比服務器代碼少很多,相反,我經歷過的項目,都是客戶度代碼比服務器代碼多很多。因為客戶端代碼往往有大量的界面邏輯,如果服務器端沒有UI的話,其核心除了網路通信部分,剩下的就是各種業務邏輯(包括存儲邏輯,也就是業務邏輯服務器和客戶端都有,但是客戶端還有界面邏輯)。而從開發團隊的人數配比上來說,一般單個端(比如pc、安卓、ios中的一端)的人數要小於服務器開發人員的數量,因為一般一個高級客戶端開發,往往可以一個人搞定一個客戶端,但是一般很少有一個高級服務器開發可以單獨搞定一套服務開發的。(說的是通常情形,請不要走極端)。服務器開發的核心字眼體現在“服務”上,如何為客戶端提供穩定的、高效的服務,這是關鍵的地方。這裏“穩定”也包括容災容錯。大凡有一定規模的用戶群體的產品,如果服務器不穩定,那後果將是災難性的,試想QQ或者微信服務器中斷一兩個小時,後果會怎樣?而客戶端更側重的就是產品的細節、用戶的體驗,當然盡管有些用戶體驗可能是由服務器端決定的,但是最終還是由客戶端反映出來。我不贊同文章中說,客戶端更能積累除了技術以外的其他知識,服務器開發也一樣的,不管是客戶端還是服務器,只有具有產品思維的開發才是好的開發,而功能的設計與規劃服務器端的開發在時間點上一般先於客戶端開發的。而具體的功能點,也是需要服務器開發人員與產品人員乃至客戶溝通的。

薪資方面

最後說下,薪資方面。一般大於兩年且同樣的工作年限的服務器開發人員要比客戶端開發人員高至少三分之一左右。當然不排除一些非常優秀的客戶端開發人員可能不在這個規則內。

結語

總結起來,選擇了哪條路就選擇了什麽樣的生活。做服務器開發的可以在高並發、高可用方向進一步努力,而做客戶端開發可以在用戶體驗、設計細節方面下功夫。不管怎樣,都是我們想要的生活,那裏傾灑了我們的汗水,也收獲了我們自己的成就感。

歡迎關註公眾號『easyserverdev』。如果有任何技術或者職業方面的問題需要我提供幫助,可通過這個公眾號與我取得聯系,此公眾號不僅分享高性能服務器開發經驗和故事,同時也免費為廣大技術朋友提供技術答疑和職業解惑,您有任何問題都可以在微信公眾號直接留言,我會盡快回復您。

技術分享圖片

寫給那些傻傻想做服務器開發的朋友