Sunday, February 22, 2015

[CMU v.s. 交大] - 學期中修課心得

晚上在學校自習

前言

在Carnegie Mellon University交換的日子已經邁入期中,我所修的其中一門課考完了期中考,其餘的則有Project在進行中。與學期初修課心得的想法的是一樣:希望把我所見所聞跟更多人分享。

在CMU要同時兼顧課業、社交活動與睡覺實在很困難,而我近日的時間安排則是:
  • 早上:寫作業、準備當日上課需要的閱讀
  • 下午:上課或討論Project
  • 晚上:參與活動或與同學討論作業
  • 深夜:繼續寫作業
每日睡五至六小時,但對於生活中遇到的每件事情都讓我很興奮,特別是在這裡新認識的每一個人;而,這篇文章我會將重點放在修課部分,以及我們可以學習的地方。

修課

這學期我總共修了四門課,分別是Principles of Software Construction: Objects, Design, and Concurrency、Web Application Development、Network Security與Advanced Web Design,以下我簡短介紹這幾門課的內容與特別的地方,而在「反思」的部分則描述與交大相呼應、可學習的地方。

Principles of Software Construction: Objects, Design, and Concurrency

這是CS二年級的課,但我在課程中認識的人大部份都已經是研究生了。內容以比較高角度的方式看寫程式的架構與設計,講述抽象的程式設計概念(Design Pattern)並學習畫UML圖(例如程式流程圖、物件關係圖等)。
這堂課每週都有作業,也是我起先花最多時間寫作業的一門課,使用Java:
  • 第一週作業:用BFS找出朋友關係圖中,兩個朋友的距離
  • 第二週作業:用Dijkstra's Algorithm找最短路徑
    • 使用匹茲堡真實的公車路線資料,規劃使用者如何從A站搭車到B站(如同Google Map的路線規劃)
    • 需要寫Java的UnitTest達到100% line coverage(就是每一行自己寫的程式碼都要寫出對應的測試程式)
    • 通過CheckStyle(即Java程式碼中的排版需要符合規定,並且有標準完整的註解)
  • 第三週作業:模擬匹茲堡城市中的公車與搭車情況
    • 練習中型規模的程式如何設計,作業中車子、車站與乘客之間有多種相互關係
    • 模擬各種細節情況,如:10%的人若是搭輪椅延後上下車時間,影響全部公車是否準時到達的比例是多少
    • 使用多種課程學到的設計概念
第二週作業我寫起來有5000行的程式碼,第三週不加測試碼的話則有7000行,是挺辛苦的一門課。下課時間德國教授被一大群的中國學生圍成一圈詢問作業的問題,過了快一小時都不能離開。然而,上週的期中考之後情況好許多,我也漸漸習慣這裡的作業方式了。

反思
這一門課是Software Engineering的前期入門課,也算是很多人修的二年級課,但交大其實並沒有對應的課程。
  • 交大程式教學重視語法跟完成度,但幾乎不管設計想法:我記得在交大第一堂C語言的課在教不同資料型態的語法;而在Stanford學習第一堂CS課程時候,教授刻意在前期都不講語法,而透過包裝好的教材(Stanford Karel)學習從較抽象的角度開始思考程式。同時,在交大多數助教並不會看每位同學的程式碼,但在CMU連變數名稱取不夠好都會被寫盡評分的回覆裡。
  • 交大程式課程沒有涵蓋「測試」:從這門課的要求中可以看出寫測試碼佔很重要的比重,每寫一小段程式碼就必須寫一段對應的Unit Test測試碼。

Web Application Development

這是一堂同時跨四年級與研究所的課程,學習用Django寫網路應用程式,是學校十分熱門的一門課,而每週都有作業。我個人先前恰好學過大部份的內容,所以還行,但對於沒有學過的同學,幾乎是一週要學一個新的語言:
  • 第一週作業:用CSS/HTML繪製出一個計算機
  • 第二週作業:讓計算機會動(我的做起來像這樣
  • 第三週作業:讓計算機在Django上跑
  • 第四~第六週作業:寫一個社交網站,可以註冊、登入、留言、評論與追蹤等
作業是做一個類似於Facebook的社交網站

反思
  • 交大的網路應用程式設計並沒跟上時代,多數同學都是自學:應用程式在交大的重視度較小,而網路應用程式則被包含在資料庫這門課底下,使用PHP;雖然PHP不失一種易學習的語言,但有較完整架構的Django或ROR並沒有課程在教,而CMU這裡則是已經從Java換到熱門的Django架構(今年)。

Network Security

這門是研究所的課程,與矽谷校區的同學同步,所以上課前都會開啟教室視訊,對方教室的同學也可以發問。是一位印度教授在授課,剛開始的前幾週偶而會漏掉幾個聽不懂的字,但漸漸有改善。
除了上課以外,這門課到目前為止做了:
  • 每次上課前閱讀一至兩份論文
  • 作業一份:寫防火牆
  • Project討論
論文一篇約十幾頁至三十幾頁,起先我需要花半天的時間才能瞭解一篇論文大概在講述什麼,漸漸的配合上閱讀技巧,可以在兩小時內抓到一篇論文的討論的重點,也會稍微跳過一些細節部分。

其中防火牆作業用到我過往在交大OSDI課程中學到閱讀大型程式的方式(cscope, ctags)以及修改kernel code的經驗,而有些同學並沒有相關的經驗則在這次作業中挺卡關。

Project部分近日也在進行中,我們會與微軟公司的一位研究員一同合作、定期開會討論,成員有韓裔美國人、土耳其人與印度人,與其他成員聊天、討論是最有趣的部分。

反思
  • 交大要求的閱讀並不多:雖然許多課程都有買教科書,但是會閱讀完的同學並不多,我認為與學習環境的關係最大,如果多加些閱讀的作業會有幫助。
  • 交大課堂產學合作較少:如這堂課我們組選定主題之後,老師找了一位微軟的研究員與我們共同進行,所以可以使用到微軟的資源,最重要的是研究內容可以使用真實在運作的服務,而非只是實驗室內的小模擬。

Advanced Web Design

這是設計學院的課程,教的是進階的網頁設計,相對於其他CS的課程,這門課其實相對輕鬆許多,老師對於作業的要求較有彈性,也很重視討論,於是有一半的課程只有討論,大家跟附近的同學聊天、老師則會與同學一一了解情況。

第一次作業是將現有的FBI網頁改成現代的新網頁,同時支援電腦、平板與手機(我的作業在這裡),設計是一個不斷問題修正與討論的過程,寫作業的過程是我學習到最多的部分。

由於交大沒有相對應的課程,所以「反思」部分則略過。

整體修課而言

  • 交大修課其實是很輕鬆的
    • 交大作業期限通常是兩週以上,而CMU作業大部份是每週一份,且都滿大份的。
    • 交大上課同學打混比較多,在CMU多數人都很專注,且積極問問題,特別是Design Pattern那門課,如果錯過一些概念就會跟不上。
CMU的資工系大樓,比爾蓋茲所建

結語

雖然生活很繁忙,但是我十分喜歡這裡,在課程中學到的東西比以往扎實許多,而每一個不懂的地方都可以問很清楚,身邊也有很多實事求是、打破砂鍋問到底的同學,我也認為這是求學最好的態度。

6 comments:

  1. 看起來 CMU 的扎實度又比 UIUC 更高一階。想請問 Principles of Software Construction 這門課的作業 spec 有公布在網路上嗎?滿有興趣看看的。

    ReplyDelete
    Replies
    1. 嗨,這裡有課程資料: http://www.cs.cmu.edu/~charlie/courses/15-214/2015-spring/

      Delete
    2. 感謝,這個我有看到,不過似乎作業沒有公布在上面,還是說是透過 piazza 發布的呢

      Delete
    3. 作業是用private的github發佈的,那部分似乎就不能分享了

      Delete
    4. 了解,還是感謝你的文章分享~

      Delete
  2. 这实际上是从大学课程的风格,论文 代 发 培训可能是复杂的网站设计,与其他CS程序相比,这个程序真的比较简单,实际的教师需要更多的功能, 对话,因此1/2的实际程序然后再谈谈,我们所有人都跟大学生的实际关系谈话,实际的教练可以使用大学生1到1来实现问题。

    ReplyDelete