iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
4
自我挑戰組

不前不後,不上不下,一個曾經交大資工書卷的軟體工程師成長之路系列 第 5

爆肝風城:資工大二課程

微分方程
坦白講
也是都忘光了 Orz
基本上我的認知就是用微積分加線性代數去描述問題
然後解出來就是

C. H. Edwards, Jr. and D. E. Penney, "Elementary Differential Equations with Boundary Value Problems," 6-th edition, 2008, Prentice Hall.

image

機率
我覺得很重要一個基礎
當時的課程網頁
畢竟每個問題通常都是不確定的XD
會先從集合的概念該使 counting(複習 again)
帶到古典機率 這邊都還是高中的範圍
再帶到現代數學的機率公理之後
之後就開始變成天書啦

我是統計學再念了一遍
然後隨機過程又念了一遍
碩論有用到機率 所以又讀了一遍
不過還是覺得很難掌握
但念了那麼多遍也代表了真的很重要吧

資料結構
Fundamentals of Data Structures in C++, E. Horowitz, S. Sahni and D. Mehta, Computer Science Press.
重要 重要 重要 很重要所以要說三遍
基本上就是告訴你資料怎麼存最有效率
教你Big(O)分析之後
就開始介紹以下各種data structure啦
image

從線性的array到 hashing 到 tree 到 graph
這大概是唯一會了解輪子怎麼造的時候吧

那時候作業也都很有趣
認真的去思考怎麼造樹
去利用hashing解決問題
想各種加速方法
其實是真的很有趣的阿

但你出社會之後
會反覆一念在念這科的
不是因為他很重要 你工作會一直用到(還是用得上的 我沒說用不到)
而是人生.................

演算法概論
在資料該怎麼擺放之後
接下來 回到更基本的問題
怎麼用程式解決問題
演算法基本上就是一連串具體解決問題的步驟
然後要有

  1. 輸入(參數 問題input 也可能沒有)
  2. 輸出(答案啦)
  3. 明確性(每個步驟要很清楚 結果是可以確定的)
  4. 有限性(總要限時內做的完吧)
  5. 有效性(是要做得出來的)

以上都是教科書定義

總之 就是回到CS根本 如何用電腦解決問題(計算問題)
課本就是這本經典的楓葉本
Introduction to Algorithms, 2nd Ed, the MIT Press, by Cormen, Leiserson, Rivest and Stein.
基本上就是三部曲

  1. divide and conquer (分而治之法)
    把大問題化小 變簡單 變好解之後再把答案組合起來
  2. dynamic programming (動態規劃)
    很多子問題有重複的結果 那就cache起來 (Top-down break)
    或是當問題的局部最佳解就是整體最佳解的時候 就從小case開始思考 (bottom-up build up)
    其實跟divide and conquer差不多
  3. greedy (貪婪)
    就每步都一直選最佳解去做就是了(但不一定真的得到真的最佳解)

大概就這樣
不過其實商管科系的 作業研究 這門課其實也涵蓋了很多這類的方法

這門課的重點是上面三大項了
一樣一開始還是在教一次Big(O)
然後帶到那三項
再來又會帶到些Tree and Graph的演算法
最後簡單提一下P NP
但不會太深
因為後面還有計算理論會提

大概如此
總之我想這也是一門你出社會後會一讀再讀的好課......

然後我想說 即使你上完了這門課
但還是不會寫leetcode
應該很正常吧

資料庫系統概論
Fundamentals of Database Systems by Elmasri and Navathe, 5th edition, 2006, Addison Wesley
image
聽起來是教你怎麼用MySQL嗎? 錯
教你怎麼實作MySQL嗎? 錯

其實是講很general的東西
從你要怎麼分析你的程式的ER-Model
到怎麼設計Table schema正規化
還有一些基本DB的概念就這樣

怎麼用特定的Database(像是MySQL還是PostgreSQL)
還是要自己學的 甚至連網頁怎麼寫也是
我記得這門課的專題就是寫個旅遊部落格
從PHP到架DB 架 Server 寫網頁都是自己學
典型的一門資工課

計算機網路概論
顧名思義就是介紹計算機網路 TCP/IP 5層架構
包含 Link layer, Network layer, Transport layer, 到Application layer (資工不太會探討Physical layer)
會介紹各層做什麼 有什麼protocol等等
課本是
J. F. Kurose and K. W. Ross, Computer Networking: A Top Down Approach Featuring the Internet, 4th Edition, Addison-Wesley.
這本我覺得寫得不錯就是
也是我後來會拿出來翻翻的課本 只會上到第五章就是了
後面三章都有專門的一門課
剛好我也都有修過
之後再介紹

  1. Computer Networks and the Internet.
  2. Application Layer.
  3. Transport Layer.
  4. Network Layer and Routing.
    5 Link Layer and Local Area Networks.
  5. Multimedia Networking.
  6. Security in Computer Networks.
  7. Network Management.

其實我覺得TCP/IP的設計階層式架構
最能反應在工程上抽象化定義好每一層的功能,定好API
就是這樣乾淨的架構所帶來的威力 (但我也是修了很多們網路的課 才稍微體悟到這道理的...)
才能讓網路的概念變得那麼簡單
我只要考慮好我目前所在的這層與下面這層之間德關係就好
不會說我寫的HTTP還要考慮這個bit的資料要怎麼傳到下一個hop這樣
我一直覺得這是個很漂亮的設計
也或許如此我那時候才想走網路相關的研究吧

組合語言與系統程式
這其實是兩門課合在一起的 所以有兩本課本 算是都滿底層的東西 現在也都從必修拿掉了...

  1. 組合語言
    課本是Kip Irvine, "Assembly Language for Intel-Based Computers, 5th Edition," Prentice-Hall , ISBN-10: 0-13-238310-1,
    主要是教Intel CPU的組合語言 也就是Intel CPU真正讀得懂的語言
    我還滿喜歡這門課的
    可以去了解看這種CISC(Complex Instruction Set Computing)這種CPU指令集是怎麼設計
    有怎樣的功能 然後有哪些register
    當然我們也有練習寫了一點組語的程式
    配上Visual Studio的幫忙
    寫起來很是開心 反正記憶體隨你控制 Register隨你安排XD
    會這個對你要最佳化某段程式或是去讀反組譯的程式都很有幫助
  2. 系統程式
    Leland L. Beck, “System Software: An introduction to Systems Programming, 3rd edition,” AddisonWesley Longman, 1997. ISBN-10: 0201423006
    課本是很有名的貝殼書
    系統程式就是像是任何跟系統相關的程式(廢話)
    廣一點或許可以說跟用來控制硬體相關的程式或是控制這些程式的程式吧
    在剩下半學期會介紹
    Assembler 介紹如果把你前半堂課寫的組語再轉成給CPU能讀懂的010101的程式(object files)
    Linker 把這些產生出來的obj files跟外部library連結起來產生真的能執行的檔案 executable files
    Loader 把這些執行檔再入到記憶體中 然後去調整裡面的offset
    總之就是很基本的東西蜻蜓點水
    有興趣的話 可以再去翻翻 <程式設計師的自我修養> 這本書

BTW 這門課是我第一個拿到的100分XD
image

程式語言
Concepts of Programming Languages, Eigth Edition, Robert W. Sebesta, Addison Wesley, 2008.
這本課不是要教特定的語言
比較像是一種語言學概論
image
看課綱就感覺得出來
每一個都是很特定的主題
Data Type, Expression等等
很理論 也不知道有沒有用
但國家考試有這科喔
所以你買得到參考書XD

比較特別的是最後教了functional programming & logical programming
練習寫了 common list & prolog
算是比較特別的體驗
不過純functional我到現在還是沒辦法參悟啊

計算機系統管理
System Administration 我們都簡稱SA
基本上就是教你如何管理操作設定UNIX系統
選擇的是FreeBSD(因為跟交大資工很有淵源)
是我們系上很有名的操課
也是我大學生涯中 唯一一次讓我為了趕期末專案而看日出的課

"UNIX System Administration Handbook," 3rd ed.
By Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein,
Prentice Hall Press, 2000.

image

坦白說
修這門課是個熱血
就是大家都說 “走啦 一起修 一起爆肝” 的這種熱血而修的
所以我其實真的很多都聽不懂
每次做作業都要重新google一次(雖然事後才知道 這樣才是正常的)
然後那時候我對UNIX系統的操作也止於 ls cd
可想而知 很痛苦
但現在想想 是一個很好的磨練
裝系統架系統其實也是一個軟體工作很重要的訓練就是(這是我在工作之後的體悟就是)
也讓我開始熟悉UNIX系統
知道如何架設各種單機服務
shell script的練習
到現在對我都還是很重要(因為我大致都在Linux系統上開發)

這其中還包含文化的問題
比如說就應該要把電腦裝成FreeBSD啊 用什麼VM(我當時就是用VM)
為什麼一定要裝FreeBSD才是對的...
一些工程師間的鄙視垃圾話文化
其實也是你對在這行要面對課題就是

獲益良多呢...

接下來三門都是硬體課
我承認我不熟
電路電子學
這也是我們這屆第一次開的課
希望給我們資工組的人基本電子學與電路學的概念
所以像是資電組的人就要單獨修分開修

那教授希望給我們什麼概念呢
(1) Introduction to signals, systems and elctrical circuits,
(2) Introduction to basic analog electronic circuits and operational amplifiers,
(3) Introduction to basic digital electronic circuits and CMOS logic gates.
看這簡介
一是訊號與系統 二是電路學 三是電子學
其實包含EE的很多基礎課了
所以當然只能蜻蜓點水囉
附上當時講義XD
http://mapl.nctu.edu.tw/course/Electronics_07/files/Lecture%201&2%20Signals%20and%20Systems.pdf

不過那時從那些電子元件兜成了一個AND gate之後
好像有一種豁然開朗的感覺

(不過也沒啥用就是 攤手)

數位電路設計
M. Morris Mano & Charles R. Kime, Logic and Computer Design Fundamentals, 3rd Edition
好啦
前面把gate做出來之後
接下來就是用這些邏輯閘做出更複雜的數位電路
這門課會從布林代數開始教
然後教你用Karnaugh Map去簡化電路
之後抱歉 我真的全忘記了
對不起老師...........

數位電路實驗
我也很討厭的一門課
所以我不走硬體吧XD
只能說幸好也從必修拿掉了
基本上就是用Verilog去實作數位電路設計裡面學到的電路
that's it 夢靨一場 不想多提QQ


看看大二的課程多麽的扎實啊
這還不包含外文與通識呢


上一篇
風城新鮮人:資工大一課程
下一篇
持續爆肝:資工大三課程
系列文
不前不後,不上不下,一個曾經交大資工書卷的軟體工程師成長之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言