RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

學(xué)會(huì)讀源碼特別重要

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2020-12-31 10:29 ? 次閱讀

剛參加工作那會(huì),沒(méi)想過(guò)去讀源碼,更沒(méi)想過(guò)去改框架的源碼;總想著別人的框架應(yīng)該是完美的、萬(wàn)能的,應(yīng)該不需要改;另外即使我改了源碼,怎么樣讓我的改動(dòng)生效了?項(xiàng)目中引用的不還是沒(méi)改的jar包嗎。回想起來(lái)覺(jué)得那時(shí)候的想法確實(shí)挺......

工作了一年多之后準(zhǔn)備跳槽了,開(kāi)始了一輪的面試,其中有幾個(gè)面試官就問(wèn)到了相關(guān)的源碼問(wèn)題:ArrayList、HashMap的底層實(shí)現(xiàn),spring、mybatis的相關(guān)源碼。問(wèn)源碼的面試一般就是回去等消息,然后就沒(méi)然后了。那時(shí)候開(kāi)始意識(shí)到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識(shí)的開(kāi)始了jdk部分源碼的閱讀(主要是集合)。一開(kāi)始看源碼,看的特別糙,知道個(gè)大概,知道ArrayList的底層實(shí)現(xiàn)是數(shù)組,HashMap的底層是散列表(數(shù)組+鏈表);更深入一點(diǎn)的擴(kuò)容、hash碰撞等等就不知道了。

讀spring源碼起于工作中遇到了一個(gè)問(wèn)題(spring jdbcTemplate事務(wù),各種詭異,包你醍醐灌頂!),排查一段時(shí)間最終是解決了,但過(guò)程讓我非常難受,各種上網(wǎng)查資料、各種嘗試,感覺(jué)就像大海撈針一樣,遙遙無(wú)期。我下定決心,我要看一看spring的源碼,于是我買(mǎi)了一本《spring源碼深度解析》,結(jié)合著這本書(shū)、打開(kāi)著eclipse,開(kāi)始了spring的源碼閱讀之旅。至此,讀源碼成了習(xí)慣,源碼已經(jīng)進(jìn)入了我的心里。

后來(lái),springboot的火熱,讓我也想蹭上一蹭,于是有了springboot的啟動(dòng)源碼系列,雖然還在進(jìn)行中,但是我相信我能將其完成;工作中用到了shiro,我又結(jié)合著《跟我學(xué)shiro》將shiro的源碼看了個(gè)大概,有了shiro源碼系列博文,還差一篇認(rèn)證與授權(quán)(應(yīng)該很快就能面世),shiro源碼系列就封筆了。最近在搭建自己的后臺(tái)管理系統(tǒng),用到了quartz,集成的過(guò)程也遇到了一些問(wèn)題,因此有了quartz的三篇文章。

慢慢的,從一味的網(wǎng)上找資料變成了很多時(shí)候會(huì)從源碼中找答案。不求能讀太多的源碼,但愿自己接觸的技術(shù)都能讀上一讀,路漫漫其修遠(yuǎn)兮,吾將上下而求索!

我為什么讀源碼

很多人一定和我一樣的感受:源碼在工作中有用嗎?用處大嗎?很長(zhǎng)一段時(shí)間內(nèi)我也有這樣的疑問(wèn),認(rèn)為哪些有事沒(méi)事扯源碼的人就是在裝,只是為了提高他們的逼格而已。

那為什么我還要讀源碼呢?一剛開(kāi)始為了面試,后來(lái)為了解決工作中的問(wèn)題,再后來(lái)就是個(gè)人喜好了。說(shuō)的好聽(tīng)點(diǎn)是有匠人精神;說(shuō)的委婉點(diǎn)是好奇(底層是怎么實(shí)現(xiàn)的);說(shuō)的不自信點(diǎn)是對(duì)黑盒的東西我用的沒(méi)底,怕用錯(cuò);說(shuō)的簡(jiǎn)單直白點(diǎn)是提升自我價(jià)值,為了更高的薪資待遇(這里對(duì)真正的技術(shù)迷說(shuō)聲抱歉)。

源碼中我們可以學(xué)到很多東西,學(xué)習(xí)別人高效的代碼書(shū)寫(xiě)、學(xué)習(xí)別人對(duì)設(shè)計(jì)模式的熟練使用、學(xué)習(xí)別人對(duì)整個(gè)架構(gòu)的布局,等等。如果你還能找出其中的不足,那么恭喜你,你要飛升了!會(huì)使用固然重要,但知道為什么這么使用同樣重要。從模仿中學(xué)習(xí),從模仿中創(chuàng)新。

讀源碼不像圍城(外面的人想進(jìn)來(lái),里面的人想出去),它是外面的人不想進(jìn)來(lái),里面的人不想出去;當(dāng)我們跨進(jìn)城內(nèi),你會(huì)發(fā)現(xiàn)(還是城外好,皮!)城內(nèi)風(fēng)光無(wú)限,源碼的海洋任我們遨游!

你想好入城了嗎?

我是怎么樣讀源碼的

內(nèi)容了解

首先我們要對(duì)我們的目標(biāo)有所了解,知道她有什么特點(diǎn),有些什么功能。對(duì)對(duì)方都還不了解,就想著進(jìn)入別人的內(nèi)心世界,那不是臭不要臉嘛,我們要做一個(gè)有著流氓心的紳士;對(duì)她有個(gè)大致的了解了,就可以發(fā)起攻勢(shì),一舉拿下。

那么怎么樣了解了,方式有很多,我這里提供幾種,僅供參考

最好的方式就是官方參考指南,親生父母往往對(duì)孩子是最了解的,對(duì)孩子的描述也是最詳細(xì)的;比如Spring Boot Reference Guide就是對(duì)springboot最詳細(xì)的描述,怎么樣使用springboot、springboot特性等等,通過(guò)此指南,springboot在你面前一覽無(wú)遺;但是,springboot畢竟是外國(guó)人的孩子,如果英語(yǔ)不好,估計(jì)讀起來(lái)有點(diǎn)頭疼了,不過(guò)我們有g(shù)oogle翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老岳丈是非??犊模?/p>

其次是書(shū)籍,國(guó)外優(yōu)秀的有很多,國(guó)內(nèi)也不乏好書(shū),比較推薦此方式,自成體系,讓我們掌握的知識(shí)點(diǎn)不至于太散。這就是好比是源碼的閨蜜,對(duì)源碼非常了解,重點(diǎn)是挺大方,會(huì)盡全力幫助我們了解源碼。

再次就是博客,雖然可能覺(jué)得知識(shí)點(diǎn)比較散,但是針對(duì)某個(gè)知識(shí)點(diǎn)卻特別的細(xì),對(duì)徹底掌握非常有幫助,園子內(nèi)就有很多技術(shù)大牛,寫(xiě)的博客自然也是非常棒,非常具有學(xué)習(xí)價(jià)值。當(dāng)然還有社區(qū)、論壇、github、碼云等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關(guān)于源碼的信息。

設(shè)計(jì)模式的了解

優(yōu)秀的框架、技術(shù)從不乏設(shè)計(jì)模式;jdk源碼中就應(yīng)用了很多設(shè)計(jì)模式,比如IO流中的適配器模式與裝飾模式、GUI的觀察者模式、集合中的迭代器模式等等;spring源碼中也是用到了大量的設(shè)計(jì)模式。設(shè)計(jì)模式有什么優(yōu)點(diǎn)、各適用于什么場(chǎng)景,不是本文的內(nèi)容,需要我們大家自行去了解。

我們只需要對(duì)一些常用的設(shè)計(jì)模式有個(gè)大致了解,再去讀源碼是比較好的;不需要將23種設(shè)計(jì)模式都通讀,也不需要將常用設(shè)計(jì)模式完全理解透;對(duì)于全部通讀,我們時(shí)間有限,另外有些模式確實(shí)不太好理解、用的少,性?xún)r(jià)比不高,沒(méi)必要全部都讀。

推薦書(shū)籍:《Head First Design Patterns》(中文版:《Head First 設(shè)計(jì)模式》)、《Java與模式》;

常用設(shè)計(jì)模式:?jiǎn)卫J?、工廠模式、適配器模式、裝飾模式、外觀模式、代理模式、迭代器模式、觀察者模式、命令模式

另外我比較推薦的一種學(xué)習(xí)設(shè)計(jì)模式的方式是讀別人博客:java_my_life,劉偉技術(shù)博客,chenssy的設(shè)計(jì)模式;

設(shè)計(jì)模式之于源碼,就好比逛街購(gòu)物之于女人,想順利勾搭源碼,我們需要好好掌握設(shè)計(jì)模式這個(gè)套路。

配合ide進(jìn)行斷點(diǎn)追蹤

我們通過(guò)源碼的圈子對(duì)源碼的了解終究只是停在表面,終究還是沒(méi)有走進(jìn)她的內(nèi)心,接下來(lái)我就和大家分享下,我是如何走進(jìn)她的內(nèi)心的!

相信看過(guò)我的源碼博客的小伙伴都知道,我非常喜歡通過(guò)idea斷點(diǎn)來(lái)進(jìn)行源碼追蹤,斷點(diǎn)追蹤源碼是我非常推薦的一種方式。斷點(diǎn)不僅可以用來(lái)調(diào)試我們的代碼,也可以用來(lái)調(diào)試我們用到的框架源碼。面對(duì)未知的、茫茫多的源碼,我們往往沒(méi)有足夠的時(shí)間、經(jīng)歷和耐心去通讀所有源碼,我們只需要去讀我們關(guān)注的部分即可(有人可能會(huì)說(shuō)我都不關(guān)心,這...)。

那為什么要用斷掉調(diào)試的方式來(lái)跟源碼,而不是直接從源代碼入手去跟我們關(guān)注的部分呢?嘗試過(guò)的小伙伴應(yīng)該知道,如果我們對(duì)源碼不熟悉,直接通過(guò)源碼的方式去跟,一方面很容易迷路(多態(tài),會(huì)有很多子類(lèi)實(shí)現(xiàn)),不知道接下來(lái)跟哪一個(gè),另一方面也很容易跟丟,當(dāng)我們跟入的很深的時(shí)候,很有可能就忘記上一步跟到哪了。

下面我會(huì)舉例來(lái)說(shuō)明我是如何進(jìn)行斷點(diǎn)追蹤的,以spring-boot-2.0.3之quartz集成,不是你想的那樣哦!和 spring-boot-2.0.3之quartz集成,數(shù)據(jù)源問(wèn)題,源碼探究為背景來(lái)講,需要搞清楚兩個(gè)點(diǎn):springboot是如何向quartz注入數(shù)據(jù)源的,quartz是如何操作數(shù)據(jù)庫(kù)的

springboot向quartz注入數(shù)據(jù)源

QuartzAutoConfiguration是springboot自動(dòng)配置quartz的入口

quartz的配置屬性設(shè)置給SchedulerFactoryBean;將數(shù)據(jù)源設(shè)置給SchedulerFactoryBean:如果有@QuartzDataSource修飾的數(shù)據(jù)源,則將@QuartzDataSource修飾的數(shù)據(jù)源設(shè)置給SchedulerFactoryBean,否則將應(yīng)用的數(shù)據(jù)源(druid數(shù)據(jù)源)設(shè)置給SchedulerFactoryBean,顯然我們的應(yīng)用中沒(méi)有@QuartzDataSource修飾的數(shù)據(jù)源,那么SchedulerFactoryBean中的數(shù)據(jù)源就是應(yīng)用的數(shù)據(jù)源;將事務(wù)管理器設(shè)置給SchedulerFactoryBean。SchedulerFactoryBean,負(fù)責(zé)創(chuàng)建和配置quartz Scheduler,并將其注冊(cè)到spring容器中。SchedulerFactoryBean實(shí)現(xiàn)InitializingBean的afterPropertiesSet方法,里面有可以設(shè)置數(shù)據(jù)源的過(guò)程。

可以看到通過(guò)org.quartz.jobStore.dataSource設(shè)置的dsName(值為quartzDs)最后會(huì)被替換成springTxDataSource.加scheduler實(shí)例名(我們的應(yīng)用中是:springTxDataSource.quartzScheduler)。springboot會(huì)注冊(cè)兩個(gè)ConnectionProvider給quartz:一個(gè)dsName叫springTxDataSource.quartzScheduler,有事務(wù);一個(gè)dsName叫springNonTxDataSource.quartzScheduler,沒(méi)事務(wù)。

quartz如何操作數(shù)據(jù)庫(kù)

我們通過(guò)停止定時(shí)任務(wù)來(lái)跟下quartz對(duì)數(shù)據(jù)庫(kù)的操作

發(fā)現(xiàn)quartz用如下方式獲取connection

conn = DBConnectionManager.getInstance().getConnection(getDataSource());

那么我們的job中就可以按如下方式操作數(shù)據(jù)庫(kù)了

View Code

明確我們的目的,找到合適的切入點(diǎn),進(jìn)入斷點(diǎn)調(diào)試追蹤也就容易了。

任我說(shuō)的天花亂墜,你仍無(wú)動(dòng)于衷,那也只是我一廂情愿,只有局中人才能體會(huì)到其中的奧妙!

總結(jié)與感悟

從上至下全部通讀的方式,個(gè)人不太推薦,這是建立在很熟悉的基礎(chǔ)上的,當(dāng)我們對(duì)某個(gè)框架已經(jīng)比較熟悉了,再?gòu)纳现料逻M(jìn)行通讀,徹底了解,這是我認(rèn)為正確的方式;但是從不熟悉到熟悉這個(gè)過(guò)程,個(gè)人不推薦全部通讀,而是推薦上面我推薦的方式 - 斷點(diǎn)局部追蹤。

很多時(shí)候,我們的博文都只是授之以魚(yú),而我們也只是從中得到魚(yú);而這篇的目的則是授之以漁,我希望大家從中學(xué)到捕魚(yú)的方法,而不是一味的等待別人的魚(yú);希望大家能夠自給自足,也能把魚(yú)和漁都授予其他人。

只要我們開(kāi)始去讀源碼,慢慢的就會(huì)形成自己的一套讀源碼的方式;每個(gè)人的方式都不一樣,合適自己的才是最好的。行動(dòng)起來(lái),用合適的方式去俘獲你的的她吧!

責(zé)任編輯:xj

原文標(biāo)題:學(xué)會(huì)讀源碼,很重要!

文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    639

    瀏覽量

    29185
  • 程序員
    +關(guān)注

    關(guān)注

    4

    文章

    951

    瀏覽量

    29798

原文標(biāo)題:學(xué)會(huì)讀源碼,很重要!

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    工業(yè)級(jí)碼器用固定焦距還是變焦好?

    工業(yè)級(jí)碼器在工業(yè)自動(dòng)化領(lǐng)域扮演著至關(guān)重要的角色,其性能優(yōu)劣直接影響到生產(chǎn)線的效率和產(chǎn)品質(zhì)量。而在選擇工業(yè)級(jí)碼器時(shí),固定焦距和變焦焦距之間的選擇常常成為討論的焦點(diǎn)。本文將深入探討這兩種焦距類(lèi)型
    的頭像 發(fā)表于 11-21 15:40 ?147次閱讀
    工業(yè)級(jí)<b class='flag-5'>讀</b>碼器用固定焦距還是變焦好?

    基于無(wú)操作系統(tǒng)的STM32單片機(jī)開(kāi)發(fā)附源碼

    現(xiàn)在非常多的的MCU性能都還不錯(cuò),同時(shí)用戶(hù)也會(huì)去擴(kuò)展一些外部RAM,這樣如果高效便捷的管理這些內(nèi)存是一個(gè)重要話題。 今天給大家分享一份源碼:基于無(wú)操作系統(tǒng)的STM32單片機(jī)開(kāi)發(fā),功能強(qiáng)大,可申請(qǐng)
    的頭像 發(fā)表于 11-15 11:24 ?421次閱讀

    生產(chǎn)線用條碼碼器介紹

    工業(yè)碼器是一種專(zhuān)門(mén)用于讀取各種條碼信息的工業(yè)設(shè)備。在工業(yè)應(yīng)用中,碼器經(jīng)常用于自動(dòng)識(shí)別產(chǎn)品、包裝和配件上的編碼信息,以支持物料管理、生產(chǎn)計(jì)劃、物流和配送的自動(dòng)化。常見(jiàn)的工業(yè)條碼閱讀器包括激光讀碼器
    的頭像 發(fā)表于 08-29 15:50 ?208次閱讀
    生產(chǎn)線用條碼<b class='flag-5'>讀</b>碼器介紹

    UCGUI單片機(jī)源碼

    UCGUI單片機(jī)源碼
    發(fā)表于 07-04 17:11 ?1次下載

    固定碼器怎么選型 工業(yè)二維碼碼器推薦

    碼器選型是一項(xiàng)重要的決策過(guò)程,涉及到多個(gè)因素的考慮。在選擇碼器時(shí),我們需要根據(jù)實(shí)際應(yīng)用環(huán)境、使用方式、預(yù)算、需求以及與其他設(shè)備或系統(tǒng)的兼容性等方面進(jìn)行綜合評(píng)估。本文將為您詳細(xì)解讀讀碼器選型
    的頭像 發(fā)表于 06-24 14:19 ?357次閱讀
    固定<b class='flag-5'>讀</b>碼器怎么選型 工業(yè)二維碼<b class='flag-5'>讀</b>碼器推薦

    浙大博導(dǎo)開(kāi)源飛控planner源碼

    浙大博導(dǎo)開(kāi)源飛控planner源碼
    發(fā)表于 06-12 11:43 ?4次下載

    labview實(shí)例源碼之控壓取樣系統(tǒng)

    labview源碼,包含報(bào)表、曲線、通訊等
    發(fā)表于 06-06 11:23 ?1次下載

    揭秘RFID標(biāo)簽漏真相,如何減少RFID標(biāo)簽漏問(wèn)題

    的標(biāo)簽的讀取率是一個(gè)非常重要的因素。因?yàn)榕孔x取,除了讀取速度以外,是否能夠保證不錯(cuò)讀不漏,是精細(xì)化管理的一個(gè)重要關(guān)鍵。 影響讀取率的因素有很多。雖然在實(shí)驗(yàn)室中我們可以清楚的測(cè)量到
    的頭像 發(fā)表于 05-30 16:08 ?376次閱讀

    什么是源碼源碼有什么作用?源碼組件是什么?源碼可二次開(kāi)發(fā)嗎?

    源碼,也稱(chēng)為源程序,是指未編譯的按照一定的程序設(shè)計(jì)語(yǔ)言規(guī)范書(shū)寫(xiě)的文本文件,是一系列人類(lèi)可讀的計(jì)算機(jī)語(yǔ)言指令。
    的頭像 發(fā)表于 05-25 14:55 ?1.5w次閱讀
    什么是<b class='flag-5'>源碼</b>?<b class='flag-5'>源碼</b>有什么作用?<b class='flag-5'>源碼</b>組件是什么?<b class='flag-5'>源碼</b>可二次開(kāi)發(fā)嗎?

    條碼識(shí)模塊 掃描模組

    碼器模組
    深圳市遠(yuǎn)景達(dá)物聯(lián)網(wǎng)技術(shù)有限公司
    發(fā)布于 :2024年04月23日 16:18:08

    內(nèi)核(linux-3.12)的文件系統(tǒng)預(yù)設(shè)計(jì)和實(shí)現(xiàn)

    第一次進(jìn)入內(nèi)核處理流程時(shí),在page cache中查找該offset對(duì)應(yīng)的頁(yè)面是否緩存,因?yàn)槭状?b class='flag-5'>讀,緩存未命中,觸發(fā)一次同步預(yù)。
    發(fā)表于 04-12 14:26 ?273次閱讀
    內(nèi)核(linux-3.12)的文件系統(tǒng)預(yù)<b class='flag-5'>讀</b>設(shè)計(jì)和實(shí)現(xiàn)

    快速學(xué)會(huì) OrCAD Capture CIS

    電子發(fā)燒友網(wǎng)站提供《快速學(xué)會(huì) OrCAD Capture CIS .pdf》資料免費(fèi)下載
    發(fā)表于 02-29 09:27 ?20次下載

    基于相機(jī)技術(shù)的工業(yè)級(jí)多碼碼器——DC200碼器

    作為一款基于相機(jī)技術(shù)的工業(yè)級(jí)多碼碼器,IDC200碼器可以識(shí)別各種傳統(tǒng)的一維碼和二維碼,包括各種材料上的印刷條碼、點(diǎn)針打標(biāo)碼、激光打標(biāo)碼和DPM碼(直接部件打標(biāo))。
    的頭像 發(fā)表于 01-26 14:34 ?951次閱讀
    基于相機(jī)技術(shù)的工業(yè)級(jí)多碼<b class='flag-5'>讀</b>碼器——DC200<b class='flag-5'>讀</b>碼器

    DataMan 380大視野高速AI碼硬實(shí)力概述

    隨著碼器技術(shù)的不斷更新迭代,大視野高速應(yīng)用成為當(dāng)前工業(yè)碼領(lǐng)域的關(guān)鍵發(fā)展方向。
    的頭像 發(fā)表于 01-11 10:37 ?522次閱讀
    DataMan 380大視野高速AI<b class='flag-5'>讀</b>碼硬實(shí)力概述

    C#網(wǎng)絡(luò)串口調(diào)試助手源碼

    非常牛B網(wǎng)絡(luò)串口調(diào)試助手C#源碼,支持添加多條協(xié)議
    發(fā)表于 12-27 09:45 ?4次下載
    RM新时代网站-首页