透過刷題變強的方法

更新於 發佈於 閱讀時間約 4 分鐘
上週發布的刷題無法變強的原因短短幾天就成為了我在方格子上最熱門的文章,既然我們討論到了刷題跟面試的關聯性,不如再深入討論刷題這個行為本身,應該要注重怎樣的關鍵才能夠變強。

什麼是電腦科學

我們身為軟體工程師,平常最常接觸的就是電腦,要讓電腦有效地發揮作用演算法、資料結構這些在學習電腦科學過程中會學到的知識,就是重要的技能。
這也是軟體工程師的素養點出的問題,成為一名軟體工程師已經變得非常容易入門,我自己也是把它當作興趣一樣在看待。然而這樣的狀態就很容易讓我們把「電腦科學」的重要性忘記。
即使知道電腦科學的重要,大多數人也只知道要學「演算法」「資料結構」卻不清楚為何而學,在我的經驗中成大教授 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(查核)的狀況下,真的需要刷題跟學歷嗎?
以我個人的求職經驗,我會提到「學歷」是因為我的興趣在多媒體上,所以我可以跟雇主分享我在程式技術跟遊戲上的看法跟觀點。至於這幾年面試人的經驗,看學歷也只是因為「名校學生在學習比較有技巧」這點,讀書是一種「學習技巧」這類人要教的話通常比較好教(個性是另外一回事)然而你的作品已經呈現了「我有實力」那麼會不會刷題、學歷好不好根本就不是參考的基準。

封面圖片使用 UnsplashGreen Chameleon 的作品,有想聽的主題可以透過匿名問卷告訴我,想了解專業的技術主題可以到弦而時習之找找靈感。
為什麼會看到廣告
avatar-img
55會員
40內容數
軟體工程師逐漸變成一個熱門的職業,當我們進入這個職業之後應該要具備怎樣的技能才會在工作上更加順利呢?這系列的專欄會分享日常工作中的經驗以及一些案例分析,讓我們一起努力成為一位更優秀的軟體工程師吧!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
蒼時弦也的沙龍 的其他內容
很多公司面試確實會去考這些題目,並不是為了知道你是否會解題,更多的是想知道你怎麼思考。在工作中,當我們遇到各種不同類型的問題時,是否能夠根據自身的知識、經驗去探索出最佳的解決方案,大多是面試工程師所看重的一環。
既然是例外,就表示出現了我們預期以外的事情,就這點而言這個用詞跟翻譯都非常的精確。假設我們認為這段程式執行的時後不應該出現這個情況,那麼它就必須是一個例外。
簡單來說,寫程式最困難的地方往往不是技術上的問題,而是如何對當下的狀況正確判斷並且建立良好協作的狀態,才會是最為困難的地方。
聽了描述之後我的直覺反應告訴他「會有這樣的問題,應該是設計時少考慮了什麼!」 大多數軟體工程師從初學者階段開始進入到能夠獨立工作的時候,大多會需要自己考慮一個功能的設計,直到一個完整的系統設計。然而,我們總是找不到正確答案。
「什麼時候會有訂飲料系統呢?」從加入五倍紅寶石軟體開發到現在已經過了五年,每次都會有人提出來,接下來就不了了之。我們是一間九成以上都是工程師的公司,理論上像這樣的系統不應該那麼困難才對,為什麼就是沒辦法做出來呢?
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
很多公司面試確實會去考這些題目,並不是為了知道你是否會解題,更多的是想知道你怎麼思考。在工作中,當我們遇到各種不同類型的問題時,是否能夠根據自身的知識、經驗去探索出最佳的解決方案,大多是面試工程師所看重的一環。
既然是例外,就表示出現了我們預期以外的事情,就這點而言這個用詞跟翻譯都非常的精確。假設我們認為這段程式執行的時後不應該出現這個情況,那麼它就必須是一個例外。
簡單來說,寫程式最困難的地方往往不是技術上的問題,而是如何對當下的狀況正確判斷並且建立良好協作的狀態,才會是最為困難的地方。
聽了描述之後我的直覺反應告訴他「會有這樣的問題,應該是設計時少考慮了什麼!」 大多數軟體工程師從初學者階段開始進入到能夠獨立工作的時候,大多會需要自己考慮一個功能的設計,直到一個完整的系統設計。然而,我們總是找不到正確答案。
「什麼時候會有訂飲料系統呢?」從加入五倍紅寶石軟體開發到現在已經過了五年,每次都會有人提出來,接下來就不了了之。我們是一間九成以上都是工程師的公司,理論上像這樣的系統不應該那麼困難才對,為什麼就是沒辦法做出來呢?
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
反省就是重寫自己的演算法吧? 假設我就是人工智慧,或心智的可以被看作爲人工智慧的編輯器,那我的程式碼是什麼樣的? 從懵懂無知到一無所知,從自以為是到自我消逝,心智只是執行它的內容,我也需要不斷優化。 最好的優化就是簡化。 最能創造財富的演算法就是關於如何除錯與減少任何風險。
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
【提升國文成績:有效的閱讀理解與解題技巧】   對於國文成績的提升,幾乎所有人的看法都是長時間的累積和建立語感,我完全不否認這是個有效的論點,但是我個人會想要把事情分成兩個部分:其一是個人能力的累積,我稱之為資料庫的建立。另一是解題方法的使用。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
無論是現在、過去還是未來,學習如何學習都是終身受用的技能。迭代和進步是軟體工程師的追求。文章提出學習程式的四大關鍵:實踐、輸出、整理、思考,並期望讀者能在選擇的路上一路前行。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
反省就是重寫自己的演算法吧? 假設我就是人工智慧,或心智的可以被看作爲人工智慧的編輯器,那我的程式碼是什麼樣的? 從懵懂無知到一無所知,從自以為是到自我消逝,心智只是執行它的內容,我也需要不斷優化。 最好的優化就是簡化。 最能創造財富的演算法就是關於如何除錯與減少任何風險。
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
【提升國文成績:有效的閱讀理解與解題技巧】   對於國文成績的提升,幾乎所有人的看法都是長時間的累積和建立語感,我完全不否認這是個有效的論點,但是我個人會想要把事情分成兩個部分:其一是個人能力的累積,我稱之為資料庫的建立。另一是解題方法的使用。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
無論是現在、過去還是未來,學習如何學習都是終身受用的技能。迭代和進步是軟體工程師的追求。文章提出學習程式的四大關鍵:實踐、輸出、整理、思考,並期望讀者能在選擇的路上一路前行。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。