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

看板Soft_Job作者 (墳墓)時間2年前 (2021/09/06 19:01), 2年前編輯推噓55(55031)
留言86則, 54人參與, 2年前最新討論串1/1
不知不覺進入純軟這個業界也已經十幾年,所以對於在 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 裡的真實工作情境、指令集可能也早已和我通初學 的計算機組織與架構差異很大,但抽象概念性的東西我認為並沒有真的差太多。 關於大學裡學的科目,大概是這些想法。我是認為,如果已經確定要走軟體這條路, 有機會就去唸大學,基礎的科目好好掌握,然後盡可能接觸多一點各式各樣不同的 領域找找看自己的興趣在哪。 至於研究所,老實說當年我並沒有很強繼續往上唸的想法,只是順勢就讀上去了。 雖然課上得很開心(我喜歡上課),但論文寫得很痛苦。 基本上研究所我是混畢業的,對我來說研究所的價值真的就是那紙文憑而已,雖然 除了我後來有在中研院一段時間是靠那張文憑核薪外,我也不知道那張紙他還有什 麼其他的價值。 下一篇,應該會講一下我真的進到這行後,一路以來對於生活與工作的平衡的一些 心路歷程。 -- ~ 白馬帶著她一步步地回到中原。白馬已經老了,只能慢慢地走, 'v' Brian Hsu 但終是能回到中原的。江南有楊柳、桃花,有燕子、金魚…… // \\ ( 墳 墓 ) /( )\ 但這個美麗的姑娘就像古高昌國人那樣固執。 【白馬嘯西風】 ^`~'^ http://brianhsu.moe/blog 『那都是很好很好的,可我偏不喜歡。』 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.206.134 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1630926110.A.232.html ※ 編輯: brianhsu (1.34.206.134 臺灣), 09/06/2021 19:02:01

09/06 19:03, 2年前 , 1F
好文先推
09/06 19:03, 1F

09/06 19:17, 2年前 , 2F
09/06 19:17, 2F

09/06 19:17, 2年前 , 3F
09/06 19:17, 3F

09/06 19:18, 2年前 , 4F
暨南老師其實蠻用心的,給推
09/06 19:18, 4F

09/06 19:26, 2年前 , 5F
寫web當碼農真的未必需要念大學 研究所更不用說了
09/06 19:26, 5F
是不必。但這個人人唸大學的時代,如果本來就已經有打算走這行,而且也有 資源讀大學,這會是最直接的入場方式。

09/06 19:36, 2年前 , 6F
09/06 19:36, 6F

09/06 19:59, 2年前 , 7F
09/06 19:59, 7F

09/06 20:01, 2年前 , 8F
推。學校也是建立人脈的好地方,好同學可以幫你打開視野
09/06 20:01, 8F

09/06 20:01, 2年前 , 9F
推個
09/06 20:01, 9F

09/06 20:21, 2年前 , 10F
推 雖然是一些讀了就忘記的知識
09/06 20:21, 10F

09/06 21:30, 2年前 , 11F
09/06 21:30, 11F

09/06 21:47, 2年前 , 12F
09/06 21:47, 12F

09/06 22:00, 2年前 , 13F
09/06 22:00, 13F

09/06 22:19, 2年前 , 14F
推,好文
09/06 22:19, 14F

09/06 22:34, 2年前 , 15F
09/06 22:34, 15F

09/06 22:52, 2年前 , 16F
09/06 22:52, 16F

09/06 23:03, 2年前 , 17F
不同看法 程式設計的搭配我會拿計概搭
09/06 23:03, 17F

09/06 23:03, 2年前 , 18F
計組拿去配系統程式
09/06 23:03, 18F
這個組合應該也不錯,不過我是文組資管,沒有系統程式這門課, 計組加減用一下。

09/06 23:12, 2年前 , 19F
09/06 23:12, 19F

09/06 23:15, 2年前 , 20F
09/06 23:15, 20F

09/06 23:16, 2年前 , 21F
推~這也太用心
09/06 23:16, 21F

09/06 23:34, 2年前 , 22F
強者我同事推推XD 覺得讀大學讓各領域專家來導讀各領域,有
09/06 23:34, 22F

09/06 23:34, 2年前 , 23F
遇到好的老師真的是很賺的事
09/06 23:34, 23F

09/06 23:46, 2年前 , 24F
推推
09/06 23:46, 24F

09/07 00:00, 2年前 , 25F
網路上資料念一念就知道了 懂怎麼google比較實在
09/07 00:00, 25F
如文,我認為大學的重點是「有人幫你整理好知識體系並進行導讀」。

09/07 00:04, 2年前 , 26F
做web真的不需要學歷吧 需要基本的英文能力跟找資料能
09/07 00:04, 26F

09/07 00:04, 2年前 , 27F
力 就是一堆工具讓你搭起來而已
09/07 00:04, 27F

09/07 00:39, 2年前 , 28F
我比較好奇的是真的會碰到要這些大學基礎知識”才能
09/07 00:39, 28F

09/07 00:39, 2年前 , 29F
”解決的問題嗎?還是其實duck不必?
09/07 00:39, 29F
當然不是只有這一條路。但我自己的經驗上,遇到疑難雜症的時候,有這些基礎 知識的人,和沒有這些基礎知識的人,非常明顯是有差別……

09/07 00:39, 2年前 , 30F
本魯也有上過演算法跟資料結構,但越工作越覺得問題
09/07 00:39, 30F

09/07 00:39, 2年前 , 31F
根本不在這些東西上
09/07 00:39, 31F

09/07 00:41, 2年前 , 32F
要說時空間複雜度,前人的程式碼也是一堆N+1,要說了
09/07 00:41, 32F

09/07 00:41, 2年前 , 33F
解資料庫,系統一堆反正規化也是活得好好地
09/07 00:41, 33F

09/07 00:41, 2年前 , 34F
我才剛下訂計算機網路,但還是很迷茫
09/07 00:41, 34F

09/07 00:44, 2年前 , 35F
更別說一堆工具的抽象化,像本魯寫的php剛好讓開發者
09/07 00:44, 35F

09/07 00:44, 2年前 , 36F
不用面對多執行緒的問題......嘆,越說越不知道補基
09/07 00:44, 36F

09/07 00:44, 2年前 , 37F
礎知識到底有沒有用
09/07 00:44, 37F
如果你寫的 PHP 能夠讓開發者不用面對多執行緒的各種問題,那麼你勢必 得先對各種多執行緒會遇到的問題以及解決的方法有所理解對吧? 如果沒有,那麼要嘛: 1. 你的抽象可能還是隱含了各種問題。 2. 有更底層的抽象幫你解決了這些問題。 因為如果自己不知道多執行緒的這些問題,那麼就不可能開發出可以解決這些問 題的抽象層啊,而這些抽象層也勢必得由理解並能夠提出解決方法的人開發的。 有能力進到這些更底層的開發,不也正就是和沒有這些基礎知識的人的差別,也 是議價能力,以及能不能有更廣的發展的一個差別嗎? 舉例來說,如文說,我自己在各個領域中都有過一點點經驗,也有過上一份專案 是做 WEB 但下一份專案要去做嵌入式系統的狀況,但我從來沒有過覺得「無法 上手」的狀況,雖然我在大學、研究所時是完全沒有碰過嵌入式的。 因為在大學完整的知識體系的訓練下來,我能夠知道如何把過往的知識應用到嵌 入式系統上,以及知道他和我過往的工作經驗的斷點在哪,於是我能夠很快速的 知道該怎麼去有效率地吸收嵌入式的相關領域的知識。 一點想法上的補充,給大家參考一下。

09/07 00:59, 2年前 , 38F
推分享!
09/07 00:59, 38F

09/07 01:41, 2年前 , 39F
有機會就好好讀,半路出家的還是先努力拿到offer要緊
09/07 01:41, 39F

09/07 01:54, 2年前 , 40F
分享心得給推
09/07 01:54, 40F

09/07 02:17, 2年前 , 41F
大學不是資工系的怎麼辦= =
09/07 02:17, 41F
沒怎麼辦啊。我文章裡也說了,我認同這行確實不是相關科系也可以來做, 只是入場的方式和成本不同。主要只是分享一些我認為讀大學的價值和好處 而已。

09/07 03:20, 2年前 , 42F
先推了
09/07 03:20, 42F

09/07 07:27, 2年前 , 43F
有看有推
09/07 07:27, 43F

09/07 08:17, 2年前 , 44F
同newhandfun大大
09/07 08:17, 44F

09/07 08:23, 2年前 , 45F
出國轉軟的幾乎都電機自學..
09/07 08:23, 45F
================

09/07 09:04, 2年前 , 46F
補基礎有沒有用的問題,在於是否能將知識融入思維而影響選擇
09/07 09:04, 46F

09/07 09:04, 2年前 , 47F
像我很喜歡看 fcamel 的文: https://bit.ly/2X0BTc3
09/07 09:04, 47F

09/07 09:05, 2年前 , 48F
常會讓我有一種,某些時候我該模仿他的思維去看待技術
09/07 09:05, 48F

09/07 09:05, 2年前 , 49F
以便做出更好的選擇。
09/07 09:05, 49F
================ 我覺得這「在於是否能將知識融入思維而影響選擇」句話超精闢!完全就 是我例子裡想表達的事情,但沒辦法用這麼簡單的一句話概括。 我想到的另一個例子是,我覺得「碼農」和「軟體工程師」的差別,會在 於當碼農寫出一個 O(n^2) 的程式碼時,他就單純的只是「會動就好」, 甚至有可能不知道這是 O(n^2)。 但當一個有基礎知識的軟體工程師寫出一個 O(n^2) 的演算法時,他會很 明確知道他為什麼挑 O(n^2) 的寫法,他用這個 O(n^2) 來交換了什麼比 執行時間更重要的東西,或為什麼這個 O(n^2) 是可以接受的,以及他會 一開始就知道將來遇到不得不調整的效能瓶頸的時候,這個 O(n^2) 的存 在。 ※ 編輯: brianhsu (1.34.206.134 臺灣), 09/07/2021 09:40:56

09/07 09:46, 2年前 , 50F
推用心
09/07 09:46, 50F

09/07 09:46, 2年前 , 51F
好奇你從業多久了
09/07 09:46, 51F

09/07 10:05, 2年前 , 52F
09/07 10:05, 52F

09/07 10:07, 2年前 , 53F
好奇大大打算寫幾篇文章XD 很期待下篇
09/07 10:07, 53F

09/07 11:19, 2年前 , 54F
09/07 11:19, 54F

09/07 11:57, 2年前 , 55F
謝謝分享
09/07 11:57, 55F

09/07 12:08, 2年前 , 56F
說實在話,在台灣不補基礎知識,後果也只是留一堆拉G
09/07 12:08, 56F

09/07 12:08, 2年前 , 57F
給後來的人
09/07 12:08, 57F

09/07 13:39, 2年前 , 58F
推,不過其實就是老闆無法分辨會動就好跟效率高的差異,導
09/07 13:39, 58F

09/07 13:39, 2年前 , 59F
致軟工要高薪只能去美中
09/07 13:39, 59F

09/07 13:52, 2年前 , 60F
推推
09/07 13:52, 60F

09/07 14:28, 2年前 , 61F
沒有本科大學學歷缺點還是比較不好拿面試拉
09/07 14:28, 61F

09/07 15:01, 2年前 , 62F
09/07 15:01, 62F

09/07 15:55, 2年前 , 63F
大推
09/07 15:55, 63F

09/07 16:23, 2年前 , 64F
09/07 16:23, 64F

09/07 18:37, 2年前 , 65F
推碼農跟工程師的差別
09/07 18:37, 65F

09/07 20:02, 2年前 , 66F
跟某樓一樣想法,大學認識人跟發掘想觸碰的,而碩士磨
09/07 20:02, 66F

09/07 20:02, 2年前 , 67F
練自己處事能力跟想法
09/07 20:02, 67F

09/07 20:12, 2年前 , 68F
畢竟是理論和實務並重的工作 有些東西你不懂就很難突破
09/07 20:12, 68F

09/07 20:13, 2年前 , 69F
09/07 20:13, 69F

09/07 21:41, 2年前 , 70F
09/07 21:41, 70F

09/07 21:54, 2年前 , 71F
推碼農跟工程師的差別,繼續努力朝工程師邁進 :)
09/07 21:54, 71F

09/08 03:29, 2年前 , 72F
大部分同意,不過碼農與工程師的差別不同意,你舉的例子一
09/08 03:29, 72F

09/08 03:29, 2年前 , 73F
般碼農就要會了,面試都會問的。我覺得主要差異在於backgro
09/08 03:29, 73F

09/08 03:29, 2年前 , 74F
und knowledge以及design的能力。
09/08 03:29, 74F

09/08 07:26, 2年前 , 75F
看來所謂的碼農=低薪 XD
09/08 07:26, 75F

09/08 09:59, 2年前 , 76F
09/08 09:59, 76F

09/08 10:10, 2年前 , 77F
或與有些基礎知識大家都覺得一般碼農應該都要會的,但現實
09/08 10:10, 77F

09/08 10:11, 2年前 , 78F
是很多轉職甚至本科系CS在解決問題時 完全不知道背後原理
09/08 10:11, 78F

09/08 10:18, 2年前 , 79F
HTTP機制 甚至OS防火牆規則都不知道 無法獨立解決問題
09/08 10:18, 79F

09/08 11:42, 2年前 , 80F
不是工作上用不到,是知識不足埋雷而不自知
09/08 11:42, 80F

09/08 11:44, 2年前 , 81F
你想一下密醫也能活得好好的治療大部分感冒頭痛拉肚子,
09/08 11:44, 81F

09/08 11:44, 2年前 , 82F
但就是會誤判導致延誤就醫被爆出來
09/08 11:44, 82F

09/08 14:55, 2年前 , 83F
好文推推!
09/08 14:55, 83F

09/08 15:08, 2年前 , 84F
就是很多人學的不扎實而已,基礎知識深深影響系統設計能力
09/08 15:08, 84F

09/08 15:10, 2年前 , 85F
。光是查詢跟排序這兩件事,很多人就都寫不好,以為是硬體
09/08 15:10, 85F

09/08 15:11, 2年前 , 86F
規格問題。
09/08 15:11, 86F
文章代碼(AID): #1XDVKU8o (Soft_Job)