ref: http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/程序員
當您學習編程時,有一瞬間一切都開始改變。 在Firehose,咱們喜歡將其稱爲編程的拐點。 在此階段以後,您做爲開發人員的操做方式將大爲不一樣。 達到拐點的過程是使程序變得自給自足的過程,以致於您再也不須要任何手動操做。 這多是很痛苦的經歷,可是一旦你經過了這個拐點,你的編程能力就會使人難以置信地加強。面試
當您開始學習編程時,有不少您尚不瞭解的信息。 此信息稱爲特定領域知識。 示例包括:知道如何用Ruby編寫循環或如何使用Ruby on Rails從數據庫中提取內容。 特定領域的知識包括特定編程環境所獨有的協議。算法
成爲自給自足的開發人員的第一步是學習如何執行特定任務。 一旦您掌握了某些任務,各個部分如何組合在一塊兒的大招就會開始顯現出來。 隨着時間的流逝,您將開始認識模式,最終,最初看起來使人迷惑的事物和陌生的事物將成爲天然而然的事情。數據庫
在閱讀文檔或教程之類的材料時,密切關注細節很是重要。 即便是最輕微的拼寫錯誤和拼寫錯誤,也會致使錯誤消息或錯誤。 首先,看到錯誤消息是很痛苦的經歷,但這是學習過程當中相當重要的一步。 在此階段處理錯誤消息和問題,能夠教會您在安全的環境中編程的最重要技能之一:必定要注重細節。編程
事實是,錯誤消息只是編程的一部分:無經驗和很是有經驗的開發人員均可以看到它們。 惟一的區別是,您對錯誤消息的處理經驗越多,花費在修復錯誤消息上的時間就越少。 緣由以下:安全
剛開始有些人可能就會有一點小信息來挖掘錯誤,而後構建一些小項目。然而有些其餘人卻須要繼續的學習,由於每一個人學習能力和學習速度不一樣,可是無論怎樣,通過這麼多的錯誤消息以後,你的debug能力確定經驗提高了。ruby
在這一點上,有些人會感到自信-就像他們準備拋棄訓練輪並在沒有結構化指導的狀況下開始建造東西同樣-會高興地跳入深淵。 其餘學生將得到更多教程,以尋求更多的特定領域知識,以尋求「全面理解」。 不幸的是,教程只會帶您走遠,而在教程或指南中卻找不到真正的信心。 真正的信心來自於努力解決本身不知道如何解決的問題,並自行找到解決方案。數據結構
You will never know everything you need to know to solve all your problems. Going into the journey, you probably envisioned yourself eventually learning everything you need to learn, and then being squared away. This moment will never happen.app
Programming is a life-long learning experience. Experienced software engineers seek to find solutions to problems they haven’t solved yet because it gives them the opportunity to learn more. If you find yourself waiting for the moment when you finally feel like you know everything there is to know about coding, know this: the day you’re waiting for will never come. And that is a wonderful thing.框架
拐點階段是學習編碼中最使人沮喪的階段之一,但在許多方面,它是惟一重要的階段。 這是您逐步使用教程並開始解決沒有人爲您找到解決方案的問題的關鍵所在。
在某些時候,您會以爲本身尚未準備好解決這個階段,而且想回到構建具備確切工做要作的輪廓的東西。 不要淪爲這種心態。 您會感到沮喪的緣由是:
在變形階段,您將比上一階段的編碼慢10到20倍。
您可能會開始質疑本身,想知道本身是否真的有能力成爲一名程序員。 在此階段,不安全感和懷疑感很廣泛。
儘管您會以爲本身正在以慢得多的速度學習和完成事情,但實際上,您正在實現最重要的事情。 當您對特定領域的知識日趨緊張時,您所學的都是關於程序知識。
程序知識是指自學過程當中不瞭解的知識的能力。 當您須要實施一項新功能時,應該使用哪一種類型的Google搜索? 在這個時候,當您要完成許多事情時,您會感受本身像在「黑暗中」。 學習如何本身找到光源相當重要,由於您永遠沒法知道所要了解的一切,所以您須要可以教給本身如何解決眼前的問題。
大多數人沒有意識到,要學習編碼,您須要學習特定領域知識和過程知識。
一旦找到立足點,一些軟件工程師就會留在溫馨區域內。 這些類型的程序員被稱爲維護程序員,而不是您應該努力作到的。 相反,您應該天天都努力超越本身的極限。 程序員辭職的最多見緣由是「自從我解決了全部有趣的問題後,它再也不具備挑戰性。」
而不是嘗試將編碼項目拖入您的溫馨區域,您應該尋找當前技能以外的問題。 這是創建和擴展技能的惟一方法。
用Firehose學生的話說,當他經過拐點時:
我仍然以爲本身處於深淵! 知道那是我必需要作的事,我感到更加自在!
當你可以創建一個以任意數據庫驅動的應用時,那就意味着可以構建任意存儲着相關信息數據庫的不少網站了。網站開發稱之爲:「mastering CRUD.」在此階段,只需遵循GitHub或博客文章上提供的文檔,您還應該可以與任何第三方庫(例如ruby gem)集成。
算法與數據結構的拐點要比網站開發的拐點要更難以琢磨一點,可是它更重要。征服了這一點的人不只會精通所用的編程語言,並且會精通編程的基礎知識,並具備解決複雜編碼難題的豐富知識。
一個征服了算法和數據結構的拐點,他將可以:
簡而言之,一旦您經過了這個拐點,您將掌握數據操做並瞭解代碼決策對性能的影響。 傳統的計算機科學學位只專一於讓學生超越算法和數據結構的拐點。 許多大學都使用行業中一般不使用的編程語言(例如Scheme,Racket或LISP)來教授這種語言。
在大多數技術面試中,面試官會認爲您已經經過了Web開發的轉折點,由於這樣作比較容易,並將他們的問題集中在評估您在算法和數據結構上的技能。 這些問題一般集中在咱們上面提到的主題上:排序算法,反向連接列表以及使用堆棧,隊列和樹。
** 一旦開發人員經過了Web開發的拐點以及算法和數據結構的拐點,他們便掌握基本上全部的關鍵點。**
這些開發人員將可以解決與二者相交的挑戰:須要在高級Web應用程序的上下文中構建的複雜算法。 這是專業Web開發人員天天所作工做的核心。
當你經過這些拐點時:
你在學習任意領域的知識的時候,都將融會貫通,你可能一到兩週的時間就會學會一項新技能。
最終真正重要的是:
如今招人也但願開發人員具有紮實的Web開發和算法能力。
當我在PayPal工做時,個人團隊聘請了一位沒有Rails經驗的高級Rails開發人員-他已經在Python,LISP和Perl中進行了大量編碼。 在幾天以內,他已經產生了巨大的影響。 並在數週內:產生巨大影響。 他很快就升任技術團隊主管,這是我參與過的最優秀的招聘決定之一。
不要盲目跟風,有人說最近AngularJS很火啊,JS也在上升期,個人迴應通常是:「SO?」,你的目標是發現編程的拐點並且完全弄懂它,一旦你弄清楚了,任何新語言新浪潮都將不是問題。
變得自力更生。 無需結構化指導便可學習新的編碼技能的能力意味着您再也不須要等待任何人幫助您。 這意味着,對於您須要學習的大部份內容,您只需搜索互聯網並閱讀各類您須要瞭解的材料。
這並不意味着您當即「知道」一切,而只是如今一切都「能夠超出數字」,所以從本質上講,您是沒法阻擋的。
做爲軟件開發人員,最好的參考資料是您已經編寫的相似代碼。 當您徹底理解所編寫的代碼時,無需將全部詳細信息提交到內存中。 這意味着在構建新功能時,您應該問本身的第一個問題是:「我以前是否構建過相似的東西?」 若是答案是確定的,請從新查看代碼並逐行瀏覽代碼。 從新向本身解釋正在作什麼,並問本身:「我如今可使用相同的方法嗎?」
經過看視頻沒法解釋特定於域的細節,由於它們花了很長時間才能觀看。 假設您想與Google Maps API集成。 一旦經歷過一次,即可以在不到一分鐘的時間內在GitHub中打開代碼,複製代碼並將其粘貼到新項目中。 而視頻一般須要10到30分鐘才能從新觀看。
由於經過拐點是學習編碼的最重要部分,因此您應該讓本身儘量舒服一點。 這意味着您應該在進入教程階段時就開始準備,並在此期間保持正確的心態。
在教程階段,請中止學習結構化材料,並一路給本身挑戰難題。
在此階段得到信心的最好方法是克服任何疑問。 您的情緒可能開始變得像過山車。 有時,您會感到本身在生火,可是在同一個問題上苦苦掙扎15個小時以後,感到對立是很廣泛的。
不知道是否是要花5分鐘或5個小時才能讓您感到沮喪,可是每次您接通電源併成功實施新功能時,急需信心。 在沒有任何幫助的狀況下解決了一些棘手的問題以後,您會沉迷於在溫馨區域以外建造東西的感受。
拐點過程的最後階段是驗收。 接受軟件開發是一個不斷學習的過程。 接受成功學習一切的感受,意味着您應該開始考慮解決更復雜的問題。