專欄 | 九章算法程序員
相信不少 初學編程的朋友都有這樣的苦惱:爲何我感受本身基礎都掌握了,可是學校的課程結束後再進行編程時仍是什麼都不會呢?網址 | http://www.jiuzhang.com面試
一般新手程序員會以不一樣的方式來表達這個疑問,好比:算法
「我經過在線課程學習了Python,可是我仍是不知道怎麼用它來編程。」編程
「我知道這個理論,但是怎麼把它運用到個人代碼裏啊?」小程序
「我知道while循環,但我就是不知道什麼時候何地使用它們。」數組
「循環數組變量我都知道,然而我不知道如何將他們組合起來。」bash
如今在咱們來客觀的談一談這個問題。微信
首先要說的是,若是你以爲本身基礎都掌握了,可是就是不能在沒有他人指導的狀況下寫出一個程序,那麼我只能說你並無真正掌握這些基礎知識。網絡
我能理解你面對這一狀況心裏的沮喪,可是你要知道這是成爲一名優秀程序員必經的一個階段,因此即便你有千百個不肯意也不得不面對這個現實。數據結構
接下來咱們就來探討一下,爲何那麼多學生會在上完編程課程後不能「順利出師」,並會針對這個問題給你們一些小建議,但願能助你在優秀程序員的路上越走越遠。
1、形成這一問題的緣由
1.「人造」的編程環境
形成這個問題的一大因素是在線編碼課程爲學生提供了一個「人造」的編程環境,在這個「人造」的編程環境中學生們一般都會在一個已經包含了指令和提示的網頁上練習代碼。
然而這並非編程真正的打開方式。因此課程結束後,當沒有人再爲學生提供這樣一個「虛假」「溫馨」的編程環境時,面對真正的編程環境,學生們就開始不知所措,失去了目標和方向。
固然,在線課程提供這種「人造」的編程環境並非全然很差的。由於創建一個真正的編程環境一般是很複雜而且在真正的編程環境裏進行編程會讓初學者感到沮喪。而在線課程提供的這種「人造」的編程環境容許你不用創建起本身的編程環境就能夠得到許多編程經驗。
然而,這種「溫馨的」編程環境雖然在必定程度上減輕了你在初學編程階段的挫折苦痛,可是它也只是將學習編程的挫折苦痛攔截到課程結束後,等課程一結束,它們就會出如今你面前。
2.過分的指導
當你結束了一個在線課程,或是學習完一本書,或是在現實編程中接受他人建議時,你都能從中獲得不少的提示和指導。在這種狀況下,你甚至能夠在剛拿到一個程序時就能知道你要輸入什麼甚至知道這個程序的最終結果。
然而當你試圖本身創建一個項目的時候,你只能看到一片空白的輸入框:沒有指令、沒有提示、更沒有人告訴你下一行要輸入什麼。像這樣從一個簡單的環境跳到一個困難的環境,你天然會感到惶恐不安甚至自我懷疑。
接受過分指導的另外一個後果是:學習了語法但沒有學習到編程的概念。
語法就是你輸入的特定編程語言的文本,好比if和 while。可是每種語言的語法都是不盡相同的,而你在學習編程時,不僅是要學習編程語言的語法,更重要的是要學習他們的概念,好比分支和迭代。
瞭解概念能讓你理解代碼實際上能作成什麼,以及代碼如何用不一樣的語言實現。
因此若是有人說他們知道while循環,可是不知道什麼時候何地使用它的話,那他們確定尚未真正理解迭代的概念。
可是,我並無說接受指導是很差的。由於當你剛開始學習的時候,你確定須要有人來指點迷津。若是完徹底全自學沒有接收到任何建議指導的話,你可能會像一隻無頭蒼蠅同樣在編程世界裏盲目飛行。
而在你的編程生涯的每一個階段,你也都須要有人來指導你,可是必定不要接受過多的指導。由於做爲初學者,若是接受了過多的指導就會給你一個錯覺:編程很簡單。這就會形成當你不能成功地獨自寫出程序時,對本身的編程人生感到懷疑。
九章算法全部在線課程都配套課後算法實戰做業,經過 lintcode online judge, 爲你創造獨立完成代碼的良好環境。學完課程後,同步獨立完成做業,能夠收穫意想不到的進步。
2、如何解決這個問題
1.建立一個真正的編程環境
每種編程語言須要的編程環境都是不一樣的。
想要建立一個真正的編程環境,首先,你須要一個文本編輯器或一個IDE(集成開發環境)。而後你須要找出對你正在學習的語言來講最適合的編輯器並安裝它。
其次,你須要知道如何建立並運行一個包含代碼的文件。
若是你是使用一個IDE來做爲你的文本編輯器,例如:Visual Studio、Xcode或Eclipse,那麼這個功能就會被構建到IDE中。你就須要瞭解如何建立一個新項目以及須要點擊什麼按鈕來運行代碼。
可是若是你沒有使用IDE,那麼你可能就須要學習如何利用命令行來運行代碼。你能夠找一些入門指導或者上YouTube看一些免費的教學視頻來學習使用命令行。
最後,一旦你能夠編寫代碼,而且可以正常運行程序,那麼基本上你就開始正式步入專業程序員的道路了。
2.從刷算法題開始,瘋狂積累代碼量
當你仍是一個新手的時候,你須要瘋狂的積累你的代碼量,你能夠從基本的問題出發,作一些簡單的問題,怎麼輸入數據,怎麼輸出數據,而後熟悉各類數據結構,各類常見算法,瘋狂的刷題。
好比,lintcode 就是一個很不錯的刷題網站不會怎麼辦!看答案。推薦在這裏對照查看lintcode算法題的答案:http://www.jiuzhang.com/solution/ 。先了解答案是怎麼寫的,而後本身實現一遍。
通常來講,刷題應該按部就班,從易到難。你能夠先從easy難度的問題作起,每個程序也就20-40行左右,甚至你能夠一旦AC,反覆提交,以加強自信心,雖然這只是一個玩笑,可是它可讓你提升你對編程的自信,對編程的喜好,當你有自信的時候,你才能真正的把一件事情作好。當你反覆解決一個又一個的問題的時候,你要告訴本身我是個天生的編程者!而後你就能夠挑戰更高難度的問題,當你積累到10W以上的代碼量的時候,你會發現你會有一個質變。一切將變的順手。當之前要想半天的語句,如今信手拈來。恭喜你跨出了很重要的一步。
3.從小項目作起
嘗試去作一些稍微超過自身水平的項目並非一件壞事,由於你可能會發現它頗有趣而且它能激勵你學習更多的東西;可是從另外的角度來看,若是浪費了很多時間項目卻毫無進展,也會讓你感到灰心、沮喪。
一千我的就有一千個哈姆雷特,適合別人的方法不必定就適合你。因此當激勵法對你起副作用的時候,也許你就該考慮從基礎的小項目作起了,畢竟全部東西都是從零開始的。
剛開始的時候,你能夠編寫一些基於文本的程序,由於編寫這種程序比編寫其餘程序相對來講更容易一些,它只須要掌握:如何在屏幕上顯示字符串;以及如何獲取用戶輸入的字符串。
確實基於文本的程序寫出來並不像3D圖形的程序寫出來那樣酷炫。然而若是你想要寫3D圖形的程序,你就必須對集合、線性代數和微分都有必定程度的瞭解。而即便是寫出一個帶有按鈕和文本框的普通GUI也是很難的,更別說寫出一個3D圖形的程序了。
固然這也必定程度上取決於你所學習的編程語言,也許你所學習的編程語言不須要你懂多少數學,可是須要你多多少少對面向對象的程序設計和複雜的對象圖有較爲深刻的理解。
個人建議是:先設計一段時間的文字遊戲。好比作一些像「猜數字」、「多選題」等小遊戲來進行一場小小的文字洗禮;又或者,設計一些能夠在現實生活中派上用場的小程序,能夠是一個時間跟蹤器,又或者是在你的學習或工做上可以幫助到你的計算公式;而後你就能夠經過這些小項目來深刻學習你所選擇的編程語言的全部特性。
4. 練習白板寫代碼
你必須不須要任何指令地從零開始編寫本身的代碼。也就是說你要從一個空白文檔(白板、白紙等)開始,而後在不遵從任何指示的狀況下本身敲出每行代碼。
從這一步開始意味着你已經準備好迎接腥風血雨了。由於後面你將花費大量的時間進行調試,並要嘗試理解每一個bug。可是在每次檢測和修復bug的時候,你的編程技能都能獲得相應提升,而且你也能得到真正的編程經驗。這就是做爲程序員學習和成長的方式。
固然你也能夠經過查看別人的代碼來獲取經驗,可是你不能直接複製黏貼,由於若是你直接複製黏貼的話,這樣的學習將毫無心義。你要作到的是:認真分析別人的代碼;得出它是如何正常運行的結論;而後再運用獲取的經驗來進行獨立編程。
5.不懂就問:懂得如何尋求幫助
在學習編程的過程當中,你確定會遇到一些你本身沒法解決的問題和一些你沒法靠本身修復的錯誤。雖然這只是你學習編程的一部分,但若是你已經花了2h+來嘗試解決你的問題未果時,爲了提升工做效率,就應該轉向尋求專業幫助了。
然而有些學生在學習編程時會在沒有嘗試過本身解決問題的狀況下馬上尋求別人的幫助,這無論是在IT領域仍是其餘領域,都是不被同意的。由於無論出現了什麼難題,都要本身先去盡力解決纔有學習的意義。否則最終仍是回到了「靠着別人的指導過活最終本身什麼也沒學到」這個問題上。
那麼咱們應該如何尋求幫助呢?
基本的問題你能夠先google一下,網絡世界那麼大,單靠這個你就能解決很多問題。
若是你遇到一些靠我的之力沒法解決的問題,要注意的是即便他人幫助你解決問題,也不要直接把別人的答案複製黏貼到你的問題上。你要作的是分析答案並瞭解錯誤背後的緣由,只有這樣當你下次再遇到相同的錯誤的時候,才能靠本身修復錯誤。
另外,若是你常常遇到一些靠我的之力沒法解決的問題,最有可能的緣由是你作的項目太大了以致於遠遠超過了你的自身水平,這裏就要重申一下上一條建議:從小項目作起,一步一步提高本身的水平。
6.正確的提出問題並尋求幫助
也常常會有初學者羞於提問或拒絕提問,很大一部分緣由是他們認爲編程社區裏面的那些大神有些不友好甚至態度有些使人生畏,因此他們不想跟這些人打交道,這對於初學者來講是很是可怕的事情。
其實,雖然有些專業的程序員會在回答時有些「直言不諱」,可是若是你以正確的方式提出你的問題,你會發現社區裏的不少大神是很是友好的,而且他們每每可以一針見血的點出你的問題所在,同時能給出解決方案。
若是你根據下面的指導提出問題,確定能夠吸引不少友好的程序員幫助你解決問題。可能還能防止一些雖然脾氣有些暴躁可是很善良的程序員一邊幫你解決問題一邊對你發脾氣。
發佈出確切的錯誤點。這是最重要的一個部分,由於若是回答問題的人沒看到確切的錯誤信息,就意味着他們要浪費本身的時間來找出你的程序的錯誤所在再給予解決方案。
若是你也不知道確切的錯誤信息,那麼請說明你推測的會發生錯誤的部分,和實際發生的狀況。好比:「我但願輸出5,但卻實際輸出了7」。一般,問題不出如今你的代碼中,而出如今你指望和實際的差別中。因此若是你沒有闡述你指望獲得的結果,你能獲得的回答就只有相似「這代碼看起來很好啊」或者「這代碼有什麼問題啊」這樣的回答。
粘貼出你的全部代碼。通常狀況下,看不到完整的代碼來調試問題是很困難的。若是代碼不是太多,最好的提問方式就是將代碼完整粘貼到Github Gist和 Pastebin.com 中,而後把相關連接放在問題裏。
複製出來的代碼格式要正確,而不是簡單的複製黏貼。你要學會如何對你的代碼進行排版,使它看起來更便於閱讀。
舉個例子,正確的複製格式它應該是:
def foobar
puts 1 + 2 / 3
end
複製代碼
而不是:
def foobar
puts 1 + 2 / 3
end
複製代碼
指出你已嘗試過的方法。這證實你已經盡力了,而不是有問題沒有進行思考就直接扔出來讓你們幫忙。
使用正確的編程術語。雖然你還只是一個初學者,並不能將全部的專業術語都使用正確。可是你最好仍是盡本身所能使用正確的專業術語。由於努力學習經常使用專業術語並正確使用它們對你之後的發展也是頗有幫助的。
3、總結
最後總結一下這篇文章所提到的建議
1 給本身建立一個真正的編程環境,使用IDE或者空白文本編輯器(白板)來編寫程序。
2 必定要從頭至尾本身編寫全部的代碼,不要在沒有理解的狀況下直接複製黏貼他人的代碼來欺騙本身。
3 從小項目開始作起,編寫一些基於文本的程序來練習你正在學習的編程語言,而後再慢慢的進行一些更大更復雜的項目。
4 瘋狂的練習,編寫大量的代碼。在學習理論知識的時候就要不斷地嘗試把理論應用到本身的代碼當中。學習、實踐;學習、實踐;學習、實踐······
5 要先學會本身解決問題,當本身解決無果,陷入困境時,要懂得如何尋求幫助。
6 不要羞於提問或拒絕提問,要懂得運用正確的方式尋求他人的幫助。
毋庸置疑,學習編程並不容易。特別是當你剛剛上完編程課程,開始走上本身的獨立編程之路時,這種感受就會更加的強烈。可是請你不要就此質疑本身的編程能力,除了一小部分天才以外,誰不是一步一步從小菜鳥走上大神之路的呢。
最後,在這裏也祝願你們都能在編程之路上愉快的越走越遠。