# 學習如何閱讀開源專案 入門文章: - [x] https://www.gushiciku.cn/pl/pQyp/zh-tw 開始閱讀原始碼時,先對框架的模組及其關係有一個整體的認識。我們要對框架專案的模組和目錄要有一個全盤的瞭解,要知道每個模組是幹嘛的,然後要了解模組與模組之間的關係。 分析原始碼先從父類或父介面開始分析。因為父類或者父介面往往代表了一類功能,這些基類或基類介面往往抽象了各個具體子類共有的屬性和行為,一些比較基礎的方法都在父類中實現,然後留個模板方法給子類去實現即可(模板方法的應用)。 閱讀原始碼前首先要找到啟動類。閱讀分析原始碼時要先從啟動類開始,因此找到框架啟動的入口很重要。 閱讀原始碼時要分清主幹和枝節程式碼。找到啟動入口後,然後就可以順著啟動入口一步一步除錯來閱讀原始碼了。不過在初次除錯原始碼時值得注意的是一定要分清主次程式碼,即要先閱讀主幹程式碼,其他枝枝節節的程式碼沒明白的可以放一邊。切忌一開始就深入細節然後出不來了,這樣就會造成只見冰山一角而看不到全貌的感覺。 閱讀原始碼前要分清主次模組。即閱讀分析原始碼不能漫無目的,全盤通讀,我們要從我們平時有用到的模組開始分析。每個人的時間都很寶貴,我們要把時間花在刀刃上。比如SpringBoot增加的新特性中有 自動配置 ,而自動配置特性又非常重要,因此可以挑選自動配置來進行原始碼分析。 要充分利用原始碼專案的測試類。之前也說過,一個框架之所以能流行,必定是經過大量測試的。因此如果我們想具體瞭解某個類和某個方法,我們可以充分利用這些測試類來輔助我們原始碼分析。 要學會一些除錯技巧。這一點也很重要,比如在除錯過程中如何檢視呼叫關係等等 - [x] https://medium.com/starbugs/%E9%96%8B%E6%BA%90%E5%B0%88%E6%A1%88%E8%AE%80%E8%B5%B7%E4%BE%86-%E8%81%BD%E8%AA%AA%E5%8F%AF%E4%BB%A5%E5%B9%AB%E4%BD%A0%E4%BF%9D%E7%AE%A1%E8%B3%87%E6%96%99%E5%86%8D%E6%B1%BA%E5%AE%9A%E8%A6%81%E4%B8%8D%E8%A6%81%E6%9B%B4%E6%96%B0%E7%9A%84-swr-d02dadc1116b 带着目的去看源码,我们只有带着问题出发的时候,才会具有更高的效率。 閱讀開源專案的目的是,找到我想知道的某個功能是如何實現的! 以react SWR 為例子 專案的出口處 這裡指的出口處就是整個專案究竟是在哪裡將我們要使用的功能 export,而專案的 export 也會是我們在使用時所 import 的東西。 - [x] https://www.itread01.com/content/1546367941.html 教你閱讀Python開源專案程式碼 閱讀Python開源專案程式碼主要有如下三個原因: 1. 在工作過程中遇到一些問題,Google和StackOverFlow等網站找不到解決辦法,只能去翻原始碼。 2. 對某些專案或者方向非常感興趣,希望深入。 3. 學習遇到瓶頸需要汲取開源專案的經驗和用法來做提高。 沒有目的的閱讀開源專案就是耍流氓。浪費了時間,但是能學到的東西也很少。怎麼樣根據自身情況去閱讀呢? 1. 和興趣以及工作契合。舉個例子,工作中沒有機會用到Celery又不是想自己造個輪子,讀它的原始碼做什麼?所以要從平時能接觸到的那些專案中選取。比如我,我肯定不去看Django的程式碼,因為日常工作基本遇不到,遇到了現翻就好了。 2. 一個方向只看一兩個典型的就可以了。比如Web框架,我只看過Bottle和Flask的原始碼(其實之前也看過Django的,只是淺嘗輒止),而且看Bottle已經是好幾年前的事情了。並不是堆的多了更好,有時候反而選擇太多會懵。 3. 不同技術階段的選擇程式碼量、複雜度不一樣的專案,下面會具體推薦。 4. 清楚自己看程式碼的目的。就是你看程式碼是想了解人家怎麼設計、除錯BUG、還是隻是想學習正確的程式設計用法呢?其實沒有必要細摳每個程式碼細節,有時候當黑盒看,知道輸入輸出就可以了。 推薦專案 1. kennethreitz。requests和python-guide作者。他還有一個非常勵志的故事,有興趣的可以看 誰說程式設計師不是潛力股? 2. mitsuhiko。flask、Jinja2、werkzeug和flask-sqlalchemy作者。 3. sigmavirus24。flake8、pycodestyle(原pep8)、requests、urllib3等專案的主要貢獻者和維護者。 4. ask。Celery及相關依賴的作者。 5. ajdavis。mongo-python-driver(pymongo)、tornado等專案的主要貢獻者。 6. bitprophet。fabric、paramiko(Python的ssh庫)作者。 前2個是公認的Python領域程式碼寫的最好的、最有創意的工程師。 初學者推薦閱讀專案 初學者可以先閱讀一些程式碼量比較少的,最好是單檔案的專案: 看程式碼主要是瞭解別人寫程式碼的方式,語法實踐這些內容。看完之後,你可以針對這些專案能解決的問題自己寫個專案,寫完之後和上述專案去對比一下,看看哪些方面做的不好。 進階閱讀專案 進階的時候就要閱讀一些相對複雜的專案,它們能幫助你提升Python程式設計技巧: 2. pallets/werkzeug。flask的WSGI工具集。其中包含了實現非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。 3. bottlepy/bottle。閱讀一個Web框架對Web開發就會有更深刻的理解,flask太大,bottle就4k多行,當然如果你有毅力和興趣直接看flask是最好了的。 6. pallets/click。click已經內置於在flask 0.11裡,提供命令列功能,值得閱讀。 除此之外Web開發者可以閱讀一些相關的專案: 2. jahaja/psdash。使用flask和psutils的獲取Linux系統資訊的面板應用。 當然,2個學習flask重要的資源必須爆一爆: 2. The Flask Mega-Tutorial。 這個就是《Flask Web開發:基於Python的Web應用開發實戰》的原始部落格。 500lines 推薦一個非常厲害的專案 GitHub - aosabook/500lines: 500 Lines or Less, 它裡面包含了22個由該領域的專家完成,用不到500行的程式碼實現一個特定功能的子專案。連Guido van Rossum都親自來寫基於asyncio爬蟲了,Nick Coghlan、ajdavis也出場了。更具體的介紹可以看Python 的練手專案有哪些值得推薦? - 小小搬運工的回答。 怎麼閱讀開源專案原始碼 1. 不要畏懼 2. 帶著問題去閱讀程式碼,這也是我認為最有效的方式。這會讓你在閱讀時候有個主線,比較有針對性。 3. 斷點除錯。在Python程式碼中使用pdb一般不太好使,因為程式碼複雜的話,這種斷點需要你使用多個n跳到對應的位置,我一般都是先丟擲異常,然後使用pdb的up/down/n等命令除錯。當然在目標位置新增一些print日誌或註釋部分程式碼然後直接使用exit()退出也是可以的。 4. 善用文件,官網例子。閱讀一個專案一開始會有點無從下手,那麼就先好好這些內容,它們一般都是作者表達這個專案的第一個入口。quickstart、tutorial等內容中的最小化的例子其實就是最好的閱讀入口,先去看這些引用的模組和呼叫的對應方法或者函式的對應實現,從下至上去閱讀。 5. 理解作者的思考方式。不同的專案要有不同的思考方式來閱讀,不要擰著自己的習慣去閱讀,這樣會很累,得嘗試接受別人的觀點,甚至於改變自己。 6. 閱讀專案的早期版本。一些專案隨著時間演進已經非常複雜了,讀起來有難度,那麼你可以回到專案的早期版本上,先去看相對簡單地版本,然後設定幾個時間點或者版本節點,漸進的來閱讀。 7. 記憶並繪製專案架構。專案就是一堆程式碼的組合,除了學習程式設計技巧,還要了解專案的架構決策,這對於未來自己寫大型專案非常用用。這種理解越補充,你會對它就越來越清晰。 8. 參與。如果只是看和思考而不參與,其實效果大打折扣。我建議要參與一些issue討論、向作者提問、提PR新增新的功能、幫助改善文件等等。很多時候你理解的其實和作者是有衝突的,無論是你說服他和被他說服,對自己的成長都是很有幫助的。 - [x] https://juejin.cn/post/6903335881227108366 貢獻開源專案: - [ ] https://medium.com/starbugs/%E5%A6%82%E4%BD%95%E8%B2%A2%E7%8D%BB%E9%96%8B%E6%BA%90%E5%B0%88%E6%A1%88-%E5%B0%8E%E8%AE%80%E9%96%8B%E6%BA%90%E6%8C%87%E5%8D%97-52807c598ed9 ### 閱讀推薦: python - [ ] https://iter01.com/552628.html GitHub 上適合新手的開源專案(Python 篇) 1.1 有程式設計基礎:explore-python 專案地址:https://github.com/ethan-funny/explore-python 線上閱讀:https://funhacks.gitbooks.io/explore-python/content/ 2.1 先查收這份指南:python-guide 專案地址:https://github.com/realpython/python-guide 線上閱讀:https://pythonguidecn.readthedocs.io/zh/latest/ 2.2 再翻爛這本祕籍:python3-cookbook 專案地址:https://github.com/yidao620c/python3-cookbook 線上閱讀:https://python3-cookbook.readthedocs.io/zh_CN/latest/ - [x] https://nijialin.com/2020/07/10/use-line-sdk-join-oss/ - [ ] https://www.gushiciku.cn/pl/gzA0/zh-tw 1. Manim 2. Airflow 3. XSStrike 4. Google圖片下載 https://github.com/hardikvasa/google-images-download 5. Photon https://github.com/s0md3v/Photon - [ ] https://iter01.com/599728.html Django走過的一些彎路-專案結構 專案結構 首先的首先,我認為一個專案的結構是最重要的。就好比人類的骨骼,清晰明確的專案結構有利於模組分離,複用,且對於自己或者看你程式碼的人都是一種享受。 最早的時候,我的專案都是在根專案中,寫的程式碼都是在根專案的views.py中,很快這個檔案就超過2k行,每次開啟需要等一會。就連Pycharm某些外掛都罷工了(大於1000行的檔案出於執行效率問題會忽略)😹。 通過自己一段時間的摸索和檢視開源專案等總結,以下結構對我來說比較適合。 專案結構 ``` ├── README.md # 說明檔案 ├── apps # 子專案目錄 │ ├── README.md - # 專案規範說明檔案 │ ├── app1 - # 自定義模組一 │ ├── app2 - # 自定義模組二 │ ├── ... - # 更多自定義模組,每個模組一個資料夾 │ └── user - # 使用者模組(單獨抽離出) ├── main # 專案主目錄 │ ├── __init__.py │ ├── asgi.py │ ├── settings.py # 主配置檔案 │ ├── urls.py # 請求URL主入口 │ └── wsgi.py ├── db.sqlite3 # 自帶資料庫(僅開發環境) ├── env # 不同環境的配置檔案 │ ├── README.md - # 環境配置說明 │ ├── env.example - # 配置示例檔案 │ └── env - # 環境配置檔案 ├── logs # 日誌 │ ├── access.log - # 訪問日誌 │ ├── error.log - # 錯誤日誌 │ └── uwsgi.log - # 執行日誌 ├── manage.py ├── reload # (uwsgi) 監聽該檔案變動重啟服務 ├── requirements.txt # 專案依賴 ├── static # 靜態資原始檔 │ ├── css │ ├── image │ └── js └── uwsgi.ini # uwsgi配置檔案 ``` https://www.gushiciku.cn/pl/gn3D/zh-tw
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.