技术深度的思考

最近因为各种原因,引发了对“技术深度”的思考,如何才能做一个有技术深度的程序员?

1. 技术深度是什么?

1.1 先说技术广度

先不说技术深度,和技术深度相关的还有一个叫技术广度,容易理解,技术广度,就是见多识广,对于后端程序员,你见过并了解rpc框架,数据库,缓存,消息队列,分布式,甚至前端,终端等等…这些都是你的技术广度,它不要求多么深入的理解原理,重点在于知识面的范围要广。

1.2 再谈技术深度

而技术深度不同,它需要的是,在一方面有深入的了解,包括技术背景,熟练应用,底层原理,源码细节,优化创新。通常,工作中,可能我们能做到熟练应用,再加上熟悉一些底层原理,可能就完全够了。而真正要把一个技术吃透,我理解是少不了源码细节的了解,以及通过源码明白技术的trade off,进而进行优化和创新,只有这样才能成为一个专家。

1.3 那两者谁更重要呢?

我认为是同等重要,技术广度决定了技术领域的迁移能力,能从一个技术方向迁移到另一个技术上,先有技术广度,才能进行深究。显而易见,如果连一个技术有没有都不知道,当然无从谈起技术深度了。而技术深度决定了一个人在某一技术领域解决问题的能力,真正能否在业务中解决实际的疑难杂症,就在于技术的深度是否足够。

1.4 对应的人才类型

技术广度和技术深度通常就对应了常说的T型人才,对技术有一定的广度,并且在某一领域有深度。当然,不是说一个人只能在一个领域发光发热。还有M型人才,能在多个领域进行深耕。我个人觉得,程序员是更容易成为M型人才的,因为技术在底层是相通的,所以当在一个领域有一定深度后,迁移到另外一个领域,更容易举一反三,融会贯通。

2. 如何成为有技术深度的人

技术广度可能要求不一定高,了解新技术,甚至应用新技术,都是一件不困难的事(api小子嘛),但是想要成为一个有技术深度的人,就需要不断学习,学习的过程是反人性的,是困难的。所以往往人们愿意呆在舒适区,从而难易达到一定的技术深度。

有毅力不断学习,也要掌握方法,自己总结了一下成为有技术深度的人需要经历的几个过程。

了解:包含技术背景,解决什么问题,发展历史,目前待解决的问题,发展的方向

应用:如何使用,适用什么业务场景,性能指标,技术边界(超过这个边界,技术就无法胜任了)

原理:技术底层的原理,性能指标对应的底层能力,一般来说对应高级程序员

源码:源码细节,这个其实和原理会有一定重叠,比如当你了解数据库的实现原理的时候,一般就是了解底层数据结构的源码细节,能达到这个应该可以算资深程序员

优化创新:可能是底层技术的创新,可以应用进行创新,比如操作系统支持新特性了,数据库可以进行创新。或者是从其他领域的技术方案进行迁移,进行创新。创新往往是比较难的,能做到有技术深度的创新,应该是专家级别了。

3. 何为知识?

上面说了成为有技术深度的人,需要经历的几个过程,过程中是免不了高效学习的,常说的学习,到底是怎样的一个过程?我认为大概有以下几个过程

数据:首先需要收集数据,比如了解一个系统的性能,那可能需要从各个维度收集数据,比如对系统进行压测,不断的发起请求,统计请求的数量,所有请求的耗时情况等。

信息:把获取的数据整理成信息,比如qps,P90耗时,P99耗时等。总之就是把数据结构化,通过不同的统计维度去组织数据。

知识:把上面的数据进行归纳。比如在某某机器配置条件下,系统满载的情况下,能达到最大的qps是多少,平均耗时是多少。最大qps和请求包大小的关系,已经不同并发数下,系统的承载能力等。

应用:有了上面的结论后,就可以进行应用了,比如性能数据可以用来对资源进行预估,对存储进行选型,或者发现架构设计上的缺陷等。为优化系统提供基于数据支持的指导性意见。

codelover wechat
原创公众号
-----若有不妥,敬请斧正-----