-
1 # 程式設計師小軒
-
2 # 你的程式設計老師
對於我們大多數程式設計師來說,也就是我們平常說的金字塔底層的人員,只是工具的使用者而已,簡單、直白點就是熟練工,很多程式設計師只知道怎麼用,不知道為什麼這麼用?
對於個人成長還處於2-3年前的工作經驗。
對於一個優秀的程式設計師來說,閱讀原始碼,分析架構,深入編碼核心思想,那麼對於你以後的個人能力提升是非常快的一種捷徑。在我們閱讀原始碼的時候,我們可以看到一個優秀的程式設計師的設計思路,編碼規範以及程式設計思想體驗的淋漓盡致。
俗話說的好,根據什麼樣的人學習,我們以後有可能會變成什麼樣子的人。分析原始碼,我們可以知道使用它的好處在哪裡,為什麼會選擇它,它的內部的工作原理是怎麼樣的,從而我們可以將他們應用到我們的實際專案中,畢竟優秀框架的原始碼正如同一本武林秘籍。
所以,我們平時想要真正的成為高手,就要多多學習高手的優秀作品,模仿它,到最後超越它。
-
3 # IT人劉俊明
答案是肯定的,程式設計師從學習程式設計那一刻開始就需要閱讀別人的原始碼,工作以後則更不可避免的要閱讀大量的原始碼了。
閱讀原始碼對程式設計師來說至少有以下幾點原因:
第一,程式設計師的學習往往都是從閱讀原始碼開始的。從第一個程式Hello World開始,程式設計師在學習的過程中就需要閱讀大量的原始碼,以瞭解程式的語法。程式語言的每一個概念幾乎都需要透過原始碼來呈現,而程式設計師當然需要透過閱讀這些原始碼來理解這些概念,同時還需要透過實驗來驗證這些原始碼。很多計算機專業的學生都是透過閱讀Linux原始碼來學習作業系統體系結構的,這是一個非常好的學習方法。
第二,工作過程中需要透過閱讀原始碼來學習新的解決方案。計算機領域的新技術層出不窮,作為程式設計師來說需要不斷學習這些新的技術方案,而閱讀原始碼是最直接的方式之一。很多程式設計師在學習新技術時,往往都是從直接搭建開發環境並執行demo開始,透過執行的結果建立對新技術的一個直觀理解,而這個過程大部分的時間都是在閱讀原始碼。
第三,閱讀原始碼是程式設計師之間交流的一個重要方式。現在大部分開發團隊都會對專案進行Code Review,Code Review的過程既是一個總結的過程,也是一個互相學習的過程,Review的過程一個重要的內容就是閱讀別人的原始碼。
大部分初級程式設計師需要掌握的第一個能力就是閱讀原始碼的能力,按照歷史經驗來看,具有較強程式碼閱讀能力的初級程式設計師往往能夠更快速的融入開發團隊。同樣,很多最終沒有走向開發崗位的程式設計師,程式碼閱讀能力不強是一個重要的原因,當然,程式碼閱讀能力差的原因是多方面的。
如果有軟體開發方面的問題,也可以諮詢我。
-
4 # 此生唯一
原始碼是一定要去讀的,我最近就瘋狂地迷上了閱讀原始碼,有J d k的,有spring的,那就斗膽來分析下是不是應該閱讀原始碼?
1,長城是簡單石頭建成的:在大學學C語言的時候,我一直覺得陣列和連結串列這麼簡單的東西沒麼鳥用,直到我最近讀到了IinkedList,LinkedHasmap,ArrayList,AbstractQueueSynchronizer,Hashmap,ConcureentLinkedQueue等等,底層基本上都是使用陣列和連結串列實現的!
2,三人行必有我師焉:在spring的原始碼裡,大量的使用了模板方法介面卡,工廠模式,修飾器模式,代理模式等等十幾種設計模式,這也是支撐了spring良好架構的原因,在泛型,反射,列舉,重寫,過載等程式碼技巧上,值得我們深入學習!
3,18般武藝,樣樣精通:現在的JAVA面試基本上都會問,是不是閱讀過原始碼,從原始碼中學習到了什麼?怎麼設計的?自己能不能設計出來?雖然這些成熟的框架不需要你再去寫,甚至可能沒有bug可以挑,但是你還是得懂,因為面試官需要!
4,有人的地方就有江湖:不管在同事面前或者在領導面前,露一手是很有必要的,如果分析原因的時候你篤定的說,底層就是這麼這麼實現的,別人會覺得你很屌,你是個大牛,可能從此就走上了人生巔峰!
5,出精品之前可能需要先抄襲:比如說我們國家的戰鬥機,又比如說某迅的遊戲都是先抄襲,然後再逐步創新加工,最後全部變為自己的,最後不也有聲有色的嘛?從原始碼中找到對自己有用的,避免重複的造輪子!
回覆列表
閱讀原始碼是每個優秀開發工程師的必經之路,那麼這篇文章就來講解下為什麼要閱讀原始碼以及如何閱讀原始碼。
首先來說下為什麼要讀原始碼,有學習原始碼的必要嗎?
為什麼要閱讀原始碼?
關於為什麼閱讀和學習原始碼,我個人認為可能有以下幾點:
(一)吊打面試官,應對面試
為了找到更好的工作,應對面試,因為在面試中肯定會問到原始碼級別的問題,比如:為什麼 HashMap 是執行緒不安全的?
如果你沒有閱讀過原始碼,面試官可能會對回答的結果不滿意,進而導致面試結果不太理想,但如果你對原始碼有所研究,並能夠很好地問答面試官的問題,這可能就是你的加分點,可以形成自己獨特的競爭力,吊打面試官,升職加薪不是夢。
(二)解決問題(bug)
在開發過程中,我們或多或少會遇到 bug,比如:在 foreach 迴圈裡進行元素的 remove/add 操作,為啥有可能會報 ConcurrentModificationException 異常?
我們可以先在 Google、Stack Overflow 以及對應專案的 Issues 裡看有沒有類似問題以及解決辦法,如果沒有的話,我們只能透過閱讀原始碼的方式去解決了。如果我們對相關原始碼有所涉獵,就可以快速定位到問題所在。
(三)提升程式設計能力
讀一本好書,就是和許多高尚的人談話。 -歌德
和閱讀一本好書一樣,閱讀原始碼就是和程式設計大牛面對面交流的機會,在許多優秀的開源專案中,它們的編碼規範和架構設計都是很棒的,另外在設計上也使用了大量的設計模式,透過閱讀和學習原始碼,能夠快速提升我們的編碼水平,以及對設計模式有更深的理解。
同時,在我們閱讀完一個原始碼後,可以觸類旁通,能夠快速地對其他框架的原始碼進行閱讀和學習,減少時間成本。
除了上述提到的原因之外,可能還有許多,在這裡就不一一贅述了,那麼在確定了要閱讀原始碼之後,就讓我們看下如何閱讀原始碼吧!
如何閱讀原始碼?
如何閱讀原始碼取決於你為什麼要讀原始碼,比如:
如果為了應對面試,那就可以圍繞常考的基礎類、集合類、佇列、執行緒、鎖等內容進行閱讀和學習;如果是為了解決 bug,那麼就可以只圍繞出現問題的相關類進行閱讀分析,隨著解決 bug 的增多,我相信閱讀的原始碼也會越多,從而更容易去閱讀和學習原始碼;下面大概說下閱讀原始碼的幾點建議:
在閱讀之前,可以先從開源專案的官網上看它的架構設計和功能文件,瞭解這個專案的整體架構、模組組成以及各個模組之間的聯絡。
如果沒有對應的專案文件,可以根據程式碼的模組進行梳理,以形成對專案的初步瞭解,或者檢視已有的原始碼解析文章或者書籍,在閱讀原始碼之前,瞭解專案的架構和思路會使閱讀原始碼事半功倍。
在瞭解一個類的時候,可以使用 ctrl+F12 來檢視類中的成員變數和方法。
可以透過 IDEA 的 Diagrams 功能去了解一個類的繼承關係。
多打斷點除錯,斷點追蹤原始碼是很好的閱讀原始碼的方式,可以先透過 debug 瞭解下呼叫邏輯,都和哪些類有關聯,有大致瞭解後再透過 debug 瞭解整體程式碼的功能實現,各個類都起到了什麼作用,有沒有涉及到設計模式等。
另外,優秀的開源專案中肯定會有許多地方應用到了設計模式,建議在閱讀原始碼之前,需要對常用的設計模式有大致的瞭解,不然閱讀原始碼的效率會大大降低。
如果遇到讀不懂某部分原始碼的時候,可以先跳過,之後再回來看,如果屬於搞不懂這部分就茶不思飯不想的人,可以在網上找是否有該部分原始碼的解析或者文件,也可以自己透過原始碼註釋和測試用例去閱讀學習。
一般優秀的開源專案都會有單元測試,可以透過對應類的單元測試去了解方法的含義和用法,加深對原始碼邏輯的理解。
在閱讀原始碼的時候,可以在程式碼上加上註釋和總結,同時還可以畫出時序圖和類圖,這樣對閱讀原始碼有很大的幫助,可以很清楚地知道類之間的呼叫關係和依賴關係,也方便以後回顧,重新閱讀。
在這裡推薦大家一個 IDEA 外掛 SequenceDiagram,可以根據原始碼生成呼叫時序圖,便於閱讀原始碼。
剛開始閱讀原始碼,不建議直接看框架原始碼,可以先從 jdk 原始碼看起:
jdk 原始碼也是非常龐大的,可以分模組來閱讀,下面是建議的閱讀順序:
java.lang 包下的基本包裝類(Integer、Long、Double、Float 等),還有字串相關類(String、StringBuffer、StringBuilder 等)、常用類(Object、Exception、Thread、ThreadLocal 等)。java.lang.ref 包下的引用類(WeakReference、SoftReference 等)java.lang.annotation 包下的註解的相關類java.lang.reflect 包下的反射的相關類java.util 包下為一些工具類,主要由各種容器和集合類(Map、Set、List 等)java.util.concurrent 為併發包,主要是原子類、鎖以及併發工具類java.io 和 java.nio 可以結合著看java.time 主要包含時間相關的類,可以學習下 Java 8 新增的幾個java.net 包下為網路通訊相關的類,可以閱讀下 Socket 和 HTTPClient 相關程式碼其他包下的程式碼也可以做下了解,JDK原始碼閱讀筆記:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的原始碼閱讀經驗後,可以再去學習 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的原始碼。
總結主要介紹了為什麼讀原始碼以及如何讀原始碼,供大家參考,每個人都有適合自己的閱讀原始碼的方式,希望可以在學習中去摸索出一套屬於自己的方式。