在軟體開發工作的經驗中,或許不少人都有類似的經驗,就是在你身邊的同事,他們並不是所謂資訊相關「本科系」出身的,程式設計的能力卻很好,甚至不乏許多高手、神人。相反的,也有些資訊相關「本科系」出身的程式設計者,在程式設計的表現卻又是一般般。半路出家的,反倒在職場上的表現也不遜色。 
程式設計的課程只是本科系課程的一部分 
所謂的「資訊相關科系」,在臺灣的大學裡,大概指的就是像「資訊工程」、「資訊科學」或「資訊管理」之類的科系,有些學校的電機系裡,還特別分出了一個計算機組,也算是在這個一般人認定的範圍裡。在不少人的認定裡,「資訊相關科系」的畢業生,之後,大抵就是從事軟體開發工作的,所以,程式設計就是他們在大學裡所學習的主要技巧了,而且,這正是為了日後求職在做準備的重要基礎。 
但是,相信大多數的資訊相關科系學生進了學校開始上課之後,才會發現,原來「程式設計」的相關課程,只佔了資訊相關科系課程安排的一小部份,一進大學,我們除了上不少的數學課之外,大概是從計算機概論、資料結構、演算法之類的核心課程開始,這些科目之外,在系統部份會有系統程式、作業系統,在硬體部份會有數位邏輯電路、計算機組織、計算機結構、等等。隨著不同的興趣,可能會有分散式系統、電腦網路、人工智慧、資料庫、資訊安全、軟體工程、……等等。 
資訊學門的領域繁多,資訊科系的大學生要接觸的課程類型也不少,但其中會專注在「程式設計」或偏向軟體開發的「軟體工程」的課程,並不會太多。整體比重來看,並不會太顯眼。 
這究竟是怎麼一回事呢?顯然,普羅大眾對於資訊科系學生畢業之後的就業認知,和在學校裡所修習的課程,這之間的落差似乎還挺大的。所以,偶而也可以看到一些對於資訊教育的批評,像是學校只教理論,不教實務,使得大學畢業生沒辦法一畢業之後,就成為職場的即戰力之類的評論,而這也似乎是不少人的看法。 
當然,我並不是教育專家,沒辦法從這個角度提供什麼觀點,但是,在短暫的軟體開發生涯裡有一些經驗,因此,對於這個現象的有些想法,或許可以拋磚引玉。 
大學教育的目的與職業訓練的差異 
首先,大學並不是職業訓練所,它的教育目的並不在訓練就業所需要的直接能力。電腦科學雖然這幾十年來才興起的學科,其內容卻也是博大精深,就像前段文字中所提到的種種領域,沒有一門不是曠日費時鑽研之後,才能夠窺其堂奧。更別提要在短短的幾年時間,就讓一名學生對各種領域都有所接觸,並且有入門級的基礎。對電腦科學領域全面而廣泛的認識,我想這才是大學資訊學科教育的真正目標。 
在許多人的刻板印象中,覺得理論與實務有所落差,但事實上不然。當你在開發真正的軟體系統時,會遭遇到很多的問題,都不是單純程式設計面向上的問題。而這些問題,是不論你的程式碼架構有多優雅、程式碼編寫的如何精簡,都一樣會存在,而且是完全不相干的,因為它們是完全不同面向上的問題。
舉例來說,軟體開發時難免面臨系統安全性的問題,如果你沒有讀過資訊安全的理論,可能不知道如何進行安全加密傳輸的過程、也不知道加密的金鑰應該如何管理。所以你可能看到明碼傳輸敏感內容的系統、你也可能看到有些系統在資料庫中以明碼的形式儲存使用者的密碼,這些都是常見的安全性問題。如果你學過區域網路,就會知道在同一個區域網路下,資訊被盜讀、甚至是改寫的可能性。這些都是無關於程式設計本身,卻和軟體開發息息相關的。 
因為,開發軟體不單只是寫下程式碼,在那之外,還有許多。 
再舉一個例子,在演算法裡有所謂時間複雜度的評估方式,前些日子,我看到不少人在轉貼分享一篇關於StackOverflow上介紹 「Big O」 的文章,這個「Big O」 便是一種對於時間(或空間)複雜度的表示方式。 
為什麼我們需要評估一個演算方法的時間複雜度?一個重要的目的,便是我們可以藉此明白一個演算方法隨著規模變大時,它所需的計算時間的成長方式。 
如果一個演算法,它的時間複雜度是 O(n),那麼代表它所需的計算時間是隨著問題的規模(即 n)線性的成長。但如果一個演算法的時間複雜度是 O(n^2) ,代表它所需的計算時間是隨著問題的規模呈平方的成長,那成長速度就快多了,而且規模愈大,相差愈多。 
因此,若不知道需要評估、怎麼評估演算法複雜度的程式設計者,就有可能寫下一個演算方法,它所對應的時間複雜度是不好的,導致即使在小規模測試時不會發生效能問題,然而,一旦放到了大規模的實際環境下時,就發生了效能不彰的情況。 
在演算法的學問裡,複雜度的理論接著連到了所謂「NP 是否等 P」的世紀大案,在唸書時,你或許覺得與現實距離過遠,但真的接觸實務開發後,也時常在程式碼中見識到複雜度 O(n^3) 或更高的演算法。撰寫程式的程式設計者,似乎絲毫沒有意識到這種寫法會有效能問題,原因就是他不了解時間複雜度的影響,甚至,他根本就不知道時間複雜度這個特性。
上述的例子說明了,即使資訊科系教育的最終目的之一,是希望培養軟體開發領域的人才,那麼這些課程還是很重要,並沒有辦法只側重在程式設計的部份。更何況,培養軟體開發領域的人才並不全然是大學資訊科系教育的唯一目的,我們還需要培養電腦科學家、培養技術研究者、……。 
此外,程式設計的能力有一部份和解題能力相關,一個愈懂得解題技巧的人,可能就愈有機會擅長程式設計。而解題能力好的人,在各種科系的學生裡可能都存在,若是這些人轉戰程式設計,自然也可能有很好的表現。但是,倘若沒有補足在開發時需要的電腦科學基礎,那麼同樣會面臨武俠小說裡說的「空有招式,而無內力」的情況。 
程式設計很重要,但它也只是許多資訊科技最後實現的手段之一,應用的本體還是資訊科技。若是只重視了實現,而忽略了科技本身,那麼就沒有本體可言。 
程式設計是一門大學問,需要足夠的知識作為基礎,也需要實戰經驗
一些人對程式設計最大的誤解,是覺得它是微不足道的技巧、是末節。殊不知,單是程式設計一門學問便是博大精深。但同樣的,另一個最大的誤解則是以為它才是最重要的,就像許多人認為,大學裡沒有太著墨在程式設計的教學,使得大學沒有培養出軟體開發領域的即戰力一樣。 
我認為,軟體開發需要很多知識做為基礎,而大學就是這個建立基礎的地方。程式設計固然需要課堂上的啟蒙,但事實上更需要實戰的歷練。 
因此,對大學生來說,與其為他們加入更多與程式設計相關的課程,不如提供更合適的環境、建立鼓勵課外實作的風氣,並且多做一些「課外」的自有專案,從中體會軟體開發實務的需求,再回過頭來,領會到需要在課堂的理論中攝取那些、汲取多少養份。

作者簡介


Advertisement

更多 iThome相關內容