本文翻譯自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"
我熟悉編程語言,但是不知道寫什么程序
我看到新手開發(fā)者總伴隨這一個問題何暇。他們花費了一些時間學習了一兩門編程語言的基礎(chǔ)陶夜,做練習題也很順利,但是他們不知道如何運用自己學到的東西裆站。這個問題通常描述為:“我熟悉編程語言条辟,但是不知道寫什么程序”。通常的回復是:“做編程挑戰(zhàn)”宏胯、“參加一個開源項目并貢獻代碼”羽嫡、或者“做一個游戲”。
做編程挑戰(zhàn)是一個很好的智力練習胳嘲,但是卻很難幫助一個人學習如何開始一個項目厂僧。對一個開源項目貢獻代碼是一種方法。你也許能夠?qū)W習到一個真正的項目的結(jié)構(gòu)了牛,并且能夠提升你的語言能力颜屠,但是學不到一個項目的完整周期。有些項目對新手來說過于復雜鹰祸,甚至可以說是恐怖甫窟。做一個游戲是另一種方法。游戲是很有趣的蛙婴!我就是通過用QBASIC語言編寫游戲來開始的粗井。但是又會出現(xiàn)同一個問題."我想要編寫一個游戲,但是不知道寫一個什么游戲"街图。
作為教授音樂同時也教授編程的人浇衬,我發(fā)現(xiàn)音樂學生有同樣的問題〔图茫“我知道所有的和弦耘擂,我十指靈活,但是不知道寫什么樂曲”絮姆。對于音樂醉冤,其實我們有一個很好的答案秩霍。學習如何創(chuàng)造是有套路的。音樂家通常來說并不是一開始就寫自己的樂曲蚁阳。有些音樂家一種都沒有編寫過自己的樂曲铃绒,而是演奏他人的樂曲。在編程領(lǐng)域螺捐,看法稍稍有些不同颠悬。
在編程社區(qū)中,通常的看法是:“不要重復發(fā)明輪子”归粉。一想到要重寫現(xiàn)有的一個成熟穩(wěn)定的庫椿疗,任何人都會皺眉頭。通常來說這是一個很好的規(guī)則糠悼,但是對新手來說届榄,不應該抗拒重新發(fā)明輪子。為了學習或者練習倔喂,重新造一個輪子是完全OK的铝条!這是學習的一個重要組成部分。例如席噩,編寫你自己的ls班缰,mv,wget悼枢,或者cowsay命令埠忘。如果你想要向游戲領(lǐng)域發(fā)展,那么嘗試做自己版本的Pong馒索,Tetris或者Space Invaders莹妒。他們不需要擁有和原版的完全相同的特性或者一定要完全相同,但是你從零開始實現(xiàn)你的目標绰上,并且你做到了旨怠。
不要認為你在開始寫程序之前必須要有世界上最好的創(chuàng)意。我在音樂家身上看到過相同的心態(tài)蜈块。嘗試第一次就寫出一曲杰作鉴腻,把所有精力都投入到一首曲子,結(jié)果沒有站在更遠的角度看待問題百揭。更遠的角度就是你將會寫出很多很多樂曲爽哎,并不是只有這一首。你寫出的第一首樂曲可能會很爛器一,你有可能直接把它揉成一團课锌。這是OK的!不要嘗試第一次就寫出碉堡炸裂震驚全世界的10分鐘的史詩篇章盹舞。你需要學習寫樂曲的過程产镐,從你自己的經(jīng)歷中學習,每周投入時間來練習踢步。在寫出優(yōu)秀的程序之前癣亚,你首先會寫出糟糕的程序』裼。克服它述雾,經(jīng)歷它,獲取經(jīng)驗兼丰,你就可以在任何部分隨需創(chuàng)造玻孟。(Get over it, get through it, and get the experience so you can start to improvise on demand in any key.)
我們讓人們以“Hello,World”開始是有原因的鳍征,因為在他們旅程的這一點黍翎,實現(xiàn)這個目標意味著他們掌握了必要的基礎(chǔ)。你理解了如何編譯艳丛,如何運行匣掸,如何調(diào)用一個方法,如何傳遞一個參數(shù)氮双。能夠獨立實現(xiàn)另一個已存在的程序碰酝,在你學習編程的路上也是一個巨大的進步,甚至可以說和“Hello戴差,World”一樣重要送爸。當你完成了這個目標時,說明你又克服了一些困難暖释。你需要搞明白從哪里開始袭厂,如何做好計劃,如何組織你的程序饭入,如何處理bug嵌器,自己親自使用,最終打包你的程序谐丢,讓它變成一個可用的東西爽航。即使實現(xiàn)一個很小的程序,你也能學習到這個完整的過程乾忱。
你也許好奇為什么自己實現(xiàn)一個程序的克隆版本怎么會幫助你產(chǎn)生新的想法讥珍。和音樂類似,它需要創(chuàng)造力窄瘟。在音樂領(lǐng)域衷佃,為什么演奏別人的音樂能幫助你學習如何寫自己的音樂呢?首先蹄葱,你要了解別人是怎么做的氏义。你需要理解別人如何組織樂曲锄列,別人使用了什么音樂范式。當你學習過很多次別人的樂曲之后惯悠,你就能以一個更廣闊的視角來看待問題邻邮,隨后你就有更多的知識可以利用。你把從不同地方學到的小范式組合在一起克婶,并且使用一些你見到過的其他范式筒严。你也許會調(diào)整這些范式,組合它們情萤,或者完全打亂它們鸭蛙。就像人們說的,如果你要打破規(guī)則筋岛,首先要學會規(guī)則娶视。在編程領(lǐng)域,我們有類似的規(guī)則睁宰,例如MVC歇万。這是一個穩(wěn)定并且被廣泛接受的編程范式。在音樂中勋陪,我們有類似的東西贪磺。例如 I-V-vi-IV。當然這不是唯一的一個诅愚,但是是一個很好的例子寒锚。
簡單來說,練習和創(chuàng)造是連接在一起的违孝。創(chuàng)造力這個概念在編程領(lǐng)域常常被人們忽視刹前,實際上它很重要。你注意過多少個程序員同時又是音樂家呢雌桑?音樂涉及很多技術(shù)分析喇喉,結(jié)構(gòu)組織,以及范式校坑,但是人們通常認為音樂是純粹的創(chuàng)意努力的結(jié)果拣技。編程經(jīng)常被視為是純粹的技術(shù)行為,但實際上它常常伴隨著創(chuàng)意的功勞耍目。你可以通過復寫其他的程序來培養(yǎng)你的創(chuàng)造力膏斤。在你重寫的時候,你會發(fā)現(xiàn)你以一個新的方式來調(diào)整這個程序邪驮,或者自己添加一個新的功能莫辨。它同樣會啟發(fā)你關(guān)于全新項目的想法。創(chuàng)造力會在這個過程中顯現(xiàn),但是你首先要學著把前面的音樂彈奏出來沮榜。
經(jīng)過一段時間盘榨,你會發(fā)現(xiàn)你可以以編程的想法看待幾乎任何事物。你可以自動執(zhí)行任務蟆融、解決實際的問題较曼。你將會有一個長長的想法清單,只是苦于沒時間去實現(xiàn)振愿。你將有能力即時解決問題〕诜梗“哦冕末,這里有個電子表格,有100張表的數(shù)據(jù)需要格式化侣颂,可以把他們分隔到不同的文件中档桃,轉(zhuǎn)化為一個csv文件。就這么做憔晒!” 不要因為想要一下子做出一個最好的項目而束手不前藻肄。寫出你能寫出的程序。關(guān)于其他新程序的想法會隨之產(chǎn)生拒担。
你們有多少人曾經(jīng)處于“我不知道編寫什么程序”的狀態(tài)中嘹屯?你怎么解決這個問題的?你對其他處于這種狀況的人有什么建議呢从撼?