技術(shù)十年
時間:2021-12-07 14:02:18
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(dǎo)讀]走過的路,回憶起來是那么曲折,把自己的一些心得體會分享給程序員兄弟姐妹們,雖然時代在變化,但是很可能你也會走我已經(jīng)走過的10年的路程,有些心得體會你可以借鑒一下。在某一天的某一個時候,突然意識到,自己已經(jīng)畢業(yè)工作十年了,是該寫篇東西,來記錄下自己的十年,算是給自己一個心理的慰藉,...
走過的路,回憶起來是那么曲折,把自己的一些心得體會分享給程序員兄弟姐妹們,雖然時代在變化,但是很可能你也會走我已經(jīng)走過的10年的路程,有些心得體會你可以借鑒一下。在某一天的某一個時候,突然意識到,自己已經(jīng)畢業(yè)工作十年了,是該寫篇東西,來記錄下自己的十年,算是給自己一個心理的慰藉,亦算是給自己入職場以來,第一個十年的總結(jié)。
大學(xué)生活
我是03年上的大學(xué),上大學(xué)之前,完全沒有接觸過計算機。大學(xué)報志愿也是懵懵懂懂,那個時候,最火的兩個專業(yè),一是計算機,一是生物工程。電視上經(jīng)常說的已經(jīng)話就是:21世紀(jì),是生物科學(xué)的世紀(jì)。而我呢,因為沒有摸過電腦,所以比較好奇,就在填報志愿的時候,寫上了對于現(xiàn)在來說最內(nèi)卷的一個行業(yè)專業(yè):計算機科學(xué)與技術(shù)。于是乎,在9月份的某一天,坐著穿越近半個中國的火車,來到了北方某個城市,開始了所謂的大學(xué)生活。現(xiàn)在還清楚的記得,第一次上機課,在機房打開電腦,雙擊點開網(wǎng)上鄰居,輸入網(wǎng)址,聽的第一首歌,就是劉若英的“很愛很愛你”,以至于很多年以后,每次聽到這首歌熟悉的旋律,都會回憶起自己大一的第一次上機課的情景。那個時候,剛剛脫離了壓抑的高中生活,就像長了翅膀的鳥兒,自由自在的翱翔在空中,秉持著“六十分萬歲,多一分浪費”的學(xué)習(xí)心態(tài),得過且過,基礎(chǔ)課和專業(yè)課都均分通過,也算是沒留丁點遺憾把。就這樣,度過了大一的懵懂,大二的彷徨,大三的沉淪,直至大三下的時候,才開始考慮自己的未來,跟隨自己的內(nèi)心,選擇了考研。研究生生活
慕名來到了以學(xué)習(xí)刻苦出名的華東某校,開始了自己的內(nèi)卷生活。吃了不少專業(yè)課的苦,也算是對自己本科期間的一個懲戒。每天的三點點一線生活,宿舍、食堂、圖書館,開始了自己專業(yè)技術(shù)的學(xué)習(xí)。買的第一步編程方面的書,就是c primer,在圖書館借閱了c 大學(xué)教程,開始學(xué)習(xí)編程,隨著對專業(yè)書籍的廣泛接觸,開始更加深入的去了解底層原理,c 模型深度探索,effective c ,more effective c ,c 沉思錄等等,好多書都是在那個時候開始接觸,也算是給自己后面進(jìn)入本行業(yè),打下了堅實的基礎(chǔ)。實習(xí)生活
那個時候,對自己就業(yè)開始有了危機感,周圍的同學(xué)都拿到了阿里云、訊飛等公司的實習(xí)offer。終于,自己在快要崩潰的時候,拿到了中科院某所的實習(xí)offer,記得同宿舍哥們的第一句話就是:恭喜你,多年的媳婦熬成婆。來到了北京,住在了所里安排的宿舍,跟著mentor做一個國家863項目,ddos攻擊相關(guān)的。因為是實習(xí)生,所以接觸的是一些優(yōu)化類的,比如內(nèi)存池等。在所里實習(xí)的同時,自己開始接觸csdn網(wǎng)站,除了項目,就是整天泡在c 版塊回答問題,當(dāng)初的積分很高,排名也很不錯,不過因為其他原因,工作后,也不再登錄該論壇了,算是一個不小的遺憾吧,在里面還是能學(xué)到不少東西,猶記里面有個技術(shù)很牛的群(音譯 餅子堂),自己有幸也加入了,后面還是退出了。隨著所里項目的終結(jié),選擇去了另外一個大外企實習(xí),該企業(yè)在西二旗(大家應(yīng)該能猜出來是哪家吧),項目組是做一整套Linux下的辦公系統(tǒng),類似于Windows下的word,基于openoffice來做的。整個項目百萬行,光編譯就得兩三個小時,自己在里面負(fù)責(zé)解決內(nèi)存泄漏,在此需要提的是,當(dāng)時的mentor是個大牛,基本上整個公司的難題都會去找他,使得自己對技術(shù)的理解更加深入。初入職場
進(jìn)入傳統(tǒng)行業(yè)
第一家公司,是個傳統(tǒng)行業(yè),有幸進(jìn)入了公司技術(shù)最厲害的技術(shù)研究院,做網(wǎng)絡(luò)相關(guān)的研發(fā)工作,也就是在這家公司,開始了研究TCP,把TCP/IP詳解看了一遍又一遍,不懂的就去查資料,甚至把源碼下載下來進(jìn)行分析研究。也是在這家公司,第一次接觸Linux系統(tǒng)。由于公司的業(yè)務(wù)面向的是國企,主要運行在Windows系統(tǒng),第一要求就是穩(wěn)定,所以更新迭代很慢,有時候一個功能幾年都沒進(jìn)行優(yōu)化。后面隨著Linux系統(tǒng)在國內(nèi)用的越來越多,部門的業(yè)務(wù)也需要運行在Linux系統(tǒng)上,當(dāng)時有兩個選擇,一個是重新在Linux系統(tǒng)上寫一份代碼,一個就是現(xiàn)有的代碼可以完全移植到Linux系統(tǒng),即同一份代碼可以在Windows和Linux兩大系統(tǒng),最終為了效率,還是選擇了第二種方案。大家都知道,雖然c 是跨平臺的語言,但是API名稱,以及底層實現(xiàn)卻是依賴于系統(tǒng)的,就比如WaitForSingleObject函數(shù),在Linux gcc下就是std::lock,這就要求同一個函數(shù),比如WaitForSingleObject,在Windows下使用的系統(tǒng)自帶API,而在Linux下是重新開發(fā)的一個函數(shù),其功能與Windows下類似。當(dāng)初這塊是我來負(fù)責(zé)完成的,第一次出現(xiàn)了coredump,第一次使用gdb進(jìn)行調(diào)試。入職互聯(lián)網(wǎng)
那幾年,正式互聯(lián)網(wǎng)行業(yè)開始火的時候,自己內(nèi)心也蠢蠢欲動,于是幾經(jīng)坎坷,進(jìn)入了一家互聯(lián)網(wǎng)行業(yè),也算是自己第一次接觸互聯(lián)網(wǎng)。剛?cè)肼毜臅r候,確實很不習(xí)慣里面的快節(jié)奏,經(jīng)常一個需求從提出到上線就幾天,這在之前的傳統(tǒng)行業(yè)是萬萬不可能的,第一次上線就導(dǎo)致線上服務(wù)coredump,飯吃一半就跑上去解決。。。,在這家公司學(xué)到很多,對業(yè)務(wù)越來越熟練,開始負(fù)責(zé)整個推薦引擎,為后面接觸廣告奠定了基礎(chǔ)。接觸廣告
由于公司的業(yè)務(wù)發(fā)展遇到了瓶頸,再加上其他一些原因,又開始看機會。由于推薦引擎和廣告引擎無論在架構(gòu)上還是功能上都很類似(index->filter->rank等等)。所以有幸進(jìn)入了廣告行業(yè)。在這家公司,對我的影響很大,如果說上一家公司給了我進(jìn)入互聯(lián)網(wǎng)的機會,那么在這家公司,我開始了思考,怎樣能讓服務(wù)性能更優(yōu),怎樣在系統(tǒng)設(shè)計上更加具有前瞻性,也算是逐步接觸架構(gòu),開始從架構(gòu)去了解整個業(yè)務(wù),又從業(yè)務(wù)去反推架構(gòu)的合理性。眾所周知,廣告對rt(Response Time)要求很高,rt每增加幾毫秒,廣告展示折算率就會變大,所以對于每天請求百億次的服務(wù)來說,對業(yè)務(wù)處理性能非常高,某一個子服務(wù)的性能都會影響整個廣告鏈路。比如:- 廣告候選集過大,導(dǎo)致處理時間變長
- 某塊代碼耗CPU過高
- 傳輸鏈上無用參數(shù)過多
- 其它
編程能力
作為程序員,編程能力是我們的立身之本, 就我自己的感受而言,我覺得編程能力的成長主要有這么幾個部分。
初級
初級編程能力,就是 會用。也就是說 使用各種系統(tǒng)API,能夠達(dá)到我們的目的就行。編程,首先是從學(xué)習(xí)該門語言的語法開始的,比如if/else while等,作為初級程序員,建議在入門的時候,使用入門級別的書,而不是去看一些比較高階的書。(對于c 而言,中級
初級的目標(biāo)是能夠熟練使用編程語言實現(xiàn)功能,中級的的目標(biāo)就是提升 分析和解決問題的能力。作為程序員,寫代碼過程中出問題是非常正常的,而怎樣去有效且高效的排查問題,這是個體程序員之間編程能力上最大的差距,解決問題能力強,那么很容易受到上級乃至其他部門同事的認(rèn)可。在查問題的能力上,首先要掌握的是一些基本的調(diào)試技巧,好用的調(diào)試工具,比如常用的gdb,gperf,btrace等。熟練掌握調(diào)試工具,對解決問題非常有利。有些時候大家在查問題時的能力差距,有可能僅僅是因為別人比你多知道一個工具而已,除了調(diào)試技巧和工具外,查問題的更高境界會和編程能力的高級階段有非常大的關(guān)系,就是懂原理,一個懂原理的程序員在查問題的水平上是有明顯差距的。多嘗試給自己寫一些會出問題的程序,多積極的看別人是怎么查問題的,多積極的去參與排查問題,很多最后查問題能力強的人多數(shù)僅僅是因為“無他,但手熟爾”。除了查問題外,更厲害的程序員是在寫代碼的過程就會很好的去避免問題,他們會知道在這塊怎樣做才不會入坑,在這塊會出現(xiàn)怎樣的問題,需要加什么樣的條件或者日志等。在中級階段,建議大家去主動分析和解決問題,成為一個能寫出高質(zhì)量代碼、有效排查問題的優(yōu)秀程序員。高級
對于高級編程能力的程序員來說,一個標(biāo)準(zhǔn)就是 懂的底層API的實現(xiàn)原理,知其然,知其所以然。在學(xué)習(xí)底層實現(xiàn)以及排查問題的過程中,越來越明白懂編程語言的運行原理是非常重要的。學(xué)習(xí)底層實現(xiàn)最直接的去看源碼,但這對很多人來說很難,所以可以嘗試著從文檔或者一些書籍入手(架構(gòu)能力
隨著寫的代碼越來越多,不經(jīng)意間,在寫代碼的時候,開始考慮性能上是否最優(yōu),架構(gòu)上是否合理,是否能夠做到日后靈活擴(kuò)展。完全搭建一個系統(tǒng),是在五年前,也就是工作五年的時候,那個時候入職了現(xiàn)在的公司。剛開始要做商業(yè)化,什么都沒有,所有的都要從0開始搭建。比如一個流量來了,該如何去請求各個業(yè)務(wù)線,一個廣告訂單來了,如果能夠快速的進(jìn)入廣告系統(tǒng)。那么就需要合理的進(jìn)行模塊分配。隨著代碼寫的越來越多,解決問題越來越多,越來越難,設(shè)計的模塊越來越多,在潛移默化中,架構(gòu)能力也就有了,在設(shè)計一個系統(tǒng)的時候,就開始有前瞻性,考慮解耦,考慮擴(kuò)展。架構(gòu)能力并不是一朝一些就能學(xué)會的,更多的需要從實踐中來,到實踐中去,久而久之,這種能力就會得到提升。心得
團(tuán)隊精神
在一個各項流程都完善的公司,需求評審、開發(fā)、測試、上線幾個流程缺一不可,缺少每一個環(huán)節(jié)都可能導(dǎo)致線上故障,所以一個需求的完成,是需要各個部門通力合作的。線上有了問題,大家一起努力將其解決,這就是成長的過程。不要炫技
代碼,是需要傳承的。大家都不希望自己的代碼被后面接手的人罵吧,所以代碼一定要簡潔、清晰、明了。不要為了炫耀某些技術(shù)實力,而故意使用晦澀難懂的編程技巧,相信過不了多久,不止是別人,即使是本人,也有可能看不懂這塊代碼。合理架構(gòu)
架構(gòu)方案千千萬,選擇一個合適的最重要,不要為了架構(gòu)而去架構(gòu),要考慮效率以及功能需求。做到架構(gòu)和開發(fā)效率雙平衡,再向后展望,看看現(xiàn)有架構(gòu)設(shè)計能否滿足需求。攻守兼?zhèn)?span>
所謂的攻,即進(jìn)攻,也可以理解為攻城。即實現(xiàn)產(chǎn)品目標(biāo),滿足功能需求;所有的守,即守衛(wèi),也可以理解為守城。即對于線上問題,能夠守衛(wèi),快速解決。正所謂攻城容易,守城難。線上bug永遠(yuǎn)解決不完,需要有耐心,需要有攻守兼?zhèn)涞哪芰Α?/p>代碼審查
codereview是必不可少的,這需要團(tuán)隊精神,可以在上線前期,解決不少問題。但是也有弊端,這就是可能會導(dǎo)致大家有矛盾,比如有個功能實現(xiàn),A說這樣實現(xiàn),B說那樣性能更好,久而久之,就會導(dǎo)致團(tuán)隊之間出現(xiàn)矛盾。這就需要找一個平衡點,對于可有可無的意見,可以不提。。。代碼注釋
代碼是最好的注釋。這是終極目標(biāo),但很多人達(dá)不到,當(dāng)然也包括我。所以代碼中要盡可能多的注釋,原因:
- 為了自己以后維護(hù)
- 方便他人接手
代碼結(jié)構(gòu)
代碼結(jié)構(gòu)一定要清晰,簡潔明了,通過看函數(shù)說明就知道其功能,通過類名就能其要做什么。代碼結(jié)構(gòu)表現(xiàn)出來的其實是程序的一個模塊邏輯思想。結(jié)構(gòu)簡單清晰,也就能說明程序?qū)崿F(xiàn)邏輯簡單。代碼風(fēng)格
程序員都是團(tuán)隊協(xié)作的,每個人都有自己不同的編程風(fēng)格,如果沒有一個統(tǒng)一的風(fēng)格,整個代碼將會很亂。現(xiàn)在業(yè)界都用的谷歌代碼規(guī)范,同樣推薦給大家。開發(fā)效率
c 程序員有個特點,就是不喜歡用IDE,也算是他們的一種特有的驕傲吧,喜歡用vim(我就是),所有的代碼開發(fā)都用vim操作,顯得比較有B格。技術(shù)之外
學(xué)如逆水行舟,不進(jìn)則退。程序員,是一個不斷自我學(xué)習(xí),自我進(jìn)步的過程,需要一直堅持學(xué)習(xí),學(xué)習(xí)新知識,方能不被技術(shù)所淘汰。