技术的正宗与野路子

黄衫女子的武功彷佛与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间倒是正而不邪,如说周芷若形似鬼魅,那黄衫女子即是态拟神仙。html

这段描写出自《倚天屠龙记》第三十八回。java

“九阴神抓”本是《九阴真经》中的上乘武功,但当初梅超风夫妇因为拿到的《九阴真经》不完整,学不到里面的内功心法,硬是把这门上乘武功练到了邪路上,因而就成了“九阴白骨爪”。周芷若为求速成,也练就了这门邪功。android

但黄衫女子乃出身武林名门(相传是杨过和小龙女的后人),天然修炼的是正宗的《九阴真经》。虽然武功路数与周芷若本同属一脉,但更加“醇真深厚”,天然也更胜一筹。这是金庸武侠中“正宗”武功赛过“野路子”的一个典型案例。ios

那么,这是否可以说明,“正宗”必定强于“野路子”呢?git

且慢!程序员

喜欢金庸武侠的朋友,可还记得《越女剑》中的阿青?github

阿青本是一名牧羊女,却在牧羊时巧遇一头会使竹棒的白猿。在与白猿的玩耍嬉闹中,她硬是悟得了高超的剑法,竟能以一人之力敌两千越甲!redis

就是这样一个从野路子练出来的柔弱女子,即便按广大金庸迷的保守估计,她也能在整个金庸武侠图谱中至少排名前五!编程


作技术,犹如修习一门武功。api

历数我周围的技术牛人(牛不到必定程度的先不算),他们中既有名牌大学计算机科班毕业的,也有半路出家转行过来的。

但他们都有一个共同特色:他们在遇到问题后,思考片刻,老是能一会儿切中要害,在表达上也每每一语中的。这也包括那些日常不善言辞的程序员。反观那些“更通常”的程序员(其中不乏科班毕业的),他们常常很难抓住问题的本质,表达起来也老是说不到点子上。

可见,“正宗”仍是“野路子”,并不在出身。

写到这里,我终于本身长出了一口气。我出身一个极普通的农民家庭,既不是书香门第,也不是技匠世家。记得在大学一年级的上机编程课上,我才发现本身原来根本不会用键盘打字。相比那些初中高中就把计算机玩得很溜的同窗,我算野路子吗?

好了,那“正宗”仍是“野路子”,不在出身在什么呢?

在于学习和思考的方法。

据我观察,技术牛人的学习方法和思考方式,大致相似。

思考方式,是个很难说清的东西。因此,本文咱们重点来讨论讨论学习的方法。


面对一项新技术的时候,咱们怎样去学习才能按部就班,最终理解得深入?

让咱们先把可供自学的资料列出来,分析一下:

  • Tutorial(入门教程)。由该项技术的官网提供。一般是英文的。这份资料是给初次接触该项技术的人看的,通常是一步一步地教你完成某些例子。当咱们说某项技术对于新手不太友好的时候,通常也是由于这项技术的Tutorial部分作得不够好。
  • Specification,简称Spec。这是集中体现该项技术的设计思想的东西,是高度抽象的描述。这个通常也是一份完备的、系统的描述,包含该项技术涉及到的方方面面。这部分资料在不一样的地方叫法不一样,在相对简单的技术项目中,也可能没有;在另外一些状况下,这部分资料混杂在其它文档资料之中;它还可能以论文(paper)的形式出现。
  • API Reference。大而全的API索引和文档,针对不一样的语言接口可能提供多份。当咱们使用这项技术进行编程的时候,API Reference天然是个离不开的、老是要不停去查询的一份资料。
  • 别人写的技术博客。质量参差不齐,到底有没有价值,咱们要学会去分辨。
  • 技术书籍。跟技术博客相似,质量有好有坏。稍后咱们和技术博客放在一块儿来分析。
  • Source Code。若是咱们要学习的技术是开源的,那么很幸运,咱们能获得源代码。这是一份终极资料。

为了让这些概念表达无误,我接下来多举一些例子。

Java语言

历来没有接触过Java语言的人,要想开始自学Java,从哪里开始呢?能够从Oracle官方提供的Tutorial入手:

这份资料《The Java™ Tutorials 》,集中体现了Tutorial类型的资料的特色。它从最开始的编译和运行环境搭建提及,教你写出第一个Hello World,再用介绍的方式将Java各类语言特性(变量、类、泛型、Lambda表达式、JavaBeans,等等)进行讲解,同时还有对于JDK里经常使用API(集合类、多线程、IO等等)的介绍。

对初学者而言,须要的就是这样一份资料。即便你手头没有任何Java的入门书籍,读完这样的一份资料以后,一个新手基本就能够开始使用Java来编程了。

再看Spec:

这份文档,叫作《The Java® Language Specification》。是一份很典型的Spec,完备而规范。

任何讲Java语法的资料,包括各类书籍和前面提到的Tutorial,都只能涉及部分。而这份Spec,若是你能读通的话,那么与Java语言特性有关的全部一切,你就不再用求人了。

JDK 8的API Reference:

用Java语言编程的时候,咱们须要不断查阅的就是这份API Reference。咱们日常通常是经过IDE来快速查看某个接口的文档说明。

Android开发

Android针对新手的Tutorial类型的资料,官网上称为Training:

这份资料是典型的Tutorial。它教你制做第一个Android App,并针对若干个主题进行一步一步的教学。

下面这份资料在Android官网上被称为:API Guides。

它其实是一份介于Tutorial和Spec之间的文档。它有不少Spec的特色,好比它介绍Android中的抽象的四大组件的概念,介绍资源尺寸的抽象(dp),介绍View层原理,等等。可是,跟前面看到的Java Spec相比,它没有那么规范和正式,描述也更随意一些,估计也算不上完备(但涉及到了Android技术的绝大部分)。

当咱们对Android中某项具体技术存疑,或是有争论的时候,咱们就须要来翻翻这份文档。所以,它基本能够纳入Spec类型。

而后是Android SDK的API Reference:

这份API Reference的质量并不高,描述上过于简略,甚至模糊不清,其可读性跟前面提到的JDK 8的API Reference彻底不在一个水平上。这也是一些开源项目的通病,不重视接口文档。

iOS开发

苹果在iOS开发方面给出的文档是至关丰富的,这也是一个闭源系统作得好的地方。

iOS开发的文档,很难区分出Tutorial和Spec这两个层面。它由不少文档组成,每一个文档描述系统的某一方面。一般是在一个文档中,既有教学的部分,又有完备描述的部分。

针对彻底的新手入门的话,下面这个文档,算是真正的一个Tutorial:

其它各个文档也是介于Tutorial和Spec之间,更偏向Spec。好比:

而后是iOS的API Reference:

如前所述,这份API Reference的可读性很是高,比Android SDK的要强多了。不少先后相关的概念,在这份API Reference的描述中,都有体现。

固然,除了developer.apple.com以外,iOS的文档也均可以经过XCode取到。

Redis

Redis的Tutorial是我见过的最好的Tutorial,它对初学者很是友好,不只能读,还能执行。

Redis的Spec举例:

Redis的Commands Reference:

TCP/HTTP

网络协议与前面的都不一样,它不是一个实现,而是一种标准。

网络协议的Spec文档很明显,就是它们对应的RFC。若是你的工做常常涉及到使用某个网络协议,恐怕就须要找来RFC通读一遍了。


再来讲一下技术博客和技术书籍。

如今网上的技术文章空前繁荣,想读都读不过来。胡峰同窗在他的微信公众号“瞬息之间”上,发过一篇文章《技术干货的选择性问题》,讨论的就是技术人员在当前技术文章爆炸的状况下如何取舍的问题。

在这里,咱们从另外一个角度来讨论一下这个问题。若是一篇技术文章,仅仅是对于所涉及技术的官方文档(Tutorial或Spec)的复述,甚至只是个翻译,那么就价值不高。换句话说,若是咱们能经过阅读官方文档学到一样的知识,那为何要看你写的技术文章呢?官方文档天然更权威,直接阅读它能确保不会遗漏重要的东西。

那什么样的技术文章才有价值呢?大概能够说(未必那么准确),那些包涵了实践经验的,能将各个技术点综合起来产生思考,从而给人以启迪的。简单来讲,就是有深度的。

固然,技术书籍也大致如此。


咱们回过头来再看一下,各个学习资料之间的层次结构。

每当咱们接触一项新的技术的时候,咱们都要把手头的资料按照相似的这样一个金字塔结构进行分类。若是咱们阅读了一些技术博客和技术书籍,那么也要清楚地知道它们涉及到的是金字塔中的哪些部分。

最开始,通常读完Tutorial以后,就基本能上手作一些开发工做了。而后一边开发,一边查阅API Reference。注意,从这时候起,你的老板就开始向你付工资了,由于你的工做已经可以产出成果了。

可是,工做一段时间以后,咱们发现,彷佛身边的技术牛人学东西都比较快,并且在很短的时间内就能对某项新技术达到很深的理解。这是为何呢?

这并非由于技术牛人阅读技术资料阅读得快,而是他们知道阅读正确的资料,从而很快能达到知识金字塔更高的一层。

我见过的不少技术牛人,他们若是不是把一项技术至少理解到Spec那个层次,他们是不敢随便写代码的。相反另外一些人则从网上随意拷贝代码,并在本身不能彻底理解的状况下用到项目中去。技术牛人们固然也参考网上的代码,但他们一般会确保它的每一部分都能安放在知识金字塔的某一部分,他们不允许那种不属于任何体系的知识孤岛的出现。

咱们如今能够这样总结,技术的“野路子”,实际上是知识结构的不完整和不系统形成的一种状态。只有当你冲破知识金字塔层层的障碍,迈向更高层次的时候,老板才开始向你付高价。


咱们的大脑比如内存。

既然是内存,就装不下全部的知识。但应该能装下对于知识的索引,不然咱们便无法工做了。

那么,这里就有一个选择性的问题:咱们选择哪部分知识加载到“内存”里呢?

显然,应该优先选择重要的,对咱们最有用的信息。

对于那些最核心的技术,咱们应该作到:

  • 通读Spec。读完就再也不困惑。
  • 重要部分的API Reference要通读。里面包含了不少跟实现有关的信息。
  • 若是工做须要,还可能须要读到Source Code。特别是对于日常一直在使用的SDK,不必定从头至尾把源码读通,这样工做量太大且效率不高,但必定要把你的开发环境设置成一点击某个调用的方法就能跳转进源码实现。只有这样,你才能把日常开发的时间利用起来,随时随刻都点过去看源码。

对于剩下的知识里80%的部分,应该至少理解到Spec层次。只有这样,咱们才能游刃有余地去使用它。

通读重要的Spec,在不少状况下,其实仍是颇有难度的。这须要毅力,和一点点英语基础。

按本文前面提到的例子,作Java的人有谁读过Java Spec?作Android的人有谁把developer.android.com上的API Guides都能通读下来?而作iOS的人,developer.apple.com上的各个Programming Guide又完整地读过几个?对于常常调用的SDK,你会有计划地去通读其中重要部分的API Reference吗?

可以把这一套作下来的,有可能不成为技术牛人吗?


到了文章最后了,总感受还有些意犹未尽,脑海中彷佛有些东西仍是没有表达出来,也不肯定本文描述的学习方式是否是适用于每位读者。仔细想一想也难怪,学习原本就是一个复杂的问题,每一个人并非彻底同样的套路。

可是,无论本文介绍的方法是“正宗”的路子,仍是属于“野路子”,我在这里想要强调的一点是很明确的,那就是:要把知识梳理成系统的结构,要让头脑中的知识层次清楚,为此,咱们须要阅读恰当的东西,须要不断地练习,须要克服种种困难。

成长没有捷径可走。须要的是一个一个坚实的突破。

(完)

其它精选文章

相关文章
相关标签/搜索