【美國留學】RICE MCS 第一學期

如願以償的進入夢想學校的 Computer Science 系所,對於學習新知識抱持著美好的憧憬,而 Rice MCS 完美地實現我的期待。

I-No Liao
工程師小夫妻
11 min readDec 31, 2019

--

Rice University. Photo by I-No Liao.

修課心得

這學期選了三門課:COMP 504 Graduate OOP & Design、COMP 531 Web Development & Design 及 COMP 533 Introduction to Databases。整體而言 Workload 巨大,COMP 504 跟 COMP 531 異常精實,再配上正常 Loading 的 COMP 533 就演變成了每天都在寫作業,整個學期都沒有週末,連長達四天的感恩節假期都在拼 Project 的淒慘景況。然而,正因為如此,Coding 能力突飛猛進。每個課堂的 Project 都相當實用,是能夠寫在履歷上的優質 Project,此外還能把成品分享給親朋好友玩,非常有成就感,算是沒有辜負昂貴的學費。以下讓我細細介紹這三門課吧!

COMP 504 Graduate OOP & Design

  • Instructor: Prof. Mackale Joyner
  • Workload: High
  • Language: Java (Major), JavaScript (Minor)
  • Frontend: Vanilla JS + jQuery
  • Backend: Spark Java
  • 5 coding assignments
  • 2 projects (group), each comprises of API design + final app design
  • 9 labs
  • 3 Quizzes
  • Personal rating: ★★★★★

選這門課的動機是想要把 CS 的基礎打好,畢竟轉專業選手基本功還是相對薄弱。當初看到這課名,心想應該小菜一碟,不就是 OOP,資工系大一同學們各個都可以 99 分破關,我這稍微有點道行的老頭應該也行吧?修下去才發現老師已經假設學生都應該有 Advanced Java Programming 能力,並非從 ”何謂 class 何謂 object 何謂 encapsulation“ 等等的基礎概念學起,而是針對物件導向程式設計的精髓進行教學,也就是 Design Patterns:MVC、union、composite、template、strategy、command、singleton, dispatcher adapter、factory,and visitor design patterns。

我最喜歡的部份是老師的教學模式,老師鼓勵大家發言,基本上每堂課都在跟老師討論每個 Design Pattern 的優缺點,並非僅止於老師講學生聽,甚至有好幾次的作業要求完全是根據同學們在課堂上發表的意見來決定 Spec。這對我一個沒受過美式教育的人大開眼界,深深體會何謂課堂交流。

另外,在 Group Project 方面,老師希望藉由模擬業界軟體開發的流程和分工,讓學生能更早接觸業界工作模式。首先,將全班分成 12 個團隊,每個團隊有六到七人不等,職位包含 Project Lead,Tech Lead,Doc Lead 各一位,剩下是 Developer。此外,每個 Project 都有兩次 Design Presentation,一次 API Design 一次 Final Design,所以學期後半段幾乎都是在進行 Design Review,不僅練習報告技巧,也能吸收更多人的建議,改善自己的設計。

Project 1: Pac-Man Game (小精靈遊戲):為了強迫自己學到最多,在 Pac-Man Project 我自告奮勇當 Tech Lead,主要負責 Design/Code Review 以及設計 Interfaces、Abstract Classes、Endpoint API、MVC,和 dispatcher adapter。不出所料,累到癱,除了必須在團隊進入狀況前先確立設計方向、建構整體框架,並將 Functional Blocks 切乾淨以便分工之外,最後階段的整合及 Design/Code Review 更是考驗軟體工程的各種軟硬實力,例如得心應手地使用 Git、快速掌握隊友的演算法,以及優良的溝通等等。

Project 2: Chat App:最後一次的 Project 我選擇當 Project Lead,主要負責規劃進度,協調團隊資源的分配。除了規劃以外,我主要實作了我最熱愛的 Frontend UI Design 以及 Backend 幾個 Functional Blocks。印象最深刻的莫過於我們這組從某天的下午 4 點一路 Debug 到晚上 12 點,已經很久沒有感受整個團隊一起奮戰的熱血了。晚餐小憩時,大家啃著 Chick-fil-A,然後兩眼放空的情景真的很難忘。另外值得一提的是,這次 Project 的 API 是由全班從 12 個組裡面投票決定的,老師強迫所有組使用獲勝組的 API,相當程度的模擬著軟體開發在業界會遇到的情景,是個很好的學習。

總體而言,這門課的 Workload 是我這學期所有課之中最重的,我特別喜歡老師提供良好的團體作戰學習,畢竟在軟體開發過程中,良好的合作是關鍵。另外,學到了滿手的 Design Patterns,覺得受用無窮,期許自己未來還能持續精進 OOP/OOD 技能。

COMP 531 Web Development & Design

  • Instructor: Prof. Mackale Joyner
  • Workload: High
  • Language: JavaScript
  • Frontend Framework: Angular or React
  • Backend: Node.js + Express.js + MongoDB
  • 6 coding assignments
  • 1 final project
  • 1 research paper + presentation (group)
  • 3 Quizzes
  • Personal rating: ★★★★★

本學期最愛的一門課!最幸運的是,從我們這屆開始,老師提供 MEAN 及 MERN 兩種方案來完成我們的 Final Project (MEAN = MongoDB + Express + Angular + Node,MERN = MongoDB + Express + React + Node)。當時調查發現 React 在社群中比較受歡迎,因此我選擇使用 MERN Stack。

這堂課幾乎涵蓋所有網頁相關的重要技術,包含 CSS、HTML、JavaScript、Angular、React、Single Page Application (SPA)、RESTful API、Unit/E2E Testing、Node、Express、MongoDB、Mongoose、User Session、Cookie、Hashed Credentials (Pepper & Salt)、Redis、OAuth、PassportJS、Third Party Authorization、Security,及 Web Deploy 等等。老師透過很可怕的作業量確保大家真的能得心應手地使用這些技術。另外,幾乎每次的作業都跟課堂上學到的新技術有關,所以可以藉由做作業獲取經驗,快速內化這些知識。

作業方面,除了第三次作業是自己寫一個 Vanilla JavaScript 的純前端小遊戲 (歡迎大家來玩我的小遊戲) 之外,剩下的五次作業都是 Final Project 的拼圖。因此整個課程的流暢度可謂完美,能把自己的作品一點一滴地堆疊起來。另外,Research Paper & Presentation 是分組的,應該是這門課中最輕的一個作業,我與好 Partner 逸愷研究的是 JavaScript Asynchronous 相關的議題。

Final Project:實作一個 Facebook-like 的網頁,叫做 Ricebook,功能包含登入 、註冊、Post/Edit 文章及 Comment、追蹤朋友、搜尋文章、上傳大頭貼、修改用戶資料等等。基本上就是一個 Full Stack Web Application:Frontend 負責處理網頁邏輯及 UI 設計,Middle Layer 實現 Endpoint API Design,Backend Server 接收前端的 Request,向 Database 撈資料並處理之後,將前端的資料發送回去。我非常享受在實現這個 Project 的過程,除了能從中不停學習之外,完成後更有非凡的成就感,想不到自己竟然有能力完成這種規模的作品,真的很感謝老師!學期結束後,手癢停不下來的我,繼續優化改善我的 Final Project,並正式命名為 Geeksyard,歡迎大家來玩看看,我預計會持續進行更新。

這堂課程不僅讓我收穫滿滿,還幫助我找到自己的興趣:Web Development!真的很感謝老師的教學與教材,讓學生能夠自己親手打造屬於自己的社群網站,雖然難度非常高,但研究的過程中可謂樂在其中。並且,能夠將自己的作品分享跟身邊的親朋好友一起玩,真的很過癮!

COMP 533 Introduction to Databases

  • Instructor: Prof. Risa B. Myers
  • Workload: Medium
  • Language: PostgreSQL, JavaScript (for MongoDB), Cypher (for Neo4j)
  • 7 assignments (1 calculation + 1 ERD + 5 coding)
  • 1 final project + presentation (group)
  • 3 Quizzes
  • Personal rating: ★★★★☆

Computer Science 的基礎課程之一,之前在台灣一直還沒有機會學這門課,終於在這學期如願以償。整學期的課程主要圍繞著 RDBMS (Relational DataBase Management System),包含 Relational Calculus、Relational Algebra、Declarative SQL、Imperative SQL、Data Warehouse。除了 RDBMS 之外,也討論了 NoSQL 中的 MongoDB 及 Neo4j (Graph DB)。

值得一提的是,整個學期老師的作業都在賣冰淇淋,不僅大部分的 Data 都跟 Ice Cream Food Truck 有關,甚至還要大家申請 Twitter Developer 帳號,用 Python 在 Twitter 上撈與 ice cream 及 food truck 相關的 tweets,可見老師對於冰淇淋生意的狂熱程度。有趣的是最後一堂課,老師帶了一堆冰淇淋來請全班同學吃:” I know we were selling ice cream the whole semester. Let’s actually eat some today, yay! ” 老師真的是太可愛了!

相比於 COMP 504 OOP 及 COMP 531 Web Dev 而言,這堂課的 Workload 小非常多,然而還是能很扎實的學到重要的 SQL 語言,對於之前一直對 SQL 有障礙的我來說,助益良多。這門課僅涉及 Database 的使用,因此下學期打算修 COMP 530 Database Implementation,親自實作一個 Database,光想就令人興奮!

總結

雖然 Workload 超越我的想像,但我一點也不後悔在第一學期選擇這三門課程,藉由這些課程,我將 CS 的基礎打得更加紮實,透過一次又一次的 Coding Asignment,我的 Coding 能力跟入學前相比可謂天差地遠。另外,COMP 531 Web Development & Design 這門課程更與我將來在 Google 的暑期實習直接相關,若沒有這方面的基礎功,我相信在實習的過程一定會更加辛苦。

--

--