相信很多初學(xué)編程的朋友都有這樣的苦惱:為什么我感覺(jué)自己基礎(chǔ)都掌握了,但是學(xué)校的課程結(jié)束后再進(jìn)行編程時(shí)還是什么都不會(huì)呢?
通常新手程序員會(huì)以不同的方式來(lái)表達(dá)這個(gè)疑問(wèn),比如:
“我通過(guò)在線課程學(xué)習(xí)了Python,但是我還是不知道怎么用它來(lái)編程?!?/p>
“我知道這個(gè)理論,可是怎么把它運(yùn)用到我的代碼里???”
“我知道while循環(huán),但我就是不知道何時(shí)何地使用它們。”
“循環(huán)數(shù)組變量我都知道,然而我不知道如何將他們組合起來(lái)?!?/p>
現(xiàn)在在我們來(lái)客觀的談一談這個(gè)問(wèn)題。
首先要說(shuō)的是,如果你覺(jué)得自己基礎(chǔ)都掌握了,但是就是不能在沒(méi)有他人指導(dǎo)的情況下寫出一個(gè)程序,那么我只能說(shuō)你并沒(méi)有真正掌握這些基礎(chǔ)知識(shí)。
我能理解你面對(duì)這一情況內(nèi)心的沮喪,但是你要知道這是成為一名優(yōu)秀程序員必經(jīng)的一個(gè)階段,所以即使你有千百個(gè)不愿意也不得不面對(duì)這個(gè)現(xiàn)實(shí)。
接下來(lái)我們就來(lái)探討一下,為什么那么多學(xué)生會(huì)在上完編程課程后不能“順利出師”,并會(huì)針對(duì)這個(gè)問(wèn)題給大家一些小建議,希望能助你在優(yōu)秀程序員的路上越走越遠(yuǎn)。
一、造成這一問(wèn)題的原因
1.“人造”的編程環(huán)境
造成這個(gè)問(wèn)題的一大因素是在線編碼課程為學(xué)生提供了一個(gè)“人造”的編程環(huán)境,在這個(gè)“人造”的編程環(huán)境中學(xué)生們通常都會(huì)在一個(gè)已經(jīng)包含了指令和提示的網(wǎng)頁(yè)上練習(xí)代碼。
然而這并不是編程真正的打開(kāi)方式。所以課程結(jié)束后,當(dāng)沒(méi)有人再為學(xué)生提供這樣一個(gè)“虛假”“舒適”的編程環(huán)境時(shí),面對(duì)真正的編程環(huán)境,學(xué)生們就開(kāi)始不知所措,失去了目標(biāo)和方向。
當(dāng)然,在線課程提供這種“人造”的編程環(huán)境并不是全然不好的。因?yàn)榻⒁粋€(gè)真正的編程環(huán)境通常是很復(fù)雜并且在真正的編程環(huán)境里進(jìn)行編程會(huì)讓初學(xué)者感到沮喪。而在線課程提供的這種“人造”的編程環(huán)境允許你不用建立起自己的編程環(huán)境就可以獲得許多編程經(jīng)驗(yàn)。
然而,這種“舒適的”編程環(huán)境雖然在一定程度上減輕了你在初學(xué)編程階段的挫折苦痛,但是它也只是將學(xué)習(xí)編程的挫折苦痛攔截到課程結(jié)束后,等課程一結(jié)束,它們就會(huì)出現(xiàn)在你面前。
2.過(guò)度的指導(dǎo)
當(dāng)你結(jié)束了一個(gè)在線課程,或是學(xué)習(xí)完一本書,或是在現(xiàn)實(shí)編程中接受他人建議時(shí),你都能從中得到很多的提示和指導(dǎo)。在這種情況下,你甚至可以在剛拿到一個(gè)程序時(shí)就能知道你要輸入什么甚至知道這個(gè)程序的最終結(jié)果。
然而當(dāng)你試圖自己建立一個(gè)項(xiàng)目的時(shí)候,你只能看到一片空白的輸入框:沒(méi)有指令、沒(méi)有提示、更沒(méi)有人告訴你下一行要輸入什么。像這樣從一個(gè)簡(jiǎn)單的環(huán)境跳到一個(gè)困難的環(huán)境,你自然會(huì)感到驚慌失措甚至自我懷疑。
接受過(guò)度指導(dǎo)的另一個(gè)后果是:學(xué)習(xí)了語(yǔ)法但沒(méi)有學(xué)習(xí)到編程的概念。
語(yǔ)法就是你輸入的特定編程語(yǔ)言的文本,比如if和 while。但是每種語(yǔ)言的語(yǔ)法都是不盡相同的,而你在學(xué)習(xí)編程時(shí),不只是要學(xué)習(xí)編程語(yǔ)言的語(yǔ)法,更重要的是要學(xué)習(xí)他們的概念,比如分支和迭代。
了解概念能讓你理解代碼實(shí)際上能做成什么,以及代碼如何用不同的語(yǔ)言實(shí)現(xiàn)。
所以如果有人說(shuō)他們知道while循環(huán),但是不知道何時(shí)何地使用它的話,那他們肯定還沒(méi)有真正理解迭代的概念。
但是,我并沒(méi)有說(shuō)接受指導(dǎo)是不好的。因?yàn)楫?dāng)你剛開(kāi)始學(xué)習(xí)的時(shí)候,你肯定需要有人來(lái)指點(diǎn)迷津。如果完完全全自學(xué)沒(méi)有接收到任何建議指導(dǎo)的話,你可能會(huì)像一只無(wú)頭蒼蠅一樣在編程世界里盲目飛行。
而在你的編程生涯的每個(gè)階段,你也都需要有人來(lái)指導(dǎo)你,但是一定不要接受過(guò)多的指導(dǎo)。因?yàn)樽鳛槌鯇W(xué)者,如果接受了過(guò)多的指導(dǎo)就會(huì)給你一個(gè)錯(cuò)覺(jué):編程很簡(jiǎn)單。這就會(huì)造成當(dāng)你不能成功地獨(dú)自寫出程序時(shí),對(duì)自己的編程人生感到懷疑。
九章算法所有在線課程都配套課后算法實(shí)戰(zhàn)作業(yè),通過(guò)?lintcode online judge, 為你創(chuàng)造獨(dú)立完成代碼的良好環(huán)境。學(xué)完課程后,同步獨(dú)立完成作業(yè),可以收獲意想不到的進(jìn)步。
二、如何解決這個(gè)問(wèn)題
1.創(chuàng)建一個(gè)真正的編程環(huán)境
每種編程語(yǔ)言需要的編程環(huán)境都是不同的。
想要?jiǎng)?chuàng)建一個(gè)真正的編程環(huán)境,首先,你需要一個(gè)文本編輯器或一個(gè)IDE(集成開(kāi)發(fā)環(huán)境)。然后你需要找出對(duì)你正在學(xué)習(xí)的語(yǔ)言來(lái)說(shuō)最適合的編輯器并安裝它。
其次,你需要知道如何創(chuàng)建并運(yùn)行一個(gè)包含代碼的文件。
如果你是使用一個(gè)IDE來(lái)作為你的文本編輯器,例如:Visual Studio、Xcode或Eclipse,那么這個(gè)功能就會(huì)被構(gòu)建到IDE中。你就需要了解如何創(chuàng)建一個(gè)新項(xiàng)目以及需要點(diǎn)擊什么按鈕來(lái)運(yùn)行代碼。
但是如果你沒(méi)有使用IDE,那么你可能就需要學(xué)習(xí)如何利用命令行來(lái)運(yùn)行代碼。你可以找一些入門指導(dǎo)或者上YouTube看一些免費(fèi)的教學(xué)視頻來(lái)學(xué)習(xí)使用命令行。
最后,一旦你可以編寫代碼,并且能夠正常運(yùn)行程序,那么基本上你就開(kāi)始正式步入專業(yè)程序員的道路了。
2.從刷算法題開(kāi)始,瘋狂積累代碼量
當(dāng)你還是一個(gè)新手的時(shí)候,你需要瘋狂的積累你的代碼量,你可以從基本的問(wèn)題出發(fā),做一些簡(jiǎn)單的問(wèn)題,怎么輸入數(shù)據(jù),怎么輸出數(shù)據(jù),然后熟悉各種數(shù)據(jù)結(jié)構(gòu),各種常見(jiàn)算法,瘋狂的刷題。
一般來(lái)說(shuō),刷題應(yīng)該循序漸進(jìn),從易到難。你可以先從easy難度的問(wèn)題做起,每一個(gè)程序也就20-40行左右,甚至你可以一旦AC,反復(fù)提交,以增強(qiáng)自信心,雖然這只是一個(gè)玩笑,但是它可以讓你提高你對(duì)編程的自信,對(duì)編程的喜愛(ài),當(dāng)你有自信的時(shí)候,你才能真正的把一件事情做好。當(dāng)你反復(fù)解決一個(gè)又一個(gè)的問(wèn)題的時(shí)候,你要告訴自己我是個(gè)天生的編程者!然后你就可以挑戰(zhàn)更高難度的問(wèn)題,當(dāng)你積累到10W以上的代碼量的時(shí)候,你會(huì)發(fā)現(xiàn)你會(huì)有一個(gè)質(zhì)變。一切將變的順手。當(dāng)以前要想半天的語(yǔ)句,現(xiàn)在信手拈來(lái)。恭喜你跨出了很重要的一步。
3.從小項(xiàng)目做起
嘗試去做一些稍微超過(guò)自身水平的項(xiàng)目并不是一件壞事,因?yàn)槟憧赡軙?huì)發(fā)現(xiàn)它很有趣并且它能激勵(lì)你學(xué)習(xí)更多的東西;但是從另外的角度來(lái)看,如果浪費(fèi)了不少時(shí)間項(xiàng)目卻毫無(wú)進(jìn)展,也會(huì)讓你感到灰心、沮喪。
一千個(gè)人就有一千個(gè)哈姆雷特,適合別人的方法不一定就適合你。所以當(dāng)激勵(lì)法對(duì)你起反作用的時(shí)候,也許你就該考慮從基礎(chǔ)的小項(xiàng)目做起了,畢竟所有東西都是從零開(kāi)始的。
剛開(kāi)始的時(shí)候,你可以編寫一些基于文本的程序,因?yàn)榫帉戇@種程序比編寫其他程序相對(duì)來(lái)說(shuō)更容易一些,它只需要掌握:如何在屏幕上顯示字符串;以及如何獲取用戶輸入的字符串。
確實(shí)基于文本的程序?qū)懗鰜?lái)并不像3D圖形的程序?qū)懗鰜?lái)那樣酷炫。然而如果你想要寫3D圖形的程序,你就必須對(duì)集合、線性代數(shù)和微分都有一定程度的了解。而即使是寫出一個(gè)帶有按鈕和文本框的普通GUI也是很難的,更別說(shuō)寫出一個(gè)3D圖形的程序了。
當(dāng)然這也一定程度上取決于你所學(xué)習(xí)的編程語(yǔ)言,也許你所學(xué)習(xí)的編程語(yǔ)言不需要你懂多少數(shù)學(xué),但是需要你多多少少對(duì)面向?qū)ο蟮某绦蛟O(shè)計(jì)和復(fù)雜的對(duì)象圖有較為深入的理解。
我的建議是:先設(shè)計(jì)一段時(shí)間的文字游戲。比如做一些像“猜數(shù)字”、“多選題”等小游戲來(lái)進(jìn)行一場(chǎng)小小的文字洗禮;又或者,設(shè)計(jì)一些可以在現(xiàn)實(shí)生活中派上用場(chǎng)的小程序,可以是一個(gè)時(shí)間跟蹤器,又或者是在你的學(xué)習(xí)或工作上能夠幫助到你的計(jì)算公式;然后你就可以通過(guò)這些小項(xiàng)目來(lái)深入學(xué)習(xí)你所選擇的編程語(yǔ)言的所有特性。
4. 練習(xí)白板寫代碼
你必須不需要任何指令地從零開(kāi)始編寫自己的代碼。也就是說(shuō)你要從一個(gè)空白文檔(白板、白紙等)開(kāi)始,然后在不聽(tīng)從任何指示的情況下自己敲出每行代碼。
從這一步開(kāi)始意味著你已經(jīng)準(zhǔn)備好迎接腥風(fēng)血雨了。因?yàn)楹竺婺銓⒒ㄙM(fèi)大量的時(shí)間進(jìn)行調(diào)試,并要嘗試?yán)斫饷總€(gè)bug。但是在每次檢測(cè)和修復(fù)bug的時(shí)候,你的編程技能都能得到相應(yīng)提高,并且你也能獲得真正的編程經(jīng)驗(yàn)。這就是作為程序員學(xué)習(xí)和成長(zhǎng)的方式。
當(dāng)然你也可以通過(guò)查看別人的代碼來(lái)獲取經(jīng)驗(yàn),但是你不能直接復(fù)制黏貼,因?yàn)槿绻阒苯訌?fù)制黏貼的話,這樣的學(xué)習(xí)將毫無(wú)意義。你要做到的是:認(rèn)真分析別人的代碼;得出它是如何正常運(yùn)行的結(jié)論;然后再運(yùn)用獲取的經(jīng)驗(yàn)來(lái)進(jìn)行獨(dú)立編程。
5.不懂就問(wèn):懂得如何尋求幫助
在學(xué)習(xí)編程的過(guò)程中,你肯定會(huì)遇到一些你自己無(wú)法解決的問(wèn)題和一些你無(wú)法靠自己修復(fù)的錯(cuò)誤。雖然這只是你學(xué)習(xí)編程的一部分,但如果你已經(jīng)花了2h+來(lái)嘗試解決你的問(wèn)題未果時(shí),為了提高工作效率,就應(yīng)該轉(zhuǎn)向?qū)で髮I(yè)幫助了。
然而有些學(xué)生在學(xué)習(xí)編程時(shí)會(huì)在沒(méi)有嘗試過(guò)自己解決問(wèn)題的情況下立刻尋求別人的幫助,這不管是在IT領(lǐng)域還是其他領(lǐng)域,都是不被贊成的。因?yàn)椴还艹霈F(xiàn)了什么難題,都要自己先去盡力解決才有學(xué)習(xí)的意義。不然最終還是回到了“靠著別人的指導(dǎo)過(guò)活最終自己什么也沒(méi)學(xué)到”這個(gè)問(wèn)題上。
那么我們應(yīng)該如何尋求幫助呢?
基本的問(wèn)題你可以先google一下,網(wǎng)絡(luò)世界那么大,單靠這個(gè)你就能解決不少問(wèn)題。
如果你遇到一些靠個(gè)人之力無(wú)法解決的問(wèn)題,要注意的是即使他人幫助你解決問(wèn)題,也不要直接把別人的答案復(fù)制黏貼到你的問(wèn)題上。你要做的是分析答案并了解錯(cuò)誤背后的原因,只有這樣當(dāng)你下次再遇到相同的錯(cuò)誤的時(shí)候,才能靠自己修復(fù)錯(cuò)誤。
另外,如果你經(jīng)常遇到一些靠個(gè)人之力無(wú)法解決的問(wèn)題,最有可能的原因是你做的項(xiàng)目太大了以至于遠(yuǎn)遠(yuǎn)超過(guò)了你的自身水平,這里就要重申一下上一條建議:從小項(xiàng)目做起,一步一步提升自己的水平。
6.正確的提出問(wèn)題并尋求幫助
也經(jīng)常會(huì)有初學(xué)者羞于提問(wèn)或拒絕提問(wèn),很大一部分原因是他們認(rèn)為編程社區(qū)里面的那些大神有些不友好甚至態(tài)度有些令人生畏,所以他們不想跟這些人打交道,這對(duì)于初學(xué)者來(lái)說(shuō)是非常可怕的事情。
其實(shí),雖然有些專業(yè)的程序員會(huì)在回答時(shí)有些“直言不諱”,但是如果你以正確的方式提出你的問(wèn)題,你會(huì)發(fā)現(xiàn)社區(qū)里的很多大神是非常友好的,并且他們往往能夠一針見(jiàn)血的點(diǎn)出你的問(wèn)題所在,同時(shí)能給出解決方案。
如果你根據(jù)下面的指導(dǎo)提出問(wèn)題,肯定可以吸引很多友好的程序員幫助你解決問(wèn)題??赡苓€能防止一些雖然脾氣有些暴躁但是很善良的程序員一邊幫你解決問(wèn)題一邊對(duì)你發(fā)脾氣。
發(fā)布出確切的錯(cuò)誤點(diǎn)。這是最重要的一個(gè)部分,因?yàn)槿绻卮饐?wèn)題的人沒(méi)看到確切的錯(cuò)誤信息,就意味著他們要浪費(fèi)自己的時(shí)間來(lái)找出你的程序的錯(cuò)誤所在再給予解決方案。
如果你也不知道確切的錯(cuò)誤信息,那么請(qǐng)說(shuō)明你推測(cè)的會(huì)發(fā)生錯(cuò)誤的部分,和實(shí)際發(fā)生的情況。比如:“我希望輸出5,但卻實(shí)際輸出了7”。通常,問(wèn)題不出現(xiàn)在你的代碼中,而出現(xiàn)在你期望和實(shí)際的差異中。所以如果你沒(méi)有闡述你期望得到的結(jié)果,你能得到的回答就只有類似“這代碼看起來(lái)很好啊”或者“這代碼有什么問(wèn)題啊”這樣的回答。
粘貼出你的所有代碼。一般情況下,看不到完整的代碼來(lái)調(diào)試問(wèn)題是很困難的。如果代碼不是太多,最好的提問(wèn)方式就是將代碼完整粘貼到Github Gist和?http://Pastebin.com?中,然后把相關(guān)鏈接放在問(wèn)題里。
復(fù)制出來(lái)的代碼格式要正確,而不是簡(jiǎn)單的復(fù)制黏貼。你要學(xué)會(huì)如何對(duì)你的代碼進(jìn)行排版,使它看起來(lái)更便于閱讀。
舉個(gè)例子,正確的復(fù)制格式它應(yīng)該是:
def foobar
puts 1 + 2 / 3 end
而不是:
def foobar
puts 1 + 2 / 3
end
指出你已嘗試過(guò)的方法。這證明你已經(jīng)盡力了,而不是有問(wèn)題沒(méi)有進(jìn)行思考就直接扔出來(lái)讓大家?guī)兔Α?/p>
使用正確的編程術(shù)語(yǔ)。雖然你還只是一個(gè)初學(xué)者,并不能將所有的專業(yè)術(shù)語(yǔ)都使用正確。但是你最好還是盡自己所能使用正確的專業(yè)術(shù)語(yǔ)。因?yàn)榕W(xué)習(xí)常用專業(yè)術(shù)語(yǔ)并正確使用它們對(duì)你以后的發(fā)展也是很有幫助的。
三、總結(jié)
最后總結(jié)一下這篇文章所提到的建議
給自己創(chuàng)建一個(gè)真正的編程環(huán)境,使用IDE或者空白文本編輯器(白板)來(lái)編寫程序。
一定要從頭到尾自己編寫所有的代碼,不要在沒(méi)有理解的情況下直接復(fù)制黏貼他人的代碼來(lái)欺騙自己。
從小項(xiàng)目開(kāi)始做起,編寫一些基于文本的程序來(lái)練習(xí)你正在學(xué)習(xí)的編程語(yǔ)言,然后再慢慢的進(jìn)行一些更大更復(fù)雜的項(xiàng)目。
瘋狂的練習(xí),編寫大量的代碼。在學(xué)習(xí)理論知識(shí)的時(shí)候就要不斷地嘗試把理論應(yīng)用到自己的代碼當(dāng)中。學(xué)習(xí)、實(shí)踐;學(xué)習(xí)、實(shí)踐;學(xué)習(xí)、實(shí)踐······
要先學(xué)會(huì)自己解決問(wèn)題,當(dāng)自己解決無(wú)果,陷入困境時(shí),要懂得如何尋求幫助。
不要羞于提問(wèn)或拒絕提問(wèn),要懂得運(yùn)用正確的方式尋求他人的幫助。
毋庸置疑,學(xué)習(xí)編程并不容易。特別是當(dāng)你剛剛上完編程課程,開(kāi)始走上自己的獨(dú)立編程之路時(shí),這種感覺(jué)就會(huì)更加的強(qiáng)烈。但是請(qǐng)你不要就此質(zhì)疑自己的編程能力,除了一小部分天才之外,誰(shuí)不是一步一步從小菜鳥(niǎo)走上大神之路的呢。
最后,在這里也祝愿大家都能在編程之路上愉快的越走越遠(yuǎn)。