為什麼這篇軟體開發 工程師 PTT鄉民發文收入到精華區:因為在軟體開發 工程師 PTT這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者brianhsu (墳墓)看板Soft_Job標題[心得] 軟體工程師的倖存者偏差(一) 關於讀...
軟體開發 工程師 PTT 在 Kelly ?? 德國生活文化|旅遊|留學 Instagram 的最讚貼文
2021-08-18 20:40:46
#回顧凱莉的2020 Part II #職涯 #斜槓 #感謝有你們 今年在職涯上也還算順利 四月開始在Max Planck Institute擔任軟體開發工程師 一開始是學生打工 後來轉成實習合約開始全職工作 和老闆談了不錯的薪水 也同意讓我用20%的時間去學UX/UI的課程 由於接下了組內其中一個...
不知不覺進入純軟這個業界也已經十幾年,所以對於在 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
是不必。但這個人人唸大學的時代,如果本來就已經有打算走這行,而且也有
資源讀大學,這會是最直接的入場方式。
這個組合應該也不錯,不過我是文組資管,沒有系統程式這門課,
計組加減用一下。
如文,我認為大學的重點是「有人幫你整理好知識體系並進行導讀」。
當然不是只有這一條路。但我自己的經驗上,遇到疑難雜症的時候,有這些基礎
知識的人,和沒有這些基礎知識的人,非常明顯是有差別……
如果你寫的 PHP 能夠讓開發者不用面對多執行緒的各種問題,那麼你勢必
得先對各種多執行緒會遇到的問題以及解決的方法有所理解對吧?
如果沒有,那麼要嘛:
1. 你的抽象可能還是隱含了各種問題。
2. 有更底層的抽象幫你解決了這些問題。
因為如果自己不知道多執行緒的這些問題,那麼就不可能開發出可以解決這些問
題的抽象層啊,而這些抽象層也勢必得由理解並能夠提出解決方法的人開發的。
有能力進到這些更底層的開發,不也正就是和沒有這些基礎知識的人的差別,也
是議價能力,以及能不能有更廣的發展的一個差別嗎?
舉例來說,如文說,我自己在各個領域中都有過一點點經驗,也有過上一份專案
是做 WEB 但下一份專案要去做嵌入式系統的狀況,但我從來沒有過覺得「無法
上手」的狀況,雖然我在大學、研究所時是完全沒有碰過嵌入式的。
因為在大學完整的知識體系的訓練下來,我能夠知道如何把過往的知識應用到嵌
入式系統上,以及知道他和我過往的工作經驗的斷點在哪,於是我能夠很快速的
知道該怎麼去有效率地吸收嵌入式的相關領域的知識。
一點想法上的補充,給大家參考一下。
沒怎麼辦啊。我文章裡也說了,我認同這行確實不是相關科系也可以來做,
只是入場的方式和成本不同。主要只是分享一些我認為讀大學的價值和好處
而已。
================
我覺得這「在於是否能將知識融入思維而影響選擇」句話超精闢!完全就
是我例子裡想表達的事情,但沒辦法用這麼簡單的一句話概括。
我想到的另一個例子是,我覺得「碼農」和「軟體工程師」的差別,會在
於當碼農寫出一個 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