因?yàn)?Aaron Swartz 的自殺,這兩天看了不少關(guān)于他的報(bào)道以及他自己的博客,對(duì)我觸動(dòng)最大的是盡管他一直在做技術(shù)相關(guān)的事情,但眼光和理想?yún)s遠(yuǎn)遠(yuǎn)超越了技術(shù)。他把技術(shù)當(dāng)作推動(dòng)自由和社會(huì)變革的工具,所以 Twitter 簽名也是 "Applied sociologist", 而不是經(jīng)??梢栽诔绦騿T那里看到的 "Geek" 和 "Hacker" 等。我非常欽佩他的社會(huì)理想和為之做出的努力,然后開(kāi)始思考自己可以做些什么,于是就有了這篇文章。 現(xiàn)在有關(guān)編程的書(shū)籍非常多,網(wǎng)上也有很多教程,但大多都是針對(duì)職業(yè)程序員或者計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生,對(duì)那些只想實(shí)現(xiàn)一些自己想要的東西的業(yè)余愛(ài)好者幫助不大。業(yè)余愛(ài)好者并不想以編程為職業(yè),也不想花太多時(shí)間去學(xué)習(xí)基礎(chǔ),他們只是想盡快做出自己想要的東西。這樣的東西在專(zhuān)業(yè)程序員看來(lái)可能很爛,但我覺(jué)得非常有意義。會(huì)編程的人越多,信息流動(dòng)的渠道就越多,做出好玩的東西的機(jī)率也越大。 我的技術(shù)水平一直不怎么樣,而且越來(lái)越業(yè)余,不過(guò)正因?yàn)槿绱?,我非常能體會(huì)初學(xué)者的痛苦,或許寫(xiě)這樣的東西正合適。本文的目的是幫助業(yè)余愛(ài)好者掃清一些思想上的障礙,分享一些我的經(jīng)驗(yàn),并不會(huì)涉及太多技術(shù)細(xì)節(jié),畢竟每個(gè)人想做的東西和想學(xué)的編程語(yǔ)言都不同,不過(guò)后面會(huì)給出一些學(xué)習(xí)資料。 重要聲明:本文只針對(duì)那些不想以編程為職業(yè),只想學(xué)習(xí)編程以便自己做東西的業(yè)余愛(ài)好者。想要成為一個(gè)優(yōu)秀程序員的同學(xué)請(qǐng)看這篇經(jīng)典的《十年學(xué)會(huì)程序設(shè)計(jì)》。 思想準(zhǔn)備: 1. 編程不難,至少做出一個(gè)能用的東西不難。別把它當(dāng)回事兒。很多人之所以覺(jué)得編程很難是被專(zhuān)業(yè)術(shù)語(yǔ)和趾高氣揚(yáng)的程序員嚇到了。別擔(dān)心,業(yè)余愛(ài)好者不需要對(duì)自己要求那么高。 2. 編程不需要數(shù)學(xué)基礎(chǔ)。沒(méi)錯(cuò),就算你數(shù)學(xué)很爛也能做出東西。大部分算法都已經(jīng)有成熟的解決方案,可以直接拿來(lái)用,完全不用擔(dān)心。我們的目的是做東西,不是研究算法和數(shù)學(xué)。 3. 編程不會(huì)改變你的生活方式。你完全可以學(xué)習(xí)編程而不接受和它有關(guān)的文化。不一定要崇拜某位大神、閱讀技術(shù)新聞或者參與社區(qū),也不一定要不修邊幅、熬夜工作。如果愿意的話,精裝打扮穿上最漂亮的衣服去編程也可以。反正不想成為職業(yè)程序員,不用擔(dān)心因?yàn)椤覆幌癯绦騿T」而被鄙視。 4. 有很多友善的程序員。程序員給很多人的印象要么是邋遢、木訥、害羞的書(shū)呆子,要么是性格怪異、智商極高的大神,其實(shí)大部分程序員并不是那樣,只不過(guò)媒體和大眾更偏愛(ài)怪異的東西。以 Linus 為例,在他的自傳 《Just for Fun》 中提到: 「Linux 不是靠犧牲寶貴的睡眠時(shí)間換來(lái)的。事實(shí)上,如果你想聽(tīng)真話,那我就要說(shuō),我更喜歡睡覺(jué)?!?br>「在那個(gè)時(shí)候,只要一想到姑娘,Linux 系統(tǒng)就變得不再重要了。在某種程度上,今天也還是這樣。」 瞧,這位大神其實(shí)大部分時(shí)間和普通男性差不多,更喜歡「睡覺(jué)」和「姑娘」。所以,如果真的遇到了無(wú)法解決的問(wèn)題,完全可以大膽地去請(qǐng)教專(zhuān)業(yè)程序員們,一般都可以得到答復(fù)。 5. 習(xí)慣無(wú)知。無(wú)論學(xué)習(xí)什么東西,往往越深入就越覺(jué)得自己無(wú)知。這樣的無(wú)知本身并不是壞事,它可以讓你保持謙虛,但千萬(wàn)不要被它嚇得不敢繼續(xù)前進(jìn)。及早適應(yīng)無(wú)知的感覺(jué),你并不需要全知全能才能做出東西,如果覺(jué)得困難,可以試著假裝自己擅長(zhǎng)編程 。 如何開(kāi)始: 首先,完整閱讀這篇文章:《你第一要做的是開(kāi)始去做》(這篇文中翻譯自 The first step is to start )。 如文中說(shuō)的那樣,不要以「基礎(chǔ)不夠」、「知識(shí)不全」等借口停下來(lái),一開(kāi)始甚至可以先在紙上勾勒出想要的東西。當(dāng)然,完全不懂編程肯定無(wú)法開(kāi)始真正的創(chuàng)造,但學(xué)習(xí)的時(shí)候不要抱著「先專(zhuān)心學(xué)習(xí),學(xué)好本領(lǐng)再回來(lái)做」的念頭。正確的做法是:只學(xué)那些最基礎(chǔ)的東西,然后立刻著手去做,遇到不會(huì)的地方再去學(xué)。 沒(méi)有技術(shù)背景的人學(xué)習(xí)編程很容易被錯(cuò)綜復(fù)雜的技術(shù)體系嚇到,網(wǎng)上的教程中也經(jīng)常會(huì)出現(xiàn)「一定要讀這本書(shū),非常經(jīng)典」、「最好先有 XX 基礎(chǔ)再看這篇教程」之類(lèi)的警告,結(jié)果有時(shí)候會(huì)出現(xiàn)這樣的情況:本來(lái)你只打算學(xué)習(xí)編寫(xiě)網(wǎng)頁(yè) ,結(jié)果幾天后莫名其妙地開(kāi)始苦讀《精通正則表達(dá)式》。為了能夠?qū)W⒂谧约合胱龅臇|西,要十分警惕「學(xué)習(xí)」這件事情。盡量學(xué)習(xí)最少的東西,然后把時(shí)間都花在創(chuàng)造上。當(dāng)想要學(xué)習(xí)的時(shí)候,慎重考慮它是否會(huì)讓你偏離目標(biāo),或者繞太遠(yuǎn)的路。這樣做肯定會(huì)導(dǎo)致基礎(chǔ)不夠好,但我們是業(yè)余愛(ài)好者嘛,能盡快做出東西就行了。如果你真的非常在意基礎(chǔ),說(shuō)明你可能更想成為職業(yè)程序員,請(qǐng)返回參考前面的重要聲明。 沒(méi)有人天生就會(huì)編程,在做東西的過(guò)程中會(huì)不斷學(xué)到新的知識(shí),然后就會(huì)發(fā)現(xiàn)自己之前的代碼很愚蠢。這個(gè)時(shí)候你可能會(huì)很想推倒重來(lái),或者從頭改進(jìn)之前的代碼。要抑制住這種沖動(dòng),不然就會(huì)掉入代碼優(yōu)化的無(wú)底洞。事實(shí)上,幾乎所有的專(zhuān)業(yè)程序員都會(huì)對(duì)半年前自己的代碼感到不滿,而且一開(kāi)始代碼質(zhì)量不好完全沒(méi)有問(wèn)題。舉個(gè)例子,假如要在網(wǎng)頁(yè)上顯示 10 次 "I love you.",你并不知道如何使用循環(huán),于是就復(fù)制粘貼了 10 次 "I love you"。這樣的做法或許很笨,但是你做出了想要的效果,對(duì)于業(yè)余愛(ài)好者來(lái)說(shuō),完成一個(gè)東西要比代碼質(zhì)量重要得多,不要為了這種笨方法而感到羞愧。 如何解決問(wèn)題: 在創(chuàng)造的過(guò)程中肯定會(huì)遇到很多問(wèn)題,對(duì)于初學(xué)者來(lái)說(shuō),大部分的問(wèn)題都是語(yǔ)法或者拼寫(xiě)問(wèn)題,只要仔細(xì)檢查代碼就可以解決,少數(shù)摸不著頭腦的問(wèn)題也可以用 Google 找到答案。很多非 IT 行業(yè)的人平時(shí)都只是搜索中文,可能并不覺(jué)得 Google 比百度要好,但當(dāng)你開(kāi)始學(xué)習(xí)編程,就會(huì)立刻發(fā)現(xiàn) Google 比百度好用得多,一般都可以在搜索結(jié)果第一頁(yè)找到想要的東西。使用 Google 搜索的時(shí)候,請(qǐng)嘗試用英文描述問(wèn)題,或者直接把出錯(cuò)信息直接粘貼到搜索框。 如果實(shí)在搜索不到解決辦法(這種情況對(duì)業(yè)余愛(ài)好者來(lái)說(shuō)極為少見(jiàn),請(qǐng)善用 Google),可以去 Stack Overflow 提問(wèn)。提問(wèn)的時(shí)候請(qǐng)注意描述好自己的問(wèn)題,把錯(cuò)誤信息以及相關(guān)的代碼都寫(xiě)進(jìn)去。 Stack Overflow 的氛圍相當(dāng)好,應(yīng)該很快就會(huì)有人回答你的問(wèn)題。比較不方便的地方是你必須使用英文提問(wèn),沒(méi)辦法,因?yàn)轭?lèi)似的中文社區(qū)并不存在。如果執(zhí)意要去中文社區(qū)提問(wèn),那么我真誠(chéng)地建議你使用女生頭像和昵稱,可以有效提高回復(fù)率,呵呵。 有關(guān)編程的一個(gè)惱人的地方是,就算看書(shū)之后覺(jué)得自己掌握了,真正寫(xiě)的時(shí)候還是經(jīng)常會(huì)出錯(cuò)。它只能通過(guò)實(shí)踐來(lái)掌握,所以需要很多耐心。當(dāng)你被折磨得想要放棄的時(shí)候,或許可以換一種角度,以此為契機(jī)掙脫過(guò)去那么多年的學(xué)院派教育。想一想吧,我們?cè)趯W(xué)校里待了那么長(zhǎng)時(shí)間,幾乎所有的學(xué)習(xí)路徑都是「先閱讀,再應(yīng)用」或者「只閱讀,不應(yīng)用」,是時(shí)候體驗(yàn)一下如何在應(yīng)用中學(xué)習(xí)了。 面對(duì)批評(píng): 有些人做出想要的東西之后就已經(jīng)很滿足,但有些人可能會(huì)想要展示一下自己的作品并獲取一些意見(jiàn)。因?yàn)闃I(yè)余,所以當(dāng)專(zhuān)業(yè)程序員看到這樣的作品之后可能會(huì)非常不屑,甚至大肆批評(píng)。這個(gè)時(shí)候不要自卑或害怕,因?yàn)樗麄儗?duì)作品的了解都是片面的。他們只是一味拿專(zhuān)業(yè)的技術(shù)標(biāo)準(zhǔn)來(lái)衡量,不清楚你只是想做出一個(gè)東西,不清楚你只是業(yè)余時(shí)間在做,不清楚你在整體上的考量和妥協(xié)。作為這個(gè)作品的創(chuàng)造者,你才是專(zhuān)家,如果按照他們的要求,你可能永遠(yuǎn)都做不完。 之所以提到這一點(diǎn),是覺(jué)得業(yè)余愛(ài)好者大都是自己一個(gè)人慢慢自學(xué),被打擊一下說(shuō)不定就完全放棄了,那樣實(shí)在可惜。對(duì)于專(zhuān)業(yè)程序員的批評(píng),如果有用就記下來(lái),下次不要再犯就好,沒(méi)有必要?dú)怵H或者把之前的東西重寫(xiě)一遍。從無(wú)到有實(shí)現(xiàn)了自己的創(chuàng)意已經(jīng)很了不起,不需要對(duì)專(zhuān)業(yè)程序員有什么交代。 注意事項(xiàng): 1. 不要過(guò)度關(guān)注編程語(yǔ)言的優(yōu)劣。很多編程語(yǔ)言都可以達(dá)到相同的目的,選中一個(gè)之后把它用好就是了。和別人爭(zhēng)辯哪個(gè)編程語(yǔ)言更好是很多職業(yè)程序員的一大愛(ài)好,是他們生活的一部分。我們是業(yè)余愛(ài)好者,只要求工具夠用,不需要像他們那樣一定要用「最好的」語(yǔ)言。 2. 用不著關(guān)注國(guó)內(nèi)的 IT 紅人和八卦。對(duì)學(xué)習(xí)編程和做東西沒(méi)有任何益處。(補(bǔ)充:這條可能帶了個(gè)人情緒,請(qǐng)自行判斷,但我關(guān)注了那么久覺(jué)得確實(shí)沒(méi)有任何益處。。。 >_<) 3. 不要自稱 "Geek","Hacker" 或其它什么東西。當(dāng)開(kāi)始給自己貼標(biāo)簽的時(shí)候,就會(huì)試圖表現(xiàn)得像那類(lèi)人,束縛自己的同時(shí)還會(huì)做出許多愚蠢的事情。我們要做的事情很簡(jiǎn)單,就是掌握技術(shù)并做出能用的東西,沒(méi)有必要給自己貼任何標(biāo)簽。事實(shí)上,能做出東西的人比自稱 "Geek" 或 "Hacker" 的人稀有得多。 4. 利用開(kāi)源代碼。感謝開(kāi)源事業(yè)的蓬勃發(fā)展和無(wú)數(shù)程序員的無(wú)私奉獻(xiàn),使我們可以學(xué)習(xí)和使用別人的代碼。當(dāng)需要一些功能時(shí),可以先去找一下是否已經(jīng)有開(kāi)源的實(shí)現(xiàn),沒(méi)有必要自己從頭寫(xiě)。 5. 先找到自己想做的東西。不要為了學(xué)習(xí)編程而學(xué)習(xí),那樣就算記住了很快也會(huì)忘掉。如果實(shí)在找不到什么想做的,可以考慮給一些公益組織義務(wù)做一個(gè)網(wǎng)站,鍛煉技能的同時(shí)還可以關(guān)心一下社會(huì)。 6. 保持初心。業(yè)余愛(ài)好者擁有的最寶貴的財(cái)富就是初學(xué)者的心,也正是因?yàn)檫@份初心,才讓代碼質(zhì)量問(wèn)題變得并不那么重要??上У氖?,隨著技術(shù)越來(lái)越熟練,初心會(huì)漸漸消失,做東西的時(shí)候首先考慮的不是結(jié)果而是實(shí)現(xiàn)方式,當(dāng)初那個(gè)滿腦子想法苦于不能用技術(shù)實(shí)現(xiàn)的人不見(jiàn)了,取而代之的是一個(gè)精通技術(shù)卻乏味的人。所以,作為業(yè)余愛(ài)好者,應(yīng)該把「完成作品」和「保持業(yè)余」作為首要目標(biāo),如果精通技術(shù)的代價(jià)是失去初心,那就不要精通好了,反正并不想以此為生。 學(xué)習(xí)資料: 由于我的工作大部分是 web develop, 所以這里給出一些不錯(cuò)的相關(guān)資料。如果你想要做一個(gè)簡(jiǎn)單的網(wǎng)站或者 app, 那么這些知識(shí)夠用了。也歡迎補(bǔ)充好的入門(mén)資料,我會(huì)不斷更新。(之所以沒(méi)有推薦其它方面的資料,是因?yàn)槲也](méi)有相關(guān)的經(jīng)驗(yàn),不知道其中優(yōu)劣。編程可做的東西非常多,比如 Arduino 硬件編程,有興趣的可以去找一下資料,也歡迎補(bǔ)充。) 1. Head First HTML 與 CSS、XHTML 。在大學(xué)圖書(shū)館偶爾看到過(guò)這本書(shū)的英文版,很喜歡。本書(shū)非常適合初學(xué)者,里面很多插圖,寫(xiě)得也很有趣。 2. A Beginner’s Guide to HTML & CSS 一個(gè)很好的在線學(xué)習(xí) HTML & CSS 基礎(chǔ)的網(wǎng)站。 3. An Advanced Guide to HTML & CSS HTML & CSS 進(jìn)階,里面還包含了 jQuery 的學(xué)習(xí)。 4. 笨方法學(xué) Ruby. 這本在線電子書(shū)是 Learn Ruby The Hard Way 的繁體中文翻譯,也是 Zed Shaw 寫(xiě)的 Learn XXX The Hard Way 系列中的一本,之所以推薦 Ruby 是因?yàn)槲液芟矚g這門(mén)語(yǔ)言。本書(shū)非常注重實(shí)踐,全書(shū)由 52 個(gè)習(xí)題構(gòu)成,當(dāng)你完成這些習(xí)題的時(shí)候就已經(jīng)寫(xiě)了很多代碼了。我覺(jué)得書(shū)中后面的一些習(xí)題(比如讀寫(xiě)文件)可以先跳過(guò),用到的時(shí)候再去學(xué)習(xí)。 5. Codecademy 備受推崇的在線學(xué)習(xí)編程網(wǎng)站,而且有中文界面,非常推薦。 6. Code School 和 Codecademy 類(lèi)似的在線學(xué)習(xí)網(wǎng)站,評(píng)價(jià)不錯(cuò)。 最后再次提醒一下,如果你選擇了學(xué)習(xí)編程,以后很長(zhǎng)一段時(shí)期內(nèi)業(yè)余時(shí)間都會(huì)被占據(jù),而且期間會(huì)體會(huì)到很多痛苦。但是當(dāng)完成第一個(gè)作品的時(shí)候,你就會(huì)發(fā)現(xiàn)之前的痛苦都是值得的,它們是創(chuàng)造不可或缺的一部分。 后記:想要寫(xiě)這篇文章的時(shí)候激情滿滿,覺(jué)得自己在做好事,但寫(xiě)的過(guò)程中一直誠(chéng)惶誠(chéng)恐,非常擔(dān)心文中業(yè)余愛(ài)好者可能面臨的問(wèn)題都是自己臆想出來(lái)的。畢竟在這個(gè)行業(yè)待的時(shí)間不算短,早就變成了一個(gè)乏味的職業(yè)人士。如果你是一個(gè)想學(xué)習(xí)編程的業(yè)余愛(ài)好者,歡迎留言告訴我哪些擔(dān)心是不必要的,以及漏掉了哪些東西,我會(huì)及時(shí)修正或補(bǔ)充。 |
|
來(lái)自: quasiceo > 《計(jì)算機(jī)》