源碼怎麼學
剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應該是完美的、萬能的,應該不需要改;另外即使我改了源碼,怎麼樣讓我的改動生效了?項目中引用的不還是沒改的jar包嗎。回想起來覺得那時候的想法確實挺??
工作了一年多之後准備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關的源碼問題:ArrayList、HashMap的底層實現,spring、mybatis的相關源碼。問源碼的面試一般就是回去等消息,然後就沒然後了。
那時候開始意識到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識的開始了jdk部分源碼的閱讀(主要是集合)。一開始看源碼,看的特別糙,知道個大概,知道ArrayList的底層實現是數組,HashMap的底層是散列表(數組+鏈表);更深入一點的擴容、hash碰撞等等就不知道了。
讀spring源碼起於工作中遇到了一個問題(spring jdbcTemplate事務,各種詭異,包你醍醐灌頂!),排查一段時間最終是解決了,但過程讓我非常難受,各種上網查資料、各種嘗試,感覺就像大海撈針一樣,遙遙無期。我下定決心,我要看一看spring的源碼,於是我買了一本《spring源碼深度解析》,結合著這本書、打開著eclipse,開始了spring的源碼閱讀之旅。至此,讀源碼成了習慣,源碼已經進入了我的心裡。
後來,springboot的火熱,讓我也想蹭上一蹭,於是有了springboot的啟動源碼系列,雖然還在進行中,但是我相信我能將其完成;工作中用到了shiro,我又結合著《跟我學shiro》將shiro的源碼看了個大概,有了shiro源碼系列博文,還差一篇認證與授權(應該很快就能面世),shiro源碼系列就封筆了。最近在搭建自己的後台管理系統,用到了quartz,集成的過程也遇到了一些問題,因此有了quartz的兩篇文章。
慢慢的,從一味的網上找資料變成了很多時候會從源碼中找答案。不求能讀太多的源碼,但願自己接觸的技術都能讀上一讀,路漫漫其修遠兮,吾將上下而求索!
大家為什麼要讀源碼?
很多人一定和我一樣的感受:源碼在工作中有用嗎?用處大嗎?很長一段時間內我也有這樣的疑問,認為哪些有事沒事扯源碼的人就是在裝,只是為了提高他們的逼格而已。
那為什麼我還要讀源碼呢?一剛開始為了面試,後來為了解決工作中的問題,再後來就是個人喜好了。說的好聽點是有匠人精神;說的委婉點是好奇(底層是怎麼實現的);說的不自信點是對黑盒的東西我用的沒底,怕用錯;說的簡單直白點是提升自我價值,為了更高的薪資待遇(這里對真正的技術迷說聲抱歉)。
源碼中我們可以學到很多東西,學習別人高效的代碼書寫、學習別人對設計模式的熟練使用、學習別人對整個架構的布局,等等。如果你還能找出其中的不足,那麼恭喜你,你要飛升了!會使用固然重要,但知道為什麼這么使用同樣重要。從模仿中學習,從模仿中創新。
讀源碼不像圍城(外面的人想進來,裡面的人想出去),它是外面的人不想進來,裡面的人不想出去;當我們跨進城內,你會發現(還是城外好,皮!)城內風光無限,源碼的海洋任我們遨遊!
首先我們要對我們的目標有所了解,知道她有什麼特點,有些什麼功能。對對方都還不了解,就想著進入別人的內心世界,那不是臭不要臉嘛,我們要做一個有著流氓心的紳士;對她有個大致的了解了,就可以發起攻勢,一舉拿下。
那麼怎麼樣了解了,方式有很多,我這里提供幾種,僅供參考
最好的方式就是官方參考指南,親生父母往往對孩子是最了解的,對孩子的描述也是最詳細的;比如Spring Boot Reference Guide就是對springboot最詳細的描述,怎麼樣使用springboot、springboot特性等等,通過此指南,springboot在你面前一覽無遺;
但是,springboot畢竟是外國人的孩子,如果英語不好,估計讀起來有點頭疼了,不過我們有google翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老岳丈是非常慷慨的!
其次是書籍,國外優秀的有很多,國內也不乏好書,比較推薦此方式,自成體系,讓我們掌握的知識點不至於太散。這就是好比是源碼的閨蜜,對源碼非常了解,重點是挺大方,會盡全力幫助我們了解源碼。
再次就是博客,雖然可能覺得知識點比較散,但是針對某個知識點卻特別的細,對徹底掌握非常有幫助,園子內就有很多技術大牛,寫的博客自然也是非常棒,非常具有學習價值。當然還有社區、論壇、github、碼雲等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關於源碼的信息。
設計模式的了解
優秀的框架、技術從不乏設計模式;jdk源碼中就應用了很多設計模式,比如IO流中的適配器模式與裝飾模式、GUI的觀察者模式、集合中的迭代器模式等等;spring源碼中也是用到了大量的設計模式。設計模式有什麼優點、各適用於什麼場景,不是本文的內容,需要我們大家自行去了解。
我們只需要對一些常用的設計模式有個大致了解,再去讀源碼是比較好的;不需要將23種設計模式都通讀,也不需要將常用設計模式完全理解透;對於全部通讀,我們時間有限,另外有些模式確實不太好理解、用的少,性價比不高,沒必要全部都讀。
推薦書籍:《Head First Design Patterns》(中文版:《Head First 設計模式》)、《Java與模式》;
另外我比較推薦的一種學習設計模式的方式是讀別人博客:java_my_life,劉偉技術博客,chenssy的設計模式;
設計模式之於源碼,就好比逛街購物之於女人,想順利勾搭源碼,我們需要好好掌握設計模式這個套路。
配合ide進行斷點追蹤
我們通過源碼的圈子對源碼的了解終究只是停在表面,終究還是沒有走進她的內心,接下來我就和大家分享下,我是如何走進她的內心的!
相信看過我的源碼博客的小夥伴都知道,我非常喜歡通過idea斷點來進行源碼追蹤,斷點追蹤源碼是我非常推薦的一種方式。斷點不僅可以用來調試我們的代碼,也可以用來調試我們用到的框架源碼。
面對未知的、茫茫多的源碼,我們往往沒有足夠的時間、經歷和耐心去通讀所有源碼,我們只需要去讀我們關注的部分即可(有人可能會說我都不關心,這?)。那為什麼要用斷掉調試的方式來跟源碼,而不是直接從源代碼入手去跟我們關注的部分呢?
嘗試過的小夥伴應該知道,如果我們對源碼不熟悉,直接通過源碼的方式去跟,一方面很容易迷路(多態,會有很多子類實現),不知道接下來跟哪一個,另一方面也很容易跟丟,當我們跟入的很深的時候,很有可能就忘記上一步跟到哪了。所以讀源碼的重要性淺顯易懂了。
2. 一個完全入門初學者如何學代碼,讀代碼和寫代碼,,我想學代碼不知道方向誰能給我指明一個方向
1、學代碼:前提是你的有一個比較系統的學習。認真完成每一個課程中的案例。
2、讀代碼:分兩步走:前期能讀懂自己寫的代碼。 後期能讀懂他人寫的代碼和大致的知道底層的某些源碼的含義。多去看開發文檔(開發文檔建議使用官方提供的英文版、不要使用中文自己害自己)
3、寫代碼:前提是你要有基礎。
3. 代碼如何開始學習
建議你先學習C語言,C語言是最基礎的東西。
1、學代碼要有信心、恆心。
2、學代碼要由淺入深,從簡單到復雜。
拓展資料:
代碼就是程序員用開發工具所支持的語言寫出來的源文件,是一組由字元、符號或信號碼元以離散形式表示信息的明確的規則體系。代碼設計的原則包括唯一確定性、標准化和通用性、可擴充性與穩定性、便於識別與記憶、力求短小與格式統一以及容易修改等。源代碼是代碼的分支,某種意義上來說,源代碼相當於代碼。現代程序語言中,源代碼可以書籍或磁帶形式出現,但最為常用格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼最終目的是將人類可讀文本翻譯成為計算機可執行的二進制指令,這種過程叫編譯,它由通過編譯器完成。
(參考資料:代碼-網路)
4. 如何學習sqlite源碼
先來說說sqlite的資料.
首先sqlite的資料其實是不多不少的.
不少的原因是因為這些資料確實能夠讓你明白sqlite的設計原理.
說它不多的原因是也就讓你明白其原理, 僅此而已.
sqlite的資料主要來自四個地方, 從簡到深依次為:
1.<>, 這是一本介紹sqlite"基本原理"的小書, 只有80頁左右, 介紹了sqlite的"後端"原理. 這本書在網路有下載, 純英文版的, 鏈接:inside sqlite_網路知道. 在上面的github上, 我們項目的同伴對這本書做了翻譯, 不過還沒完成, 建議直接掃原版.
2.官方文檔, 連接:SQLite Documentation. 但是裡面的文檔對於學習者來說也有輕重之分, 建議主要閱讀 "SQLite Technical/Design Documentation" 這一欄的技術文檔.
3.<<SQLite Database System: Design and Implementation>>. 這也是一本說sqlite的小書, 不到200頁. 這本書的內容其實和<<inside sqlite>>有重疊, 甚至不少地方的段落是直接復制過來的... 不過這本書比<<inside sqlite>>詳細很多, 也建議掃描一遍. 這本書我目前在做翻譯, 做了3,4,5,6四章的翻譯了. 不過是很粗翻譯, 不建議直接看...
4.源碼注釋. sqlite的源碼注釋非常詳細, 詳細到比上面兩本書說的還多... sqlite的每份.c代碼內的注釋差不多快比代碼還多了, 而且除了將基本架構外, 很多上述資料沒有提到的細節, 也在源碼注釋中被提了出來.
================================================================
接下來說一下本人推薦的學習方法~~
================================================================
下面是認真學習的方法, 如果想快速暴力的學習, 直接看下一段.
想要認真點學習的話.
應該先去看"Architecture of SQLite"這篇文檔, 該文檔詳細的介紹了sqlite的7層結構, 總體被分為了"前段", "中層VM", "後端".
看完arch.html那文過後, 你就知道"前端"主要做的是語法分析, "後端"主要實現了資料庫性質(ACID, 增刪查改).
個人建議從後端開始學習, 畢竟學習sqlite是學習怎麼實現資料庫.
後端的tree, pager, os三層, 其實都不難(起碼理解起來不難),
我建議OS->PAGER->TREE這樣邊學習, 邊寫demo.
簡要說一下我在學習這三層過程中遇到的一些點, 希望能幫到樓主.
OS:
os是很薄的一層, 主要是為了提高可移植性而被設計出來的.
學習這一層的方法很粗暴:看"The OS Backend (VFS) To SQLite", 然後去看源碼中的"test_demovfs.c".
主要搞清下面三個結構體.
sqlite3_vfs
sqlite3_io_methods
sqlite3_file
在我github中的demo1.1中, 有一個更簡單的demo, 可以參考看下裡面的os.c, os.h, unix_os.c三份代碼.
-------------------------------------------------
Pager:
Pager主要實現了三段功能: ACID, log, cache.
先說ACID:
ACID的這部分我只看了最最基本的方法, 然後選擇跳過的, sqlite實現ACID的方法可以看"Atomic Commit In SQLite",
這里是我翻譯的, 能看,
"how-to-implement-a-DB-like-sqlite/SQLite怎樣實現原子性.md at master · qw4990/how-to-implement-a-DB-like-sqlite · GitHub".
除了這篇最基本的文檔, 推薦看<<SQLite Database System: Design and Implementation>>的3章和4章, 看完能理解sqlite實現ACID的基本方法.
接著是cache, sqlite提供了插件式的cache結構, 所以你或許會驚訝為什麼sqlite裡面同時有pager.c, pcache.c, pcache1.c:
cache這個部分比較簡單, <<inside sqlite>>第三章, <<SQLite Database System>>第五章都有詳細的介紹, 主要講解了pager實現cache的方法.
在我github中的demo1.1中, cache的功能也已經完成了, 1 可以參考看下裡面的pager.h, pager.c, pcache.c, pcahce1這四份代碼.
最後是log:
這部分我現在直接選擇了忽視...
----------------------------------------------------
Tree層:
sqlite的tree層就是用B+/B-樹維護數據, 以達到快速"增刪查改"的目的.
這一層在官方文檔里沒多少資料.
先是演算法本身, 也就是B+/B-/B樹, 沒什麼好說的, 很多演算法書都有.
接下來重點是sqlite怎麼將B樹應用到自身的資料庫中的.
這一點可以看<<inside sqlite>>的第5章, <<SQLite Database System>>的第6章, 都有很詳細的介紹.
<<SQLite Database System>>講得更為仔細, 除了說原理外, 還說了sqlite里btree大致被分為了幾個結構體在工作.
以上就是我學習後端遇到的一些點吧.
=============================================================
如果嫌棄上面的學習方法麻煩的話,
可以先掃一下"Architecture of SQLite",
接著再看一下"Atomic Commit In SQLite",
最後簡單粗暴的把推薦的那兩本書掃完,
也大致知道sqlite是怎麼設計的了.
不過個人認為sqlite是一個"大師級的精緻的工藝品", 光看完兩本書就說自己學完了它, 未免有點"暴殄天物".
除了基本的資料庫設計方法(也就是那兩本書的內容), sqlite的源代碼中所蘊含的編程技巧, 工程設計, 以及各種小考慮, 也是非常值得吸收學習的.
=============================================================
最後總結一下
如果想簡單粗暴快捷的學習, 直接掃arch.html, atomiccommit.html和那兩本書, 就能明白sqlite是怎樣被設計的了.
如果想深入學習, 建議從7層開始向前學, 邊翻文檔邊看源碼邊寫demo.
5. 如何學習Tomcat的源碼
方法/步驟
第一步 下載安裝fiddler,fiddler2和4的版本對電腦裡面net版本有要求。
第二步 打開fiddler 2,fiddler會及時抓取正在進行網路通訊的所以信息
第三步 因為網頁後台會有自動刷新的進程,所以再抓取特頂網頁COOKIE時候,先按住CTRL+X清楚現在記錄的網頁
第四步 以小米網站為例,刷新該網站。然後就會看見fiddler已經在記錄一系列的網頁,選定小米官網
第五步 然後在右側的屬性詳情欄,即可以找到【cookie】
6. 如何學習hibernate源碼
我來分享一下查看源碼的方法:
查看源碼的首要任務是要有一款上手的工具,這里用的是 IDEA。IDEA 的功能比較強大,包括 查看類結構圖,debug。這兩個是查看源碼的關鍵功能。
查看源碼可以靜態查看和動態查看,靜態查看的方法是查看類圖,還有 ALT + f7 查看方法在哪裡被調用或者類在哪裡被調用。在看 spring 源碼的時候就是用這種方法,不過這種方法對閱讀者的要求比較高,包括要了解這個方法的執行,設計模式的理解,以及框架是如何配置這個類的。第二種方法是 debug。debug 方法是後來才發現的一個重要的 查看源碼的方法,要點是掌握執行棧,就能掌握整個執行流程。比如這個是在debug hibernate 源碼的時候的截圖,可以看到這個執行棧非常深,從 spring-data-jpa 到 hibernate 中間經過好幾層的代理,主要完成一些適配,事務,攔截器等等操作,然後再到 hibernate 核心代碼,最後就是 jdbc 的 statement。方法棧中的每一個方法都是可以查看的,裡面的變數有時候是代理了好幾層,所以要 F7 進去才能看到真正的執行類。
上面是簡單的簡述 mybatis 的 cache 機制的源碼,真正想讓讀者明白的是,debug 如何查看源碼,查看源碼需要抓住一個主題,不然在閱讀龐大的框架的時候會找不著北。
所以,閱讀源碼需要掌握工具使用,debug, 查看類圖,查看方法在哪裡調用,軟知識是要掌握設計模式,對框架的概念有了解。
7. 如何學習TensorFlow源碼
如果從源碼構建TensorFlow會需要執行如下命令:
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
對應的BUILD文件的rule為:
sh_binary(
name = "build_pip_package",
srcs = ["build_pip_package.sh"],
data = [
"MANIFEST.in",
"README",
"setup.py",
"//tensorflow/core:framework_headers",
":other_headers",
":simple_console",
"//tensorflow:tensorflow_py",
"//tensorflow/examples/tutorials/mnist:package",
"//tensorflow/models/embedding:package",
"//tensorflow/models/image/cifar10:all_files",
"//tensorflow/models/image/mnist:convolutional",
"//tensorflow/models/rnn:package",
"//tensorflow/models/rnn/ptb:package",
"//tensorflow/models/rnn/translate:package",
"//tensorflow/tensorboard",
],
)
sh_binary在這里的主要作用是生成data的這些依賴。一個一個來看,一開始的三個文件MANIFEST.in、README、setup.py是直接存在的,因此不會有什麼操作。
「//tensorflow/core:framework_headers」:其對應的rule為:
filegroup(
name = "framework_headers",
srcs = [
"framework/allocator.h",
......
"util/device_name_utils.h",
8. 怎麼學習Element-ui的源碼
平常一直在用element的組件. 去github上看下了,就是想系統的學習一下寫這種ui組件庫是怎樣的一個過程.(平常一直在使用es6和vue2.0)
先看老版本。兩個好處:一是老版本功能少點,便於學習。二是在你覺得看的差不多的時候,可以看看新版本增加了哪些功能,然後自己來實現。
2.先看js,把所有的js看完,再看css。
3.從簡單的組件開始看。在看簡單的組件之前應該會有自己對這個組件的理解,比如從button開始看,會覺得button不就是emit一下click事件嗎,然後你再看他是怎麼做的,除了你看之前就猜到的emit click事件以外還做了些什麼。總之就是帶著一點點思考看。
4.故意找茬。比如發現inputnumber這個組件用了input組件,而且還支持prepend和append的slot,那麼你看看加上append之後會顯示成什麼樣子。
5.記錄下你在源碼里讀到的,並且官方文檔裡面沒有提及的功能。
9. 如何學習java源碼
Java是一種面向對象語言,Java語言類似於C++語言,所以已熟練掌握C++語言的編程人員,再學習Java語言就容易得多!Java程序需要編譯,它被放置在Internet伺服器上,當用戶訪問伺服器時,Java程序被下載到本地的用戶機上,由瀏覽器解釋運行。實際上有兩種Java程序:一種Java應用程序是一個完整的程序,如Web瀏覽器。
另一種Java小應用程序是運行於Web瀏覽器中的一個程序。Java程序和它的瀏覽器HotJava,提供了可讓你的瀏覽器運行程序的方法。你能從你的瀏覽器里直接播放聲音,你還能播放頁面里的動畫,Java還能告訴你的瀏覽器怎樣處理新的類型文件。當我們能在2400 baud線上傳輸視頻圖象時,HotJava將能顯示這些視頻。
10. 如何學習開源軟體源代碼 csdn
導讀:對於開發者來說,社區里豐富的開源代碼其實是筆極為寶貴的財富。如果能充分利用好開放源代碼的資源,不僅可以掌握多種編程方法,提高實踐能力,還能獲得好的思想,激發編程靈感。開源代碼怎麼學以及怎樣才能學好是大家經常關注的話題,日前,在問答網站知乎上,有人拋出了「如何更有效地學習開源項目的代碼?」的話題,眾技術好手各抒己見,CSDN軟體研發頻道對本文內容進行了整理,方便大家學習與參考。盛大創新研究院研究員 庄表偉:學習開源 盡可能在代碼里找答案 庄表偉提供了以下9個建議:1.在下載源代碼之後,首先要跑起來,編譯通過、正常運行;2.在你覺得最有可能運行到的地方,設置斷點或者拋出異常,這樣,就能夠找到一個項目在正常運行時的入口點;3.從入口點所在的那個源文件開始閱讀,逐步把握整個項目是如何啟動起來;4.隨便改點代碼,看看會不會報錯,如果報錯,會從哪裡報錯;5.試著把報錯屏蔽、修復、或者繞開;6.嘗試理解一個系統的內部結構,多少組成部分,主線模塊是哪些?輔助模塊是哪些?7.從實際需要出發,修改這個項目,滿足自己的某一個小的需求。(注意在此之前,盡量不要在網路上找答案);8.看看相關的討論與心得,是否與自己的理解相一致;9.提交bug fix或者某個新的功能代碼。在學習開源的過程中,有幾個方面會獲得大量收獲,1.架構與模式;2.開源社區常見的一些慣用法;3.相關領域的結構與演算法。總結一點:學習開源,盡可能在代碼里找答案,而不是在代碼之外找答案,那些都是二手的,而且很可能不準確。互聯網評論員 朱曉陽:從簡單做起 理論聯系實踐朱曉陽對此發表了兩點看法:首先,從簡單做起。剛開始的時候學習一些領域內基礎理論,然後找一些簡單的東西去實現,不能一開始就去找開源項目。建議大家經常動手寫一些小程序,如改進宿舍網路登錄客戶端等。積小成多,能顯著提高自己的編程能力。其次,學習的知識一定要和自己生活或工作有聯系,這樣才會有樂趣或動力。互聯網評論員孫竟:先構想一個想做的項目首先,構想一個想做的項目(比如論壇、博客、微博等);然後,思考需要什麼功能,應該怎麼去實現,盡可能包括各種細節,有必要時記錄下來;最後,去找個類似的開源應用,看看它是怎麼實現的,和你的想法有什麼差異,有什麼可以學習或需要改進的地方。互聯網草根hqman:我的5個建議:1.反復地使用軟體,熟釋軟體的組成文件和軟體功能,注意IE地址欄內的地址變化;2.打開資料庫文件或存放數據的XML文件,參照數據字典了解各個表和欄位的數據含意;如果沒有數據字典,就運行軟體輸入數據,參照所輸入的數據,了解各個表和欄位的數據含義;3.利用Visio進行反向工程,將類圖抽出來;4.研究類之間的關系,注釋各個類的屬性和方法,弄清程序的整體框架;5.另開一個項目,按照軟體開發的流程,將代碼分段復制進新的項目,進行編譯調試,關注一些實現細節,學習一些編程的技巧。在讀研究生張偉:在校學生空閑時間多參加一下比賽張偉的建議是大家在空閑時間多參加一些比賽。一個完整的項目,不管再小,只要做完了,就會有收獲。多看一些比較大的開源項目源代碼,每次看完後都會受益匪淺。從網上成熟的開源代碼里,可以學到很多的設計思想。他認為,從項目入手,以項目為驅動,可激勵自己進步。當然,是否一定需要看開源代碼,這將取決於個人的興趣和需要。畫出程序流程圖 理解程序流程思想CSDN博客專家i_like_cpp:曾在CSDN分享了《如何將源代碼學好》的博文,對此,他給出了四點建議:1. 畫出整個程序的流程圖,理解整個程序流程的思想。畫流程圖的方式更讓人很直接的理解程序的整體流程,而不會被代碼所干擾,讓程序員總體上把握整個程序;2. 對流程各節點(函數或過程)的理解,流程的每一節點是構成整個流程的不可缺少的部份;3.再把流程和流程各節點串起來理解整個程序,可能的話最好寫出讀書筆記;4. 如果想深刻的學習到源代碼的精髓所在,請寫一個相近的程序進行操練。理解了這個程序並不表明掌握了這個程序,只有在操練一個相近的程序時,才知道你到底理解了多少,掌握了多少。編後語:源代碼的學習是一個從整體到不斷細化的過程,是一個極為繁瑣的過程同時也是一個不斷認清事物本源的過程。本文總結的源代碼的學習經驗,希望對您有所幫助。那麼,CSDN的網友們,你們是如何對待開源項目源代碼的呢?