[譯] 提高編程能力的祕訣

原文:The Key To Accelerating Your Coding Skills

譯文地址

TL;DR

作者把學習編程分爲 2 個階段,第一個階段是輔導階段,這個階段有 2 個重點:

  • 通過教程學習具體的技能,如在 Vue 中如何響應按鈕的點擊事件
  • 仔細查看錯誤信息,調試程序。因爲一個小小的拼寫錯誤也會導致程序出錯,所以得格外注重細節。

這個階段的祕訣是注重細節,以及從每一個錯誤/難題中學習,當解決一個難題後,想下難在哪裏、原因是什麼、怎麼避免。

第二個階段是拐點階段,這個階段是學會獨自編程、獨自解決問題的過程。在軟件開發中,永遠都學不完所有你需要知道的知識,總是存在你沒遇到過的問題。我們得拆分問題,然後正確地搜索和提問(提問的智慧)。

此時的祕訣是儘早獨自解決問題,拆分問題,將問題拆分到自己能執行的地步爲止。

作者認爲 Web 開發需要 2 樣能力:

  • Web 開發能力,能基於數據庫開發任何你遇到的應用。其中應該包含:數據庫技能(設計表、查詢)、一門服務端語言、前端技能(JS、HTML 和 CSS)。

  • 算法和數據結構能力,有這個能力的開發者可以寫出邏輯較複雜的代碼。

以下是原文。


當你學習編程時,會有一個時刻一切開始改變。在 Firehose,我們喜歡稱這時刻爲編程的拐點(inflection point)。經過這個階段,你作爲開發者的工作方式將大不相同。爬到拐點是在編程上變得獨立(self-sufficient)的過程,達到拐點後你不再需要別人手把手教你完成功能。它是一個艱難的過程,但是一旦你經歷了,會讓你很有信心。

在 Firehose,我們的目標不僅僅是教你 Ruby,怎麼構建 Web 應用或者怎麼寫測試。雖然我們的確教這些技能,但是我們的主要目標是讓學生更快通過拐點,讓他們有能力解決遇到的任何問題。我們認爲能獨自解決問題是很寶貴的技能。這種教學方法相比單純地教如何構建應用,可以讓你走的更遠。

輔導階段(Tutorail Phase)(認真編程 3 - 8 周)

當你開始學習編程,你有許多還不瞭解的信息。這些信息叫領域特定知識(domain-specific knowledge),例如:怎麼用 ruby 寫循環語句、怎麼使用 Rails 從數據庫提取記錄。

成爲一名獨立(self-sufficient)的開發者第一步是學會怎麼執行一個具體的任務。當你掌握幾個方法後,就逐漸知道這些碎片是如何拼到一起,以完成功能。經過一段時間,你將開始理解,一開始令你困惑的東西最終會變得自然起來。

對於剛起步的學生,要獲得的最重要的技能是關注細節

在閱讀文檔或教程時,關注細節十分重要。即使是最小的拼寫錯誤也會導致錯誤。一開始看錯誤信息是一個艱難的過程,但它在學習過程是一個至關重要的步驟。在這階段中處理錯誤信息和問題會教你一個編程中最重要的技能:注重細節。

排除故障十分重要。事實上,錯誤信息是編程的一部分:缺乏經驗和非常有經驗的開發者都會遇到。唯一的不同點是,處理錯誤信息的經驗越多,修復它們所需的時間就越少。因爲:

  • 經過一段時間,你將學會如何閱讀錯誤信息和快速提取問題的相關細節。你第一次看到一個錯誤信息,會花你一些時間瞭解它到底是什麼意思。但當你遇到幾百次錯誤信息後(你還會再遇到無數錯誤),你將能定位發生問題的地方,找到修復它們所需要的相關細節。

  • 你應該從你解決的每一個錯誤中學習。不要修復完就算了,理解代碼到底有什麼問題。從每一次錯誤學習,下次你犯了同樣的錯,你將會更快的修復它。

  • 一開始,你每次遇到錯誤都會請求幫忙。慢慢地,你會仔細檢查代碼和去 Google 搜索,慢慢減少求助頻率。

在輔導階段,你會跟隨教導。一開始,你覺得跟隨教導指令有難度,經常出現錯誤。慢慢地,你將學會調試錯誤,更注重細節,並且你會學得越來越快。當你通過輔導階段,你會注意到你能以更快速度的寫代碼。

在這時,一些人會感到有信心,他們準備拋棄指導,可以不依靠指示開始構建東西了,並開心地投入身心進去。一些學生會尋找更多教程,嘗試獲得更多領域特定知識,以尋求“完全理解”。不幸的是,教程只能帶你到這裏,真正的自信不是在教程裏找到的。真正的自信來自與一個你不知道怎麼解決的問題糾纏,並且自己發現解決辦法。

編程骯髒的小祕密是...

你永遠不會知道解決你所有的問題所需要的所有知識。編程時一個終生學習的過程。經驗豐富的軟件工程師尋找他們沒遇到過的問題的解決方案,因爲這是他們學習的機會。如果你發現自己在等待這樣一個時刻——你終於覺得你知道了關於編程的所有知識,告訴你:你永遠等不到這一天,但這是一件美妙的事情。

當你達到以下狀態,你將進入下一個階段:

  • 你已經遇到足夠的錯誤,不再害怕遇到它們。而且,你知道如何弄懂它們表示什麼和哪段代碼出了問題。

  • 熟練地使用 Google 尋找解決方法。當你編寫一個功能時或者遇到一個讓你困惑的錯誤時,你知道搜索什麼來找到你需要的信息。

  • 你可以參考你項目中已經寫過的代碼,跟隨這些模板來增加功能,而不是總是尋找手把手的教導。

拐點階段(The Inflection Point)(2 - 4 周)

這個階段是學習編程中最容易讓人氣餒的階段,某些方面來講,這是唯一重要的階段。在這個階段你漸漸不使用教程,獨自解決問題,沒人告訴你解決方法。

某些時候,你會覺得你還沒準備好應對這個階段,想回去編寫那些有詳細解決步驟的項目。不要被這種心態影響了,你覺得難受的原因是:

在拐點階段期間,相比前一個階段,你的編程速度要慢 10 - 20 倍。

你開始懷疑自己是否有能力成爲一名程序員。在這個階段,沒有信心和懷疑自己是很常見的。

儘管你覺得自己以慢地多的速度學習和完成事情,但實際上你正在習得最重要的技能。當你領域特定知識(domain-specific knowledge)學得足夠了(學完最小必要知識),你接下來學的一切都是有關程序性知識的(procedural knowledge)(指關於“如何做”的知識)。

程序性知識是教會自己你不知道的東西的能力。當你需要實現一個新功能,你要怎麼搜索?當你需要實現許多東西時,你會覺得很無助。學會如何獨自找到出路很重要,因爲你永遠不會知道所有要知道的東西,你必須有能力教會自己如何解決手頭上的問題。

很多人沒意識到,學習編程,你得學習領域特定知識以及程序性知識。

接下來,每天挑戰自己的極限

有些軟件工程師一旦找到了穩定的崗位,就停在舒適圈。這些程序員被稱爲維護程序員(maintenance programmers)。這不是你的努力的目標。相反,你應該每天都挑戰自己的極限。程序員跳槽的最常見原因是:這份工作已經不再有挑戰性了,因爲我已經解決了所有有趣的問題,

你應該尋找超出你目前技術棧的問題,而不是一直編寫在你舒適圈內的項目。這是積累和擴展你技能的唯一方法。

在 Web 開發,有 2 個拐點會彙集到一起

Web 開發拐點是你有能力寫任何數據庫驅動的應用的拐點。這意味着你能構建一個 Web 應用,它有多個從數據庫存取信息的頁面。Web 開發者稱這個爲:熟練掌握 CRUD。在這個階段,你應該可以跟着文檔或者文章集成任何第三方庫。

算法和數據結構拐點是一個不那麼明顯的拐點,但它實際上更重要。除了掌握了編程的基礎和擁有解決複雜編程問題的知識外,克服這個拐點的同學應該已經掌握了他正在使用的語言。

攻克算法和數據結構拐點的人可以:

  • 編寫排序算法

  • 實現和倒置鏈表

  • 理解棧、隊列和樹以及在程序中利用它們

  • 使用遞歸和循環解決問題

總之,一旦你經過這個拐點,你將掌握數據操作和理解你代碼的性能。傳統的計算機科學學位專注於讓學生通過算法和數據結構拐點。許多大學用行業上通常不使用的語言來教這些內容,如 Scheme, Racket, LISP。

大多數技術面試,面試官會當做你已經通過了 Web 開發拐點,因爲它相對容易,然後將問題集中在評估你在算法和數據結構上的能力。這些問題一般集中在我們上面提到的話題:排序算法、倒置鏈表和使用棧、隊列以及樹。

一旦程序員通過了 Web 開發拐點和算法、數據結構拐點,他們就掌握了關鍵技能(hold the keys to the kingdom)

這些程序員有能力解決兩者相交的挑戰:在高級 Web 應用中構建複雜算法。這是資深 Web 開發每天做的事情。

拐點的結果(Consequences of the Inflection Point)

當你第一次聽到拐點最大的結果時,會覺得有點反直覺:

學編程時,領域特定知識在宏觀(the grand scheme)上並不重要。

是的,我沒有在開玩笑,它真的一點都不重要。一旦你經過了拐點,學習那些概念(領域特定知識)只需一週或者 2 篇教程,甚至只要幾天。

最重要的是:

  • 你熟悉 Web 開發

原文是:You have a solid grasp on a web development framework,但是前面又說領域特定知識在宏觀上不重要,但一個 Web 框架不應該是作者所指的特定知識嗎?所以我覺得應該是指 Web 開發

  • 你可以熟練地使用任何編程語言寫複雜的算法代碼

人事主管想招的是有紮實 Web 開發和算法技能的開發者

當我在 PayPal 工作時,我們團隊招了一個沒有 Rails 開發經驗的高級 Rails 開發者,他使用 Python,LISP 和 Perl 寫過很多代碼。在幾天內,他已經起了很大作用,在幾周內,更多的作用。他很快成爲技術團隊的組長,這是我參與過最好的招聘決定。

不要擔心技術棧。很多人這樣說:“現在 AngularJS 最火”,“JS 正在崛起”或者“最新的潮流是...”。我的回答是:“那有怎樣?”當你學習編程,你唯一的目標應該是找到拐點並擊敗它。一旦你做到了,學習新的潮流技術一點也不難。

變得獨立(Become self-reliant)。有能力不依靠完整的指導學習新的技術,意味這你不再需要等別人來教你。大多數你想學的東西,你只需在網上搜索,閱讀關於各種各樣你想知道的東西的材料。

這不意味這你馬上知道了所有東西,只是所有東西都是可以解決的、可以執行的了(figure-out-able)。你可以說是不可阻擋的了。

在拐點你會學到的技能

作爲一名軟件開發者,最好的參考材料是你寫過的相似代碼。當你完全理解了你寫的代碼,你不需要記住所有細節。當你寫一個新功能時,你應該問自己的第一個問題是:“我有寫過相同的功能嗎?”。如果是,重新打開代碼,一行一行的看,跟自己解釋它在做什麼,問自己:“我現在可以用同樣的方法嗎?”

視頻很難解釋領域特定知識的細節,因爲視頻得花很多時間來看。比如你想集成 Google 地圖 API,如果你集成過,不用花一分鐘就可以打開代碼,複製代碼,將它粘貼到新項目。而重新看視頻得花 10 - 30 分鐘。

高效通過拐點的策略

因爲通過拐點是學習編程最重要的一部分,你應該讓自己精力充沛,讓這個過程儘可能順利。這意味這你在輔導階段時就應該開始準備,並且在這過程中保持良好的心態。

在輔導階段期間,不依賴完整的教程,讓自己挑戰問題。

  • 每一節課程,嘗試做一些超出教程範圍的東西。如果你正在閱讀的教程提供了課後練習,請全部做完。解決沒有指導的問題將給你很重要的獨自解決問題的經驗。

  • 儘可能少的使用教程。在 Firehost,我們經常詳細地向學員講解如何使用文檔集成第三方庫或者做某事,而不是簡單地跟着教程中的指令,這些教程是提供給剛剛起步的同學的。許多學生將跟着文檔學習,將教程作爲備選材料。請注意,文檔會把你當成已通過拐點的開發者。習慣於閱讀和跟着 GitHub 上的文檔進行開發,對你獨自開發時將很有幫助。

  • 關注重要的事並且重複練習。學會怎麼做常見的任務,比如從零開始快速啓動一個項目、將一個新應用推送到 GitHub 和 Heroku、儘早地執行數據庫遷移。

通過拐點很難,這裏有一些忠告幫助你通過它:

  • 認識到這是一個艱難的過程,讓自己放鬆,樹立合理的預期。你不能拿輔導階段的超人速度和自學階段的蝸牛速度對比。請記住,你正在學習很多東西,你在學習一個新的技能——獨自解決問題。

  • 如果你覺得沒自信,你得知道,這是非常正常的感覺。繼續前進,如果你還在掙扎中,嘗試與剛通過拐點的同學交流,他們能感受到你現在的處境,並且向你保證你正在經歷的只是暫時的。不斷學習,但是不要過度。在這個階段,你最多隻能每天學習 6 小時。在筋疲力盡的狀態下學習只會延長你花在拐點的時間。

這個階段獲得自信的最好辦法是解決你的疑問,你的情緒會像坐過山車那樣,有時,你覺得很焦急,但經過 15 小時的解決過程,有相反的感受是很常見的。

如果某個問題花了你 5 分鐘或者 5 小時後還沒有頭緒,這會讓人很心煩。但每次解決它並且成功實現一個新功能,會讓你感覺自己很牛。在沒有幫助下解決許多難題後,你會沉迷於構建超出你舒適區的東西的感覺。

怎麼知道你何時通過了拐點

拐點的最後階段是接受(The final stage of the inflection point process is acceptance)。接受軟件開發是一個不斷學習的過程。接受你已經學會了一切的感覺只意味着你應該開始考慮解決更復雜的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章