當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]走過(guò)的路,回憶起來(lái)是那么曲折,把自己的一些心得體會(huì)分享給程序員兄弟姐妹們,雖然時(shí)代在變化,但是很可能你也會(huì)走我已經(jīng)走過(guò)的10年的路程,有些心得體會(huì)你可以借鑒一下。在某一天的某一個(gè)時(shí)候,突然意識(shí)到,自己已經(jīng)畢業(yè)工作十年了,是該寫(xiě)篇東西,來(lái)記錄下自己的十年,算是給自己一個(gè)心理的慰藉,...



走過(guò)的路,回憶起來(lái)是那么曲折,把自己的一些心得體會(huì)分享給程序員兄弟姐妹們,雖然時(shí)代在變化,但是很可能你也會(huì)走我已經(jīng)走過(guò)的10年的路程,有些心得體會(huì)你可以借鑒一下。

在某一天的某一個(gè)時(shí)候,突然意識(shí)到,自己已經(jīng)畢業(yè)工作十年了,是該寫(xiě)篇東西,來(lái)記錄下自己的十年,算是給自己一個(gè)心理的慰藉,亦算是給自己入職場(chǎng)以來(lái),第一個(gè)十年的總結(jié)。

大學(xué)生活

我是03年上的大學(xué),上大學(xué)之前,完全沒(méi)有接觸過(guò)計(jì)算機(jī)。大學(xué)報(bào)志愿也是懵懵懂懂,那個(gè)時(shí)候,最火的兩個(gè)專業(yè),一是計(jì)算機(jī),一是生物工程。電視上經(jīng)常說(shuō)的已經(jīng)話就是:21世紀(jì),是生物科學(xué)的世紀(jì)。而我呢,因?yàn)闆](méi)有摸過(guò)電腦,所以比較好奇,就在填報(bào)志愿的時(shí)候,寫(xiě)上了對(duì)于現(xiàn)在來(lái)說(shuō)最內(nèi)卷的一個(gè)行業(yè)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)。

于是乎,在9月份的某一天,坐著穿越近半個(gè)中國(guó)的火車(chē),來(lái)到了北方某個(gè)城市,開(kāi)始了所謂的大學(xué)生活?,F(xiàn)在還清楚的記得,第一次上機(jī)課,在機(jī)房打開(kāi)電腦,雙擊點(diǎn)開(kāi)網(wǎng)上鄰居,輸入網(wǎng)址,聽(tīng)的第一首歌,就是劉若英的“很愛(ài)很愛(ài)你”,以至于很多年以后,每次聽(tīng)到這首歌熟悉的旋律,都會(huì)回憶起自己大一的第一次上機(jī)課的情景。

那個(gè)時(shí)候,剛剛脫離了壓抑的高中生活,就像長(zhǎng)了翅膀的鳥(niǎo)兒,自由自在的翱翔在空中,秉持著“六十分萬(wàn)歲,多一分浪費(fèi)”的學(xué)習(xí)心態(tài),得過(guò)且過(guò),基礎(chǔ)課和專業(yè)課都均分通過(guò),也算是沒(méi)留丁點(diǎn)遺憾把。

就這樣,度過(guò)了大一的懵懂,大二的彷徨,大三的沉淪,直至大三下的時(shí)候,才開(kāi)始考慮自己的未來(lái),跟隨自己的內(nèi)心,選擇了考研。

研究生生活

慕名來(lái)到了以學(xué)習(xí)刻苦出名的華東某校,開(kāi)始了自己的內(nèi)卷生活。吃了不少專業(yè)課的苦,也算是對(duì)自己本科期間的一個(gè)懲戒。每天的三點(diǎn)點(diǎn)一線生活,宿舍、食堂、圖書(shū)館,開(kāi)始了自己專業(yè)技術(shù)的學(xué)習(xí)。買(mǎi)的第一步編程方面的書(shū),就是c primer,在圖書(shū)館借閱了c 大學(xué)教程,開(kāi)始學(xué)習(xí)編程,隨著對(duì)專業(yè)書(shū)籍的廣泛接觸,開(kāi)始更加深入的去了解底層原理,c 模型深度探索,effective c ,more effective c ,c 沉思錄等等,好多書(shū)都是在那個(gè)時(shí)候開(kāi)始接觸,也算是給自己后面進(jìn)入本行業(yè),打下了堅(jiān)實(shí)的基礎(chǔ)。

實(shí)習(xí)生活

那個(gè)時(shí)候,對(duì)自己就業(yè)開(kāi)始有了危機(jī)感,周?chē)耐瑢W(xué)都拿到了阿里云、訊飛等公司的實(shí)習(xí)offer。終于,自己在快要崩潰的時(shí)候,拿到了中科院某所的實(shí)習(xí)offer,記得同宿舍哥們的第一句話就是:恭喜你,多年的媳婦熬成婆。

來(lái)到了北京,住在了所里安排的宿舍,跟著mentor做一個(gè)國(guó)家863項(xiàng)目,ddos攻擊相關(guān)的。因?yàn)槭菍?shí)習(xí)生,所以接觸的是一些優(yōu)化類的,比如內(nèi)存池等。

在所里實(shí)習(xí)的同時(shí),自己開(kāi)始接觸csdn網(wǎng)站,除了項(xiàng)目,就是整天泡在c 版塊回答問(wèn)題,當(dāng)初的積分很高,排名也很不錯(cuò),不過(guò)因?yàn)槠渌?,工作后,也不再登錄該論壇了,算是一個(gè)不小的遺憾吧,在里面還是能學(xué)到不少東西,猶記里面有個(gè)技術(shù)很牛的群(音譯 餅子堂),自己有幸也加入了,后面還是退出了。

隨著所里項(xiàng)目的終結(jié),選擇去了另外一個(gè)大外企實(shí)習(xí),該企業(yè)在西二旗(大家應(yīng)該能猜出來(lái)是哪家吧),項(xiàng)目組是做一整套Linux下的辦公系統(tǒng),類似于Windows下的word,基于openoffice來(lái)做的。整個(gè)項(xiàng)目百萬(wàn)行,光編譯就得兩三個(gè)小時(shí),自己在里面負(fù)責(zé)解決內(nèi)存泄漏,在此需要提的是,當(dāng)時(shí)的mentor是個(gè)大牛,基本上整個(gè)公司的難題都會(huì)去找他,使得自己對(duì)技術(shù)的理解更加深入。

初入職場(chǎng)

進(jìn)入傳統(tǒng)行業(yè)

第一家公司,是個(gè)傳統(tǒng)行業(yè),有幸進(jìn)入了公司技術(shù)最厲害的技術(shù)研究院,做網(wǎng)絡(luò)相關(guān)的研發(fā)工作,也就是在這家公司,開(kāi)始了研究TCP,把TCP/IP詳解看了一遍又一遍,不懂的就去查資料,甚至把源碼下載下來(lái)進(jìn)行分析研究。也是在這家公司,第一次接觸Linux系統(tǒng)。

由于公司的業(yè)務(wù)面向的是國(guó)企,主要運(yùn)行在Windows系統(tǒng),第一要求就是穩(wěn)定,所以更新迭代很慢,有時(shí)候一個(gè)功能幾年都沒(méi)進(jìn)行優(yōu)化。后面隨著Linux系統(tǒng)在國(guó)內(nèi)用的越來(lái)越多,部門(mén)的業(yè)務(wù)也需要運(yùn)行在Linux系統(tǒng)上,當(dāng)時(shí)有兩個(gè)選擇,一個(gè)是重新在Linux系統(tǒng)上寫(xiě)一份代碼,一個(gè)就是現(xiàn)有的代碼可以完全移植到Linux系統(tǒng),即同一份代碼可以在Windows和Linux兩大系統(tǒng),最終為了效率,還是選擇了第二種方案。

大家都知道,雖然c 是跨平臺(tái)的語(yǔ)言,但是API名稱,以及底層實(shí)現(xiàn)卻是依賴于系統(tǒng)的,就比如WaitForSingleObject函數(shù),在Linux gcc下就是std::lock,這就要求同一個(gè)函數(shù),比如WaitForSingleObject,在Windows下使用的系統(tǒng)自帶API,而在Linux下是重新開(kāi)發(fā)的一個(gè)函數(shù),其功能與Windows下類似。當(dāng)初這塊是我來(lái)負(fù)責(zé)完成的,第一次出現(xiàn)了coredump,第一次使用gdb進(jìn)行調(diào)試。

入職互聯(lián)網(wǎng)

那幾年,正式互聯(lián)網(wǎng)行業(yè)開(kāi)始火的時(shí)候,自己內(nèi)心也蠢蠢欲動(dòng),于是幾經(jīng)坎坷,進(jìn)入了一家互聯(lián)網(wǎng)行業(yè),也算是自己第一次接觸互聯(lián)網(wǎng)。

剛?cè)肼毜臅r(shí)候,確實(shí)很不習(xí)慣里面的快節(jié)奏,經(jīng)常一個(gè)需求從提出到上線就幾天,這在之前的傳統(tǒng)行業(yè)是萬(wàn)萬(wàn)不可能的,第一次上線就導(dǎo)致線上服務(wù)coredump,飯吃一半就跑上去解決。。。,在這家公司學(xué)到很多,對(duì)業(yè)務(wù)越來(lái)越熟練,開(kāi)始負(fù)責(zé)整個(gè)推薦引擎,為后面接觸廣告奠定了基礎(chǔ)。

接觸廣告

由于公司的業(yè)務(wù)發(fā)展遇到了瓶頸,再加上其他一些原因,又開(kāi)始看機(jī)會(huì)。由于推薦引擎和廣告引擎無(wú)論在架構(gòu)上還是功能上都很類似(index->filter->rank等等)。所以有幸進(jìn)入了廣告行業(yè)。

在這家公司,對(duì)我的影響很大,如果說(shuō)上一家公司給了我進(jìn)入互聯(lián)網(wǎng)的機(jī)會(huì),那么在這家公司,我開(kāi)始了思考,怎樣能讓服務(wù)性能更優(yōu),怎樣在系統(tǒng)設(shè)計(jì)上更加具有前瞻性,也算是逐步接觸架構(gòu),開(kāi)始從架構(gòu)去了解整個(gè)業(yè)務(wù),又從業(yè)務(wù)去反推架構(gòu)的合理性。

眾所周知,廣告對(duì)rt(Response Time)要求很高,rt每增加幾毫秒,廣告展示折算率就會(huì)變大,所以對(duì)于每天請(qǐng)求百億次的服務(wù)來(lái)說(shuō),對(duì)業(yè)務(wù)處理性能非常高,某一個(gè)子服務(wù)的性能都會(huì)影響整個(gè)廣告鏈路。比如:

  • 廣告候選集過(guò)大,導(dǎo)致處理時(shí)間變長(zhǎng)
  • 某塊代碼耗CPU過(guò)高
  • 傳輸鏈上無(wú)用參數(shù)過(guò)多
  • 其它
記憶比較深刻的,實(shí)現(xiàn)了一個(gè)DMP服務(wù),因?yàn)樾阅茉?,所有的操作都在?nèi)存里面進(jìn)行。里面用到了大量的內(nèi)存分配以及釋放,上線后,發(fā)現(xiàn)了一個(gè)現(xiàn)象,就是內(nèi)存利用率一直很高。從表面現(xiàn)象看,就是內(nèi)存沒(méi)有被釋放,即使程序顯示調(diào)用了delete或者clear,其內(nèi)存占用仍然居高不上。為了解決這個(gè)問(wèn)題,用了各種內(nèi)存檢測(cè)工具,加上了日志(申請(qǐng)內(nèi)存和釋放內(nèi)存都加上),發(fā)現(xiàn)仍然沒(méi)有問(wèn)題,于是就去調(diào)研底層庫(kù),去研究?jī)?nèi)存分配的原理,通過(guò)研究源碼,調(diào)研new和或者malloc的原因,最終發(fā)現(xiàn),在底層API中,即使調(diào)用了delete或者free,內(nèi)存都不會(huì)被立即釋放給操作系統(tǒng),而是被放在緩沖區(qū)中(這就是內(nèi)存占用比較高的原因),等間隔一段時(shí)間,才會(huì)被操作系統(tǒng)回收,如果想立即被操作系統(tǒng)回收,需要malloc_trim(0)。

還是同一個(gè)DMP服務(wù),由于其內(nèi)存占用過(guò)大,導(dǎo)致性能不是很高,大量的Misscache,最終,通過(guò)將系統(tǒng)中page大小從默認(rèn)的4k變?yōu)?2k,解決了這個(gè)問(wèn)題(這是因?yàn)閜age過(guò)小的話,導(dǎo)致大量的缺頁(yè)中斷,具體可參考<深入理解操作系統(tǒng)>)。

編程能力


作為程序員,編程能力是我們的立身之本, 就我自己的感受而言,我覺(jué)得編程能力的成長(zhǎng)主要有這么幾個(gè)部分。

初級(jí)

初級(jí)編程能力,就是 會(huì)用。也就是說(shuō) 使用各種系統(tǒng)API,能夠達(dá)到我們的目的就行。

編程,首先是從學(xué)習(xí)該門(mén)語(yǔ)言的語(yǔ)法開(kāi)始的,比如if/else while等,作為初級(jí)程序員,建議在入門(mén)的時(shí)候,使用入門(mén)級(jí)別的書(shū),而不是去看一些比較高階的書(shū)。(對(duì)于c 而言,并不適合入門(mén)級(jí)的讀者去看,反而適合有一定c 基礎(chǔ)知識(shí)的人去閱讀,這本書(shū)的名字起的太具有誘惑性)。

除了看文檔以外,編程是個(gè)超級(jí)實(shí)踐的活,所以一定要多寫(xiě)代碼,只有這樣才能真正熟練起來(lái),有句話"無(wú)他,唯手熟爾",很適合入門(mén)級(jí)程序員。作為入門(mén)級(jí)程序員,盡量不要使用IDE,這種會(huì)使得對(duì)IDE具有依賴性,導(dǎo)致手寫(xiě)很難,希望盡量做到所有的API名稱都能敲出來(lái),久而久之,就會(huì)越來(lái)越熟練。

在初級(jí)階段,核心就是多寫(xiě),勤學(xué)苦練,這個(gè)很重要,只有這樣才能為以后奠定扎實(shí)基礎(chǔ)。

中級(jí)

初級(jí)的目標(biāo)是能夠熟練使用編程語(yǔ)言實(shí)現(xiàn)功能,中級(jí)的的目標(biāo)就是提升 分析和解決問(wèn)題的能力

作為程序員,寫(xiě)代碼過(guò)程中出問(wèn)題是非常正常的,而怎樣去有效且高效的排查問(wèn)題,這是個(gè)體程序員之間編程能力上最大的差距,解決問(wèn)題能力強(qiáng),那么很容易受到上級(jí)乃至其他部門(mén)同事的認(rèn)可。

在查問(wèn)題的能力上,首先要掌握的是一些基本的調(diào)試技巧,好用的調(diào)試工具,比如常用的gdb,gperf,btrace等。熟練掌握調(diào)試工具,對(duì)解決問(wèn)題非常有利。有些時(shí)候大家在查問(wèn)題時(shí)的能力差距,有可能僅僅是因?yàn)閯e人比你多知道一個(gè)工具而已,除了調(diào)試技巧和工具外,查問(wèn)題的更高境界會(huì)和編程能力的高級(jí)階段有非常大的關(guān)系,就是懂原理,一個(gè)懂原理的程序員在查問(wèn)題的水平上是有明顯差距的。多嘗試給自己寫(xiě)一些會(huì)出問(wèn)題的程序,多積極的看別人是怎么查問(wèn)題的,多積極的去參與排查問(wèn)題,很多最后查問(wèn)題能力強(qiáng)的人多數(shù)僅僅是因?yàn)椤盁o(wú)他,但手熟爾”。

除了查問(wèn)題外,更厲害的程序員是在寫(xiě)代碼的過(guò)程就會(huì)很好的去避免問(wèn)題,他們會(huì)知道在這塊怎樣做才不會(huì)入坑,在這塊會(huì)出現(xiàn)怎樣的問(wèn)題,需要加什么樣的條件或者日志等。

在中級(jí)階段,建議大家去主動(dòng)分析和解決問(wèn)題,成為一個(gè)能寫(xiě)出高質(zhì)量代碼、有效排查問(wèn)題的優(yōu)秀程序員。

高級(jí)

對(duì)于高級(jí)編程能力的程序員來(lái)說(shuō),一個(gè)標(biāo)準(zhǔn)就是 懂的底層API的實(shí)現(xiàn)原理,知其然,知其所以然。

在學(xué)習(xí)底層實(shí)現(xiàn)以及排查問(wèn)題的過(guò)程中,越來(lái)越明白懂編程語(yǔ)言的運(yùn)行原理是非常重要的。學(xué)習(xí)底層實(shí)現(xiàn)最直接的去看源碼,但這對(duì)很多人來(lái)說(shuō)很難,所以可以嘗試著從文檔或者一些書(shū)籍入手(),一邊看書(shū),一邊找到對(duì)應(yīng)的源碼去分析,這樣就能達(dá)到事半功倍的效果。

有人說(shuō)過(guò),語(yǔ)言只是一種工具,解決和分析問(wèn)題,不要局限于語(yǔ)言,我很同意這種說(shuō)法。比如雖然c 性能很優(yōu),但是其實(shí)現(xiàn)過(guò)程比較麻煩,會(huì)出現(xiàn)很多坑。對(duì)于一些猛操快的需求,比如分析線上日志,可以使用python或者shell去解決。

架構(gòu)能力

隨著寫(xiě)的代碼越來(lái)越多,不經(jīng)意間,在寫(xiě)代碼的時(shí)候,開(kāi)始考慮性能上是否最優(yōu),架構(gòu)上是否合理,是否能夠做到日后靈活擴(kuò)展。

完全搭建一個(gè)系統(tǒng),是在五年前,也就是工作五年的時(shí)候,那個(gè)時(shí)候入職了現(xiàn)在的公司。剛開(kāi)始要做商業(yè)化,什么都沒(méi)有,所有的都要從0開(kāi)始搭建。比如一個(gè)流量來(lái)了,該如何去請(qǐng)求各個(gè)業(yè)務(wù)線,一個(gè)廣告訂單來(lái)了,如果能夠快速的進(jìn)入廣告系統(tǒng)。那么就需要合理的進(jìn)行模塊分配。

隨著代碼寫(xiě)的越來(lái)越多,解決問(wèn)題越來(lái)越多,越來(lái)越難,設(shè)計(jì)的模塊越來(lái)越多,在潛移默化中,架構(gòu)能力也就有了,在設(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候,就開(kāi)始有前瞻性,考慮解耦,考慮擴(kuò)展。

架構(gòu)能力并不是一朝一些就能學(xué)會(huì)的,更多的需要從實(shí)踐中來(lái),到實(shí)踐中去,久而久之,這種能力就會(huì)得到提升。

心得

團(tuán)隊(duì)精神

在一個(gè)各項(xiàng)流程都完善的公司,需求評(píng)審、開(kāi)發(fā)、測(cè)試、上線幾個(gè)流程缺一不可,缺少每一個(gè)環(huán)節(jié)都可能導(dǎo)致線上故障,所以一個(gè)需求的完成,是需要各個(gè)部門(mén)通力合作的。

線上有了問(wèn)題,大家一起努力將其解決,這就是成長(zhǎng)的過(guò)程。

不要炫技

代碼,是需要傳承的。大家都不希望自己的代碼被后面接手的人罵吧,所以代碼一定要簡(jiǎn)潔、清晰、明了。不要為了炫耀某些技術(shù)實(shí)力,而故意使用晦澀難懂的編程技巧,相信過(guò)不了多久,不止是別人,即使是本人,也有可能看不懂這塊代碼。

合理架構(gòu)

架構(gòu)方案千千萬(wàn),選擇一個(gè)合適的最重要,不要為了架構(gòu)而去架構(gòu),要考慮效率以及功能需求。

做到架構(gòu)和開(kāi)發(fā)效率雙平衡,再向后展望,看看現(xiàn)有架構(gòu)設(shè)計(jì)能否滿足需求。

攻守兼?zhèn)?span>

所謂的攻,即進(jìn)攻,也可以理解為攻城。即實(shí)現(xiàn)產(chǎn)品目標(biāo),滿足功能需求;所有的守,即守衛(wèi),也可以理解為守城。即對(duì)于線上問(wèn)題,能夠守衛(wèi),快速解決。

正所謂攻城容易,守城難。線上bug永遠(yuǎn)解決不完,需要有耐心,需要有攻守兼?zhèn)涞哪芰Α?/p>

代碼審查

codereview是必不可少的,這需要團(tuán)隊(duì)精神,可以在上線前期,解決不少問(wèn)題。

但是也有弊端,這就是可能會(huì)導(dǎo)致大家有矛盾,比如有個(gè)功能實(shí)現(xiàn),A說(shuō)這樣實(shí)現(xiàn),B說(shuō)那樣性能更好,久而久之,就會(huì)導(dǎo)致團(tuán)隊(duì)之間出現(xiàn)矛盾。這就需要找一個(gè)平衡點(diǎn),對(duì)于可有可無(wú)的意見(jiàn),可以不提。。。

代碼注釋

代碼是最好的注釋。這是終極目標(biāo),但很多人達(dá)不到,當(dāng)然也包括我。所以代碼中要盡可能多的注釋,原因:

  • 為了自己以后維護(hù)
  • 方便他人接手
尤其是對(duì)于功能復(fù)雜的函數(shù),可以用1、2、3等點(diǎn)寫(xiě)出來(lái),必要的時(shí)候,寫(xiě)在cf上,函數(shù)注釋處加上url鏈接。

代碼結(jié)構(gòu)

代碼結(jié)構(gòu)一定要清晰,簡(jiǎn)潔明了,通過(guò)看函數(shù)說(shuō)明就知道其功能,通過(guò)類名就能其要做什么。

代碼結(jié)構(gòu)表現(xiàn)出來(lái)的其實(shí)是程序的一個(gè)模塊邏輯思想。結(jié)構(gòu)簡(jiǎn)單清晰,也就能說(shuō)明程序?qū)崿F(xiàn)邏輯簡(jiǎn)單。

代碼風(fēng)格

程序員都是團(tuán)隊(duì)協(xié)作的,每個(gè)人都有自己不同的編程風(fēng)格,如果沒(méi)有一個(gè)統(tǒng)一的風(fēng)格,整個(gè)代碼將會(huì)很亂。

現(xiàn)在業(yè)界都用的谷歌代碼規(guī)范,同樣推薦給大家。

開(kāi)發(fā)效率

c 程序員有個(gè)特點(diǎn),就是不喜歡用IDE,也算是他們的一種特有的驕傲吧,喜歡用vim(我就是),所有的代碼開(kāi)發(fā)都用vim操作,顯得比較有B格。

技術(shù)之外

學(xué)如逆水行舟,不進(jìn)則退。程序員,是一個(gè)不斷自我學(xué)習(xí),自我進(jìn)步的過(guò)程,需要一直堅(jiān)持學(xué)習(xí),學(xué)習(xí)新知識(shí),方能不被技術(shù)所淘汰。

不忘初心,堅(jiān)持到底

面試了太多人,這些人不乏名校畢業(yè),履歷光鮮,但都有個(gè)特點(diǎn),就是轉(zhuǎn)行,有些從技術(shù)轉(zhuǎn)到產(chǎn)品,有些從技術(shù)轉(zhuǎn)到測(cè)試,慢慢在本行業(yè)失去了競(jìng)爭(zhēng)力。

技術(shù)是我們的根本,這個(gè)一定不能放棄,即使已經(jīng)做到了管理層,也請(qǐng)盡可能多的接觸代碼。

目標(biāo)、理想

理想是dream,可以實(shí)現(xiàn)不了,但它是支撐內(nèi)心豐盈的信念。只有有了理想,才能設(shè)立目標(biāo),否則目標(biāo)就總是在變,內(nèi)心也有很多焦慮。

與君共勉。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉