當初學習編程時能有人給我這些忠告該多好
在你學習編程之前思考一下你的目標
要知道編程大多時候就是在創(chuàng)造,當你有最終目標感時道路會更加的清晰。如果你的目標是“學習編程”而不是更具體的學習哪種程序及如何讓你的生活更好,那么你可能會發(fā)現(xiàn)這不過是一次令人沮喪的實踐。
我有點慚愧地承認我學習計算機科學的部分動機是為了證明我聰明,及我想干“聰明人”的工作。我也喜歡思考數(shù)學和理論(《哥德爾、艾舍爾、巴赫:集異璧之大成 》這本書在我易受影響的年紀進入了我的腦海),編程是一個不錯的選擇。當然這并不足以使我堅持這么久,真正讓我堅持的是我發(fā)現(xiàn)了編程可以將科技與我真正喜愛的東西(如音樂和文學)連接到一起。
那么,你想要寫什么?網(wǎng)站?游戲?iPhone應用?致富的商業(yè)軟件?交互藝術(shù)?你是想讓老板印象深刻?或你是想自動執(zhí)行一些乏味的任務以讓你有更多的時間看水獺照片嗎(譯者注:這里應該指有更多的時間看外面的風景)?也許你只是想更具有就業(yè)競爭力,因為可以將技術(shù)流行詞添加到簡歷,或者只為了實現(xiàn)你的教育需求。所有的這些都是有價值的目標,你得確定知道哪個才是你想要的目標然后相應的去學習吧。
沒有什么神秘的東西
編程跟其他東西一樣,是一門技術(shù)。跟語言學習一樣,有需要掌握的語法和詞匯;跟數(shù)學一樣,有解決特定類型問題的流程方法;像各種工藝和藝術(shù)創(chuàng)作一樣,有技術(shù)、工具以及人們經(jīng)年累月發(fā)展起來的最佳實踐方案,專門解決各種不同類型的任務,你可以自由的使用、修改或棄之不用。
Joel Spolsky(一個非常聰明的家伙,他的一些其他的觀點我也很喜歡且頻繁認同)曾論斷:在有著“程序員真正思想”的人和缺乏該領(lǐng)域成功所必備的知識能力的任何人之間有一條很清晰的界限。據(jù)他所言,這條界限包括指針和遞歸(這里和這里有為感興趣的人提供的入門資料)。
我在學校學習過指針和遞歸,當我掌握了過后,大腦發(fā)生了一次愉悅的波動—這種智力快感使我想要將學習計算機科學排在第一位。但是,除了課堂練習外, 其他時候用指針和遞歸來完成任務的次數(shù)就相對較少了。后來在一次次的幫助他人學習時,我發(fā)現(xiàn)大家根本不用掌握這兩項技術(shù)中的任何一項就可以完成一些非常有 趣有益的項目。
想知道或怕知道自己是否“足夠聰明”其實沒什么意義。當然,你的任務越復雜越深奧,你需要掌握的知識水平就越高。不過這也同樣適用于其它的任何領(lǐng)域。除非你計劃完全靠編程生活,否則你可能并不需要成為一個掌握遞歸的天才來完成你的任務。
第一次運行一般不成功,第二次第三次也可能不成功
當你第一次學習編程時,你會很快遇到這樣的特殊經(jīng)歷:你認為已經(jīng)按照所想的完成了每一件事,檢查了一遍又一遍,卻發(fā)現(xiàn)仍然運行不了(出現(xiàn)bug 了)。你完全不知道該從哪開始修復它,錯誤信息(如果你夠幸運只有一個的話)好像在說“fuck you”。你可能就此放棄,心里想著自己恐怕永遠也解決不了了,那么你就不適合干編程這行。我一開始就有這種感覺,嘗試著用C++寫一個程序然后運行它, 卻只得到“segmentation fault”這個麻煩。
但是這種經(jīng)歷對所有不同技術(shù)水平的程序員來說都太普遍了,這絕對與你的智商、技術(shù)悟性或者是否適合干編程這行沒有任何關(guān)系。初學者會碰到這樣的情況,經(jīng)驗豐富的程序員也會碰到這種事情。主要的區(qū)別就在于你如何應對這種情況。
我發(fā)現(xiàn)新手程序員和有經(jīng)驗的程序員之間一個很大的不同點,就在于一種信念(指有經(jīng)驗的程序員所具有的信念):相信事情出錯是因為邏輯原因并且一定能 找出來;相信bug可以修復;相信有辦法實現(xiàn)目標。從“運行錯誤”到“運行正確”的過程可能不是很明顯,但是有耐心你通常都可以找出問題。
總是有人說你做錯了
括號應該另起一行;括號應該放在同一行;用tab鍵來縮進,但是tab很邪惡喲;你應該使用存儲過程,但實際上你又不應該用它們;你應該總是對代碼進行注釋,但是好代碼不需要注釋。
基本上對于一個特定的問題總是有許多不同的方法,沒有所謂單一的“正確方法”。許多程序員都非常擅長倡導他們首選或偏愛的方法,但是那并不意味著這 是“唯一正確的方法”。如果與人們面對面爭論后告訴我:我是錯的,那么我也會盡力搞明白是否他們就一定是正確的,這是我早期職業(yè)生涯比較重要的一個方面。
如果你在一個小組里與其他人一起編程的時候,肯定會有人總是對你做的東西指指點點,有時候他們說的的確是正確的,但是總是值得去探究下看你是否真的 “做錯了”。但有時候他們完全就是胡扯或只是再次引起了一場古老而沒有意義的爭論,那么你最好適應這樣的情況然后忘掉它吧。另一方面,如果你個人喜歡這種 古老且沒有意義的爭論的話(比如語法狂,一直看著大家),那么不用多說,你來對了地方。
總是有人說你不是一個真正的程序員
HTML不屬于真正的編程;如果不用vi的話,你就不夠嚴肅認真;真正的程序員要懂C;真正的程序員不用Windows;有些人從來都學不會;你不應該學習編程; 你不是一個計算機程序員(但是我是)。
“編程”對不同的人有著非常不同的含義,而且現(xiàn)在看起來與過去也不太一樣。有趣的是,大家都知道,工具、包和框架能夠讓初學者甚至受過訓練的開發(fā)者更快更容易的做開發(fā),但正因如此這些東西往往被貼上“不是真正的程序員”的標簽。(看:“Return of the Real Programmer”)
其實這背后隱藏的是一種害怕心理:“如果“任何人”敢自稱他們自己是一個真正的程序員,那么這篇文章的題目就沒有意義了(譯者注:也就是都不敢自稱自己是真正的程序員)。但是我認為這種保守行為是非常具有破壞性的。
使用那些讓你最容易開發(fā)的工具吧。如果這意味著你的游戲是用Stencyl 或者GameMaker做的,而不是自己從頭開始寫的,沒關(guān)系啊。如果你首次編程用的是HTML或者Excel宏,也OK啊。只要你能堅持下去就行。
當你越來越舒服的時候(沒任何挑戰(zhàn)力),你會自然的開始找出那些工具受限的不足的(而不是有幫助的)地方接而尋找功能更加強大的工具,但是大部分情況,很少有人會去看你的代碼或問你用什么工具—你用這些工具實現(xiàn)了什么功能才是關(guān)鍵。
憂慮所謂的“極客聲譽(geek cred)”相當于慢性自殺
如前所述,我過去(尤其在學校)一度非常擔心從我的穿著,我的講話,我選擇的閱讀資料,甚至我的軟件定制選項是不是證明了自己“不是一個真正的極客”(不是真正的極客貌似就沒啥資格進入技術(shù)社區(qū)),這嚴重消耗了我的精力,后來我決定完全不考慮這些東西后我的技術(shù)更強了(譯者注:與其花時間搞那些沒意義的東西不如多學點技術(shù),這樣你的技術(shù)就會越來越強)。
你需要謹記一點:你擅長編程的能力與你到底有多適應各種極客亞文化沒有一丁點關(guān)系。如果你內(nèi)心深處知道自己永遠都不會適應這些亞文化(而因此焦慮的 話),那就需要加倍的記住了。你為了證明自己所浪費的精力應該用來做真正有有意義的事情,并且就算你是一名無可爭辯的極客,眼窩中流露中可信賴的光芒,那 么也請記住:當你評價其他人的信譽水平時,也并不意味著你認為的就一定對,一定是事實。
堅持比方法更重要
我們永遠不缺像學習編程的“正確”或“最佳”方法這樣的文章,其實還有很多潛在的方法。你可以從一本書或通過完成互動練習或通過調(diào)試其他人所寫的東西來學習概念。當然,在你第一次學習的時候有許多的語言供你選擇,每種語言都有相應的宣傳和倡導。
關(guān)于“自學編程”流程和講習班的一個常見的抱怨就是:一開始你會很愉快的輕松度過初級材料的學習,然后會越來越困難,這時你就會很快走上陡峭的學習 曲線。你知道如何在頁面上打印輸出一些文本行,但是你不知道從哪開始進行一個“真正的”有用的項目。你可能感覺你只不過遵循了一些指南而沒有真正的掌握, 然后你可能就會指責學習資料。
當你到了這一步后,大部分可用的教程和在線資源都不是那么有用了,因為他們已經(jīng)讓你成為一名有經(jīng)驗的程序員了。然后困難進一步加劇為這樣一個事實—“你不清楚自己還有哪些不知道的東西”,而且試圖搞清楚你下一步到底要學習什么本身就是一個難題。
不管你遵循的是什么“編程”方案,沖破這堵墻的唯一方法就是持之以恒。這意味著你要持續(xù)的嘗試新東西,學習更多的知識,并且一步步的搞明白怎么去開發(fā)你的項目。如果你非常清楚自己為什么要將編程放在首位的話,最后你也非常有可能成功。
如果你堅持一點一點的鋪磚,可能會花費很長時間才能得到一道墻,但是最終你還是會得到。這時候我先前提到的信念就派上用場了。如果你相信隨著時間和耐心,你可以完成整個編程任務,那么到時候你肯定會達成所愿的。