就像我前面日志裡提到的,伊娃和芳來舊金山跟我學編程。在這篇博客中,我會介紹我是怎麼教她們的,我構建教她們的方式的理由,以及這種方法是怎麼起作用的。按時間順序去列明她們所學到、做到的那些事兒很簡單,但是,這沒什麼幫助,而且你也容易錯過重點。重要的是要了解詳情,以及為什麼它管用,所以我將從基本原則來開始。做好准備,文章比較長。
在你的整個編程歷程中,以下原則要牢牢記住:
1)傳播:
在伊娃和方開始之前,我為她們創建了個博客。我告訴她們,記錄下她們的編程之旅和她們所學到的。在開始的時候是很難的,你可以問她們。我花了一個星期的唠叨,她們才寫一次博客。但現在,如果不寫寫她們花了大把時間去做的那些項目,則像是錯的了。
如果你在你的項目裡用的是API(應用程序編程接口),發微博或者郵件給那公司,告訴他們你對他們的API的想法。當你在你的編程馬拉松裡獲得了一個獎勵,寫條好微博@他們以示感謝,或者發篇日志。讓這日志空前美好,然後推薦到黑客新聞欄目,就像它必將登上首頁一樣(盡管大多數是不會的)。
給你的編程之旅一個健康的傳播過程的最大好處是,它讓你對你的項目負責人,這也就引入了我的下一條原則。
2)完成:
芳和伊娃都知道,完成一個項目是很難的,但也是很重要的。我說得很清楚,除非她們寫一篇日志,在twitter上@那API公司,或是在黑客新聞版上發這項目完成的消息,我們都不會啟動一個新的項目。盡管第一個項目只是一個的井字棋游戲,但這是她們做得最好的井字棋游戲。你從來都不想寫一個蹩腳的程序,所以多麼簡單的或不相干都不重要。如果你要寫一個項目,那它必須是你能寫出的最好的程序。我已經見過太多的程序員在一些看不到黎明的非正式項目上費時耗力。如果你正在學習編程,你必須從一開始就學習,珍惜你的時間和精力,完成您的項目來證明它。
最後的20%需要80%的努力。開發人員可以一兩天就能把“點子”變成具體可執行的。而要發布一個“完美”的產品,需要兩倍的時間來完成每一種情況下的測試,解決每一種臨界問題。把80%的精力都花你項目最後的20%,這將在許多許多訪問中成就傳奇。 最後的20%需要80%的努力。開發人員可以一兩天就能把“點子”變成具體可執行的。而要發布一個“完美”的產品,需要兩倍的時間來完成每一種情況下的測試,解決每一種臨界問題。把80%的精力都花你項目最後的20%,這將在許多許多訪問中成就傳奇。
3)思考:
如果你被卡住了,請不要直視你的代碼。出去散散步,呼吸一下新鮮空氣,並考慮一下吧。你被卡住了,是因為你的邏輯除了錯,而解決的最佳辦法就是在腦海或者紙上一步一步地理清楚。程序員獲得高額的酬勞是因為他們在思考。問題解決是依靠你的思考,編寫代碼就是這麼可惡的工作。優秀的項目經理通常有一個豐厚的程序背景,並且在思考和解決問題方面訓練有素。
根據這種說法,如果你被卡住了20多分鐘,而且你也無法突破,那就問別人吧。如果你20分鐘都沒有得到任何線索,那麼接下來的一個小時你不會有更多進展。信托伊娃。她有一天浪費了5個小時,就因為一個愚蠢的錯誤,實打實的教訓啊。散個步,去干點兒別的事兒。然後再回來搞它。能夠脫離出自己的問題,轉移注意力是一個技巧。
4)再思考:
現在你可能想通了,思考在一個程序員的生活裡地位重要。請一定不要——特別是如果你正在學習如何寫代碼時——復制粘貼代碼。如果你想學習如何怎麼寫代碼,復制粘貼—— “你看,它成了!”——不會讓你有任何突破的。相反,當你看到代碼,你必須理解了它在做什麼,再去嘗試調試它。當你越來越能駕輕就熟理解別人的代碼時,把它簡化到恰好滿足你的需要,然後再寫出來。如果你從初學階段就習慣這麼做,在幾個月裡你就可以成為一個非凡的開發者。
5)谷歌:
學習如何自己解決問題。除非你被卡住了至少20分鐘,不要詢問編寫代碼的問題。程序員必須獨立。他們是偉大的思想者和偉大的傳播者。要成為其中一員,你必須有邏輯地思考,並找出問題發生的原因。很多年輕的開發人員所面臨的一個問題是,他們很難寫出他們真正需要的東西。我們很多人都經歷過這個過程,你知道問題是什麼,但是你不知道怎麼去找到它。你必須從初學階段就學會正確地開發程序,這是個技巧,它很好地回扣了第一點裡說的傳播。
現在,記住了這5個點,來看看伊娃和方學習的時間表:
第1-3天:通過Ruby學習編程的基礎知識。
我選擇了Ruby,因為用來上手變成它是最簡便的。Ruby的語法限制很少(空格與制表符,類型聲明等),因此伊娃和方能夠專注於編程的思想過程,而不是去攻克語法規則。她們學會了if語句,循環,數據結構,並解決一些編程題目,如FizzBuzz(譯者注:當滿足一定的條件時打印Fizz或者 Buzz或者FizzBuzz,是初級編程訓練題目),替換字符串中的字符,轉換一個數組,找出最大值。重要的是要了解類和對象。
*注意*我不教她們Ruby的特定語法。我告訴她們對參數要始終使用括號,而且每個函數結束時一定記得返回。這樣一來,當她們學習其他語言時,上手更快。
第4天:HTML
HTML和CSS嚴格說都不算一種語言,所以沒有必要花太多的時間在這上邊。伊娃和芳花了一天時間在HTML上,並且玩了一些標簽,還研究了表單、信息頁,等。我確信,她們只用HTML標簽。這將建立起用CSS的興奮。在這裡需要重點學習的是區分塊HTML與內聯HTML,區分標識與分類。
第5天:CSS
在玩了HTML後,“你怎麼把這個放那兒,你怎樣讓這個丑陋的HTML頁面更漂亮?”的問題來了。CSS是一個完美的答案。今天就開心地讓你的網頁更有型吧(所有的HTML頁面都是前一天做的)。這裡學習的重點是相對/絕對/固定定位,HTML浮動元素,以及如何用絕對、固定定位來控制正常的浮動。
第6-7天:用jQuery來做JavaScript
jQuery的需要一點點努力來習慣,因為有的程序涉及到jQuery的框架,這需要一點兒時間。花了幾天時間,讓她們的HTML頁面有交互性。
第8-15天:第一個項目——井字棋游戲
在這一點上,芳和伊娃了解了HTML/ CSS/ Javascript,但還沒有很好地適應之。這是啟動她們第一個項目(井字棋游戲)的最佳時間。盡管她們在2天內完成了這個項目,優化它又花了好幾天。最後的20%需要80%的努力,這是事實。作為初學者來說,重要的是學習來完成你的項目。
第16-20天:Sinatra
在那個像是從來不能完結的井字棋游戲之後,學新的東西對芳和伊娃來說不能更激動人心了。學習服務終端代碼對於她們一直在做的事兒來說是全新的體驗。我選擇sinatra因為它是我所用過的最干淨、簡單的web框架語言了,而這種簡潔性讓解釋web的運作變成小菜一碟。
第20-22天:PhotoShop
Photoshop對於絕妙的設計非常重要。對那些從來沒有用過它的人來說,它足夠唬人(至少一度對我是的),但是借助Photoshop創立的網站,比起那些傳統的前端框架網站要高一個檔次的。而且事實上你只用知道混合選項就夠了。任何一個相當成功的開發者都會需要Photoshop,所以學會用它很重要,並且要用它服務你所有的項目。
第20-27天:第二個項目—— “拖圖片”
項目大量涉及JavaScript的運用。該項目涉及使用Ajax請求,Facebook的API,和cookies。這是一項聯結其所有web編程基礎的大工程。這個項目涉及的范圍大於第一個項目,我覺得這是向更復雜項目邁進的一大步。在此期間,他們通過GIT(譯者注:一個開放源碼的版本控制軟件)合作。這是一個開源項目!
第28-30天:RSpec
至此,芳和伊娃已經適應了構建Web應用程序。也是到這個關頭,她們已經意識到代碼多麼容易打破,而一個改變又如何摧毀一切。現在,測試驅動開發適時引入。我們在RSpec上花了幾天時間,伊娃和芳用寫測試案例當每天早上的編程練習。我有沒有提到她們每天早上都要解決一項技術問題?從第28天開始,她們不得不在她們開始寫代碼前也寫些RSpec。
第30-35天:BackboneJS
著手與一個涉及較廣泛的項目(比如“拖圖片”),你可以學到很多東西,並且遇到一些你希望有更好解決辦法的問題。只有這樣,你才真正欣賞那些幫助過你的的框架的意義。我還沒有找到很好的BackboneJS的教程,所有教程都一下子提供了太多的信息。我是這麼教的:
首先,了解模型。創建一個模型,而且僅供一條數據庫條目所用。學習如何修改它,將它保存。
其次,學習視圖。為你之前一直在做的那個模型創建一個視圖。添加事件偵聽器,領會視圖如何如此貼切地綁定模型,以及這一切又是如何彼此貼合。
第三,現在就可以說清楚集合的意義了。你不能手動鍵入每一個的模型,特別是如果你不知道有多少模型時。
我們從來沒有學路由的課程。我還不覺得路由重要。
第35-40天:Android
如果你還沒有完全注意到沒有,我們已經在很短的時間裡涵蓋了很多的東西。好程序員需要時刻適應變化,所以我們的最後一個項目是學習Android。在編程中,你不能忽視移動終端,它太重要了。我教了她們Android編程。這不是很辛苦,Android編程和web編程是非常相似的。你有了視圖的 XML(可擴展標記語言),你就有了可以與網絡控制器匹敵的Java代碼。模型-視圖-控制!通過使用Ruby和JavaScript,芳和伊娃開始尋找編程語言的相似之處,讓她們與特定語言脫離關系。對她們來說,編程語言有不同的語法和相同的工作方式(並非事實,但我們會稍晚些區別,以避免混淆)。<