天天看點

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

這篇部落格原作者的部落格連結:

https://blog.csdn.net/analogous_love 寫在前面的話

我在七八年前就看過這篇文章,那個時候我還是一名學生,它深深地影響了我學生時代以及後來的人生軌迹。(是以原文絕對不是首次發表于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或者微信伺服器中斷一兩個小時,後果會怎樣?而用戶端更側重的就是産品的細節、使用者的體驗,當然盡管有些使用者體驗可能是由伺服器端決定的,但是最終還是由用戶端反映出來。我不贊同文章中說,用戶端更能積累除了技術以外的其他知識,伺服器開發也一樣的,不管是用戶端還是伺服器,隻有具有産品思維的開發才是好的開發,而功能的設計與規劃伺服器端的開發在時間點上一般先于用戶端開發的。而具體的功能點,也是需要伺服器開發人員與産品人員乃至客戶溝通的。

薪資方面

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

結語

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

繼續閱讀