# 關於陳鍾誠 - 給學生的自我介紹 (修課須知)

我屬於自由派的老師，上課很少點名，點了名也不是要算分數，而是要認識大家！

我在金門大學資訊工程系教書，目前主要教授下列 [六門課程](http://www.slideshare.net/ccckmit/javascript-c) ：

課程             | 語言與軟體           | 學期 | 註 | 相關主題
-----------------|----------------------|------|----|-----------
[程式設計](js1.md) |JavaScript + Node.js  | 一上 | 必 | 修課須知 , HTML , CSS , JavaScript
[程式設計進階](js1.md) | JavaScript + C 語言  | 一下 | 必 | C語言 前端瀏覽器, 後端伺服器
[計算機結構](../nand2tetris/) | JavaScript + Verilog | 二上 | 必 | nand2tetris (Part I) , CPU設計
[系統程式](../nand2tetris/) | JavaScript + C 語言  | 二下 | 必 | nand2tetris (Part II) , 編譯器 , 系統軟體
[科學計算](sc1.md) | JavaScript + R 軟體  | 三上 | 選 | 微積分 , 機率統計 , 線性代數 , 數值分析
[人工智慧](../ai/) | JavaScript + Node.js | 三下 | 選 | 離散數學 , 計算理論 , 自然語言 , 機器學習

目前的評分方式，我通常採用下列模式：

1. 平時成績 40% : 請您記得要常常問問題，常問問題的同學通常平時成績會比較高。
2. 學習履歷 30% : 請把學習履歷也上傳到社團的學習履歷檔案區，並記錄下您學到的內容。
3. 期末口試 30% : 對於不同課程，期末口試內容不同，但主要請告訴我妳學會甚麼，做了那些專案與作業，並且展示給我看。

每門課我都會有一個 facebook 社團，您必須加入該社團，因為所有教材、作業等等都會公告在社團裡，而且作業也是繳交到社團裡，所以沒有加入社團很可能就會被當了！

## 作業繳交規定

我的課程常會有程式作業，繳交時請盡可能遵循下列規定，這樣分數也通常會比較高！

1. 你可以選用任何一種程式語言來實作指定作業
2. 請盡可能使用 github + github pages 繳交。
3. 請盡可能放上能夠不用安裝就執行的版本，如果一定要安裝才能執行，請先用截圖展示。
4. 請盡可能撰寫清楚的 README 文件，交待你的作業的內容，像是程式的功能與用途，原理與執行方式等等。

大部分的課程都會有期末專案，而且我通常會讓大家自選題目，但是我也會建議一些題目。

在我的課堂上，通常不需要你作創新型的題目，因為我希望大家先把技術學會學扎實，而不是急著去創新。

以下是我和某學生的對話： [facebook原始貼文](https://www.facebook.com/ccckmit/posts/10153643169361893)

```
學生問： javascript 的期末作業想不出要做什麼？

我回答：那就做留言板吧！

學生說：問題是留言板太常見了，沒有特別。

我回答：寫作業不要一直想搞創新，先學會才是重點。

留言板可以很簡單，也可以很高級，facebook 也只不過是個留言板而已！
```

## 大一：程式設計 + 程式設計進階

大一的程式設計我選擇以 JavaScript (JS) 帶領大家進入程式設計領域， JS 這個語言的強處是網站設計，因為 JS 是目前瀏覽器內唯一支援的程式語言，因此在網站設計上特別有優勢。

我們使用 node.js 作為 Server 端 (後端) 的開發平台，node.js 使用的仍然是 JS，所以你可以用一個語言打通關，不需要學習好幾種語言。(因為前端瀏覽器也是用 JS)。

如果你學會 node.js + JavaScript/HTML/CSS，那麼你就具備了《全端工程師》(Full Stack Engineer) 所需要的能力。

我希望大一的同學可以學會程式設計，並且至少精通一個程式語言。

但是你不一定要學 JS，你也可以自己學習 Python, Ruby, C#, Java, Scala, VB, C/C++ 等等語言。

你也可以不需要學《網站設計》，改去學其他領域，像是《遊戲設計、手機APP設計、視窗程式、系統程式、嵌入式系統》等等。

我們非常贊同你去學其他語言和平台，但如果你不跟著上課，請先告知我一下，這樣我就會用《自學》的方式來評定你的成績，而不是按照一般的方式評定你的成績，這樣對你也會比較好！

在一年級下學期，我教完 JavaScript/Node.js 之後，會開始接著教《C語言》。

為何要接著教 C 語言呢？

主要是因為 C 語言是底層 (系統硬體層) 的主要開發語言，速度很快而且擅長控制硬體，這對資工系的同學後續學習《資料結構、系統程式、作業系統、嵌入式系統、機器人、編譯器》等等課程都會有很大的幫助，因此為了幫大家鋪路，我會先教 C 語言的基礎，然後在《系統程式》課程時，再更深入的介紹《C語言在系統軟體與嵌入式系統上的用途》。

## 大二：計算機結構 + 系統程式

大二的《計算機結構+系統程式》課程，我主要採用了 nand2tetris 這門網路課程。

Nand2tetris 整門課程的設計，是以實作習題的方式，讓大家從 NAND 這個基本邏輯閘開始，一路往上建構出《AND、OR、NOT、XOR、多工器與解多工器 MUX/DMUX、加法器、ALU、暫存器、記憶體、CPU》直到整台電腦硬體，這部分是屬於計算機結構課程的內容。

Nand2tetris 的第二部分，是讓學習者從《組譯器、虛擬機、編譯器到作業系統》，建構出具體而微的完整系統軟體，您可以使用任何一個程式語言和平台來實作這部分的習題。

除此之外，我會補充軟硬體的一些進階觀念，像是硬體的《管線》 (pipeline)、記憶體階層、速度議題、還有平行加速方法等，因為這些議題在 nand2tetris 的實作裏是感受不到的。

對於系統軟體部分，我也會用 C 語言進行一些補充示範，甚至搭配一些程式專案，像是 jserv 七百行系列中的 Rubi JIT Compiler 與 Mini-ARM-OS 等專案，說明 C 語言在硬體控制與系統層級的一些用法。

但是採用 Nand2tetris 這門網路課，有優點也有缺點，優點是實作性很強，可以讓大家非常細緻的理解並實作每一部分的硬體和軟體，但缺點是理論性不足，不像經典教科書裏常常會教很多理論性的內容，因此我希望大家能購買或去借一兩本經典教科書來看，像是計算機結構就可以看《聖經版的白算盤書》，而《系統程式》則可以參考經典的海螺貝殼 Beck 版，或者是看我寫的那本系統程式》。

## 大三：科學計算 + 人工智慧 (碩一同修)

大三的《科學計算 + 人工智慧》課程，我希望帶領大家進入比較困難的研究議題，這部分會牽涉到不少數學，因此我先安排了一門《科學計算》課程在前面，企圖奠定數學與程式方面的基礎，然後才進入實務性和理論性都很強的《人工智慧領域》，希望這樣的安排會讓教學更順利。

我們會從最簡單的《爬山算法》開始，然後分別接觸《神經網路、圖形搜尋、電腦下棋、邏輯推論、機器學習、語言處理》等領域，希望由淺入深的帶領大家一步步前進。

但是《人工智慧》是個令人望而生畏的領域，我自己都還有很多無法理解的部分，雖然我會盡可能的把自己能理解的教給大家，但是仍然有一大片我所無法理解的領域，等著你去探索！

## 專題製作 (專業實習)

除了上述的課程之外，系上還有個《專題製作》(專業實習) 的課程，這個課程要求大家 3-5 人一組，去進行專案開發，目的是讓大家學習團隊合作的方法，並能運用所學到的技能去完成一個完整的作品。

每年專題都有 [很多學生出問題](http://www.slideshare.net/ccckmit/ss-67392673) ，像是 [《選錯題目、想得很大、做得很爛、做不出來、無法合作》等等，一個很常見的現象是會有《掛名組員》](http://www.slideshare.net/ccckmit/ss-67436152) ，就是那種不願意做事參與的組員，於是最後同學之間常常搞得不歡而散，朋友便仇家的比比皆是。

我目前帶的專題主要以《網站設計》居多，但是對研究性的《人工智慧、自然語言處理、機器翻譯》，還有實作性的《CPU設計、系統軟體設計》等等，也都是我自己也在做的領域，對這幾個領域有興趣的同學也歡迎來找我討論專題的事情！

最後再次強調，我是自由派的老師，不會去逼學生做甚麼事，如果你修我的課或找我做專題，最好能有主動學習的精神，盡可能常常問我問題，這樣我才有辦法幫助你，否則你很可能會學不到任何東西。

希望金門大學資工系的四年之內，你會滿載而歸，而不是空手而回！


<div style="text-align: right">陳鍾誠 2017/2/22 於金門</div>


