在這幾年裡面,「刷題」這件事成了顯學。當你上網去問問題的時候,總有一群人不斷強調著刷題這件事。
該怎麼找到好工作?刷題。怎麼進 FAANG?刷題。怎麼讓薪水更高?刷題。
這邊的刷題通常指的就是去知名網站 leetcode 上面寫題目,寫越多題代表越厲害,練到一定數量的題目以後就可以在面試中得到較好的成效,因為題目你很有可能都看過了。
雖然我個人不是很喜歡刷題的「刷」這個字(純粹個人喜好問題),但我其實不反對刷題。
在《程式解題新手入門注意事項》一文中我是這樣說的:
=====
其實我一直不是很喜歡「刷題」這個詞,主要是因為「刷」這個字。不知道大家對這個字的解讀是什麼,但我會認為有種「為了寫題目而寫題目」的感覺,就好像題海戰術那樣。雖然說題海戰術用得好的話成效滿顯著的,但總感覺很多人刷到最後會變成「看過的題目就會,沒看過的就一定不會」,如果是這樣子的話,那我覺得不是一件好事。
之前我有寫了一篇文章:當我們在學程式時,要學的到底是什麼?,稍微談了一下這件事情。
總之呢,比起刷題這個詞,我更喜歡用「程式解題」四個字來表達我想表達的意思。
有很多人剛開始練習程式解題的時候,是從演算法與資料結構開始的。可能去找了一些書或是線上課程來看,接著從經典的開始,例如說泡沫排序、選擇排序、插入排序,再來是困難一些的合併排序以及快速排序等等。但我覺得對真正的初學者來說,學這些還太早了。
======
如果你刷題刷得很快樂,覺得沒碰到什麼障礙,而且程式能力的確有提升,那當然可以開開心心繼續刷題。但我知道有些人一定不是這樣。
有些人光是 leetcode easy 的題目就可以想好久還解不出來,看了解答發現好像沒那麼難,但是等到自己要重新實作時又是一頭霧水。看了別人的解法覺得別人 code 寫得好漂亮,怎麼一兩行就可以解出來了,自己卻寫了十幾行。解的題目慢慢變多,但卻沒有覺得自己變強了。
總覺得,哪些地方好像怪怪的,好像缺了點什麼。
我覺得你缺的不是刷題,不是那些資料結構與演算法,而是基礎,是程式思維。對於完全初學者或者是比較沒有程式概念的新手來說,我覺得去 leetcode 刷題是本末倒置的事。我最常講的一句話就是:「你如果連九九乘法表都寫不出來,跟別人刷什麼題」
如果順序安排得好,可以幫助你在程式解題這條路上走得更穩固而且開心,底下是我個人認為合理的順序:
- 打好程式基礎
- 學習資料結構與演算法
- 去 leetcode 練習題目
而這堂課所著重的就是「1. 打好程式基礎」,而且只著重在這一點。
這堂課在教什麼?
教那些我認為被忽略掉的,新手應該要學、要練習的程式基礎。包括但不限於:
- 充當人體編譯器,以電腦的思維模式去看程式碼
- 在寫程式碼以前,先把解法用白話文或是虛擬碼寫出來
- 仔細觀察題目內容以及輸入範圍
- 熟悉迴圈、判斷式、函式以及其他程式基礎語法的使用
- 實作內建函式增加對語法熟悉度
- 練習大量程式基礎題,直到你覺得這些題目超簡單為止
這堂課一共有九個單元,從每個單元的標題就可以大概知道在講什麼:
- Unit0:課程簡介
- Unit1:要學好程式,從不要寫程式開始
- Unit2:寫程式之前,先學會「看程式」
- Unit3:寫程式前的最後一步:看懂題目
- Unit4:主角總是最後才登場:寫程式囉
- Unit5:經典題目解解看
- Unit6:內建函式做做看
- Unit7:國中題目大挑戰
- Unit8:初學者只管拿分,誰管你什麼效率
- Unit9:未來的路還很漫長,你還差得遠呢
課程主要使用的程式語言為 JavaScript,但其實大多數地方都是在講程式概念以及程式思維,跟程式語言本身無關,因此就算你完全不會 JavaScript 但是會其他程式語言,還是可以修這門課。
而課程搭配的 OJ 系統支援:C/C++/Python/Java/JavaScript 這五種程式語言。
什麼人適合這堂課?
- 有學過程式的人,知道基礎語法(宣告變數、判斷式、迴圈以及函式)
- 剛學程式沒有很久,想增進程式基礎的人
- 寫 leetcode 寫得非常挫折,覺得超級難的人
- 寫不出九九乘法表的人
- 覺得「程度測驗」的題目很難的人
那什麼人不適合這堂課?
- 完全不會寫程式的人
- 寫 leetcode 覺得沒什麼問題的人
- 修過資料結構與演算法,大部分都聽得懂的人
- 覺得「程度測驗」的題目很簡單的人
是的,為了讓大家更方便檢驗自己到底需不需要修這堂課,我提供了一個簡單的程度測驗。
先介紹一下 Lidemy OJ(簡稱 LIOJ),是我用青島大學開源出來的 OJ 稍微改造一下之後架出來的,是特地為了搭配這個課程而建立的系統。程度測驗題目一共有五題,你不需要寫出程式碼,只需要用看的就可以了。
通過標準為:覺得這五題都很簡單。
如果你完全不知道什麼是 OJ,或者是覺得這五題不簡單,那就很適合這門課。
為什麼想開這門課?
因為我覺得這是一堂,滿多人都想不到可能會有人需要的課,所以沒有看到太多類似的課程。
為什麼呢?因為對許多跟我一樣比較有程式思維的人來說,有些東西太直覺了,太簡單了。比如說我這個課程裡面提到的題目,以及在 LIOJ 上面出現的題目還有上面的程度測驗,在我剛學程式沒多久的時候,就覺得很簡單了。而這些題目的程度大概也是大學資工系第一堂程式語言的課期中考以前的範圍。
所以對很多人來說,這些題目幾乎天生就是水題,寫起來像吃飯喝水一樣簡單的題目。
但後來經過一段時間的教學以後,我發現一件事情,那就是寫應用程式不一定會鍛鍊到這一塊,而且也鮮少有課程專門在練習這一塊!當我知道我有學生寫的出來我認為相對複雜的留言板或是其他程式,卻寫不出來九九乘法表或是判斷質數的時候,我的內心是震驚的。
因為我以為這兩個是相通的,你會 A 就會 B。
可是事實證明不是,這兩塊是分開的。你可以寫出一堆好玩的應用,但卻不知道九九乘法表該怎麼寫。
有人會問說:這重要嗎?
當在你工作上碰到比較複雜一點的商業邏輯時就顯得很重要了。我這課程可不是什麼造火箭的課程,在程式解題的領域中,這堂課可能就跟學習怎麼打字一樣,是最基礎最基礎的一塊,這也是為什麼這一塊如此重要。
有些人天生就比較有這一塊的基礎,上手很快,所以覺得這沒什麼。但我親眼看見也有另外一群人,比較缺乏這一塊的理解,因此在一些地方碰了壁。
所以這堂課就是為了這些初學者,希望能夠從頭開始練習,慢慢去培養這些程式思維,並且藉著程式解題去鍛鍊程式能力。
上課方式
這堂課一共有九個單元,第零個單元是課程介紹,所有的課程影片都已經錄好了。
而每個單元都會有一個 Project,就是作業的意思啦。
在課程影片裡面會有兩到三個實戰,可以讓你跟著實戰一起做一遍題目,也可以在看完影片之後重新複習確認自己有理解。而 Project 的目的就是為了讓你練習,才能知道自己是不是真的有吸收進去。
每一個 Project 都會有一些題目,而這些題目都會搭配作業檢討影片,在影片裡面我會示範我自己的解法。請務必在觀看作業檢討影片之前自己先努力嘗試過,真的解不出來才來參考影片,才能得到最佳的學習成效。
所以這堂課的學習順序就是:
- 看課程影片 - 教學部份
- 看課程影片 - 實戰部分
- 寫作業練習
- 看課程影片 - 作業檢討
最後再強調一點,這堂課是完全免費的。為什麼是免費的?因為我期望這堂課可以成為一堂初學者必修的課,就跟之前我把 Hahow 上的課程下架時所講的一樣:
作為一堂基礎課程,就代表無論你修哪一個程式語言,你都可以在這邊找到有用的參考資料。我希望這樣子的課程是免費的,是可以公開給大家的,而我也確信這樣可以幫到更多的學生。
祝大家學習愉快!
如果對這堂課的製作流程有興趣,可以參考:《先別急著寫 leetcode》線上課程製作全記錄
學習相關資源:
你的老師
寫過一點後端也寫過前端,還寫了一堆你應該看過卻不知道作者是我的技術文章,致力於推廣淺顯易懂的程式教學。在新加坡工作過兩年半,是專職的前端工程師。一直都對教學有很大的熱忱,相信把話講得清楚又明白是一種專業,相信分享與交流可以讓世界更美好。
我不喜歡把自己講的很厲害,也不喜歡用學經歷說明什麼——我都用作品說話。
底下是我寫過的幾篇文章:
1. 零基礎的小明要如何成為前端工程師?
2. 成為前端工程師的四週年回顧
3. 從拉麵店的販賣機理解什麼是 API
4. 紮實的網頁前端學習路線與資源推薦
5. 當我們在學程式時,要學的到底是什麼?
我在自己的 blog以及 Medium 上面,常常發表許多心得,也曾經免費提供程式教學,希望能幫助那些剛踏入程式界的初心者們。 如果你想更了解我,可以參考:自學、哲學、講學:我的程式之路以及一個工程師的履歷進化史。
在嘗試過許多教學方法之後,終於決定自己跳下來開一個為初學者而生的線上程式課程平台。
課程
-
預覽Unit1 大綱
-
預覽Unit1.1:What the funk,都說了先不要 (5:55)
-
預覽Unit1.2:時間一天一天一天的走,程式碼一行一行一行的跑 (6:47)
-
預覽Unit1.3:如何撰寫 pseudo code? (2:58)
-
預覽Unit1.4:實戰練習:印出 1-100 的奇數 (3:21)
-
預覽Unit1.5:實戰練習:fizz buzz (3:39)
-
預覽Unit1.6:實戰練習:找最小值 (5:22)
-
預覽Unit1.7:Project1 介紹 (1:02)
-
Start作業檢討:Project1 字串反轉 (3:18)
-
Start作業檢討:Project1 陣列總和 (2:24)
-
Start作業檢討:Project1 找最大值 (1:37)
-
預覽Unit2 大綱
-
預覽Unit2.1:你其實看不懂程式碼 (8:04)
-
預覽Unit2.2:人體編譯器 (5:48)
-
預覽Unit2.3:Debug 神器:Debugger (8:55)
-
預覽Unit2.4:Log 雖可恥但有用 (7:59)
-
預覽Unit2.5:實戰練習:找次大值 (5:41)
-
預覽Unit2.6:實戰練習:字串轉大寫 (9:38)
-
預覽Unit2.7:實戰練習:刪除特定字元 (2:29)
-
預覽Unit2.8:Project2 介紹 (5:56)
-
預覽作業檢討:Project2 找次小值 (2:46)
-
預覽作業檢討:Project2 大小寫互換 (7:06)
-
預覽作業檢討:Project2 印出因數 (3:41)