操作系統課程是如何改變我的
英文原文:How a course in operating systems changed me
在普林斯頓大學有很多課程改變了我,就像COS 318(操作系統課程)。它極有挑戰,耗時耗力,但是當我學完后回頭想想,我很慶幸我選了這門課。
我當初選擇這門課程的時候很猶豫,因為周圍的人都這么說:
- 操作系統課程聽起來非常難
- 操作系統課程是為那些喜歡計算機底層的人設計的
- 操作系統課程非常浪費時間,而且你平常很少用到這方面的知識
這門課毫無疑問非常難,但是不妨暫時放下你之前聽到的對它的偏見。不學它并不會毀掉你軟件工程師的生涯,但是如果你真的學過了它,你將會在很多方面獲得啟發。我選擇操作系統課程之前其實十分討厭系統底層編程,也很害怕參加這門課程。但是現在來看,我覺得選擇它是我做過最正確的決定之一。下面是我認為這門課程對我作為學生,作為軟件工程師和作為問題解決者所帶來的啟發:
我的經驗和啟發都是基于普林斯頓2013年秋季的COS 318課程來說的,但是這對其他本科操作系統課程也都適用。
1. 操作系統課程讓我更善于調試代碼錯誤(debug)
毫無疑問,在寫一個操作系統的時候,我們需要非常非常多的調試。如果你覺得你在算法課上的調試已經夠難了,那你可以想想如果兩次調試會產生完全不同的結果該是多么令你抓狂。
當你寫的操作系統慢慢變得異常復雜了之后,你就不得不去尋找順手的調試(debug)工具和一套科學合理的調試方法了。
在參加這門課之前,我覺得調試就是隨手做一做的事情,根本不是寫程序的一個正規環節。以往我調試的方法都是把所有我認為可能出錯的地方都修改一遍看看,這是一種毫無技巧可言并且讓人感到無聊的過程,我通常稱之為“橡膠雞調試法”(rubber chicken debugging)。在操作系統課程結束之后,調試從一門藝術變成了一門科學。我開始意識到原來存在一種科學省時的方法能夠迅速精確地定位錯誤(bug),并決定應該采用什么樣的修復方案。
這種調試方法在其他的課程或者經歷中也十分有用。比如,我在Facebook做實習生的時候,我十分接受“親力親為”這樣的代碼工程理念。如果有些部分除了問題,那么就要立刻開始標記記錄日志,然后一直記錄查看,直到一個地方記錄的結果和你所期望的結果出現了不同(這就是錯誤出現的地方)。這種思維方式只有那種高強度的編程課程,類似操作系統課程,才能給你的。
2. 操作系統課程讓我的代碼更高效
操作系統課程突然讓我意識到了代碼的性能問題。如果這個程序運行很慢,我就會停下來想一下:到底是什么是制約性能的關鍵因素?CPU?內存?硬盤I/O?理解了這些基礎的東西讓我在高層次編程的時候讓代碼更快,更簡練。
人們通常都認為操作系統課程只有在底層編程的情況下才會有用。但是事實上并不是這樣,只有用C和匯編寫過操作系統代碼的人才能夠更好地駕馭高級語言。
3. 操作系統課程讓我變成一個更好的合作者
我們的操作系統課程有一些協作完成的項目,兩個同學一組。我十分幸運在協作項目中和我兩個好朋友一起工作。這種一起面對困難的經歷讓我們成為更好的朋友,也讓整個班級同學的聯系更加緊密。
由于有這些協作項目,我們變得更加善于合作。團隊工作很容易陷入這么一種模式:一個人編寫代碼,另外一個坐在旁邊看寫代碼。在操作系統課程上,我們的做法更加高效:兩個人分別負責不同模塊的實現,然后互相檢查對方的代碼。團隊合作同時也增強了我們版本控制的能力,這是一個好的實際應用Git的機會。
4. 操作系統課程讓我更高效解決問題
這是一個年輕程序員面臨的最顯著也是最難解決的問題:當我們遇到問題的時候,常常陷于費曼算法(Feynman Algorithm)
- 把問題寫下來
- 努力去想…想不出來繼續努力想…想…努力…努力想…
- 寫下來答案
采用這個方法讓我操作系統前一部分的項目苦不堪言。這門課讓我不得不去找一個科學的解決問題的方案。我最后想到了一種通用的做編程項目的方案,而且我把這個方法也用到了其他的計算機課程上了。它包括三個步驟:
① 任務:在這個項目中我需要完成哪些目標?我非常看重任務驅動,所以在安排我工作的時候,我會做一份清單,上面有一些劃分成小塊的任務目標。拿烘焙蛋糕打個比方:
- 采購生產原料
- 買雞蛋
- 買牛奶
- 買面粉
- 準備廚具
- 洗碗
- 洗鍋
- 洗勺
- 預熱爐子
- 給鍋涂脂
- 執行整合
- 把雞蛋,牛奶和面粉混合成面糊
- 把面糊鋪到平底鍋上
- 把平底鍋放到爐子上
② 代碼錯誤(Bugs):有哪些代碼中的錯誤是已知的?在這個步驟中,我會跟蹤代碼錯誤和一些我嘗試修復的東西。在早期的項目里,我把時間都浪費到了重復嘗試可能的解決方案上和頻繁遇到一樣的代碼錯誤上了。頻繁追蹤產生的代碼錯誤和修復方案能夠在接下來的項目中節約我很大一部分時間。
③ 問題:我有什么問題?在這部分,只要我遇到了問題,我都會把它們大致記下來。當我翻閱文檔或者詢問同學獲得答案之后,我就會把我學到的知識記錄在這。
有這么一個表格讓我對我所做的項目抱有很大的信心。如果沒有它,我可能現在還在花大量的時間在實驗室里,雖然也可能有進步,但絕對沒有我現在進步得這么明顯。
結束語
操作系統課程確實是一門有挑戰性的課程,但是還是建議能夠參加這門課。它是我成為軟件工程師路上提高最大的一門課。如果即使你學完之后甚至都不記得什么是虛擬層(hypervisor )了,你也會感謝它教會你的其他東西。
一些關于操作系統課程的其他觀點評論: