程序员如何做「问题定位」:不是靠经验,是靠思路
问题定位是程序员最重要的能力之一。
经验能帮你快速解决见过的问题,思路能帮你解决没见过的问题。
一、问题定位的思路
1. 从现象到本质
- 现象是什么?用户看到了什么?
- 本质是什么?系统哪里出了问题?
- 不要只看现象,要找到根因
2. 从已知到未知
- 先看熟悉的模块
- 逐步排查不确定的地方
- 用排除法缩小范围
3. 从局部到整体
- 先看单个组件
- 再看组件之间的调用
- 最后看整体系统
4. 从数据到结论
- 收集证据(日志、监控、堆栈)
- 用数据说话
- 避免主观猜测
二、问题定位的工具
1. 日志分析
- 应用日志
- 系统日志
- 访问日志
- 错误日志
2. 监控工具
- Metrics(Prometheus + Grafana)
- Tracing(Skywalking/Jaeger)
- Logging(ELK/Loki)
3. 诊断命令
- Linux:top、netstat、ss、strace
- Java:jstack、jmap、jstat、arthas
- 数据库:EXPLAIN、show processlist
4. 网络工具
- ping、telnet、curl、wget
- tcpdump、wireshark
三、常见问题定位
1. 服务响应慢
排查顺序:
- 看监控(CPU/内存/网络)
- 看日志(慢查询、异常)
- 看线程(锁竞争、阻塞)
- 看外部依赖(下游服务)
2. 服务不可用
排查顺序:
- 检查进程(是否存活)
- 检查端口(是否监听)
- 检查健康检查
- 检查资源(磁盘、内存、句柄)
3. 数据错误
排查顺序:
- 看写入日志
- 看数据库数据
- 看缓存数据
- 看上下游数据
四、问题定位的心态
1. 保持冷静
慌乱容易犯错,越慌越乱。
2. 小步验证
一次只改一个地方,改完验证再改下一个。
3. 记录过程
记录排查步骤、尝试方案、最终方案。
4. 复盘总结
问题解决后,分析根因,防止下次再踩。
五、一句话总结
问题定位 = 从现象到本质 + 从已知到未知 + 从局部到整体 + 从数据到结论,工具(日志/监控/诊断命令/网络工具)。