上週發布的
刷題無法變強的原因短短幾天就成為了我在方格子上最熱門的文章,既然我們討論到了刷題跟面試的關聯性,不如再深入討論刷題這個行為本身,應該要注重怎樣的關鍵才能夠變強。
什麼是電腦科學
我們身為軟體工程師,平常最常接觸的就是電腦,要讓電腦有效地發揮作用演算法、資料結構這些在學習電腦科學過程中會學到的知識,就是重要的技能。
這也是
軟體工程師的素養點出的問題,成為一名軟體工程師已經變得非常容易入門,我自己也是把它當作興趣一樣在看待。然而這樣的狀態就很容易讓我們把「電腦科學」的重要性忘記。
即使知道電腦科學的重要,大多數人也只知道要學「演算法」「資料結構」卻不清楚為何而學,在我的經驗中成大教授
jserv 老師的線上公開課程經常會從硬體到軟體的關聯解釋,內容通常需要有點底子,有興趣可以挑戰看看。
善用科學思考
刷題的時候,我們應該思考的不是「如何回答」而是用科學的方式,根據情境、題目要求進行分析,最後再找出適合的演算法去解決這些問題,同時也可以反思自己是否缺少對某些知識的理解。
我在跟同事解釋演算法的時候經常會用 Ruby 的
Array#bsearch 方法來舉例,這是一個 Ruby 比較少人知道的方法,可以使用 Binary Search(二分搜尋法)演算法來查詢陣列內的資料。
如果對二分搜尋法有概念,會知道在「已排序」的狀況下速度會比正常狀況好很多。雖然會使用到的情況不常見,然而如果你對演算法跟 Ruby 語言都有一定的了解,很可能就可以在某個「效能瓶頸」透過替換 Array#find 為 Array#bsearch 而獲得不錯的效能改善。
下面附上簡單實驗的結果
# frozen_string_literal: true
require 'benchmark'
Point = Struct.new(:x, :y)
SAMPLE_DATA = [Point.new(1, 1), Point.new(2, 1), Point.new(2, 2), Point.new(1, 3)].freeze
Benchmark.bmbm do |x|
x.report(:bsearch) { 1000.times { SAMPLE_DATA.bsearch { |p| p.y == 2 } } }
x.report(:find) { 1000.times { SAMPLE_DATA.find { |p| p.y == 2 } } }
end
[elct9620] Desktop % ruby bsearch.rb
Rehearsal -------------------------------------------
bsearch 0.000280 0.000009 0.000289 ( 0.000305)
find 0.000664 0.000018 0.000682 ( 0.000682)
---------------------------------- total: 0.000971sec
user system total real
bsearch 0.000191 0.000002 0.000193 ( 0.000190)
find 0.000481 0.000002 0.000483 ( 0.000482)
可以看到 Array#bsearch 在「已排序」的狀況,表現會比 Array#find 好上不少。
能實際應用才算學會
從我的個人觀點來看,與其看到各種題目都能「馬上解出來」不如思考在真實專案的開發中,我們應該如何實際應用才是更有意義的。
如果沒辦法在工作中實際解決問題,那麼你只是一個「程式競賽選手」而不是一個優秀的專業人員,從刷題的成績、學歷這些角度來看大多是一間公司在無法判斷面試對象實力的「簡單參考」基準,如果你是一名在業界有一定實力跟知名度、同事跟主管都很願意幫你做 Reference Check(查核)的狀況下,真的需要刷題跟學歷嗎?
以我個人的求職經驗,我會提到「學歷」是因為我的興趣在多媒體上,所以我可以跟雇主分享我在程式技術跟遊戲上的看法跟觀點。至於這幾年面試人的經驗,看學歷也只是因為「名校學生在學習比較有技巧」這點,讀書是一種「學習技巧」這類人要教的話通常比較好教(個性是另外一回事)然而你的作品已經呈現了「我有實力」那麼會不會刷題、學歷好不好根本就不是參考的基準。