文/tkuo
以前作為學生,上課時多少都會思考,「學這個以後真的用的上嗎?」
▲Google 工程師分享大學資工課程對工作的真實價值(圖/freepik)
工作一段時候後,對產品/軟體開發有些經驗後,回顧一下自己大學課程,依據我個人主觀意見/經驗分成三個層級:
目前於Google台灣擔任軟體工程師,會以在Google快約三年的經驗,共兩個不同的team,來作為評斷標準。
註:大學在國外唸的,所以可能和台灣課程略有不同。
推薦文章>>十年面試失敗經驗成功進 Google!台灣工程師:薪水沒想像中的高 !
選擇標準:幾乎每個專案實作以及和同事溝通上經常使用到的。
熟悉基本語法(e.g., loop/class),也可以是Python/C++等其他語言,入門的第一步「Hello World」。
註:程式語言的線上課程,我認為也有相同學習效果(可能甚至更好)。
對於資料數據,SQL是實際常用上的技能,不論是分析問題(e.g., 有多少比例的使用者遇到特定問題),更新Dashboard(e.g., 每天自動執行SQL script進行資料處理導入)都常經常使用。
OOP基礎觀念,實際應用如Codebase越來越大時,擁有些abstraction(e.g., 定義一個base class去實作共用的methods/規範哪些virtual methods該被derived class實作)可以更好去維持可讀性,便於管理以及共同開發。有開發較大的專案時(e.g., Chrome OS),了解這些基礎OOP概念有助於更快理解整個龐大Codebase架構。
資料結構,雖然實務上並不會自己實作較為複雜的架構(e.g., 紅黑樹),通常都直接呼叫libraries 。但許多資料結構還是經常使用(e.g., vector/hash-map/tree等)。如果需要coding interviews,對面試準備也有不小幫助。
分析演算法複雜度以及熟悉常見的演算法。不諱言,演算法對coding interviews十分重要,特別是以FANNG等矽谷國際公司為目標的。實務上並沒有許多機會去精心設計一個非常optimized的演算法,但有能力去分析一個算法的好壞(e.g., 是否為最佳解),對於寫design docs以及code review有不小的幫助。
Linux基本概念與名詞(e.g., kernel/threads/processes),工作上需要涉及OS-level的實作或效率上的要求(e.g., latency/CPU usage),皆需要理解相關的基本知識。
重要但也不重要,Software Engineering不只包含Coding,還包含怎麼寫出scalable/maintainable的程式,推薦閱讀Software Engineering at Google。
重要在於有機會累積溝通/設定目標以及執行步驟/共同開發等經驗,不重要在於課程中使用的工具,多數(少數例外如Git)相較於業界過於老舊(或畢業時已過時)。
基礎的網路相關概念,在設計features都需要有所考慮,如IPv4/IPv6、需不需使用proxy保護隱私、load balance等等。使用雲端服務(e.g., GCP/AWS)也會常需要理解基本的相關名詞/概念。
或許將電腦視覺放在「必要」的類別,許多人會不同意。但就2023年的現在來說,個人感覺很多時候同事間(software engineers)的溝通,大家潛意識把一些常見的CV概念/名詞默認為不需解釋的知識,如CNN、YOLO、object detection、motion tracking、semantic analysis等。
或許再過幾年,自然語言處理(NLP)相關的知識/名詞(e.g., Transformer, GPT, etc.)也會被我列入「必要」的行列。
選擇標準:偶爾會用上的知識/技能,或是有學過能幫忙加速理解。
介紹最底層的電腦架構(如快取以及CPU基礎運算邏輯),對於理解程式碼的優化(如為何將常數2的倍數)有些許幫助,但幾乎用不上需要實作/修改底層的程式(如組合語言)。
介紹基礎的資安攻擊(e.g., Phishing/DDoS/Bot)以及涉及資安領域的工具(e.g., VPN)等。在Google,Security & Privacy都是feature/services開發過程要經由審核的,所以需要具備基本的資安知識去回答或是了解相關問題。
粗略介紹非Machine Learning的AI方法,在聽一下Research/AI/ML的分享時,有助於更快去了解基本背景。
基本的財金詞彙與概念,非常意外,但每次聽每季整個公司的Forum時,都發現其實可以幫助更好的理解圖表與數字背後的意義。在Google台灣,退休金是可以放置於一些投資型帳戶,此時也會用上。
非常有趣的一門課,涉及GNN(Graph Neural Network)以及常見難題(e.g., 好友/影音內容推薦)。我個人工作並不需要相關知識,不過我相信許多軟體公司的部門會蠻需要相關的知識。
學習不同種類程式語言的共同/不同,之後我並沒有用到任何課上的程式語言,但或許這堂課可以使人更快地去學會各種不同的程式語言,在許多大公司,有機會內部會使用各式各樣未公開的程式語言/Frameworks。
寫程式可能只佔工程師一到三成的時間,如何去溝通/展現成果,將數據可視化是非常重要的一部分,之所以列為可有可無,是因為現在已經有許多工具可以幫忙製作圖表/Dashboards,不見得真的要花費一堂課去學習,可以將同事好的範例留下來當參考即可。
同上,溝通是職場非常重要的能力,但課上學的可能幫助有限,或是與職場實際情況相去甚遠。
選擇標準:工作上從沒用到,也幾乎都還給學校的課。
Multivariable Calculus
Discrete Mathematical Tools for Computer Science
Matrix Algebra and Applications
Introduction to Electro-Robot Design
General Physics with Calculus
註:許多課是非常有趣的,也並不後悔選修這些課。
本文由 tkuo 授權轉載, 原文: 《以Google工程師回顧大學資工課程》