我是如何學習計算機程式設計的(斯坦福大學)
我是如何學習計算機程式設計的(原文連結)
我在很小年紀的時候就開始學習程式設計,我學習程式設計的方法是建立大量的不同的網站。下面列出的是我建立的主要的網站,其中最早的一個是我11歲時開發的。我希望讀者能從我這些複述中獲得的資訊是:如果你想學習程式設計,做大量的練習性的專案是非常必要的。
學習一種技術最好的方法就是練習,練習,練習。所有我知道的最優秀的程式設計師都深深的享受程式設計——程式設計是一件讓他們幹起來無由的高興的事情。也因此他們大量的程式設計。經常,那是一種不健康的廢寢忘食。學習如何程式設計——以及如何編好程——並不需要你具有超人的能力。你只需要去按照自己的意願動手去做,做出點什麼東西。
做什麼東西並不重要,重要的是你找到東西動手去做。我所認識的那些優秀的程式設計師,他們都有各自不同的最初學習程式設計的動機。有些人學習程式設計是為了開發動畫遊戲。有些人是為了解決他們在使用計算機時遇到的問題,或讓工作更有效率。有些人是為了開發產品來滿足人們的需求。有些人(真正的程式設計師)學習程式設計只是他們為了深入瞭解計算機工作原理的步驟之一 ;他們希望能搞清楚這種機器。有些程式設計師程式設計只是因為他們享受解決難題的挑戰。
讓所有這些“優秀程式設計師”統一起來的唯一因素就是,他們全因為生活中的某些原因而為程式設計著迷,繼而花大量的時間程式設計,做大量的,大量的用於練習的專案。
那麼,我就不再羅嗦了,下面就是我如何學習程式設計的故事:
我的第一個網站
在我大概十一二歲的時候,我感到需要給自己做一個網站。我已經記不清為什麼需要一個網站了,只記得那樣就開始做了。於是我就在網上搜索關於網頁、Web瀏覽器、HTML如何工作的資訊。很多的資訊我發現都已經過時了,有些明顯是錯誤的或給了錯誤的嚮導(例如為IE瀏覽器和Netscape瀏覽器分別做網站),但過程是非常的有趣的,我學到了很多新東西。
儘管在網上搜到了很多粗製濫造的的資訊,我還是想辦法做了一個簡單的網站,我叫它“Feross的網站”。開發它,我使用的是微軟的Frontpage,那是一個非常棒的所見即所得的HTML編輯器。我使用很常見的語法,例如粗體,斜體等對網站做修改,在編輯器裡即時檢視這些HTML標記能達到的效果。這是很有效的學習方式。
下面是我的第一個網站的截圖。這個網站已經不存在了。
你從上面的圖片上看不出來,這個網站上的每個元素都在動,閃爍的動畫,還能出聲。我在網站的每個頁面上都放置了不同的MIDI格式的歌曲。而且都是自動播放,你沒有辦法讓它們停下來,除非把電腦消音。哈,這就是當年流行的網站設計風格。
等再長了幾年歲數後,我們重新設計這個網站,讓它變的漂亮些。我使用了在網上發現的一些免費的網站模板,用微軟的畫圖工具修改了一些圖片。
經管我大量的依賴於模板,但這不失為一個學習HTML和Web瀏覽器的好方法。“Feross的網站”除了用來收集我小時候的一些視訊外沒有其它用處,所以不久後我就對它失去了興趣。
我的第一個真正的
當我9年級(14歲)時,我和我的朋友都非常著迷與觀看像Newgrounds 和eBaumsWorld這樣的網站上的flash視訊和動畫(這是2005年之前,還沒有YouTube)。我在這種網站上花了大量的時間,所以我知道所有最好的視訊和遊戲。我想,如果做一個網站來收集這些在網上發現的我喜歡的flash動畫、視訊、遊戲,會是一件很酷的事情。這就是我做出FreeTheFlash網站的初衷。它是這個樣子的:
我從開發“Feross的網站”的過程中學到了很多HTML知識,這次我使用了Macromedia 公司(現在的Adobe公司)的Dreamweaver編輯器,這個東西能讓我在網站裡重複的頁面使用同一個模板。
一段時間後,我意識到,我應該讓網站動起來,聽說是應該使用一種叫做PHP的程式語言來做網站,而不是隻使用靜態的HTML。於是,我買了花了20美元從Amazon買了一本書,叫做《PHP and MySQL for Dynamic Websites》,使用PHP和MySQL對網站進行了重新設計。我還給它進行了新的美化:
在高中時期我對這個FreeTheFlash 網站的開發持續了2年。它對於我的第一次嘗試做一個“真正”的網站來說是相當成功的——在2006年,它獲得了60萬人/次訪問,頁面瀏覽量達3百萬。FreeTheFlash 讓我知道了做出一個產品、讓它傑出、看大量的人使用它,是一件多麼自豪的事情。它讓我想做出更大的網站。
我的第二個網站
在中學,我在上計算機課程時做了大量的筆記。於是,在11年級時,我覺得應該把這些筆記放到網上,讓那些不喜歡看課本的學生使用。我做了一個網站,叫做StudyNotes,使用的是PHP和一個叫做Joomla的內容管理系統。我也嘗試過使用Drupal,但發現它太複雜了。
同年,我為我的學校Key俱樂部分部做了一個網站,如今也不用了。
這段時間,我花了大量的時間泡在WebmasterWorld裡,這是一個論壇,主要關於網站站長和SEO專家推測Google演算法,討論AdSense技巧,除錯網站問題等。
大量的學習和閱讀
等我進入了斯坦福大學後,我學習了大量的計算機課程,諸如CS106X 和CS107,我還超前學習了部分 CS106 課程。
所有的課餘時間我幾乎都在閱讀關於設計、程式設計、瀏覽器和JavaScript等方面的資料。一般每天4-5個小時。
如果你要問我都讀什麼?亂七八糟的。但大部分都是我敬仰的設計師和程式設計師寫的部落格。你可以從這篇部落格的右側看到我列出的部分部落格連結。
關鍵一擊
之後,在2010年夏天,當我在Facebook實習時,因為跟一個朋友打賭,我開發了YouTube Instant,它是一個用來實時搜尋YouTube視訊的網站。這個網站在建成之後的10天裡獲得了1百萬使用者的訪問量,YouTube的CEO甚至給我發訊息說提供一個職位給我,你可以從這裡看到這些媒體的躁動。
我知道YouTube Instant的成功歸功於當前的好時機和一點幸運。我想,我們很多人不知道自己能做出什麼。
繼續前行
我注意到很多人使用YouTube Instant來聽音樂視訊,這讓我想到了另外一種使用YouTube API的好方法。於是,我的朋友Jake Becker 和我在2011年的頭3個月裡開發了Instant.fm,它能讓你輕鬆的向朋友分享音樂播放列表。通過這個專案我們都學到了很多新的東西。
在這個工程中我掌握的技術:
以及其它一些我們學會使用的東西:
- Nginx (web server)
- Supervisor (to daemonize Tornado)
- Apache Ant (to build and deploy the site after a push)
動手去做!
我把從11歲就開始做的東西都不厭其煩的曝出來,目的就是要說,如果你想學習程式設計,你需要動手去做東西!現在就去。不要找任何藉口。
做東西是最好的學習方法。
從頭到尾讀一遍程式語言書籍是一件很無聊的事,讀到一半你就讀不下去了。但,如果你想做一個專案,你在做的過程中會知道你該學習哪些知識,這是認識和掌握知識更有效的途徑。
計算機課程
大學裡的計算機課程是學習程式設計的另外一種十分有效的方法。大多數好的計算機課程都十分強調學習電腦科學領域裡的重要概念和正規化,而不是教你某個特定的語言。這能讓那些從來沒有接受過正規教育的人在自學時開闊眼界。
記得在斯坦福大學上第一堂計算機課程時(那是教授C++的課程),我在想“怎麼可能變數前不帶$符號呢?”當時我只使用過PHP!我用了好長一段時間才改掉在變數前加$符號的習慣!
在軟體公司工作
另外一個提高程式設計水平的方法就是到軟體公司實習,比如Facebook或Quora,最近的兩個夏天我就是在這些公司裡度過的。你會從那些優秀的人那裡學會如何更好的程式設計,如何閱讀和理解他人的程式碼,如何在大專案中進行團隊合作。
還是那句話——比什麼方法都管用——學習程式設計最好的方法就是做專案練習。我是不是重複這句話無數次了?
如何學會程式設計:
- 做練習性專案。
- 看程式設計書籍。
- 做專案練習。
- 上計算機課程。
- 做練習性專案。
- 讀程式設計類部落格。
- 做專案練習。
這就是我能給出的最好的建議。
祝程式設計愉快!
你第一要做的是開始去做
很多人都問我,“我想做web設計,如何入手?”或“我要開發web應用程式,需要學哪些技術?”,當然,推薦他們一摞書籍或十幾篇關於55條超越競爭對手115%的技巧文章是最簡單的,但問題的實際情況是,如果你想開始做某件事,你並不需要先去學會什麼新知識。對你來說,最重要的卻是立即著手去做。
行動起來,著手去做。如果你想學web設計,那就去做個網站。如果你想成為企業家、在網上買你的產品,那就去做個電子商務應用程式。也許你現在還不具備這些開發技能,但何必為這些擔心?也許你根本不知道你究竟缺少哪些技能呢。
從你能做的開始做
如果你想在web上做點什麼,不要擔心著需要去學HTML,CSS,Ruby,PHP,SQL等知識。它們對於完成一個最終的產品是必要的,但開始時你並不需要它們。你可以在Keynote或Powerpoint裡把你的想法的物理模型模擬出來。用方框把一個個表單域表示出來,標上說明,把一個個頁面用線關聯起來。你可以利用現有的軟體知識製作出一個非常健壯的使用者介面互動原型。根本沒有任何計算機知識?那就用你的鉛筆和紙和便利貼。畫出一個個螢幕樣式,把它們貼在牆上,試試各個介面的流程。
你也許甚至連需要什麼技能都不知道,所以就不要憂慮這些了。從你已經知道的著手。
你可以用草圖或幻燈片做很多事情。你可以看到你的想法形象化了,這樣可以去評價它是否是一個真正具有價值的東西。到了這一步,你才可以進行下一步,去學習些HTML知識,把你的原型在瀏覽器裡實現。此時,你要儘可能的發揮你所具有的知識和工具,把事情做的最好。
防止不自信
很多時候我們不能開始做事、無可作為的原因是缺少技術、資源、和工具。但這真正阻擋我們的卻是自我挑剔和找藉口。在Drawing on the Right Side of the Brain這本優秀的書中,作者貝蒂·愛德華討論了為什麼當還是孩子時喜歡寫寫畫畫而到了青春期大部分人都停止了開發這種能力。
“跟據很多成人的繪畫技能來看,進入青春期標誌著人們在藝術才能方面發展的突然中止。作為孩子,他們面臨一個藝術危機,面臨著他們對周圍這世界日益增長的複雜的意識和自身藝術技能水平的衝突。”
孩子們的自我批判意識會逐漸增強,他們同樣喜歡繪畫,但當他們意識到畫不好時,就完全放棄了繪畫。
這種感覺會持續到成年。我們想起設計一個網站,或去開發一個應用程式時,如果我們擁有的資源和工具達不到我們預設的要求和水平,我們永遠不會開始去做。即使網際網路讓我們看到了那些無數的偉大作品、天才個人和優秀的操作過程作為樣板,也無濟於事。人們很容易跟那些最好的比較起來發現自己的各種不充分和缺失,但從來沒想過,任何人都不是天生都擁有這些技能的,如果他們不從開始做起,永遠也走不到這一天。
去幹——無須試
成功的人會找到一種方法讓自己堅持做下去——儘管疑慮不滿。藝術家文森特·梵高,只是在他的人生的後十年才稱得上是藝術家。我們都因他的偉大藝術作品而認識他,但他並非一開始就是大師。對比一下Drawing on the Right Side of the Brain這本書裡提供的兩幅畫,一副是其早期的作品,一副是兩年後的作品:
他不是什麼神童(27歲才開始學畫),他通過艱苦努力練就了一身技藝。如果當他感覺到技術水平比不上保羅·高更時,他屈服了自己的疑慮和絕望,他很有可能就放棄了自己的前程。
所有的這些,都是想說一個道理,有很多本來該成的事情因為我們沒有去做而沒有成。如果是由於認為你自己不夠好,不具備技能、知識、經驗,而放棄追逐自己的夢想,那簡直就是浪費。事實上,事情中存在問題正是一種驅動和鞭策。它會給你巨大的挑戰同時巨大的回報。為什麼要不厭其煩的做那些已經做過一百遍的事情呢,你已經從中學不到什麼了。不要再擔心為了完成一個任務你需要知道哪些東西,你已經擁有了開始去做所需要的任何東西了。
同時學習多種程式語言其實很容易
大概是兩年前吧,我做了個決定,要去學習程式設計。我買了本PHP書,開始一邊閱讀一邊做裡面的練習題。我把主要精力都放到PHP上,不理會任何其它的語言,因為我有個習慣,一旦開始做一個事情,我們會集中所有的注意力,先把這個事情做完,然後才去做其它的事情。於是,我嘗試這開發一個Web應用程式(一個絕妙的創意,一個能使我成為另外一個Facebook創始人那樣的應用)。一點一點的,進度很慢,我的應用(這個即將讓我成為百萬富翁的應用)慢慢的成型。最終,它跑起來了。自然了,沒有人來用它,做的太爛了,到處是bug。之後我又有了一個(絕妙的)創意。我想這次就不用不停的在書本里翻來翻去了,不用整夜整夜的在google上搜索拷貝程式碼,修改它們,讓它們能在我的應用程式裡運行了。我以為我坐下來就能寫出我的PHP應用。但我終於明白,實際上我什麼都沒學會,儘管我讀了很多關於PHP的資料,儘管我已經開發出了一個應用程式(很爛,但也是一個)。我認識到,整個的這段時間我所做的事只是學習了一點PHP語法,使用幾段程式碼解決一個難題,而這些拼湊的程式碼最終讓我的應用面目全非。
我十分的生氣,停止了所有的開發。我把我的Web應用的創意完全丟到了腦後,開始四處瀏覽所有我覺得有趣的開發知識。我發現了Ruby On Rails,這個東西看起來很酷,但我不知道它為什麼很酷,我對ruby毫不瞭解,但卻花了不少時間學習Ruby On Rails,然後我學著開發Android應用,讀跟它相關的資料,這把我引向了學習Java,但我沒有停止學習Rails,我在iTunesU上報了一個Java的課程,之後在我工作的時候我又開始閱讀PDF版的Python教材,因為Python裡的一些東西引起了我的興趣….(也許是它的這個名稱)。噢!我還有一本C++書,我把它找了出來,在睡覺前我開始讀一些C++的知識。因為我仍然不知道Ruby這種語言,所以我也開始學習Ruby。當我研究Java有些厭煩時,我還試了試Objective-C,而JavaScript看起來也不錯,我也試圖要掌握它。這些全是在同時進行的。
如果是之前有人問我,我肯定會說這是最糟糕的一種學習程式設計的方法。但事實證明,這是最有效的一種學習方法。這種學習方法的結果是,我終於不再關注PHP的語法,開始把不同語言間的相似之處關聯起來。我現在是在真正的學習原理,而不是為了做什麼而在google上搜索正確的語法。我開始領悟相似的東西在各種不同的語言、不同的平臺上的不同之處。這些認識對我來說很重要。我的關注不再是PHP,我的關注現在是程式設計。
我希望這些經驗對於那些跟我兩年前一樣處境的人有些幫助,那些跟我當年有相同想法的人應該通過不同的視角來看那些相同的東西,這樣才能真正的領會它們!