程序员进阶攻略
胡峰
京东成都研究院技术专家
立即订阅
7526 人已学习
课程目录
已完结 65 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 程序行知:走在同样的路上,遇见自己的风景
免费
征途:启程之初 (4讲)
01 | 初心:为什么成为一名程序员?
02 | 初惑:技术方向的选择
03 | 初程:带上一份技能地图
04 | 初感:别了校园,入了江湖
修炼:程序之术 (10讲)
05 | 架构与实现:它们的连接与分界?
06 | 模式与框架:它们的关系与误区?
07 | 多维与视图:系统设计的思考维度与展现视图
08 | 代码与分类:工业级编程的代码分类与特征
09 | 粗放与精益:编程的两种思路与方式
10 | 炫技与克制:代码的两种味道与态度
11 | 三阶段进化:调试,编写与运行代码
12 | Bug的空间属性:环境依赖与过敏反应
13 | Bug的时间属性:周期特点与非规律性
14 | Bug的反复出现:重蹈覆辙与吸取教训
修行:由术入道 (24讲)
15 | 根源:计划的愿景——仰望星空
16 | 方式:计划的方法——脚踏实地
17 | 检视:计划的可行——时间与承诺
18 | 评估:计划的收获——成本与收益
19 | 障碍:从计划到坚持,再到坚持不下去的时候
20 | 执行:从坚持到持续,再到形成自己的节奏
21 | 信息:过载与有效
22 | 领域:知识与体系
23 | 转化:能力与输出
24 | 并行:工作与学习
25 | 时间:塑造基石习惯(上)——感知与测量
26 | 时间:塑造基石习惯(下)——切割与构建
27 | 试试:一种“坏”习惯
28 | 提问:从技术到人生的习惯
29 | 偏好:个人习惯的局限与反思
30 | 写作:写字如编码
31 | 画图:一图胜千言
32 | 演讲:表达的技术
33 | 定义:阶梯与级别
34 | 晋升:评定与博弈
35 | 关系:学徒与导师
36 | 核心:安全与效率——工程技术的两个核心维度
37 | 过程:规模与协作——规模化的过程方法
38 | 思维:科学与系统——两类问题的两种思维解法
徘徊:道中彷徨 (15讲)
39 | 职业倦怠:如何面对?
40 | 局部最优:如何逃离?
41 | 沟通之痛:如何改变?
42 | 技术停滞:如何更新?
43 | 无法实现:困扰与反思
44 | 完成作品:理想与现实
45 | 代码评审:寄望与哀伤
46 | 人到中年:失业与恐惧
47 | 该不该去创业公司?
48 | 该不该接外包?
49 | 技术干货那么多,如何选?
50 | 技术分歧,如何决策?
51 | 技术债务,有意或无意的选择?
52 | 选择从众,还是唯一?
53 | 选择工作,还是生活?
寻路:路在何方 (7讲)
54 | 侠客行:一技压身,天下行走
55 | 江湖路:刀剑相接,战场升级
56 | 御剑流:一击必杀,万剑归心
57 | 三维度:专业、展现与连接
58 | 三人行:前辈、平辈与后辈
59 | 三角色:程序员、技术主管与架构师
60 | 三视角:定位、自省与多维
蜕变:破茧成蝶 (3讲)
61 | 工作之余,专业之外
62 | 跨越断层,突破边界
63 | 成长蓝图,进化跃迁
结束语 (1讲)
尾声 | 始于知,终于行
程序员进阶攻略
登录|注册

13 | Bug的时间属性:周期特点与非规律性

胡峰 2018-08-31
在上一篇文章中,我说明了“技术性 Bug 可以从很多维度分类,而我则习惯于从 Bug 出现的 ‘时空’ 特征角度来分类”。并且我也已讲解了 Bug 的空间维度特征:程序对运行环境的依赖、反应及应对。
接下来我再继续分解 Bug 的时间维度特征。
Bug 有了时间属性,Bug 的出现就是一个概率性问题了,它体现出如下特征。

周期特点

周期特点,是一定频率出现的 Bug 的特征。
这类 Bug 因为会周期性地复现,相对还是容易捕捉和解决。比较典型的呈现此类特征的 Bug 一般是资源泄漏问题。比如,Java 程序员都不陌生的 OutOfMemory 错误,就属于内存泄漏问题,而且一定会周期性地出现。
好多年前,我才刚参加工作不久,就碰到这么一个周期性出现的 Bug。但它的特殊之处在于,出现 Bug 的程序已经稳定运行了十多年了,突然某天开始就崩溃(进程 Crash)了。而程序的原作者,早已不知去向,十多年下来想必也已换了好几代程序员来维护了。
一开始项目组内经验老到的高工认为也许这只是一个意外事件,毕竟这个程序已经稳定运行了十来年了,而且检查了一遍程序编译后的二进制文件,更新时间都还停留在那遥远的十多年前。所以,我们先把程序重启起来让业务恢复,重启后的程序又恢复了平稳运行,但只是安稳了这么一天,第二天上班没多久,进程又莫名地崩溃了,我们再次重启,但没多久后就又崩溃了。这下没人再怀疑这是意外了,肯定有 Bug。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《程序员进阶攻略》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • sunny
    看得我惊心动魄,以前老是害怕bug出现,现在有点小期待;看看热闹,长长见识,毕竟还在初级,

    作者回复: 哈哈,心情平复没

    2018-08-31
    3
  • godtrue
    目前在优化的一些缓存刷新的定时任务,就属于过几年可能会出Bug的代码(因为这代码就是几年前写的,现在出问题了)原因如下
    1:缓存刷新的方式是先删后插

    2:我厂的统一规定不允许数据物理删除

    3:经久年月,无效数据越来越多,原来缓存刷新没问题,后来就有了空窗期,在空窗期内访问缓存就会出现问题了
    2018-09-01
    2
  • third
    迟到了。总算解决好学校的事情了。

    心得如下

    1,bug的时间属性:周期特点和非规律性


    2,周期性出现,比如OutOfMemory,内存泄露。


    3,非规律性,解决麻烦,采用工具,直接引入代码 Profiler 等性能剖析工具,就可以准确地找到有性能问题的代码段


    4,神出鬼没,海森堡 Bug(Heisenbug)


    5,bug的解决之道有两种,事前的,事后的。


    6,事后,Bug 出现后,捕捉现场并定位解决的


    7,事前进行预防和埋伏

    作者回复: 不迟😊

    2018-09-01
    2
  • 艾尔欧唯伊
    最近刚入职组里遇到的问题。。四个应用加一层设备,然后还有硬件资源紧张,合在一起出现的bug表象,基本就是各种展示数据不对。。。
    有些提了缺陷,但是问题环境都没了。。复现都很难。。。真不容易。。

    作者回复: 是的,现实多是带着一身 Bug 勇敢的上线了😊

    2018-08-31
    2
  • 心在飞
    我现在就遇到个海森堡bug, 客户现场出现过一次,在自己的服务器环境里一切正常,只能通过code review的方式做一些防御性编程,结果发现算法是老美算法专家92年写的!乱飞的point、各种业务处理算法,瞬间我就不想看了!

    作者回复: 太古老的代码,理解起来没了上下文,全靠想象力了,多半要重写了吧

    2018-08-31
    2
  • 无聊夫斯基
    需要这么多的逻辑判断的50ms的程序你是如何优化成3ms的?

    作者回复: 因为代码写得实在太糟糕了,可优化空间太大😄

    2018-08-31
    2
  • DebugCat
    生动形象的讲解

    作者回复: 😊

    2018-08-31
    2
  • 香槟
    之前有遇到一个bug,关于redis序列化和反序列化的。线上有6台服务器,升级了其中一台服务器,内容是增加了调用链监控的程序。升级完先上线看效果。由于机子的aspnet版本需更新,同时更新了内部redis封装的库。前半天运行正常,然后出现部分列表数据不一致的情形。赶紧写了段程序输出值看下。发现值均变为0。看代码是反序列化出值部分。看正常的列表数据,反序列化有值。看库里,发现两者的区别是一种序列化进去有引号,另一种序列化进去没引号。没引号的能在其他5台机子解析,而有引号的只能在升级库中解析。所以定位到了原因。为了顺利上线监控程序,又能平滑升级,选择了调整封装库的序列策略,改为序列成无引号的方式。这才解决不一致的问题。

    作者回复: 升级这种基础库,还是要多回归测试,兼容性问题不难,但处理起来很费时间和精力

    2019-02-23
    1
  • 二木🐶
    第一类bug的查找案例实在是不敢恭维,重要的正式环境这样去不断重启应用,加日志等方式简直就是不可能的

    作者回复: 以前写代码都是直接在正式环境编译运行,相当野😂

    2018-10-06
    1
  • liangjf
    少壮不遇bug,老大徒伤悲

    作者回复: 哈哈哈😄

    2018-09-07
    1
  • 忆灬星辰
    周期性bug 非规律性bug和海森堡bug,周期性的bug因为复现很容易会比较好解决。非规律性的虽然没有特殊规律。但是bug一直存在总会找到如何解决。海森堡bug难以浮现没有规律。可能随着代码量的增加以及代码深度理解可以有效避免这类bug
    2019-01-04
  • 石头
    时间类Bug种类:周期、非规律、海森堡。
    解决:事后与事前。事后:根据逻辑、性能工具等进行分析与定位案发现场[预防与埋伏],然后解决之;事前:运维代码证,帮助发现、诊断、甚至抵御bug。
    2018-09-05
收起评论
12
返回
顶部