不知道從哪個時間點開始,「刷」題成了開發者間的熱門話題之一,因為國外各大科技公司在面試時,從早先腦筋急轉彎式的面試題目,後續轉為提出以程式設計解決的需求,而且,他們要面試者當場思考、提出解決方案甚至實作,或進一步地針對面試者提出的方案,提出更多的邊際條件,例如要求更好的效能、更少的記憶體,以及更大的吞吐量等。

後來有人將這類題目收集起來,在網路上四處流傳,由各界人馬不斷補充,更多的科技公司也趨之若鶩,而想取得工作「門票」的面試者,也就更益發積極地尋找題目清單進行練習,而這股熱潮驅使了提供刷題服務的Leetcode等網站興起,也吹進了臺灣,不論公司大小、實務上是否用到,對付要來面試的開發者,從題庫裡挑個幾題,考就對了!

刷題是新東西?不!從小到大我們一直都在做,例如,為了在學校的月考取得好成績,大家會買各科「自修」書籍,練習其中的題目;為了在聯考(會考、指考)錄取好學校,我們會做過一張又一張的考古題,由於有些入學考還會考智力測驗,因此,就連智力測驗也有考古題!

說穿了,這類考試或面試,就是主辦單位用來「篩選」他們認為的不適任者(相對地,留下候選者),畢竟來的人太多,總要有個篩選方式,讓面試官能快速地萬中選一,就算是笑話般地將履歷表洗牌,抽出一半丟進垃圾桶,而稱運氣也是實力的一環,這說法似乎也有幾分道理。

別說從小到大的考試,你知道「高中生程式解題系統」嗎?知道現在學校有APCS嗎?各式國際認證考試就不用說了,參加考試前,必然要刷各認證的考古題,就像我去考Java認證之前,也刷考古題啊!

別傻傻地拼實力,基本上,考試與實力是兩碼子事,事先知道對方會考什麼很重要,別像我當年考完預官智力測驗後,覺得自己像個笨蛋,後來在書局裡發現預官智力測驗竟然也有考古題,當時覺得自己還真是笨蛋!

為了培養實力?

也有不少開發者或刷題過來人強調:不要只是為了面試而盲目刷題,將來面試時有機會用上是好事,若沒機會用上,也可以將刷題當成積累實力,感覺就像武俠小說裡某小蝦米得到武林秘笈,閉關修練十年,出關後就能打遍天下無敵手一樣!

如果要從這個方向來思考刷題的話,那為什麼平時不選擇練習資料結構、演算法呢?有人會說,在太基礎、不夠實務、沒有具體目標的狀態下,難以理解那些資料結構、演算法的好。若是練習那些科技公司面試的題目,在解題的過程需要用到的一些資料結構、演算法,才會知道它們的重要性,也能針對題目的需求來調整資料結構、演算法的實作,如此做將更為務實。

這樣的說法是正確的!因為,刷題、資料結構、演算法之間,要彼此相互配合,然而,若是以這個方向在前進,倒是可以想想:求學經驗裡,有沒有買解答本的經驗,當時,你可能不是買來抄答案,只是看到題目時,會想直接看看怎麼解,嗯嗯……,懂了之後,隔天遇到考試,仍然寫不出來的經驗也是有吧!

這就是為什麼常看到,有人刷了一大堆題目,然後面對問題時,就算曾經看過也寫過,當場還是會解不出來,畢竟看到題目,就想看看用程式怎麼解,就我看來,跟抄答案沒兩樣。

既然是以培養實力為目標,那麼就來想想吧!面對一個全新問題時,你會怎麼瞭解、分析、解決?如果是以培養實力為目標,那麼,我們先別急看到題目就想看到解答,就算僅憑自己之力必須花上數日才能解出,這也是個可貴的經驗,接著想想自己的解法還能怎麼改善效能等問題。

有了這個過程,你就不會有遇到相同題目仍解不出來的困境,而且,後續翻開解答時,你才能更進一步吸收別人的經驗,作為下次遇上相同或類似題目時,可參考的解決方案之一。

有人可能會問,這樣解題不會太沒效率、太慢了嗎?一個月解不了幾題!嗯?你在急什麼?你不是要以培養實力為目標嗎?

系統化的解題!

我平常刷題嗎?我曾試著刷過一陣子Leetcode的題目,但很快失去興緻!然而,從我的〈常見程式演算〉裡可以看到,從2000年初以來,我就一直保持著刷題的習慣,而且還會用不同的語言刷相同的題目,因為不只是刷「解法」,還在於刷「不同的思考與描述方式」。

至今我還是保持這類習慣,只不過會自行尋找一些有趣的小題目,除了網路上看到的,也會尋找像是《Java於演算法與資料結構之實習應用》(絕版)、《經典電腦科學問題解析》,或是《Python小專案大集合》這類書籍,從書籍學習的好處是「系統化」!

若就面試時不被篩掉的目的而言,刷LeetCode可能真的比較有用,畢竟其中收集的就是各大科技公司的面試題目,然而,並不是刷LeetCode(或CodeWars)的題目才叫刷題,只要是覺得有趣、想解、會成為習慣去解的題目方向,都可以是刷題的來源。

會成為習慣去解的題目方向就是一種系統化,通常這意謂著會有難度的順序安排,可以從簡單到複雜,甚至刷著刷著、不斷積累之後,還會成為你特定領域的能力。

以我來說,這個特定領域,其實就是電腦圖學相關的各種題目。早期我曾收集了一些〈電腦圖學〉的題目,會看《Java 2D/3D繪圖程式設計實例應用》(絕版),後來會玩OpenSCAD、WebGL、p5.js,會從OpenProcessing找些有趣的圖形繪製,試著自行挑戰看看,這些也都是刷題。

事實上,這些題目並沒有固定解法,我也偶而會自創一些解法,當然我想做而解不出來的問題也還有很多,有時一個題目可能是幾個月,甚至一兩年後,才突然想到解法,有時相關的實作成了作品之一,有些則寫成文件、記錄下來,也有不少實作為程式庫的一部分。

像這樣試著讓刷題成為一種習慣、系統化的解題,久而久之,積累下來的東西會極為可觀,甚至直接成為你實力的象徵!

為什麼要刷題?

刷題這件事,可以是很實際的問題,也可以是很自我成長面向的問題,無論如何,先搞清楚目的很重要!當我們認知到面試的公司就是要考這些題目時,就別想太多,刷就對了,不用去質疑某某公司明明就不會用到卻愛考,那就是他們的制度!從小到大,我們學習了許多科目,出社會之後不也用不到,然而還是要考啊!

如果你要培養實力,那就試著自行解題吧!想不出來?你花了多久時間想呢?幾分鐘?幾個小時?還是幾天?如果真心投入思考,想不出來的這個過程其實很重要,因為投入的時間並不會白費,而且,很多人忽略了這件事!

如果想讓刷題這種事成為真正實力的象徵,我們可以試著以系統化的方式刷題,暫時沒有方向的話,就找本書開始著手吧!畢竟書有一定的系統化程度,若有幸找到方向,那麼,當刷題成為習慣,你就會樂此不疲地刷下去了!

專欄作者

熱門新聞

Advertisement