
我一直擔(dān)任著公司游泳協(xié)會(huì)的教練。主要負(fù)責(zé)教會(huì)員學(xué)習(xí)蛙泳和自由泳。夏天要到了,最近收到了一些新會(huì)員學(xué)游泳的咨詢(xún)。
今年的新會(huì)員比較特殊,很多壓根不會(huì)游泳但說(shuō)起游泳的要領(lǐng)都是如數(shù)家珍,對(duì)蛙泳腿的“收翻蹬夾”四要領(lǐng),自由泳的最優(yōu)劃水線路這些知識(shí)的了解程度甚至超過(guò)很多老會(huì)員。也許無(wú)數(shù)個(gè)無(wú)聊的夜晚,他們通過(guò)網(wǎng)絡(luò)學(xué)習(xí)了整套的教學(xué)視頻,也曾在床墊上練習(xí)過(guò)多次基礎(chǔ)動(dòng)作,唯一的問(wèn)題就是沒(méi)有勇氣下水試試。
我總開(kāi)玩笑對(duì)他們說(shuō):“難道你們要等到在床墊上學(xué)會(huì)了游泳再下水嗎?”
這些人實(shí)在是匪夷所思,但他們卻活生生地出現(xiàn)在我身邊,IT怪咖的思維方式有時(shí)候就是這么奇葩。
不過(guò),這件事讓我聯(lián)想到了很多簡(jiǎn)書(shū)的朋友問(wèn)我學(xué)習(xí)編程有什么捷徑。我總說(shuō)最好的捷徑就是多敲代碼。這就好像學(xué)游泳最好的捷徑就是下水去游。其中的各種好處也只有親身體會(huì)過(guò)的人才能了解。總結(jié)一下主要有四個(gè)功效。
1. 在敲代碼中記憶

我本人剛學(xué)C語(yǔ)言的時(shí)候,自己還沒(méi)有電腦。由于是利用寒假自學(xué),也沒(méi)有實(shí)驗(yàn)室的機(jī)器可以用。你能想象我當(dāng)時(shí)有多痛苦。死記硬背32個(gè)關(guān)鍵字都讓我頗費(fèi)了一番功夫。在沒(méi)有計(jì)算機(jī)的情況下學(xué)編程和學(xué)馬經(jīng)差別不大,除了死記硬背做選擇填空題之外沒(méi)有什么太好的方法,我一度有了放棄的打算,因?yàn)橥耆珱](méi)有樂(lè)趣可言。
后來(lái)有了電腦,我第一次把自己寫(xiě)在紙上的代碼敲在計(jì)算機(jī)上運(yùn)行的時(shí)候,那感覺(jué)變得完全不一樣了。雖然我在教科書(shū)里已經(jīng)見(jiàn)過(guò)Turbo C那個(gè)丑丑的黑框無(wú)數(shù)次了,但當(dāng)它出現(xiàn)在我眼前的顯示器上的一剎那我還是激動(dòng)得不行。那種感覺(jué)不能簡(jiǎn)單地用一個(gè)“神奇”來(lái)形容,它充滿(mǎn)著神秘感,讓我一下?lián)碛辛撕闷嫘南胍剿飨氯ァ?/p>
有了這份動(dòng)力,對(duì)我而言學(xué)習(xí)C語(yǔ)言不再是痛苦而是享受。每次上機(jī)練習(xí)的時(shí)候我都感覺(jué)自己狀態(tài)特別好。之前記不住的關(guān)鍵字敲兩遍就自然記住了。自己做過(guò)的每一個(gè)練習(xí)被深深地烙在了腦海里,想忘也忘不掉。仔細(xì)想想,敲代碼與閱讀教材最大的不同就是它是以試錯(cuò)為基礎(chǔ)的。在你不斷地輸入調(diào)試的過(guò)程中,你所有的精力都被用到了你最容易出錯(cuò)的地方,因此這樣的學(xué)習(xí)特別有效。
2. 讓IDE幫你檢查代碼

為什么試錯(cuò)能提高學(xué)習(xí)效率呢?很多同學(xué)有這樣的精力,信心滿(mǎn)滿(mǎn)地輸入了一段代碼,覺(jué)得肯定不會(huì)有任何問(wèn)題,結(jié)果IDE告訴編譯失敗。最郁悶的是報(bào)錯(cuò)信息還看不懂,你很抓狂。這時(shí)候你能做的就是用自己僅有的知識(shí)進(jìn)行排查。是不是什么地方少了個(gè)分號(hào)?是不是大括號(hào)沒(méi)有匹配?是不是關(guān)鍵字寫(xiě)錯(cuò)了?是不是頭文件沒(méi)有包含?是不是...?
也許最終你花了半個(gè)小時(shí)的時(shí)間終于發(fā)現(xiàn)是有個(gè)變量沒(méi)有初始化導(dǎo)致的錯(cuò)誤。成功運(yùn)行之后你真想說(shuō)臟話,但這半個(gè)小時(shí)讓你這輩子都不會(huì)再忘記變量要先初始化。
有時(shí)候編譯器告訴你代碼編譯成功,你很開(kāi)心??墒沁\(yùn)行的時(shí)候卻彈出了錯(cuò)誤信息。一堆你根本看不懂得提示信息。你又郁悶了。你盯著IDE指出的錯(cuò)誤位置發(fā)呆,心想它究竟又在鬧什么脾氣。最后實(shí)在想不到,你只能求助老師,結(jié)果是你的數(shù)組訪問(wèn)越界了。從此你學(xué)會(huì)了要規(guī)范地使用for語(yǔ)句的條件控制。
這些就是上機(jī)練習(xí)的意義。
3. 在調(diào)試中培養(yǎng)邏輯性思維

最難的還不是這些。有時(shí)候你的代碼能夠成功運(yùn)行,沒(méi)有任何問(wèn)題。當(dāng)你剛舒一口氣的時(shí)候,突然發(fā)現(xiàn)結(jié)果并不是你想要的。上機(jī)練習(xí)時(shí)常聽(tīng)到這樣的自言自語(yǔ):“怎么是3,應(yīng)該是5呀...”。
這個(gè)時(shí)候,你該發(fā)揮IDE的優(yōu)勢(shì)調(diào)試你的代碼了。最常用的方法就是通過(guò)打斷點(diǎn)、單步調(diào)試的辦法跟著代碼的邏輯一步一步走,過(guò)程中要監(jiān)視著各個(gè)變量是如何變化的。這樣,你就會(huì)在某一次循環(huán)中突然發(fā)現(xiàn)原來(lái)你有個(gè)環(huán)節(jié)沒(méi)有考慮周全。
不斷地這樣練習(xí)會(huì)讓你的邏輯思維能力越來(lái)越好,而這個(gè)恰恰是編程能力最重要的組成部分。
4. 成就感就是動(dòng)力

這些過(guò)程是痛苦的,很多人都倒在了這條痛苦的路上。但正因?yàn)檫^(guò)程痛苦,成功后才格外的喜悅。每當(dāng)看到自己千辛萬(wàn)苦調(diào)試的程序成功地顯示出正確的結(jié)果,你一定想大聲歡呼出來(lái)。
工作多年的程序員們每次提交代碼的瞬間都是喜悅的,這一點(diǎn)從他們的表情和話語(yǔ)中就能感受得淋漓盡致。如果說(shuō)什么讓這些程序員們對(duì)繁重的編碼工作欲罷不能的話,那一定是這些星星點(diǎn)點(diǎn)來(lái)之不易的成功的喜悅。
程序員們心中最大的優(yōu)越感就是覺(jué)得自己的工作是在改變世界。我想,改變世界的成就感足以讓任何人有毅力完成繁重而枯燥的編程學(xué)習(xí)。不過(guò)你要習(xí)慣從現(xiàn)在的上機(jī)練習(xí)開(kāi)始尋找這份成就感。
5. 最后

不要再糾結(jié)于教程上的某一個(gè)小小的知識(shí)點(diǎn),也許它并不影響你掌握一門(mén)能夠改變世界的軟件開(kāi)發(fā)語(yǔ)言。當(dāng)你開(kāi)始用鍵盤(pán)敲代碼的時(shí)候,每敲一個(gè)字符你就離成功更近了一步,因?yàn)槟阕叩氖菍W(xué)習(xí)編程唯一的一條捷徑。
我是天花板,讓我們一起在軟件開(kāi)發(fā)中自我迭代。
如有任何問(wèn)題,歡迎與我聯(lián)系。