15年編程生涯,資深架構(gòu)師總結(jié)的7條經(jīng)驗
http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513065&idx=1&sn=b82b7f98553d8a8e3c4256c8f4ecf742&scene=21#wechat_redirect
前言: 這是一篇應(yīng)InfoQ之邀寫的文章口叙, 首發(fā)在InfoQ微信公共號上炼绘。
大家有空可以多看看InfoQ 網(wǎng)站和公共號 , 是個很有深度的優(yōu)秀社區(qū)。
我和很多人交流過一個有趣的現(xiàn)象妄田,那就是剛畢業(yè)到30歲這段時間俺亮,會覺得時間過得很慢驮捍,總覺得自己還很年輕,但是一旦過了30歲脚曾,時間就如白駒過隙东且,一年又一年飛逝而過。
我自己也是本讥,眼瞅著畢業(yè)快15年了珊泳,15年間從一個剛畢業(yè)的菜鳥,成長為技術(shù)骨干拷沸,做到架構(gòu)師的職位色查,回頭看看,當(dāng)年聽取親戚的一句話撞芍,誤入計算機(jī)行業(yè)秧了,看來并沒有走錯,編程雖然枯燥辛苦序无,但是如果真的感興趣验毡,你就能體會到其中的樂趣,并且獲得可觀的回報帝嗡。
1
好奇心
劉慈欣在《朝聞道》中描繪過這么一個情節(jié):在古老的非洲大陸上晶通,有個原始人無意中抬頭仰望星空,凝視的時間稍微長了一些丈探,超過了外星人設(shè)置的閾值录择,立刻拉響了人類即將產(chǎn)生文明的警報拔莱。因為外星人認(rèn)為碗降,人類已經(jīng)產(chǎn)生了對宇宙的好奇心,文明的產(chǎn)生塘秦,科技的發(fā)展不過是一瞬間的事情讼渊。
確實是這樣,好奇心驅(qū)動人類不斷向前尊剔,在短短的幾千年(相對于長達(dá)幾十萬年的原始時代)里就登上了月球爪幻,并且努力向其他行星拓展。
對于程序員來說也是類似须误,如果你看到新技術(shù)挨稿,新產(chǎn)品沒有像小孩看到新玩具那樣兩眼放光,沒有想趕緊在自己電腦上玩玩的沖動京痢,你就需要仔細(xì)考慮下是否真的對軟件開發(fā)有興趣奶甘?如果根本沒興趣,不要浪費時間祭椰,還是趁早轉(zhuǎn)行臭家,有更多有前(錢)途的職業(yè)在等著你疲陕。
沒有好奇心,就不愿意追本溯源钉赁,追求技術(shù)的本質(zhì)蹄殃。
沒有好奇心,就難于靜下心來你踩,耐得住寂寞诅岩,遠(yuǎn)離浮躁和代碼奮斗,更難于跨過這個苦逼行業(yè)帶來的種種挑戰(zhàn)带膜,走到架構(gòu)師這個位置了按厘。
沒有好奇心,就不愿意學(xué)習(xí)新技術(shù)钱慢,一個架構(gòu)師逮京,如果沒有對技術(shù)的敏感度和前瞻性,一直抱著一套技術(shù)架構(gòu)不變束莫,估計很快會被淘汰懒棉。
當(dāng)然自制力強(qiáng)大的人除外,但話說回來览绿,靠著自制力讓自己做自己不喜歡的事情策严,豈不非常痛苦?
我在上公司的一個關(guān)于Leader的培訓(xùn)課的時候饿敲,老師一直在說Passion(激情)妻导,Passion,Passion怀各,但我一直覺得沒有好奇心倔韭,沒有興趣,怎么會產(chǎn)生Passion呢瓢对?
所以莫湘,對技術(shù)的好奇心/興趣峻贮,是一切的基礎(chǔ)。
2
養(yǎng)成計算機(jī)的思維方式
之前在“碼農(nóng)翻身”公共號發(fā)過一篇文章,叫《學(xué)會編程奏属,而不是學(xué)會Java》說的就是要能夠以計算機(jī)的方式去思考纳猪。
現(xiàn)在的計算機(jī)還很“弱智”址愿,你不能這么說:『電腦谭企,我要創(chuàng)建一個像Java的ArrayList類似的類,有個get埃仪、add乙濒、remove方法,還有這個ArrayList的容量不是固定的贵试,能夠自增長琉兜,快點給我寫出來凯正!』
現(xiàn)在的電腦當(dāng)然寫不出來。
相反你只能用計算機(jī)能理解的方式豌蟋,用非常非常低級的計算機(jī)語言去告訴它做事情:創(chuàng)建一個類廊散,分配一個固定大小的數(shù)組用來存放數(shù)據(jù),用一個數(shù)(size)來記錄數(shù)組里存了多少數(shù)據(jù)梧疲。如果數(shù)組滿了允睹,就需要增大數(shù)組,并且把數(shù)據(jù)從老數(shù)組復(fù)制到新數(shù)組幌氮。
這里邊有很多很多的煩人的細(xì)節(jié)需要你去處理缭受,一不留神就會出錯---計算機(jī)編程就是這樣。
養(yǎng)成計算機(jī)的思維方式该互,流暢的把人類語言的需求轉(zhuǎn)化成計算機(jī)語言米者,這是程序員的基本功。
很多人會語法宇智,也懂框架蔓搞,但是在基本功上卻不過關(guān),只能在初級程序員上踏步随橘。
這個基本功的訓(xùn)練就是數(shù)據(jù)結(jié)構(gòu)和算法喂分,我的經(jīng)驗是多做習(xí)題(大學(xué)時我把數(shù)據(jù)結(jié)構(gòu)后面的習(xí)題都做了一遍),讓這個思維在腦子里固化机蔗,以后的編程就可以信手拈來了蒲祈。
3
扎實基礎(chǔ),融會貫通
我很久之前參與過一點開源軟件的開發(fā)萝嘁,有幸看到了一個老程序員的簡歷梆掸,讓我震驚的是他竟然在Altair這個最早的電腦上編過程序。
沒錯酿愧,Altair就是那個連顯示器和鍵盤都沒有沥潭,靠撥動開關(guān)來輸入,靠指示燈來輸出的所謂“個人電腦”嬉挡,比爾蓋茨和保羅艾倫在上面寫了一個Baisc的解釋器,從此開始微軟之路汇恤。
如果有了在這樣的機(jī)器上編程的經(jīng)歷庞钢,我相信這些老程序員對硬件,驅(qū)動因谎,操作系統(tǒng)基括,應(yīng)用軟件的理解要遠(yuǎn)遠(yuǎn)超過我們現(xiàn)在這些人。
我之前要寫文章遇到了一個問題:一個進(jìn)程要讀取文件财岔,在底層用的是DMA的方式风皿,DMA完成文件讀取以后要通過中斷讓CPU去處理河爹,但是CPU和中斷處理程序根本不知道進(jìn)程的ID,它怎么去和進(jìn)行關(guān)聯(lián)桐款,如何去喚醒那個等待的進(jìn)程咸这?這個問題讓我意識到其實我對計算機(jī)的基礎(chǔ)也并沒有融匯貫通。
我們大學(xué)里都學(xué)過計算機(jī)組成原理魔眨、操作系統(tǒng)媳维、編譯原理、計算機(jī)網(wǎng)絡(luò)遏暴、數(shù)據(jù)庫侄刽、匯編語言,能不能把這些知識融會貫通朋凉,打通任督二脈州丹,在我們的腦海里建立一個計算機(jī)運算的圖景?
把這些知識融為一體杂彭,我相信能超越絕大多數(shù)程序員当叭。
現(xiàn)在的軟件開發(fā)封裝的層次已經(jīng)非常高了,只要學(xué)會Java就能做一個編程工作了盖灸,隨著你做的越來越深蚁鳖,越來越專,這些基礎(chǔ)的問題就會浮現(xiàn)出來赁炎。
更重要的是醉箕,計算機(jī)軟硬件的基本思想在這幾十年里其實變化不大,例如緩存徙垫,增加抽象層等讥裤,有了這么基本的思想的武裝,去學(xué)習(xí)新的東西不但學(xué)的快姻报,理解的會更透徹己英。
4
要透徹地理解一個技術(shù)的本質(zhì)
先舉個Ant中的例子,大部分人學(xué)習(xí)Ant只是學(xué)會怎么使用吴旋,認(rèn)識到Ant提供了很多內(nèi)置的task來幫助我們方便的完成自動化的構(gòu)建损肛,例如命令。
<copytodir="../backup/dir"> <filesetdir="src_dir"/> <filterset> <filtertoken="TITLE"value="FooBar"/> </filterset> </copy>
很少人會思考為什么Ant的task是以XML來描述的荣瑟?為什么Ant不提供一套Java類庫/API來讓程序員用治拿,那樣不是更自然嗎?
這其中的一個重要原因就是XML可以自定義標(biāo)簽笆焰,所以表達(dá)力無與倫比劫谅;如果用java,它的語法不允許自定義一個像copy、fileset這樣的關(guān)鍵字捏检,只能定義一些類來模擬這些Copy荞驴、Fileset,就沒有這么簡單明了贯城,不信你嘗試一下熊楼。
Ant給我們的重要啟示就是,用XML來描述任務(wù)冤狡,能極大的擴(kuò)展語言的能力孙蒙。但是Ant的問題就是需要程序員處理太多的細(xì)節(jié),指定源代碼路徑悲雳,指定編譯文件的路徑挎峦,指定資源文件的路徑,指定需要的jar包及其位置合瓢,很煩心坦胶。
于是Maven出來使用“約定優(yōu)于配置”的方式解決了Ant的問題。
理解了技術(shù)的本質(zhì)以后就能夠觸類旁通晴楔,就能夠快速學(xué)習(xí)顿苇,這在技術(shù)更新很快的軟件行業(yè)尤為重要。
只是學(xué)會使用是不行的税弃,不但要知道how纪岁,還要知道why。
停下來则果,思考幔翰,才是進(jìn)步的本質(zhì)。
5
要能寫漂亮的代碼
架構(gòu)師不是高高在上西壮,脫離代碼只說不做的人遗增。架構(gòu)師首先是一個優(yōu)秀的程序員,要能夠編寫項目或產(chǎn)品中的核心功能款青,隨時能夠卷起袖子去解決項目中的問題做修。
代碼寫的不漂亮怎么能拿得出手?怎么能夠服人抡草?
所謂漂亮代碼不僅僅是清晰饰及、易懂、優(yōu)雅渠牲,更要實現(xiàn)功能旋炒,沒有Bug或者極少Bug。
其實如果代碼簡單優(yōu)雅签杈,一般沒什么問題。
寫出漂亮代碼并不容易,需要思路清晰答姥,有良好的編程基礎(chǔ)铣除,有優(yōu)秀的抽象能力,以及對一門語言的熟練掌握鹦付。
6
抽象的能力
抽象思考的能力怎么強(qiáng)調(diào)都不為過尚粘。
現(xiàn)實的需求紛繁復(fù)雜,如果架構(gòu)師不能夠把這些亂無頭緒的需求抽象成一些“概念”敲长,在概念的層次進(jìn)行思考郎嫁,系統(tǒng)根本就無法設(shè)計。
但是抽象出概念以后還不夠祈噪,還要看看這個概念是不是正交的泽铛,能不能獨立變化,如果不能辑鲤,考慮下新的概念抽象盔腔。
“正交”講的是線性無關(guān),非常重要月褥,就像一個點(x,y)弛随,在x軸的變化不會影響y,y軸的變化不會影響x宁赤,這就是正交舀透。
“正交”威力巨大,(x,y)可以表達(dá)二維平面的所有的點决左,如果增加一個z軸愕够,不但能表達(dá)三維空間中所有的點,并且每個軸都可以獨立變化哆窿。
如果能做出正交的設(shè)計链烈,這個系統(tǒng)的開發(fā)和維護(hù)會非常舒服,以為可以放心大膽的修改其中一個方面兒不會影響其他挚躯。
設(shè)計模式一直強(qiáng)調(diào)的『發(fā)現(xiàn)變化并且封裝變化』其實就是這個意思强衡。
抽象能力的訓(xùn)練沒有捷徑,就是經(jīng)驗的積累码荔,勤于思考和學(xué)習(xí)漩勤。例如:學(xué)習(xí)Android的程序員可以思考下Android是怎么對未知的,紛繁復(fù)雜的應(yīng)用程序進(jìn)行抽象的缩搅?為什么有Activity越败、Service、BroadcastReceiver硼瓣、ContentProvider這四大組件究飞?
深入閱讀:《抽象置谦,程序員必備的能力》
7
技術(shù)領(lǐng)導(dǎo)力
我在IBM學(xué)到的重要一課就是:要用技術(shù)的影響力來領(lǐng)導(dǎo)人,而不是威權(quán)和職位亿傅。
換句大白話來說媒峡,就是要能讓技術(shù)人員服你。有了技術(shù)影響力葵擎,你在團(tuán)隊發(fā)出的聲音才會被傾聽谅阿,被尊重。
但是影響力不是很快就建成的酬滤,這是個漫長的過程:你解決了一個技術(shù)難題签餐,你提出的方案被證明可行....
這樣的事情會一點一滴的積累起你在別人心目中的形象,建立你的個人品牌盯串,最終大家會給你貼上一個標(biāo)簽:大牛氯檐。