小白如何学习大神的小项目
0. 背景
最近Workflow的項目作者,
也就是一位低調的架構師(懂的都懂
起因只是為了供Workflow項目使用,
而低調地寫了一個json-parser。
但我看完之后覺得🤩🤩🤩wow~
這代碼如此簡單,卻應有盡有。
如果十年前的我能看到這樣的項目就好了!
因此22同學冒著被打的風險,
結合這個項目寫了這篇,
aka,《小白如何學習大神的小項目》
給當年的啥都不會的自己,也給需要的小童鞋~
So,有經驗的朋友可以不用往下看了👋
其實,大家都希望多看優秀前輩的作品
學習里邊經典的設計和優雅的編碼風格
但前輩們的項目往往又太大、太難、太復雜
如果Jeff Dean能開個幾百行代碼的小項目
我會讓十年前的自己每天大聲朗讀一遍👌
1. 了解項目要解決什么問題
理解項目最大的障礙在于:
看不到它的需求。
所以上來看復雜的項目會覺得很奇怪,
為什么要這樣做?
回到項目本身:json-parser,顧名思義,
就是我們網絡傳輸常用json格式,
而收到這么一串內容之后,
解析到具體數據結構,
方便我們后續用接口訪問。
比如json里給我們這串內容是個數組:
[1, "abc", 12.3, -4],
我們希望得到的數據結構是類似
struct json_value[4];
或者std::vector<JSON_VALUE>;
在工程上這件事很常見,叫做:反序列化
2. 項目結構和前置知識
項目往往需要依賴其他項目進行構建的,
因此我們需要先來看看目錄結構,
它包括哪些內容,需要依賴什么其他項目
我們先看看這個json-parser:
基于C寫的,所以人均都能看得明白:
里邊有用于構建項目的Makefile
開源所需要的LICENSE
項目主頁文檔README.md
然后就是簡單的代碼本碼,
可以看到四舍五入只有800行
適合懶癌晚期的你👍
項目依賴有多種做法,這里是源碼依賴,
也可以交給github的submodule、
或者交給不同系統的包管理工具。
最后附上示例程序和性能測試用例,
方便使用者直接上手使用。
3. 了解構建方式, 快速run起來
以前我的大學時期,是沒有教怎么構建項目的
入職百度之后學的第一件事就是寫Makefile
(想念當年一起學的小伙伴果凍同學
現在學校里對工程構建的教學要重視多了
先前有遇到過大學生問怎么構建Workflow
說是老師給的作業???🤔
而Makefile是C++項目構建的必備知識
新的構建方式還有cmake、bazel等,
都值得后續了解。
這份Makefile麻雀雖小五臟俱全,
基本要素都有了:
在Linux/Mac下直接執行命令make ,
就可以run起來~
避免新手IDE、構建搞半天然后從入門到放棄
4. 廣搜看項目:初窺內核中的數據結構list.h和rbtree.h
看項目到底是bfs還是dfs?
我們可以對第一層先bfs看個大概,
梳理出有哪幾塊內容,
再針對每塊內容dfs直到搞明白為止。
json-parser中內容很少,
值得一提的是僅有的兩個依賴:
list和rbtree。
學習委員劃重點:
鏈表和樹,是工業項目最基本的數據結構
因為用的C99寫的,
因此從Linux kernel里搬了這兩結構過來用
感興趣的小伙伴
可以借此機會圍觀下kernel的代碼風格,
一個雙向鏈表是長這樣的:
然后我們就可以愉快地嵌入到其他結構中
基于任何結構類型制作一個雙向鏈表
但>~< 這不是這次要介紹的重點~~~
5. 深搜看項目:接口設計、架構層次、編碼風格
接口設計的三個重點:簡單!簡單!還是簡單!
我們先通過test.cc感受一下接口設計:
輸入一段內容,輸出一個反序列化好的對象
不需要初始化任何東西,不需要其他參數。
什么額外的options、params、config
能不要盡量不要,
不要讓使用者有其他心智負擔。
create對應destroy,都很嚴謹的
明確的內存生命周期更有利于開發者理解。
接口設計是最體現細節和品控的~
如果哪個項目會create對應delete
或者new對應destroy之類的
甚至更過分調用new不需要delete的
我直接一口屏幕噴到鮮血上
那么架構層次呢?
項目整體的編程范式和架構是否統一很重要。
這個項目足夠簡單,
因此我們可以很快抓到它的架構重點:
它是C語言中面向對象的寫法,
整體圍繞json_value_t
打開頭文件可以看到這個對象的幾個方法:
json的結構里,
數組里的元素可以是對象,
而對象里有可以是數組,
因此數據的表達可以是遞歸的。
而json-parser解析的架構層次一樣,也是遞歸。
剛才介紹到的用戶接口函數👇
json_value_t?*json_value_create(const?char?*doc)它會調用到我們遞歸的入口:
ret?=?__parse_json_value(doc,?&doc,?0,?val);我們需要抽象出一些結構去進行遞歸,
把剛才的數組、對象的關系裝到list/rbtree中
涉及到遞歸調用的接口有以下這些,
感興趣的小伙伴歡迎源碼進一步閱讀
這里就不細說狀態轉換圖了
畢竟本文不是教大家怎么解json
另外,編碼風格很重要。
多看風格好的項目,
才能不被有毒的代碼帶跑偏。
秉承作者一貫的編碼風格,
這個項目簡潔優雅,賞心悅目。
感興趣的小伙伴可以跑一下測速,
雖然項目還未刻意往高性能去優化,
但狀態機寫出來性能還是比較優秀的。
而清晰的架構層次和優秀的編碼風格,
都是性能的保證。
6. 最后一些廢話
這個小項目,之所以那么讓我眼前一亮
是因為它如此簡單,簡單到讓我看到
再小的東西都可以寫得很棒啊!!!
我們往往看到前輩們站得很高
但其實有許多機會,可以從前人身上
學習怎么把一點一滴的小事做好
十年前沒有珍惜的機會的話,
那么現在有就很幸福了👩🏻?💻
如果還能在學習過程中,有空去模仿下華生🥜
去記錄一些優秀作品、po出好文,
那已經是目前的我,最大的建設性了。
想深入學習,一起學習小而美項目,提高基本功,基礎概念深入理解,疑難解答,歡迎大家加入極客星球,我們一起進步,掌握核心技術,既能掙錢又能抗壓,掙錢和事業兩不誤,對星球感興趣的,點擊查看->?極客星球:
進騰訊了|學習技術哪家強
- END -
看完一鍵三連在看,轉發,點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
定個目標|建立自己的技術知識體系
大廠后臺開發基本功修煉路線和經典資料
難走的路,從不擁擠
你好,這里是極客重生,我是阿榮,大家都叫我榮哥,從華為->外企->到互聯網大廠,目前是大廠資深工程師,多次獲得五星員工,多年職場經驗,技術扎實,專業后端開發和后臺架構設計,熱愛底層技術,豐富的實戰經驗,分享技術的本質原理,希望幫助更多人蛻變重生,拿BAT大廠offer,培養高級工程師能力,成為技術專家,實現高薪夢想,期待你的關注!點擊藍字查看我的成長之路。
校招/社招/簡歷/面試技巧/大廠技術棧分析/后端開發進階/優秀開源項目/直播分享/技術視野/實戰高手等,?極客星球希望成為最有技術價值星球,盡最大努力為星球的同學提供面試,跳槽,技術成長幫助!詳情查看->極客星球
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 求點贊,在看,分享三連
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的小白如何学习大神的小项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 40张最全计算机网络基础思维导图
- 下一篇: TCP协议疑难杂症全景解析|硬核