其實沒想過我有機會在軟體版發個文
畢竟大學是商科畢業的
但因緣際會 走上了第1001個電腦科學的路
背景什麼的在留學版也有分享過就不贅述
寫在前面 這篇是主要給轉專業
或是基礎不甚扎實的人一些建議
主要談的是很多人口中不恥的 “刷”Leetcode
首先我很感謝Leetcode 不是因為它讓我進了不錯的公司
而是他幫我一步一步地領進
從 “了解問題”到“設計程式結構”
最後利用演算法與資料結構來實現一個問題的解法
事情都有兩面 端看自己怎麼想
有人覺得刷題對提升能力沒幫助 只是照本宣科 公司還這樣考根本亂搞
但我覺得我的收穫可以完全從另一面來解讀
條列這半年寫Leetcode的收穫
如果你要笑我連這些都不知道 怎麼念電腦科學
我只能說 誰沒有學習的過程?
我晚了兩年不代表我不能學 也不代表我以後不會變厲害
1. 看到一個問題我開始思考要用手上的什麼演算法與資料結構來解
這件事情跟工作我想是一樣的
工作有目標 無論是解蟲 或是產品設計 或是改善某種效能
都是利用已知的知識 加上手邊人家寫好的Lib 最後實作並達到解決問題
這個流程跟寫Leetcode如出一徹 只是他把題目的範圍減小的
變成一個相對簡單但基本核心概念一樣的過程
2. 寫出簡短易懂解不重複有架構的程式碼
因為短時間時間的壓力
很多時候我開始理解到與其一見到題目 有了最粗淺的想法以後
直接開始寫程式碼 後來因為沒有好好的重複利用
導致原本30行可以解決的硬是被我寫到了50行
(如果變成大型程式 3000 -> 5000不是鬧著玩的)
不如靜下心 把心裡面的想法通通整理成可各自調用的區塊
然後一步步一步實現
這樣好找問題 以後也較簡單修改
3. 擁有改進效能、可讀性、多方面思考的直覺
很多時候題目一下就可以想出一個可行的解法
但很多時候內心就開始挑戰自己 或是有個直覺就開始說
“這個感覺就有更好更快的解法”
“用這種方法感覺能解 但另外一種應該也能 好處分別是... ...”
當開始出現這種感覺的時候 就往前踏了一步
不滿足於現在的效能 或想要用更好的方式解決問題
這不是大家心目中“好工程師”該具備的能力嗎?
同時也讓自己在看解答以前 多思考多想
我的確有曾經寫過比第一名投票還容易懂 然後行數更少 並且擁有同樣效能的碼
如果我直接看答案 我就寫不出來了
4. 閱讀理解別人程式碼的習慣
看別人的碼 理解別人的邏輯不簡單
擁抱開源更不簡單
但是在參考別人解答的時候 就默默無形訓練了這種習慣與能力
同時也會知道自己的程式在哪裡該加註解 命名怎麼命最容易懂
哪裡不要用太過於簡短的簡寫 才方便閱讀
5. 正確無誤的寫出20 - 30 行程式碼
因為要求的緣故
我們常常無法寫到一半看寫得對不對 所以會要求一次寫成功
這種訓練讓我在現在Project的實作上
程式碼的出錯率小了很多
不太會忘了宣告、加分號 或結構混亂 導致出一些很蠢的錯誤
這樣對以後寫大型開發程式的時候 效率有絕對的幫助
6. 實作的能力 與自信
很多時候有 有想法不代表能夠寫出來
而這也的確是我曾經最害怕的一塊
我不知道怎麼實作我的想法
但是寫題目寫久了
開始慢慢發現自己的思考已經往確定實作的方向想的時候
就開始累積自信
知道自己一定實作的出來 只是要花時間想與學
這種自信與能力 無論對哪個產業我相信都是滿好與滿重要的
(機械設計我相信也是這種概念)
目前大概是這幾點的收穫
花了我大約半年的時間
我只能說 寫Leetcode的確是對轉專業的我擁有極大的收穫與幫助
我也不覺得自己是只會寫題目而不會解決問題
畢竟我所有寫的過程 都是在解問題 而非背答案
寫在後面
很多人覺得大家都一窩蜂了轉來電腦科學是追求熱潮
認為好好刷題就可以進到大公司的策略根本扭曲了電腦科學的本質
甚至覺得很多人只會刷題根本不會利用手邊的工具解決碰到的難題
轉專業就是比本科差
我想講的是
很多時候不是我們笨 而是我們待的時間不夠久 導致很多東西沒經驗
系統、結構、網路、IO這些東西都不會
但學無止盡 只要願意一步一步走下去
十年後 我們也跟大學畢業六年的本科生寫程式的時間一樣久
只要付出足夠的努力
我們也不會比本科畢業的差到哪裡去
人都不是笨 願不願意學與花時間而已