專欄 | 九章演算法
相信很多初學程式設計的朋友都有這樣的苦惱:為什麼我感覺自己基礎都掌握了,但是學校的課程結束後再進行程式設計時還是什麼都不會呢?網址 | http://www.jiuzhang.com
通常新手程式設計師會以不同的方式來表達這個疑問,比如:
-
“我通過線上課程學習了Python,但是我還是不知道怎麼用它來程式設計。”
-
“我知道這個理論,可是怎麼把它運用到我的程式碼裡啊?”
-
“我知道while迴圈,但我就是不知道何時何地使用它們。”
-
“迴圈陣列變數我都知道,然而我不知道如何將他們組合起來。”
現在在我們來客觀的談一談這個問題。
現在在我們來客觀的談一談這個問題。
首先要說的是,如果你覺得自己基礎都掌握了,但是就是不能在沒有他人指導的情況下寫出一個程式,那麼我只能說你並沒有真正掌握這些基礎知識。
我能理解你面對這一情況內心的沮喪,但是你要知道這是成為一名優秀程式設計師必經的一個階段,所以即使你有千百個不願意也不得不面對這個現實。
接下來我們就來探討一下,為什麼那麼多學生會在上完程式設計課程後不能“順利出師”,並會針對這個問題給大家一些小建議,希望能助你在優秀程式設計師的路上越走越遠。
一、造成這一問題的原因
1.“人造”的程式設計環境
造成這個問題的一大因素是線上編碼課程為學生提供了一個“人造”的程式設計環境,在這個“人造”的程式設計環境中學生們通常都會在一個已經包含了指令和提示的網頁上練習程式碼。
然而這並不是程式設計真正的開啟方式。所以課程結束後,當沒有人再為學生提供這樣一個“虛假”“舒適”的程式設計環境時,面對真正的程式設計環境,學生們就開始不知所措,失去了目標和方向。
當然,線上課程提供這種“人造”的程式設計環境並不是全然不好的。因為建立一個真正的程式設計環境通常是很複雜並且在真正的程式設計環境裡進行程式設計會讓初學者感到沮喪。而線上課程提供的這種“人造”的程式設計環境允許你不用建立起自己的程式設計環境就可以獲得許多程式設計經驗。
然而,這種“舒適的”程式設計環境雖然在一定程度上減輕了你在初學程式設計階段的挫折苦痛,但是它也只是將學習程式設計的挫折苦痛攔截到課程結束後,等課程一結束,它們就會出現在你面前。
2.過度的指導
當你結束了一個線上課程,或是學習完一本書,或是在現實程式設計中接受他人建議時,你都能從中得到很多的提示和指導。在這種情況下,你甚至可以在剛拿到一個程式時就能知道你要輸入什麼甚至知道這個程式的最終結果。
然而當你試圖自己建立一個專案的時候,你只能看到一片空白的輸入框:沒有指令、沒有提示、更沒有人告訴你下一行要輸入什麼。像這樣從一個簡單的環境跳到一個困難的環境,你自然會感到驚慌失措甚至自我懷疑。
接受過度指導的另一個後果是:學習了語法但沒有學習到程式設計的概念。
語法就是你輸入的特定程式語言的文字,比如if和 while。但是每種語言的語法都是不盡相同的,而你在學習程式設計時,不只是要學習程式語言的語法,更重要的是要學習他們的概念,比如分支和迭代。
瞭解概念能讓你理解程式碼實際上能做成什麼,以及程式碼如何用不同的語言實現。
所以如果有人說他們知道while迴圈,但是不知道何時何地使用它的話,那他們肯定還沒有真正理解迭代的概念。
但是,我並沒有說接受指導是不好的。因為當你剛開始學習的時候,你肯定需要有人來指點迷津。如果完完全全自學沒有接收到任何建議指導的話,你可能會像一隻無頭蒼蠅一樣在程式設計世界裡盲目飛行。
而在你的程式設計生涯的每個階段,你也都需要有人來指導你,但是一定不要接受過多的指導。因為作為初學者,如果接受了過多的指導就會給你一個錯覺:程式設計很簡單。這就會造成當你不能成功地獨自寫出程式時,對自己的程式設計人生感到懷疑。
九章演算法所有線上課程都配套課後演算法實戰作業,通過 lintcode online judge, 為你創造獨立完成程式碼的良好環境。學完課程後,同步獨立完成作業,可以收穫意想不到的進步。
二、如何解決這個問題
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
複製程式碼
-
指出你已嘗試過的方法。這證明你已經盡力了,而不是有問題沒有進行思考就直接扔出來讓大家幫忙。
-
使用正確的程式設計術語。雖然你還只是一個初學者,並不能將所有的專業術語都使用正確。但是你最好還是儘自己所能使用正確的專業術語。因為努力學習常用專業術語並正確使用它們對你以後的發展也是很有幫助的。
三、總結
最後總結一下這篇文章所提到的建議
1 給自己建立一個真正的程式設計環境,使用IDE或者空白文字編輯器(白板)來編寫程式。
2 一定要從頭到尾自己編寫所有的程式碼,不要在沒有理解的情況下直接複製黏貼他人的程式碼來欺騙自己。
3 從小專案開始做起,編寫一些基於文字的程式來練習你正在學習的程式語言,然後再慢慢的進行一些更大更復雜的專案。
4 瘋狂的練習,編寫大量的程式碼。在學習理論知識的時候就要不斷地嘗試把理論應用到自己的程式碼當中。學習、實踐;學習、實踐;學習、實踐······
5 要先學會自己解決問題,當自己解決無果,陷入困境時,要懂得如何尋求幫助。
6 不要羞於提問或拒絕提問,要懂得運用正確的方式尋求他人的幫助。
毋庸置疑,學習程式設計並不容易。特別是當你剛剛上完程式設計課程,開始走上自己的獨立程式設計之路時,這種感覺就會更加的強烈。但是請你不要就此質疑自己的程式設計能力,除了一小部分天才之外,誰不是一步一步從小菜鳥走上大神之路的呢。
最後,在這裡也祝願大家都能在程式設計之路上愉快的越走越遠。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等