首页 > 其他分享 >用结构化思维解一切BUG(1):核心思路

用结构化思维解一切BUG(1):核心思路

时间:2023-11-01 09:25:59浏览次数:36  
标签:思维 结构化 假设 问题 范围 数据 BUG 原因

面对万“卷”世界,有人选择拼命学习新技术,解决眼前的、点状问题;有人提升思维层级,解决未来的、系统问题。您选择什么?

背景

我有10多年编程经验和研发管理经历,虽很久不写代码,但有很多人找我咨询技术问题,解决程序 BUG。因为不管多么千奇百怪的技术栈,我都能帮到他们,或直接给出解题思路,或帮他们精准定位问题。

在很多具体的技术点上(比如SQLServer、Kubernetes上),我都算不上资深专家,但我总能帮这些资深专家快速解决 BUG。为什么呢?

回答这个问题之前,我们要分清「诊断」和「治疗」。「诊断」需要的是结构化思维,只要您理解计算机运行原理,对现代应用的组成有基本认知,您就可以用「假设树」和「主动试验」来逐步缩小范围,最终确定「病因」。但「治疗」,需要把想法实现,需要具体的技术知识。

很多程序员在具体技术上很精通,但在需要平移或扩展到其它类似技术时,往往捉襟见肘。这导致,为了自己的维持竞争力,需要拼命的学习新的技术栈。很累,却效果不好。

本系列文章不介绍具体的技术,而介绍一种「程序诊断」的思维框架,是「性价比」更高的「通项公式」,可以跨场景解决任何问题,可以终生受益!

核心思路:做实验→造现象→缩范围

本「程序诊断」的核心思路就是依赖于「假设树」,通过重复多次执行「做实验→造现象→缩范围」动作序列,逐级下钻,缩小问题范围,直到「执行者」可以接管的程度(通常是一个服务/模块/函数)。如下图所示:

其基本逻辑是:

  1. 面对现象,先从宏观去判断第一层级的「可能的原因」,即原因所在的大类。当我们判断了第一层级的原因,我们就把问题范围缩小了。
  2. 假设确定原因大类为「可能的原因2」,接下来在更小的范围中,我们需要进一步确定更具体的原因,是 2-1 还是 2-2 还是 2-3。
  3. 如果当前现象没有提供充分的证据来帮我们进一步缩小范围,则我们需要主动做试验,来创造更多现象,以支撑我们缩小范围。
  4. 重复上面三个步骤,直到把范围缩小到执行者可以解决的程度。

在软件领域,前几层的「假设树」一般有大致的套路。以一个 Web 应用为例,其前几层「假设树」通常可参考下图制作。

我们面对一个现象时,通常先判断是前端原因还是后端原因。

假设是前端原因,我们再判断,是运行问题(代码问题)、数据问题、网络问题、还是运行环境问题。展开来说:

  1. 如果近期发布过新版本,则有很大概率是运行问题(代码问题)。
  2. 如果排除了代码问题,并且 BUG 只有某些固定用户出现,或只跟某些固定的实体(比如商品、流程)相关,那么大概率是数据问题。
  3. 如果排除了以上两者,并且 BUG 只有某些固定用户出现,则可以检查一下这些用户的浏览器(品牌和版本)是否一样,以确定是否浏览器问题。
  4. 如果排除了以上三者,并且 BUG 跟用户所在的网络环境有很大关系,则可以检查下网络。

再往后,以此类推。

请注意,「假设树」没有标准答案,以上只是 Web 应用的「假设树」的「一种」拆分方法。面对不同的软件应用场景、不同的现象,你可能需要绘制自己的「假设树」。这个绘制不难,只要懂得计算机的基本运行原理和现代应用的基本组成部分,利用机构化拆解问题的基本方法,即可绘制。

从第一性原理来讲,一个应用本质就是「处理」「数据」的程序。出现问题,要么是处理逻辑发生了改变(一般是代码导致),要么是数据发生了改变。如果我们能保证代码没改变(通过发布的版本号或者 Git 提交号来判断),那么一定是数据发生了改变。假设确定了是数据的问题,我们可以继续列举原因,可能是环境配置的数据、数据库的数据、缓存的数据、其它微服务传递过来的数据、前端传递过来的数据、时间等。这样,就可以继续往下钻。

实践原则:程序断案三字经

通过上面的介绍,您大概已经知道了核心思路。但到实际使用,还需要一些操作原则来帮助。我把他们总结成「程序断案三字经」:

  1. 先诊断,后开药。
  2. 信机器,勿信人。
  3. 做试验,缩范围。
  4. 先脆弱,后稳定。
  5. 找不同,看变化。

篇幅原因,本文不展开介绍这些实践原则,请关注本系列后续文章,我将深度讲解实践原则和典型案例。

总结

面对万“卷”世界,有人选择拼命学习新技术,解决眼前的、点状问题;有人提升思维层级,解决未来的、面状问题。您选择什么?

关于作者

您好,朋友。我现就职于西门子工业软件,担任高级咨询顾问。成功领导 10 多个世界 500 强企业的数字化转型项目,跨越政府、零售、金融、汽车制造、生物医药等多个行业,创造巨大商业价值。

如有任何与「数字化转型」有关的问题,欢迎用以下方式与我交流:

  1. 添加我的个人微信「zjh1943」。添加时请注明姓名、行业、交流的问题。

  2. 关注我的微信公众号「知明所以」。

  3. 关注我的知乎专栏:https://www.zhihu.com/people/zhu-jin-heng

标签:思维,结构化,假设,问题,范围,数据,BUG,原因
From: https://www.cnblogs.com/jhzhu/p/17797978.html

相关文章

  • React Native 页面调试工具 react-native-vdebug
    yarnaddreact-native-vdebugimportReactfrom'react'import{createNativeStackNavigator}from'@react-navigation/native-stack'import{getRouter}from'./config'import{ErrorBoundary}from'../component/light......
  • PHPStudy 安装tp8 php8.2.9 安装XDbug、redis扩展安装XDbug扩展vscode断点:
    一、PhpStudy升级PHP版本,安装PHP8.2操作步骤1.1、官网下载最新的php版本打开Windows版的官网下载,地址:https://windows.php.net/download/ 页面上有不同的PHP版本,这里我们下载的是64位nts版的PHP8.2.9。1.2、解压下载的文件将下载的文件php-8.2.9-nts-Win32-vs16-x64.zip,移到PhpS......
  • 赌徒思维到底多可怕?
    赌徒思维到底多可怕从小接触钱之后对钱的意识很淡薄,要么就是大手大脚想买啥买啥,一气呵成,要么就是啥都不舍得买,衣食住行都是最简单的。当我没钱回老家的时候,我家是农村养鸡户目前6000只蛋鸡,我爸一直在家送鸡蛋往外面商店,以前曾想过在家讨生活。但是觉得跟父亲性格格格不入。他......
  • “我有一个大胆的想法”?Meta AI 新技术让你的思维图像一览无余!
     作者|付奶茶大家之前是否想象过未来的技术进步会带来读脑器,计算界面是否有可能越过触摸屏、键盘进入我们思维内部读取我们脑袋中所想。尽管当前我们社会尚未达到这一阶段,但我们确实逐渐接近这一愿景!不久前,MetaAI宣布了一项名为ImageDecoder的深度学习应用,由FAIR-Paris与巴黎......
  • 抓住重点的思考能力如何训练,批判性思维和金字塔原理
    读教科书感觉有点晦涩,阅读英文文章有时候不能抓住重点,感觉需要训练自己这方面的能力,多看看纸质书。其实我觉得我和别人交流的时候,有那种答非所问的倾向,说明我不善于抓住重点。当然一方面是因为我可能要忽略那些我不想回答的东西,另一方面就是思考能力的缺乏了为什么有人思考问题......
  • 分享那些让你苦笑不得的Bug经历
    作为一名开发者,我们经常会遇到各种各样的挑战,但其中最让人烦恼的可能就是那些看似复杂实际上非常简单的Bug。这些Bug有时会让我们花费大量时间来排查,最后却发现问题的症结并不复杂。本文将分享一些让你困扰,后来发现原因后又让你苦笑不得的Bug经历。1.缺少引号的字符串constnam......
  • python3.8 debug记录
    AttributeError:module'numpy'hasnoattribute'typeDict'pip3installnumpy==1.18.5ModuleNotFoundError:Nomodulenamed'sklearn'pipinstallscikit-learn(注:安装这个库可能与已有的numpy版本冲突,需要多卸载安装几次)......
  • SQLSmith: Databend 如何利用随机化测试检测 Bug
    作者:白珅Databend 研发工程师https://github.com/b41sh为什么需要SQLSmith?在数据库系统的开发和维护过程中,测试扮演着至关重要的角色。它不仅可以验证功能的正确性,还可以发现潜在的问题,确保数据库在每个变更和迭代后保持性能和稳定性。Databend的CI已经支持了多种类......
  • idea远程连接服务器debug
    原文链接:https://blog.csdn.net/qq_46921028/article/details/131434686云服务开放端口原文链接:https://blog.csdn.net/qq_46921028/article/details/131434686......
  • NLTK debug记录——"[nltk_data] Error loading xxx"下载数据集失败
    问题:运行nltk.download("xxx")时遇到连接下载失败Error解决:在gitee上下载对应的.zip词库包(如,nltk_data/pakages/copora/目录下的下载链接);NLTK下载数据集时会自动搜索某些以./nltk_data/为结尾的目录(见附注),找到一个这样的目录并确保自己有写这个目录的权限,如果上一层目录下没有n......