后臺(tái)開發(fā)程序員的進(jìn)階之路!來自騰訊IEG工程師分享
作者:jiantang,騰訊IEG后臺(tái)開發(fā)工程師

1.??后臺(tái)開發(fā)涉及的范圍
簡單地說,后臺(tái)開發(fā)涉及的層面主要包括:?網(wǎng)絡(luò)、數(shù)據(jù)、業(yè)務(wù)邏輯、運(yùn)維4個(gè)方面。如果擴(kuò)展和延伸的話,可以分為以下幾類:
(1)網(wǎng)絡(luò)-分布式系統(tǒng)-并行計(jì)算
(2)業(yè)務(wù)邏輯-WEB-游戲-交易-搜索
(3)數(shù)據(jù)-CACHE-DB-KeyValue-文件存儲(chǔ)服務(wù)
(4)運(yùn)維-負(fù)載均衡-容錯(cuò)-容災(zāi)-運(yùn)維工具??
不同類型的業(yè)務(wù)對(duì)以上4點(diǎn)的要求是不同的,?簡單總結(jié)了一下公司已有服務(wù)器的一些偏重點(diǎn):

應(yīng)該說每個(gè)成功的業(yè)務(wù)服務(wù)器,都有各種的特點(diǎn),高明的程序員或設(shè)計(jì)師,能夠根據(jù)不同的業(yè)務(wù)特點(diǎn),選擇合適的架構(gòu)、人力和資源,投入到自己業(yè)務(wù)最核心和最關(guān)鍵的功能點(diǎn)或模塊上。

2. 后臺(tái)開發(fā)的特點(diǎn)
a. 后臺(tái)開發(fā)相對(duì)穩(wěn)定
我們知道,在用戶界面和表現(xiàn)這一塊,變化是非??斓?。用戶總是喜歡新鮮的,更好的表現(xiàn)。各大公司在這塊的競爭也非常多,總想把用戶捆綁到自己的平臺(tái)上來。各種第三方的組件、引擎都層出不窮。
例如微軟就不停地發(fā)布各種API和各種開發(fā)語言。蘋果興起后,直接把一個(gè)不出名的Objective-C提升到了排行榜的第三名。

由于后臺(tái)開發(fā)基本不涉及表現(xiàn)層,主要處理的是網(wǎng)絡(luò)、數(shù)據(jù)和消息等。受“流行”和“時(shí)尚”的沖擊比較小。無論是windows也好,MAC也好,IOS、Android,對(duì)后臺(tái)架構(gòu)的影響都不大。開發(fā)語言也比較穩(wěn)定,主流的就是C/C++。
b.????穩(wěn)定性是首要保證的
后臺(tái)服務(wù)程序是為多人同時(shí)在線服務(wù)的,因此對(duì)其可靠性的要求特別高。相對(duì)客戶端程序而言,如果一個(gè)進(jìn)程或一臺(tái)機(jī)器倒掉,客戶端僅僅影響的是一個(gè)用戶的體驗(yàn)。
而對(duì)于服務(wù)器來說,就有可能是上千人的體驗(yàn),甚至是如果不幸地是關(guān)鍵節(jié)點(diǎn)出現(xiàn)問題,將是整個(gè)服務(wù)的不可用。游戲界因?yàn)榉?wù)器的原因失敗的例子實(shí)在太多。
作為一個(gè)程序員而言,往往會(huì)有性能情結(jié),總是希望用最少的服務(wù)器來支持更多的人數(shù)。這里不是說性能不重要,而是要根據(jù)不同的場合去區(qū)分。
例如:逆戰(zhàn)的游戲服務(wù)器,如果不考慮性能問題,那么一臺(tái)C1服務(wù)器就只能支撐200-300人,甚至對(duì)于復(fù)雜的PVE模式來說,就只能支持不到100人,單單服務(wù)器成本就會(huì)把項(xiàng)目拖垮。
對(duì)于御龍?jiān)谔靵碚f,如果不解決千人同屏?xí)r的系統(tǒng)廣播壓力,和競爭對(duì)手相比的一個(gè)重要賣點(diǎn)就完全喪失。對(duì)于某些預(yù)期壓力不大,或者可以通過簡單擴(kuò)容來解決的問題,在初期時(shí)就不應(yīng)該去死摳服務(wù)器的一點(diǎn)點(diǎn)性能,應(yīng)該精力放到穩(wěn)定性和可擴(kuò)展性上,等有需要的時(shí)候再來解決性能問題。
而對(duì)于關(guān)系到系統(tǒng)基礎(chǔ)和核心體驗(yàn)的性能問題,那它的優(yōu)先級(jí)就是第一位的。當(dāng)然,也可能存在某個(gè)服務(wù),隨著用戶喜好或業(yè)務(wù)發(fā)展,從不起眼變得十分重要。這時(shí),它的性能和穩(wěn)定性都會(huì)變得十分重要。
公司的海量數(shù)據(jù)的系列課程中,有個(gè)比較著名的短語:“先抗住,再優(yōu)化”,也表達(dá)了類似的意思。先要保證系統(tǒng)穩(wěn)定可用,否則,初期用戶就已經(jīng)流失了,后面就再也沒有優(yōu)化的機(jī)會(huì)了。
當(dāng)然,如果我們?cè)谠O(shè)計(jì)之初,就把系統(tǒng)的關(guān)鍵路徑的穩(wěn)定性考慮地比較充分;那么隨著業(yè)務(wù)的逐步發(fā)展,優(yōu)化將是有序和可控的。?

c.?????突發(fā)事件的沖擊
服務(wù)器還面臨著在特定時(shí)間內(nèi)的特定活動(dòng),用戶訪問數(shù)量增加,引起雪崩的問題。從前些年的短信拜年,到雙12大促,12306搶票,春節(jié)的微信紅包等活動(dòng)。短短時(shí)間內(nèi)的訪問峰值是平時(shí)的100倍甚至上千倍。
一旦并發(fā)數(shù)量上去后,平時(shí)系統(tǒng)中所隱含的錯(cuò)誤、考慮不周和極限情況等,通通都會(huì)冒出來。我甚至還遇到過在沖線的關(guān)鍵時(shí)刻,有臺(tái)比較重要的服務(wù)器宕機(jī)的事件。
服務(wù)器的業(yè)績有很重要的一部分是在峰值期間能夠提供正常服務(wù)。所有我們很多時(shí)候的工作就是為了那幾個(gè)小時(shí)的“巔峰時(shí)刻”。

3.??后臺(tái)開發(fā)需要長期積累
學(xué)校的計(jì)算機(jī)理論教育和實(shí)際操作中需要運(yùn)用到的技術(shù)點(diǎn),是會(huì)有些出入的。因此,很多人?畢業(yè)后到工作單位最開始的工作就是在“補(bǔ)課”。
例如C/C++的開發(fā)和調(diào)試,腳本語音的學(xué)習(xí),linux操作系統(tǒng)的熟悉,簡單DB的操作與分析、補(bǔ)充硬件相關(guān)知識(shí)等。工作的重點(diǎn)也主要是數(shù)據(jù)統(tǒng)計(jì)、運(yùn)維腳本的編寫、小功能小需求的開發(fā)。一切順利的話,基本能承擔(dān)一個(gè)獨(dú)立模塊的開發(fā),兩年已經(jīng)過去了。
大概做個(gè)一年的獨(dú)立模塊開發(fā),經(jīng)歷過基本架構(gòu)設(shè)計(jì)、和策劃討價(jià)還價(jià)、上線的不穩(wěn)定、用戶訪問突然增長、服務(wù)器宕機(jī)、配置文件錯(cuò)誤等的磨練后,終于對(duì)在線系統(tǒng)的開發(fā)有了比較深的認(rèn)識(shí)。
這時(shí)候,大概可以升級(jí)到公司的T8-T9。經(jīng)過最少3年的努力,后臺(tái)開發(fā)可以入門了。后期就需要通過時(shí)間和項(xiàng)目進(jìn)行逐步的積累。
服務(wù)器的經(jīng)驗(yàn)累積,包括想法,架構(gòu)和代碼設(shè)計(jì)都需要通過實(shí)際的驗(yàn)證才能獲得證明。線上的情況總是會(huì)出乎我們的意料。往往考慮很周詳?shù)姆桨嘎淞丝?;而用戶總是在意想不到的地方出招?/p>
俗話說,沒吃過豬肉,總見過豬跑吧。但后臺(tái)的積累需要我們?nèi)コ载i肉,而不是僅僅看看豬跑。
機(jī)遇也是另一重要的因素,如果用戶PCU就一直徘徊在10,20萬,那就一直不會(huì)有100w在線的經(jīng)驗(yàn)。在用戶數(shù)逐步增長的過程中,會(huì)出現(xiàn)各種各樣的問題,逐個(gè)去解決問題的過程,就是經(jīng)驗(yàn)逐步積累和升華的過程。當(dāng)然,業(yè)務(wù)能夠發(fā)展的到什么程度,這個(gè)就需要看大家的選擇和運(yùn)氣了。

4.??不能忽視運(yùn)維
一般來說,作為一個(gè)后臺(tái)程序員在初期的時(shí)候往往會(huì)對(duì)網(wǎng)絡(luò)、業(yè)務(wù)邏輯和數(shù)據(jù)這三部分比較關(guān)心。運(yùn)維嘛,反正有運(yùn)維的同時(shí),網(wǎng)絡(luò)、機(jī)器和配置等事情,他們來搞定吧。
如果抱著這樣想法的同學(xué),那就等著不停在在半夜2,3點(diǎn)被宕機(jī)電話騷擾;在陪家人的時(shí)候,被召回公司加班;程序配錯(cuò),各種指責(zé)降臨;績效考核時(shí),程序不穩(wěn)定,年終獎(jiǎng)不佳…
大家在寫代碼的時(shí)候,有沒有考慮過下面的問題:
我寫的服務(wù)運(yùn)行得正常嗎?怎么樣才能知道它是正常的?
如果運(yùn)行的服務(wù)器宕機(jī)了,服務(wù)怎么樣才能繼續(xù)?
如果網(wǎng)絡(luò)不通了,有沒有備份的鏈路?
策劃如果把配置表填錯(cuò)改怎么辦?
機(jī)器太多,不小心又把對(duì)應(yīng)關(guān)系配錯(cuò)。
運(yùn)維的同學(xué)把電信的服務(wù)器配成了聯(lián)通的IP,外網(wǎng)玩家投訴卡。
除了配置IP的問題外,其余的問題,運(yùn)維的同學(xué)基本都不能幫你搞定。很多事情都有自己考慮和解決。顯然,救世主不存在,系統(tǒng)穩(wěn)定性的責(zé)任主要在項(xiàng)目開發(fā)組上。

5.??主動(dòng)精神是唯一的法寶
前面零零碎碎講著這么多,其實(shí)最終還是要落到一點(diǎn)上:主動(dòng)。
程序功能完成,僅僅只是后臺(tái)開發(fā)20%的工作。后臺(tái)的同學(xué)還應(yīng)該主動(dòng)關(guān)心自己的程序?qū)嶋H運(yùn)行的情況怎么樣,日志有沒有報(bào)異常,是不是有瓶頸和處理不周到的地方。
密切注意硬件和網(wǎng)絡(luò)異常時(shí),自己程序的表現(xiàn);在策劃提出新功能時(shí),是否對(duì)現(xiàn)有程序有影響,是不是需要預(yù)先做一些微重構(gòu);出現(xiàn)錯(cuò)誤時(shí),不僅僅是解決問題,還應(yīng)考慮怎么避免下次再犯類似的錯(cuò)誤。
這些點(diǎn)點(diǎn)滴滴的積累,不是一蹴而就的,也不是領(lǐng)導(dǎo)對(duì)你的要求。而是需要在工作的過程中不斷地總結(jié)和改進(jìn),甚至有些時(shí)候要一點(diǎn)“自虐”的精神。

以上就是今天全部的分享內(nèi)容,謝謝大家!
另外對(duì)于學(xué)習(xí)編程或者正在工作的朋友,如果你想更好的提升你的編程能力乃至轉(zhuǎn)行,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號(hào):C語言編程學(xué)習(xí)基地
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
