對菜鳥開發者的叮嚀:花一萬個小時練習 Coding,不要浪費一萬小時無謂地 Debugging

Coding 之於科技的重要性不言可喻,也不再是軟體工程師的專利,醫師、律師、會計師、護理師、金融從業人員,甚至是聽起來摸不著邊的政治家,不論是哪個行業,學習 Coding 已經成為世界新趨勢。

本文作者 Waseem Ahmad 為一個程式設計師,同時也是旅行家與終身學習者。以下文字以作者第一人稱撰寫。

一切都要歸功於 Code.org  與其他 Coding 自學網站,學生可以從網站學到學校沒教的電腦科學,這不僅激發了學生對 Coding 的興趣,也掀起一波學 Coding 熱潮。

當軟體工程師的需求遠遠大過供給時,毫無疑問的, 世界需要更多電腦科學專家。但是根據我個人經驗和 Reddit 裡面的評論,電腦科學相當的困難,流失率通常也很高 。我曾花了好一段時間和力氣,在萊斯大學上電腦科學的課程,比起其他的課要難許多。

我很早就對電腦萌生興趣,大學也毫不猶豫地主修電腦科學,從沒有後悔過。懷著強烈的興趣開始了編寫程式的課程,像是了解基本的資料架構、功能及程式迴圈等等,在學習的過程中我體認到電腦科學不等於寫程式,徹底的挑戰了我長久以來的信念。

接下來幾年的時光,我不斷地吸收更多更多的知識,向我的指導教授和導師學習,我上了很多電腦科學的課程,也擔任其中兩門課的教學助理。暑假時我做了關於無人飛行載具(UAV)的計畫,接下來的時間我在 Google 和 Facebook 實習。

在大四的時候,我擔任萊斯電腦科學社團的社長,後來有機會可以和數百個萊斯的學生深度對談,談論職涯與抱負的課題。我以宏觀的角度思考這所頂尖大學的電腦科學教育,體認到我有義務要寫這篇文章:如何成功的學習電腦科學這門學問。

  • 積沙成塔,一切從基礎開始

在萊斯的第一學期,我深刻地記得我舉了手,問了 Scott Rixner 教授一個問題:「為了迎合業界需求的新課程中,我們會學到什麼程式語言呢?」在教授回答我的問題前,教授閃過一絲惱火的神情,我馬上就明白了我完全搞錯重點了。

用時間一再地證明,他強調在電腦科學領域,一個好的教育應該是要教你怎麼思考,怎麼學習。一開始我拒絕接受他的想法,但當我和在工作的校友聊天中、在我面試的過程中,深刻的明白 原來最好的公司,不會在意你知道多少程式語言,最棒的工程師不會有「Java 專家」、「Ruby 開發者」這類的標籤

要如何為接收到的資訊建立模型、要怎麼以電腦運算進行的資料呈現出來?要怎麼抓住問題並用演算法來解決它們?當你以電腦計算的思維思考著,就能解決這些問題。

全世界的電腦科學部門,專注於理論與實務二者的比重不同,相較於學習更多程式語言與架構,可一再被套用的概念與抽象思考,對你的職涯會幫助更大,受惠更多。也就是說,時時保持好奇心和專注於最基礎也是最重要的事情上吧!思考是絕對少不了的。

  • 編碼就像它的第二個本質

以實務而言,寫程式是電腦科學中最主要的部份,它包含了寫指令來執行資料架構的基礎、邏輯、演算法和系統設計。雖然以基本要素為優先,但寫程式仍是相當重要的一環,特別是你想要成為一個軟體工程師,這不是靠著有一張電腦科學的文憑就可以辦的到的事。

在 Malcolm Gladwell 的書《Outlier》中,列舉了許多非常著名且相當成功的人為例子,這些佼佼者為了達到該領域的翹楚,投入約莫一萬個小時,也就是超過一年的時間。這個引起我興趣的故事,同時強調精通程度和運氣,當透過乏味無趣的卡片穿孔機,根據指示命令將它們放入主架構的電腦跑程式,卻找出一個錯誤,然後就得要重新跑一次,要獲得更多寫程式的實務經驗是件相當困難的事。

比爾蓋茲就很幸運,身為八年級生的他,能有機會接觸到計算機終端,並且能接觸到即時程式,1968 年的當時,電腦終端是相當新穎和稀少的。而當蓋茲一接觸到寫程式,他就深深的受到吸引,愛的無法自拔,為了要免費使用電腦來寫程式,他甚至在凌晨三點到六點,偷偷溜出家門跑到華盛頓大學。

1975 年,比爾蓋茲和保羅艾倫(美國發明家、投資家和慈善家,是 Microsoft 的創辦人之一)輟學了,利用 10,000 個小時,只專注做一件事情:不停地寫程式。

10,000 個小時都做同一件事情,你能想像嗎?從他們的例子,證明了一句話:專注與堅持,能成就不凡的未來。

10,000 個小時聽起來很嚇人,但是以另外一個例子來說-籃球員,和他的隊友們在球場上花了無數個小時;又或者是說,一個軟體工程師,以寫程式為志業,一整天都看著電腦,看著無數行從腦中誕生的程式碼,甚至回到家之後繼續為了開源計畫在做編程。一個人會愛上他們所做的事情,除了自身能力的培養外,特別是當這項工作是具有多樣性、挑戰性,從工作的過程中發現問題、解決問題,然後獲得更多經驗與成就感,對他們而言,這已經不是工作了,是興趣,是樂在其中的。

在開始工作之前,我花了兩個月在做以下兩件事情:其中一個月我投入全部的心力,來完成程式的專案;剩下的一個月,我和我的朋友在歐洲玩,整整一個月。寫程式和旅遊,對我來說都一樣地令我熱血沸騰!

你說有什麼捷徑可以獲得更多寫程式的經驗,或是變得更專精嗎?沒有,沒有捷徑,也沒有替代方案,只有花心思、花時間,你才能變成首屈一指的專家。

  • 是 10,000 個小時的練習、練習,再練習,不是 10,000 個小時的垂頭喪氣

透過作業打分數,以及和學生們談話,我看到花了 8 個小時所做出來的極佳作業,對比花了 30 個小時卻做的不怎麼樣的作業。

從這點可以看出, 時間長短不是重點

在寫程式中最令人沮喪的,就是偵測出問題但你卻找不到原因在哪。

我擔任 COMP446:Mobile Device Application(行動裝置應用)這門課的教學助理,我的朋友告訴我,他想要讓下載指示器可以在其中一個他所寫的 iOS Apps 中顯示,花了整整六個小時,我們一同找出所有可能的錯誤和問題,然後一一刪除,結果原因是,下載指示器的顯圖是白色的,但是顯示背景也是白色的,難怪看不出來,你能想像我朋友臉上的表情嗎?

我朋友花了長達 6 個小時的時間找錯誤,結果只不過是顏色的問題;我的學生花了 30 個小時,卻做不出一個好成果,這兩種情形,你能說是因為他們天生資質不足嗎?當然不是。

每個人都可能會發生這樣的狀況,重要的不是你花了多少時間,而是在不斷的找錯誤、在花心思反覆嘗試所有可能的這整個專注過程,總要經歷惱人的過程,才能避免犯下相同的錯誤,這才是最重要的。

當錯誤以不同樣態出現時,就很可能一錯再錯;但你該做的不只是治療這個錯誤症狀,因為誠如剛剛所說,它會以不同樣貌再出現,必須要找出其中的原因、專注於整個導致錯誤與一再嘗試的過程,過程是怎麼樣的,這很重要。

然而, 有的時候錯誤是來自於對手邊的任務缺乏透徹的了解。當你一股腦兒的栽進寫程式時,你不知道你真正的目的是什麼,這將會變成一場災難,功虧一簣

就拿我自身的例子來說好了,關於操作系統作業的第一份作業,我把 20 頁的講義反覆看了超過 3 遍,還寫了筆記,最終想出我覺得我應該做的點子;但是當我和我的經理開會時,他還花了半小時告訴我我該做什麼,因為其實說到底,我並沒有完全了解我應該要做什麼。

除此之外,千萬不要花太多的時間卡在一個問題上,尋求他人的幫助吧,不只是用另一雙眼-也就是一個全新的角度來看你的問題,還可以讓你知道你的指導員、助教、朋友、經理或是合夥人如何思考這個問題,如何解決它。不論它是理論的問題集、程式作業、或是你的實習任務,你會注意到在尋求幫助和獨立作業間的 Goldilocks Zone(又稱為適居帶),也就是取得了一個最佳的平衡。

你的經驗和努力求進步的過程會幫助你在這兩者-也就是在獨立完成和尋求幫助間找到一個權衡,並且隨著遇到不同的問題而調整。讓你解決問題更有方法,更有效率。

  • 親手創造,你能獲得更多屬於自己的體驗

在大學時期,大部分的令我印象深刻的 Coding 專案,是來自於自身興趣的多方嘗試-也就是所謂的 Side project(也就是目前工作不直接相關,主要為了興趣或好奇而執行的計畫方案)。

它與課程作業或是實習工作最大的不同點在於,在做這些感興趣的 Side project 的過程,沒有任何進度壓力與要求,擁有極大的自由度,讓我能夠盡情的發揮自己的想法。不論在創意的激發,或者是完成後的成就感,都大大地超過完成一般作業和工作任務。

在這四年間,最令我驕傲的 Side project,是開發出了一套名為 Rice Election 的網頁 App-用於校內各種意見的調查。目前這套系統已被多達 22 個校內組織,包含學生會,用於超過 130 個選舉及意見調查。開發這套系統,是我第一次開發具有實際用途 App 的經驗。

在過程中, 我不只學到了與寫程式相關的技能如資料庫建立,使用者經驗設計,甚至接觸到了與電腦科學本身無關,但卻在產品商業化中不可或缺的行銷及市場評估

對於一個主修電腦科學的大學生來說,像 Rice Election 這種大型的專案並非一蹴可幾的;但是透過逐漸累積經驗,Side Project 的複雜度也跟著增加。

拿我自身為例子,我的第一個 Side Project 是為了一個名為 Parade 的 Hackathon(駭客松,也就是編程馬拉松)所開發的詩文押韻產生器。當時這個 App 花了我和隊友 Dennis 整整 14 個小時,邊做邊學才完成的。然而經歷過這段嘔心瀝血的經驗;若是現在要寫出一個類似的 App,大概只需要不到一個小時。題外話一下,我強烈推薦參與 Hackathon 這樣的活動,真的非常的有趣!

同時, 這些 Side Project 的開發經驗,在未來的面試當中,不但能展現出對於 Coding 的熱情與專注,更能表現出結合獨立開發與現實生活需要的問題解決能力 ,擁有解決問題的能力,這很重要,也對於未來求職、工作的過程有相當大的幫助。除此之外,別小看 Side Project 的點子,未來可能隱藏有巨大的商業潛力,Mark Zuckerberg 一手創辦的 Facebook 就是一個很棒的例子!

  • 爭取每個你感興趣的機會

對於你有興趣而嘗試的機會,千萬不要猶豫,要花盡所有力氣去爭取;別漏掉生活中的每個環節,說不定都潛藏著機會,只是你沒有主動去尋求而已。

對某堂課中所提到的主題有興趣嗎?那可以詢問教授是否有相關的研究機會;利用暑假期間去實習,將所學到的理論面知識加以應用在實務面上,Google 和 Facebook 都有提供許多相關的機會。

像是 Google 和 Facebook 這樣全世界數一數二的頂尖公司,你會擔心,你會膽怯,就算你覺得你得到實習機會的機率根本微乎其微,還是要勇敢的寄出履歷表,也許它並不如你想像中的渺茫,很多時候,事情都還沒有一個定論,而我們卻先被內心的恐懼與不安嚇跑了。

在大學第二年的暑假,為了找到實習工作,我寄出了超過 30 份的申請,結果只有 3 家公司願意給我機會。非常幸運的是,其中一家就是 Google。為了準備第二三輪的技術面試,我花了好幾個禮拜的時間,看完《Cracking the Coding Interview》,來模擬面試的狀況。

如果在實習期間表現的不錯的話,很可能會得到下個暑假實習的機會,甚至是畢業後的工作機會。

然而,我並不建議你再次回到相同公司實習,特別是在不確定畢業後能得到工作機會的情況下。同時如果是在已經有經驗的情況下,申請其他公司的實習機會也會變得比較容易。由於實習大多為期約三個月,對大學生來說,這將是個能夠體驗及選擇之後工作內容及環境的好機會。

You won’t know what you’re missing out until you try !

對我來說,在 Google 的再次實習機會其實讓我猶豫了很久。當然,畢業後能到 Google 工作是我夢寐以求的夢想,而我怕若沒有接受這個再次實習的機會,全職工作的機會也將隨之消失。然而,我最後還是選擇了其他公司完成我大三暑假實習,很棒的是,我得到觀察職場的全新角度,這對我來說是個很棒的經驗,而且我畢業後,Google 還是給了我工作機會!

  • 不只是電腦科學領域,這是給大家的人生建議

別再和他人比較,而是與自己比較

當人開始不斷地和他人比較的時,很容易陷入複雜的情緒。

對那些從 11 歲就開始學程式設計的,和在大學前就贏了編程馬拉松的人來說,因為擁有深厚的底子,或是豐富的實務經驗,相較於同領域的其他人,他們容易瞧不起別人。然而,反觀那些費盡好一番功夫,試圖聽懂教授在講什麼的學生,當他們看到那些可以一直舉手回答教授問題的同學,會開始質疑自己,反覆的問自己「要怎樣才能變得跟他一樣好?」這種比較心態導致忌妒或是藐視,甚至會喪失自信心;而那些優秀的,會變得更自大,更不可一世。

與其想著別人有多好、多厲害,專注於自身的獨特點,思考什麼對你來說是重要的事情,設定目標,並且花心思找尋方法來一一達成,這才是最實際也最重要的。

比如說,不妨想想,現在的自己跟一年前的自己有什麼不同?看看成長了多少、進步了多少,一年後,你想成為怎樣的人?自覺,會漸漸地改變你,會更凸顯出你的個人特質,無形中讓你越來越好。

不要過度投入,要懂得取捨,以及了解自己的底線

如果喜歡的事情很多,反而要小心不要過度投入。大一時我一路順遂,然後變得非常有野心,我覺得自己很厲害,什麼都難不倒我,因此我抓住每個我所遇到的機會。

大二的第二學期,我選了一個普通的課程和其他三門非常花時間的課。其中一門是 COMP446: 行動裝置應用,其實我沒有修過它的先修課程,我也沒有寫過物件導向程式的經驗,同時我正在打工和當資訊工程大一的助教。

除此之外,我很瘋狂又熱血的參加了三個學生社團,成為所屬學院的學生會主席,參與網站設計,我把時間都花在上課和開會上,我從晚上八點開始工作但是到了凌晨三點就因為太累了而停止。從此之後,我開始失眠了,每天直到五六點才睡著,但是一到九點我便起床準備早上的課,日復一日,到了學期中,課程內容越來越深入,課外活動也不減反增,我簡直要崩潰了。

我參加了一個 Rice Wellness Center 所辦的聚會,和我的教授、研究助理,和朋友們聊聊,我找到了可以減輕壓力的方法,也就是放棄那些我快被當掉的課,以及把課外的事情做到最低限度,不再事必躬親,這段時間可說是我人生中的低潮,而嘗到苦頭的我,最大的收穫,就是真正學到處理事情的優先順序和對事情說不。

我的朋友 Veronica 寫了一篇文章-《別過度投入,以及做不值得做的工作-第二篇:建立履歷表》,真希望我早就讀過這篇文章了。

多交點朋友,以及找到歸屬感

朋友是一輩子的資產,也是支柱。

當你從大學畢業後,你不會想起你高分通過的考試,你會記得又珍惜的,是每段友誼和與朋友共處的時光。當你踏出舒適圈,並且極盡所能地交各種朋友,不管是系上的也好,或是系外的也好,當和朋友一起思考、一起解決很困難的問題時,你會感受到你並不孤單;朋友們會跟著你一起參加你原本不會參加活動,讓你變得更加的圓滑,獲得更多不一樣的快樂。

相信自己

這聽起來很俗套,但是,你如何對待自己,別人就會怎麼對待你,記得,你所走的路,是你的自信心帶著你,在前引領著你的,所以建立自信,是絕對重要的事情。你要明白你的優勢是什麼,以及你的獨到之處,當你達到某個目標時,就盡情地享受那份成就感與榮耀,謙遜地接受讚美,並且要以樂觀積極的心態,面對未來每個挑戰。

(資料來源:Medium;圖片來源:MediumMarjan Krebeljmuir.ceardach 、 girlgeek , CC Liscensed)

點關鍵字看更多相關文章: