或許你看過不少程式設計者,他們所就讀的系所並非電腦科學相關系所,但是他們仍然能夠稱職地完成他們被賦予的工作,甚至有些十分厲害的高手,根本就不是電腦科學系所背景的。而我們也時常可以看到,許多電腦科學系所的畢業生,他們對於程式設計這一領域並不擅長,甚至有些人在畢業一段時日後,早就忘了如何設計程式,而且所從事的工作也和程式設計沒有什麼關聯。

既然大眾普遍認知電腦科學是程式設計的本門學科,那為什麼還會存在這種現象?如果我是一名程式設計者或是有志於程式設計領域的人,該不該修讀電腦科學呢?在課堂上所修讀的電腦科學和實務的程式設計工作又存在什麼關聯性呢?在本文中試著為你進行分析。

程式設計只是實現電腦科學的其中一種做法
首先必須先解釋的是,電腦科學並不是一門專門用於養成程式設計者的學科。

電腦科學的核心課題是透過計算來解決問題,為了要達成此目的,才會發展出各種協助我們進行計算的工具,例如有了程式語言讓我們得以描述解決問題的方法。

而在程式語言之後,才會更進一步衍生出編譯器這門學問,探討如何有效地將我們以特定程式語言所寫下的程式,轉化成為實際電腦可執行的指令。

為了要有效率地解決計算問題、使電腦執行工作,必須倚靠對資料結構及演算法的了解。

以這些事物為基礎,套用在各種不同的應用領域,像是資料庫、電腦圖學、電腦網路、影像處理、資料安全、人工智慧、……等等,大致上就構成人們看到電腦科學的模樣。

也因為電腦科學的內容包羅萬象,每個領域都有值得發展之處,程式設計或許是實現的手段,但是想要有所貢獻,不見得僅能憑藉程式設計。

倘若檢視許多大學的課程安排,你會發現,和程式設計直接相關的課程份量多半不會太重,這是因為還有更多的基礎課程必須安排進來。這樣的處置並不是不對,只是最後衍生的結果往往是程式設計的訓練稍嫌不足──如果不是自己對程式設計有著興趣,會利用課程以外的時間自己練習、進修,在畢業之後,程式設計的能力恐怕都只會停留在完成小型作業的程度。

相反的,也有許多並不是修讀電腦科學本科的程式設計者,他們不論是自修、或者是經由一些訓練課程,習得了設計程式的技能。他們在程式設計及專門的應用領域(例如財經資訊)鑽研,所以對於所運用的程式語言、程式庫、領域知識,都十分熟悉,有很多這樣的高手對設計也很拿手,他們所開發出來的系統架構,既有彈性、又很容易擴充。

提供基礎,幫助你更了解電腦如何運作
兩相比較之下,時常會讓人不禁想問,倘若想成為一名程式設計者,修讀這些電腦科學的課程,對於程式設計的幫助究竟會有多大呢?接下來,就讓我們來看看,倘若以成為一名程式設計者為目標的話,電腦科學的學科可以提供什麼樣的助益。

撇開特定應用領域的課程,例如資料庫、多媒體、電腦網路、影像處理、電腦圖學……等等不談,我想電腦科學的課程大致可以分為幾類:(1)電腦是如何運作的(2)有效的解決問題(3)與電腦溝通的方式(4)操作電腦的環境。

想要利用電腦進行計算及資訊的處理,那麼,自然必須了解電腦究竟是如何運作的。

這可以從兩個截然不同的面向去了解。首先,從電腦硬體的角度切入,從電子電路學、數位邏輯設計、計算機組織、計算機結構到微算機系統等等,從最底層的電子電路原理開始,一路向上逐一介紹到最上層的現代電腦的所有組成。

透過這些課程,你可以對電腦究竟如何運作,有一個全面又清晰的了解。你會知道記憶體究竟是怎麼儲存資訊,CPU又是透過什麼樣的方式去存取記憶體中的資訊,以及如何與其他的I/O設備溝通;你會知道,電腦的記憶體快取是怎麼一回事,又是怎麼利用快取來提升存取記憶體的效能。當然,CPU是怎麼從記憶體中取得指令、怎麼判斷這指令的意義、如何執行指令……等等,你也都有個一般性的概念。而對於管線(Pipeline)是如何提升CPU執行的效率,你自然也會明瞭。

現代的高階程式語言與程式庫,其實已經包裝出一個大型的抽象黑盒子。即使程式設計者不明白究竟底層的電腦是如何運作的,程式設計者還是能夠撰寫程式,利用電腦來進行計算、處理資訊。這樣不僅可以降低程式設計者的技術門檻,同時更重要的是,可以讓程式設計者專注在領域知識上,毋需關心太多底層的細節。總的來說,這個趨勢是正確的。讓程式設計者用高階、更貼近應用領域的方式去思考問題、解決問題,不用花心力在與電腦底層機制的溝通之上,才能提高產出程式的生產力。

懂得觸類旁通,更易掌握開發上的關鍵做法
但是,一個全方位的程式設計者,並不會局限在特定的應用領域,或是高階的應用領域之上。而是能夠因應必要的時機,當他需要撰寫高階的程式碼,他就能夠撰寫高階的程式碼,而當他需要撰寫低階的程式碼,他一樣能夠寫出低階的程式碼。

在撰寫低階的程式碼時,對電腦究竟是怎麼運作的,必須要有更清楚的認知才行。當你對電腦究竟是以什麼樣子的方式在運作一無所知時,想要撰寫較為低階的程式碼,不是根本做不到,就是必須冒著很大的風險。一個不小心,不是寫出效能低落的程式碼,就是會寫出暗藏錯誤卻不自知的程式碼。

這些關於電腦運作的基本觀念,在程式設計時仍然不時需要用到,否則許多事物便會難以理解。

舉個例子來說吧,C語言的struct關鍵字可以定義一個結構,在此結構中可以定義若干個相同型別或不同型別的資料欄位。然而,可能有很多C程式設計者,並不知道這邊會有個叫做資料對齊(Data Alignment)的議題。

因為CPU是透過Bus(匯流排)去存取主記憶體中的資料,而Bus有其固定的寬度(例如32位元),那麼當利用struct關鍵字所定義之結構的資料,被存放在記憶體中時,因為每個資料欄位的長度不定,並不會剛好是Bus寬度的整數倍。

你可以想像,倘若一個資料欄位在struct中的位置恰好不是Bus寬度的整數倍時,CPU就有可能必須利用兩次的Bus存取周期,才能存取到該資料欄位的完整值。因此,為了要有效率的存取每個資料欄位,編譯器會進行所謂Data Alignment的動作,適度塞入一些沒有意義的資料,使得每個欄位的位置,恰好都是整數倍的數字。

應該有不少C的程式設計者因為不明白這個特性,而直接將指標指向struct資料的最前頭,接著自行計算某個資料欄位在struct應有的位置,而增加指標至某個偏移值,藉以存取該資料欄位。但是在計算時,忽略了這個特性,因此算錯了位置,也存取到錯誤的值。

倘若你對電腦的運作方式有一定的了解,像是CPU是如何的去存取主記憶體中的資料,那麼你便會很容易明白為什麼C的編譯器會這麼做,以及C的編譯器為什麼提供Alignment設定的編譯選項,以及這個選項該如何適時去運用。

了解電腦如何運作是最基礎的事情,這件事會關係到你對許多電腦科學知識的了解,當然,也會更進一步影響到程式設計。下一回,讓我們繼續探討這個議題。

專欄作者

熱門新聞

Advertisement