iT邦幫忙

2022 iThome 鐵人賽

DAY 4
1

很多沒在刷題的人最常問我的問題是:
“你覺得你刷了這麼多題對工作會有幫助嗎?”
“你覺得你工作上用的到那些刷題的技巧嗎?”
以觀望並衡量自己要不要開始刷題

這些問題的回答沒有一個最完美的答案

有文章說過某個Google面試官的回答是
有95%的時間沒有用但是剩下的5%時間會不會演算法決定了code 95%的performance
不失為一個好的回答
(code寫得SOLID與否,好不好維護/擴充code又是另一大哉問,能決定整個團隊的performance...)

也記得有人說Google也有討論過用刷題是不是會刷掉一些沒時間/沒興趣刷題的大神
但是內部好像有研究數據說這樣找進來的人有蠻多metrics表現的都比較好
(也可能是真的很想進去的人才會願意一直花時間刷題)
所以就決定繼續維持這樣的評選標準


筆者也認為確實Leetcode中後期用到的演算法實際工作上大部分都用不到
但身為一個刷了1000多題的既得利益者
如果讀者是軟體工程師,
筆者還是想要推薦一下像leetcode這樣的演算法競程益智題目

可以學到
1.演算法,演算法比你想像的重要
2.leetcode寫多了會讓你在寫production code的時候養成一些非常受用的好習慣
小心謹慎 會多考慮很多邊界條件 檢查自己的code有沒有overflow等等等(系列文後面會不時提到)
(但也會養成一些壞習慣自己要警惕,像是變數命名變得太簡略,掉入時間複雜度/傳統解題套路的窠臼,太依靠leetcode的測資等等等等)
3. 在短時間內有壓力之下迅速coding,想出演算法跟bug free寫出來的能力
4. 還有遇到陌生問題的時候系統化generalize問題的能力

原本這篇文章想要再長篇大論一點
但是看了看網路上的文章發現
別人其實大部份都寫過筆者想寫的了(而且還寫得比我好很多)
筆者這邊也不特別再summary

非常推薦讀者點開以下三篇必看文章仔細閱讀
Re: [討論] 軟體工作真的有需要刷題嗎? - 看板 Soft_Job
Soft_Job版 "sorryla"的面試心得
更進階一點的能力跟討論可以參考這個文章
Re: [討論] 所以練acm都底有啥好處? - 看板 Programming - 批踢踢實業坊

當然很少人是單純為了增進工作上的程式能力去刷題
但是筆者認真覺得和剛開始的自己相比,在程式上面的各種能力確實提升了不少

剛好最近Soft_Job版出現了一個
持續快兩個禮拜的經典主題「R: [討論] 我就問,刷題強者的實務表現?」
筆者有一些感想放在系列文後面的文章 給面試官的出題建議 / 如果不考Leetcode那要考什麼?
讀者也可以先去參考

筆者認為大部分認為刷題跟實務/工作無關的人都只針對演算法部分
但是他們忽略了:

像是筆者這種刷了1000題的刷題仔
(Leetcode排行榜上隨便打開比我刷得多的人多得是,或是競賽仔也是一定在更難的題庫裡大量練習過)
在AC到1000題之前,(因為常常會回去複習寫過的題目),一定是經過了
submit 3000~6000次程式到online judge system,
拿到AC或是有BUG的結果的這個過程
連GAN(生成對抗網路)train一train都能生出一堆以假亂真的圖片了
人腦在經過這種訓練之後進步的幅度是很可觀的
更別說也可能還會常常去看別人(這種小task)的code是怎麼寫的漂亮又乾淨1000次左右
對於寫程式本身速度 正確性 邏輯清晰 code簡潔乾淨好懂之類的訓練
絕對是非常有幫助的

筆者舉一個實例:

Leetcode 715. Range Module
這題,其實用不到什麼複雜的演算法

(解法暴雷警報)
(解法暴雷警報)
(解法暴雷警報)
(Spoiler Alert)

甚至可以直接説(一個解答區主流的)做法就是用一個能按key排序的容器
(以C++而言就是map<int,int>),key是左端,value是右端
去維護區間的起點(閉)和終點(開)

(警報結束)
(警報結束)
(警報結束)
(Spoiler Alert End)

就算知道了演算法,要能在15~30分鐘內把這題寫完通過所有測資,
要能熟用容器和考慮一些細節,筆者認為難度還是非常高的
但至少我在第一次看過答案後試圖自己把這題寫出來的過程,
還是花了蠻多次的嘗試和WA才把答案寫出來

但是專業刷題仔和競賽仔可能從第一次看到這個題目讀題目,
到通過所有測資到把code整理乾淨,只需要5~10分鐘

至少這個差異對我而言還蠻有感的
如果我做六個禮拜的事情,隔壁的競賽仔只要做一個禮拜就做完,
那對老闆而言,我拿他1/3的薪水老闆還會覺得吃虧呢

很多支持刷題的人可能也會說他是為了大公司面試才狂刷的
刷題本身一點卵用都沒有
筆者是完全不同意這個論點的

就算只是少一次compile error省了5-10分鐘,少埋一個bug,code邏輯更清晰,
別人更好懂你的code,更好懂別人的code
寫code更快,debug速度更快等等等的差別,看似微不足道
但實際上考慮到聚沙成塔集腋成裘的馬太效應,可能日積月累下來其實會有巨大的差異
(關於馬太效應,推薦文章:異數)

當然最最現實的就是看得到的大公司面試都會考
小公司也都跟風考
想換工作的話刷的越熟籌碼越多

這雖然是一個很有力的理由
但筆者認為刷題並不是花了大把精力只能準備面試而在工作上完全無用的一個技能
希望讀者看完這系列文章能夠對leetcode的刁鑽/學究/八股/geek才會去寫leetcode的印象能夠有所改觀

其他刷題之後能學到什麼大部分會在系列文不時提到
就不特別把之後的文章複製到前面推薦了


上一篇
演算法比你想像的重要
下一篇
想要Ace面試,要刷多少題?
系列文
0到100的軟體工程師面試之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
f88083
iT邦新手 5 級 ‧ 2023-09-27 03:23:52

感謝前輩分享

我要留言

立即登入留言