黃衫女子的武功似乎與周芷若乃是一路瘦棋,飄忽靈動(dòng)稀火,變幻無(wú)方,但舉手抬足之間卻是正而不邪赌朋,如說(shuō)周芷若形似鬼魅凰狞,那黃衫女子便是態(tài)擬神仙。
這段描寫(xiě)出自《倚天屠龍記》第三十八回沛慢。
“九陰神抓”本是《九陰真經(jīng)》中的上乘武功赡若,但當(dāng)初梅超風(fēng)夫婦由于拿到的《九陰真經(jīng)》不完整,學(xué)不到里面的內(nèi)功心法颠焦,硬是把這門上乘武功練到了邪路上斩熊,于是就成了“九陰白骨爪”。周芷若為求速成伐庭,也練就了這門邪功粉渠。
但黃衫女子乃出身武林名門(相傳是楊過(guò)和小龍女的后人),自然修煉的是正宗的《九陰真經(jīng)》圾另。雖然武功路數(shù)與周芷若本同屬一脈霸株,但更加“醇真深厚”,自然也更勝一籌集乔。這是金庸武俠中“正宗”武功勝過(guò)“野路子”的一個(gè)典型案例去件。
那么,這是否能夠說(shuō)明扰路,“正宗”一定強(qiáng)于“野路子”呢尤溜?
且慢!
喜歡金庸武俠的朋友汗唱,可還記得《越女劍》中的阿青宫莱?
阿青本是一名牧羊女,卻在牧羊時(shí)巧遇一頭會(huì)使竹棒的白猿哩罪。在與白猿的玩耍嬉鬧中授霸,她硬是悟得了高超的劍法,竟能以一人之力敵兩千越甲际插!
就是這樣一個(gè)從野路子練出來(lái)的柔弱女子碘耳,即使按廣大金庸迷的保守估計(jì),她也能在整個(gè)金庸武俠圖譜中至少排名前五框弛!
做技術(shù)辛辨,猶如修習(xí)一門武功。
歷數(shù)我周圍的技術(shù)牛人(牛不到一定程度的先不算),他們中既有名牌大學(xué)計(jì)算機(jī)科班畢業(yè)的愉阎,也有半路出家轉(zhuǎn)行過(guò)來(lái)的绞蹦。
但他們都有一個(gè)共同特點(diǎn):他們?cè)谟龅絾?wèn)題后力奋,思考片刻榜旦,總是能一下子切中要害,在表達(dá)上也往往一語(yǔ)中的景殷。這也包括那些平常不善言辭的程序員溅呢。反觀那些“更一般”的程序員(其中不乏科班畢業(yè)的),他們經(jīng)常很難抓住問(wèn)題的本質(zhì)猿挚,表達(dá)起來(lái)也總是說(shuō)不到點(diǎn)子上咐旧。
可見(jiàn),“正宗”還是“野路子”绩蜻,并不在出身铣墨。
寫(xiě)到這里,我終于自己長(zhǎng)出了一口氣办绝。我出身一個(gè)極普通的農(nóng)民家庭伊约,既不是書(shū)香門第,也不是技匠世家孕蝉。記得在大學(xué)一年級(jí)的上機(jī)編程課上屡律,我才發(fā)現(xiàn)自己原來(lái)根本不會(huì)用鍵盤(pán)打字。相比那些初中高中就把計(jì)算機(jī)玩得很溜的同學(xué)降淮,我算野路子嗎超埋?
好了,那“正宗”還是“野路子”佳鳖,不在出身在什么呢霍殴?
在于學(xué)習(xí)和思考的方法。
據(jù)我觀察系吩,技術(shù)牛人的學(xué)習(xí)方法和思考方式来庭,大體類似。
思考方式淑玫,是個(gè)很難說(shuō)清的東西巾腕。所以,本文我們重點(diǎn)來(lái)討論討論學(xué)習(xí)的方法絮蒿。
面對(duì)一項(xiàng)新技術(shù)的時(shí)候尊搬,我們?cè)鯓尤W(xué)習(xí)才能循序漸進(jìn),最終理解得深刻土涝?
讓我們先把可供自學(xué)的資料列出來(lái)佛寿,分析一下:
Tutorial(入門教程)。由該項(xiàng)技術(shù)的官網(wǎng)提供。通常是英文的冀泻。這份資料是給初次接觸該項(xiàng)技術(shù)的人看的常侣,一般是一步一步地教你完成某些例子。當(dāng)我們說(shuō)某項(xiàng)技術(shù)對(duì)于新手不太友好的時(shí)候弹渔,一般也是因?yàn)檫@項(xiàng)技術(shù)的Tutorial部分做得不夠好胳施。
Specification,簡(jiǎn)稱Spec肢专。這是集中體現(xiàn)該項(xiàng)技術(shù)的設(shè)計(jì)思想的東西舞肆,是高度抽象的描述。這個(gè)一般也是一份完備的博杖、系統(tǒng)的描述椿胯,包含該項(xiàng)技術(shù)涉及到的方方面面。這部分資料在不同的地方叫法不同剃根,在相對(duì)簡(jiǎn)單的技術(shù)項(xiàng)目中哩盲,也可能沒(méi)有;在另一些情況下狈醉,這部分資料混雜在其它文檔資料之中廉油;它還可能以論文(paper)的形式出現(xiàn)。
API Reference舔糖。大而全的API索引和文檔娱两,針對(duì)不同的語(yǔ)言接口可能提供多份。當(dāng)我們使用這項(xiàng)技術(shù)進(jìn)行編程的時(shí)候金吗,API Reference自然是個(gè)離不開(kāi)的十兢、總是要不停去查詢的一份資料。
別人寫(xiě)的技術(shù)博客摇庙。質(zhì)量良莠不齊旱物,到底有沒(méi)有價(jià)值,我們要學(xué)會(huì)去分辨卫袒。
技術(shù)書(shū)籍宵呛。跟技術(shù)博客類似,質(zhì)量有好有壞夕凝。稍后我們和技術(shù)博客放在一起來(lái)分析宝穗。
Source Code。如果我們要學(xué)習(xí)的技術(shù)是開(kāi)源的码秉,那么很幸運(yùn)逮矛,我們能得到源代碼。這是一份終極資料转砖。
為了讓這些概念表達(dá)無(wú)誤须鼎,我接下來(lái)多舉一些例子。
Java語(yǔ)言
從來(lái)沒(méi)有接觸過(guò)Java語(yǔ)言的人,要想開(kāi)始自學(xué)Java晋控,從哪里開(kāi)始呢汞窗?可以從Oracle官方提供的Tutorial入手:
http://docs.oracle.com/javase/tutorial/
這份資料《The Java? Tutorials 》,集中體現(xiàn)了Tutorial類型的資料的特點(diǎn)赡译。它從最開(kāi)始的編譯和運(yùn)行環(huán)境搭建說(shuō)起仲吏,教你寫(xiě)出第一個(gè)Hello World,再用介紹的方式將Java各種語(yǔ)言特性(變量捶朵、類蜘矢、泛型、Lambda表達(dá)式综看、JavaBeans,等等)進(jìn)行講解岖食,同時(shí)還有對(duì)于JDK里常用API(集合類红碑、多線程、IO等等)的介紹泡垃。
對(duì)初學(xué)者而言析珊,需要的就是這樣一份資料。即使你手頭沒(méi)有任何Java的入門書(shū)籍蔑穴,讀完這樣的一份資料之后忠寻,一個(gè)新手基本就可以開(kāi)始使用Java來(lái)編程了。
再看Spec:
http://docs.oracle.com/javase/specs/jls/se8/html/index.html
這份文檔存和,叫做《The Java? Language Specification》奕剃。是一份很典型的Spec,完備而規(guī)范捐腿。
任何講Java語(yǔ)法的資料纵朋,包括各種書(shū)籍和前面提到的Tutorial,都只能涉及部分茄袖。而這份Spec操软,如果你能讀通的話,那么與Java語(yǔ)言特性有關(guān)的所有一切宪祥,你就再也不用求人了聂薪。
JDK 8的API Reference:
http://docs.oracle.com/javase/8/docs/api/index.html
用Java語(yǔ)言編程的時(shí)候,我們需要不斷查閱的就是這份API Reference蝗羊。我們平常一般是通過(guò)IDE來(lái)快速查看某個(gè)接口的文檔說(shuō)明藏澳。
Android開(kāi)發(fā)
Android針對(duì)新手的Tutorial類型的資料,官網(wǎng)上稱為Training:
https://developer.android.com/training/index.html
這份資料是典型的Tutorial肘交。它教你制作第一個(gè)Android App笆载,并針對(duì)若干個(gè)主題進(jìn)行一步一步的教學(xué)。
下面這份資料在Android官網(wǎng)上被稱為:API Guides。
https://developer.android.com/guide/index.html
它實(shí)際上是一份介于Tutorial和Spec之間的文檔凉驻。它有很多Spec的特點(diǎn)腻要,比如它介紹Android中的抽象的四大組件的概念,介紹資源尺寸的抽象(dp)涝登,介紹View層原理雄家,等等。但是胀滚,跟前面看到的Java Spec相比趟济,它沒(méi)有那么規(guī)范和正式,描述也更隨意一些咽笼,估計(jì)也算不上完備(但涉及到了Android技術(shù)的絕大部分)顷编。
當(dāng)我們對(duì)Android中某項(xiàng)具體技術(shù)存疑,或是有爭(zhēng)論的時(shí)候剑刑,我們就需要來(lái)翻翻這份文檔媳纬。因此,它基本可以歸入Spec類型施掏。
然后是Android SDK的API Reference:
https://developer.android.com/reference/packages.html
這份API Reference的質(zhì)量并不高钮惠,描述上過(guò)于簡(jiǎn)略,甚至模糊不清七芭,其可讀性跟前面提到的JDK 8的API Reference完全不在一個(gè)水平上素挽。這也是一些開(kāi)源項(xiàng)目的通病,不重視接口文檔狸驳。
iOS開(kāi)發(fā)
蘋(píng)果在iOS開(kāi)發(fā)方面給出的文檔是相當(dāng)豐富的预明,這也是一個(gè)閉源系統(tǒng)做得好的地方。
iOS開(kāi)發(fā)的文檔锌历,很難區(qū)分出Tutorial和Spec這兩個(gè)層面贮庞。它由很多文檔組成,每個(gè)文檔描述系統(tǒng)的某一方面究西。通常是在一個(gè)文檔中窗慎,既有教學(xué)的部分,又有完備描述的部分卤材。
針對(duì)完全的新手入門的話遮斥,下面這個(gè)文檔,算是真正的一個(gè)Tutorial:
Start Developing iOS Apps (Swift)(https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html)
其它各個(gè)文檔也是介于Tutorial和Spec之間扇丛,更偏向Spec术吗。比如:
App Programming Guide for iOS(https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html)
View Controller Programming Guide for iOS(https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/index.html)
View Programming Guide for iOS(https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/Introduction/Introduction.html)
Core Animation Programming Guide(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html)
Concurrency Programming Guide(https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html)
然后是iOS的API Reference:
https://developer.apple.com/reference/
如前所述,這份API Reference的可讀性非常高帆精,比Android SDK的要強(qiáng)多了较屿。很多前后相關(guān)的概念隧魄,在這份API Reference的描述中,都有體現(xiàn)隘蝎。
當(dāng)然购啄,除了developer.apple.com之外,iOS的文檔也都可以通過(guò)XCode取到嘱么。
Redis
Redis的Tutorial是我見(jiàn)過(guò)的最好的Tutorial狮含,它對(duì)初學(xué)者非常友好,不僅能讀曼振,還能執(zhí)行几迄。
http://try.redis.io/
Redis的Spec舉例:
Redis Protocol Specification (http://redis.io/topics/protocol)
Redis Cluster Specification (http://redis.io/topics/cluster-spec)
Redis RDB Dump File Format (https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format)
Redis的Commands Reference:
http://redis.io/commands
TCP/HTTP
網(wǎng)絡(luò)協(xié)議與前面的都不同,它不是一個(gè)實(shí)現(xiàn)冰评,而是一種標(biāo)準(zhǔn)映胁。
網(wǎng)絡(luò)協(xié)議的Spec文檔很明顯,就是它們對(duì)應(yīng)的RFC集索。如果你的工作經(jīng)常涉及到使用某個(gè)網(wǎng)絡(luò)協(xié)議屿愚,恐怕就需要找來(lái)RFC通讀一遍了。
再來(lái)說(shuō)一下技術(shù)博客和技術(shù)書(shū)籍务荆。
現(xiàn)在網(wǎng)上的技術(shù)文章空前繁榮,想讀都讀不過(guò)來(lái)穷遂。胡峰同學(xué)在他的微信公眾號(hào)“瞬息之間”上函匕,發(fā)過(guò)一篇文章《技術(shù)干貨的選擇性問(wèn)題》,討論的就是技術(shù)人員在當(dāng)前技術(shù)文章爆炸的情況下如何取舍的問(wèn)題蚪黑。
在這里盅惜,我們從另一個(gè)角度來(lái)討論一下這個(gè)問(wèn)題。如果一篇技術(shù)文章忌穿,僅僅是對(duì)于所涉及技術(shù)的官方文檔(Tutorial或Spec)的復(fù)述抒寂,甚至只是個(gè)翻譯,那么就價(jià)值不高掠剑。換句話說(shuō)屈芜,如果我們能通過(guò)閱讀官方文檔學(xué)到同樣的知識(shí),那為什么要看你寫(xiě)的技術(shù)文章呢朴译?官方文檔自然更權(quán)威井佑,直接閱讀它能確保不會(huì)遺漏重要的東西。
那什么樣的技術(shù)文章才有價(jià)值呢眠寿?大概可以說(shuō)(未必那么準(zhǔn)確)躬翁,那些包涵了實(shí)踐經(jīng)驗(yàn)的,能將各個(gè)技術(shù)點(diǎn)綜合起來(lái)產(chǎn)生思考盯拱,從而給人以啟迪的盒发。簡(jiǎn)單來(lái)說(shuō)例嘱,就是有深度的。
當(dāng)然宁舰,技術(shù)書(shū)籍也大體如此拼卵。
我們回過(guò)頭來(lái)再看一下,各個(gè)學(xué)習(xí)資料之間的層次結(jié)構(gòu)明吩。
每當(dāng)我們接觸一項(xiàng)新的技術(shù)的時(shí)候间学,我們都要把手頭的資料按照類似的這樣一個(gè)金字塔結(jié)構(gòu)進(jìn)行分類。如果我們閱讀了一些技術(shù)博客和技術(shù)書(shū)籍印荔,那么也要清楚地知道它們涉及到的是金字塔中的哪些部分低葫。
最開(kāi)始,一般讀完Tutorial之后仍律,就基本能上手做一些開(kāi)發(fā)工作了嘿悬。然后一邊開(kāi)發(fā),一邊查閱API Reference水泉。注意善涨,從這時(shí)候起,你的老板就開(kāi)始向你付工資了草则,因?yàn)槟愕墓ぷ饕呀?jīng)能夠產(chǎn)出成果了钢拧。
但是,工作一段時(shí)間之后炕横,我們發(fā)現(xiàn)源内,似乎身邊的技術(shù)牛人學(xué)東西都比較快,而且在很短的時(shí)間內(nèi)就能對(duì)某項(xiàng)新技術(shù)達(dá)到很深的理解份殿。這是為什么呢膜钓?
這并不是因?yàn)榧夹g(shù)牛人閱讀技術(shù)資料閱讀得快,而是他們知道閱讀正確的資料卿嘲,從而很快能達(dá)到知識(shí)金字塔更高的一層颂斜。
我見(jiàn)過(guò)的很多技術(shù)牛人,他們?nèi)绻皇前岩豁?xiàng)技術(shù)至少理解到Spec那個(gè)層次拾枣,他們是不敢隨便寫(xiě)代碼的沃疮。相反另一些人則從網(wǎng)上隨意拷貝代碼,并在自己不能完全理解的情況下用到項(xiàng)目中去放前。技術(shù)牛人們當(dāng)然也參考網(wǎng)上的代碼忿磅,但他們通常會(huì)確保它的每一部分都能安放在知識(shí)金字塔的某一部分,他們不容許那種不屬于任何體系的知識(shí)孤島的出現(xiàn)凭语。
我們現(xiàn)在可以這樣總結(jié)葱她,技術(shù)的“野路子”,其實(shí)是知識(shí)結(jié)構(gòu)的不完整和不系統(tǒng)造成的一種狀態(tài)似扔。只有當(dāng)你沖破知識(shí)金字塔層層的障礙吨些,邁向更高層次的時(shí)候搓谆,老板才開(kāi)始向你付高價(jià)。
我們的大腦好比內(nèi)存豪墅。
既然是內(nèi)存泉手,就裝不下所有的知識(shí)。但應(yīng)該能裝下對(duì)于知識(shí)的索引偶器,否則我們便沒(méi)法工作了斩萌。
那么,這里就有一個(gè)選擇性的問(wèn)題:我們選擇哪部分知識(shí)加載到“內(nèi)存”里呢屏轰?
顯然颊郎,應(yīng)該優(yōu)先選擇重要的,對(duì)我們最有用的信息霎苗。
對(duì)于那些最核心的技術(shù)姆吭,我們應(yīng)該做到:
通讀Spec。讀完就不再困惑唁盏。
重要部分的API Reference要通讀内狸。里面包含了很多跟實(shí)現(xiàn)有關(guān)的信息。
如果工作需要厘擂,還可能需要讀到Source Code昆淡。特別是對(duì)于平常一直在使用的SDK,不一定從頭到尾把源碼讀通刽严,這樣工作量太大且效率不高瘪撇,但一定要把你的開(kāi)發(fā)環(huán)境設(shè)置成一點(diǎn)擊某個(gè)調(diào)用的方法就能跳轉(zhuǎn)進(jìn)源碼實(shí)現(xiàn)。只有這樣港庄,你才能把平常開(kāi)發(fā)的時(shí)間利用起來(lái),隨時(shí)隨刻都點(diǎn)過(guò)去看源碼恕曲。
對(duì)于剩下的知識(shí)里80%的部分鹏氧,應(yīng)該至少理解到Spec層次。只有這樣佩谣,我們才能游刃有余地去使用它把还。
通讀重要的Spec,在很多情況下茸俭,其實(shí)還是很有難度的吊履。這需要毅力,和一點(diǎn)點(diǎn)英語(yǔ)基礎(chǔ)调鬓。
按本文前面提到的例子艇炎,做Java的人有誰(shuí)讀過(guò)Java Spec?做Android的人有誰(shuí)把developer.android.com上的API Guides都能通讀下來(lái)腾窝?而做iOS的人缀踪,developer.apple.com上的各個(gè)Programming Guide又完整地讀過(guò)幾個(gè)居砖?對(duì)于經(jīng)常調(diào)用的SDK钾腺,你會(huì)有計(jì)劃地去通讀其中重要部分的API Reference嗎书聚?
能夠把這一套做下來(lái)的津函,有可能不成為技術(shù)牛人嗎窄刘?
到了文章最后了荣瑟,總感覺(jué)還有些意猶未盡墩弯,腦海中似乎有些東西還是沒(méi)有表達(dá)出來(lái)零远,也不確定本文描述的學(xué)習(xí)方式是不是適用于每位讀者叙凡。仔細(xì)想想也難怪疆柔,學(xué)習(xí)本來(lái)就是一個(gè)復(fù)雜的問(wèn)題咒精,每個(gè)人并不是完全一樣的套路。
但是婆硬,不管本文介紹的方法是“正宗”的路子狠轻,還是屬于“野路子”,我在這里想要強(qiáng)調(diào)的一點(diǎn)是很明確的彬犯,那就是:要把知識(shí)梳理成系統(tǒng)的結(jié)構(gòu)向楼,要讓頭腦中的知識(shí)層次清楚,為此谐区,我們需要閱讀恰當(dāng)?shù)臇|西湖蜕,需要不斷地練習(xí),需要克服種種困難宋列。
成長(zhǎng)沒(méi)有捷徑可走昭抒。需要的是一個(gè)一個(gè)堅(jiān)實(shí)的突破。