每個程式設計師都有一個作業系統夢吧, 我記得年輕的時候, 意氣風發,給女朋友說過要做一個像Windows那樣的作業系統,女朋友當時很崇拜的樣子,十多年過去了,孩子都上學了, 這件事我不敢給她提了。
最近有個同學在微信上問我, 又提到了這回事:
我雙手支援、贊成,因為寫不了Windows, 造個輪子還不是不錯的。
尤其是學生階段,有充裕的、大塊的時間,造輪子再合適不過了。
01 作業系統
造輪子作業系統當排名第一,原因前面也說了,作業系統的誘惑實在太大,在一個裸機上執行一個系統,讓冰冷的機器聽從自己的指揮, 讓這個系統管理所有的硬體,支援上層的應用,說實話, 有一種當上帝的感覺。
但是造作業系統難度也是最高的, 首先得理解Intel CPU的那一大堆細節, 什麼真實模式、保護模式、A20, GDT, IDT, 中斷處理...... 深入進去,如果你不頭暈腦脹一段時間,說明你還沒有透徹理解。
系統的啟動得用匯編編寫, 度過了這一段難熬的時間,才能進入C語言的世界,去實現程式排程、記憶體管理、檔案系統、I/O管理。
我覺得一般人寫個玩具,體驗一下和硬體打交道的感覺,在實踐中精確理解程式、執行緒、檔案等抽象就夠了。 只有大神才會在上面折騰GUI, 移植遊戲,然後搞成了Linux ,寧靜OS。
難度指數:5顆星
吹牛皮指數:爆棚
相關書籍:
《作業系統真象還原》
《Orange'S:一個作業系統的實現》
《Linux核心設計的藝術》
《Linux核心完全剖析》
02 資料庫
排名第二的我認為是資料庫, 但現實中我發現很少有人去寫,不知道是什麼原因,也許是吹牛皮指數太低?
其實資料庫是很有料的:
1. 編譯原理的知識
因為你得做SQL語句的解析,轉化成內部的資料結構。
不需要特別深入,因為現在有很多趁手的工具了,例如Antlr,挺好用的。
2. 索引
B+樹, 因為關聯式資料庫儲存需要用它
3. 事務
你需要自己去實現事務,undo ,redo日誌等。
深入一點的話要考慮事務的隔離級別。
4. 查詢優化
對資料庫感興趣的同學,強烈推薦SQLite,可以從最早期的原始碼開始看起。
難度指數 :4顆星
吹牛皮指數:??
相關書籍:
慘,中文的居然沒有,可以去看SQLite官網,資料很齊全
03 網路軟體
第三名是網路程式。這個範圍很廣,可以是:
像Ngnix 那樣的HTTP伺服器:實現HTTP協議,學習epoll,反向代理,模組化設計等等
或者像Tomcat這樣Web應用伺服器,既支援HTTP協議,又可以執行Servlet和JSP。
或者是Redis這樣的高效能的快取服務,學習它和客戶端的協議設計,如何快速地存取資料,對外提供的API,持久化等。
有人說它們屬於中介軟體,也有道理,因為不是OS和資料庫這樣的基礎軟體,又不是單純的應用軟體,將來工作以後,日常打交道非常多,造一個輪子,發到GitHub上, 寫到簡歷中,非常吸睛。
難度指數:4 顆星
吹牛皮指數 :5顆星
相關書籍:
《Redis設計與實現》
《How Tomcat Works》
04 虛擬機器
第四名是虛擬機器, 這個輪子也是我非常推薦的。
以Java為例, 寫個虛擬機器能非常透徹地理解Java 的位元組碼,因為在執行之前,必須要解析.class檔案,在實現執行引擎的時候,得理解棧幀、本地變數表、方法區、堆等概念。
然後還得實現各種指令:儲存指令、棧指令、數學指令、比較指令等
如果你還能實現垃圾回收,那就更牛了!
折騰一圈下來,這門語言對你基本上就沒有什麼祕密了。再去看別的語言和虛擬機器:怎麼都長得差不多啊!
難度指數:4顆星
吹牛皮指數:5顆星
相關書籍:
《自己動手寫Java虛擬機器》
《深入理解Java虛擬機器》
05 程式語言
最後是程式語言, 造這個輪子的人更少,因為現在程式語言很成熟, 即使你造出來了,估計也是沒人用的。
現在GitHub火熱的都是那些“文言文程式設計”,“東北話程式設計”,沒啥實戰意義,在自媒體的追逐下一時比較吸睛,但是熱點一過就煙消雲散。當然,你要是追求流量那另當別論。
造程式語言主要的知識是《編譯原理》, 這門課喜歡的人不多,討厭的不少, 在公司也很少用到相關的知識,所以除非你對程式語言有強烈的愛好,否則大概率是賠本的。
不過造程式語言很可能會讓你對“為什麼XXX的語法這麼設計”有較深理解,並且會培養獨特的“品味”, 這點兒挺不錯。
難度指數:4顆星
吹牛皮指數:就看你的語言有多少人用了
相關書籍
《自制程式語言》
《程式語言實現模式》
可能有人要問了,你BB這麼多,你自己寫過啥,造過啥輪子?
這真是個好問題,我還真造過,答案就在我的公眾號“碼農翻身”中。