就像我在上一篇博文中提到的,Eva和Fong(譯注:根據(jù)博主的上一篇博文,Eva是博主的姐姐,F(xiàn)ong是博主的女友)來(lái)到舊金山跟我學(xué)編程。在這篇博文中,我將記錄下我教她們的方式,我構(gòu)建這種學(xué)習(xí)過(guò)程的理由,以及這種學(xué)習(xí)方式奏效的原因。雖然以時(shí)間順序列出她們?cè)谶@段時(shí)間做的或?qū)W習(xí)的每一件事再容易不過(guò),但是這毫無(wú)用處,而且讀者們也會(huì)遺漏重點(diǎn)。了解學(xué)習(xí)過(guò)程中的細(xì)節(jié)并且明白它起作用的原因至關(guān)重要。所以我會(huì)從基本原則開(kāi)始講。本文較長(zhǎng),請(qǐng)做好準(zhǔn)備。
請(qǐng)?jiān)诰幊踢^(guò)程中始終牢記這些基本原則。
1、交流溝通
在Eva和Fong開(kāi)始學(xué)習(xí)之前,我為她們申請(qǐng)了博客,并請(qǐng)她們記錄下她們的編程之旅和學(xué)到的東西。萬(wàn)事開(kāi)頭難,你可以問(wèn)問(wèn)她們。我大概花了一周的時(shí)間跟她們嘮叨才讓她們寫(xiě)了第一篇博客。但是現(xiàn)在,她們不在博客上寫(xiě)點(diǎn)兒自己投入了大量時(shí)間的項(xiàng)目就覺(jué)得不對(duì)勁。
如果你在項(xiàng)目中使用了API(譯者注:Application Programming Interface,應(yīng)用程序編程接口),發(fā)推文或者是郵件給這家公司告訴他們你關(guān)于他們的API的想法。當(dāng)你在黑客馬拉松中贏(yíng)得獎(jiǎng)項(xiàng)時(shí),發(fā)個(gè)不錯(cuò)的推文@他們表示謝意,或?qū)懫嚓P(guān)的博文。每寫(xiě)一篇博文都使它成為一直以來(lái)最好的,并懷著它會(huì)被放上黑客新聞版首頁(yè)的期望將它提交(盡管大部分時(shí)候這種期望都不能實(shí)現(xiàn))。
健康交流的最大好處就是,它使你對(duì)你的項(xiàng)目負(fù)責(zé), 由此也引出我的下個(gè)要點(diǎn)。
2、完成
Fong和Eva都知道,完成一個(gè)項(xiàng)目困難,卻重要。我聲明:除非她們寫(xiě)了一篇關(guān)于手頭項(xiàng)目的博文,在推特上@了API公司,并且將它發(fā)布在黑客新聞網(wǎng)版上,我們是不會(huì)開(kāi)始一個(gè)新項(xiàng)目的。盡管她們的第一個(gè)項(xiàng)目只是井字棋游戲,但這是她們做過(guò)的最好的井字棋游戲。從來(lái)就沒(méi)有人想寫(xiě)一個(gè)蹩腳的項(xiàng)目,所以不管這個(gè)項(xiàng)目有多簡(jiǎn)單或者不相關(guān),如果你要著手做個(gè)項(xiàng)目,那它必須是你能拿到的最好的那個(gè)。我已經(jīng)見(jiàn)過(guò)太多開(kāi)發(fā)者為毫無(wú)前景的次要項(xiàng)目工作。如果你在學(xué)習(xí)編程,你必須從一開(kāi)始就認(rèn)識(shí)到要珍惜你的時(shí)間和精力,完成你的項(xiàng)目證明它的價(jià)值。
完成整個(gè)項(xiàng)目的最后20%需要花費(fèi)全部努力的80%。開(kāi)發(fā)者可以在1、2天之內(nèi)實(shí)現(xiàn)一個(gè)項(xiàng)目的概念。而測(cè)試每種情況并且解決每一種邊際情況從而成就一個(gè)“完美”的產(chǎn)品則需要兩倍的時(shí)間。在項(xiàng)目最后的20%花費(fèi)那80%的精力,將會(huì)在許多許多訪(fǎng)問(wèn)中傳為佳話(huà)。
3、思考
如果你卡住了,不要緊盯住你的代碼。出去散個(gè)步,呼吸點(diǎn)新鮮空氣,再考慮一下。你卡住了是因?yàn)槟愕倪壿嬛杏绣e(cuò)誤,而修正它最好的方法就是在腦海中或是在紙上一步一步地徹底想通它。程序員靠思考賺錢(qián),問(wèn)題在你的思考中被解決,編程是個(gè)蛋疼的工作。偉大的項(xiàng)目經(jīng)理通常都有廣博的編程背景,并且在思考和問(wèn)題解決方面接受過(guò)出色的訓(xùn)練。
有一種說(shuō)法:當(dāng)你被卡住20多分鐘時(shí),并且你仍然茫然無(wú)緒,請(qǐng)教別人吧。如果在20分鐘內(nèi)沒(méi)有任何頭緒,那么在接下來(lái)的一個(gè)小時(shí),你也不會(huì)有任何進(jìn)展的。相信Eva。她有一天就浪費(fèi)了5個(gè)小時(shí),因?yàn)橐粋€(gè)愚蠢的錯(cuò)誤——血的教訓(xùn)啊。散個(gè)步,做個(gè)其他事。然后再回到項(xiàng)目上來(lái)。能將自己與問(wèn)題切斷并轉(zhuǎn)移注意力,是個(gè)技術(shù)活。
4、再思考
也許你現(xiàn)在已經(jīng)明白了,思考,在一個(gè)程序員的生活中是至關(guān)重要的。不要去復(fù)制-粘貼代碼,尤其當(dāng)你在學(xué)習(xí)如何去編程的時(shí)候。如果你想學(xué)習(xí)怎么編程,復(fù)制,粘貼——“看,有用誒!”不會(huì)使你有任何成就。相反,無(wú)論何時(shí)你看到代碼,你必須在企圖去試運(yùn)行它之前想清楚它在干什么。當(dāng)你能輕易看懂別人的代碼了,將其簡(jiǎn)化到你剛好需要的程度,然后寫(xiě)出來(lái)。如果從一開(kāi)始就定期這么做,你會(huì)在幾個(gè)月內(nèi)成長(zhǎng)為一個(gè)非凡的開(kāi)發(fā)者。
5、谷歌
學(xué)會(huì)獨(dú)立解決問(wèn)題。除非至少被卡住20分鐘,不要問(wèn)編程問(wèn)題。程序員們必須是獨(dú)立的。他們是偉大的思想者和偉大的交流者。為了成為他們中的一員,你必須邏輯地思考,想出問(wèn)題出現(xiàn)的原因。許多年輕開(kāi)發(fā)者面對(duì)的問(wèn)題是,寫(xiě)出他們真正需要的代碼對(duì)他們來(lái)說(shuō)很困難。我們中的許多人也是這樣,明知道問(wèn)題是什么,但就是不知道要去找什么去解決它。這是個(gè)你必須從一開(kāi)始就培養(yǎng)的技能,它漂亮地聯(lián)系了第一點(diǎn),“成為一個(gè)交流者”。
現(xiàn)在,有了這五點(diǎn)牢記于心,以下是Eva和Fong學(xué)到的東西,以時(shí)間順序排列。
我選擇Ruby語(yǔ)言,因?yàn)樗脕?lái)上手是最的。在Ruby語(yǔ)言中,有很少語(yǔ)法限制(space鍵與tab鍵,類(lèi)型聲明,等等),所以Eva和Fong能夠關(guān)注編程的思考過(guò)程而不是解決語(yǔ)法問(wèn)題。她們學(xué)習(xí)了if型語(yǔ)句、循環(huán)體、數(shù)據(jù)結(jié)構(gòu),解決了一些編程題目,比如說(shuō)FizzBuzz(編程初級(jí)問(wèn)題,即滿(mǎn)足a條件時(shí)輸出Fizz,滿(mǎn)足b條件時(shí)輸出Buzz,同時(shí)滿(mǎn)足a、b條件時(shí)輸出FizzBuzz),替換字符串中的字符,轉(zhuǎn)換一個(gè)數(shù)組,找出最大值。關(guān)于類(lèi)別和對(duì)象的學(xué)習(xí)也是重要的。
另外,我沒(méi)有教她們特定的ruby語(yǔ)法,而是讓她們對(duì)參數(shù)都使用括號(hào),并且以返回空結(jié)束每個(gè)函數(shù)。 這樣的話(huà),她們下次學(xué)一種新的語(yǔ)言時(shí)就能更快上手。
HTML或CSS嚴(yán)格上來(lái)說(shuō)不能算是編程語(yǔ)言,所以沒(méi)必要在這里花上太多時(shí)間。Eva和Fong在HTML上花了一天時(shí)間,編了幾個(gè)標(biāo)簽玩兒,快速完成了表單、信息頁(yè)等內(nèi)容。這樣,對(duì)CSS的興奮感就建立起來(lái)了。在這里重點(diǎn)要學(xué)的是區(qū)分塊HTML與內(nèi)聯(lián)HTML、標(biāo)識(shí)與分類(lèi)。
在擺弄過(guò)HTML后,“如何在那里表達(dá)這個(gè),怎樣使這個(gè)丑陋的HTML頁(yè)面看起來(lái)更漂亮”的問(wèn)題浮出了水面。CSS就是那個(gè)完美的答案。花上一天的時(shí)間盡情設(shè)計(jì)網(wǎng)頁(yè)(所有HTML頁(yè)面都已經(jīng)在前一天建好)。這一塊的重點(diǎn)是,相對(duì)/絕對(duì)/固定定位,HTML浮動(dòng)元素,以及如何用絕對(duì)、固定定位來(lái)控制正常的浮動(dòng)。
jQuery需要花點(diǎn)時(shí)間來(lái)適應(yīng),而且因?yàn)樯婕暗骄幊?,學(xué)習(xí)jQuery框架需要占用點(diǎn)時(shí)間。她們花了幾天時(shí)間將HTML頁(yè)面做成交互式頁(yè)面。
這時(shí),Eva和Fong已經(jīng)了解了HTML/CSS/Javascript,但不是特別習(xí)慣。這正是讓她們開(kāi)始第一個(gè)項(xiàng)目(井字棋)的絕佳時(shí)機(jī)。雖然她們花了兩天的時(shí)間來(lái)完成這個(gè)項(xiàng)目,又用了幾天時(shí)間來(lái)對(duì)其進(jìn)行潤(rùn)色修飾。項(xiàng)目的最后20%要花費(fèi)精力的80%是個(gè)金科玉律。作為一個(gè)初學(xué)者,學(xué)著去完成你的項(xiàng)目是很重要的。
在那個(gè)看起來(lái)永遠(yuǎn)都不能結(jié)束的井字棋項(xiàng)目之后,F(xiàn)ong和Eva迫不及待地想學(xué)點(diǎn)新東西。學(xué)點(diǎn)服務(wù)終端代碼對(duì)她們已經(jīng)在做的事來(lái)說(shuō)是個(gè)激動(dòng)人心的全新體驗(yàn)。我選擇Sinatra,是因?yàn)樗俏沂褂眠^(guò)最整潔、最簡(jiǎn)單的網(wǎng)絡(luò)框架,而且這種簡(jiǎn)潔性讓解釋網(wǎng)絡(luò)的工作原理變成小菜一碟。
Photoshop對(duì)非凡的設(shè)計(jì)非常重要。對(duì)那些從沒(méi)用過(guò)它的人來(lái)說(shuō),它有點(diǎn)兒嚇人(至少對(duì)我來(lái)說(shuō)是這樣),但是用Photoshop做出來(lái)的網(wǎng)站比典型的bootstrap(譯者注:由Twitter推出的一款開(kāi)源前端框架)站點(diǎn)要高端一個(gè)檔次。而你真正要知道的只是混合、協(xié)調(diào)功能就夠了。任何一個(gè)相當(dāng)成功的開(kāi)發(fā)者都會(huì)需要Photoshop,所以學(xué)會(huì)它并且在你所有的項(xiàng)目中使用它非常重要。
項(xiàng)目2涉及到Javascript的大量使用。這個(gè)項(xiàng)目涉及到使用ajax(譯者注:一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的 Web 應(yīng)用程序的技術(shù))的需要,facebook的API,以及cookies。這是個(gè)將所有網(wǎng)絡(luò)編程基礎(chǔ)聯(lián)系起來(lái)的絕佳項(xiàng)目。這個(gè)項(xiàng)目所需要的技術(shù)范圍比第一個(gè)要更廣,我覺(jué)得這也向更多更復(fù)雜的項(xiàng)目邁進(jìn)了一步。在這段時(shí)間里,她們憑借GIT(譯者注:分布式文件管理工具)通力合作。這可是一個(gè)開(kāi)源項(xiàng)目??!
這時(shí),F(xiàn)ong和Eva已經(jīng)能相當(dāng)自如地構(gòu)造網(wǎng)絡(luò)應(yīng)用了。也正是這時(shí),她們意識(shí)到,代碼是多么地脆弱,一個(gè)細(xì)微的改動(dòng),就能導(dǎo)致滿(mǎn)盤(pán)皆輸?,F(xiàn)在,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)就顯得有重要意義。我們花了幾天時(shí)間重溫了rspec,Eva和Fong則寫(xiě)出測(cè)試案例作為每天早晨的編程練習(xí)。我之前提過(guò)她們每天早晨都要解決一個(gè)技術(shù)問(wèn)題嗎?從第28天開(kāi)始,她們就必須為這些技術(shù)問(wèn)題寫(xiě)出rspec,在她們開(kāi)始編程之前也不例外。
通過(guò)負(fù)責(zé)一個(gè)設(shè)計(jì)技術(shù)范圍廣泛的項(xiàng)目(比如Dragpic),你能學(xué)到很多,遇到很多你希望能有更優(yōu)解的問(wèn)題。只有這樣,你才能這正意識(shí)到那些幫助你的框架的價(jià)值。我還沒(méi)有找到任何一個(gè)優(yōu)秀的backboneJS教程,所有教程都一下子提供了太多信息。以下是我教授它的方法:
第一步:學(xué)習(xí)模型。僅為一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)條目創(chuàng)建一個(gè)模型。學(xué)會(huì)如何去修改和保存。
第二步:學(xué)習(xí)視圖。為你已經(jīng)在做的模型創(chuàng)建一個(gè)視圖。添加事件接聽(tīng)程式,體會(huì)視圖如何能夠隱蔽地與模型連接,以及這一切組裝為一體是如此地合適。
第三步:集合的意義現(xiàn)在就明確了。 你不可能手動(dòng)打印輸出每一個(gè)模型,尤其是當(dāng)你不知道模型具體數(shù)量的時(shí)候。
我們沒(méi)有學(xué)過(guò)常規(guī)課程,到現(xiàn)在為止,我也不認(rèn)為這有什么要緊。
假如你現(xiàn)在還沒(méi)怎么注意,我們已經(jīng)在短時(shí)間內(nèi)涵蓋了大量的材料了。偉大的程序員適應(yīng)變化,因此我們最后一個(gè)計(jì)劃就是學(xué)習(xí)Android系統(tǒng)。在編程中你不能忽視移動(dòng)設(shè)備,這塊實(shí)在是太重要了。我教她們Android編程,這不是特別難,Android編程與web編程非常類(lèi)似。在視圖上你有XML(譯者注:extensive makeup language,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言),同時(shí)也有足以和web控制器相媲美的Java代碼。模型-視圖-控制!通過(guò)用Ruby語(yǔ)言和Java語(yǔ)言工作,F(xiàn)ong和Eva開(kāi)始尋找編程語(yǔ)言之前的共同點(diǎn),成為了編程語(yǔ)言不可知論者。對(duì)她們來(lái)說(shuō),編程語(yǔ)言?xún)H僅在語(yǔ)法上有所不同,但工作起來(lái)卻是一個(gè)道理(其實(shí)不是這樣,稍后我會(huì)對(duì)其進(jìn)行辨析,厘清混淆)。
女孩們?cè)诰幊躺咸熨x異稟。
沒(méi)有獲得計(jì)算機(jī)科學(xué)的學(xué)位不是個(gè)不學(xué)編程的借口。
在快樂(lè)中編程,人人都能學(xué)。
聯(lián)系客服