本文翻譯自http://www.devdungeon.com/content/i-know-how-program-i-dont-know-what-program?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=social
原文標題:"I know how to program, but I don't know what to program"
我熟悉編程語言,但是不知道寫什么程序
我看到新手開發者總伴隨這一個問題。他們花費了一些時間學習了一兩門編程語言的基礎,做練習題也很順利,但是他們不知道如何運用自己學到的東西。這個問題通常描述為:“我熟悉編程語言,但是不知道寫什么程序”。通常的回復是:“做編程挑戰”、“參加一個開源項目并貢獻代碼”、或者“做一個游戲”。
做編程挑戰是一個很好的智力練習,但是卻很難幫助一個人學習如何開始一個項目。對一個開源項目貢獻代碼是一種方法。你也許能夠學習到一個真正的項目的結構,并且能夠提升你的語言能力,但是學不到一個項目的完整周期。有些項目對新手來說過于復雜,甚至可以說是恐怖。做一個游戲是另一種方法。游戲是很有趣的!我就是通過用QBASIC語言編寫游戲來開始的。但是又會出現同一個問題."我想要編寫一個游戲,但是不知道寫一個什么游戲"。
作為教授音樂同時也教授編程的人,我發現音樂學生有同樣的問題。“我知道所有的和弦,我十指靈活,但是不知道寫什么樂曲”。對于音樂,其實我們有一個很好的答案。學習如何創造是有套路的。音樂家通常來說并不是一開始就寫自己的樂曲。有些音樂家一種都沒有編寫過自己的樂曲,而是演奏他人的樂曲。在編程領域,看法稍稍有些不同。
在編程社區中,通常的看法是:“不要重復發明輪子”。一想到要重寫現有的一個成熟穩定的庫,任何人都會皺眉頭。通常來說這是一個很好的規則,但是對新手來說,不應該抗拒重新發明輪子。為了學習或者練習,重新造一個輪子是完全OK的!這是學習的一個重要組成部分。例如,編寫你自己的ls,mv,wget,或者cowsay命令。如果你想要向游戲領域發展,那么嘗試做自己版本的Pong,Tetris或者Space Invaders。他們不需要擁有和原版的完全相同的特性或者一定要完全相同,但是你從零開始實現你的目標,并且你做到了。
不要認為你在開始寫程序之前必須要有世界上最好的創意。我在音樂家身上看到過相同的心態。嘗試第一次就寫出一曲杰作,把所有精力都投入到一首曲子,結果沒有站在更遠的角度看待問題。更遠的角度就是你將會寫出很多很多樂曲,并不是只有這一首。你寫出的第一首樂曲可能會很爛,你有可能直接把它揉成一團。這是OK的!不要嘗試第一次就寫出碉堡炸裂震驚全世界的10分鐘的史詩篇章。你需要學習寫樂曲的過程,從你自己的經歷中學習,每周投入時間來練習。在寫出優秀的程序之前,你首先會寫出糟糕的程序。克服它,經歷它,獲取經驗,你就可以在任何部分隨需創造。(Get over it, get through it, and get the experience so you can start to improvise on demand in any key.)
我們讓人們以“Hello,World”開始是有原因的,因為在他們旅程的這一點,實現這個目標意味著他們掌握了必要的基礎。你理解了如何編譯,如何運行,如何調用一個方法,如何傳遞一個參數。能夠獨立實現另一個已存在的程序,在你學習編程的路上也是一個巨大的進步,甚至可以說和“Hello,World”一樣重要。當你完成了這個目標時,說明你又克服了一些困難。你需要搞明白從哪里開始,如何做好計劃,如何組織你的程序,如何處理bug,自己親自使用,最終打包你的程序,讓它變成一個可用的東西。即使實現一個很小的程序,你也能學習到這個完整的過程。
你也許好奇為什么自己實現一個程序的克隆版本怎么會幫助你產生新的想法。和音樂類似,它需要創造力。在音樂領域,為什么演奏別人的音樂能幫助你學習如何寫自己的音樂呢?首先,你要了解別人是怎么做的。你需要理解別人如何組織樂曲,別人使用了什么音樂范式。當你學習過很多次別人的樂曲之后,你就能以一個更廣闊的視角來看待問題,隨后你就有更多的知識可以利用。你把從不同地方學到的小范式組合在一起,并且使用一些你見到過的其他范式。你也許會調整這些范式,組合它們,或者完全打亂它們。就像人們說的,如果你要打破規則,首先要學會規則。在編程領域,我們有類似的規則,例如MVC。這是一個穩定并且被廣泛接受的編程范式。在音樂中,我們有類似的東西。例如 I-V-vi-IV。當然這不是唯一的一個,但是是一個很好的例子。
簡單來說,練習和創造是連接在一起的。創造力這個概念在編程領域常常被人們忽視,實際上它很重要。你注意過多少個程序員同時又是音樂家呢?音樂涉及很多技術分析,結構組織,以及范式,但是人們通常認為音樂是純粹的創意努力的結果。編程經常被視為是純粹的技術行為,但實際上它常常伴隨著創意的功勞。你可以通過復寫其他的程序來培養你的創造力。在你重寫的時候,你會發現你以一個新的方式來調整這個程序,或者自己添加一個新的功能。它同樣會啟發你關于全新項目的想法。創造力會在這個過程中顯現,但是你首先要學著把前面的音樂彈奏出來。
經過一段時間,你會發現你可以以編程的想法看待幾乎任何事物。你可以自動執行任務、解決實際的問題。你將會有一個長長的想法清單,只是苦于沒時間去實現。你將有能力即時解決問題。“哦,這里有個電子表格,有100張表的數據需要格式化,可以把他們分隔到不同的文件中,轉化為一個csv文件。就這么做!” 不要因為想要一下子做出一個最好的項目而束手不前。寫出你能寫出的程序。關于其他新程序的想法會隨之產生。
你們有多少人曾經處于“我不知道編寫什么程序”的狀態中?你怎么解決這個問題的?你對其他處于這種狀況的人有什么建議呢?