原文:The Key To Accelerating Your Coding Skills
TL;DR
作者把學習編程分為 2 個階段,第一個階段是輔導階段堕仔,這個階段有 2 個重點:
- 通過教程學習具體的技能,如在 Vue 中如何響應按鈕的點擊事件
- 仔細查看錯誤信息拱她,調(diào)試程序篱昔。因為一個小小的拼寫錯誤也會導致程序出錯,所以得格外注重細節(jié)玛荞。
這個階段的秘訣是注重細節(jié)娇掏,以及從每一個錯誤/難題中學習,當解決一個難題后勋眯,想下難在哪里婴梧、原因是什么、怎么避免客蹋。
第二個階段是拐點階段塞蹭,這個階段是學會獨自編程、獨自解決問題的過程讶坯。在軟件開發(fā)中番电,永遠都學不完所有你需要知道的知識,總是存在你沒遇到過的問題辆琅。我們得拆分問題漱办,然后正確地搜索和提問(提問的智慧)这刷。
此時的秘訣是盡早獨自解決問題,拆分問題洼冻,將問題拆分到自己能執(zhí)行的地步為止崭歧。
作者認為 Web 開發(fā)需要 2 樣能力:
Web 開發(fā)能力,能基于數(shù)據(jù)庫開發(fā)任何你遇到的應用撞牢。其中應該包含:數(shù)據(jù)庫技能(設計表率碾、查詢)、一門服務端語言屋彪、前端技能(JS所宰、HTML 和 CSS)。
算法和數(shù)據(jù)結(jié)構(gòu)能力畜挥,有這個能力的開發(fā)者可以寫出邏輯較復雜的代碼仔粥。
以下是原文。
當你學習編程時蟹但,會有一個時刻一切開始改變躯泰。在 Firehose,我們喜歡稱這時刻為編程的拐點(inflection point)华糖。經(jīng)過這個階段麦向,你作為開發(fā)者的工作方式將大不相同。爬到拐點是在編程上變得獨立(self-sufficient)的過程客叉,達到拐點后你不再需要別人手把手教你完成功能诵竭。它是一個艱難的過程,但是一旦你經(jīng)歷了兼搏,會讓你很有信心卵慰。
在 Firehose,我們的目標不僅僅是教你 Ruby佛呻,怎么構(gòu)建 Web 應用或者怎么寫測試裳朋。雖然我們的確教這些技能,但是我們的主要目標是讓學生更快通過拐點件相,讓他們有能力解決遇到的任何問題再扭。我們認為能獨自解決問題是很寶貴的技能燕酷。這種教學方法相比單純地教如何構(gòu)建應用衡便,可以讓你走的更遠口予。
輔導階段(Tutorail Phase)(認真編程 3 - 8 周)
當你開始學習編程劫拗,你有許多還不了解的信息舵揭。這些信息叫領(lǐng)域特定知識(domain-specific knowledge)钱骂,例如:怎么用 ruby 寫循環(huán)語句屋厘、怎么使用 Rails 從數(shù)據(jù)庫提取記錄紧索。
成為一名獨立(self-sufficient)的開發(fā)者第一步是學會怎么執(zhí)行一個具體的任務。當你掌握幾個方法后区赵,就逐漸知道這些碎片是如何拼到一起惭缰,以完成功能。經(jīng)過一段時間笼才,你將開始理解漱受,一開始令你困惑的東西最終會變得自然起來。
對于剛起步的學生骡送,要獲得的最重要的技能是關(guān)注細節(jié)
在閱讀文檔或教程時昂羡,關(guān)注細節(jié)十分重要。即使是最小的拼寫錯誤也會導致錯誤摔踱。一開始看錯誤信息是一個艱難的過程虐先,但它在學習過程是一個至關(guān)重要的步驟。在這階段中處理錯誤信息和問題會教你一個編程中最重要的技能:注重細節(jié)派敷。
排除故障十分重要蛹批。事實上,錯誤信息是編程的一部分:缺乏經(jīng)驗和非常有經(jīng)驗的開發(fā)者都會遇到篮愉。唯一的不同點是腐芍,處理錯誤信息的經(jīng)驗越多,修復它們所需的時間就越少试躏。因為:
經(jīng)過一段時間甸赃,你將學會如何閱讀錯誤信息和快速提取問題的相關(guān)細節(jié)。你第一次看到一個錯誤信息冗酿,會花你一些時間了解它到底是什么意思。但當你遇到幾百次錯誤信息后(你還會再遇到無數(shù)錯誤)络断,你將能定位發(fā)生問題的地方裁替,找到修復它們所需要的相關(guān)細節(jié)。
你應該從你解決的每一個錯誤中學習貌笨。不要修復完就算了弱判,理解代碼到底有什么問題。從每一次錯誤學習锥惋,下次你犯了同樣的錯昌腰,你將會更快的修復它。
一開始膀跌,你每次遇到錯誤都會請求幫忙遭商。慢慢地,你會仔細檢查代碼和去 Google 搜索捅伤,慢慢減少求助頻率劫流。
在輔導階段,你會跟隨教導。一開始祠汇,你覺得跟隨教導指令有難度仍秤,經(jīng)常出現(xiàn)錯誤。慢慢地可很,你將學會調(diào)試錯誤诗力,更注重細節(jié),并且你會學得越來越快我抠。當你通過輔導階段苇本,你會注意到你能以更快速度的寫代碼。
在這時屿良,一些人會感到有信心圈澈,他們準備拋棄指導,可以不依靠指示開始構(gòu)建東西了尘惧,并開心地投入身心進去康栈。一些學生會尋找更多教程,嘗試獲得更多領(lǐng)域特定知識喷橙,以尋求“完全理解”啥么。不幸的是,教程只能帶你到這里贰逾,真正的自信不是在教程里找到的悬荣。真正的自信來自與一個你不知道怎么解決的問題糾纏,并且自己發(fā)現(xiàn)解決辦法疙剑。
編程骯臟的小秘密是...
你永遠不會知道解決你所有的問題所需要的所有知識氯迂。編程時一個終生學習的過程。經(jīng)驗豐富的軟件工程師尋找他們沒遇到過的問題的解決方案言缤,因為這是他們學習的機會嚼蚀。如果你發(fā)現(xiàn)自己在等待這樣一個時刻——你終于覺得你知道了關(guān)于編程的所有知識,告訴你:你永遠等不到這一天管挟,但這是一件美妙的事情轿曙。
當你達到以下狀態(tài),你將進入下一個階段:
你已經(jīng)遇到足夠的錯誤僻孝,不再害怕遇到它們导帝。而且,你知道如何弄懂它們表示什么和哪段代碼出了問題穿铆。
熟練地使用 Google 尋找解決方法您单。當你編寫一個功能時或者遇到一個讓你困惑的錯誤時,你知道搜索什么來找到你需要的信息悴务。
你可以參考你項目中已經(jīng)寫過的代碼睹限,跟隨這些模板來增加功能譬猫,而不是總是尋找手把手的教導。
拐點階段(The Inflection Point)(2 - 4 周)
這個階段是學習編程中最容易讓人氣餒的階段羡疗,某些方面來講染服,這是唯一重要的階段。在這個階段你漸漸不使用教程叨恨,獨自解決問題柳刮,沒人告訴你解決方法。
某些時候痒钝,你會覺得你還沒準備好應對這個階段秉颗,想回去編寫那些有詳細解決步驟的項目。不要被這種心態(tài)影響了送矩,你覺得難受的原因是:
在拐點階段期間蚕甥,相比前一個階段,你的編程速度要慢 10 - 20 倍栋荸。
你開始懷疑自己是否有能力成為一名程序員菇怀。在這個階段,沒有信心和懷疑自己是很常見的晌块。
盡管你覺得自己以慢地多的速度學習和完成事情爱沟,但實際上你正在習得最重要的技能。當你領(lǐng)域特定知識(domain-specific knowledge)學得足夠了(學完最小必要知識)匆背,你接下來學的一切都是有關(guān)程序性知識的(procedural knowledge)(指關(guān)于“如何做”的知識)呼伸。
程序性知識是教會自己你不知道的東西的能力。當你需要實現(xiàn)一個新功能钝尸,你要怎么搜索括享?當你需要實現(xiàn)許多東西時,你會覺得很無助珍促。學會如何獨自找到出路很重要奶浦,因為你永遠不會知道所有要知道的東西,你必須有能力教會自己如何解決手頭上的問題踢星。
很多人沒意識到,學習編程隙咸,你得學習領(lǐng)域特定知識以及程序性知識沐悦。
接下來,每天挑戰(zhàn)自己的極限
有些軟件工程師一旦找到了穩(wěn)定的崗位五督,就停在舒適圈藏否。這些程序員被稱為維護程序員(maintenance programmers)。這不是你的努力的目標充包。相反副签,你應該每天都挑戰(zhàn)自己的極限遥椿。程序員跳槽的最常見原因是:這份工作已經(jīng)不再有挑戰(zhàn)性了,因為我已經(jīng)解決了所有有趣的問題淆储,
你應該尋找超出你目前技術(shù)棧的問題冠场,而不是一直編寫在你舒適圈內(nèi)的項目。這是積累和擴展你技能的唯一方法本砰。
在 Web 開發(fā)碴裙,有 2 個拐點會匯集到一起
Web 開發(fā)拐點是你有能力寫任何數(shù)據(jù)庫驅(qū)動的應用的拐點。這意味著你能構(gòu)建一個 Web 應用点额,它有多個從數(shù)據(jù)庫存取信息的頁面舔株。Web 開發(fā)者稱這個為:熟練掌握 CRUD。在這個階段还棱,你應該可以跟著文檔或者文章集成任何第三方庫载慈。
算法和數(shù)據(jù)結(jié)構(gòu)拐點是一個不那么明顯的拐點,但它實際上更重要珍手。除了掌握了編程的基礎和擁有解決復雜編程問題的知識外办铡,克服這個拐點的同學應該已經(jīng)掌握了他正在使用的語言。
攻克算法和數(shù)據(jù)結(jié)構(gòu)拐點的人可以:
編寫排序算法
實現(xiàn)和倒置鏈表
理解棧珠十、隊列和樹以及在程序中利用它們
使用遞歸和循環(huán)解決問題
總之料扰,一旦你經(jīng)過這個拐點,你將掌握數(shù)據(jù)操作和理解你代碼的性能焙蹭。傳統(tǒng)的計算機科學學位專注于讓學生通過算法和數(shù)據(jù)結(jié)構(gòu)拐點晒杈。許多大學用行業(yè)上通常不使用的語言來教這些內(nèi)容,如 Scheme, Racket, LISP孔厉。
大多數(shù)技術(shù)面試拯钻,面試官會當做你已經(jīng)通過了 Web 開發(fā)拐點,因為它相對容易撰豺,然后將問題集中在評估你在算法和數(shù)據(jù)結(jié)構(gòu)上的能力粪般。這些問題一般集中在我們上面提到的話題:排序算法、倒置鏈表和使用棧污桦、隊列以及樹亩歹。
一旦程序員通過了 Web 開發(fā)拐點和算法、數(shù)據(jù)結(jié)構(gòu)拐點凡橱,他們就掌握了關(guān)鍵技能(hold the keys to the kingdom)
這些程序員有能力解決兩者相交的挑戰(zhàn):在高級 Web 應用中構(gòu)建復雜算法小作。這是資深 Web 開發(fā)每天做的事情。
拐點的結(jié)果(Consequences of the Inflection Point)
當你第一次聽到拐點最大的結(jié)果時稼钩,會覺得有點反直覺:
學編程時顾稀,領(lǐng)域特定知識在宏觀(the grand scheme)上并不重要。
是的坝撑,我沒有在開玩笑静秆,它真的一點都不重要粮揉。一旦你經(jīng)過了拐點,學習那些概念(領(lǐng)域特定知識)只需一周或者 2 篇教程抚笔,甚至只要幾天扶认。
最重要的是:
- 你熟悉 Web 開發(fā)
原文是:You have a solid grasp on a web development framework,但是前面又說領(lǐng)域特定知識在宏觀上不重要塔沃,但一個 Web 框架不應該是作者所指的特定知識嗎蝠引?所以我覺得應該是指 Web 開發(fā)
- 你可以熟練地使用任何編程語言寫復雜的算法代碼
人事主管想招的是有扎實 Web 開發(fā)和算法技能的開發(fā)者
當我在 PayPal 工作時,我們團隊招了一個沒有 Rails 開發(fā)經(jīng)驗的高級 Rails 開發(fā)者蛀柴,他使用 Python螃概,LISP 和 Perl 寫過很多代碼。在幾天內(nèi)鸽疾,他已經(jīng)起了很大作用吊洼,在幾周內(nèi),更多的作用制肮。他很快成為技術(shù)團隊的組長冒窍,這是我參與過最好的招聘決定。
不要擔心技術(shù)棧豺鼻。很多人這樣說:“現(xiàn)在 AngularJS 最火”综液,“JS 正在崛起”或者“最新的潮流是...”。我的回答是:“那有怎樣儒飒?”當你學習編程谬莹,你唯一的目標應該是找到拐點并擊敗它。一旦你做到了桩了,學習新的潮流技術(shù)一點也不難附帽。
變得獨立(Become self-reliant)。有能力不依靠完整的指導學習新的技術(shù)井誉,意味這你不再需要等別人來教你蕉扮。大多數(shù)你想學的東西,你只需在網(wǎng)上搜索颗圣,閱讀關(guān)于各種各樣你想知道的東西的材料喳钟。
這不意味這你馬上知道了所有東西,只是所有東西都是可以解決的在岂、可以執(zhí)行的了(figure-out-able)荚藻。你可以說是不可阻擋的了。
在拐點你會學到的技能
作為一名軟件開發(fā)者洁段,最好的參考材料是你寫過的相似代碼。當你完全理解了你寫的代碼共郭,你不需要記住所有細節(jié)祠丝。當你寫一個新功能時疾呻,你應該問自己的第一個問題是:“我有寫過相同的功能嗎?”写半。如果是岸蜗,重新打開代碼,一行一行的看叠蝇,跟自己解釋它在做什么璃岳,問自己:“我現(xiàn)在可以用同樣的方法嗎?”
視頻很難解釋領(lǐng)域特定知識的細節(jié)悔捶,因為視頻得花很多時間來看铃慷。比如你想集成 Google 地圖 API,如果你集成過蜕该,不用花一分鐘就可以打開代碼犁柜,復制代碼,將它粘貼到新項目堂淡。而重新看視頻得花 10 - 30 分鐘馋缅。
高效通過拐點的策略
因為通過拐點是學習編程最重要的一部分,你應該讓自己精力充沛绢淀,讓這個過程盡可能順利萤悴。這意味這你在輔導階段時就應該開始準備,并且在這過程中保持良好的心態(tài)皆的。
在輔導階段期間覆履,不依賴完整的教程,讓自己挑戰(zhàn)問題祭务。
每一節(jié)課程内狗,嘗試做一些超出教程范圍的東西。如果你正在閱讀的教程提供了課后練習义锥,請全部做完柳沙。解決沒有指導的問題將給你很重要的獨自解決問題的經(jīng)驗。
盡可能少的使用教程拌倍。在 Firehost赂鲤,我們經(jīng)常詳細地向?qū)W員講解如何使用文檔集成第三方庫或者做某事,而不是簡單地跟著教程中的指令柱恤,這些教程是提供給剛剛起步的同學的数初。許多學生將跟著文檔學習,將教程作為備選材料梗顺。請注意泡孩,文檔會把你當成已通過拐點的開發(fā)者。習慣于閱讀和跟著 GitHub 上的文檔進行開發(fā)寺谤,對你獨自開發(fā)時將很有幫助仑鸥。
關(guān)注重要的事并且重復練習吮播。學會怎么做常見的任務,比如從零開始快速啟動一個項目眼俊、將一個新應用推送到 GitHub 和 Heroku意狠、盡早地執(zhí)行數(shù)據(jù)庫遷移。
通過拐點很難疮胖,這里有一些忠告幫助你通過它:
認識到這是一個艱難的過程环戈,讓自己放松,樹立合理的預期澎灸。你不能拿輔導階段的超人速度和自學階段的蝸牛速度對比院塞。請記住,你正在學習很多東西击孩,你在學習一個新的技能——獨自解決問題迫悠。
如果你覺得沒自信,你得知道巩梢,這是非常正常的感覺创泄。繼續(xù)前進,如果你還在掙扎中括蝠,嘗試與剛通過拐點的同學交流鞠抑,他們能感受到你現(xiàn)在的處境,并且向你保證你正在經(jīng)歷的只是暫時的忌警。不斷學習搁拙,但是不要過度。在這個階段法绵,你最多只能每天學習 6 小時箕速。在筋疲力盡的狀態(tài)下學習只會延長你花在拐點的時間。
這個階段獲得自信的最好辦法是解決你的疑問朋譬,你的情緒會像坐過山車那樣盐茎,有時,你覺得很焦急徙赢,但經(jīng)過 15 小時的解決過程字柠,有相反的感受是很常見的。
如果某個問題花了你 5 分鐘或者 5 小時后還沒有頭緒狡赐,這會讓人很心煩窑业。但每次解決它并且成功實現(xiàn)一個新功能,會讓你感覺自己很牛枕屉。在沒有幫助下解決許多難題后常柄,你會沉迷于構(gòu)建超出你舒適區(qū)的東西的感覺。
怎么知道你何時通過了拐點
拐點的最后階段是接受(The final stage of the inflection point process is acceptance)。接受軟件開發(fā)是一個不斷學習的過程西潘。接受你已經(jīng)學會了一切的感覺只意味著你應該開始考慮解決更復雜的問題铜异。