写给那些傻傻的,想做服务器开发的应届生
前言
猿題庫剛剛結束了北京地區的大規模校園招聘,國慶之后打算轉戰外地進行校招。我本人深度參與了此次的校招工作,包括筆試題命題、面試題命題以及具體的面試工作。
我在面試中發現了一個非常有意思的現象,就是大多數應屆生都想做服務器端開發,但是他們卻又不清楚服務器端開發具體要做些什么。
我和同事聊天的時候說起此事,我們認為可能應屆生覺得:做服務器端開發可以讓自己寫的程序運行在很多臺機器上,并且處理海量的數據,這很「牛逼」。而做客戶端或前端開發太簡單,成長會比較小。
于是我就寫了本文,想給這些單純的應屆生潑潑冷水。先說說我的背景吧,我同時做過服務器端和客戶端的開發。我在網易有道做過 1 年半的服務器端開發,產品涉及網易郵箱和微博產品,之后做了 3 年的 iOS 開發,產品涉及有道云筆記,猿題庫和小猿搜題,所以我能夠給大家分享服務器端和客戶端開發的差別。
對服務器開發的誤解
很多應屆生認為做服務器端開發可以處理海量數據,管理上百臺服務器。
但是 ——
處理海量數據就牛逼了?NO!
服務器端開發經過多年的發展,對于海量數據的處理早有了很多固定的解決方案。不管是用云服務,還是用 Hbase ,你都可以很輕松地依賴開源庫,解決海量數據的存儲問題。
還有一些同學想做大數據分析,如果你寫過 MapReduce 程序就不會這么想了。現在的 MapReduce 程序寫起來太 easy 了,很多時候簡單到你就只需要寫一條類似 SQL 的查詢就行了。
運行在上百臺服務器上就牛逼了?NO!
現在虛擬化技術發展迅猛,像小猿搜題所有服務都通過 Docker 來部署。很多時候,部署上線就是在 Web 管理界面上點擊一個「Deploy」按鈕即可。即使在過去,實際操作這些上百臺服務器的也是運維同學,輪不到你來操作。
所以,除了 YY 一下這些程序跑在多個機器上,這并沒有什么可以帶來成就感的地方。
還有一些應屆生覺得自己在學校做過網站,覺得在服務器開發方面有基礎,做這方面更順手。NO!企業里面的服務器開發完全不是你想的那樣,基本上大家在學校做網站的經驗等于零。
服務器開發的苦
我給大家分享一下做服務器開發有什么苦的地方吧。
永遠只能半夜上線
做為互聯網公司,我們希望給用戶提供 7 x 24 的不間斷服務,那么服務萬一需要中斷怎么辦?半夜上線唄。
根據我多年的觀察,晚上 12 點一般都是上網高峰,所以上線一般都是凌晨 3 點-4 點的時候進行。但是,你以為上線就是凌晨 3 點點一下「Deploy」按鈕就完了嗎?NO! 一般上線都會涉及功能升級,難免會有考慮不周到的情況,于是就會發生,上線出問題的情況。
上線出問題怎么辦?在網易,我們一般是兩種做法:
當然,不會每次上線都是這種大升級,但是基本上,1、2 個月搞一次這種大上線還是挺常見的。
相對來說,客戶端同學在這方面要輕松得多。iOS 和 Android 都是提交應用市場審核,所以客戶端的同學可以選一個白天上班的時候提交審核,而不用等到半夜。
永遠需要立即響應
服務器端的問題,只要出現,影響都是巨大的,所以服務器端的同學需要隨時待命,一旦有服務器異常報警,就立即處理,以免影響到用戶。所以做服務器開發的同學手機都是開著的,在服務不穩定時,一不小心,幾十條報警短信就過來了。服務器開發出去旅游什么的,一般都帶著筆記本,以便出問題時能夠及時響應。
相對來說,客戶端同學在這方面要輕松得多,因為即使出現了 Bug,iOS 和 Android 客戶端也是無法馬上修復的,因為用戶手機中的版本不會立即更新。所以客戶端同學最多也是加班發布一個緊急版本提交審核,在時間上不會像服務器端那么著急。
另一方面,很多客戶端的 Bug,可以通過服務器端通過一些「兼容」來處理,這其實就是替客戶端「擦屁股」。例如,假設某應用的 iOS 1.2.0 版本當獲得服務器端返回的用戶頭象是 png 格式的時候會閃退,那么服務器端可以特殊處理,對于這個版本的應用把 png 圖片轉成 jpg 返回。你看,最終還是服務器端同事成了要立即響應的人。
服務器端輪子太多
服務器端的開發經過了 10 多年的發展,而客戶端的開發才剛剛興起。2009 年?iPhone 3GS?推出之后,國內才有人做 iOS App 的開發,Android 開發的興起也基本在同一時期。算下來,客戶端的開發才經歷了 6 年而已。而服務器端的開發呢?光?Spring?就出現了 10 多年了。
服務器端的技術長久發展的結果就是,基本上每個業務需求都已經有現成的輪子了。所以做服務器端開發很多時候就是學習各種開源組件的用法,并且熟悉這些組件的一些性能特點和坑。
你以為這很容易嗎?其實不是的!這些輪子發展那么多年,已經非常復雜了,光 Spring 就包括非常多的特性,寫一本 1000 頁的書來介紹它也不為過。如果不是多年的使用,你能搞明白它的各種功能的優缺點嗎?如果你搞不明白,遇到問題的時候除了抓瞎還能干嘛?
所以做服務器端的同學,要經過非常長時間學習(至少半年左右),才能上手進行實際的開發工作。上手之后,又需要經過非常長時間的學習,才能夠熟悉自己使用的各種開源組件的特點和使用細節。
相對來說,客戶端同學在這方面要輕松得多,基本上不管是 iOS 還是 Android,新手只需要一個月左右就能入門,三個月左右就能夠比較熟練了。
分工與細化
剛剛說到服務器端復雜,這帶來的結果就是分工與細化。每個做服務器開發的同學,可能只會涉及服務器開發的某一部分的業務邏輯和功能,甚至是某一部分業務邏輯的某一層。比如我在網易郵箱做服務器端開發時,就只是負責 Restful Api 這一層的開發工作。
從業務上來說,將復雜的系統拆分,然后每個人做獨立的某一塊當然是好的。但是對個人來說,服務器端開發卻使終是一塊迷霧環繞的大山,在這座大山上,你對你走過的路線很熟悉,而那些你沒有接觸過的服務器端技術,你使終是不清楚的。
對于一個服務器端開發同學,特別是進入大公司的應屆生來說,在他頭幾年的工作中,肯定只會圍繞著非常小一塊功能業務來學習,那么一兩年之后,他頂多是熟悉了他工作涉及的那些東西,對于別的東西仍然是不清楚的。
從這一點來說,去創業型的公司做服務器端開發又要比去大公司要好得多。
相對來說,客戶端同學在這方面要爽得多。因為移動開發技術剛剛興起,很多技術方案和框架還沒有復雜到無法全面掌握的程度。移動開發技術就像一棵快速成長的小樹,客戶端同學將有幸伴隨著它一起成長,等 5 年之后,移動開發技術成變成一棵參天大樹,這一代的程序員,將會是唯一親身經歷它演進的人,每一處演進帶來的改變,都將使得我們更加深刻理解移動開發系統的設計原則。
眼界和非技術成長
某種程度上說,服務器端開發在業務方面是輕松的,因為他們只需要設計好 API 接口,返回 JSON 數據,不用考慮 UI 的設計,交互細節的處理。服務器端開發經過了多年的發展,單元測試和性能測試框架也非常成熟,所以開發起來非常有章法。
所以服務器端的同學大多數時候只需要關注純技術的知識,例如如何保證高可用,高擴展性,高并發,數據一致性,數據安全等。
客戶端就苦了,UI 需要和美術設計得完全一樣,交互細節還需要做到流暢,很多時候產品用一用覺得一些 UI 和交互有問題,我們還需要被迫接受調整。另外在測試上,因為和界面耦合太緊,雖然業界有一些解決方案,但基本上不管是 iOS 和 Android 都還沒有非常成熟好用的單元測試框架。大部分的測試工作都是由黑盒的手工測試完成的。
但是,正因為客戶端需要密切和產品經理,UI 設計師打交道,所以他們會頻繁接觸到產品設計思想和設計思想。這使得客戶端的同學更加容易學習和積累編程之外的技能,包括產品和設計的思想以及溝通能力。另外,因為用戶的 bug 都是通過客戶端反饋,客戶端同學還更容易接觸到真實的用戶。
所以相對于服務器端同學來說,客戶端的同學的眼界更寬,由于非技術方面的溝通更多,所以他們的非技術方案的成長也越多。
技術挑戰和工資待遇
從純技術上的挑戰來說,服務器端明顯更大。服務器端開發動輒超過 10 人的團隊,代碼量稍微復雜一些就是接近百萬行。而客戶端一個平臺的研發大多數也就在 5 人左右,代碼量多在 10 萬行以內。
但是,技術挑戰大就表示工資待遇高嗎?NO!市場價格是由供求關系來平衡的。雖然客戶端的技術挑戰小,但是基本上所有應屆畢業生都想做服務器端開發,所以沒有人做客戶端開發呀!于是很多公司被迫從培訓機構招人,很多人剛剛培訓了 3 個月,就可以拿非常高的工資。這一點和 Web 前端類似,牛逼的 Web 前端人才非常少,但是不影響這個領域稍微牛逼一點的人拿非常高的薪水。
另一方面,由于服務器端人才的飽和,也使得競爭變得非常激烈,除非你成為這個領域的頂級人才,否則從平均薪資來說,做客戶端開發的同學應該和服務器端的同學類似。
總結
其實我這篇文章故意寫得很片面,目的就是想讓各位應屆生同學們能夠更加辯證地看待互聯網行業中的工作。與其什么都不懂傻傻地選擇服務器端開發,倒不如做客戶端開發更有前途。
我以上所說的,都是錯的。
【 在 bswgd 的大作中提到: 】
: 很誠懇的文章,
: 唐巧從Java后臺開發轉iOS開發估計讓他現在連做夢都覺得英明。身價起碼爆漲了三四倍以上吧。
: 供需關系才是硬道理。
: ...................
贊同!
決定工資水平的不是技術能力,而是市場人才需求。
市場最需要的,也就是最有錢途的;但同時市場對人才的需求也在變化,會不斷的有新的行業熱點爆出來,舊有的也會死去。
像App客戶端開發,無論是安卓還是iOS,也就是最近五年才開始火。前面,還有諾基亞的塞班,intel的meego,現在已經死去。
五年前,大數據還沒有這么火,各種相關工具甚至還沒有出來;現在不管什么公司,都要搞一搞,數據挖掘,推薦系統,日志分析等等,自然這方面的人才需求就出來了。
打好計算機基礎,這些基礎的東西可以幾十年都不變的;找一個小方向好好做,就算行業熱點變化了,也能及時跟上,迅速適應。
客戶端要和ued,產品經理有時候還是運維打交道,我個人客戶端開發,感覺眼界更開闊了,服務端壓根就沒產品經理。。。
我腳的 還是跟部門關系有關吧。。如果你做的后臺足夠關鍵,那么跟你打交道的人那海了去了(自己部門的pm,其他部門的pm,web啊移動端啊 技術,產品,運維,測試,還要跟老大以及老大的老大,尤其是上重要項目的時候,你都的交流)。。如果你做的后臺使用量太少了 機器也少 那就悲劇了。。。so 有時候選擇遠比努力付出重要的多~~不過市場價格跟供需相關這句話 怒贊!!
覺得還是因人而異吧,有的人喜歡跟產品經理打交道,有的人最討厭產品沒完沒了的騷擾。沒有審美的純技術表示,返回json神馬的最好了。。。
照這么說,后臺又累又難待遇又低,什么破玩意啊。。
天朝現在都是做應用的氛圍,文中說大多數人想做后臺,是真的么?為什么和我知道的不一樣。。
做后臺底層的要么被膜拜成神牛,要么被說成是傻叉,醉了。。
是的,我當年非常后悔沒有轉ios開發,有個朋友12年的時候原本工資才六千多學了ios后跳槽了兩次現在都2w了,而且還做了幾個小app賺了幾千塊,然后現在在家小有名氣的創業公司當leader了,而我還買不起房
安卓真心累,尤其被后端掣肘,所以大家都想做后端吧,不過覺得還是做好一個好了,谷歌一定會對安卓做改善的
從技術成長角度講,應屆生做服務端接觸的知識面更廣,無論是底層架構還是數據層面還是和產品打交道,不建議上來就直接做ios,3年以后再考慮轉型
參加2015年的校招,所見所識的確是客戶端的崗位要求比服務端低太多了。服務端涉及的技術體系太龐大了,并且服務端的實踐很大程度依賴與你是否參與一個有用龐大用戶/數據的項目,我實習期間參與的項目都是實驗形的新項目,對業務功能的實現大于對性能的優化,幾乎忽略不計的用戶量讓你很容易遇到瓶頸。
總結
以上是生活随笔為你收集整理的写给那些傻傻的,想做服务器开发的应届生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于python的BMI指数计算器
- 下一篇: Young氏双缝干涉实验近似公式推导的传