转向 Java 之后的几年,我花了很多时间学习 JVM、垃圾回收、多线程、字节码和框架源码。
那时我对技术深度的理解相对直接:不能只会使用工具,还要知道它为什么这样工作。知道得越靠近底层,处理问题时就越不容易停留在表面。
这个判断至今仍有价值,但已经不能完整解释我所理解的技术能力。
从会用到知道原理
刚开始工作时,很多问题可以通过查文档解决。框架怎样配置,接口如何调用,数据库语句怎么写,都有相对明确的答案。
系统变大以后,只知道使用方式开始显得不够。线程为什么阻塞,内存为什么持续增长,一项配置为什么能改变性能,这些问题需要继续向下理解。
学习底层原理带来的最大变化,并不是记住更多名词,而是能够建立一条解释链。看到现象以后,可以从应用代码追到框架、虚拟机和操作系统,知道下一步应该收集什么证据。
我第一次处理 JVM 直接崩溃时,过去积累的知识确实帮助我理解 crash 文件和运行时异常。即便最终根因来自第三方序列化组件,而不是 JVM 自身,没有那些基础也很难缩小范围。
知道原理不等于解决问题
不过,技术知识越多,也越容易把问题带到自己熟悉的方向。
遇到性能异常时,熟悉 JVM 的人会先看 GC,熟悉数据库的人会先看 SQL,熟悉架构的人则可能急着讨论拆分。每个方向都有道理,但真实问题并不关心个人最擅长什么。
一次排查中,能够列出十种可能性不代表更有深度。更重要的是根据现象建立假设,通过数据排除错误方向,并在事实变化时及时修正判断。
原理知识提供可能性,问题分析决定先验证哪一种。
技术方案还受到现实约束
后来参与更多系统设计,我发现技术深度也体现在取舍上。
一个方案可能在结构上更完整,却需要更长交付时间;一项通用能力能够支持未来变化,也可能让当前系统过早承担复杂度。知道多种方案只是开始,还要说明每种方案在具体条件下的成本。
这种判断无法完全从书本和源码中得到。它来自真实系统的演进、失败和维护,也来自对业务与团队能力的理解。
深入和广泛并不矛盾
过去我会把深入某项技术与关注业务、协作看成不同方向。现在更愿意把它们放在同一个问题里。
技术细节决定方案能否成立,业务目标决定问题是否值得解决,组织条件则影响方案能否落地。缺少任何一部分,判断都可能失真。
这并不意味着技术人员不再需要钻研底层。恰恰相反,只有具备可靠的专业判断,才能在复杂讨论中说明哪些限制真实存在,哪些只是习惯。
现在怎样理解技术深度
现在我仍然尊重那些愿意读源码、追机制的人。很多困难问题最终都需要有人继续向下走。
只是我不再用知道多少底层细节单独衡量技术深度。它还包括识别真正的问题,理解方案成立的条件,承认不确定性,并对选择带来的长期成本保持清楚。
技术深度不是离业务和现实越远越深,而是在面对具体问题时,能够走到足以作出可靠判断的位置。