ref: http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/
加速程式設計技能的關鍵
當您學習程式設計時,有一瞬間一切都開始改變。 在Firehose,我們喜歡將其稱為程式設計的拐點。 在此階段之後,您作為開發人員的操作方式將大為不同。 達到拐點的過程是使程式變得自給自足的過程,以至於您不再需要任何手動操作。 這可能是很痛苦的經歷,但是一旦你通過了這個拐點,你的程式設計能力就會令人難以置信地增強。
The Tutorial Phase (3-8 weeks of serious coding)
當您開始學習程式設計時,有很多您尚不瞭解的資訊。 此資訊稱為特定領域知識。 示例包括:知道如何用Ruby編寫迴圈或如何使用Ruby on Rails從資料庫中提取內容。 特定領域的知識包括特定程式設計環境所獨有的協議。
成為自給自足的開發人員的第一步是學習如何執行特定任務。 一旦您掌握了某些任務,各個部分如何組合在一起的大招就會開始顯現出來。 隨著時間的流逝,您將開始認識模式,最終,最初看起來令人迷惑的事物和陌生的事物將成為自然而然的事情。
對於剛畢業的學生來說,注意從細節中學習是很重要的技能。
在閱讀文件或教程之類的材料時,密切關注細節非常重要。 即使是最輕微的拼寫錯誤和拼寫錯誤,也會導致錯誤訊息或錯誤。 首先,看到錯誤訊息是很痛苦的經歷,但這是學習過程中至關重要的一步。 在此階段處理錯誤訊息和問題,可以教會您在安全的環境中程式設計的最重要技能之一:一定要注重細節。
除錯錯誤訊息非常重要。
事實是,錯誤訊息只是程式設計的一部分:無經驗和非常有經驗的開發人員都可以看到它們。 唯一的區別是,您對錯誤訊息的處理經驗越多,花費在修復錯誤訊息上的時間就越少。 原因如下:
- 隨著時間的流逝,您將學習如何讀取錯誤訊息並快速提取問題的相關詳細資訊。 第一次看到錯誤訊息時,您將需要一段時間來解碼其實際含義。 但是,當您看到數百條錯誤訊息後,您將能夠指出問題的位置以及解決問題所需的相關詳細資訊。
- 您應該從解決的每個錯誤訊息中學習。 不要只是為了解決錯誤而去解決錯誤; 你要從中學習,學習您要修復的程式碼出了什麼問題。 通過從每個錯誤中學習,下次您再次犯同樣的錯誤時,便可以更快地解決它。
- 最初,您可能會針對看到的每個錯誤訊息尋求幫助。 隨著時間的流逝,您將需要仔細檢查程式碼並進行智慧的Google搜尋,以減少尋求幫助的頻率。
剛開始有些人可能就會有一點小資訊來挖掘錯誤,然後構建一些小專案。然而有些其他人卻需要繼續的學習,因為每個人學習能力和學習速度不同,但是不管怎樣,經過這麼多的錯誤訊息之後,你的debug能力肯定經驗提升了。
在這一點上,有些人會感到自信-就像他們準備拋棄訓練輪並在沒有結構化指導的情況下開始建造東西一樣-會高興地跳入深淵。 其他學生將獲得更多教程,以尋求更多的特定領域知識,以尋求“全面理解”。 不幸的是,教程只會帶您走遠,而在教程或指南中卻找不到真正的信心。 真正的信心來自於努力解決自己不知道如何解決的問題,並自行找到解決方案。
關於程式設計的一個慘不忍睹的事實是:(自行翻譯吧,不忍心翻譯,怕翻譯不好破壞了這個慘痛的氛圍)
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.
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.
你應該隨時準備進入下一個階段,當你:
- 您已經看到足夠多的錯誤訊息,它們不再使您感到震驚。 相反,您知道如何理解它們的含義以及在程式碼中查詢問題的位置。
- 您是Google搜尋解決方案專家。 當您嘗試新增功能或看到令人困惑的錯誤訊息時,您會知道要搜尋什麼才能找到所需的資訊。
- 您可以引用在應用程式其他部分編寫的程式碼並遵循其中的模式和規律,而不必總是尋求逐步說明。
拐點(Inflection Point)(心態正確的2-4周)
拐點階段是學習編碼中最令人沮喪的階段之一,但在許多方面,它是唯一重要的階段。 這是您逐步使用教程並開始解決沒有人為您找到解決方案的問題的關鍵所在。
在某些時候,您會覺得自己還沒有準備好解決這個階段,並且想回到構建具有確切工作要做的輪廓的東西。 不要淪為這種心態。 您會感到沮喪的原因是:
在變形階段,您將比上一階段的編碼慢10到20倍。
您可能會開始質疑自己,想知道自己是否真的有能力成為一名程式設計師。 在此階段,不安全感和懷疑感很普遍。
儘管您會覺得自己正在以慢得多的速度學習和完成事情,但實際上,您正在實現最重要的事情。 當您對特定領域的知識日趨緊張時,您所學的都是關於程式知識。
程式知識是指自學過程中不瞭解的知識的能力。 當您需要實施一項新功能時,應該使用哪種型別的Google搜尋? 在這個時候,當您要完成許多事情時,您會感覺自己像在“黑暗中”。 學習如何自己找到光源至關重要,因為您永遠無法知道所要了解的一切,因此您需要能夠教給自己如何解決眼前的問題。
大多數人沒有意識到,要學習編碼,您需要學習特定領域知識和過程知識。
在您的餘生中,每天都要超越自己的極限
一旦找到立足點,一些軟體工程師就會留在舒適區域內。 這些型別的程式設計師被稱為維護程式設計師,而不是您應該努力做到的。 相反,您應該每天都努力超越自己的極限。 程式設計師辭職的最常見原因是“自從我解決了所有有趣的問題後,它不再具有挑戰性。”
而不是嘗試將編碼專案拖入您的舒適區域,您應該尋找當前技能之外的問題。 這是建立和擴充套件技能的唯一方法。
用Firehose學生的話說,當他通過拐點時:
我仍然覺得自己處於深淵! 知道那是我必須要做的事,我感到更加自在!
網站開發中,可能多個拐點會同時到來
當你能夠建立一個以任意資料庫驅動的應用時,那就意味著能夠構建任意儲存著相關資訊資料庫的很多網站了。網站開發稱之為:“mastering CRUD.”在此階段,只需遵循GitHub或部落格文章上提供的文件,您還應該能夠與任何第三方庫(例如ruby gem)整合。
演算法與資料結構的拐點要比網站開發的拐點要更難以琢磨一點,但是它更重要。征服了這一點的人不僅會精通所用的程式語言,而且會精通程式設計的基礎知識,並具有解決複雜編碼難題的豐富知識。
一個征服了演算法和資料結構的拐點,他將能夠:
- 寫任意的排序演算法
- 實現任何形式的連結串列
- 理解並能應用關於棧,佇列和樹的相關應用模型
- 使用遞迴和迭代來程式設計
簡而言之,一旦您通過了這個拐點,您將掌握資料操作並瞭解程式碼決策對效能的影響。 傳統的電腦科學學位只專注於讓學生超越演算法和資料結構的拐點。 許多大學都使用行業中通常不使用的程式語言(例如Scheme,Racket或LISP)來教授這種語言。
在大多數技術面試中,面試官會認為您已經通過了Web開發的轉折點,因為這樣做比較容易,並將他們的問題集中在評估您在演算法和資料結構上的技能。 這些問題通常集中在我們上面提到的主題上:排序演算法,反向連結列表以及使用堆疊,佇列和樹。
** 一旦開發人員通過了Web開發的拐點以及演算法和資料結構的拐點,他們便掌握基本上所有的關鍵點。**
這些開發人員將能夠解決與兩者相交的挑戰:需要在高階Web應用程式的上下文中構建的複雜演算法。 這是專業Web開發人員每天所做工作的核心。
當你通過這些拐點時:
你在學習任意領域的知識的時候,都將融會貫通,你可能一到兩週的時間就會學會一項新技能。
最終真正重要的是:
- 您對Web開發框架有紮實的瞭解
- 您可以熟練地使用任何程式語言編寫演算法複雜的程式碼
現在招人也希望開發人員具備紮實的Web開發和演算法能力。
當我在PayPal工作時,我的團隊聘請了一位沒有Rails經驗的高階Rails開發人員-他已經在Python,LISP和Perl中進行了大量編碼。 在幾天之內,他已經產生了巨大的影響。 並在數週內:產生巨大影響。 他很快就升任技術團隊主管,這是我參與過的最優秀的招聘決定之一。
不要盲目跟風,有人說最近AngularJS很火啊,JS也在上升期,我的回應一般是:“SO?”,你的目標是發現程式設計的拐點而且徹底弄懂它,一旦你弄清楚了,任何新語言新浪潮都將不是問題。
變得自力更生。 無需結構化指導即可學習新的編碼技能的能力意味著您不再需要等待任何人幫助您。 這意味著,對於您需要學習的大部分內容,您只需搜尋網際網路並閱讀各種您需要了解的材料。
這並不意味著您立即“知道”一切,而只是現在一切都“可以超出數字”,因此從本質上講,您是無法阻擋的。
在拐點你需要學習的技能
作為軟體開發人員,最好的參考資料是您已經編寫的類似程式碼。 當您完全理解所編寫的程式碼時,無需將所有詳細資訊提交到記憶體中。 這意味著在構建新功能時,您應該問自己的第一個問題是:“我之前是否構建過類似的東西?” 如果答案是肯定的,請重新檢視程式碼並逐行瀏覽程式碼。 重新向自己解釋正在做什麼,並問自己:“我現在可以使用相同的方法嗎?”
通過看視訊無法解釋特定於域的細節,因為它們花了很長時間才能觀看。 假設您想與Google Maps API整合。 一旦經歷過一次,便可以在不到一分鐘的時間內在GitHub中開啟程式碼,複製程式碼並將其貼上到新專案中。 而視訊通常需要10到30分鐘才能重新觀看。
儘可能有效地通過拐點的方法
因為通過拐點是學習編碼的最重要部分,所以您應該讓自己儘可能舒服一點。 這意味著您應該在進入教程階段時就開始準備,並在此期間保持正確的心態。
在教程階段,請停止學習結構化材料,並一路給自己挑戰難題。
- 對於每節課,請嘗試做超出您要學習的教程範圍之外的事情。 如果您要學習的教程提供了“挑戰”或“自我指導”的部分,請全部完成。 在沒有結構化指導的情況下,解決無指導的挑戰將為您提供重要的工作經驗。
- 儘量少使用教程。 在Firehose,我們經常引導學生學習如何整合某些寶石或使用提供的文件進行操作。 許多學生不僅會按照針對剛入門者的教程中說明的說明進行操作,還將遵循文件並使用這些教程作為備份。 請注意,文件將把您視為已通過拐點的開發人員。 獨自學習時,在GitHub上閱讀和遵循文件將變得很輕鬆,這將助您一臂之力。
- 專注於基本要素並重復使用。 瞭解如何執行常見操作,例如從頭開始分解應用程式,將新應用程式推送到GitHub和Heroku,以及儘早構建資料庫遷移。
推過拐點可能具有挑戰性。 以下是一些指導您完成操作的指標:
- 瞭解這是一個困難的過程,並且要對自己輕鬆一點。 另外,設定切合實際的期望。 您無法將學習教程的“超人”水平速度與自己學習事物的“蝸牛”速度相提並論。 請記住,您正在學習很多東西,但是在此階段,您正在學習一種嶄新的技能,可以自行解決新問題。
- 如果您在自信方面掙扎,請知道您的感覺是完全正常的。 繼續工作。 如果您仍在掙扎,請嘗試與最近通過拐點的人交談。 他們將能夠與您所處的位置相關聯,並向您保證您所經歷的只是暫時的。 始終如一地工作,但不要過度勞累。 在遊戲的這個階段,要知道您一天最多隻能工作6個小時左右。 在疲憊的狀態下工作只會延長您花費在拐點上的時間。
在此階段獲得信心的最好方法是克服任何疑問。 您的情緒可能開始變得像雲霄飛車。 有時,您會感到自己在生火,但是在同一個問題上苦苦掙扎15個小時之後,感到對立是很普遍的。
不知道是不是要花5分鐘或5個小時才能讓您感到沮喪,但是每次您接通電源併成功實施新功能時,急需信心。 在沒有任何幫助的情況下解決了一些棘手的問題之後,您會沉迷於在舒適區域之外建造東西的感覺。
如何知道自己是否已經通過了拐點
拐點過程的最後階段是驗收。 接受軟體開發是一個不斷學習的過程。 接受成功學習一切的感覺,意味著您應該開始考慮解決更復雜的問題。