# 學習如何閱讀開源專案 入門文章: - [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