要認識程式語言最簡單的方式就是從程式解題(也就是大家所謂的刷題)開始,這邊我就來介紹幾個不錯的管道。

Codewars

這個平台上的題目都是大家自己上傳的題目結合自己寫的TDD當作測試資料,從超簡單到爆難的題目都有,但是這點是這裡的題目比較貼近生活化上的應用,有些題目甚至也是在職場上遇到覺得可以應用在題目上,而放上去的。
主要優點:

  1. 推薦題目功能
  2. 解答討論區
  3. 題目較平民化
  4. 結合TDD

但是要注意的是,題目幾乎不會跟你講輸入輸出該長什麼樣子,事實上這正是我們平常職場上需要的情境,很多平台雖然有提供你輸入輸出會長什麼樣子,但是現實生活有很多問題並非如此,因此對有人些來說,是缺點也是優點。

Leetcode

雖然我不太打上面的題目,不過我這邊推薦他們最近的活動,從4/1開始
30-Day LeetCoding Challenge
防疫別出門了,在家打程式吧!

Google’s Coding Competitions

  1. code jam

    • 每一年都會在上半年舉辦的活動,活動是淘汰制的,從資格賽到final。以前本來只能在本地上傳程式,現在也可以在線上coding了,是一個蠻推薦的程式解題平台。
  2. kick start

    • 這個的活動方式不一定的地方是,他是把活動分為好幾個梯次,通常是一個月一場,你可以把它想像是國際版的CPE,有辦法解出1, 2題,大概就能贏5~7成的人了。

Codeforces

這是一個俄羅斯的程式解題平台,有時候會舉辦有獎品的活動,蠻適合解題獵人關注的,同時也支援很多語言解題。

計蒜客

這個是對岸的平台,也是出題量出了多的有名,平常就會有很多場可以解,但是對岸的平台很多都是局限於C++, Java,這點就沒那麼彈性。

Hackerrank

有些公司面試會用這個平台寄給candicate測驗,好像在國外也會有人資用來獵人。但是值得注意的是,裡面有些程式語言解題很容易超時,例如:Java,有些題目光是Input的時間就沒了。

解題的必要

為什麼需要刷題?其實每個人心中的答案都不一樣,但是我規劃出幾點:

  1. 保持程式手感
  2. 學習新語言

如果你很想上手一個程式語言,但是連最基本的變數怎麼宣告都不知道的話,那刷題絕對是你的首選。

刷題的迷思

  1. 是否有幫助?
    想當初之前參加研討會的時候,大家在聊天室上面互相戰(討論O)程式解題到底實用性大不大,我認為這個問題要細部去探討才有價值,概括而論是沒有意義的。
    就像你問刷題對找工作有用嗎?某方面來說有用,另一方面來說是沒用的。
    如果你問刷題對學程式有幫助嗎?當然是有用的,打程式的手感也會影響,但是程式更進階的應用或框架,可不是靠刷題才能辦到的。
    但是就我目前所經歷的生態圈來看,在職場的生產力來說,有在刷題的人,做專案的學習速度通常是比沒在刷題的人快很多的。
    因此養成刷題習慣,也是有他的好處在。

  2. 會難的題目才厲害?
    這點要打一個大問號,會很難的題目不代表程式就真的所向無敵,大象也是會怕老鼠的。
    有一個算蠻有名的ACM-ICPC模擬題叫打坦克,程式碼寫起來長到嚇死人,但是裡面有用到很難的演算法嗎?並沒有。那為什麼會被歸類在難題?因為模擬題要預先設想各種情境,因此是一個麻煩題,而不是難題,但通常這種題目不太會有人做,因此被歸類在難題。
    而且難的演算法,不一定是你以後職場上會用到的,這要看你的工作性質。
    儘管前端工程師也會用到BFS, DFS來挖資料,也不太會用到Graph,反而會用Tree or Trie來實現資料結構。
    事實上很多應用情境都是簡單的東西累積成難的專案,因此如果你能掌握大部分簡單的技巧,就能解決大部分的應用情境。
    通常難的技巧,都是基於效能考量上才會用到的,以應用層面來說,簡單的技能就足夠了。

小節

還有很多什麼高中生解題系統, Uva…… 我就不說了,這邊只介紹一些方便的解題平台。
有興趣的話,可以多去爬爬看,或許你也能找到更多有趣的平台跟大家分享。
如果你有認識的同學也對刷題有興趣,也許可以一起參加比賽之類的,這樣提升程式能力的效果可以大大提升。