技术知识的分类

knowledge
在IT行业工作若干年以后,会积累下各种各样的经验,或者称为知识。就像书需要分门别类地整理一样,知识也需要总结和整理,才能形成系统,更好地发挥作用。本文谈谈我对知识分类的理解

在我看来,技术知识可以大致分为以下几类

google型知识

这类知识是比较浅的,往往用于解决特定的单点问题,而且通常非常容易在网上搜索找到答案。所谓的面向github编程、面向stackoverflow编程、面向google编程,通常就是这种情况

比如说,”如何实现UILabel的圆角效果”、”什么是HAR”、”用注解配置spring事务”等等,或者是一行明确的报错信息,这样的问题100%有人已经遇到过了,而且网上一定能够找到答案

这类知识虽然比较浅,但是不代表没用,事实上日常工作中遇到的大部分都是这样的问题,所以善于使用搜索引擎,就已经可以满足工作中的大部分需要

对待这类知识,关键的就是积累和发散。把同一个领域的问题慢慢收集起来,同时保持好奇心,发散地了解相关的知识点。由点到面,最后就成了一个体系

特定领域知识

这类知识和上一种的区别是比较完整,而不是某个单一的知识点。经常表现为某个框架。这类知识通常已经被归纳和总结过,可以出专门的书了

比如《XXX in action》,《XXX cookbook》之类的书,或者官方的《XXX Reference》,《XXX Guide》之类的,都属于这种

这类知识非常有用,当完整地熟练掌握以后,就可以称为某个领域的专家,在众人的赞叹中解决各种问题。但是它的通用性比较差,换了一个平台,或者工作内容变了,有时候它就一点卵用都没有了

比如我最早搞java的那几年,非常认真地学习过hibernate,spring,struts2,logback等各种框架。然后13年的时候,开发平台切换到了node.js,在node.js上又研究了express,async,underscore,pm2之类的。再之后又全职做iOS开发2年时间,把cordova,cocoa,masnory研究了一番。再后来又去做java后端和中间件,又接触到了新的东西

就发现在每段时间里面,之前积累的平台、框架、工具的知识,对当前的工作帮助并不大。而且一旦好久不弄,这些东西慢慢就忘记了

谁也不能保证工作平台永远不会切换,更何况这些技术本身自己还会升级迭代淘汰。所以对待这类知识,我觉得在用的时候要尽量深入全面地去了解,成为专家,并且一定要总结下来。这样在当时会比较得心应手,后面就算不用了,由于曾经形成过完整的知识体系,再重新捡起来也会很快。并且到后面会发现,很多东西都是共通的

通用型知识

这类知识是最关键的,这十几年来从来也没有过时,而且不管在任何平台开发,它都非常有用

这类知识最大的特点就是通用性,一般是标准化的,涉及底层或者架构。包括进程、多线程、同步异步、网络协议、HTTP、RPC、数据一致性、分布式、设计模式、clean code、各种中间件等等

不管是做java、node、python,也不管角色是开发、架构、SRE,永远都会跟这类知识打交道

个人感觉通用型知识是程序员的核心竞争力,就像内力一样,专治花里胡哨。对原理的掌握,使得一个程序员鹤立鸡群,不但工作的产出胜人一筹,而且学新的知识会更快更通透,形成良性循环。而且由于这些知识是比较通用的,也比较有利于换岗位或者跳槽,有效应对经济危机和中年危机

创新类知识

以上的3类知识,都是能够从前人学到的。而创新类的知识,就需要自己的思考和实践

它并不是创造了新的知识,通常是把旧的知识组合起来加以使用,融合自己的经验和思考,解决具体场景下的新问题

比如说现在已经很成熟的秒杀系统,在当时就是一个了不起的创新,解决了瞬间高波峰超大流量的问题。要解决这个问题,涉及到方方面面,包括CDN、消息队列削峰等成熟技术,以及前端抛弃流量、识别虚假请求、超卖控制等等当时看来很创新的方案。虽然没有用到什么新的技术,但是如果方案设计者不是对各领域的知识都有所了解,融会贯通的话,秒杀的方案是无法成立的

这类知识,在网上往往已经没有现成的答案了,只有深刻了解业务,把各种知识组合起来,还要经过试错,最终才能在实践中得到,然后沉淀下来。这样的人,真的是非常厉害