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