我在逛知乎的時候看到一個問題:
隨手寫了個回答,沒想到很多讀者都表示說出了心聲,所以也同步發(fā)到公眾號。
以下是原回答
我自己是 CS 科班的,讀者里也有很多各大高校
計算機的同學,覆蓋了上交、北郵、南郵、華科、川大、普通一本等等,根據(jù)他們反饋,總結了以下幾點:
- 上課耽誤學習,不上課考勤扣分,拿不了高績點,耽誤保研出國。不多說,懂的都懂哈哈。
- 課程設置不合理,實驗課多,作業(yè)多,并且大多是寫 Word 報告,實驗報告就像這種(迪杰克斯拉算法):
- 占了很多時間,但是效果卻不如自學,上課基本是放 PPT,考試內容全在 PPT 上,看書的同學沒有背 PPT 的分數(shù)考得高,沒有人愿意去啃那些大厚書,因為“性價比”太低。
- 都 2021年了,估計沒有幾個學校提交代碼是用 Git、Gitlab 這些工具吧,評分也沒有搞自動化測試。做悉大、MIT這些學校的 labs,都是直接去網(wǎng)站提交代碼,跑 test case,馬上就能知道哪些 case 沒有過,再去 debug。
- 教材大部分使用自己編的,水平如何就不多說了,懂的都懂。很多書上還是用 VC 6.0 來寫的 C,為什么不換用更加優(yōu)秀經(jīng)典的教材呢?順便貼一個匿名回答:不過值得表揚的是,我們學校教材基本都是使用全英文黑皮書,比如《計算機網(wǎng)絡:自頂向下》、《深入理解計算機系統(tǒng)》等,這樣的學校我知道有 15 所以上,希望會越來越多~對于計算機的學生,最好的資料和書籍是美帝那邊的,因為計算機就是發(fā)源自美帝。
- 講課全程 PPT,放 PPT 就算了吧,很多 PPT 還是十幾年都沒更新那種(C語言 PPT 上用的還是 VC6.0....),什么 C 語言 main 函數(shù)返回值 void。
我看過的一門非常經(jīng)典課程,MIT CS107,講師全程幾乎都是黑板粉筆板書,學生跟著老師思路學習,這才是最高效的,而且各自手寫代碼、手畫棧幀、手寫匯編:
CS107在我大學期間,只有一位數(shù)學老師堅持板書,大部分基本就是放 PPT 了事,下面的學生紛紛拿起手機拍照,或者直接下課去拷 PPT,這樣能學到多少呢?
- 代碼量太少,很多同學到畢業(yè)估計幾萬行都沒寫到,但是真正想鍛煉出極強的編程能力沒有 10w 很難,這方面作為學生我們也要多反思,為什么平時沒有寫到這么多代碼。
- 很多學校就是孤立的學了一堆 操作系統(tǒng)、計組、體系結構、編譯原理、C、匯編,但是很少有同學能把這些課程連起來形成 CS 體系,這方面 CMU 的神書神課《CSAPP》又要提下了,幸好我們學校開設了系統(tǒng)編程的課程,教材就是 CSAPP,其它沒有開設這門課的學校建議學弟學妹們自學。
- 課程設置雜亂,學了一堆的數(shù)電、模電、大學物理..... 想起大一被大物實驗支配的恐懼,時間都費在這些上面了,說實話把這些課程壓縮,上一些函數(shù)式編程、或者比較前沿的 CS 方向,我覺得對計算機專業(yè)更好!
- 核心課程上的太晚!我們學校大二下、大三才開始計網(wǎng)、操作系統(tǒng)、數(shù)據(jù)庫原理等核心課程,太晚了,這些課程至少要在大三前完成,大三再開設圖形學、編譯原理等進階課程,大四直接就是實踐課程為主或者讓同學們自己出去找實習!
我個人覺得大概這樣設置CS課程更為合理:大一上:C/C 程序設計、高數(shù)1(初等微積分)、離散數(shù)學大一下:數(shù)字邏輯、數(shù)據(jù)結構、匯編語言、面向對象編程(Java/C )、高數(shù)2 、線性代數(shù)大二上:軟件工程、數(shù)據(jù)庫、Java/Python Web開發(fā)、組成原理大二下:操作系統(tǒng)、計算機網(wǎng)絡、系統(tǒng)級編程(CSAPP)大三:軟件測試、軟件安全、課程設計、密碼學、圖形學等選修方向大四:實踐、畢設、實習
另外,還有最大的問題就是OS、網(wǎng)絡、數(shù)據(jù)庫等 CS 核心課程上成了文科!缺乏一些動手實踐 Lab,大部分都是寫實驗報告,就是不寫代碼。為什么美帝在數(shù)據(jù)庫、操作系統(tǒng)、各種工業(yè)軟件工程能力如此強悍?我覺得和他們 CS 強校的教育模式有關。國外,尤其是美國,很多高校 CS 教育極其注重實踐,國內也就清北復交浙等少數(shù) TOP 學校有少量的實踐教學,其它大部分是念 PPT,課后作業(yè)就是做 Word 項目。因為很多老師自己也不會編程.... 更沒法設計那些硬核的實驗和輔助教學平臺,不會編程的人教你編程......這結果能好么。就拿我自己來說,學校好歹也是個 985 吧,我上了三周的 Java 課,愣是沒聽懂在講啥,最后看了幾個尚學堂高琪的視頻幾天就入門了....
再來說美國為什么有強大的基礎軟件能力吧,這得益于他們的高校在培養(yǎng)學生造輪子的能力。比如國外是如何學習數(shù)據(jù)庫的?就拿 MIT 來說,6.830 Database Systems: 這是一門數(shù)據(jù)庫系統(tǒng)的一門核心課程。前半部分比較基礎的數(shù)據(jù)庫的知識,后半段主要在講Distributed Databases的東西他們的實驗是什么?是讓你寫個小型關系型數(shù)據(jù)庫,比如 lab1實現(xiàn)數(shù)據(jù)庫基本的存儲邏輯結構,具體包括:Tuple、TupleDesc、HeapPage、HeapFile、SeqScan、BufferPool等。國內數(shù)據(jù)庫教什么?教 SQL 怎么寫,教數(shù)據(jù)庫原理(這個還算好的)更有甚者實驗就是安排用 Java 使用 JDBC 連接MySQL 寫個應用。。。國外是如何教計算機網(wǎng)絡的?手寫 TCP!比如斯坦福 CS 144,CS144 Lab Assignments - 手寫TCP - LAB4
img國內是怎么教的?記住 TCP 三次握手、四次揮手、記住 DNS使用 UDP協(xié)議....國內大作業(yè)是什么?有些是 Word 寫報告。。。有些是讓你用一下 socket api 寫個網(wǎng)絡程序。。。好吧,其實會用 socket 的也挺不錯的,最關鍵是有些直接讓你寫個爬蟲、HTTP 服務,就算是使用了網(wǎng)絡協(xié)議了。。。這是計算機網(wǎng)絡原理嗎?國外是如何教 操作系統(tǒng)的?比如 MIT 6.828,現(xiàn)在改名了。直接讓你基于一個 xv6 去實現(xiàn)一些模塊,比如文件系統(tǒng)、多線程。國內是如何教的?記住進程和線程區(qū)別、記住虛擬內存的各種組關聯(lián)....當然也有一些學校會有實驗,比如清華 ucore、哈工大 linux0.11、川大也有引入 nachos這就是為什么美國高校有很強的編碼能力、造輪子的能力,因為他們的CS學生成長環(huán)境就是這樣的。大多數(shù)高校老師升職不靠教學,所以大家都沒把心思放在教學上,做“研究”發(fā)論文,不香么。設計這么多麻煩的實驗不是給自己找麻煩么弄個 PPT、Word 多爽呀這個現(xiàn)象我估計還會一直持續(xù)下去,老實說,跟著學校的路線走,學計算機,大概率畢業(yè)即失業(yè)。
給大家列舉一個我做過的國外老師設計的實驗吧:模擬實現(xiàn) TCP 可靠傳輸?shù)?/strong>人家老外老師就是給力,直接做了一個網(wǎng)站,這個網(wǎng)站你可以通過 TCP 連接上去,然后你需要創(chuàng)建幾個節(jié)點,互相發(fā)消息。他們之間的消息都會經(jīng)過老師的網(wǎng)站所以通過網(wǎng)站上是可以控制丟包率的,也能控制節(jié)點的拓撲結構,要求就是讓你基于這種不可靠的信道,做出可靠數(shù)據(jù)傳輸!這簡直就是翻版 TCP 嘛,超時重傳、ACK、滑動窗口啥的都給我安排上!就是像下面圖中一樣,圓圈就表示你可達的范圍,不同節(jié)點形成各種網(wǎng)絡拓撲,可以調節(jié)網(wǎng)絡 丟包率 Loss chance。設計這些東西、實驗系統(tǒng)、自動化測試評分系統(tǒng),肯定需要花費老師大量時間精力,但是有沒有帶來多少升職上的產(chǎn)出,當然沒動力去搞啰。反正吧,學計算機最好不要全部去跟著學校學,除非你學校很好,不然大概率畢業(yè)即失業(yè)。當然,說了這么多問題,也是有長處的,這里引用知乎一位答主邦彥的總結:最后,附上這個回答下的一些評論:鄭重申明
本文非崇洋媚外,吐槽只針對部分高校的現(xiàn)象。像清華、哈工大、南大就有非常不錯的課程,也在積極像 MIT、Stanford 學習,畢業(yè)的時候已經(jīng)有自己造的編譯器、OS、數(shù)據(jù)庫等等,并且均使用 docker 和 gitlab CI 解決環(huán)境和自動化測試問題。-- 來自評論區(qū)但是這樣的學校有點少,希望國內能有更多高校計算機教育模式能夠早日跟美帝等 CS 強校接軌。培養(yǎng)更多基礎扎實、編程能力強的學生,助力操作系統(tǒng)、數(shù)據(jù)庫等基礎軟件、工業(yè)軟件的發(fā)展。