好久之前看過一篇標題爲《寫給那些傻傻的,想作服務器開發的應屆生》文章,無心中看到知乎上也對這篇文章進行了激烈的討論。下面談談個人見解。linux
寫在前面的話
我在好久之前就看過這篇文章,那個時候我仍是一名學生,它深深地影響了我學生時代以及後來的人生軌跡。。我學生時代深受這篇文章的影響,以致於我印象中的服務器開發的樣子和地位就是這篇文章中所描述的。ios
個人工做經歷
我畢業的時候,一心想作出Windows C/C++客戶端開發,當時爲了作這個開發放棄了我熟悉的flash編程和web開發,固然薪資也是比較低的。作了幾年Windows客戶端後,我毅然以必定的代價轉到了linux服務器開發。到今天爲止,大體作過股票資訊、交易系統、遊戲服務器、即時通信系統和直播類型的服務器,架構的能力也由最初的千人到後來的百萬在線。我從不後悔我當初轉行服務器開發,甚至很慶幸當初的抉擇,然而我可能更喜歡的仍是客戶端開發。web
《寫給那些傻傻的,想作服務器開發的應屆生》一文中的有些觀點,根據個人經歷,我不敢贊同,或者說個人感覺與之截然不同。編程
加班的狀況
首先說下加班的狀況,無論是大公司仍是小公司,因爲如今的各類測試、預警機制、監控策略和公司發佈流程的不斷完善,一個月內常常爲各類服務器bug、和應急的狀況加班的現狀已經大爲改善很多,固然偶爾發版或者趕項目加班仍是有的,不過一個月的頻率也就那麼一兩次。若是大家團隊頻繁地爲了修正緊急bug、解決服務器穩定性問題,那麼大家真要好好考慮大家的方法是否是有問題了。服務器
服務器開發與輪子
其次,服務器開發,不只僅如文中所說的,利用或者組裝各類輪子。一個穩定的服務器架構,必須是創建在設計師良好的基礎知識和見多識廣的經驗基礎上,即便是使用現有的輪子,也是對這個輪子足夠熟悉的基礎上,才能讓輪子最大地適用本身的公司的業務。也就是說,服務器核心項目人員雖然不必定要造輪子,但必定要具有造輪子的能力。開源的東西好用是好用,可是要麼不出問題,一旦出問題每每很難修改。咱們去年作相似「衝頂大會」、「百萬英雄」這類直播答題應用,因爲這類遊戲是從美國HQ刮過來的風,國內各大公司爲了迅速搶佔市場與用戶,都想着要比別人早點作出來上線,因此咱們公司當時deadline壓得比較緊。咱們那個時候,最不想看到的人就是項目經理,每天跟着咱們後面催項目的進度。項目進度緊不說,另外還有一個技術挑戰,因爲節目比較火熱,同一個房間裏面可能會達到百萬人同時在線,而這百萬人可能同時都會發彈幕消息。假設某個時刻,房間裏面有n我的,某我的發一條消息,其餘n-1我的收到,服務器須要推送n-1次。若是n我的同時發消息,那麼服務器同一時間就要推送n*n,若是n等於1百萬的時候,那麼單秒的數據量將很是恐怖,這個是咱們須要解決的一個技術難題,解決目標是最少延遲的狀況下,彈幕最多的送達率;另一個難題就是,保證出題和答案不能有太多的延時(小於1秒),並在用戶給出答案後,服務器可以迅速統計出答案結果並應答客戶端。(沒辦法,因此此時主持人的做用就發揮了,萬一延遲太厲害,主持人能夠和觀衆各類嘮嗑,固然這是下下策,若是頻繁出現這種狀況,領導的臉色確定也很差看,咱們作技術的臉上也沒有光彩。)那段時間基本上是週六週日都要加班,甚至連週末均可能要到凌晨才能回去。注意:我把這段經歷並無放在上面的關於服務器開發是否頻繁地加班的欄目下,這裏我想說明的並非服務器開發要常常加班,我想說的是,若是你日常只會用輪子,而不注重基礎內功的修養,這種場景你是很難應對的,首先是單機服務性能要作到極致,其次是多個服務之間的高效配合。不少人可能以爲這種場景也不難,甚至有的人號稱單機服務就能解決,這些都是站着說話不腰疼了。像熊貓tv的「衝頂大會」和西瓜視頻的「百萬英雄」前幾回的答題活動中,也出現了服務中斷或者題目延遲厲害,甚至「百萬英雄」還出現過一次因技術問題答題活動被迫延期的事故。微信
技術與產品思惟
接着說下,技術和產品方面的,服務器開發與客戶端開發的思惟方式和理念實際上是不同的,若是說客戶端產品是一個產品的臉面,那麼服務器端就是產品的靈魂。這裏可能比喻有點不恰當,與客戶端開發相比,優秀的服務器開發應該儘可能在單機服務上的性能作到極致,必須儘可能利用少的資源給儘量多的客戶端服務(在資源總量有限的狀況下,你爲單個客戶端服務使用的資源越少,你纔可能爲越多的客戶服務)。而服務器開發必須有條不紊地處理與每一個客戶端的交互,不能糾結或把資源花費在某一個客戶端上。可是客戶端不同,客戶端只須要管理好本身的一畝三分地就能夠了,並且客戶端的大多數邏輯和細節在界面(UI)邏輯上。可是我不同意文中做者所說的客戶端代碼比服務器代碼少不少,相反,我經歷過的項目,都是客戶度代碼比服務器代碼多不少。由於客戶端代碼每每有大量的界面邏輯,若是服務器端沒有UI的話,其核心除了網路通訊部分,剩下的就是各類業務邏輯(包括存儲邏輯,也就是業務邏輯服務器和客戶端都有,可是客戶端還有界面邏輯)。而從開發團隊的人數配比上來講,通常單個端(好比pc、安卓、ios中的一端)的人數要小於服務器開發人員的數量,由於通常一個高級客戶端開發,每每能夠一我的搞定一個客戶端,可是通常不多有一個高級服務器開發能夠單獨搞定一套服務開發的。(說的是一般情形,請不要走極端)。服務器開發的核心字眼體如今「服務」上,如何爲客戶端提供穩定的、高效的服務,這是關鍵的地方。這裏「穩定」也包括容災容錯。大凡是有必定規模的用戶羣體的產品,若是服務器不穩定,那後果將是災難性的,試想QQ或者微信服務器中斷一兩個小時,後果會怎樣?而客戶端更側重的就是產品的細節、用戶的體驗,固然儘管有些用戶體驗多是由服務器端決定的,可是最終仍是由客戶端反映出來。我不贊同文章中說,客戶端更能積累除了技術之外的其餘知識,服務器開發也同樣的,無論是客戶端仍是服務器,只有具備產品思惟的開發纔是好的開發,而功能的設計與規劃服務器端的開發在時間點上通常先於客戶端開發的。而具體的功能點,也是須要服務器開發人員與產品人員乃至客戶溝通的。架構
薪資方面
最後說下,薪資方面。通常大於兩年且一樣的工做年限的服務器開發人員要比客戶端開發人員高至少三分之一左右。固然不排除一些很是優秀的客戶端開發人員可能不在這個規則內。併發
結語
總結起來,選擇了哪條路就選擇了什麼樣的生活。作服務器開發的能夠在高併發、高可用方向進一步努力,而作客戶端開發能夠在用戶體驗、設計細節方面下功夫。無論怎樣,都是咱們想要的生活,那裏傾灑了咱們的汗水,也收穫了咱們本身的成就感。高併發
歡迎關注公衆號『easyserverdev』。若是有任何技術或者職業方面的問題須要我提供幫助,可經過這個公衆號與我取得聯繫,此公衆號不只分享高性能服務器開發經驗和故事,同時也免費爲廣大技術朋友提供技術答疑和職業解惑,您有任何問題均可以在微信公衆號直接留言,我會盡快回復您。性能