程序員必練六大項(xiàng)目:從數(shù)據(jù)結(jié)構(gòu)到操作系統(tǒng),計(jì)算機(jī)教授為你畫(huà)重點(diǎn)
魚(yú)羊 編譯整理
量子位 報(bào)道 | 公眾號(hào) QbitAI
編程這件事,光有理論是不夠的,動(dòng)手實(shí)踐是必修課。
不過(guò),從什么項(xiàng)目入手,往往讓人犯了難。
如果你還在糾結(jié),應(yīng)該拿什么項(xiàng)目來(lái)開(kāi)始自己的編程練習(xí),不妨來(lái)看看這份“程序員都應(yīng)該嘗試的挑戰(zhàn)性項(xiàng)目”清單。
這是田納西大學(xué)助理教授奧斯汀·亨利(Austin Z. Henley)結(jié)合自身經(jīng)驗(yàn),給出的良心推薦。不僅總結(jié)了知識(shí)要點(diǎn),讓你在學(xué)習(xí)中有的放矢,還貼心整理了拓展閱讀資料。
你可以多次構(gòu)建這些項(xiàng)目,每次從中收獲新的知識(shí)。
每當(dāng)我不知道該拿什么練手,或者想學(xué)習(xí)一種新的編程語(yǔ)言或框架時(shí),我就會(huì)從以下項(xiàng)目中選擇一種開(kāi)始coding:
每個(gè)程序員都應(yīng)該嘗試的挑戰(zhàn)性項(xiàng)目
文本編輯器
不使用GUI框架中內(nèi)置的文本框組件,要如何搭建支持光標(biāo)移動(dòng)、選擇、插入和刪除操作的文本框?
這個(gè)項(xiàng)目中,存在兩個(gè)主要挑戰(zhàn):
- 如何將文本文檔存儲(chǔ)在內(nèi)存中
- 學(xué)習(xí)文本光標(biāo)在流行的編輯器中的行為
不要小看這些基礎(chǔ)的功能,其中有許多細(xì)節(jié)值得注意。比如當(dāng)光標(biāo)位于文本當(dāng)中,按下向上箭頭,光標(biāo)會(huì)移動(dòng)到何處?
△圖源:Austin Z. Henley
如果你覺(jué)得這太簡(jiǎn)單,還有進(jìn)階測(cè)試:
- 撤銷/重做
- 自動(dòng)換行
最后總結(jié)一下知識(shí)要點(diǎn):
- 用于存儲(chǔ)文本的數(shù)據(jù)結(jié)構(gòu):數(shù)組,rope,gap buffer,piece table
- 文本光標(biāo)的行為和實(shí)現(xiàn)
- 撤銷/重做的設(shè)計(jì)模式:記憶,命令
- 分離文本視覺(jué)和記憶的抽象
別忘了還有拓展閱讀喲:
2D游戲-太空侵略者
即使是最簡(jiǎn)單的游戲也需要考慮數(shù)據(jù)結(jié)構(gòu)和設(shè)計(jì)模式。
在這個(gè)項(xiàng)目中,你的任務(wù)是從頭到尾實(shí)現(xiàn)一個(gè)定義明確的游戲。最好使用SDL,SFML,PyGame這樣的2D圖形庫(kù)。
△圖源:Austin Z. Henley
第一步,創(chuàng)建對(duì)象移動(dòng)的效果。
第二步,了解有關(guān)游戲循環(huán)的所有信息。游戲?qū)嶋H上是在繪圖、獲取用戶輸入和處理游戲邏輯之間循環(huán)。
第三步,處理用戶輸入。
第四步,學(xué)習(xí)如何創(chuàng)建和管理所有游戲?qū)ο蠹捌錉顟B(tài)。比如如何生成動(dòng)態(tài)數(shù)量的敵人。
第五步,學(xué)習(xí)如何應(yīng)用游戲的邏輯。子彈頭位置何時(shí)更新?什么時(shí)候會(huì)有更多敵人出現(xiàn)在屏幕上?怎么判定敵人被干掉了?游戲何時(shí)結(jié)束?
甚至,在進(jìn)階階段,你還可以考慮引入AI,來(lái)制造更加“智能”的敵人。
編譯器-Tiny BASIC
從頭開(kāi)始編寫(xiě)一種非常小的類似于BASIC的語(yǔ)言編譯器,然后將其編譯為任何其他語(yǔ)言。比如,用Python編寫(xiě)可以輸出C#代碼的Tiny BASIC編譯器。
△圖源:Austin Z. Henley
知識(shí)點(diǎn):
- 詞法分析
- 句法分析
- 遞歸下降解析
- 抽象語(yǔ)法樹(shù)
- 語(yǔ)義分析
- 優(yōu)化passes
- 代碼生成
迷你操作系統(tǒng)
從這個(gè)項(xiàng)目開(kāi)始,難度就加大了。
操作系統(tǒng)依賴于硬件,因此入門(mén)門(mén)檻比較高。但這個(gè)項(xiàng)目可以幫助你更好地理解計(jì)算機(jī)底層都發(fā)生了什么。
作者亨利推薦了一本免費(fèi)電子書(shū)《使用Rust構(gòu)建RISC-V操作系統(tǒng)》作為入門(mén)教材(地址見(jiàn)文末)。
△圖源:Austin Z. Henley
知識(shí)點(diǎn):
- 交叉編譯
- Bootloading
- BIOS中斷
- x86模式
- 內(nèi)存管理和分頁(yè)
- 排程(Scheduling)
- 文件系統(tǒng)
如果以上四個(gè)項(xiàng)目,你都覺(jué)得so easy,那么就來(lái)嘗試一下最后這兩個(gè)高難度項(xiàng)目吧。
電子表格
電子表格應(yīng)用程序(如Excel)將文本編輯器和編譯器的挑戰(zhàn)結(jié)合在了一起。
在這個(gè)項(xiàng)目中,你需要學(xué)會(huì)如何在內(nèi)存中表示單元格內(nèi)容,并實(shí)現(xiàn)用于方程式的編程語(yǔ)言解釋器。
電子游戲機(jī)模擬器
這是一個(gè)操作系統(tǒng)+編譯器的二合一挑戰(zhàn)項(xiàng)目。
挑戰(zhàn)內(nèi)容是,編寫(xiě)一個(gè)虛擬機(jī),讓虛擬機(jī)可以像真實(shí)的CPU和其他硬件組件一樣運(yùn)行。
亨利的建議,是從簡(jiǎn)單的虛擬控制臺(tái)入手,比如CHIP-8。
網(wǎng)友建言獻(xiàn)策
博客一出,在Hacker News、Reddit上受到了廣大碼農(nóng)們的歡迎。
有網(wǎng)友說(shuō):
這些項(xiàng)目能讓我接觸到完全不同的領(lǐng)域和問(wèn)題,比我日常的工作更能激勵(lì)我。
并且,網(wǎng)友們紛紛建言獻(xiàn)策,又推舉出好幾個(gè)優(yōu)質(zhì)上手項(xiàng)目:
- 從零搭建數(shù)據(jù)庫(kù)
- 光線追蹤器
- 矢量圖形編輯器
- 圖像解碼器
- 網(wǎng)頁(yè)聊天室
- pi計(jì)算器的位數(shù)
- 通用終端實(shí)用程序(如grep)
- FTP客戶端和服務(wù)器
所以,這些項(xiàng)目是否激發(fā)了你的靈感?
Talk is cheap. Show me the code. 快動(dòng)手練起來(lái)吧~
傳送門(mén)
博客地址:
http://web.eecs.utk.edu/~azh/blog/challengingprojects.html
Hacker News討論(內(nèi)含更多項(xiàng)目推薦):
https://news.ycombinator.com/item?id=21790779
《使用Rust構(gòu)建RISC-V操作系統(tǒng)》:
http://osblog.stephenmarz.com/index.html
—?完?—



