支付寶研究員 李俊奎
校招進(jìn)入支付寶,11年時間,從一線工程師成長為支付寶安全核心架構(gòu)師,這個技術(shù)牛人就是李俊奎。
李俊奎一直聚焦風(fēng)控平臺的技術(shù)和架構(gòu)發(fā)展,并著手搭建了中國第一家云上的商業(yè)銀行——網(wǎng)商銀行。
在2016年雙11和新春紅包等活動中,李俊奎和他的團(tuán)隊(duì)實(shí)現(xiàn)歷史性突破,即在系統(tǒng)不被降級的壓力下,控制資源消耗不超過2015財年雙11,并且很好地滿足了業(yè)務(wù)需求。
同時,李俊奎率領(lǐng)團(tuán)隊(duì)實(shí)現(xiàn)了風(fēng)控系統(tǒng)的異地多活,打造出新一代的風(fēng)控體系。支付寶創(chuàng)立之初即提出“敢付敢賠”的口號,其背后的支撐就是由李俊奎及其團(tuán)隊(duì)負(fù)責(zé)建設(shè)的實(shí)時風(fēng)控平臺。
李俊奎樂于知識分享,經(jīng)常在工作中對其他同學(xué)進(jìn)行輔導(dǎo),深受一線工程師的尊重和認(rèn)可,被大家尊稱為“向爺”(花名:向秀)。
不久前,在支付寶 BASIC College以代碼為主題的分享活動中,李俊奎回顧了自己與代碼是如何結(jié)緣的,并對程序員職業(yè)發(fā)展談了談自己的想法。
給初入行程序員的建議
從在校學(xué)生到初入職場,首先是要過三關(guān),很重要的一關(guān)就是在工作的第一天或頭幾天,就要接觸到代碼,因?yàn)橹挥薪佑|到代碼心里才感覺是有點(diǎn)踏實(shí)的。
我加入公司的時候,還是相對比較簡單的,不像現(xiàn)在代碼量,公司體量已經(jīng)很大了,不管是系統(tǒng)數(shù)還是代碼數(shù)以及變更的數(shù)量都是很大的。08年的時候阿璽(螞蟻金服副CTO)帶著我們一起搭全站的系統(tǒng)環(huán)境,當(dāng)時是50多個,基本上三個人,花一上午就能夠把整個支付寶所有的環(huán)境搭起來。
剛剛加入公司的時候會有一段強(qiáng)烈的新鮮感時光,是來源于我們總覺得代碼其實(shí)是最重要的。我現(xiàn)在也會和很多的新同學(xué)說,新人同學(xué)進(jìn)來首先是要過三關(guān),很重要的一關(guān)就是希望他在工作的第一天,就是要接觸到到代碼(如果是技術(shù)同學(xué)),能看到代碼,最好能寫代碼,因?yàn)橹挥薪佑|到代碼心里才感覺有點(diǎn)踏實(shí)的。
比如說你工作了幾天,代碼沒看到或系統(tǒng)也不知道,這個時候心里是不踏實(shí)的,不知道自己在干嘛,會有點(diǎn)失落。
我入職后的一兩個月都是覺得支付寶代碼也還好,數(shù)量還可以,但是后來就發(fā)現(xiàn)我只看到了冰山的一角。
在項(xiàng)目中成長,從我個人的經(jīng)歷來看也是這樣的,項(xiàng)目在你修煉自己的代碼的這種能力里面是非常重要的。
今天最想要講的就是項(xiàng)目中成長,我跟代碼結(jié)緣以來最主要的經(jīng)歷就是在項(xiàng)目中的成長。
1.要寫代碼先看代碼
支付寶的代碼分成三類:第一類代碼是寫得很好的,這個好跟不好其實(shí)是有非常重要的一個評價,就是你能否可以快速了解它,覺得它賞心悅目并且能夠快速地抓住它主要設(shè)計的精髓。
我覺得這種代碼是好的代碼。這一類代碼,很多就是在什么地方呢?
第一個就是在一些公共的庫,第二個是一些所謂的核心的系統(tǒng)。
我很長一段時間,一部分是自己參加一些項(xiàng)目,第二部分就是看代碼。
我認(rèn)為Code Review其實(shí)很多情況下并不是提交了代碼然后讓人來Code Review,這是一個過程。我認(rèn)為的Code Review更多的是“看代碼”,代碼有好的也有壞的。
好的就是我剛才說的一些比較核心的系統(tǒng),比較重要的庫,這些代碼能看到很多一些設(shè)計,很多的原理。新同學(xué)多看一些代碼,這對于其了解全貌很有益處。
2.考古
很多同學(xué)可能接觸到一些別人推送過來的系統(tǒng),交接過來的系統(tǒng),會發(fā)現(xiàn)文檔不一定是最好的,很多情況下就需要考古。我也考了很多的古,做每個項(xiàng)目之前很大一個工作其實(shí)就是要了解過往的系統(tǒng)到底是怎么運(yùn)作的,或者說整個鏈路是怎么運(yùn)作的,這個時候就需要去考古了。
不能說看一些PPT上面的東西就能把這個方案能夠做得非常細(xì)致,非常典型的是一些拆分類的項(xiàng)目或者移交過來的比較大的系統(tǒng)。這個時候你只能去看PPT那個層面,當(dāng)然這是一個惡習(xí),PPT畫得高大上無比,真正到代碼上就各種坑,各種不注意的細(xì)節(jié)。
考古我覺得是非常重要也是非常有必要的。只有把代碼基本上能夠粗略的看全,然后才真正能夠通過代碼大概了解它的運(yùn)作方式,這是非常重要的。
3.不斷磨煉
第三類代碼就是說代碼跟配置其實(shí)很多情況下是分離的,這種情況下出問題可能會比較大。
我的例子就是當(dāng)時我是在做前臺業(yè)務(wù),交易核心是最重要的系統(tǒng)的服務(wù)。交易其實(shí)代碼跟它的配置是分離的,交易的代碼,如果不知道它下一步往哪里走的,就只能把代碼跟配置一起來看,甚至要調(diào)試。
這個時候,通過運(yùn)行它的配置的代碼,在整個運(yùn)行中看它的過程,而不是只看JAVA的代碼,實(shí)際上這個配置代表一些很重要的邏輯在里面,現(xiàn)在這樣的情況越來越多。我理解現(xiàn)在是比以前更加的難,或者說范圍更加的廣。
第三類代碼就是不斷地去做這樣的一個磨煉,我的理解就是自己在項(xiàng)目中做這種磨煉。
關(guān)于磨練,我這里有幾個例子是自己經(jīng)歷過的。
看書
不知道大家現(xiàn)在還看不看書?我當(dāng)然是指不是看《故事會》《小人書》,而是看一些設(shè)計的書或者別人代碼的這些書,我以前參加項(xiàng)目的過程中,其實(shí)忙里偷閑還是要去看一些書,我看魯肅(螞蟻金服CTO)也是這樣的習(xí)慣,經(jīng)??吹紧斆C拿了一堆的書自己在那里狂啃,這個確實(shí)是一個比較好的習(xí)慣。我自己的經(jīng)驗(yàn)是,看書的過程中可以使大家開闊思路。
單元測試
第二個我剛才說會看代碼,其實(shí)還有一部分看單元測試。當(dāng)然現(xiàn)在是在強(qiáng)制做,有覆蓋率的要求,單元測試是非常重要的一個環(huán)節(jié)。單元測試是相對非常小的一段,它能做一些測試、模擬,甚至說做一些演示的工作。
如果大家一味地看注釋,注釋不一定是準(zhǔn)確的,有的注釋寫得好,有的注釋寫得差,但是實(shí)際上單元測試如果它有一定的覆蓋率的話,其實(shí)在哪些邏輯不清楚的情況下,看或者寫一些單元測試對于理解系統(tǒng)運(yùn)行也是非常重要的。
設(shè)計的經(jīng)驗(yàn)
比如SOFA框架(分布式中間件),我對新同學(xué)說,如果在試用期或?qū)嵙?xí)期,能夠把SOFA框架的整體的原理圖能夠搞清楚,它的一個依賴關(guān)系的那張圖能搞清楚,那么就抓住了SOFA的精髓。然后再去看支付寶主要的系統(tǒng)的代碼,就有據(jù)可依,這就是設(shè)計的一個好處。SOFA的框架相當(dāng)于龍骨,能看懂就會知道主要的一些代碼,核心代碼是寫在哪里的,一些主要的邏輯放在哪里的,這個很重要。
設(shè)計的第一塊是向框架去學(xué)習(xí),第二塊其實(shí)就是向他人去學(xué)習(xí)。我經(jīng)常看項(xiàng)目組其他同學(xué)的代碼,看優(yōu)秀的代碼還會做一些總結(jié)。
在項(xiàng)目中成長,對工程師來說是非常重要的。從我個人的經(jīng)歷來看也是這樣的,項(xiàng)目在自己修煉代碼能力方面是非常重要的,大概占了百分之七八十。
最后,是我給大家的一些建議。
1.多看代碼,無論好壞,保持代碼敏感度。
代碼方面,我認(rèn)為首先要看代碼,多看代碼,因?yàn)闊o論如何要保持自己對代碼的敏感。大家可能經(jīng)常自己吐槽是一個碼農(nóng),天天不管需求在哪里,只管代碼碼哪里,這個肯定不是最好的方式。好代碼跟壞代碼是有本質(zhì)的差距,好代碼是體現(xiàn)了人的思想,體現(xiàn)人的設(shè)計。壞代碼,為什么看壞代碼?某種原因也是給大家一個警示,這個我們要避免。
2.寫代碼,多做總結(jié),一次比一次好。
除了經(jīng)??磩e人寫的好代碼或者考古別人的代碼,我也會經(jīng)常回過去看以前自己寫的代碼。看的時候就想,這個代碼,為什么覺得寫得好?為什么它那個地方是有一些問題的。
我相信不是所有的代碼都是好的,自己寫的代碼也不一定所有都是好的。但是自己給自己是有個評判,有的時候去看,這個地方做一下更多的抽象,或者更多地提取一些公共的一些東西,這個是非常重要的。
多做總結(jié)其實(shí)是為了讓自己一次比一次寫得少,一次比一次好,能夠避免以前的一些坑,或者說能夠避免以前的一些錯誤,這個就是一個進(jìn)步。
3.寫代碼前,一些設(shè)計很重要。
寫代碼有很多種,有的是直接完全按照需求實(shí)現(xiàn),按邏輯實(shí)現(xiàn)。但我想即使這樣,如果大家要提高自己的代碼的能力或者代碼的意識,一些設(shè)計特別重要。這個設(shè)計不是要去整設(shè)計模式,整高大上的框架。很多情況下是能夠通過一些代碼,能夠把一些這種共性的東西做一些寫法的不一樣,可能都是很好的設(shè)計。但是如果只是純粹的把邏輯實(shí)現(xiàn),或者說就按照這個邏輯去這樣做,有的時候并不一定是最好的。
4.養(yǎng)成看書的習(xí)慣。
現(xiàn)在是時間碎片化非常嚴(yán)重的時代,獲取知識的渠道非常多,但是有一些經(jīng)典的書或者體系化的書,建議還是要去多看。養(yǎng)成看書的習(xí)慣,那么獲取的知識會比你看比如今日頭條或者一些網(wǎng)頁還是要來得更加的體系化。
【END】