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