日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > strongerHuang
[導(dǎo)讀]來(lái)源| 嵌入式客棧有小伙伴問(wèn):如何能快速提升編程能力?這感覺(jué)永遠(yuǎn)沒(méi)有正確答案,每個(gè)人都有自己的套路,今天就來(lái)聊聊我對(duì)這個(gè)問(wèn)題的看法:學(xué)會(huì)高效讀代碼,就是一個(gè)不錯(cuò)的辦法。閱讀代碼,可能和寫(xiě)代碼一樣重要!為什么要會(huì)讀代碼?考慮這樣一些場(chǎng)景:Case1:你還在讀書(shū),照著教程,...

來(lái)源 | 嵌入式客棧
有小伙伴問(wèn):如何能快速提升編程能力?這感覺(jué)永遠(yuǎn)沒(méi)有正確答案,每個(gè)人都有自己的套路,今天就來(lái)聊聊我對(duì)這個(gè)問(wèn)題的看法:
學(xué)會(huì)高效讀代碼,就是一個(gè)不錯(cuò)的辦法。閱讀代碼,可能和寫(xiě)代碼一樣重要!

為什么要會(huì)讀代碼?

考慮這樣一些場(chǎng)景:
  • Case 1: 你還在讀書(shū),照著教程,照著例子,學(xué)習(xí)編程。剛開(kāi)始,大概率是先讀別人的代碼,理解別人的代碼,而非一上來(lái),就開(kāi)始寫(xiě)。

這是我YY的一個(gè)學(xué)寫(xiě)代碼的學(xué)習(xí)模型,所以讀了,理解了,在自己就可以發(fā)揮了,然后書(shū)本上、他人的知識(shí),就流進(jìn)了自己的腦瓜了。
  • Case 2: 一個(gè)職場(chǎng)新人,一進(jìn)公司,就加入一個(gè)項(xiàng)目組,那項(xiàng)目代碼真是海了去了!然后老大可能給你一個(gè)小小的活,在現(xiàn)有基礎(chǔ)上,添加一個(gè)小功能。項(xiàng)目經(jīng)驗(yàn)少的童鞋,一下就傻眼了,特么的,這代碼這么多行,文件幾百上千!該從何入手呢?別說(shuō)改了,看都看不懂!完了,試用期是不是就要被干掉?!
  • Case 3: 你進(jìn)了一個(gè)小公司,技術(shù)管理混亂,前任已閃人,你受命接任一個(gè)一坨翔一樣的項(xiàng)目,那代碼寫(xiě)的真是云里霧里,工期又緊,老板又逼著出貨,怎么辦?閃人?可是下家會(huì)更好么?跳槽往往是從一個(gè)坑里,跳到另一個(gè)坑里。所以讀吧,總是要讀的。。。
  • Case n: ......
學(xué)校往往教授的是如何寫(xiě)代碼,可能從沒(méi)有教如何讀代碼。
然而,理想很豐滿(mǎn),現(xiàn)實(shí)很骨感!工作中,你寫(xiě)代碼的時(shí)間可能只占工作時(shí)間很少很少的一部分,大部分時(shí)間你可能都是在閱讀已有的代碼,當(dāng)然除非這個(gè)項(xiàng)目從0到1都是你一個(gè)人干,可即便是自己寫(xiě)代碼,也是漸進(jìn)增長(zhǎng)、不斷迭代的,也需要不斷反復(fù)閱讀自己寫(xiě)的代碼。
再者,編程與寫(xiě)文章,有異曲同工之處。編程與寫(xiě)作相似之處,都是用語(yǔ)言表達(dá)寫(xiě)作者的想法。
對(duì)于如何提升寫(xiě)作,古人曾講:熟讀唐詩(shī)三百首,不會(huì)作詩(shī)也會(huì)吟?;叵雽W(xué)生時(shí)代,老師也常說(shuō):讀書(shū)破萬(wàn)卷,下筆如有神!強(qiáng)調(diào)寫(xiě)作需要大量閱讀,讀的多了,寫(xiě)作能力也會(huì)相應(yīng)提升。閱讀之于寫(xiě)作,相輔相成,互為促進(jìn)。
那么大量閱讀別人的代碼,也能提升自己的編程水平。閱讀代碼,個(gè)人覺(jué)得會(huì)有這樣些好處:

博采眾長(zhǎng)

優(yōu)秀的源碼,就如傳世佳作一樣,值得反復(fù)揣摩,細(xì)細(xì)品味。其編寫(xiě)技巧、設(shè)計(jì)范式、架構(gòu)思想,都具有極大的學(xué)習(xí)借鑒價(jià)值。比如一些優(yōu)秀的開(kāi)源項(xiàng)目:Linux內(nèi)核、lwIP、u-boot等等。這些作品都匯集了全球優(yōu)秀頂級(jí)程序員的思想智慧。都是非常優(yōu)秀的作品,廣為流傳,廣為應(yīng)用。如果能花些時(shí)間去閱讀理解一下其代碼,一定是大有裨益的。
正如牛頓所說(shuō):如果我能比別人看的更遠(yuǎn),只因?yàn)槲艺驹诰奕说募缟稀?br />

解決難題

編程生涯中,總會(huì)遇到一些感動(dòng)束手無(wú)策的場(chǎng)景。github,搜索都已無(wú)能為力的時(shí)候。如果說(shuō)還沒(méi)遇到,那一定是機(jī)緣未到~

比如做Linux編程的時(shí)候,遇到某個(gè)API出錯(cuò),或許在網(wǎng)上查找半天,都找不到答案。實(shí)在找不到答案了,嘗試讀一讀內(nèi)核底層相關(guān)代碼,有時(shí)候就能發(fā)現(xiàn)問(wèn)題的原因。
開(kāi)闊視野

很多時(shí)候,日常工作內(nèi)容或許只是很小的領(lǐng)域,修復(fù)一些小的bug,修改一些小的功能等。如果只專(zhuān)注這些小的點(diǎn),個(gè)人成長(zhǎng)一定會(huì)受到局限。

如果能善于發(fā)現(xiàn)一些新的感興趣的領(lǐng)域,并去閱讀相關(guān)的代碼,則一定會(huì)提升自己的編程能力的。
所以為什么要讀代碼呢?


  • 找bug
  • review別人的代碼
  • 學(xué)習(xí)
  • 維護(hù)等

如何閱讀代碼呢?

這里聊聊我的一些體會(huì),也未必都對(duì),也未必適合其他的朋友。分享以作交流,如有其他想法,也歡迎大家留言交流。

先粗后細(xì)

我一般拿到一份別人的代碼,會(huì)先去找這個(gè)項(xiàng)目的入口,先梳理個(gè)大概的脈絡(luò)。如單片機(jī)程序,一般會(huì)從下面幾個(gè)角度先掃一遍:
  • main在哪里?
  • 開(kāi)了幾個(gè)任務(wù)?
  • 哪些是關(guān)鍵任務(wù),主要功能鏈?zhǔn)窃趺礃拥模?/span>
  • 任務(wù)間如何協(xié)作的?任務(wù)的執(zhí)行周期是如何安排的?
  • 使用哪些硬件外設(shè)?
  • 使用了哪些中斷?中斷與哪些任務(wù)發(fā)生了交互?
  • 從軟件角度看,大致有哪些子系統(tǒng)?
  • 是否有關(guān)鍵算法?
  • 是否使用開(kāi)源組件?
  • ......
先不關(guān)心很細(xì)的函數(shù)具體怎么寫(xiě),數(shù)據(jù)結(jié)構(gòu)是如何設(shè)計(jì)的?這樣,我大致能先有一個(gè)總體認(rèn)識(shí),然后在對(duì)自己感興趣的進(jìn)行細(xì)讀。當(dāng)然如果是review別人的代碼則就另當(dāng)別論了。
如果是Linux應(yīng)用程序,或者C 應(yīng)用程序,我也大致采用差不多的思路,先讀個(gè)大概,然后再細(xì)讀。比如對(duì)一個(gè)Linux應(yīng)用程序,會(huì)先了解這些方面的概要信息:
  • 入口在哪個(gè)文件?一般都是main函數(shù)。
  • 是否支持命令行傳啟動(dòng)參數(shù)?
  • 是否是守護(hù)進(jìn)程?
  • 開(kāi)了哪些線(xiàn)程?
  • 大致有哪些子系統(tǒng)?
  • 使用了哪些開(kāi)源組件?
  • 是否使用驅(qū)動(dòng),是否有通訊等?
  • ......
如果項(xiàng)目采用cmake或者makefile進(jìn)行組織的,那么先閱讀下makefile也會(huì)是了解項(xiàng)目概要信息的一個(gè)比較好的切入點(diǎn)。

善做筆記

在閱讀代碼的概要信息的時(shí)候,我比較喜歡做做筆記,畫(huà)畫(huà)圖。在閱讀代碼的時(shí)候,我比較喜歡先去研究代碼中的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)往往會(huì)體現(xiàn)作者抽象問(wèn)題、對(duì)問(wèn)題建模的一些思路,并使用UML圖畫(huà)出來(lái),剛開(kāi)始可能都不去看每個(gè)函數(shù)是怎么實(shí)現(xiàn)的,只關(guān)心與這些數(shù)據(jù)結(jié)構(gòu)相關(guān)有哪些函數(shù)以及數(shù)據(jù)結(jié)構(gòu)間關(guān)系。
“Bad programmers worry about the code. Good programmers worry about data structures and their relationships.”


— Linus Torvalds


或許,有的朋友會(huì)說(shuō),UML不會(huì)。不會(huì)沒(méi)關(guān)系,用你習(xí)慣自己能看懂的方式都可以,而且即便是用UML也不必過(guò)分糾結(jié)繪制的圖是否嚴(yán)謹(jǐn)。甚至拿支筆在筆記上手繪也可以。不過(guò)個(gè)人更建議,盡量寫(xiě)電子筆記,更容易保存和查閱。
閱讀某一個(gè)具體函數(shù)時(shí),如果函數(shù)內(nèi)或者模塊內(nèi)具有狀態(tài)機(jī),如果這部分是需要仔細(xì)理解的時(shí)候,我就會(huì)將其狀態(tài)機(jī)圖,先繪制出來(lái)。比如,之前寫(xiě)的modbus協(xié)議中的狀態(tài)圖:

這樣做有個(gè)好處,邊繪圖邊去理解代碼,就會(huì)加速對(duì)代碼的理解,對(duì)我來(lái)說(shuō),我如果只用兩只眼睛盯著看,和一邊看一比畫(huà)圖效率會(huì)低很多。
這樣做還有一個(gè)好處,可以將理解以圖的形式記錄下來(lái),如果光用圖還不能表達(dá)清楚的時(shí)候,我還會(huì)再加點(diǎn)文字描述。時(shí)間過(guò)了很久之后,再來(lái)看代碼,可能之前的理解全忘了,可是如果有這樣一份圖文并茂的筆記,我就會(huì)很快找回記憶。
善用工具

比如source insght, vs code等工具,都是提高閱讀代碼效率的好工具。盡量熟悉如何使用鍵盤(pán)控制閱讀跳轉(zhuǎn),用熟了,效率倍增。

另外,還有些工具,可以自動(dòng)將代碼轉(zhuǎn)化成類(lèi)圖等,比如visual studio,可以自動(dòng)繪制類(lèi)圖,Enterprise Architect也具有根據(jù)代碼生成類(lèi)圖的功能。具有此類(lèi)功能的軟件還有很多。有興趣可以搜索一下。

多多調(diào)試

如果遇到有的代碼,怎么看也理解不了。這時(shí)候可以試著加些打印日志,運(yùn)行調(diào)試一下,也可以使用調(diào)試工具進(jìn)行斷點(diǎn)、單步調(diào)試,觀(guān)察程序運(yùn)行的軌跡,數(shù)據(jù)的變化情況,可能就找到了突破口。
或者嘗試對(duì)原有的代碼,做些小的修改,來(lái)印證理解,也是不錯(cuò)的方法。
一個(gè)經(jīng)常調(diào)試的程序猿,鍵盤(pán)上F10,F11這些鍵大都?jí)牡谋容^快。

總結(jié)一下

把自己閱讀代碼的一些體會(huì)分享一下,每個(gè)人都會(huì)有適合自己的方法。利用適合自己的方法,高效的閱讀代碼,是提升編程的一個(gè)行之有效的辦法。
如果我講的這些,如對(duì)你有所啟發(fā),也不妨點(diǎn)個(gè)贊或者再看,小小的鼓勵(lì)一下我。當(dāng)然你如愿意擴(kuò)散分享,那就感激不盡啦。

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉