日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

小白如何学习大神的小项目

發(fā)布時(shí)間:2024/4/11 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小白如何学习大神的小项目 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0. 背景

最近Workflow項(xiàng)目作者
也就是一位低調(diào)的架構(gòu)師(懂的都懂
起因只是為了供Workflow項(xiàng)目使用,
而低調(diào)地寫(xiě)了一個(gè)json-parser

但我看完之后覺(jué)得🤩🤩🤩wow~
這代碼如此簡(jiǎn)單,卻應(yīng)有盡有
如果十年前的我能看到這樣的項(xiàng)目就好了!
因此22同學(xué)冒著被打的風(fēng)險(xiǎn),
結(jié)合這個(gè)項(xiàng)目寫(xiě)了這篇,
aka,《小白如何學(xué)習(xí)大神的小項(xiàng)目》
給當(dāng)年的啥都不會(huì)的自己,也給需要的小童鞋~
So,有經(jīng)驗(yàn)的朋友可以不用往下看了👋

其實(shí),大家都希望多看優(yōu)秀前輩的作品
學(xué)習(xí)里邊經(jīng)典的設(shè)計(jì)優(yōu)雅的編碼風(fēng)格
但前輩們的項(xiàng)目往往又太大、太難、太復(fù)雜
如果Jeff Dean能開(kāi)個(gè)幾百行代碼的小項(xiàng)目
我會(huì)讓十年前的自己每天大聲朗讀一遍👌

1. 了解項(xiàng)目要解決什么問(wèn)題

理解項(xiàng)目最大的障礙在于:
看不到它的需求。
所以上來(lái)看復(fù)雜的項(xiàng)目會(huì)覺(jué)得很奇怪,
為什么要這樣做?

回到項(xiàng)目本身:json-parser,顧名思義,
就是我們網(wǎng)絡(luò)傳輸常用json格式,
而收到這么一串內(nèi)容之后,
解析到具體數(shù)據(jù)結(jié)構(gòu),
方便我們后續(xù)用接口訪問(wèn)。

比如json里給我們這串內(nèi)容是個(gè)數(shù)組:
[1, "abc", 12.3, -4],
我們希望得到的數(shù)據(jù)結(jié)構(gòu)是類似
struct json_value[4];
或者std::vector<JSON_VALUE>;
在工程上這件事很常見(jiàn),叫做:反序列化

2. 項(xiàng)目結(jié)構(gòu)和前置知識(shí)

項(xiàng)目往往需要依賴其他項(xiàng)目進(jìn)行構(gòu)建的,
因此我們需要先來(lái)看看目錄結(jié)構(gòu)
它包括哪些內(nèi)容,需要依賴什么其他項(xiàng)目
我們先看看這個(gè)json-parser:

基于C寫(xiě)的,所以人均都能看得明白:
里邊有用于構(gòu)建項(xiàng)目的Makefile
開(kāi)源所需要的LICENSE
項(xiàng)目主頁(yè)文檔README.md

然后就是簡(jiǎn)單的代碼本碼,
可以看到四舍五入只有800行
適合懶癌晚期的你👍
項(xiàng)目依賴有多種做法,這里是源碼依賴
也可以交給githubsubmodule
或者交給不同系統(tǒng)的包管理工具。
最后附上示例程序和性能測(cè)試用例,
方便使用者直接上手使用。

3. 了解構(gòu)建方式, 快速run起來(lái)

以前我的大學(xué)時(shí)期,是沒(méi)有教怎么構(gòu)建項(xiàng)目的
入職百度之后學(xué)的第一件事就是寫(xiě)Makefile
(想念當(dāng)年一起學(xué)的小伙伴果凍同學(xué)
現(xiàn)在學(xué)校里對(duì)工程構(gòu)建的教學(xué)要重視多了
先前有遇到過(guò)大學(xué)生問(wèn)怎么構(gòu)建Workflow
說(shuō)是老師給的作業(yè)???🤔
Makefile是C++項(xiàng)目構(gòu)建的必備知識(shí)
新的構(gòu)建方式還有cmakebazel等,
都值得后續(xù)了解。

這份Makefile麻雀雖小五臟俱全,
基本要素都有了:

CFLAGS?=?-g?-Wall?-O2 CC?=?gcc LD?=?gccall:?test_speed?parse_jsontest_speed:?json_parser.o?rbtree.o?test_speed.o$(LD)?-o?test_speed?$parse_json:?json_parser.o?rbtree.o?test.o$(LD)?-o?parse_json?$^clean:rm?-f?parse_json?test_speed?*.o

Linux/Mac下直接執(zhí)行命令make
就可以run起來(lái)~
避免新手IDE、構(gòu)建搞半天然后從入門(mén)到放棄

4. 廣搜看項(xiàng)目:初窺內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)list.h和rbtree.h

看項(xiàng)目到底是bfs還是dfs
我們可以對(duì)第一層先bfs看個(gè)大概,
梳理出有哪幾塊內(nèi)容,
再針對(duì)每塊內(nèi)容dfs直到搞明白為止。

json-parser中內(nèi)容很少,
值得一提的是僅有的兩個(gè)依賴:
listrbtree
學(xué)習(xí)委員劃重點(diǎn):
鏈表和樹(shù),是工業(yè)項(xiàng)目最基本的數(shù)據(jù)結(jié)構(gòu)
因?yàn)橛玫?strong>C99寫(xiě)的,
因此從Linux kernel里搬了這兩結(jié)構(gòu)過(guò)來(lái)用
感興趣的小伙伴
可以借此機(jī)會(huì)圍觀下kernel的代碼風(fēng)格,
一個(gè)雙向鏈表是長(zhǎng)這樣的:

struct?list_head?{struct?list_head?*next,?*prev; };

然后我們就可以愉快地嵌入到其他結(jié)構(gòu)中
基于任何結(jié)構(gòu)類型制作一個(gè)雙向鏈表
但>~< 這不是這次要介紹的重點(diǎn)~~~

5. 深搜看項(xiàng)目:接口設(shè)計(jì)、架構(gòu)層次、編碼風(fēng)格

接口設(shè)計(jì)的三個(gè)重點(diǎn):簡(jiǎn)單!簡(jiǎn)單!還是簡(jiǎn)單!
我們先通過(guò)test.cc感受一下接口設(shè)計(jì):

int?main() {...json_value_t?*val?=?json_value_create(buf);if?(val){????print_json_value(val,?0);????json_value_destroy(val);???}...

輸入一段內(nèi)容,輸出一個(gè)反序列化好的對(duì)象
不需要初始化任何東西,不需要其他參數(shù)。
什么額外的optionsparamsconfig
能不要盡量不要,
不要讓使用者有其他心智負(fù)擔(dān)。

create對(duì)應(yīng)destroy,都很嚴(yán)謹(jǐn)?shù)?br />明確的內(nèi)存生命周期更有利于開(kāi)發(fā)者理解。
接口設(shè)計(jì)是最體現(xiàn)細(xì)節(jié)和品控的~
如果哪個(gè)項(xiàng)目會(huì)create對(duì)應(yīng)delete
或者new對(duì)應(yīng)destroy之類的
甚至更過(guò)分調(diào)用new不需要delete的
我直接一口屏幕噴到鮮血上

那么架構(gòu)層次呢?
項(xiàng)目整體的編程范式和架構(gòu)是否統(tǒng)一很重要。

這個(gè)項(xiàng)目足夠簡(jiǎn)單,
因此我們可以很快抓到它的架構(gòu)重點(diǎn):
它是C語(yǔ)言中面向?qū)ο蟮膶?xiě)法
整體圍繞json_value_t
打開(kāi)頭文件可以看到這個(gè)對(duì)象的幾個(gè)方法:

int?json_value_type(const?json_value_t?*val);???? const?char?*json_value_string(const?json_value_t?*val);? double?json_value_number(const?json_value_t?*val);

json的結(jié)構(gòu)里,
數(shù)組里的元素可以是對(duì)象
對(duì)象里有可以是數(shù)組
因此數(shù)據(jù)的表達(dá)可以是遞歸的。
而json-parser解析的架構(gòu)層次一樣,也是遞歸

剛才介紹到的用戶接口函數(shù)👇

json_value_t?*json_value_create(const?char?*doc)

它會(huì)調(diào)用到我們遞歸的入口:

ret?=?__parse_json_value(doc,?&doc,?0,?val);

我們需要抽象出一些結(jié)構(gòu)去進(jìn)行遞歸
把剛才的數(shù)組、對(duì)象的關(guān)系裝到list/rbtree
涉及到遞歸調(diào)用的接口有以下這些,
感興趣的小伙伴歡迎源碼進(jìn)一步閱讀

static?int?__parse_json_value(const?char?*cursor,?const?char?**end,?int?depth,?json_value_t?*val);??? static?int?__parse_json_object(const?char?*cursor,?const?char?**end,?int?depth,?json_object_t?*obj);??? static?int?__parse_json_elements(const?char?*cursor,?const?char?**end,?int?depth,?json_array_t?*arr); static?int?__parse_json_array(const?char?*cursor,?const?char?**end,?int?depth,?json_array_t?*arr); static?int?__parse_json_member(const?char?*cursor,?const?char?**end,?int?depth,?json_member_t?*memb);? static?int?__parse_json_members(const?char?*cursor,?const?char?**end,?int?depth,?json_object_t?*obj);

這里就不細(xì)說(shuō)狀態(tài)轉(zhuǎn)換圖了
畢竟本文不是教大家怎么解json
另外,編碼風(fēng)格很重要。
多看風(fēng)格好的項(xiàng)目,
才能不被有毒的代碼帶跑偏。

秉承作者一貫的編碼風(fēng)格,
這個(gè)項(xiàng)目簡(jiǎn)潔優(yōu)雅賞心悅目。
感興趣的小伙伴可以跑一下測(cè)速,
雖然項(xiàng)目還未刻意往高性能去優(yōu)化,
但狀態(tài)機(jī)寫(xiě)出來(lái)性能還是比較優(yōu)秀的。

而清晰的架構(gòu)層次和優(yōu)秀的編碼風(fēng)格,
都是性能的保證。

6. 最后一些廢話

這個(gè)小項(xiàng)目,之所以那么讓我眼前一亮
是因?yàn)樗绱撕?jiǎn)單,簡(jiǎn)單到讓我看到
再小的東西都可以寫(xiě)得很棒啊!!!
我們往往看到前輩們站得很高
但其實(shí)有許多機(jī)會(huì),可以從前人身上
學(xué)習(xí)怎么把一點(diǎn)一滴的小事做好

十年前沒(méi)有珍惜的機(jī)會(huì)的話,
那么現(xiàn)在有就很幸福了👩🏻?💻
如果還能在學(xué)習(xí)過(guò)程中,有空去模仿下華生🥜
去記錄一些優(yōu)秀作品、po出好文,
那已經(jīng)是目前的我,最大的建設(shè)性了。


想深入學(xué)習(xí),一起學(xué)習(xí)小而美項(xiàng)目,提高基本功,基礎(chǔ)概念深入理解,疑難解答,歡迎大家加入極客星球,我們一起進(jìn)步,掌握核心技術(shù),既能掙錢(qián)又能抗壓,掙錢(qián)和事業(yè)兩不誤,對(duì)星球感興趣的,點(diǎn)擊查看->?極客星球:

進(jìn)騰訊了|學(xué)習(xí)技術(shù)哪家強(qiáng)


- END -


看完一鍵三連在看轉(zhuǎn)發(fā)點(diǎn)贊

是對(duì)文章最大的贊賞,極客重生感謝你

推薦閱讀

定個(gè)目標(biāo)|建立自己的技術(shù)知識(shí)體系


大廠后臺(tái)開(kāi)發(fā)基本功修煉路線和經(jīng)典資料

難走的路,從不擁擠

你好,這里是極客重生,我是阿榮,大家都叫我榮哥,從華為->外企->到互聯(lián)網(wǎng)大廠,目前是大廠資深工程師,多次獲得五星員工,多年職場(chǎng)經(jīng)驗(yàn),技術(shù)扎實(shí),專業(yè)后端開(kāi)發(fā)和后臺(tái)架構(gòu)設(shè)計(jì),熱愛(ài)底層技術(shù),豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),分享技術(shù)的本質(zhì)原理,希望幫助更多人蛻變重生,拿BAT大廠offer,培養(yǎng)高級(jí)工程師能力,成為技術(shù)專家,實(shí)現(xiàn)高薪夢(mèng)想,期待你的關(guān)注!點(diǎn)擊藍(lán)字查看我的成長(zhǎng)之路

校招/社招/簡(jiǎn)歷/面試技巧/大廠技術(shù)棧分析/后端開(kāi)發(fā)進(jìn)階/優(yōu)秀開(kāi)源項(xiàng)目/直播分享/技術(shù)視野/實(shí)戰(zhàn)高手等,?極客星球希望成為最有技術(shù)價(jià)值星球,盡最大努力為星球的同學(xué)提供面試,跳槽,技術(shù)成長(zhǎng)幫助!詳情查看->極客星球

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 求點(diǎn)贊,在看,分享三連

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的小白如何学习大神的小项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。