計算機四強選手
|
視頻 | 課程主頁(課件) |
麻省理工(MIT) |
網易公開課;YouTube、Coursera/edX/ 對應課程的網站 |
OCW/Audio vedio lecture |
斯坦福(StandFord) |
~ | ~ |
加州大學伯克利分校(UCB) | ~ | ~ |
卡內基梅隆大學(CMU) | ~ | ~ |
OCW(OpenCourseWare)上視頻比較少,找視頻的可以去YouTube上或者Coursera、edX上瞅瞅。
電子工程和計算機學科包含:
- 電氣科學與工程理學士/課程6-1
- 電氣工程與計算機科學理學士/課程6-2
- 計算機科學與工程理學士/課程6-3
- 計算機科學與分子生物學理學士/課程6-7
附Degree Chart
- 6-1 http://catalog.mit.edu/degree-charts/electrical-science-engineering-course-6-1/
- 6-2 http://catalog.mit.edu/degree-charts/electrical-engineering-computer-science-course-6-2/
- 6-3 http://catalog.mit.edu/degree-charts/computer-science-engineering-course-6-3/
畢業要求(MIT)
伯克利是怎麼教授學生的
(1)一般CS的課都是視頻的,即使不去也沒有關係,反正YouTube上都有。
(2)教學資源非常強大,上課lecture是很小的一部分,很多課每週都有lab有discussion,每隔幾週一個大的project。每個助教引領一個discussion,而且有office hour專門答疑。lab上不會做了也可以直接問他們會手把手教你。
(3)課程內容豐富而且視野開闊,不會說我單獨的給你上一門C語言什麼的,課程的應用方向是什麼就教什麼。
比方說從他們大一上第一門編程課cs61a,教材用的是伯克利改編的python版本的SICP,
- 整個學期的安排大概是,一開始教你python,基本上兩個禮拜過完語法層面,然後開始講高階函數lambda函數等等接近函數式編程的東西,之後教你各種基本的小算法比如鏈表樹什麼的,但是配套的練習非常多,比如反轉鏈表,快排,二叉樹各種路徑生成搜索等等,然後每個練習都有測試例子可以在本地直接跑。之後是講面向對象編程,在之後是我最喜歡的部分,教scheme這門lisp的方言,也是大概一週過完scheme的語法層面,然後講解函數式編程的美妙之處比如惰性求值lambda演算,在之後讓你用python實現一個scheme的解釋器,體會命令式語言和函數式語言的不同。然後在講講SQL語句與宏啥的。
- 61a每週基本上一到兩次作業加上一次實驗,然後一個學期有四個project,然後project的代碼框架都搭的特別好,比如說第二個project Ants,就是實現一個類似於植物大戰殭屍的遊戲,但是圖形層面基本遊戲邏輯都給你寫好了,但是各種ant單位和敵人的部分交給你實現,這個project寫完你對於面向對象編程就有一些瞭解了。
(4)注重對於整個計算機科學體系的培養
在伯克利,一般的CS學生就是大一上cs61a(structure and interpretation of computer program),大一下cs61b(data structure)加上cs70(Discrete Mathematics and Probability Theory),然後大二上cs61c(machine structure),上完61系列加上70基本上就是junior低年級的CS課就ok了,然後各種課就隨便上170算法,162操作系統,164編譯原理,184圖形學,189機器學習等等。
比方說我上面說的61a是計算機科學的入門課,學生了解了一門面向對象的高抽象的語言python,一門函數式的語言scheme,同時實踐了基本的一些算法(鏈表,二叉樹,快排等等),也瞭解了SQL語句,瞭解了macro宏的概念,寫了很多的作業與實驗具有了一定的編程基礎。然後是61b數據結構,這門課他們是用java教的,也是一兩週過完java語法層面能夠寫一寫基本的算法。在之後是61c相當於我們的計組,抽象層面進一步降低,到硬件的層面,也是一兩週過完C語言(用的是經典的那本教材C語言程序設計),然後教一些基本的彙編指令(用的是伯克利自己研發的RISC-V指令集,開發這個指令集的David Patterson教授今年剛拿圖靈獎),接着將cache,浮點數等等計組的內容,實踐過程中用到了spark和openmp還有intel的simd指令等等東西。最後的project也是實現一個簡單的CPU(用他們提供的程序模擬的)。
(5)視野開拓,理論與實踐並行
我覺得學習操作系統就應該寫操作系統,學編譯原理就應該寫編譯器,但是國內大部分高校這兩門課就很容易教偏了(當然一些頂尖高校像清北復交之南浙之類的應該都教的很好),經常是理論大大多於實踐,搞得學生沒有興趣,我上的162操作系統就是改pintos這個教學用的操作系統,雖然實現的過程比較痛苦(原諒我菜),也參考了別的組的文檔,但是感覺收貨非常大,你真正的才能知道原來操作系統是怎麼回事,而不是成天看書背書背概念。
(6)沒有水課,至少就計算機專業課來說,基本沒有。
(7)不開無意義的課
像我在國內竟然Linux的使用還要單獨開課,這。。。自己找本鳥哥的書,查查文檔手冊啥的直接上手不就行了?然後學過了一門命令式語言比如C/C++後還要專門開課教java,而且還每週還只講講基本語法,一週講變量,一週講條件語句。。