軟體工程師的倖存者偏差(一) 關於讀大學這件事。

不知不覺進入純軟這個業界也已經十幾年,所以對於在 Soft_Job 版上常常看到的一些議題也有了自己的想法,想說趁這個機會整理一下自己的看法,和大家分享一下。這篇主要會先分享一下我對於讀大學的看法。

要先說的是,我覺得我自己就是某種程度上的倖存者,所以這邊的經驗也只是我自己的經驗,但也是我最真實的想法,以及一些我實際上遇到的經歷。

先交代一下背景,我自己會進入這行,大概是從小學時候就有的想法,那個時候家裡有台電腦,每天回家都在玩那台電腦,所以那個時候開始就想著長大要靠這行吃飯,不過當然只是很粗淺的一種概念,那個時候主要還是放學就在打電動,並沒有什麼真的實際的作為。

到高中分組的時候,因為逃避自己對於數學沒興趣這件事,以及曾經有一度想唸中文系或歷史系,所以選了文組。但後來還是靠申請入學上了國立暨南國際大學資管系,在板上我想應該是會被歸在後段國立大學?反正非四大四中,而且是文組的資管系,並且最後直升該校的資管碩班。

不過這樣的我,最終現在還是混到了如大家說的,在 150 左右上下掙扎的 WEB 仔,不過是個生活與工作很平衡,覺得可以做自己喜歡的事情還有薪水可以領很開心的 WEB 仔。

在板上經常會出現的一個議題就是要不要去補大學學歷。我想這個大家都很清楚,一種看法是這行確實你可以不用相關科系也可以來做,這絕對是可行的,也一堆人靠這種方式轉行;另一種看法則是相關科系畢業是進入這行的最快的方式。

這兩種說法我認為都是對的,這行的進入門檻真的很低,只要有心,真的是一台電腦加上毅力你就有機會進入這行。但另一方面,你有文憑再加上不要太混,入場劵基本就到手了。

而常常看到的另一個觀點,是對於大學科目的質疑,認為大學教的東西都很過時,出來業界還是要重新學習。

關於這點其實我反而有比較不同的看法,我認為大學教的科目他的價值,正在於他的「過時」。我認為嚴格來說,他應該不叫「過時」,而叫做「基礎知識架構」。

舉個實際的例子來講,前後端的 Framework 這十年來都換了幾輪了?但網路的基礎架構還是沒有變,SQL 的主要核心概念還是沒有變。從 Web Browser 上輸入網址到顯示內容,基本上還是一樣的流程。

更別說再更基礎的計算機架構、演算法和 OS 裡的多執行緒等等的概念了,這些概念性的東西到現在,其實到現在都還是很實際的東西。反而是很多那個時候我學的 Framework 或各個軟體的版本,現在早都不知道被什麼取代了。

但電腦程式還是電腦程式,在抽象上基本還是 Von Neumann 架構,底層還是針對記憶體中資料的各種操作,各種程式設計典範 (Procedure / Object-oriented / Functional) 的精神還是長那樣。而這東西是我天天在用的,真的是天天在用,因為這是我對自己寫的每一行程式碼的理解。而我自己的經驗上,遇到過不少不知道程式為什麼會壞,為什麼是那樣的行為的,其實就是沒搞懂程式執行的時候,抽象上記憶體裡的內容是什麼東西而已。

至於這些東西有沒有用,我想應該可以用實際的例子來說明。現在做前後端,基本上演算法都是函式庫包好好,很少有機會自己寫我想這應該是共識了。這十年幾年下來,我真的在工作上實作過,和演算法勾得上邊的東西,大概也就只有樹的 DFS 或 BFS 而已。

那就代表大學教得演算法沒有用嗎?這麼講吧,我曾經在某個線上的 Java 專案看過這樣神奇的程式碼,這個專案主要是一個批次的機制,然後會需要依照順序,處理檔案系統上的某些資料夾,對應到某個 ID 並進行處理,注意他是有順序性的,而且同一批次中 ID 是會重覆的。

結果呢,寫這個專案的人用了一個 Java 裡的 HashMap 來存要處理的 ID 和檔案系統的資料夾的對應……我看到的時候整個黑人問號。HashMap 最基本的特性不就是一個 KEY 只會對應到一個 VALUE,而且是無序的嗎?也就是說,根本就有檔案沒有被處理到。我很難想像這是一個有認真上過非常基礎的資料結構與演算法的人會寫出的程式。

另一個我印象深刻的例子,就是我曾經遇過後端工程師部署程式上去網頁伺服器後,發現從自己的機器無法連上網頁時 (Connection Refused),卻不知道如何排查問題,重點是他是有 access 伺服器的權限的。但實際上,如果有一點點對於 OS 以及網頁似服器的運作原理的理解,應該會很明確的第一步就去查網頁伺服器的 process 有沒有起來了。

說穿了,我覺得大學最主要的價值,就是在於「有人幫你整理好了整個知識體系,並幫你安排進度」,而對我而言,從我工作上的經驗,我真的認為大學的學習的科目幫助我很多。特別是工作上要學習完全沒接觸過的新的東西的時候,因為有這些基礎,所以可以很容易抓到重點,可以透過基礎的知識來借境並且理解。

另一個我覺得大學很有用的地方,是他可以讓你探索對於不同的領域的興趣。因為我自己 Linux Kernel / Andorid BSP / Android APP / Library Design / Web 前後端 / Desktop Application 都碰過一點,所以感覺滿深刻的。就是雖然都是純軟,但每個領域的成就感、有趣的地方、煩人的地方都不太一樣,而大學可以讓你在幾乎沒有額外的成本之下探索自己有興趣的領域,我覺得這是很棒的一點。

最後,我列一下我認為不論是走哪個領域,不管是資工還是資管,在大學都一定要學好,而且工作上我覺得非常實用(以及面試時也常常考)的幾個科目:

  1. 程式設計 / 計算機組織與架構

    這兩個通常會是兩門不同的課,但其實是一體的,這兩門課是在幫你建立完整的對於你寫的程式的心智模型。

  2. 資料結構與演算法

    不是叫你一定要像刷題達人一樣可以看到題目就實作出解法,但對於各種資料結構和演算法的基本特性還是要有個概念。就算人家函式庫都幫你包得好好的,你也總是要知道在什麼場合下適合用什麼樣的資料結構或演算法對吧?

  3. 關聯式資料庫概論

    這個不用說了吧……即便是現在一堆 Non-SQL DB,但很多時候他們也都是以和 SQL 做比較的,以及在 CAP 定理中他們想要解決哪幾個問題以及放棄哪個之類的。

  4. 網路通訊概論

    我認為對於各個常用的 Protocl 多少要有些了解,特別是現在幾乎各個領域都離不開網路了,特別是做 WEB 的,HTTP 怎麼一回事,和瀏覽器上輸入網址後到畫面顯示出來之間發生了什麼事,總是要有基本的了解吧。

  5. 作業系統

    現在愈來愈多 Multi-thread 的程式了,各種經典的 race condition / deadlock 問題等等,這些東西都是真實世界會發生的。

當然不是說我這邊沒列出來的科目就不重要,而是在十幾年做為軟體工程師的職崖中,我認為基本上是常常都會接觸到,而且從來沒有讓我覺得「我在大學學到的知識是過時並且無用」的東西。當然這個領域一直在翻新,CPU 裡的真實工作情境、指令集可能也早已和我通初學的計算機組織與架構差異很大,但抽象概念性的東西我認為並沒有真的差太多。

關於大學裡學的科目,大概是這些想法。我是認為,如果已經確定要走軟體這條路,有機會就去唸大學,基礎的科目好好掌握,然後盡可能接觸多一點各式各樣不同的領域找找看自己的興趣在哪。

至於研究所,老實說當年我並沒有很強繼續往上唸的想法,只是順勢就讀上去了。雖然課上得很開心(我喜歡上課),但論文寫得很痛苦。基本上我是混畢業的,對我來說研究所的價值真的就是那紙文憑而已,雖然除了我後來有在中研院一段時間是靠那張文憑核薪外,我也不知道那張紙他還有什麼其他的價值。

下一篇,應該會講一下我真的進到這行後,對於生活與工作的平衡的一些心路歷程。

回響