iT邦幫忙

2022 iThome 鐵人賽

DAY 3
3

如果是非本科系一個剛轉職沒幾年的超級菜鳥
很多人應該是沒有任何DSA的任何一丁點基礎的
或甚至是本科系的菜鳥但是大學教DSA的時候還沒意識到這個東西還蠻重要的
所以根本就沒有好好學DSA,或是從來沒有寫程式實作或是操作它
註:DSA (Data Structure and Algorithm,資料結構與演算法)
(如果還算懂演算法的話可以跳到下一篇了,這篇是純粹寫給新手的)

甚至有一兩年工作經驗的軟體工程師可能會這樣覺得:

工作上似乎還是免不了有50%的時間要花在解決人/團隊/流程/雜事的大大小小問題
剩下寫code的時間就都不夠了,真的用到DSA的時數少之又少
我真的有必要花時間去學這些嗎?
花時間去學一些新的框架/tool,搞懂legacy code,看一些管理或是技術文章,
或是花時間批鬥一下別人的code搞不好ROI更高 (Return on Investment, 投資報酬率)

身為一個刷過很多題的人,確實我認為,
大部分leetcode比較難的的演算法在工作上都不太用的到,
乍看之下是個純粹為了增加換工作籌碼的沒意義考試

但演算法本身比大家想像的重要許多
尤其是複雜度分析的部分


舉個非常非常假設性的例子:

假設今天有一個工程師小明在處理一堆商品頁面的item
客戶希望頁面能讓使用者用價錢排序,
價錢相近的時候要再用每個商品廠商出的廣告費來排序

如果小明今天是一個演算法一竅不通的人,可能平常排序常寫,
聽到排序就覺得阿sorting他會,
就是把東西丟進去array然後call array 內建的那個 sort() 就好

但是遇到這種有變化的sorting:

  • 最壞的情況:
    小明可能就一直狂跟PM吵架
    說你的要求不對這個做不出來
    應該就要價錢優先或是廣告費優先
    只能擇一什麼什麼的,
    可能PM也不懂演算法所以PM就默默地吞了這個回答

  • 壞的情況:
    小明回去硬幹,把所有可能的組合通通寫出來,
    然後用for loop試一遍,
    看哪一個有成功符合每個商品都有比前一個商品的價錢高,
    或是價錢相同但廣告費高就回傳那個結果,
    (一個O(n!)的排序演算法)
    寫出來之後洋洋得意的覺得自己解決了問題,
    而且因為QA的測試頁面只有五個商品,測的時候都沒什麼問題

(這只是一個非常假設性的例子
當然可以argue說sort by multiple keys
不懂演算法還是可以寫
但不變的是如果完全不懂
演算法複雜度或是分析的方法,
是很有可能寫出測資一大的時候直接掛掉的網站或service)

(給沒有演算法基礎的讀者,第二種例子如果商品數量變成20個,
它的網站應該就會因為執行時間過長掛掉了
如果商品的數量變成100個,
那到太陽燃燒殆盡甚至宇宙的熵不再增加之時,
他的code都不會找出正確的答案)

如果讀者還對演算法一知半解,
不妨想想這個可怕的例子,
再想想自己有沒有在任何issue/meeting上,
曾經當過那個小明(或是當了那個可憐的PM)
(題外話,筆者真的聽到身邊的故事是
PM吞了一些明明做得到的需求
所以說PM也應該要來一起學演算法搶工程師的工作 (喂!)

如果這個時候又有一個剛到職的工程師阿仁,
看到這行code,改掉之後跟老闆報告,
在XXX改了小明的code結果OOO變快了k倍,
那以後老闆看待小明和阿仁的角度應該就完全不一樣了
甚至如果老闆本身是懂技術的人,看到小明寫出這樣子的code,
除了會再花很多時間教他之外,
可能以後重要的project一段時間內都不會交給小明了
(實際上會發生的事應該是懂技術的老闆一開始就不會Hire小明)

這個是runtime的例子,
就算今天寫的不是O(n!)這種極端的code,
只要程式速度跟別人差了一倍,
可能就是租AWS的成本差了一倍,
User手機耗電量多了一倍

如果今天是做embedded或是其他有的沒的工程師,
可能還有memory的考量,寫出來的程式在如果memory超過多少threshold,
可能就會整個當機或是晶片所需要的成本就是比別人高不少
甚至可能勞苦功高為公司盡心盡力,
但最後老闆在選人的時候還是考量了這些基本功,
而錯失被選為Team Lead的機會等等

DSA和刷題影響的其實還有思考邏輯/看code速度/寫code速度等等... blablabla
如果有看一本軟工的經典書《人月神話》的話,就會知道
據統計,頂尖工程師跟一般工程師的產出會差到10倍,

更別提一般的工程師和不太懂DSA的工程師的差距了
也就是對老闆而言,他付一個頂尖工程師一年1000萬的薪水
跟付十個一般工程師一年100萬的薪水,最後的成效是差不多的

(老闆:付500萬給頂尖工程師然後lay掉其他人)


也不是說要做到最頂尖最optimal,但這種基本的東西顯然是少不了的

以牙醫的例子來舉例,牙醫產業就像工程師一樣本來就很競爭
而且一些比較外表的項目,牙醫診所地點/裝潢漂不漂亮都的的確確的影響到生意
但是診所裡面牙醫拔牙,補牙那些基礎的技術如果做得不好,
就算表面的東西做得再好,長久下來病人還是會回去投靠那些技術扎實的牙醫

如果不知道 為什麼array find是O(n),erase是O(n)
或是無法估算簡單遞迴的複雜度,這些偷懶沒學的一些基礎
遲早在工程師生涯中的某一天,
會對生涯發展造成嚴重的傷害(甚至不一定會察覺到)

參考文章:
程式自學十年心得:想吃這行飯,學好演算法與資料結構才能讓你站穩腳步| TechOrange 科技報橘

那更別提那些本來就是演算法dominate的工作了
(像是Design house做的演算法的模擬等等,外商公司的很多很多爽缺….)


題外話,台灣的bootcamp畢業生
(尤其是菜鳥工程師的individual contributer)的薪水是有目共睹的低

(跟同等能力的新加坡 日本 愛爾蘭 美國 工程師職位比較)
尤其是如果你是非本科系的bootcamp仔,
可能要想想當初努力bootcamp的目標
(或是想想當初bootcamp的時候也是曾經很辛苦地,
把本科仔以前學的東西半年內學完,現在只是再來一次)
如果因為沒機會接觸演算法/Leetcode等等本科仔可以拿來說嘴的東西,
沒有辦法去面試一些比較有名的考刷題的公司,
過了兩三年甚至五年後,還是待在同一家公司(轉管理職除外),
在薪資的部分可能就特別差強人意

參考文章:
(備份)(驚爆)科技業薪水大揭密
那些「鹹魚翻身」的文章沒有告訴你的事
(如果是有認真上課的本科仔可以拿來說嘴的東西其實還蠻多的Orz)
一份來自亞馬遜工程師的Google面試指南,GitHub收穫9.8萬星,已有簡體中文版本

所以就算
1.想要繼續待在相同領域
2.想要挑戰自己轉去一些也是薪水不錯的公司
(筆者隨便在求職網站上找的)
Shopline OneDegree Ubiquiti Devcore CloudMosa 鈦坦科技等等

所以筆者在這邊也是強烈的推薦
每個還不太知道演算法/複雜度分析是什麼東東的工程師們
趕快踏出你的第一步,找一些線上教材自己讀讀,爭取自己想要的生活品質

我覺得還不錯的演算法線上教材:

演算法學習之-Leetcode-破關總指南(一). 新手村與基本功訓練
演算法學習之Leetcode 破關總指南(二)
Basics Sorting - 《資料結構與演算法/leetcode/lintcode題解》 - 书栈网
時間複雜度– 陪你刷題
neetcode
刷題也算一種電競吧:演算法與資料結構


但有一個要特別注意的事情就是
因為網路上資源實在太多了,演算法又幾乎不是一個自學友善的科目
聽影片或是看教學文章的時候如果遇到問題,
像是這個東西為什麼要這樣的why,這個結論怎麼會這樣的how come,
都很容易讓人挫折撞牆或是直接回頭放棄
而且我的經驗是初學者常常會著墨一些不是很重要的牛角尖問題
(先回去刷到500題以上可以去面試了我們再來慢慢討論都可以)

如果你是演算法超級新手而且你覺得你對自學沒那麼有把握
我還蠻建議直接找家教的

如果要繼續往下走到能夠準備好開始刷題甚至從容應付面試的程度
以一個完全沒有演算法經驗的新手來說,大概需要台大電機系9學分的課的時間心力乘積
(我自己會估計是100-500小時左右)

9學分乍聽不多,如果能夠全職刷題可能進度會快一些
但一般有經濟壓力只能靠下班時間準備的人(又一定會有一些抽不開身的事情要忙)
這些準備其實大概會花六個月到一兩年的時間
如何高效率的學習是非常重要的一件事情

BTW,如果要找家教
一律建議找leetcode 1800+或是codeforce 1400+(真的大致上有在寫題目的)
或是直接找大公司有在面試別人的工程師們

網路上充斥著各種看似好懂 圖文並茂的教材
而且也充滿看似很會寫分享文章
但是實際上可能只是寫了一些簡單leetcode題的老師
也有很多是就直接把很難的東西的解法照著解答講一遍的
這種教材是很難讓人通透解題觀念觸類旁通的
甚至從來沒實際面試過外商大公司,
就跑出來教人家面試FANG的人也是不少

初學者很難分辨哪些寫得其實沒有很好
甚至還會看到複雜度分析寫錯的

如果是沒有在刷題只懂演算法的老師
可能教導的方向也會不太match面試所需要用到的技能組
(像是不要覺得去北車某考研補習班照講義學才會最扎實,絕對不是,
尤其leetcode是一種正確性要求很高的演算法線上作業,
只念DSA課本講義不練習是不可能會讓leetcode變強的)

以下是我知道有在開班授課或是接家教的資奧大神們
(每個都比我強一百倍以上 汗)
AA競程(這個主要是開給有興趣打資奧的)
寺尾哲也
演算法海牛

筆者(很幸運地)演算法很多年前在大學已經扎實的修過
所以對初學者的哪些資源比較完善跟詳盡比較不熟悉
(可能以後接個家教就會因為責任心的關係進步了 汗)

有什麼大家看到更好的教材或是有推薦的開班授課或家教老師們也再煩請留言補充了!


上一篇
我該刷題嗎? / 在面試之前 / 追尋自己想要的人生是一輩子的功課 / 刷題只是一種選擇
下一篇
刷題能學到什麼嗎?
系列文
0到100的軟體工程師面試之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言