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

原文:The Key To Accelerating Your Coding Skills

譯文地址

TL;DR

作者把學(xué)習(xí)編程分為 2 個(gè)階段,第一個(gè)階段是輔導(dǎo)階段,這個(gè)階段有 2 個(gè)重點(diǎn):

  • 通過教程學(xué)習(xí)具體的技能,如在 Vue 中如何響應(yīng)按鈕的點(diǎn)擊事件
  • 仔細(xì)查看錯(cuò)誤信息,調(diào)試程序。因?yàn)橐粋€(gè)小小的拼寫錯(cuò)誤也會(huì)導(dǎo)致程序出錯(cuò),所以得格外注重細(xì)節(jié)。

這個(gè)階段的秘訣是注重細(xì)節(jié),以及從每一個(gè)錯(cuò)誤/難題中學(xué)習(xí),當(dāng)解決一個(gè)難題后,想下難在哪里、原因是什么、怎么避免。

第二個(gè)階段是拐點(diǎn)階段,這個(gè)階段是學(xué)會(huì)獨(dú)自編程、獨(dú)自解決問題的過程。在軟件開發(fā)中,永遠(yuǎn)都學(xué)不完所有你需要知道的知識(shí),總是存在你沒遇到過的問題。我們得拆分問題,然后正確地搜索和提問(提問的智慧)。

此時(shí)的秘訣是盡早獨(dú)自解決問題,拆分問題,將問題拆分到自己能執(zhí)行的地步為止。

作者認(rèn)為 Web 開發(fā)需要 2 樣能力:

  • Web 開發(fā)能力,能基于數(shù)據(jù)庫開發(fā)任何你遇到的應(yīng)用。其中應(yīng)該包含:數(shù)據(jù)庫技能(設(shè)計(jì)表、查詢)、一門服務(wù)端語言、前端技能(JS、HTML 和 CSS)。

  • 算法和數(shù)據(jù)結(jié)構(gòu)能力,有這個(gè)能力的開發(fā)者可以寫出邏輯較復(fù)雜的代碼。

以下是原文。


當(dāng)你學(xué)習(xí)編程時(shí),會(huì)有一個(gè)時(shí)刻一切開始改變。在 Firehose,我們喜歡稱這時(shí)刻為編程的拐點(diǎn)(inflection point)。經(jīng)過這個(gè)階段,你作為開發(fā)者的工作方式將大不相同。爬到拐點(diǎn)是在編程上變得獨(dú)立(self-sufficient)的過程,達(dá)到拐點(diǎn)后你不再需要?jiǎng)e人手把手教你完成功能。它是一個(gè)艱難的過程,但是一旦你經(jīng)歷了,會(huì)讓你很有信心。

在 Firehose,我們的目標(biāo)不僅僅是教你 Ruby,怎么構(gòu)建 Web 應(yīng)用或者怎么寫測(cè)試。雖然我們的確教這些技能,但是我們的主要目標(biāo)是讓學(xué)生更快通過拐點(diǎn),讓他們有能力解決遇到的任何問題。我們認(rèn)為能獨(dú)自解決問題是很寶貴的技能。這種教學(xué)方法相比單純地教如何構(gòu)建應(yīng)用,可以讓你走的更遠(yuǎn)。

輔導(dǎo)階段(Tutorail Phase)(認(rèn)真編程 3 - 8 周)

當(dāng)你開始學(xué)習(xí)編程,你有許多還不了解的信息。這些信息叫領(lǐng)域特定知識(shí)(domain-specific knowledge),例如:怎么用 ruby 寫循環(huán)語句、怎么使用 Rails 從數(shù)據(jù)庫提取記錄。

成為一名獨(dú)立(self-sufficient)的開發(fā)者第一步是學(xué)會(huì)怎么執(zhí)行一個(gè)具體的任務(wù)。當(dāng)你掌握幾個(gè)方法后,就逐漸知道這些碎片是如何拼到一起,以完成功能。經(jīng)過一段時(shí)間,你將開始理解,一開始令你困惑的東西最終會(huì)變得自然起來。

對(duì)于剛起步的學(xué)生,要獲得的最重要的技能是關(guān)注細(xì)節(jié)

在閱讀文檔或教程時(shí),關(guān)注細(xì)節(jié)十分重要。即使是最小的拼寫錯(cuò)誤也會(huì)導(dǎo)致錯(cuò)誤。一開始看錯(cuò)誤信息是一個(gè)艱難的過程,但它在學(xué)習(xí)過程是一個(gè)至關(guān)重要的步驟。在這階段中處理錯(cuò)誤信息和問題會(huì)教你一個(gè)編程中最重要的技能:注重細(xì)節(jié)。

排除故障十分重要。事實(shí)上,錯(cuò)誤信息是編程的一部分:缺乏經(jīng)驗(yàn)和非常有經(jīng)驗(yàn)的開發(fā)者都會(huì)遇到。唯一的不同點(diǎn)是,處理錯(cuò)誤信息的經(jīng)驗(yàn)越多,修復(fù)它們所需的時(shí)間就越少。因?yàn)椋?/p>

  • 經(jīng)過一段時(shí)間,你將學(xué)會(huì)如何閱讀錯(cuò)誤信息和快速提取問題的相關(guān)細(xì)節(jié)。你第一次看到一個(gè)錯(cuò)誤信息,會(huì)花你一些時(shí)間了解它到底是什么意思。但當(dāng)你遇到幾百次錯(cuò)誤信息后(你還會(huì)再遇到無數(shù)錯(cuò)誤),你將能定位發(fā)生問題的地方,找到修復(fù)它們所需要的相關(guān)細(xì)節(jié)。

  • 你應(yīng)該從你解決的每一個(gè)錯(cuò)誤中學(xué)習(xí)。不要修復(fù)完就算了,理解代碼到底有什么問題。從每一次錯(cuò)誤學(xué)習(xí),下次你犯了同樣的錯(cuò),你將會(huì)更快的修復(fù)它。

  • 一開始,你每次遇到錯(cuò)誤都會(huì)請(qǐng)求幫忙。慢慢地,你會(huì)仔細(xì)檢查代碼和去 Google 搜索,慢慢減少求助頻率。

在輔導(dǎo)階段,你會(huì)跟隨教導(dǎo)。一開始,你覺得跟隨教導(dǎo)指令有難度,經(jīng)常出現(xiàn)錯(cuò)誤。慢慢地,你將學(xué)會(huì)調(diào)試錯(cuò)誤,更注重細(xì)節(jié),并且你會(huì)學(xué)得越來越快。當(dāng)你通過輔導(dǎo)階段,你會(huì)注意到你能以更快速度的寫代碼。

在這時(shí),一些人會(huì)感到有信心,他們準(zhǔn)備拋棄指導(dǎo),可以不依靠指示開始構(gòu)建東西了,并開心地投入身心進(jìn)去。一些學(xué)生會(huì)尋找更多教程,嘗試獲得更多領(lǐng)域特定知識(shí),以尋求“完全理解”。不幸的是,教程只能帶你到這里,真正的自信不是在教程里找到的。真正的自信來自與一個(gè)你不知道怎么解決的問題糾纏,并且自己發(fā)現(xiàn)解決辦法。

編程骯臟的小秘密是...

你永遠(yuǎn)不會(huì)知道解決你所有的問題所需要的所有知識(shí)。編程時(shí)一個(gè)終生學(xué)習(xí)的過程。經(jīng)驗(yàn)豐富的軟件工程師尋找他們沒遇到過的問題的解決方案,因?yàn)檫@是他們學(xué)習(xí)的機(jī)會(huì)。如果你發(fā)現(xiàn)自己在等待這樣一個(gè)時(shí)刻——你終于覺得你知道了關(guān)于編程的所有知識(shí),告訴你:你永遠(yuǎn)等不到這一天,但這是一件美妙的事情。

當(dāng)你達(dá)到以下狀態(tài),你將進(jìn)入下一個(gè)階段:

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

  • 熟練地使用 Google 尋找解決方法。當(dāng)你編寫一個(gè)功能時(shí)或者遇到一個(gè)讓你困惑的錯(cuò)誤時(shí),你知道搜索什么來找到你需要的信息。

  • 你可以參考你項(xiàng)目中已經(jīng)寫過的代碼,跟隨這些模板來增加功能,而不是總是尋找手把手的教導(dǎo)。

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

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

某些時(shí)候,你會(huì)覺得你還沒準(zhǔn)備好應(yīng)對(duì)這個(gè)階段,想回去編寫那些有詳細(xì)解決步驟的項(xiàng)目。不要被這種心態(tài)影響了,你覺得難受的原因是:

在拐點(diǎn)階段期間,相比前一個(gè)階段,你的編程速度要慢 10 - 20 倍。

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

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

程序性知識(shí)是教會(huì)自己你不知道的東西的能力。當(dāng)你需要實(shí)現(xiàn)一個(gè)新功能,你要怎么搜索?當(dāng)你需要實(shí)現(xiàn)許多東西時(shí),你會(huì)覺得很無助。學(xué)會(huì)如何獨(dú)自找到出路很重要,因?yàn)槟阌肋h(yuǎn)不會(huì)知道所有要知道的東西,你必須有能力教會(huì)自己如何解決手頭上的問題。

很多人沒意識(shí)到,學(xué)習(xí)編程,你得學(xué)習(xí)領(lǐng)域特定知識(shí)以及程序性知識(shí)。

接下來,每天挑戰(zhàn)自己的極限

有些軟件工程師一旦找到了穩(wěn)定的崗位,就停在舒適圈。這些程序員被稱為維護(hù)程序員(maintenance programmers)。這不是你的努力的目標(biāo)。相反,你應(yīng)該每天都挑戰(zhàn)自己的極限。程序員跳槽的最常見原因是:這份工作已經(jīng)不再有挑戰(zhàn)性了,因?yàn)槲乙呀?jīng)解決了所有有趣的問題,

你應(yīng)該尋找超出你目前技術(shù)棧的問題,而不是一直編寫在你舒適圈內(nèi)的項(xiàng)目。這是積累和擴(kuò)展你技能的唯一方法。

在 Web 開發(fā),有 2 個(gè)拐點(diǎn)會(huì)匯集到一起

Web 開發(fā)拐點(diǎn)是你有能力寫任何數(shù)據(jù)庫驅(qū)動(dòng)的應(yīng)用的拐點(diǎn)。這意味著你能構(gòu)建一個(gè) Web 應(yīng)用,它有多個(gè)從數(shù)據(jù)庫存取信息的頁面。Web 開發(fā)者稱這個(gè)為:熟練掌握 CRUD。在這個(gè)階段,你應(yīng)該可以跟著文檔或者文章集成任何第三方庫。

算法和數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)是一個(gè)不那么明顯的拐點(diǎn),但它實(shí)際上更重要。除了掌握了編程的基礎(chǔ)和擁有解決復(fù)雜編程問題的知識(shí)外,克服這個(gè)拐點(diǎn)的同學(xué)應(yīng)該已經(jīng)掌握了他正在使用的語言。

攻克算法和數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)的人可以:

  • 編寫排序算法

  • 實(shí)現(xiàn)和倒置鏈表

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

  • 使用遞歸和循環(huán)解決問題

總之,一旦你經(jīng)過這個(gè)拐點(diǎn),你將掌握數(shù)據(jù)操作和理解你代碼的性能。傳統(tǒng)的計(jì)算機(jī)科學(xué)學(xué)位專注于讓學(xué)生通過算法和數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)。許多大學(xué)用行業(yè)上通常不使用的語言來教這些內(nèi)容,如 Scheme, Racket, LISP。

大多數(shù)技術(shù)面試,面試官會(huì)當(dāng)做你已經(jīng)通過了 Web 開發(fā)拐點(diǎn),因?yàn)樗鄬?duì)容易,然后將問題集中在評(píng)估你在算法和數(shù)據(jù)結(jié)構(gòu)上的能力。這些問題一般集中在我們上面提到的話題:排序算法、倒置鏈表和使用棧、隊(duì)列以及樹。

一旦程序員通過了 Web 開發(fā)拐點(diǎn)和算法、數(shù)據(jù)結(jié)構(gòu)拐點(diǎn),他們就掌握了關(guān)鍵技能(hold the keys to the kingdom)

這些程序員有能力解決兩者相交的挑戰(zhàn):在高級(jí) Web 應(yīng)用中構(gòu)建復(fù)雜算法。這是資深 Web 開發(fā)每天做的事情。

拐點(diǎn)的結(jié)果(Consequences of the Inflection Point)

當(dāng)你第一次聽到拐點(diǎn)最大的結(jié)果時(shí),會(huì)覺得有點(diǎn)反直覺:

學(xué)編程時(shí),領(lǐng)域特定知識(shí)在宏觀(the grand scheme)上并不重要。

是的,我沒有在開玩笑,它真的一點(diǎn)都不重要。一旦你經(jīng)過了拐點(diǎn),學(xué)習(xí)那些概念(領(lǐng)域特定知識(shí))只需一周或者 2 篇教程,甚至只要幾天。

最重要的是:

  • 你熟悉 Web 開發(fā)

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

  • 你可以熟練地使用任何編程語言寫復(fù)雜的算法代碼

人事主管想招的是有扎實(shí) Web 開發(fā)和算法技能的開發(fā)者

當(dāng)我在 PayPal 工作時(shí),我們團(tuán)隊(duì)招了一個(gè)沒有 Rails 開發(fā)經(jīng)驗(yàn)的高級(jí) Rails 開發(fā)者,他使用 Python,LISP 和 Perl 寫過很多代碼。在幾天內(nèi),他已經(jīng)起了很大作用,在幾周內(nèi),更多的作用。他很快成為技術(shù)團(tuán)隊(duì)的組長(zhǎng),這是我參與過最好的招聘決定。

不要擔(dān)心技術(shù)棧。很多人這樣說:“現(xiàn)在 AngularJS 最火”,“JS 正在崛起”或者“最新的潮流是...”。我的回答是:“那有怎樣?”當(dāng)你學(xué)習(xí)編程,你唯一的目標(biāo)應(yīng)該是找到拐點(diǎn)并擊敗它。一旦你做到了,學(xué)習(xí)新的潮流技術(shù)一點(diǎn)也不難。

變得獨(dú)立(Become self-reliant)。有能力不依靠完整的指導(dǎo)學(xué)習(xí)新的技術(shù),意味這你不再需要等別人來教你。大多數(shù)你想學(xué)的東西,你只需在網(wǎng)上搜索,閱讀關(guān)于各種各樣你想知道的東西的材料。

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

在拐點(diǎn)你會(huì)學(xué)到的技能

作為一名軟件開發(fā)者,最好的參考材料是你寫過的相似代碼。當(dāng)你完全理解了你寫的代碼,你不需要記住所有細(xì)節(jié)。當(dāng)你寫一個(gè)新功能時(shí),你應(yīng)該問自己的第一個(gè)問題是:“我有寫過相同的功能嗎?”。如果是,重新打開代碼,一行一行的看,跟自己解釋它在做什么,問自己:“我現(xiàn)在可以用同樣的方法嗎?”

視頻很難解釋領(lǐng)域特定知識(shí)的細(xì)節(jié),因?yàn)橐曨l得花很多時(shí)間來看。比如你想集成 Google 地圖 API,如果你集成過,不用花一分鐘就可以打開代碼,復(fù)制代碼,將它粘貼到新項(xiàng)目。而重新看視頻得花 10 - 30 分鐘。

高效通過拐點(diǎn)的策略

因?yàn)橥ㄟ^拐點(diǎn)是學(xué)習(xí)編程最重要的一部分,你應(yīng)該讓自己精力充沛,讓這個(gè)過程盡可能順利。這意味這你在輔導(dǎo)階段時(shí)就應(yīng)該開始準(zhǔn)備,并且在這過程中保持良好的心態(tài)。

在輔導(dǎo)階段期間,不依賴完整的教程,讓自己挑戰(zhàn)問題。

  • 每一節(jié)課程,嘗試做一些超出教程范圍的東西。如果你正在閱讀的教程提供了課后練習(xí),請(qǐng)全部做完。解決沒有指導(dǎo)的問題將給你很重要的獨(dú)自解決問題的經(jīng)驗(yàn)。

  • 盡可能少的使用教程。在 Firehost,我們經(jīng)常詳細(xì)地向?qū)W員講解如何使用文檔集成第三方庫或者做某事,而不是簡(jiǎn)單地跟著教程中的指令,這些教程是提供給剛剛起步的同學(xué)的。許多學(xué)生將跟著文檔學(xué)習(xí),將教程作為備選材料。請(qǐng)注意,文檔會(huì)把你當(dāng)成已通過拐點(diǎn)的開發(fā)者。習(xí)慣于閱讀和跟著 GitHub 上的文檔進(jìn)行開發(fā),對(duì)你獨(dú)自開發(fā)時(shí)將很有幫助。

  • 關(guān)注重要的事并且重復(fù)練習(xí)。學(xué)會(huì)怎么做常見的任務(wù),比如從零開始快速啟動(dòng)一個(gè)項(xiàng)目、將一個(gè)新應(yīng)用推送到 GitHub 和 Heroku、盡早地執(zhí)行數(shù)據(jù)庫遷移。

通過拐點(diǎn)很難,這里有一些忠告幫助你通過它:

  • 認(rèn)識(shí)到這是一個(gè)艱難的過程,讓自己放松,樹立合理的預(yù)期。你不能拿輔導(dǎo)階段的超人速度和自學(xué)階段的蝸牛速度對(duì)比。請(qǐng)記住,你正在學(xué)習(xí)很多東西,你在學(xué)習(xí)一個(gè)新的技能——獨(dú)自解決問題。

  • 如果你覺得沒自信,你得知道,這是非常正常的感覺。繼續(xù)前進(jìn),如果你還在掙扎中,嘗試與剛通過拐點(diǎn)的同學(xué)交流,他們能感受到你現(xiàn)在的處境,并且向你保證你正在經(jīng)歷的只是暫時(shí)的。不斷學(xué)習(xí),但是不要過度。在這個(gè)階段,你最多只能每天學(xué)習(xí) 6 小時(shí)。在筋疲力盡的狀態(tài)下學(xué)習(xí)只會(huì)延長(zhǎng)你花在拐點(diǎn)的時(shí)間。

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

如果某個(gè)問題花了你 5 分鐘或者 5 小時(shí)后還沒有頭緒,這會(huì)讓人很心煩。但每次解決它并且成功實(shí)現(xiàn)一個(gè)新功能,會(huì)讓你感覺自己很牛。在沒有幫助下解決許多難題后,你會(huì)沉迷于構(gòu)建超出你舒適區(qū)的東西的感覺。

怎么知道你何時(shí)通過了拐點(diǎn)

拐點(diǎn)的最后階段是接受(The final stage of the inflection point process is acceptance)。接受軟件開發(fā)是一個(gè)不斷學(xué)習(xí)的過程。接受你已經(jīng)學(xué)會(huì)了一切的感覺只意味著你應(yīng)該開始考慮解決更復(fù)雜的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容