技术深度和广度
java_base 一、技术的深度
说到技术深度,深到底多深才叫有深度,是不是技术钻研的越就显得越牛逼,那学一门技术要怎么学才叫有深度的学?

学任何的知识都要形成一个体系,才能学得深,记得牢。功利性地,走马观花似的学习,很快就会忘记。

1、学习层次认知
我们先看看加涅定义学习的层次:

陌生——辨别——概念——规则(方法,套路等)——高级规则(解决问题)。

对应到我们技术,在我们技术简历上面,经常出现的词汇:

了解——熟悉——掌握——精通——专家,这就是由浅入深的形象描述。

1、了解:入门,简单的认知和记忆,表示知道。是最低水平的认知学习结果。

2、熟悉:概念,了解概念得清楚,清楚地知道概念;(对某种技术或学问)侧重于知道得清楚,比了解更进一层。
2、掌握:规则、应用规则到实践,是在熟悉的基础上能充分加以运用。
3、精通:高级规则,深入底层。
4、专家:扩展创新


2、技术深入程度
参考骨灰级大佬的观点(来自极客时间的《左耳听风》专栏):

1、了解:这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。这个其实就是回答:“我是谁”,“从哪来?” “到哪去”的三个哲学问题。

2. 熟悉: 这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。

3. 掌握:这个技术适用的场景并应用实践。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。

4. 掌握:技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。

5. 精通:技术的底层原理、关键实现、本质。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。

6.精通:已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。

7、专家:扩张创新。


3、技术实践和从问题中深入学习

要真正的精通一门技术,最终还要通过实践来深入。就像游泳教练,必定游泳水平好,因为这些都是实践性很强的工作。书上学来终觉浅,绝知此事要躬行。

在实践中,遇到问题,不仅只解决问题,还要对问题刨根问底,深入挖掘问题发生的根本原因,这样可以系统性地修复问题,从而使其永久消失。从问题本身着手,沿着因果关系链条,顺藤摸瓜,穿越不同的抽象层面,直至找出原有问题的根本原因.

我们中国古代以来就有“打破沙锅问到底”的习惯;“打破沙锅问到底”是一句俗语,形象表达了锲而不舍、不断探索的精神,这是人们常挂在嘴边的一句口头禅。

我们遇到问题,从外到里,逐层分析:
1、问题表象是什么
2、直接原因是什么?
3、中间原因是什么?
4、根本原因是什么?

真正的解决问题必须找出问题的根本原因,如果只解决问题,而不深入问题背后的根本原因,这门技术也是不够深入。
比如:
问题:java应用出现超时抖动?
1)解决:Java应用出现FGC. (增大 -Xmx -Xms 内存设置)
2)、直接原因:流量激增? 长时间运行? 代码问题导致占用内存对象不释放?。。。
3)、中间原因:流量没有做预警? 研发人员能力问题?
4)、根本原因:JVM虚拟机的基本原理?GC机制? JVM性能监控?。。。。




4、挖掘本质
什么是本质?
将世界万物理解为原子,将整个互联网理解成0和1,这倒的确是非常本质了,不过并不能解答任何问题。从问题现象看本质,实质上是一个从表层逐步深入的过程。
说到透过现象看本质,其实就是黄金思维圈,你在技术上遇到每一件事情, 首先问“为什么”, 所谓黄金思维圈, 其实是我们认知世界的方式。 我们看问题的方式。
可以分为三个层面——

第一个层面是what层面, 也就是事情的表象, 我们具体做的每一件事;
第二个层面是how层面, 也就是我们如何实现我们想要做的事情;
第三个层面是why层面, 也就是我们为什么做这样的事情。


在《技术的本质》这本书中,著名的经济学家布莱恩阐明了技术的本质及其进化机制,其主要表达了以下三个核心观点:
1.几乎所有技术都来自于此前已经存在的技术,就好比C、Java语言就是调动了多个功能最终实现一个功能。
2.技术都是由技术形成的,这句话可能有点难以理解。举例来说,火车的发明其实包含了多种技术,比如蒸汽技术,但蒸汽技术又可以被分解为燃料技术、动力技术等等。
3.技术和生物一样都会进化,但是生物的进化多来自变异,而技术的进化则来自不同技术组合所发生的变化。
布兰恩强调,技术并不会凭空发生。关于计算机技术,无论从前端还是后端,无论是过时还是被炒得很热,无论是云计算还是SAAS等,其本质技术都来自于此前已经存在的技术,都要求具备良好的算法和数据结构,在此基础上不断衍生出许多新技术。
如果是IT技术人,能深入学好基础知识《计算机组成原理》、《操作系统》、《数据结构》、《计算机网络》,其他技术都很快学好。


二、技术的广度
一般来说,我们都希望自己的技术既有广度又有深度,但事实上,鱼与熊掌不可兼得,我们人的一生其实很短暂,在这有限的时间和精力里,我们不可能掌握所有的技术,而且技术的更新速度很快,就如同浩瀚的大海一样。全栈的工程师相对来说比较少一点,如果掌握的广度上宽一点,可能深度上就相对会浅一点。
1、我们的纠结?
1) 、随着社会分工日趋细致,技术日新月异,我们发现技术在广度和深度上越来越难以平衡?
2) 、想深度发展自己的技术成为某领域专家,心里却不甘心亦或担心自己技术会被淘汰?
3)、想广度发展自己的技术让视野变大,却常常感觉精疲力尽,热门技术都懂一点却又不深入,感觉啥都会又啥也不会。
会不会成为什么都懂,但什么都不精的人?
2、技术广度
1、创业公司或者初创公司,是比较喜欢既有广度的技术人才,因为这个可以面面俱到。
2、而大公司一般都是要求技术深度的人才,因为大公司只要求一个螺丝钉。




三、如何权衡技术的广度和深度? 在快节奏的时代,不进则退,技术人员需要不停地吸纳新知识。到底选择技术广度学习,还是选择垂直深度?
俗话说,技多不压身。对于一个想在事业上有所发展的人来说,你还应放眼未来,多学几门技艺,不把希望只押在一个地方,这才是明智的选择。如同犹太人有一个不把鸡蛋都放在同一个篮子里的道理,就是用此来分摊现实风险。
下面具体来说说要如何权衡自己的广度和深度:
1.广度为辅,深度为主。人生时间有限,我们不可能精通所有的技术,但我们可以努力地精通工作相关的、有前景的、感兴趣的技术。
2.基础扎实,深入底层。只是解决工作上的问题是远远不够的,应该在工作之余去学习更底层的技术,所谓知其然还得知其所以然。比如说我们使用java做开发,仅仅会使用是不够的,我们还得再理解JVM的原理等,多多思考:为什么要这样用?怎么实现的?还有更好的办法去实现吗?
3.触类旁通,适度学习。学任何的知识都要形成一个体系,才能学得深,记得牢。


四、如何正确的做一个技术 T 型人才?

我们在追求广度和深度是否有矛盾?人生有限,现代社会又大量需要各方面的“专才”,什么都学,什么都喜欢,到头来会不会成为哪里都不突出,什么都干不好的“庸才”。
其实,“广度”只是“深度”的必要条件,而不是充分条件。挖深坑,需要足够的破土面积,但只挖几锹就停工,别说能挖多深,恐怕一辈子也挖不出水来。没有明确目标,没有恒心毅力,盲目的追求广度,只能是“摊大饼”,慢慢地把自己变成“纸片人”,最多也就是“万金油”,而且到头来,由于没有足够的深度,所谓的宽度也只是目光所及。
所以,盯着一个目标,开放心态,广开思路,广泛涉猎各种知识,努力拉开自己既有的思维、知识框架,多角度审视目标方向,持之以恒地推动前进,精神境界就会在纵向上不断加深,加深,再加深,直至突破临界点,成功实现飞跃。这应该才是广度与深度在人生追求中应该扮演的角色吧!


衡技术的广度和深度,更需要有一个正确的学习方式,端正的态度,而目标是做一个技术 T 型人才。