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

作者: brianhsu (墳墓)   2021-09-06 19:01:42
不知不覺進入純軟這個業界也已經十幾年,所以對於在 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 裡的真實工作情境、指令集可能也早已和我通初學
的計算機組織與架構差異很大,但抽象概念性的東西我認為並沒有真的差太多。
關於大學裡學的科目,大概是這些想法。我是認為,如果已經確定要走軟體這條路,
有機會就去唸大學,基礎的科目好好掌握,然後盡可能接觸多一點各式各樣不同的
領域找找看自己的興趣在哪。
至於研究所,老實說當年我並沒有很強繼續往上唸的想法,只是順勢就讀上去了。
雖然課上得很開心(我喜歡上課),但論文寫得很痛苦。
基本上研究所我是混畢業的,對我來說研究所的價值真的就是那紙文憑而已,雖然
除了我後來有在中研院一段時間是靠那張文憑核薪外,我也不知道那張紙他還有什
麼其他的價值。
下一篇,應該會講一下我真的進到這行後,一路以來對於生活與工作的平衡的一些
心路歷程。
作者: yuigahamayui (由比ヶ浜 結衣)   2021-09-06 19:03:00
好文先推
作者: ntpuisbest (阿龍)   2021-09-06 19:17:00
作者: gasbomb (虛空雷神獸)   2021-09-06 19:17:00
作者: owoer (漂流血球)   2021-09-06 19:18:00
暨南老師其實蠻用心的,給推
作者: joshnash (JoshNash)   2021-09-06 19:26:00
寫web當碼農真的未必需要念大學 研究所更不用說了
作者: alihue (wanda wanda)   2021-09-06 19:36:00
作者: jonyig (是喔喔)   2021-09-06 19:59:00
作者: oopFoo (3d)   2021-09-06 20:01:00
推。學校也是建立人脈的好地方,好同學可以幫你打開視野
作者: jackflu (jackflu)   2021-09-06 20:01:00
推個
作者: akira01 (小吉)   2021-09-06 20:21:00
推 雖然是一些讀了就忘記的知識
作者: ttsung2 (宗宗)   2021-09-06 21:30:00
作者: nmns0110 (奶油塔)   2021-09-06 21:47:00
作者: mvpkgmax (mvp)   2021-09-06 22:00:00
作者: zzshcool (台灣人)   2021-09-06 22:19:00
推,好文
作者: inte629l   2021-09-06 22:34:00
作者: kkroy (☆㊣↖煞氣ㄟ阿喂↘ξ★)   2021-09-06 22:52:00
作者: chuegou (chuegou)   2021-09-06 23:03:00
不同看法 程式設計的搭配我會拿計概搭計組拿去配系統程式
作者: tennyleaz (tenny)   2021-09-06 23:12:00
作者: kyrie77 (NTU KI)   2021-09-06 23:15:00
作者: viper9709 (阿達)   2021-09-06 23:16:00
推~這也太用心
作者: yehzu (小葉~)   2021-09-06 23:34:00
強者我同事推推XD 覺得讀大學讓各領域專家來導讀各領域,有遇到好的老師真的是很賺的事
作者: mike8469 (mike8469)   2021-09-06 23:46:00
推推
作者: MoonCode (MoonCode)   2021-09-07 00:00:00
網路上資料念一念就知道了 懂怎麼google比較實在做web真的不需要學歷吧 需要基本的英文能力跟找資料能力 就是一堆工具讓你搭起來而已
作者: newhandfun (新手方)   2021-09-07 00:39:00
我比較好奇的是真的會碰到要這些大學基礎知識”才能”解決的問題嗎?還是其實duck不必?本魯也有上過演算法跟資料結構,但越工作越覺得問題根本不在這些東西上要說時空間複雜度,前人的程式碼也是一堆N+1,要說了解資料庫,系統一堆反正規化也是活得好好地我才剛下訂計算機網路,但還是很迷茫更別說一堆工具的抽象化,像本魯寫的php剛好讓開發者不用面對多執行緒的問題......嘆,越說越不知道補基礎知識到底有沒有用
作者: sumsum (simon)   2021-09-07 00:59:00
推分享!
作者: MonkeyCL (猴總召)   2021-09-07 01:41:00
有機會就好好讀,半路出家的還是先努力拿到offer要緊
作者: fly19920820 (小歐官)   2021-09-07 01:54:00
分享心得給推
作者: sooge (老衲)   2021-09-07 02:17:00
大學不是資工系的怎麼辦= =
作者: j355203 (水面上的小草)   2021-09-07 03:20:00
先推了
作者: qrtt1 (有些事,有時候。。。)   2021-09-07 07:27:00
有看有推
作者: BlacksPig (Black Handsome s Pig)   2021-09-07 08:17:00
同newhandfun大大
作者: matyih (mat)   2021-09-07 08:23:00
出國轉軟的幾乎都電機自學..
作者: qrtt1 (有些事,有時候。。。)   2021-09-07 09:04:00
補基礎有沒有用的問題,在於是否能將知識融入思維而影響選擇像我很喜歡看 fcamel 的文: https://bit.ly/2X0BTc3常會讓我有一種,某些時候我該模仿他的思維去看待技術以便做出更好的選擇。
作者: ClownT (Clown)   2021-09-07 09:46:00
推用心好奇你從業多久了
作者: Kagami3421 (卡加米)   2021-09-07 10:05:00
作者: aaa1234136 (淡水活魚)   2021-09-07 10:07:00
好奇大大打算寫幾篇文章XD 很期待下篇
作者: WulinWorks (武林)   2021-09-07 11:19:00
作者: asdkmm5050 (Mr xx)   2021-09-07 11:57:00
謝謝分享
作者: polola6212 (Polo)   2021-09-07 12:08:00
說實在話,在台灣不補基礎知識,後果也只是留一堆拉G給後來的人
作者: htury (冰點)   2021-09-07 13:39:00
推,不過其實就是老闆無法分辨會動就好跟效率高的差異,導致軟工要高薪只能去美中
作者: chyl13579 (阿帥)   2021-09-07 13:52:00
推推
作者: joshnash (JoshNash)   2021-09-07 14:28:00
沒有本科大學學歷缺點還是比較不好拿面試拉
作者: zenithyoung   2021-09-07 15:01:00
作者: pb2201416   2021-09-07 15:55:00
大推
作者: PerspectiveS (人類行為觀察學家)   2021-09-07 16:23:00
作者: viper9709 (阿達)   2021-09-07 18:37:00
推碼農跟工程師的差別
作者: brandonron (假嗨)   2021-09-07 20:02:00
跟某樓一樣想法,大學認識人跟發掘想觸碰的,而碩士磨練自己處事能力跟想法
作者: loadingN (sarsaparilla)   2021-09-07 20:12:00
畢竟是理論和實務並重的工作 有些東西你不懂就很難突破
作者: chen1025 (小陳)   2021-09-07 20:13:00
作者: whatabiggun (奶奶早安)   2021-09-07 21:41:00
作者: shieldsky (Gray wolf)   2021-09-07 21:54:00
推碼農跟工程師的差別,繼續努力朝工程師邁進 :)
作者: ejnfu ((-. .-)b)   2021-09-08 03:29:00
大部分同意,不過碼農與工程師的差別不同意,你舉的例子一般碼農就要會了,面試都會問的。我覺得主要差異在於background knowledge以及design的能力。
作者: godsparticle (阿粒)   2021-09-08 07:26:00
看來所謂的碼農=低薪 XD
作者: shiauji (消極)   2021-09-08 09:59:00
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2021-09-08 10:10:00
或與有些基礎知識大家都覺得一般碼農應該都要會的,但現實是很多轉職甚至本科系CS在解決問題時 完全不知道背後原理HTTP機制 甚至OS防火牆規則都不知道 無法獨立解決問題
作者: alihue (wanda wanda)   2021-09-08 11:42:00
不是工作上用不到,是知識不足埋雷而不自知你想一下密醫也能活得好好的治療大部分感冒頭痛拉肚子,但就是會誤判導致延誤就醫被爆出來
作者: kevin1ptt (蟻姨椅yee)   2021-09-08 14:55:00
好文推推!
作者: Hsins (翔)   2021-09-08 15:08:00
就是很多人學的不扎實而已,基礎知識深深影響系統設計能力。光是查詢跟排序這兩件事,很多人就都寫不好,以為是硬體規格問題。
作者: alan5 (小安)   2021-09-09 15:56:00
hashmap那個特別有感 遇過堅持hashmap就是比較快的
作者: kaiac (kaiac)   2021-09-10 00:58:00
推 工作後對所謂的基礎知識認知和你講得差不多 不過也同時感覺基礎知識似乎用不太到 也許是能力所能到的工作環境就到這種水平吧...
作者: lou01 (lou01)   2021-09-10 11:02:00
推 期待下一篇
作者: johnny719top (AngelGod)   2021-09-11 13:10:00
推推
作者: bbkhdh (bbk.hdh)   2021-09-13 11:01:00
推 暨大大學長
作者: swich45314 (swich)   2021-09-13 17:23:00
我是念資工的 在IT業 我必須說理解大學課程的內容 會讓你比同行高一個等級 再找問題等方面都比資管的同事強 當然不會說你就不能做相關工作了只是能力會差一些

Links booklink

Contact Us: admin [ a t ] ucptt.com