池建強(qiáng):如何學(xué)習(xí)一門(mén)編程語(yǔ)言
關(guān)于學(xué)習(xí)編程這個(gè)主題,有各種讀者多次要求寫(xiě)一寫(xiě),而且要求文藝的寫(xiě)、抒情的寫(xiě)、充滿(mǎn)社會(huì)主義特色的寫(xiě),要做到:?jiǎn)栴}看起來(lái)巨復(fù)雜,讀起來(lái)巨簡(jiǎn)單,學(xué)起來(lái)巨容易!看把你們慣成什么樣子了,Mac 君你繼續(xù)去面壁吧。
好吧不管他,我們接著聊。
如果你準(zhǔn)備未來(lái)投身到 IT 江湖從事編碼這份有前途的職業(yè),學(xué)習(xí)一門(mén)語(yǔ)言顯然是遠(yuǎn)遠(yuǎn)不夠滴,就像你初入江湖,告訴別人,
「兄弟只會(huì)太祖長(zhǎng)拳!」
問(wèn),「Level 可及喬峰?」
答曰,「不及萬(wàn)一」
人家一看你就是P2的命,PK 時(shí)一個(gè)大招直接秒掉。寫(xiě)到這我想起了一個(gè)叫做冰河的兄弟,也是奇葩一朵,在程序語(yǔ)言方面一生只愛(ài) Lisp(Lisp號(hào)稱(chēng)編程語(yǔ)言的祖宗),在人類(lèi)語(yǔ)言方面則除了中英文,還在同時(shí)學(xué)習(xí)意、法、西、德四門(mén)語(yǔ)言,而且不是隨便學(xué)學(xué),而且神志沒(méi)有錯(cuò)亂,這一點(diǎn)讓我簡(jiǎn)直佩服到逆天,一門(mén)英語(yǔ)已經(jīng)從初中折磨我到現(xiàn)在了,在人類(lèi)語(yǔ)言層面,我常常是被秒殺的。
所以,如果編程有可能成為你的職業(yè),那么5-10年的學(xué)習(xí)和實(shí)踐時(shí)間是需要的,因?yàn)槟憧赡芤獙W(xué)習(xí)編程語(yǔ)言、操作系統(tǒng)、算法、數(shù)據(jù)庫(kù)(Sql 的 NoSql 的)、Web 開(kāi)發(fā)等等,還有各種數(shù)不清的引擎和架構(gòu),特別令人發(fā)指的是當(dāng)你熟練的掌握了一門(mén)技術(shù)之后,就會(huì)有位赤腳大仙走過(guò)來(lái)告訴你,孩紙,你學(xué)的技術(shù)已經(jīng)不是方向裊,然后在你絕望的眼神里飄然離去……寫(xiě) Java 的兄弟感受一下……
如果你的職業(yè)發(fā)展與編程無(wú)關(guān),只是想學(xué)習(xí)一門(mén)語(yǔ)言磨練人生意志,那么這事就比較容易了,比如 Python、Shell、AppleScript、Ruby 等,根據(jù)自己常用的操作系統(tǒng)選一個(gè)就好,如果你用 Mac,這些語(yǔ)言可以任選,而且環(huán)境都是現(xiàn)成的,如果你用其他操作系統(tǒng)……,對(duì)不起,MacTalk 只說(shuō) Mac。這些語(yǔ)言除了能夠幫助你鍛煉意志和提高邏輯思維能力的同時(shí),還可以在某些關(guān)鍵時(shí)刻幫助你處理各種繁瑣復(fù)雜的工作,比如大量文本、定時(shí)任務(wù)、自動(dòng)化任務(wù)、編寫(xiě)常用小工具等等,還可以引發(fā)跨界編程的轟動(dòng)效應(yīng),不信的話(huà)去百度搜索「Python 女神」便知。
好的,寫(xiě)到這如果還沒(méi)有打消你學(xué)習(xí)編程的熱情,那就可以繼續(xù)往下讀,下面才是正文:
要有光
無(wú)論學(xué)習(xí)什么,一定要有明確的目的和目標(biāo),如果是抱著玩票的心態(tài),最多能夠「知道」而不是「學(xué)以致用」,所以搞清楚自己為什么要學(xué)習(xí)編程,準(zhǔn)備學(xué)習(xí)哪門(mén)語(yǔ)言,要達(dá)到什么程度,想用多長(zhǎng)時(shí)間等等,這些問(wèn)題在你的頭腦里有個(gè)大概的思路和計(jì)劃,就基本解決了 Why 和 What 的問(wèn)題,下面我們來(lái)找 How。
多說(shuō)一句,其實(shí)學(xué)什么都有用的,大部分時(shí)間你只是不知道會(huì)在什么時(shí)候什么地方用。
經(jīng)典教程
選定了語(yǔ)言不要著急去網(wǎng)上搜索各種秘籍、評(píng)價(jià)和下載各類(lèi)盜版電子書(shū),每個(gè)技術(shù)領(lǐng)域都會(huì)有一些經(jīng)典的圣經(jīng)級(jí)別的圖書(shū),找到它們,購(gòu)買(mǎi)一本紙質(zhì)書(shū)或電子書(shū),最好是帶練習(xí)題的,可以邊學(xué)邊做。
如何找到這些圖書(shū),豆瓣讀書(shū)網(wǎng)應(yīng)該是個(gè)不錯(cuò)的選擇,雖然豆瓣的電影評(píng)價(jià)過(guò)于小清新口味,但圖書(shū)評(píng)價(jià)還是值得信賴(lài)的,另外找樂(lè)于分享的老鳥(niǎo)推薦一下也是個(gè)不錯(cuò)的選擇。
掌握基礎(chǔ),持續(xù)練習(xí)
每一門(mén)編程語(yǔ)言的學(xué)習(xí)內(nèi)容都會(huì)涉及:基礎(chǔ)運(yùn)行環(huán)境、數(shù)據(jù)類(lèi)型(數(shù)字、字符串、數(shù)組、集合、字典等)、表達(dá)式、函數(shù)、流程控制、類(lèi)、方法等等,不同的語(yǔ)言還有一些不同的特性,這些內(nèi)容并不復(fù)雜,盡快通過(guò)大量的練習(xí)擊倒它們,然后再去深入了解面向?qū)ο?、并發(fā)、異常、文件與目錄、網(wǎng)絡(luò)、標(biāo)準(zhǔn)庫(kù)等內(nèi)容,并輔以持續(xù)的練習(xí),這些內(nèi)容才能夠讓你真正進(jìn)入編程領(lǐng)域并做出實(shí)際的軟件。
初學(xué)者每天花1-2個(gè)小時(shí)是需要的,盡量保證閱讀和練習(xí)的持續(xù)性和時(shí)間長(zhǎng)度。其實(shí)1-2個(gè)小時(shí)根本不算什么,想想你們花費(fèi)在看電視和刷微博上的時(shí)間吧,如果還說(shuō)沒(méi)時(shí)間,那就是不抽不舒服斯基了。
記住那句話(huà):一邊憎惡虛榮,一邊找各種機(jī)會(huì)虛榮,在應(yīng)該為了虛榮而努力的時(shí)候,丫拖延癥犯了。
外事不決問(wèn) Google
現(xiàn)代人的生活和學(xué)習(xí)是如此的方便,因?yàn)槲覀冇?Google!俗話(huà)說(shuō)內(nèi)事不決問(wèn)百度,外事不決問(wèn) Google,技術(shù)絕對(duì)屬于外事,你要是去問(wèn)度娘技術(shù)問(wèn)題,被人家的回旋踢踢飛可別怪我沒(méi)告訴過(guò)你。
以前學(xué)習(xí)技術(shù)只能通過(guò)技術(shù)圖書(shū)和口口相傳,現(xiàn)在遇到問(wèn)題從Google 那里就可以找到答案,所以用好 Google 你就能如猛虎加之羽翼而翱翔四海。如果你還在認(rèn)為 Google 就是個(gè)搜索框,那就圖樣圖森破了,Mac 君今天為你推薦這兩篇文章:
「Google,Google,再Google」 http://wordpress.lixiaolai.com/archives/7572.html
「如何用好 Google 搜索引擎」 http://www.zhihu.com/question/20161362
讓你的搜索與眾不同。
#p#
用好工具
俗話(huà)說(shuō)的好,欲練神功揮劍自宮,sorry 不是這句,工欲善其事必先利其器,想要學(xué)習(xí)編程一定要寫(xiě)代碼,我們不提倡咬破手指寫(xiě)bloody code,所以一定要找到趁手的武器。我個(gè)人把工具分為三種,第一種是部分程序語(yǔ)言自帶的 shell,第二種是文本編輯器,第三種是集成開(kāi)發(fā)環(huán)境(IDE)。
1、Shell,如果你在學(xué)習(xí) Python,那么python shell,bpython 和 ipython 都是不錯(cuò)的選擇;如果你在學(xué)習(xí) Ruby,那么irb就是 ruby 的 shell;如果你在學(xué)習(xí) Shell,打開(kāi)終端(Terminal)就是 shell;如果你在學(xué)習(xí) Java 或Objective-C,對(duì)不起,這些語(yǔ)言沒(méi)有 shell。
Shell 能夠單步執(zhí)行你的編程語(yǔ)句并給出即時(shí)反饋,這種交互式編程方式非常適合初學(xué)者,所見(jiàn)即所得,所以凡是提供 shell 工具的語(yǔ)言,推薦大家優(yōu)先使用shell學(xué)習(xí)。
2、文本編輯器,這個(gè)領(lǐng)域向來(lái)是「猿家必爭(zhēng)之地」,溢美之詞和吐槽之聲交相輝映,從古至今綿延不絕,說(shuō)起來(lái)都是眼淚,比如Emacs和Vim程序猿,大家沿著不同的道路和目標(biāo)前進(jìn),但總是會(huì)在某個(gè)點(diǎn)交叉相遇,見(jiàn)面就扔石頭和臭雞蛋,砸得對(duì)方鼻青臉腫,然后擦擦眼淚和口水繼續(xù)前行。還有 IDEer 說(shuō) Vimer 裝逼,Emacser 說(shuō) IDEer 垃圾balabala……種種血淋淋的事實(shí)足以拍一部驚悚科幻動(dòng)作言情片。
我自己比較喜歡文本編輯器,但是也不排斥 IDE,這種人俗稱(chēng)兩邊不待見(jiàn),但我還是那句話(huà),不為自己設(shè)限,不同的環(huán)境應(yīng)該選擇最好的工具。下面給大家推薦幾款文本編輯器:
(1)VIM:號(hào)稱(chēng)編輯器之神,全鍵盤(pán)操作,充滿(mǎn)速度感,良好的插件體系,幾乎滿(mǎn)足一切程序語(yǔ)言的編寫(xiě)需求。
(2)Emacs:神的編輯器,捆綁了文本編輯器的操作系統(tǒng)。沒(méi)了,大家感受一下……
(3)TextMate:Mac 專(zhuān)有編輯器,號(hào)稱(chēng) Ruby 程序員最?lèi)?ài),當(dāng)年1.0版一份39歐元,總共賣(mài)了十幾萬(wàn)份拷貝,現(xiàn)在2.0免費(fèi)開(kāi)源,原來(lái)的開(kāi)發(fā)者已經(jīng)消失無(wú)蹤,據(jù)說(shuō)掙足銀子去太平洋的小島曬太陽(yáng)去裊。
(4)Sublime Text:文本編輯器的后起之秀,發(fā)展迅猛,媲美 TextMate,跨平臺(tái),比 Vim 和 Emacs 容易上手,號(hào)稱(chēng)性感編輯器。
以上四款自成體系,都有完善的插件生態(tài)環(huán)境,諸君可任意選擇。
對(duì)于TextMate 開(kāi)發(fā)者賺了錢(qián)就跑的惡劣行徑,大家完全可以批判,有時(shí)我們不得不痛苦的承認(rèn),國(guó)外程序員的雞賊是我泱泱大國(guó)之IT民工永遠(yuǎn)無(wú)法理解滴「淚」。
3、集成開(kāi)發(fā)環(huán)境(IDE)
IDE 是圖形化的集成開(kāi)發(fā)工具,具備精準(zhǔn)的詞法分析、編程提示、調(diào)試等功能,功能之繁復(fù)用戶(hù)自知,如果做工業(yè)級(jí)編程和團(tuán)隊(duì)協(xié)作的話(huà),還是推薦使用 IDE。
在這里推薦幾個(gè)系列:
(1)Eclipse 系列,通過(guò)插件方式幾乎支持所有的常用編程語(yǔ)言,免費(fèi)。
(2)JetBrains 系列,產(chǎn)品線(xiàn)豐富,幾乎都是精品,Java、Python、Ruby、Php、Objective-C、Web 等一應(yīng)俱全,收費(fèi)。
(3)Xcode,Mac 上優(yōu)秀的集成開(kāi)發(fā)工具,所有的 Mac App 和 iOS App 都出自此貨之手,免費(fèi)。
微軟的技術(shù)不懂,就不推薦了,嘿嘿……
除了寫(xiě)代碼的工具,你還需要記錄、閱讀和查詢(xún),所以再為大家推薦三款應(yīng)用:Evernote(筆記)、Pocket(以后讀)和Dash(代碼檢索)。具體介紹和用法就不說(shuō)了,不要忘了上一篇提到的Google君。
找到你的 Master
小時(shí)候看西游記發(fā)現(xiàn),師傅原來(lái)是用來(lái)人肉的;后來(lái)看天龍八部發(fā)現(xiàn),牛人都不需要師傅,即使有也是要被別人一掌震飛的;再后來(lái)看射雕英雄傳發(fā)現(xiàn),愚鈍的人首先得有師傅,其次得有很多師傅,再次每增加一個(gè)師傅功力都以指數(shù)級(jí)別增長(zhǎng),2、4、8、16……
所以,如果有人告訴你三人行,一個(gè)老師都沒(méi)有,你至少要質(zhì)疑這一觀點(diǎn),同時(shí)考慮自己會(huì)不會(huì)筋斗云,是否天賦異稟以一當(dāng)百等等。如果不成,那還是去找?guī)煾岛昧恕?/p>
有老師的好處有這么幾個(gè):
(1)老師能夠看到你自己看不到的地方,人這一輩子,很少人能給自己一個(gè)清晰的評(píng)價(jià)和認(rèn)知,要么高估自己,要么低估自己,而旁觀者,尤其是老師,往往能夠看到你的弱點(diǎn)、長(zhǎng)處、威脅、變化,并給你適時(shí)的提醒和指導(dǎo),少走彎路。
(2)所有領(lǐng)域的知識(shí)都是成體系的,如果有這個(gè)領(lǐng)域的行家里手在你早期的學(xué)習(xí)階段進(jìn)行指導(dǎo)甚至設(shè)計(jì)練習(xí)技巧,與自己琢磨的效果是不可同日而語(yǔ)的。估計(jì)每個(gè)人都會(huì)有這樣的經(jīng)歷,一個(gè)問(wèn)題自己,想到心碎想到夢(mèng)醒也沒(méi)有結(jié)果,別人過(guò)來(lái)抽絲剝繭條理清晰的一講,不僅你懂了,連你的小伙伴都懂了。這就是聽(tīng)君一席話(huà)勝讀十年書(shū)的道理。
(3)好處多多,余不一一。
但是走出校門(mén)之后再想找傳統(tǒng)意義的師傅就很難了,像絕地武士那樣和 Master 出雙入對(duì)同生共死更無(wú)可能,這時(shí)你就需要把身邊的朋友、同事當(dāng)做老師和資源,不恥下問(wèn),而且要問(wèn)的有智慧,讓人有回答欲望,那么如何提問(wèn)呢,請(qǐng)參考我之前寫(xiě)的一篇「如何提問(wèn)」。
參與社區(qū)和技術(shù)會(huì)議
自己學(xué)習(xí)和同事交流之余,可以參與一些網(wǎng)絡(luò)社區(qū)的交流,推薦:
技術(shù)問(wèn)答社區(qū):http://stackoverflow.com ,在技術(shù)領(lǐng)域幾乎包括萬(wàn)象,無(wú)所不知。 GitHub:https://github.com ,幾乎全世界優(yōu)秀的開(kāi)源軟件作品都在上面。
另外還可以參與一些群組,訂閱一些優(yōu)秀的個(gè)人博客,這個(gè)時(shí)代依然有人愿意貢獻(xiàn)優(yōu)質(zhì)內(nèi)容。
選擇性參與一些技術(shù)會(huì)議,比如 QCon,不指望在會(huì)場(chǎng)能學(xué)到什么,但可以了解技術(shù)趨勢(shì),并看看別人在做什么。
刻意練習(xí)
之前寫(xiě)過(guò)兩篇「刻意練習(xí)」的文章,自感對(duì)學(xué)習(xí)編程有一定幫助,大家可以去讀一下。
逃離舒適區(qū)
這一部分適合已經(jīng)有一定編程基礎(chǔ)的童靴
什么是舒適區(qū)?如果你是個(gè)新手,你就沒(méi)什么舒適區(qū),什么都不懂嘛舒適個(gè)毛,在磕磕絆絆的學(xué)習(xí)中懵懂前行,期間可能還伴隨著老鳥(niǎo)的嘲笑和進(jìn)度的壓力,終于有一天你武功精進(jìn),乾坤大挪移練到了第五重,工作中開(kāi)始得心應(yīng)手游刃有余,不斷有新人或老人來(lái)找你解決問(wèn)題,你微笑著迎接挑戰(zhàn),淡淡的送走難題,你揮一揮手,不帶走一片云彩,這是什么境界?這就是你的舒適區(qū),這和靠在沙發(fā)上看電視的舒適不是一回事,通常進(jìn)入舒適區(qū)需要花費(fèi)你很多的時(shí)間和精力,需要你不斷的練習(xí),一旦進(jìn)入,你會(huì)enjoy it!
這時(shí)候,如果有人膽敢讓你脫離舒適區(qū),可算要了親命了,你會(huì)勃然大怒,輕則爭(zhēng)吵,重則離職。這種事遇到太多了,一個(gè)寫(xiě)前端的你讓他學(xué)習(xí)一些后端技術(shù),一個(gè)寫(xiě)Java的你讓他學(xué)習(xí)一下C,得到的答復(fù)可能會(huì),Sorry, I feel very uncomfortable!
沒(méi)有人學(xué)新東西的時(shí)候非常舒服,一旦經(jīng)歷過(guò)從新人到老鳥(niǎo)的過(guò)程,再讓你進(jìn)入陌生的領(lǐng)域,那種痛苦會(huì)讓你自發(fā)的去抗拒。但是一個(gè)人不可能永遠(yuǎn)躲在舒適區(qū)里,逃離舒適區(qū)會(huì)有助于你從不同的角度看問(wèn)題,視野會(huì)更加開(kāi)闊。人總要往前走的。
很多人在某個(gè)地方待久了就會(huì)非常懈怠,沒(méi)退休就像在養(yǎng)老,這時(shí)候你就知道,他們?cè)谑孢m區(qū)太久了,與在哪個(gè)地方無(wú)關(guān)。
最后一招「見(jiàn)龍?jiān)谔铩?/strong>
實(shí)戰(zhàn)總是很重要,為大家推薦一個(gè)在線(xiàn)學(xué)習(xí)編程網(wǎng)站:
假以時(shí)日,各位必定武功大成,那時(shí)橫刀立馬、拔劍四顧,說(shuō)英雄誰(shuí)是英雄!