閱讀源碼的真正價值
這里是Z哥的個人公眾號
每周五11:45 按時送達(dá)
當(dāng)然了,也會時不時加個餐~
我的第「179」篇原創(chuàng)敬上
最近有位小伙伴求職遇到一些挫折,來找到我聊,其中有問到一個涉及到「閱讀源碼的必要性」的問題:“有很多場面試,面試官都有問到某個框架的某個功能是怎么實(shí)現(xiàn)的,難道真的要去看源碼嗎?但是感覺看源碼除了面試有用,平時沒啥用……”
我想可能有不少人都有一樣的想法,所以我把我對閱讀源碼這件事的看法在這里和大家分享交流一下。
我曾經(jīng)和一位同事聊天的時候打趣說,程序員可以分為4個層次。
1. 有閱讀并吃透大型知名框架的能力2. 能夠知道并通過閱讀框架源碼來解決問題3. 能夠知道并通過找官方文檔來掌握框架的使用4. 需要有人手把手教或者自己踩過很多坑才能掌握一個框架的使用
這其實(shí)也體現(xiàn)了我對閱讀源碼這件事的看法。想成為厲害的程序員,閱讀源碼的能力必不可少,并且能夠hold住的源碼復(fù)雜度越高,水平越高。
我們程序員雖然每天都和代碼打交道,但是大多數(shù)時候都是在「寫」而不是「閱讀」。唯有在接手一個新項目的時候,才會被逼著在短時間內(nèi)閱讀大量源碼。畢竟,大多數(shù)情況下我們一直在固定的項目里“深耕細(xì)作”,閱讀其它項目的源碼,似乎對手頭的項目沒什么用。
但是在我看來,coding就好比寫作,如果你想寫出好文章,必然需要掌握很多語言組織上的技巧。比如,排比句、反復(fù)句等句式,比喻、擬人等修辭手法等等。這些其實(shí)就類似于coding中我們需要考慮的設(shè)計模式、算法這些東西。
在我們學(xué)生時代,老師會引導(dǎo)我們閱讀大量的課外文章來提升這方面的能力,學(xué)習(xí)別人的寫法,摘錄別人的金句等等。
其實(shí)coding也是一樣,如果你平時如果不多積累一些“美化”代碼的“套路”,如何能寫出優(yōu)雅的代碼呢?
所以通過閱讀源碼來提升你的編程能力,和閱讀好文章提高自己的寫作能力是一樣的。
從這個邏輯也可以衍生一個新的邏輯,就是單憑自己頓悟、踩坑來提升編程技能的速度,必然比不過借助閱讀別人源碼來提升的速度。畢竟,參考、借鑒別人的東西可容易多了。你看,有哪個大文豪是不是閱讀了大量的優(yōu)質(zhì)書籍?
回到本文的核心問題上,在Z哥看來,閱讀源碼的價值有很多,面試的作用只是一個短期價值。我認(rèn)為它至少有以下5個價值。
/01? 短期價值/
01? 面試
正如前文提到的那位來找我咨詢的同學(xué),他也知道閱讀源碼對面試的作用是很大的。
因?yàn)橛行?shí)現(xiàn)細(xì)節(jié)如果我們只是會用,但不去看源碼了解細(xì)節(jié),其實(shí)就是所謂的“知其然而不知其所以然”。
比如,ArrayList 和 LinkedList 的區(qū)別?想要回答好這題,必須從源碼入手,了解 ArrayList 和 LinkedList 底層實(shí)現(xiàn)。如果你沒有閱讀過源碼的話,這道題肯定是回答不太好的或者回答的時候底氣不足。
/02? 長期價值/
01? 在工作中更快地上手新項目
正如前文所說,每個程序員的職場生涯中,都無法避免“閱讀源碼”。因?yàn)槟悴豢赡芤恢痹谝粋€項目里工作,必然有機(jī)會接手很多陌生的項目。此時如何快速的了解項目的脈絡(luò)、結(jié)構(gòu),以便自己快速的展開工作?這個時候,閱讀源碼能力高低就體現(xiàn)出來了。
雖說,如果上一位接手者還在職的話可以請教他,但是人家不可能真的像網(wǎng)傳的「結(jié)對編程」圖片那樣,手把手解釋給你,你說是吧?大部分時候還得看你自己的閱讀源碼能力。

▲圖片來源于網(wǎng)絡(luò),版權(quán)歸原作者所有
02? 給自己創(chuàng)造用新技術(shù)的機(jī)會
很多技術(shù)人會抱怨工作中用不到新技術(shù),一直在用老舊的技術(shù)。如果你寄希望于公司層面來推動一個新技術(shù)的運(yùn)用,那就有點(diǎn)看緣分了,可能直到你離職也不一定會有這樣的機(jī)會。
畢竟站在組織的角度來說,我現(xiàn)在項目跑得好好的,為什么要用新技術(shù)?新技術(shù)對我有什么好處,值得讓我承擔(dān)未知的風(fēng)險?
但是如果你對某類技術(shù)其中之一的框架有源碼級別的了解就不一樣了。你可以借此主動推動運(yùn)用某項新技術(shù)。因?yàn)槟憧梢跃唧w說出很多具有說服力的觀點(diǎn),
這個新技術(shù)到底好在哪里?
能夠改善或者提升當(dāng)前的系統(tǒng)的某幾項能力?
為什么它可以提升這些能力?
它是怎么實(shí)現(xiàn)的?
如果我們要用它,需要提前對哪些知識進(jìn)行儲備?
……
況且,有時候組織層面不敢貿(mào)然使用新技術(shù),可能也是擔(dān)心沒人能hold住這項新技術(shù),萬一出現(xiàn)什么問題無法及時解決怎么辦?此時,如果他們發(fā)現(xiàn)這里有一位閱讀過源碼的伙計,這份擔(dān)憂必然大大降低。
03? 完善知識體系
那些大牛之所以能夠在自己專攻的領(lǐng)域內(nèi)無所不知,是他真的記憶力好嗎?并不是,而是他的知識已經(jīng)形成了體系框架。
完善體系框架的過程必然是你主動而為之,單憑工作中遇到問題時的百度、google是無法形成體系結(jié)構(gòu)的,因?yàn)槟切┒际橇闵⒌乃槠R。
如何快速的攝入大量原本就已經(jīng)成體系化的知識?那些成熟的框架中就是啊,一個功能越龐大的框架,它所覆蓋的知識面就越廣,如果你能吃透它,你就可以快速擴(kuò)充這方面的知識體系。這個過程簡直就像是偷偷學(xué)了一本乾坤大挪移。
所以,閱讀源碼是一個加速你知識體系完善的有效方法。用不了多久,你也可以成為別人眼中的大牛。
04? 學(xué)習(xí)別人的設(shè)計思路
靠自己領(lǐng)悟自然也能逐步成長,當(dāng)然前提是你得能夠「領(lǐng)悟」到什么。但是以這樣的路線來成長,你會陷入以下兩種境地。
自認(rèn)為自己的設(shè)計很牛逼,而實(shí)際上……
覺得這樣設(shè)計代碼很變扭,但是又不知道有什么更好的方式。
如果你閱讀過足夠多的優(yōu)秀源碼,能夠不斷地吸取他人之長,這些情況自然就不會發(fā)生了。因?yàn)楫?dāng)你在看那些優(yōu)秀的源碼的時候,會有很多驚喜的過程。
“原來這里還可以這樣來設(shè)計”、“對呀,這么設(shè)計不就搞定了么” 、“哇塞,這段代碼設(shè)計的真精辟”,這些都是我在閱讀那些優(yōu)秀的源碼時腦海中經(jīng)常蹦出的詞。
每當(dāng)你覺得有收獲到什么的時候,你可以將它們記錄下來,并思考適用的場景。這樣當(dāng)你后續(xù)項目中遇到類似的場景,你就會想起“好像這里之前看到過一個精辟的設(shè)計,我去翻翻之前記錄的代碼案例?!?/span>
所謂“萬事開頭難”,閱讀源碼也是如此。因?yàn)楫?dāng)你閱讀完第一個源碼再去閱讀下一個的時候,你自然而然地會帶著批判或者說挑剔的眼光去閱讀:為什么這個功能在我之前看的源碼中是那樣實(shí)現(xiàn)的,而在這里會是這樣實(shí)現(xiàn)的?這其中的道理在哪里,哪種實(shí)現(xiàn)方式更優(yōu)秀呢?通過這樣的對比及探索,你會發(fā)現(xiàn),自己的進(jìn)步快得難以想象。
好了,總結(jié)一下。
這篇呢,Z哥和你分享了我對「閱讀源碼的必要性」這件事的看法。
我認(rèn)為閱讀源碼和寫作類似,相比自己琢磨、頓悟,更快的方式是通過借助、參考別人的思想成果來提升自己。當(dāng)然,它的價值不僅僅用于面試,至少還有四個長期價值。
在工作中更快地上手新項目
給自己創(chuàng)造用新技術(shù)的機(jī)會
完善知識體系
學(xué)習(xí)別人的設(shè)計思路
不知道你對于閱讀源碼的態(tài)度是什么?歡迎在評論區(qū)分享你的看法。我后續(xù)打算再寫一篇如何閱讀源碼,敬請期待。
推薦閱讀:
原創(chuàng)不易,如果你覺得這篇文章還不錯,就「在看」或者「分享」一下吧。鼓勵我的創(chuàng)作 :)
如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運(yùn)營的困惑
可以試試點(diǎn)擊「閱讀原文」
評論
圖片
表情
