用结构化思维解一切BUG(1):核心思路
面对万“卷”世界,有人选择拼命学习新技术,解决眼前的、点状问题;有人提升思维层级,解决未来的、系统问题。您选择什么?
背景
我有10多年编程经验和研发管理经历,虽很久不写代码,但有很多人找我咨询技术问题,解决程序 BUG。因为不管多么千奇百怪的技术栈,我都能帮到他们,或直接给出解题思路,或帮他们精准定位问题。
在很多具体的技术点上(比如SQLServer、Kubernetes上),我都算不上资深专家,但我总能帮这些资深专家快速解决 BUG。为什么呢?
回答这个问题之前,我们要分清「诊断」和「治疗」。「诊断」需要的是结构化思维,只要您理解计算机运行原理,对现代应用的组成有基本认知,您就可以用「假设树」和「主动试验」来逐步缩小范围,最终确定「病因」。但「治疗」,需要把想法实现,需要具体的技术知识。
很多程序员在具体技术上很精通,但在需要平移或扩展到其它类似技术时,往往捉襟见肘。这导致,为了自己的维持竞争力,需要拼命的学习新的技术栈。很累,却效果不好。
本系列文章不介绍具体的技术,而介绍一种「程序诊断」的思维框架,是「性价比」更高的「通项公式」,可以跨场景解决任何问题,可以终生受益!
核心思路:做实验→造现象→缩范围
本「程序诊断」的核心思路就是依赖于「假设树」,通过重复多次执行「做实验→造现象→缩范围」动作序列,逐级下钻,缩小问题范围,直到「执行者」可以接管的程度(通常是一个服务/模块/函数)。如下图所示:

其基本逻辑是:
- 面对现象,先从宏观去判断第一层级的「可能的原因」,即原因所在的大类。当我们判断了第一层级的原因,我们就把问题范围缩小了。
- 假设确定原因大类为「可能的原因2」,接下来在更小的范围中,我们需要进一步确定更具体的原因,是 2-1 还是 2-2 还是 2-3。
- 如果当前现象没有提供充分的证据来帮我们进一步缩小范围,则我们需要主动做试验,来创造更多现象,以支撑我们缩小范围。
- 重复上面三个步骤,直到把范围缩小到执行者可以解决的程度。
在软件领域,前几层的「假设树」一般有大致的套路。以一个 Web 应用为例,其前几层「假设树」通常可参考下图制作。

我们面对一个现象时,通常先判断是前端原因还是后端原因。
假设是前端原因,我们再判断,是运行问题(代码问题)、数据问题、网络问题、还是运行环境问题。展开来说:
- 如果近期发布过新版本,则有很大概率是运行问题(代码问题)。
- 如果排除了代码问题,并且 BUG 只有某些固定用户出现,或只跟某些固定的实体(比如商品、流程)相关,那么大概率是数据问题。
- 如果排除了以上两者,并且 BUG 只有某些固定用户出现,则可以检查一下这些用户的浏览器(品牌和版本)是否一样,以确定是否浏览器问题。
- 如果排除了以上三者,并且 BUG 跟用户所在的网络环境有很大关系,则可以检查下网络。
再往后,以此类推。
请注意,「假设树」没有标准答案,以上只是 Web 应用的「假设树」的「一种」拆分方法。面对不同的软件应用场景、不同的现象,你可能需要绘制自己的「假设树」。这个绘制不难,只要懂得计算机的基本运行原理和现代应用的基本组成部分,利用机构化拆解问题的基本方法,即可绘制。
从第一性原理来讲,一个应用本质就是「处理」「数据」的程序。出现问题,要么是处理逻辑发生了改变(一般是代码导致),要么是数据发生了改变。如果我们能保证代码没改变(通过发布的版本号或者 Git 提交号来判断),那么一定是数据发生了改变。假设确定了是数据的问题,我们可以继续列举原因,可能是环境配置的数据、数据库的数据、缓存的数据、其它微服务传递过来的数据、前端传递过来的数据、时间等。这样,就可以继续往下钻。
实践原则:程序断案三字经
通过上面的介绍,您大概已经知道了核心思路。但到实际使用,还需要一些操作原则来帮助。我把他们总结成「程序断案三字经」:
- 先诊断,后开药。
- 信机器,勿信人。
- 做试验,缩范围。
- 先脆弱,后稳定。
- 找不同,看变化。
篇幅原因,本文不展开介绍这些实践原则,请关注本系列后续文章,我将深度讲解实践原则和典型案例。
总结
面对万“卷”世界,有人选择拼命学习新技术,解决眼前的、点状问题;有人提升思维层级,解决未来的、面状问题。您选择什么?
关于作者
您好,朋友。我现就职于西门子工业软件,担任高级咨询顾问。成功领导 10 多个世界 500 强企业的数字化转型项目,跨越政府、零售、金融、汽车制造、生物医药等多个行业,创造巨大商业价值。
如有任何与「数字化转型」有关的问题,欢迎用以下方式与我交流:
添加我的个人微信「zjh1943」。添加时请注明姓名、行业、交流的问题。
关注我的微信公众号「知明所以」。
关注我的知乎专栏:https://www.zhihu.com/people/zhu-jin-heng 。
用结构化思维解一切BUG(1):核心思路的更多相关文章
- 工作中的Buff加成-结构化思考力:第一章:认识结构化思维及其作用
一:引言 为了更好的说明结构思考力,我们先来做几个小测试. PS:如果你能做到,请留言,因为我要和你交好友,因为你是人才啊,可以挖一挖,挖到我的公司中. 第一个测试:请在三秒内记住下列数字.数字顺序不 ...
- 有效的结构化思维训练,MECE分析法
MECE原则,表达精准分类与全面性的有效利器 结构化思维的本质就是逻辑,其目的在于对问题的思考更完整.更有条理,它帮助我们一个一个找到线头,理清思路,探求事物之间的相互联系.MECE分析法是一种结构化 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 结构化CSS设计思维
LESS.SASS等预处理器给CSS开发带来了语法的灵活和便利,其本身却没有给我们带来结构化设计思维.很少有人讨论CSS的架构设计,而很多框架本身,如Bootstrap确实有架构设计思维作为根基. 要 ...
- 详解Google-ProtoBuf中结构化数据的编码
本文的主要内容是google protobuf中序列化数据时用到的编码规则,但是,介绍具体的编码规则之前,我觉得有必要先简单介绍一下google protobuf.因此,本文首先会介绍一些google ...
- NumPy之:结构化数组详解
目录 简介 结构化数组中的字段field 结构化数据类型 创建结构化数据类型 从元组创建 从逗号分割的dtype创建 从字典创建 操作结构化数据类型 Offsets 和Alignment Field ...
- Bigtable:一个分布式的结构化数据存储系统
Bigtable:一个分布式的结构化数据存储系统 摘要 Bigtable是一个管理结构化数据的分布式存储系统,它被设计用来处理海量数据:分布在数千台通用服务器上的PB级的数据.Google的很多项目将 ...
- 视频结构化 AI 推理流程
「视频结构化」是一种 AI 落地的工程化实现,目的是把 AI 模型推理流程能够一般化.它输入视频,输出结构化数据,将结果给到业务系统去形成某些行业的解决方案. 换个角度,如果你想用摄像头来实现某些智能 ...
- Shell 语法之结构化命令(流程控制)
许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...
- 第25章 SEH结构化异常处理_未处理异常及向量化异常
25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...
随机推荐
- 面由 AI 生|ZegoAvatar 捏脸技术解析
一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"."沉 ...
- 客户端软件接入QQ和Github第三方登录
原文地址: 客户端软件接入QQ和Github第三方登录 - Stars-One的杂货小窝 之前一直计划给现在系统加上第三方登录的功能,最近终于是有了时间去研究实现 因为逻辑实在有些繁琐,下面的记录尽量 ...
- Seal AppManager如何基于Terraform简化基础设施管理
作者简介 陈灿,数澈软件Seal 后端研发工程师,曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践.在敏捷研发和产品效能提升有着丰富的经验,致力于构建一站式研发友好的平台工程解决方案 ...
- GoFrame v2.5 版本发布,企业级 Golang 开发框架
大家好啊,GoFrame 框架今天发布了 v2.5.0 正式版本啦! 本次版本主要是对已有功能组件以及开发工具上的改进工作.其中,开发工具新增了 gf gen ctrl 命令,以规范化定义.开发 AP ...
- Linux reset子系统
文章代码分析基于linux-5.19.13,架构基于aarch64(ARM64). 1. 前言 复杂IC内部有很多具有独立功能的硬件模块,例如CPU cores.GPU cores.USB控制器.MM ...
- vue基本操作[2] 续更----让世界感知你的存在
Vue文件解析 什么是<template/>标签 template是html5新元素,主要用于保存客户端中的内容,表现为浏览器解析该内容但不渲染出来,可以将一个模板视为正在被存储以供随后在 ...
- docker部署zabbix6.0及企业微信发送告警
1 前言 1.1 实验背景 因zabbix 6.0新增许多新特性,为熟悉界面特意在本地部署一套简易版(未启用HA功能).原本想要在烧制了centos7.9系统树莓派上部署,一查之下armv7果然冷门, ...
- AI 一键去水印:教你无限量使用商业图片的技巧
场景再现 刚开始注册账号(啥账号具体不表了,小编不喜欢的那个),想弄个闪亮,好看,有个性化的 Logo.作为一名非专美工小白人员,网上翻了很久作图工具,要么就是不好用,好用的大部分都收费.最后没办法, ...
- Pytorch构建超分辨率模型——常用模块
Import required libraries: import torch import torch.nn as nn import torch.optim as optim from torch ...
- 通过Nginx权限认证拦截资源
nginx认证转发模块 Module ngx_http_auth_request_module 详细参考官网 ngx_http_auth_request_module (nginx.org) 模块 ...