提高程式設計能力的關鍵(翻譯)

Moonshadow2333發表於2023-01-26

原文

The Key To Accelerating Your Coding Skills

前言

工作的這半年,表現一直不是很好,組長推薦了這篇文章給我。我覺得這篇文章確實不錯,所以想分享給大家。雖然別人已經翻譯過了這篇文章,但是自己還是翻譯了一遍,這樣映象會更深刻。如果英語還不錯,就儘量看英文原文吧。

另外,祝各位新年快樂。

作者

這篇文章的作者是 Firehose 的技術長兼聯合創始人—— Ken Mazaika。此前,他是 WHERE.com(被PayPal收購)的技術主管,也是波士頓PayPal/eBay開發團隊的成員。

Firehose 是國外的一家培訓機構,後文經常出現,在此說明一下。

正文

在你學程式設計的時候,有一瞬間一切都變得不同了。在 Firehose,我們習慣稱之為程式設計的拐點。這個階段之後,作為一個開發者,你操作的方式將會大相徑庭。(這句話翻譯的不太好,先保證連貫性,以後有時間再改)建立拐點是在程式設計的過程中變得獨立的過程,直到不需要他人手把手教的境地。這個過程可能會是一段糟糕的經歷,但是一旦你過了拐點,它是難以置信地鼓舞人心。

提高程式設計能力的關鍵(翻譯)

:藍色線條代表學習具體知識的曲線,紅色線條代表學習獨立解決問題的曲線,兩個線條相交的地方就是拐點。

Firehose,我們的目標不僅僅是教你 Ruby、如何構建 web 應用,或者如何編寫測試。雖然我們確實教你這些技能以及其他的內容,但是我們主要的目標是加速學生透過拐點,這樣他們就能獲得解決任何他們遇到的問題的能力。我們堅信,有能力獨自解決問題是一種寶貴的技能,並且這種教學的方式將會把你帶到更遠的地方而不是簡單地學習如何構建一大堆應用。

教程階段(3~8周)

當你剛開始學習程式設計的時候,有非常多你不知道的資訊。這些資訊被稱為特定領域的知識。例如:需要知道在 ruby 中如何實現迴圈,或者如何利用 Ruby on Rails 從資料庫中獲取資料。特定領域的知識是依賴於特定程式設計環境下的特殊約定。

成為獨立開發者的第一步是學會完成特定的任務。透過做特定的任務,將分散的知識點串起來,當你能夠精通該項任務的時候,就能形成特定的模式來解決類似的問題。一旦你精通了特定的任務,如何把碎片拼在一起的輪廓將會變得清晰起來。隨著不斷的練習,你會發現特定的的模式,並且一開始一些迷惑以及陌生的東西最終變得習以為常。

對於剛開始的學生,最需要獲取的技能是關注細節

當閱讀文件或者教程之類的材料時,注重細節是重要的。哪怕是最細微的錯別字或者拼寫錯誤,都會導致報錯或者出現 bug。一開始,看報錯是一段沮喪的經歷,但它卻是在學習過程中至關重要的一步。在這個階段,處理報錯和問題會教你最重要的程式設計技能之一:面向細節程式設計。

Debug 報錯是非常重要的。事實上,報錯是程式設計的一部分,它們呈現在菜鳥和大師的面前是一樣的,唯一的區別在於,經驗越多,根據報錯修復 bug 所花的時間就越少。原因如下:

  • 隨著不斷地練習,你將會快速地學習如何讀報錯並且獲取與問題有關的細節。一開始你看報錯的時候,理解這些報錯代表什麼含義會花一些時間。但是在看了成百上千條報錯後(是的,你將會看數百條的報錯),你將能夠定位問題所在以及確定解決問題所需的相關詳細資訊。

  • 起初,你可能每看到一個報錯都會向他人尋求幫助。隨著不斷地練習,你將會發現,仔細檢查自己的程式碼和用谷歌搜尋問題,可以降低向他人尋求幫助的頻率。

在教程階段,你將按部就班按照說明一步一步的做。起初,你會發現很難跟上教程的步伐並且報錯時常發生。隨著不斷地練習,你將會培養 debug 以及更加關注小細節的能力,並且進步會越來越來越快。在結束教程階段時,你會注意到能夠以更快的速度編寫程式碼。

在這個點上,有些人感到自信,體現在他們拋棄了之前的訓練方式,並在沒有系統化指導下開始著手構建一些東西,以及他們很樂意深入探索未知。其他一些學生則是尋找更多的教程,試圖從中獲取更多特定領域的知識,以達到“完全理解”的境地。不幸的是,教程只能把你帶到這裡,真正的信心來自於努力解決一個你沒有任何思緒的問題,並自己找到解決方案。

程式設計小秘密是

你永遠不會知道解決所有問題需要知道的一切。在程式設計的旅程中,你可能想象自己最終學會了你需要學習的一切並做好了開發的準備。然而,這一刻永遠不會發生。

程式設計需要終身學習。經驗豐富的軟體工程師努力尋求未解問題的解決方案,因為在這個過程中他們有機會學到更多。如果你發現自己在等待那一刻,你終於覺得你知道了關於編碼的一切,你必須清醒地認識到,你等待的這一天將永遠不會到來。不要沮喪,相反,這是一件美妙的事情。

提高程式設計能力的關鍵(翻譯)

準備好進入程式設計之旅下一階段的契機:

  • 你已經看了足夠多的報錯,並且這些報錯再也嚇不到你了。相反,你知道如何解碼他們代表什麼含義並且知道在程式碼中找到問題所在;

  • 你已經精通用谷歌搜尋解決方案。當你在新增一個功能或者看到了一個迷惑的報錯時,你知道該搜尋哪些關鍵字去找到你需要的資訊;

  • 你能夠重用你其他應用中的某些程式碼和模式,而不是每次都根據指導手冊一步一步操作。

拐點階段(保持良好的心態:2~4周)

拐點階段是學習程式設計諸多階段中最沮喪的階段之一,但是在某種意義上來說,它又是唯一重要的階段。拐點出現在當你逐漸停止使用教程,開始獨立解決問題的時候。

有時候,你會覺得你還沒有準備好應對這個階段,想回到用確切的大綱來構建東西的時候。不要成為這種心態的犧牲品。之所以有如此強的挫敗感,主要是因為:

在拐點階段,你的編碼速度是上一個階段的 1/20 到 1/10

你開始質疑自己,想知道自己能否成為一個程式設計師。沒有安全感、自我懷疑在這個階段非常普遍。

儘管你覺得學習和做完事情的速度慢了很多,但實際上,你在實現一些最重要的事情。當你在特定領域的知識足夠豐富的時候, 你正在學習的一切都是關於程式知識的。

程式知識是在程式設計路上教會自己未知東西的能力。當你需要實現新的功能時,你應該在谷歌搜尋哪些內容?此時此刻,當你有太多的東西想要完成的時候,你會感覺自己在黑暗中。學習如何靠自己在黑暗中找到光是至關重要的,因為你永遠不會知道一切,所以你需要有能力教會自己如何解決手頭上的問題。

大多數人不會意識到,為了學會程式設計,你需要學習特定領域的知識和程式知識。

在餘生中,每天都要嘗試走出自己的舒適圈

一些軟體工程師一旦立足後,就會留在他們的舒適圈中。這類程式設計師被稱為保守程式設計師——這不是你應該努力成為的。相反,你應該每天要努力突破自己的極限。程式設計師離職最常見的原因是因為“這份工作已經沒有挑戰性了,因為我已經解決了所有有意思的問題”。

你應當尋找超出當前能力範圍的問題,而不是在你的舒適區內程式設計。這也是組建和擴充你技能的唯一方法。

用一位正在經歷拐點的 Firehose 學員的話說:

我感覺我仍然在深淵。我只是更加坦然地接受這是我必須去的地方。

在網頁開發中,實際上有兩個一起出現的拐點

網頁開發拐點是當你能夠構建任何資料庫驅動的應用的點。這意味著有能力構建一個多頁面的應用。網頁開發者稱這為“精通 CRUD”。在這個階段,你應該也能夠透過 Github 上的文件或者部落格整合任何第三方庫。

演算法與資料結構拐點是更深層次的拐點,但是實際上它更重要。克服了這一點的人除了掌握程式設計的基礎知識並具有解決複雜編碼挑戰的深度知識外,還將掌握他們正在使用的程式語言。

征服了演算法和資料結構拐點的人將能夠:

  • 可以寫出排序演算法;

  • 實現翻轉連結串列;

  • 理解和可以利用棧、佇列、樹寫出程式;

  • 利用遞迴或者迭代的方式寫出程式。

總之,一旦你透過了這個拐點,你就會掌握資料操作,並將理解你的程式碼決策對效能的影響。傳統的電腦科學學位專注於讓學生透過演算法和資料結構拐點。許多大學使用業內通常不使用的程式語言來教授這一點,例如 SchemeRacketLISP

在大多數技術面試中,面試官會假設你已經透過了Web開發拐點,因為這更容易做到,並將他們的問題集中在評估你在演算法和資料結構方面的技能上。這些問題通常集中在我們上面提到的話題上:排序演算法、反轉連結串列以及使用堆疊、佇列和樹。

一旦開發者透過了網頁開發拐點和資料結構與演算法拐點,他們拿到了程式設計王國的鑰匙。

這些開發人員將能夠解決兩者相交的挑戰:需要在高階Web應用程式上下文中構建的複雜演算法。這是專業網頁開發者每天做的事情中的核心。

拐點的後果

當你第一次聽到拐點最大的後果的時候,可能會覺得有點反直覺。深呼吸:

當學習程式設計的時候,從長遠來看,特定領域的知識並不重要。

是的,我並不是在開玩笑,它真的一點都不重要。一旦你透過了拐點,這些概念在一兩週,甚至幾天的教程學習後,就可以自然而然的轉換。

真正重要的是:

  • 你已經牢牢掌握了一種網頁開發框架;

  • 你已牢牢掌握了用任何語言實現複雜的演算法。

招聘經理希望開發人員具有紮實的 Web 開發和演算法技能。

當我在 PayPal 工作的時候,我的團隊招聘了一個初級 Rails 開發者,他沒有沒有任何 Rails 開發經驗的經驗,但是他已經用 PythonLISPPerl 寫過很多程式碼。在幾天之內,他就造成了很大的影響。幾周之內,造成了巨大的影響。他很快就被提拔為技術團隊負責人,並且是我參與過的最好的招聘決定之一。

不要擔心技術棧。很多人會說,“AngularJS 這些天非常火熱”,“JavaScript 處於上升的趨勢”,或者“現在最流行的是……”我對此的反應是:“那又怎樣?”當你正在學習如何學習程式設計的時候,你唯一的目標應該是找到拐點並且透過它。一旦你這樣做了,學習新的、熱門的語言將根本不是一項艱鉅的任務。

變得獨立。在沒有任何指南的情況下,有能力學習新的程式設計技能意味著你不再需要等其他人的幫助。這意味著你需要學的大部分內容,你可以在網上查詢,並閱讀各種各樣的材料。

這並不意味著你立刻“知道”了一切,而是僅僅意味著選擇一切是“可解決的,”所以本質上,你是不可阻擋的。

在拐點階段,你會培養的技能

作為一個軟體開發者,最好的參考材料就是自己之前寫過的類似的程式碼。當真正理解了之前寫過的程式碼,回憶這些程式碼的細節就不需要花費太多的時間與精力。

當開發一個新功能的時候,需要問自己的第一個問題是:“之前有沒有開發過類似的東西”。

如果開發過,就去找到並逐行瀏覽這段程式碼。向自己解釋這是做什麼的,並問自己:“現在能否用相同的方法實現這個功能?”

影片並不是學習特定領域知識的好材料,因為需要大量的時間來觀看它們。假設你想整合谷歌地圖的 API,一旦你整合過一次,開啟 GitHub,複製貼上程式碼到新專案所花的時間可能不到一分鐘。另一方面,影片通常需要 10-30 分鐘才能重新觀看。

儘可能高效透過拐點的策略

因為在學習程式設計的過程中透過拐點是最重要的部分,所以你必須讓自己儘可能順利的越過這個階段。

這意味著你應該在教程階段就開始準備,並且在這段時間裡保持正確的心態。

在閱讀結構化材料的過程中暫停一下,給自己一些挑戰

  • 對於教程中的每一節,嘗試做一些教程範圍之外的事情。如果教程中提供了“挑戰”或者“自主的”內容,就把它們全部做完。解決沒有指導的挑戰將會給你重要的,在沒有指引的情況下做事情的經歷。

  • 嘗試儘可能地少使用教程。在 Firehose,我們經常引導學生了解如何整合某些 Gem 或使用提供的文件執行操作。對學生來說,他們主要根據程式文件操作,教學材料僅作為備查,而不是單純的依賴教學材料按部就班的學習。注意,文件會將閱讀者視為已經跨越了拐點的開發者。習慣閱讀和跟隨 Github 上的文件在你一個人的時候將會助你一臂之力。

  • 關注本質和重複練習。瞭解如何執行常見操作,例如從頭開始啟動應用程式、將新應用程式推送到 GitHubHeroku,以及儘早構建資料庫遷移。

衝過拐點可能會非常有挑戰性。以下是一些幫助你透過拐點的建議:

  • 認識到這是一個困難的過程並且不要給自己太大的壓力,設定合理的預期。不要把透過教程階段的“神級”速度同自己學習東西時的“蝸速”做比較。記住你在學習很多東西,但是在這個階段,你正在學習一種全新的、獨自解決新問題的技能。

  • 如果你的自信若有如無,認識到你的感受是完全正常的,並繼續前進。如果你還是在苦苦掙扎,就去嘗試跟最近透過拐點的人溝通。他們有能力站在你的位置上並向你保證你現在所經歷的只是暫時的。持續學習,但是不要過度。在這個階段,認識到你一天最多六個小時可以保持高效學習的狀態。在極度疲憊的狀態下工作只會延長構建拐點的時間。

在這個階段獲得信心的最好方式是克服你的任何疑慮。你的情緒可能像坐雲霄飛車。有時,你會覺得鬥志滿滿,但是在同一個問題上苦苦掙扎了 15 個小時後,感覺相反是很常見的。

不知道某件事是否需要 5 分鐘或 5 小時可能會令人沮喪,但每次你完成併成功實現新功能時,這種成功後的喜悅所帶來的自信將是你所需要的一切。在沒有任何幫助的情況下解決了一些難題後,你會沉迷於在舒適區之外建造東西的感覺。

如何知道已經透過了拐點

拐點過程的最後階段是接受。接受軟體開發是一個持續不斷學習的過程。接受你已經成功學會一切的感覺僅僅意味著你應該開始考慮解決更復雜的問題。

參考

The Key To Accelerating Your Coding Skills 中文翻譯

打通程式設計的任督二脈【The Key To Accelerating Your Coding Skills】

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章