這篇文章轉(zhuǎn)自知乎端考,作者是@蕭井陌@Badger电禀,文章地址我是地址。
前言
如今編程成為了一個(gè)越來(lái)越重要的「技能」:作為設(shè)計(jì)師篮赢,懂一些編程可能會(huì)幫你更好地理解自己的工作內(nèi)容;作為創(chuàng)業(yè)者琉挖,技術(shù)創(chuàng)始人的身份則會(huì)讓你的很多工作顯得更容易荷逞。而作為剛想入門(mén)的新手,面對(duì)眼前海量的信息粹排,或許根本不知道從哪里開(kāi)始种远;入門(mén)輕松度過(guò)初級(jí)材料的學(xué)習(xí)后,發(fā)現(xiàn)學(xué)習(xí)越來(lái)越困難顽耳,陡峭的學(xué)習(xí)曲線又讓你望而卻步坠敷;你知道如何在頁(yè)面上打印輸出一些文本行妙同,但是你不知道何時(shí)該進(jìn)行一個(gè)真正的有用的項(xiàng)目;你不清楚自己還有哪些不知道的東西膝迎,你甚至搞不清下一步該學(xué)什么粥帚。
這篇文章的內(nèi)容對(duì)此不僅會(huì)有一些方向性的建議,還會(huì)包含一個(gè)核心向的編程入門(mén)導(dǎo)引限次。當(dāng)然芒涡,Step by Step 的路線是不現(xiàn)實(shí)的,并且每個(gè)人都會(huì)有自己的特點(diǎn)卖漫,所以給出的這個(gè)編程入門(mén)導(dǎo)引更多的是為了引發(fā)讀者的思考费尽,最終幫助你形成適用于自己的學(xué)習(xí)路線。
但要注意:這篇文章是寫(xiě)給那些真心想學(xué)編程的人看的——那些憋著一股狠勁兒羊始,一定要做出個(gè)什么真東西旱幼,不學(xué)好不罷休的人;而不是那些「聽(tīng)說(shuō)編程好玩」的人突委,在我看來(lái)柏卤,這種人永遠(yuǎn)都入不了編程的門(mén),更別提整出個(gè)像樣的東西來(lái)了匀油。
心態(tài)調(diào)整
確定目標(biāo)
You can code. They cannot. That is pretty damn cool.
在你學(xué)習(xí)編程之前思考一下你的目標(biāo)缘缚,當(dāng)你有最終目標(biāo)時(shí)道路會(huì)更加的清晰。那么敌蚜,你想要寫(xiě)什么桥滨?網(wǎng)站?游戲钝侠?iOS或者Android應(yīng)用该园?或是你是想自動(dòng)化完成一些乏味的任務(wù)讓你有更多的時(shí)間看窗外的風(fēng)景?也許你只是想更具有就業(yè)競(jìng)爭(zhēng)力找個(gè)好工作帅韧。所有的這些都是有價(jià)值的目標(biāo)里初,這些目標(biāo)都是你編程學(xué)習(xí)推動(dòng)力的一部分,沒(méi)有推動(dòng)力的人忽舟,是無(wú)法在略顯枯燥的漫長(zhǎng)學(xué)習(xí)之旅中走遠(yuǎn)的双妨。
這段視頻也許能給你啟發(fā):What Most Schools Don't Teach
不要浮躁
Bad programming is easy. Even Dummies can learn it in 21 days. Good programming requires thought, but everyone can do it and everyone can experience the extreme satisfaction that comes with it.
不管是在線下還是線上的書(shū)店,滿(mǎn)目都是《21天學(xué)通Java》這種速成書(shū)目叮阅,它們都承諾在很短一段時(shí)間內(nèi)就讓你能夠?qū)W會(huì)相關(guān)技術(shù)刁品。Matthias Felleisen在他的著作How to Design Programs, Second Edition一書(shū)中明確指出了這種「速成」的趨勢(shì)并予以了以上的諷刺。
所謂的「捷徑」或者說(shuō)「銀彈」是不存在的浩姥,智者說(shuō)過(guò)挑随,精通某個(gè)東西需要10年或10000個(gè)小時(shí),也就是漢語(yǔ)中的「十年磨一劍」勒叠,所以不用著急兜挨,功不唐捐膏孟。
培養(yǎng)興趣
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
沉醉于編程,編程更是為了興趣拌汇。興趣是推動(dòng)力的不竭源泉柒桑,保持這種充滿(mǎn)興趣的感覺(jué),以便于你能將其投入到你的10年/10000小時(shí)的編程時(shí)間中噪舀。編程很有趣魁淳,那是探索的喜悅。那是創(chuàng)造的喜悅与倡〗绻洌看到自己親手完成的作品顯示在屏幕上很有趣。有人為你的代碼而驚嘆很有趣蒸走。有人在公共場(chǎng)合稱(chēng)贊你的產(chǎn)品仇奶、鄰居使用你的產(chǎn)品貌嫡、以及在媒體上討論你的產(chǎn)品很有趣比驻。編程應(yīng)該十分有趣,若并非如此岛抄,就找出導(dǎo)致編程無(wú)趣的問(wèn)題别惦,然后解決之。
開(kāi)始學(xué)習(xí)
令人警醒的故事
剛上初中時(shí)我便開(kāi)始了編程學(xué)習(xí)夫椭,很不幸掸掸,我讀完了好幾本當(dāng)時(shí)普遍存在的諸如《21天精通C++》這類(lèi)的垃圾書(shū),當(dāng)時(shí)讀完也無(wú)大礙蹭秋,甚至還能寫(xiě)點(diǎn)小程序扰付。但是軟件出故障了我不知道為什么,稍顯龐大的編程問(wèn)題無(wú)從下手仁讨,碰到現(xiàn)有的庫(kù)做不到的事也只能兩手一攤羽莺。雖然我每天不停地編碼,但我發(fā)現(xiàn)自己的編程能力卻是提高的如此緩慢洞豁,對(duì)于「迭代」與「遞歸」的概念只有極其有限的了解盐固,可以說(shuō)只是把計(jì)算機(jī)當(dāng)成了計(jì)算器來(lái)使用。
進(jìn)入大學(xué)后丈挟,我主修了物理學(xué)刁卜,最初的一段時(shí)間里我一直在記憶背誦那些物理公式,卻不理解她們是如何得出的曙咽,她們之間有什么聯(lián)系蛔趴,亦或是她們的意義。我不停地學(xué)習(xí)如何計(jì)算解答一些常見(jiàn)的物理問(wèn)題例朱,卻對(duì)在這些Hows背后的Whys一無(wú)所知孝情。
而在我嘗試做一些基于物理行為的電腦游戲時(shí)我再次遇到了之前的的困難:面對(duì)新問(wèn)題時(shí)無(wú)從下手之拨,面對(duì)新問(wèn)題時(shí)的恐懼不斷累積滋生,我開(kāi)始主動(dòng)逃避咧叭,不去真正地理解蚀乔,而是幻想能通過(guò)Google搜索復(fù)制粘貼代碼解決問(wèn)題。幸運(yùn)的是菲茬,大二時(shí)的一堂課完全改變了我的學(xué)習(xí)方法吉挣。那是第一次我有了「開(kāi)天眼」的感覺(jué),我痛苦地意識(shí)到婉弹,我對(duì)一些學(xué)科只有少的可憐的真正的理解睬魂,包括我主修的物理與輔修的計(jì)算機(jī)科學(xué)。
關(guān)于那堂課:那時(shí)我們剛剛學(xué)習(xí)完電學(xué)和狹義相對(duì)論的內(nèi)容镀赌,教授在黑板上寫(xiě)下了這兩個(gè)主題氯哮,并畫(huà)了一根線將他們連了起來(lái)∩谭穑「假設(shè)我們有一個(gè)電子沿導(dǎo)線以相對(duì)論級(jí)別的速度移動(dòng)…」喉钢,一開(kāi)始教授只是寫(xiě)下了那些我們所熟悉的電學(xué)與狹義相對(duì)論的常見(jiàn)公式,但在數(shù)個(gè)黑板的代數(shù)推導(dǎo)后良姆,磁場(chǎng)的公式神奇的出現(xiàn)了肠虽。雖然幾年前我早已知道這個(gè)公式,但那時(shí)我根本不知道這些現(xiàn)象間的有著這樣潛在的聯(lián)系玛追。磁與電之間的差別只是「觀察角度」的問(wèn)題税课,我猛然醒悟,此后我不再僅僅追求怎么做(How)痊剖,我開(kāi)始問(wèn)為什么(why)韩玩,開(kāi)始回過(guò)頭來(lái),拾起那些最基礎(chǔ)的部分陆馁,學(xué)習(xí)那些我之前我本該好好學(xué)的知識(shí)找颓。這個(gè)回頭的過(guò)程是痛苦的,希望你們能就此警醒氮惯,永遠(yuǎn)不要做這種傻事叮雳。
警醒后的反思
![](http://pic1.zhimg.com/09cfc28b6d5433dac166080244a839ec_b.jpg)
這幅圖取自 Douglas Hofstadter 的著作G?del, Escher, Bach。圖中的每一個(gè)字母都由其他更小的字母組成妇汗。在最高層級(jí)帘不,我們看的是"MU",M 這個(gè)字母由三個(gè)HOLISM(整全觀)構(gòu)成杨箭,U則是由一個(gè)REDUCTIONISM(還原論)構(gòu)成寞焙,前者的每一個(gè)字母都包含后者的后者整個(gè)詞,反之亦然。而在最低層級(jí)捣郊,你會(huì)發(fā)現(xiàn)最小的字母又是由重復(fù)的"MU"組成的辽狈。
每一層次的抽象都蘊(yùn)含著信息,如果你只是幼稚地單一運(yùn)用整體論在最高層級(jí)觀察呛牲,或運(yùn)用還原論觀察最低層級(jí)刮萌,你所得到的只有"MU"(在一些地區(qū)的方言中mu意味著什么都沒(méi)有)。問(wèn)題來(lái)了娘扩,怎樣才能盡可能多的獲取每個(gè)層級(jí)的信息着茸?或者換句話說(shuō),該怎樣學(xué)習(xí)復(fù)雜領(lǐng)域(諸如編程)包含的眾多知識(shí)琐旁?
教育與學(xué)習(xí)過(guò)程中普遍存在一個(gè)關(guān)鍵問(wèn)題:初學(xué)者們的目標(biāo)經(jīng)常過(guò)于傾向整全觀而忽略了基礎(chǔ)涮阔,舉個(gè)常見(jiàn)的例子,學(xué)生們非常想做一個(gè)機(jī)器人灰殴,卻對(duì)背后的
理解物理模型 → 理解電子工程基礎(chǔ) → 理解伺服系統(tǒng)與傳感器 → 讓機(jī)器人動(dòng)起來(lái)
這一過(guò)程完全提不起興趣敬特。
在這里對(duì)于初學(xué)者有兩個(gè)大坑:
如果初學(xué)者們只與預(yù)先構(gòu)建好的「發(fā)動(dòng)機(jī)和組件」接觸(沒(méi)有理解和思考它們構(gòu)造的原理),這會(huì)嚴(yán)重限制他們?cè)趯?lái)構(gòu)建這些東西的能力牺陶,并且在診斷解決問(wèn)題時(shí)無(wú)從下手伟阔。
第二個(gè)坑沒(méi)有第一個(gè)那么明顯:幼稚的「整體論」方法有些時(shí)候會(huì)顯得很有效,這有一定的隱蔽性與誤導(dǎo)性义图,但是一兩年過(guò)后(也許沒(méi)那么長(zhǎng))减俏,當(dāng)你在學(xué)習(xí)路上走遠(yuǎn)時(shí)召烂,再想回過(guò)頭來(lái)「補(bǔ)足基礎(chǔ)」會(huì)有巨大的心理障礙碱工,你得拋棄之前自己狹隘的觀念,耐心地緩步前進(jìn)奏夫,這比你初學(xué)時(shí)學(xué)習(xí)基礎(chǔ)知識(shí)困難得多怕篷。
但也不能矯枉過(guò)正,陷入還原論的大坑酗昼,初學(xué)時(shí)便一心試圖做宏大的理論廊谓,這樣不僅有一切流于理論的危險(xiǎn),枯燥和乏味還會(huì)讓你失去推動(dòng)力麻削。這種情況經(jīng)常發(fā)生在計(jì)算機(jī)科班生身上蒸痹。
為了更好理解,可以將學(xué)習(xí)編程類(lèi)比為學(xué)習(xí)廚藝:你為了燒得一手好菜買(mǎi)了一些關(guān)于菜譜的書(shū)呛哟,如果你只是想為家人做菜叠荠,這會(huì)是一個(gè)不錯(cuò)的主意,你重復(fù)菜譜上的步驟也能做出不賴(lài)的菜肴扫责,但是如果你有更大的野心榛鼎,真的想在朋友面前露一手,做一些獨(dú)一無(wú)二的美味佳肴,甚至成為「大廚」者娱,你必須理解這些菜譜背后大師的想法抡笼,理解其中的理論,而不僅僅是一味地實(shí)踐黄鳍。但是如果你每天唯一的工作就是閱讀那些厚重的理論書(shū)籍推姻,因?yàn)槿狈?shí)踐,你只會(huì)成為一個(gè)糟糕的廚子框沟,甚至永遠(yuǎn)成為不了廚子拾碌,因?yàn)榭戳藥滋鞎?shū)后你就因?yàn)榭菰锓艞壛藦N藝的學(xué)習(xí)。
總之街望,編程是連接理論與實(shí)踐的紐帶校翔,是計(jì)算機(jī)科學(xué)與計(jì)算機(jī)應(yīng)用技術(shù)相交融的領(lǐng)域。正確的編程學(xué)習(xí)方法應(yīng)該是:通過(guò)自頂而下的探索與項(xiàng)目實(shí)踐灾前,獲得編程直覺(jué)與推動(dòng)力防症;從自底向上的打基礎(chǔ)過(guò)程中,獲得最重要的通用方法并鞏固編程思想的理解哎甲。
作為初學(xué)者蔫敲,應(yīng)以后者為主,前者為輔炭玫。
啟蒙
「學(xué)編程應(yīng)該學(xué)哪門(mén)語(yǔ)言奈嘿?」這經(jīng)常是初學(xué)者問(wèn)的第一個(gè)問(wèn)題,但這是一個(gè)錯(cuò)誤的問(wèn)題吞加,你最先考慮的問(wèn)題應(yīng)該是「哪些東西構(gòu)成了編程學(xué)習(xí)的基礎(chǔ)」裙犹?
編程知識(shí)的金字塔底部有三個(gè)關(guān)鍵的部分:
算法思想:例如怎樣找出一組數(shù)中最大的那個(gè)數(shù)?首先你得有一個(gè) maxSoFar 變量衔憨,之后對(duì)于每個(gè)數(shù)…
語(yǔ)法:我怎樣用某種編程語(yǔ)言表達(dá)這些算法叶圃,讓計(jì)算機(jī)能夠理解。
系統(tǒng)基礎(chǔ):為什么 while(1) 時(shí)線程永遠(yuǎn)無(wú)法結(jié)束践图?為什么 int *foo() { int x = 0; return &x; } 是不可行的掺冠?
啟蒙階段的初學(xué)者若選擇C語(yǔ)言作為第一門(mén)語(yǔ)言會(huì)很困難并且枯燥,這是因?yàn)樗麄儽黄纫瑫r(shí)學(xué)習(xí)這三個(gè)部分码党,在能做出東西前要花費(fèi)很多時(shí)間德崭。
因此,為了盡量最小化「語(yǔ)法」與「系統(tǒng)基礎(chǔ)」這兩部分揖盘,建議使用 Python 作為學(xué)習(xí)的第一門(mén)語(yǔ)言眉厨,雖然Python對(duì)初學(xué)者很友好,但這并不意味著它只是一個(gè)「玩具」扣讼,在大型項(xiàng)目中你也能見(jiàn)到它強(qiáng)大而靈活的身影缺猛。熟悉Python后,學(xué)習(xí)C語(yǔ)言是便是一個(gè)不錯(cuò)的選擇了:學(xué)習(xí)C語(yǔ)言會(huì)幫助你以靠近底層的視角思考問(wèn)題,并且在后期幫助你理解操作系統(tǒng)層級(jí)的一些原理荔燎,如果你只想成為一個(gè)普通(平庸)的開(kāi)發(fā)者你可以不學(xué)習(xí)它耻姥。
下面給出了一個(gè)可供參考的啟蒙階段導(dǎo)引,完成后你會(huì)在頭腦中構(gòu)建起一個(gè)整體框架有咨,幫助你進(jìn)行自頂向下的探索琐簇。
完成Codecademy的 Python 部分。這只是熱身部分座享,盡快完成它婉商,因?yàn)槟阌肋h(yuǎn)只是在瀏覽器里,你不會(huì)學(xué)到如何搭建開(kāi)發(fā)環(huán)境渣叛。在 Codecademy 這類(lèi)的編程學(xué)習(xí)網(wǎng)站學(xué)到的那點(diǎn)兒東西丈秩,哪怕你只想做一個(gè)小的不能再小的項(xiàng)目,你都不知道該從哪兒開(kāi)始淳衙。
完成MIT 6.00.1x(中文化)(如果你英語(yǔ)不過(guò)關(guān)蘑秽,完成麻省理工學(xué)院公開(kāi)課:計(jì)算機(jī)科學(xué)及編程導(dǎo)論。MOOC是學(xué)習(xí)編程的一個(gè)有效途徑箫攀。雖然該課程的教學(xué)語(yǔ)言為Python肠牲,但作為一門(mén)優(yōu)秀的導(dǎo)論課,它強(qiáng)調(diào)學(xué)習(xí)計(jì)算機(jī)科學(xué)領(lǐng)域里的重要概念和范式靴跛,而不僅僅是教你特定的語(yǔ)言缀雳。如果你不是科班生,這能讓你在自學(xué)時(shí)開(kāi)闊眼界梢睛;課程內(nèi)容:計(jì)算概念肥印,python編程語(yǔ)言,一些簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)與算法扬绪,測(cè)試與調(diào)試竖独。支線任務(wù):完成《Python核心編程》
完成Harvard CS50(如果你英語(yǔ)不過(guò)關(guān):完成哈佛大學(xué)公開(kāi)課:計(jì)算機(jī)科學(xué) cs50。同樣是導(dǎo)論課挤牛,但這門(mén)課與MIT的導(dǎo)論課互補(bǔ)。教學(xué)語(yǔ)言涉及 C, PHP, JavaScript + SQL, HTML + CSS种蘸,內(nèi)容的廣度與深度十分合理墓赴,還能夠了解到最新的 一些科技成果,可以很好激發(fā)學(xué)習(xí)計(jì)算機(jī)的興趣航瞭。支線任務(wù):
閱讀《編碼的奧秘》
完成《C語(yǔ)言編程》
[可選] 如果你的目標(biāo)是成為一名Hacker:閱讀Hacker's Delight
PS:如果教育對(duì)象還是一個(gè)孩子诫硕,以下的資源會(huì)很有幫助(年齡供參考):
5-8歲:Turtle Academy
8-12歲:Python for Kids
12歲以上:MIT Scratch(不要小看Scratch,有人用它寫(xiě)3D渲染的光線追蹤系統(tǒng))或KhanAcademy
入門(mén)
結(jié)束啟蒙階段后刊侯,初學(xué)者積累了一定的代碼量章办,對(duì)編程也有了一定的了解。這時(shí)你可能想去學(xué)一門(mén)具體的技術(shù),諸如Web開(kāi)發(fā)藕届,Android開(kāi)發(fā)挪蹭,iOS開(kāi)發(fā)什么的,你可以去嘗試做一些盡可能簡(jiǎn)單的東西休偶,給自己一些正反饋梁厉,補(bǔ)充自己的推動(dòng)力。但記住別深入踏兜,這些技術(shù)有無(wú)數(shù)的細(xì)節(jié)词顾,將來(lái)會(huì)有時(shí)間去學(xué)習(xí);同樣的碱妆,這時(shí)候也別過(guò)于深入特定的框架和語(yǔ)言肉盹,現(xiàn)在是學(xué)習(xí)計(jì)算機(jī)科學(xué)通用基礎(chǔ)知識(shí)的時(shí)候,不要試圖去抄近路直接學(xué)你現(xiàn)在想學(xué)的東西疹尾,這是注定會(huì)失敗的垮媒。
那么入門(mén)階段具體該做些什么呢?這時(shí)候你需要做的是反思自己曾經(jīng)寫(xiě)過(guò)的程序航棱,去思考程序?yàn)槭裁?Why)要這樣設(shè)計(jì)睡雇?,思考怎樣(How)寫(xiě)出更好的程序饮醇?試圖去探尋理解編程的本質(zhì):利用計(jì)算機(jī)解決問(wèn)題它抱。
設(shè)想 :
X = 用于思考解決方案的時(shí)間,即「解決問(wèn)題」 部分
Y = 用于實(shí)現(xiàn)代碼的時(shí)間朴艰,即「利用計(jì)算機(jī)」部分」
編程能力 = F(X, Y) (X>Y)
要想提高編程能力观蓄,就得優(yōu)化 X,Y 與函數(shù) F(X, Y)祠墅,很少有書(shū)的內(nèi)容能同時(shí)著重集中在這三點(diǎn)上侮穿,但有一本書(shū)做到了——Structure and Interpretation of Computer Programs(SICP)《計(jì)算機(jī)程序的構(gòu)造和解釋》,它為你指明了這三個(gè)變量的方向毁嗦。在閱讀SICP之前亲茅,你也許能通過(guò)調(diào)用幾個(gè)函數(shù)解決一個(gè)簡(jiǎn)單問(wèn)題。但閱讀完SICP之后狗准,你會(huì)學(xué)會(huì)如何將問(wèn)題抽象并且分解克锣,從而處理更復(fù)雜更龐大的問(wèn)題,這是編程能力巨大的飛躍腔长,這會(huì)在本質(zhì)上改變你思考問(wèn)題以及用代碼解決問(wèn)題的方式袭祟。此外,SICP的教學(xué)語(yǔ)言為 Scheme捞附,可以讓你初步了解函數(shù)式編程巾乳。更重要的是您没,他的語(yǔ)法十分簡(jiǎn)單,你可以很快學(xué)會(huì)它胆绊,從而把更多的時(shí)間用于學(xué)習(xí)書(shū)中的編程思想以及復(fù)雜問(wèn)題的解決之道上氨鹏。
Peter Norvig曾經(jīng)寫(xiě)過(guò)一篇非常精彩的SICP書(shū)評(píng),其中有這樣一段:
To use an analogy, if SICP were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate SICP are the ones who just want to know how to drive their car on the highway, just like everyone else.
如果你是文中的前者辑舷,閱讀SICP將成為你銜接啟蒙與入門(mén)階段的關(guān)鍵點(diǎn)
雖然SICP是一本「入門(mén)書(shū)」喻犁,但對(duì)于初學(xué)者還是有一定的難度,以下是一些十分有用的輔助資源:
Udacity CS212 Design of Computer Program): 由上文提到的Google研究主管Peter Norvig 主講何缓,教學(xué)語(yǔ)言為 Python肢础,內(nèi)容有一定難度。
How to Design Programs, Second Edition:HtDP的起點(diǎn)比SICP低碌廓,書(shū)中的內(nèi)容循循善誘传轰,對(duì)初學(xué)者很友好,如果覺(jué)得完成SICP過(guò)于困難谷婆,可以考慮先讀一讀HtDP慨蛙。
UC Berkeley SICP授課視頻以及 SICP 的兩位作者給 Hewlett-Packard 公司員工培訓(xùn)時(shí)的錄像(中文化項(xiàng)目)
Composing Programs:一個(gè)繼承了SICP思想但使用Python作為教學(xué)語(yǔ)言的編程導(dǎo)論(其中包含了一些小項(xiàng)目)
SICP 解題集:對(duì)于書(shū)后的習(xí)題,作為初學(xué)者應(yīng)盡力并量力完成纪挎。
完成了這部分學(xué)習(xí)后期贫,你會(huì)逐步建立起一個(gè)自己的程序設(shè)計(jì)模型,你的腦子里不再是一團(tuán)亂麻异袄,你會(huì)意識(shí)到記住庫(kù)和語(yǔ)法并不會(huì)教你如何解決編程問(wèn)題通砍,接下來(lái)要學(xué)些什么,在你心里也會(huì)明朗了很多烤蜕。這時(shí)候才是真正開(kāi)始進(jìn)行項(xiàng)目實(shí)踐封孙,補(bǔ)充推動(dòng)力的好時(shí)機(jī)。
關(guān)于項(xiàng)目實(shí)踐:對(duì)于入門(mén)階段的初學(xué)者讽营,參與開(kāi)源項(xiàng)目還為時(shí)過(guò)早虎忌,這時(shí)候應(yīng)該開(kāi)始一些簡(jiǎn)單的項(xiàng)目,諸如搭建一個(gè)網(wǎng)站并維護(hù)它橱鹏,或是編寫(xiě)一個(gè)小游戲再不斷進(jìn)行擴(kuò)展膜蠢,如果你自己的想法不明確,Mega Project List中選取項(xiàng)目蚀瘸〗频總之,務(wù)必在這時(shí)拿下你項(xiàng)目實(shí)踐的第一滴血贮勃。
與此同時(shí),別忘了繼續(xù)打好根基苏章。為了將來(lái)的厚積薄發(fā)寂嘉,在下面這幾個(gè)方面你還要繼續(xù)做足功課(注意:下面的內(nèi)容沒(méi)有絕對(duì)意義上的先后順序):
計(jì)算機(jī)系統(tǒng)基礎(chǔ)
有了之前程序設(shè)計(jì)的基礎(chǔ)后奏瞬,想更加深入地把握計(jì)算機(jī)科學(xué)的脈絡(luò),不妨看看這本書(shū):《深入理解計(jì)算機(jī)系統(tǒng)》Computer Systems A Programmer's Perspective泉孩。這里點(diǎn)名批評(píng)這本書(shū)的中譯名硼端,其實(shí)根本談不上什么深入啦,這本書(shū)只是CMU的「計(jì)算機(jī)系統(tǒng)導(dǎo)論」的教材而已寓搬。CMU的計(jì)算機(jī)科學(xué)專(zhuān)業(yè)相對(duì)較偏軟件珍昨,該書(shū)就是從一個(gè)程序員的視角觀察計(jì)算機(jī)系統(tǒng),以「程序在計(jì)算機(jī)中如何執(zhí)行」為主線句喷,全面闡述計(jì)算機(jī)系統(tǒng)內(nèi)部實(shí)現(xiàn)的諸多細(xì)節(jié)镣典。
如果你看書(shū)覺(jué)得有些枯燥的話,可以跟一門(mén) Coursera 上的 MOOC:The Hardware/Software Interface唾琼,這門(mén)課的內(nèi)容是 CSAPP 的一個(gè)子集兄春,但是最經(jīng)典的實(shí)驗(yàn)部分都移植過(guò)來(lái)了。同時(shí)锡溯,可以看看The C Programming Language赶舆,回顧一下C語(yǔ)言的知識(shí)。
完成這本書(shū)后祭饭,你會(huì)具備堅(jiān)實(shí)的系統(tǒng)基礎(chǔ)芜茵,也具有了學(xué)習(xí)操作系統(tǒng),編譯器倡蝙,計(jì)算機(jī)網(wǎng)絡(luò)等內(nèi)容的先決條件九串。當(dāng)學(xué)習(xí)更高級(jí)的系統(tǒng)內(nèi)容時(shí),翻閱一下此書(shū)的相應(yīng)章節(jié)悠咱,同時(shí)編程實(shí)現(xiàn)其中的例子蒸辆,一定會(huì)對(duì)書(shū)本上的理論具有更加感性的認(rèn)識(shí),真正做到經(jīng)手的代碼析既,從上層設(shè)計(jì)到底層實(shí)現(xiàn)都了然于胸躬贡,并能在腦中回放數(shù)據(jù)在網(wǎng)絡(luò)->內(nèi)存->緩存->CPU的流向。
此外眼坏,也是時(shí)候去接觸 UNIX 哲學(xué)了: KISS - Keep it Simple, Stupid. 在實(shí)踐中拂玻,這意味著你要開(kāi)始熟悉命令行界面,配置文件宰译。并且在開(kāi)發(fā)中逐漸脫離之前使用的IDE檐蚜,學(xué)會(huì)使用Vim或Emacs(或者最好兩者都去嘗試)。
閱讀 《UNIX編程環(huán)境》
閱讀《UNIX編程藝術(shù)》
折騰你的UN*X系統(tǒng)
數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)
如今沿侈,很多人認(rèn)為編程(特別是做web開(kāi)發(fā))的主要部分就是使用別人的代碼闯第,能夠用清晰簡(jiǎn)明的方式表達(dá)自己的想法比掌握硬核的數(shù)學(xué)與算法技巧重要的多,數(shù)據(jù)結(jié)構(gòu)排序函數(shù)二分搜索這不都內(nèi)置了嗎缀拭?工作中永遠(yuǎn)用不到咳短,學(xué)算法有啥用疤蠲薄?這種扛著實(shí)用主義大旗的「碼農(nóng)」思想當(dāng)然不可取咙好。沒(méi)有扎實(shí)的理論背景篡腌,遭遇瓶頸是遲早的事。
數(shù)據(jù)結(jié)構(gòu)和算法是配套的勾效,入門(mén)階段你應(yīng)該掌握的主要內(nèi)容應(yīng)該是:這個(gè)問(wèn)題用什么算法和數(shù)據(jù)結(jié)構(gòu)能更快解決嘹悼。這就要求你對(duì)常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)和算法了熟于心,你不一定要敲代碼层宫,用紙手寫(xiě)流程是更快的方式杨伙。對(duì)你不懂的數(shù)據(jù)結(jié)構(gòu)和算法,你要去搜它主要拿來(lái)干嘛的卒密,使用場(chǎng)景是什么缀台。
供你參考的學(xué)習(xí)資源:
《算法導(dǎo)論》:有人說(shuō)別把這本書(shū)當(dāng)入門(mén)書(shū),這本書(shū)本來(lái)就不是入門(mén)書(shū)嘛哮奇,雖說(shuō)書(shū)名是 Introduction to Algorithms膛腐,這只不過(guò)是因?yàn)樽髡卟幌氚堰@本書(shū)與其他書(shū)搞重名罷了。當(dāng)然鼎俘,也不是沒(méi)辦法拿此書(shū)入門(mén)哲身,讀第一遍的時(shí)候跳過(guò)習(xí)題和證明就行了嘛,如果還覺(jué)得心虛先看看這本《數(shù)據(jù)結(jié)構(gòu)與算法分析》
Coursera Algorithms: Design and Analysis [Part 1] & [Part 2]: Stanford 開(kāi)的算法課贸伐,不限定語(yǔ)言勘天,兩個(gè)部分跟下來(lái)算法基礎(chǔ)基本就有了;英語(yǔ)沒(méi)過(guò)關(guān)的:麻省理工學(xué)院公開(kāi)課:算法導(dǎo)論
入門(mén)階段還要注意培養(yǎng)使用常規(guī)算法解決小規(guī)模問(wèn)題的能力捉邢,結(jié)合前文的SICP部分可以讀讀這幾本書(shū):《編程珠璣》脯丝,《程序設(shè)計(jì)實(shí)踐》
編程語(yǔ)言基礎(chǔ)
Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet
此外還要知道,學(xué)習(xí)第n門(mén)編程語(yǔ)言的難度是第(n-1)門(mén)的一半伏伐,所以盡量去嘗試不同的編程語(yǔ)言與編程范式宠进,若你跟尋了前文的指引,你已經(jīng)接觸了:「干凈」的腳本語(yǔ)言 Python, 傳統(tǒng)的命令式語(yǔ)言 C, 以及浪漫的函數(shù)式語(yǔ)言 Scheme/Racket 三個(gè)好朋友藐翎。但僅僅是接觸遠(yuǎn)遠(yuǎn)不夠材蹬,你還需要不斷繼續(xù)加深與他們的友誼,并嘗試結(jié)交新朋友吝镣,美而雅的Ruby小姑娘堤器,Hindley-Milner 語(yǔ)言家族的掌中寶Haskell都是不錯(cuò)的選擇。但有這么一位你躲不開(kāi)的末贾,必須得認(rèn)識(shí)的大伙伴 — C++闸溃,你得做好與他深交的準(zhǔn)備:
入門(mén):C++ Primer
[可選] 進(jìn)階:
高效使用:Effective C++
深入了解:《深度探索C++對(duì)象模型》;C++Templates
研究反思:The Design and Evolution of C++;對(duì)于C++這個(gè)Necessary Evil圈暗,看這本書(shū)可以讓你選擇是成為守夜人還是守日人掂为。
現(xiàn)實(shí)是殘酷的裕膀,在軟件工程領(lǐng)域仍舊充斥著一些狂熱者员串,他們只掌握著一種編程語(yǔ)言,也只想掌握一種語(yǔ)言昼扛,他們認(rèn)為自己掌握的這門(mén)語(yǔ)言是最好的寸齐,其他異端都是傻X。這種人也不是無(wú)藥可救抄谐,有一種很簡(jiǎn)單的治療方法:讓他們寫(xiě)一個(gè)編譯器渺鹦。要想真正理解編程語(yǔ)言,你必須親自實(shí)現(xiàn)一個(gè)∮己現(xiàn)在是入門(mén)階段毅厚,不要求你去上一門(mén)編譯器課程,但要求你能至少實(shí)現(xiàn)一個(gè)簡(jiǎn)單的解釋器浦箱。
供你參考的學(xué)習(xí)資源:
《程序設(shè)計(jì)語(yǔ)言-實(shí)踐之路》:CMU編程語(yǔ)言原理的教材吸耿,程序語(yǔ)言入門(mén)書(shū),現(xiàn)在就可以看酷窥,會(huì)極大擴(kuò)展你的眼界咽安,拉開(kāi)你與普通人的差距。
Coursera 編程語(yǔ)言MOOC:課堂上你能接觸到極端FP(函數(shù)式)的SML蓬推,中性偏FP的Racket妆棒,以及極端OOP(面向?qū)ο?i>)的Ruby,并學(xué)會(huì)問(wèn)題的FP分解 vs OOP分解沸伏、ML的模式匹配糕珊、Lisp宏、不變性與可變性毅糟、解釋器的實(shí)現(xiàn)原理等红选,讓你在將來(lái)學(xué)習(xí)新語(yǔ)言時(shí)更加輕松并寫(xiě)出更好的程序。
Udacity CS262 Programming Language:熱熱身留特,教你寫(xiě)一個(gè)簡(jiǎn)單的瀏覽器——其實(shí)就是一個(gè)javascript和html的解釋器纠脾,完成后的成品還是很有趣的;接下來(lái)蜕青,試著完成一個(gè)之前在SICP部分提到過(guò)的項(xiàng)目:用Python寫(xiě)一個(gè)Scheme Interpreter
其他
編程入門(mén)階段比較容易忽視的幾點(diǎn):
學(xué)好英語(yǔ):英語(yǔ)是你獲取高質(zhì)量學(xué)習(xí)資源的主要工具苟蹈,但在入門(mén)階段,所看的那些翻譯書(shū)信息損耗也沒(méi)那么嚴(yán)重右核,以你自己情況權(quán)衡吧慧脱。此外英語(yǔ)的重要性更體現(xiàn)在溝通交流上,Linus Torvalds一個(gè)芬蘭人贺喝,一口流利的英語(yǔ)一直是他招募開(kāi)發(fā)者為L(zhǎng)inux干活的的法寶菱鸥,這是你的榜樣宗兼。
學(xué)會(huì)提問(wèn):學(xué)習(xí)中肯定會(huì)遇到問(wèn)題剔宪,首先應(yīng)該學(xué)會(huì)搜索引擎的「高級(jí)搜索」娩嚼,當(dāng)單靠檢索無(wú)法解決問(wèn)題時(shí),去Stack Overflow或知乎提問(wèn)桐经,提問(wèn)前讀讀這篇文章:What have you tried?
不要做一匹獨(dú)狼:嘗試搭建一個(gè)像這樣簡(jiǎn)單的個(gè)人網(wǎng)站鹊漠,不要只是一個(gè)孤零零的About頁(yè)面主到,去學(xué)習(xí)Markdown與LaTeX,試著在Blog上記錄自己的想法躯概,并訂閱自己喜歡的編程類(lèi)博客登钥。推薦幾個(gè)供你參考:Joel on Software,Peter Norvig,Coding Horror
小結(jié)
以上的內(nèi)容你不應(yīng)該感到懼怕,編程的入門(mén)不是幾個(gè)星期就能完成的小項(xiàng)目娶靡。期間你還會(huì)遇到無(wú)數(shù)的困難牧牢,當(dāng)你碰壁時(shí)試著嘗試「費(fèi)曼」技巧:將難點(diǎn)分而化之,切成小知識(shí)塊姿锭,再逐個(gè)對(duì)付塔鳍,之后通過(guò)向別人清楚地解說(shuō)來(lái)檢驗(yàn)自己是否真的理解。當(dāng)然艾凯,依舊會(huì)有你解決不了的問(wèn)題献幔,這時(shí)候不要強(qiáng)迫自己——很多時(shí)候當(dāng)你之后回過(guò)頭來(lái)再看這個(gè)問(wèn)題時(shí),一切豁然開(kāi)朗趾诗。
此外不要局限與上文提到的那些材料蜡感,還有一些值得在入門(mén)階段以及將來(lái)的提升階段反復(fù)閱讀的書(shū)籍。The Pragmatic Programmer就是這樣一本程序員入門(mén)書(shū)恃泪,終極書(shū)郑兴。有人稱(chēng)這本書(shū)為代碼小全:從DRY到KISS,從做人到做程序員贝乎,這本書(shū)教給了你一切情连,你所需的只是遵循書(shū)上的指導(dǎo)。
后記
如果你能設(shè)法完成以上的所有任務(wù)览效,恭喜你却舀,你已經(jīng)真正實(shí)現(xiàn)了編程入門(mén)。這意味著你在之后更深入的學(xué)習(xí)中锤灿,不會(huì)畏懼那些學(xué)習(xí)新語(yǔ)言的任務(wù)挽拔,不會(huì)畏懼那些「復(fù)雜」的API,更不會(huì)畏懼學(xué)習(xí)具體的技術(shù)但校,甚至感覺(jué)很容易螃诅。當(dāng)然,為了掌握這些東西你依舊需要大量的練習(xí),腰還是會(huì)疼术裸,走路還是會(huì)費(fèi)勁倘是,一口氣也上不了5樓。但我能保證你會(huì)在思想上有巨大的轉(zhuǎn)變袭艺,獲得極大的自信搀崭,看老師同學(xué)和csdn的眼光會(huì)變得非常微妙,雖然只是完成了編程入門(mén)匹表,但已經(jīng)成為了程序員精神世界的高富帥门坷。不,我說(shuō)錯(cuò)了袍镀,即使是高富帥也不會(huì)有強(qiáng)力精神力,他也會(huì)懷疑自己冻晤,覺(jué)得自己沒(méi)錢(qián)就什么都不是了苇羡。但總之,你遵循指南好好看書(shū)鼻弧,那就會(huì)體驗(yàn)「會(huì)當(dāng)凌絕頂」的感覺(jué)设江。
歡迎實(shí)踐過(guò)的同學(xué)現(xiàn)身說(shuō)法。