如何加速提升編程能力(譯)
寫在前面
本文主要翻譯 Ken Mazaika的博文-The Key To Accelerating Your Coding Skills。
原文來自 網(wǎng)站Firehose Project,旨在提供程序設(shè)計(jì)方面的新聞、知識(shí),提供2分鐘快速閱讀等服務(wù),并且提供在線學(xué)習(xí)編程技巧的服務(wù),請(qǐng)參見quora中一位學(xué)員的問答記錄,從學(xué)習(xí)者的角度說的非常明確:點(diǎn)我~~
正文開始
每一個(gè)學(xué)習(xí)程序設(shè)計(jì)的人,都會(huì)有一種感覺,打到一個(gè)特定的階段之后,一切都發(fā)生了化學(xué)反應(yīng)。Firehose稱之為 編程拐點(diǎn)。
譯者:其實(shí)所有事情都有拐點(diǎn),萬事開頭難就是這個(gè)意思吧。
編程拐點(diǎn)之后,開發(fā)者的在程序設(shè)計(jì)方面的能力會(huì)有極大的提升,這也會(huì)帶給自己足夠的自信,最終在程序設(shè)計(jì)方面打到自給自足。達(dá)到編程拐的過程可能極其艱辛,但是一旦達(dá)到,也會(huì)給開發(fā)者帶來非常大的提高。
Firehose提供Ruby語言的學(xué)習(xí),編寫web應(yīng)用程序,編寫測(cè)試代碼。但是這些都不是重點(diǎn),更加重要的是幫助開發(fā)者度過編程拐點(diǎn),讓開發(fā)者掌握自主解決問題的能力。自主解決問題的能力才彌足珍貴。在Firehose,授人以魚不如授人以漁。
教程階段(3-8周的編碼基礎(chǔ)學(xué)習(xí))
剛開始學(xué)習(xí)編碼,肯定缺少很多必要的知識(shí)積累。我們稱這些知識(shí)為 領(lǐng)域?qū)I(yè)知識(shí)。舉個(gè)例子:如何在Ruby中編寫循環(huán),或者如何通過Ruby on Rails連接數(shù)據(jù)庫(kù)等。領(lǐng)域?qū)I(yè)知識(shí)的掌握,需要基于整個(gè)編程的環(huán)境。
成為真正程序的第一步是學(xué)習(xí)這些技能。隨著技能的掌握,零散的知識(shí)會(huì)逐漸拼接成完整的一塊。在這過程中,開發(fā)者會(huì)掌握一些特定的模式,最終,一開始令人迷惑的這些知識(shí)會(huì)融匯貫通,甚至稱為一種本能。
對(duì)于初學(xué)者來說,最重要的是細(xì)節(jié)。
對(duì)細(xì)節(jié)的關(guān)注在編程中很重要,比如要注意文檔或者教學(xué)材料的細(xì)節(jié)部分。排版或者拼寫錯(cuò)誤都可能引發(fā)不必要的麻煩或者bug。起初,查看錯(cuò)誤日志會(huì)非常的難,容易讓人郁悶,但這卻是必經(jīng)之路。只有親自處理錯(cuò)誤日志,解決問題才能讓開發(fā)者切身體會(huì)到細(xì)節(jié)是多么重要。
Debugging(根據(jù)錯(cuò)誤日志找到問題并且解決,統(tǒng)稱調(diào)試錯(cuò)誤)的過程是非常非常重要的,開發(fā)者需要意識(shí)到,這是編程的一部分,不管經(jīng)驗(yàn)老道的開發(fā)者或者是初出茅廬的新人,這部分信息都是能看到的。區(qū)別在于,調(diào)試錯(cuò)誤的經(jīng)驗(yàn)越多,針對(duì)同一個(gè)問題調(diào)試的時(shí)間越短。原因參見:
隨著時(shí)間積累,開發(fā)者會(huì)掌握如何有效的讀取錯(cuò)誤日志,并且快速的抽取關(guān)于問題的有效信息。起初,閱讀錯(cuò)誤日志會(huì)不知所措,但是當(dāng)看過成百上千(相信我,絕對(duì)不是虛報(bào)數(shù)量)的錯(cuò)誤日志之后,開發(fā)者一定會(huì)迅速定位問題日志并且找到解決方案的。
-
每次解決問題,都要有所收獲。千萬別僅僅是解決了問題就算完事了。一定要弄明白為什么會(huì)發(fā)生問題。這樣,下次再遇到相同的問題,就可以快速修復(fù)。
譯者:最好總結(jié)發(fā)個(gè)博文啥的。
起初,開發(fā)者針對(duì)某個(gè)問題需要向其他人咨詢,但是后續(xù)你會(huì)發(fā)現(xiàn),仔細(xì)檢查代碼或者充分利用 Google檢索引擎 會(huì)更有效率。
在教程階段,開發(fā)者需要根據(jù) instruction 去編寫代碼。起初,你會(huì)發(fā)現(xiàn),跟著教程走怎么還是有那么多異常發(fā)生。后續(xù),你會(huì)從錯(cuò)誤調(diào)試中得到一個(gè)教訓(xùn):應(yīng)該對(duì) instruction 中的細(xì)節(jié)多關(guān)注一些。這時(shí)候,你應(yīng)該可以學(xué)習(xí)的更快速一些了。結(jié)束教程之后,你會(huì)發(fā)現(xiàn),可以以更快的節(jié)奏去進(jìn)行學(xué)習(xí)了。
這時(shí)候,一些學(xué)生會(huì)有一些自信心爆棚的趕腳,覺得已經(jīng)可以拋棄這些教程內(nèi)容,然后自己去潛心學(xué)習(xí)和開發(fā)一些東西了。另一些學(xué)生則會(huì)找一些更加深入的教程,掌握更深層次的領(lǐng)域?qū)I(yè)知識(shí),從更加深入的角度去理解??杀氖牵坛痰哪芰κ怯邢薜?,教程或者指引永遠(yuǎn)不會(huì)給人以真正的自信。自信來源于在問題中努力掙扎,并且最終通過自己的實(shí)力去解決的旅程。
不過,編程也是有套路的……
問題是無窮無盡的,同樣,解決問題背后的知識(shí)也是無窮無盡的,用有限的時(shí)間投入無窮的知識(shí)和問題是一個(gè)偽命題。企圖學(xué)習(xí)完所有的知識(shí)再去解決問題,這不可能。
事實(shí)上,編程本身是一個(gè)終身學(xué)習(xí)的體驗(yàn)。有經(jīng)驗(yàn)的軟件工程師很樂于解決從沒有見過的問題,解決這些問題能讓他們學(xué)習(xí)到更多的東西。如果有一天,你發(fā)現(xiàn)自己竟然想等學(xué)習(xí)完所有再開始動(dòng)手,趕緊提醒自己清醒過來。清醒過來很重要。
達(dá)到以下境界的話,你要知道,該進(jìn)入下一階段了
- 錯(cuò)誤日志看的太多了,已經(jīng)無法困擾到你了。同時(shí),你知道如何通過日志可以知道問題在哪里,如何從代碼中解決問題。
- 具備了專業(yè)的google檢索能力。當(dāng)你準(zhǔn)備給項(xiàng)目增加新特性或者是解決一個(gè)困擾你的問題,你知道如何有效的通過檢索引擎找到答案。
- 在編碼中,可以引用之前寫的某個(gè)模塊的代碼,并且遵循開發(fā)規(guī)范,并且不再依賴于那些一步一步指導(dǎo)你開發(fā)的指南或者是教程。
編程拐點(diǎn)(2-4周,并且要具備良好的心態(tài))
拐點(diǎn)階段是編程學(xué)習(xí)中最令人不能忍受的階段,但是從很多角度來看,卻是最重要的階段。其實(shí)拐點(diǎn)開始在逐步離開教程,并且開始獨(dú)立解決問題的時(shí)候。
某些時(shí)候,你感覺無法堅(jiān)持下去,希望回到教程階段,有明確的123的學(xué)習(xí)中去。但是千萬別輸給自己的心態(tài)。我們從頭開始分析這種心態(tài)的原因:
拐點(diǎn)階段中,你的編碼速度會(huì)比之前慢10~20倍。
你也許會(huì)質(zhì)疑自己,重新問自己,是不是真的擅長(zhǎng)做編程這一行。這一階段的感覺通常是不安全感和多慮。
拋開學(xué)習(xí)進(jìn)度緩慢的事實(shí)不說,事實(shí)上,你正在掌握最最重要的知識(shí)。雖然領(lǐng)域?qū)I(yè)知識(shí)進(jìn)展緩慢,但你所學(xué)的一切都與程序的過程知識(shí)有關(guān)。
過程知識(shí)十分重要,隨著時(shí)間的推移,可以讓你掌握自己不知道的知識(shí)。比如 " 當(dāng)我要實(shí)現(xiàn)一個(gè)新特性,我應(yīng)該去google怎么檢索?"。在這個(gè)階段,很多東西需要推動(dòng),你甚至?xí)杏X一片黑暗。學(xué)習(xí)如何跨過這黎明前的黑暗是關(guān)鍵點(diǎn),因?yàn)槿瞬豢赡苋?,所以,你必須學(xué)習(xí)如何親手解決問題。
許多人沒有意識(shí)到,學(xué)習(xí)編碼,其實(shí)學(xué)習(xí)的就是領(lǐng)域?qū)I(yè)知識(shí)以及程序過程知識(shí)。
剩余的人生時(shí)光中,勇敢踏出一步,每天進(jìn)步一點(diǎn)點(diǎn)。
一些軟件工程師一旦找到立足點(diǎn),就會(huì)常駐自己的舒適區(qū)。我們稱呼這類程序員為 “養(yǎng)老”。你不要成為這樣的程序員。相反,你應(yīng)該每天進(jìn)步一點(diǎn)點(diǎn)。程序員辭職的最常見的原因,應(yīng)該是“我已經(jīng)解決了所有有意思的問題,這里已經(jīng)沒有挑戰(zhàn)了”。
與其試著將項(xiàng)目推到自己的舒適區(qū),更應(yīng)該尋求有挑戰(zhàn)的解決方案。這是擴(kuò)展自己技術(shù)能力的唯一方式。
用一個(gè)Firehose學(xué)生的話講述編程拐點(diǎn):
我依然感覺處在深淵之中,但是相反,我沒有感覺不適,因?yàn)槲抑溃吩谀膬骸?/p>
在Web開發(fā)領(lǐng)域,其實(shí)同一時(shí)間會(huì)遭遇2個(gè)編程拐點(diǎn)。
經(jīng)歷過web開發(fā)編程拐點(diǎn)之后,你可以開發(fā)任何基于數(shù)據(jù)庫(kù)(database-dirven)應(yīng)用程序了。詳細(xì)的說就是你可以開發(fā)一個(gè)具有多個(gè)頁面的web應(yīng)用程序,具有儲(chǔ)存和提取數(shù)據(jù)庫(kù)中數(shù)據(jù)的功能。web應(yīng)用開發(fā)人員稱之為 “掌握了CRUD”。這一階段,你需要掌握通過閱讀文檔,集成第三方類庫(kù)(比如掌握ruby gem,或者從github、博客中獲?。┠芰?。
算法和數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)很容易被忽略,但實(shí)際上更加重要。一旦掌握這個(gè)技能,不僅僅掌握了基礎(chǔ)編程,并且具備了解決復(fù)雜編碼挑戰(zhàn)的能力,難能可貴的是,能完全掌握正在學(xué)習(xí)和使用中的編程語言。
征服了算法和數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)的人是這樣子的:
- 編寫排序算法
- 實(shí)現(xiàn)鏈表反轉(zhuǎn)
- 利用棧、隊(duì)列、樹去編寫程序
- 使用遞歸或者迭代的方法確解決實(shí)際問題
簡(jiǎn)而言之,一旦你通過了這兩個(gè)編程拐點(diǎn),你就完全掌握了對(duì)數(shù)據(jù)的操作,同時(shí)會(huì)理解代碼實(shí)現(xiàn)對(duì)程序運(yùn)行效率的影響。傳統(tǒng)的計(jì)算機(jī)科學(xué)學(xué)位關(guān)注于讓學(xué)生通過數(shù)據(jù)結(jié)構(gòu)和算法的拐點(diǎn)。很多大學(xué)通過Scheme,Racket或者LISP等語言來教授這些知識(shí),但是通常不會(huì)應(yīng)用在工業(yè)化生產(chǎn)中。
由于web編程拐點(diǎn)比較容易通過,很多面試的面試官會(huì)假設(shè)你已經(jīng)通過了web編程拐點(diǎn),而是把問題集中在算法和數(shù)據(jù)結(jié)構(gòu)中進(jìn)行。這些問題通常集中在上文提到部分:排序算法,鏈表反轉(zhuǎn),已經(jīng)針對(duì)棧、隊(duì)列、樹的使用。
一個(gè)開發(fā)者同時(shí)通過了web開發(fā)編程拐點(diǎn)以及算法數(shù)據(jù)結(jié)構(gòu)拐點(diǎn)的話,就掌握了通向OnePiece的鑰匙了(笑)。
這些開發(fā)者可以解決這兩學(xué)科的交叉問題:在web開發(fā)的領(lǐng)域中建立復(fù)雜的算法。這是專業(yè)的web開發(fā)人員每天都做的核心事情。
通過拐點(diǎn)之后
通過拐點(diǎn)之后的狀態(tài),可能有點(diǎn)有悖常理,深呼吸,看下去:
在學(xué)習(xí)編程中,領(lǐng)域?qū)I(yè)知識(shí)再宏觀的方案中其實(shí)不重要。
是的,我很嚴(yán)肅,確實(shí)一點(diǎn)兒也不重要。一旦你通過了拐點(diǎn),這些概念就變成了透明的流水,一兩周的教程就能掌握,甚至幾天。
譯者:鐵打的數(shù)據(jù)結(jié)構(gòu)和算法,流水的語言。
真正永恒的重要的東西是這些:
- 擁有扎實(shí)的web編程框架基礎(chǔ)
- 擁有扎實(shí)的算法和復(fù)雜代碼編寫功底,可以基于任何語言
面試中的HR經(jīng)理更傾向于招聘具有扎實(shí)web編程以及算法能力的開發(fā)者。
當(dāng)我在PayPal工作的時(shí)候,我的團(tuán)隊(duì)招聘了了一個(gè)沒有Rails開發(fā)經(jīng)驗(yàn)的高級(jí)Rails工程師,但是他具有豐富的Python,LISP,Perl編程經(jīng)驗(yàn)。只需幾天,他已經(jīng)有了大的改變。幾周之后,則是重大的改變,他迅速為了技術(shù)團(tuán)隊(duì)的leader。這是我參與在內(nèi)的最棒的招聘結(jié)果之一。
不要對(duì)技術(shù)棧朝三暮四。很多人會(huì)說什么“AngularJS 最近挺火呀”,“JavaScript正在崛起呀”,“最新流行的是……”我的回答是:“哪又怎么樣?”當(dāng)你正在學(xué)習(xí)編程時(shí)候,只有一個(gè)單純的目標(biāo),那就是找到拐點(diǎn)并且攻克之。做到這點(diǎn)以后,學(xué)習(xí)那些新的,流行的東西便是小事一樁。
要自力更生。你需要具備在沒有結(jié)構(gòu)化的指導(dǎo)下學(xué)習(xí)新的編程技能的能力。這意味著你不需要任何人幫助,所有需要掌握的技術(shù),只要簡(jiǎn)單的通過在Internet檢索和閱讀一些材料就可以做到。
在拐點(diǎn)期間,你需要具備的開發(fā)能力。
作為一名軟件開發(fā)人員,最好的參考資料應(yīng)該是和自己編寫邏輯相近的代碼。當(dāng)你完全理解了你寫得代碼,你不需要記住所有的細(xì)節(jié)。這意味著,每當(dāng)你準(zhǔn)備開發(fā)一個(gè)新功能的時(shí)候,需要問問自己:“我之前有沒有類似的代碼?“ 如果有的話,重新讀讀那些代碼,一行一行的review一邊,重新解釋下代碼的邏輯,然后問問自己,是否可以復(fù)用。
視頻很難解釋領(lǐng)域?qū)I(yè)知識(shí)的細(xì)節(jié),因?yàn)樾枰春荛L(zhǎng)時(shí)間。比如你想集成Google地圖的API,如果你之前已經(jīng)有過集成經(jīng)歷,從GitHub打開代碼可能不用一分鐘,但如果是重新看視頻的話,至少需要10-30分鐘。
使用一些策略可以幫助你高效盡快的通過編程拐點(diǎn)。
由于通過拐點(diǎn)是學(xué)習(xí)編程中最重要的一點(diǎn)。所以平滑的度過拐點(diǎn)期就成為一件重要的事情。所以,在教程期間就需要開始準(zhǔn)備了,同時(shí)要將觀念擺正,端正態(tài)度。
教程期間,利用休息的時(shí)間可以過一遍結(jié)構(gòu)化的教程,同時(shí)思考一些有挑戰(zhàn)性的問題。
- 對(duì)于每一節(jié)實(shí)操的編程課,試著找一些教程之外的東西去練習(xí)。如果教程本身提供了一些 “挑戰(zhàn)” 或者 “自我導(dǎo)向”的部分,一定都做一次。解決教程之外的問題,會(huì)讓你有寶貴的體驗(yàn)。
- 盡量少的利用教程。在Firehose,我們讓學(xué)生通過文檔去掌握如何集成某些Gem。與簡(jiǎn)單的教程相比許多學(xué)生按照文檔進(jìn)行操作,教程則作為備選方案。要知道,文檔可是為已經(jīng)通過編程拐點(diǎn)的開發(fā)者設(shè)計(jì)的。在Github上閱訂閱和閱讀文檔,會(huì)對(duì)日后你獨(dú)立工作有所幫助。
- 關(guān)注要點(diǎn),注意復(fù)用。盡早學(xué)會(huì)一些常見的操作,比如從頭開始編寫應(yīng)用程序,將新的應(yīng)用程序遷移到GitHub或者Heroku,盡早的介入數(shù)據(jù)庫(kù)的學(xué)習(xí)中。
接近拐點(diǎn)的每一天都非常有挑戰(zhàn)性,這里是一些幫助你度過的要點(diǎn):
- 告訴自己,這本身就會(huì)很難,正視自己。同時(shí),設(shè)立實(shí)際的規(guī)劃和目標(biāo)。不能把在教程中 “超人“ 般的學(xué)習(xí)速度和自己學(xué)習(xí) “蝸牛”般的速度昨比較。提醒自己正在學(xué)習(xí)大量的知識(shí),尤其是這一階段,你正在學(xué)習(xí)全新的技巧,能自己解決問題的那種。
- 如果你的自信心不足,要知道,你的感受是非常正常的。繼續(xù)努力,如果你還是打不起精神來,多和已經(jīng)通過拐點(diǎn)的人交流。他們肯定有和你相同的感受,可以肯定這個(gè)階段只是暫時(shí)的。持續(xù)的努力,但是要超過自己的限度。在這個(gè)階段,最好每天不要超過6個(gè)小時(shí)。過分疲憊反而會(huì)降低通過拐點(diǎn)的速度。
這個(gè)階段中,增長(zhǎng)自信最好的方式,就是解決自己的疑惑。你的情緒一開始可能想過山車一樣,有時(shí)候,你會(huì)覺得上火,但是通過15個(gè)小時(shí)的努力,解決了問題的時(shí)候,之前有多憤怒,現(xiàn)在就會(huì)有多開心。
當(dāng)卡在一個(gè)問題5分鐘或者5小時(shí),確實(shí)是令人沮喪的。但是每當(dāng)一獨(dú)立解決一個(gè)問題,或者是實(shí)現(xiàn)一個(gè)新功能之后,之前的所有沮喪都會(huì)變成自信心的來源。尤其是沒有任何人幫助的前提下解決了一個(gè)非常棘手的問題之后,你會(huì)喜歡上這種,在舒適區(qū)之外創(chuàng)造的感覺。
如何知道自己已經(jīng)跨越了拐點(diǎn)呢
拐點(diǎn)的最終階段是一種認(rèn)可。認(rèn)可軟件開發(fā)是一個(gè)持續(xù)學(xué)習(xí)的過程。認(rèn)可自己貌似解決了所有問題,其實(shí)其它的問題才剛剛開始。
譯者:《浪客行》武藏:什么是天下第一
你體驗(yàn)過編程拐點(diǎn)了嗎?試著分享一下這篇文章,和你的朋友們討論一下。你會(huì)驚訝于有多少人達(dá)到并且超越了這一階段。
作者資料
Ken Mazaika,F(xiàn)irehose的CTO和合伙人。前where.com(PayPal所屬)網(wǎng)站技術(shù)負(fù)責(zé)人,所屬波士頓PayPal/eBay技術(shù)研發(fā)團(tuán)隊(duì)。