2021 新年新希望

大家 2021 新年快樂!

新年新氣象,我也為自己訂了一個目標,就是要「刻意練習」演算法。

演算法一直都是我的罩門,偏偏演算法就是程式設計的核心,我不是不會演算法,畢竟演算法我先後都修了兩次 (台大資工的資料結構與演算法與交大資工所的演算法,概念我是懂得,就是一直沒去落實熟練他。舉個例子,當初為了考大學,高中數學我們都要背到滾瓜爛熟,看到題目要直接能套公式,忘記公式要能當場推演,那時候我們對數學就是得心應手,而我希望我能使用輕易演算法就像當初準備大學考試一般。

雖然我心中一直有種抗拒,想著反正我大概都知道原理,忘了大不了查一查,只是這樣真的有點礙手礙腳。我認為熟悉演算法的原理和操作絕對對平常寫程式很有幫助,總不能老是在解決問題的時候都要先想個老半天,想是想出來了,但這工程師的效率也太差了。

甚至不只是演算法,身為資訊工程師、程式設計師、電腦科學家或不管哪種職稱,對資工隨時保持高的掌握度我一直覺得很重要,像是處理浮點數要知道 IEEE 754 規則是甚麼,Relational Database Normal Forms 是甚麼,這些都是我覺得要記在腦中不能忘的,只是很遺憾,我目前都沒做到,大致上都是我知道有這玩意,但總不能當別人問起,你卻跟別人說「嘿!我知道這玩意,但我忘記細節了,等我查查後告訴你」,我覺得這樣有愧自己的專業,我還沒見過一個我欽佩的專家會做出這種回應。

總之有個遠大的願景,但要先從簡單的開始落實,所以先至少對演算法有十足的掌握度,就是今年的首要目標。

說到演算法,大四的時候面試一家區塊鏈公司,對方要我直接寫 Quick Sort,然後我卡了半天才終於寫出來,其實就是不夠「熟」所以都要想很久,那時候我明明已經知道自己弱點就是不熟演算法,不過卻一直沒去面對。

半個月前,華碩 AI 研發中心來交大演講,我覺得挺有趣的,就順手投了暑假實習,因為我對 AI 中的系統軟體與硬體設計滿感興趣的,不過因為我打算碩三去交換,今年本來就沒打算要找工作,決定投履歷算是滿臨時的決定,所以事前沒有練習演算法題目,算是賭賭看的心態,結果昨天面試也是慘兮兮,被問了 Binary Search Tree,不但定義回答錯 (演算法到底怎拿到 A+??),實作演算法也卡了半天。

心裡真的百感交集,我一年前明明寫過的東西,怎麼現在突然要寫卻腦袋當機,有點像是高中數學我現在都不會算了,演算法久了沒碰真的直接退化到想不起來。這下我真的該痛定思痛了,首先演算法本來就是我萬萬不能忘記的東西,他代表我的專業,再來就是如果今天突然想投個面試,但事先時間練習刷題,這面試鐵定 GG。(這就讓我想到 jserv 無聊都會刷 leetcode,沒看到 PR 100 還會睡不著覺 XD)

華碩面試主管還很好心,說面試對談中認為我在專業領域表現不錯,語重心長希望我白板題要認真準備,說可以等我準備好的時候再去繼續面試。唉!連我自己都覺得超丟臉。是的我了解,我這次必須讓演算法牢牢記在我腦中,隨時要用或被考都可以問答如流,所以接下來就是講新年新希望的落實方式。

《刻意練習》是一本書的名字,這本書大意就是人的潛力無窮,強迫自己練習超過自己能力一點的訓練,會不斷把自己能耐往上提高。舉例來說,練習長跑可能最開始只能跑 5 公里,但是每天故意把長度增加 200 公尺,雖然已經超過自己平常的極限,但憑著意志力咬牙撐過,就可以提高自己的極限,如此反覆鍛鍊,雖然每天都強迫自己突破極限很痛苦,但久了就會有可觀的成效,某天可能就發現輕鬆跑個 20 公里都不累。

這篇心得文章把《刻意練習》這本書的重點都講完了,我覺得看這個心得就可以了,原本的書講了一堆沒必要的例子,還不如這篇的心得簡單俐落把重點都列出來。而要說重點中的重點,其實就是每天都想辦法超過自己的極限多一點。

所以具體刻意練習的方法如下:

  1. 每週選定一個基本演算法
  2. 複習觀念與練習實作
  3. 因為我最熟練的語言是 C++ 與 JS,必須這兩個語言都可以有效率的撰寫。比方說可以在 15 分鐘內(其實第一次大概一小時都嫌短)正確地用 C++ 把 Quick Sort 寫出來。(這種最困難的地方是不能犯小錯,邊界沒訂好可能就要除錯很久)
  4. 先是練習裸寫,再搭配題目練習,例如 LeetCode 或 POJ。
  5. 因為不能忘,所以沒事要抽考自己,而且要在限制時間內寫出來,每次挑戰花更少時間。例如原本要十五分鐘,慢慢進步到十分鐘可以寫出來,直到變成反射動作。
  6. 挑戰題,順便把寫 Code 的過程做成教學影片,練習能邊有條理解釋在幹嘛,同時正確地把程式寫出來。(順便有效率產出新片?)

總之先試試看吧!看看一年 52 週我能夠撐幾週!XD

大家的 2021 新年新希望是甚麼?歡迎留言告訴我。