`

优秀的程序员是如何处理技术 Bug 的?

阅读更多
最近我的圈子里人们都在讨论“如何成为更优秀的程序员”。 看了他们的讨论,我决定分享一下我关于“如何成为更优秀的程序员”的经验。我希望向别人介绍我认为有用的经验,以便他们应用到自己的生活中。

我“变得更优秀”的办法是建立在训练的基础上的。我每周都要做一系列的“练习”。我设计的训练有两个明确的目标:

学习如何解决我以前不知道怎样解决的问题;

学习如何更快地编写正确的程序。

我的训练方法总共由四个不同的练习组成,每个都能帮我实现上面的两个目标。这四个练习分别是:

读一篇论文;

学习一个新工具;

读一本书的几个章节;

在写程序时录制屏幕,然后审查写程序的过程,找出如何才能写得更快。

我会具体解释下每个练习。我还会分享一些我如何进行这些练习,以及我从这些练习中得到的好处。



读一篇论文



这个练习的目的是为了扩展我在计算机科学方面的知识。我发现阅读论文有两个直接的好处,第一就是一些论文改变了我对特定问题的看法,比如《The Tail at Scal》(https://ai.google/research/pubs/pub40801)这篇论文介绍了长尾的违反直觉的延迟。

我从这篇论文里学到一个很有意思的事情,就是在多台机器上执行请求会影响延迟。作者研究的数据来自某个Google服务,该服务在处理请求时,会将请求的各个部分分发到多个不同的服务上。文章利用一些数据估算了将请求分布到100个不同的服务上时会发生什么。作者发现,如果测量从所有100台服务器上接收响应的时间,那么超过一半的时间是在等待最后五个响应!这是因为最慢的5%的请求要比所有其他请求慢得多。这篇论文还给出了几种降低长尾延迟的方法。我发现这些方法在我的工作中非常有用。

读论文的另一个好处就是它能为我提供知识,使我从整体上理解不同的系统。以Google的分布式数据库Spanner为例,Spanner使用了许多不同的技术,如Paxos、两阶段提交、MVCC和谓词锁等。通过阅读这些论文,我理解了这些技术的概念。这样我就可以从整体上理解Spanner,并理解与其他系统相比Spanner做出的权衡。

我发现,我阅读的大部分论文都来自于我读过的论文的引用,或者来自Morning Paper的推荐。《Designing Data Intensive Applications》(https://dataintensive.net/)这本书也引用了许多值得一读的论文。



学一个新工具



解决问题的最简单的方式之一就是使用一个已有的、专门用于解决该问题的工具。在这个练习中,我会选一个工具并学习之。通常我会在本地设置好工具,阅读几篇指南,再阅读一点手册。我过去学过的工具很广泛,从jq、sed等bash工具,到Kafka或Zookeeper等分布式系统。

学习bash工具能帮我更快地解决许多常见的任务。简单的文本处理使用sed通常比使用编程语言更容易。类似地,学习不同的分布式系统能帮我理解解决不同问题所需的不同工具。

这样当我面对某个问题时,我能知道该用什么工具来解决。



阅读一本书的几个章节



我用书籍来补充我无法从论文或工具中得到的知识。我阅读的书籍覆盖的话题非常广泛。我最近读的书包括:

《重构》(Refactoring),我发现通过这本书能很好地理解好代码应该是什么样子,以及怎样将坏代码变成好代码。

《尽管去做》(Getting Things Done),这本书对优先级排序和任务跟踪很有帮助。它帮我建立了一套规则,保证我能把重要的事情先做完。

《新手经理人圣经》(The First Time Manager),我最近在工作上成了团队的协调人,主要责任是在有需要时与其他团队沟通,也负责组织我们团队的会议。这本书是理解基本的管理概念的很不错的入门读物。



录制屏幕



这个是我最喜欢的练习,它对我解决问题的改变最大。这个练习就像运动员审核自己的录像,以便找出改进的方式一样。我打算在编程上使用同样的办法。关于录制屏幕的练习,我有以下经验:

它能帮我在编写代码时进行测试。这样做可以减少定位bug的时间,从而减少调试代码的时间。如果所有的代码都没有bug,那么bug必然出在新写的代码中。

在调试一个问题时, 增加一个调试专用的功能通常很值得。举例来说,我之前解决过的一个玩具性质的问题是写一个LRU缓存,有个bug是无法把正确的元素替换出去。我加了一个函数用来输出缓存的状态,这样就能迅速确定出错的原因了。我能够看到缓存的实际行为和正确行为之间的差异,这样就能迅速地确定bug的位置。

在写任何代码之前,花五分钟确定一个方案是物有所值的。这样做有两个好处,它能让我确定我选择的方案是正确的,更重要的是,它能强迫我选择唯一的一个方案。通过观察自己的视频记录,我发现我在两种不同方案的来回切换上浪费了很多时间。实际上任何一种方案都可以工作得很好。

现在回想起来,这些经验教训都很明显,但如果没有屏幕的记录,并观察我在哪里浪费了时间,我完全不能意识到这些问题。

这个练习的步骤是:

记录我自己解决某个问题的过程。可以是我在工作上遇到的问题,或者是在某个编程挑战网站上(如Leetcode)遇到的问题。

以10倍速度重放视频记录,找出每段时间我在做什么。

计算我在每一类事情上花费的时间。我在调试bug上花了多少时间?在构建某个功能时花费了多少时间?

查看我花费时间最多的分类,然后继续挖掘究竟是什么花费了时间。

想办法找出节省时间的办法。通常都能找到办法,提前组织代码的结构,这样就能写更少的代码,或者更容易找到bug。

我强烈推荐记录你的屏幕——这是找出提高工作效率的小改进中,最容易的一个办法了。

我去年一整年都在进行这种训练,从我自身来说真的发生了很大的变化。我学到了许多本来不可能学到的关于系统和工具的知识,我还能比以前更快地解决问题。我希望你喜欢这些练习,并将其中一些应用到自己的工作中。

以后我将分享我在训练过程中的发现。首先,我要在每次做某个练习时写一篇博文,记录下我在练习中得到的经验和教训。我觉得记录下我的经验教训应该对我很有好处,也能成为其他人的很好的学习资源。
分享到:
评论

相关推荐

    为什么我们程序员写不出好代码? - 文章 - 伯乐在线1

    3. **过度依赖生产指标**:有些管理层通过代码行数或修复的bug数量来衡量程序员的生产力。这种量化指标可能导致程序员为了追求数字而忽视代码质量,导致代码变得冗余和过度设计。 4. **爱慕虚荣的开发者**:部分...

    程序员的酸甜苦辣 程序员的酸甜苦辣

    在团队合作中,程序员不仅要处理与同事的技术交流,还要面对项目管理、沟通协调等复杂的人际关系。如何在技术领域保持专业,同时又能处理好与他人的关系,是程序员生涯中不可或缺的一环。这就像菜肴中的盐,虽然看似...

    成为优秀程序员的10条修炼秘籍

    综上所述,成为一名优秀的程序员不仅仅意味着掌握技术技能,还需要具备良好的职业素养和个人品质。以上10条修炼秘籍涵盖了从技术细节到职场态度的多个方面,旨在帮助程序员全面提升自我,成为一个更为出色的开发者。

    程序员绩效考核明细表.7z

    3. **技术创新与学习能力**:优秀的程序员应具备持续学习新技术的能力,能够引入创新的解决方案。考核这部分时,会看他们在工作中是否有使用新工具、框架或编程语言,以及解决复杂问题的能力。 4. **团队协作**:...

    程序员级高级程序员级程序设计

    《程序员级高级程序员级程序设计》是一门深入探讨高级编程技术的课程,旨在提升程序员的技能水平,使之能够更高效、更智能地进行软件开发。本课程覆盖了多个关键的知识点,包括但不限于算法优化、数据结构、并发编程...

    高级程序员必备条件

    掌握Java的核心概念和技术,如多线程编程、异常处理、集合框架等,对于成为一名高级程序员来说是必不可少的。 #### 7. 测试与调试 编写高质量的代码不仅需要优秀的编码技巧,还需要良好的测试和调试能力。这包括...

    程序员老黄历.zip

    《程序员老黄历》是一款专为程序员设计的日历应用,它结合了传统的黄历元素与现代编程行业的特色,旨在帮助开发者规划工作、规避技术难题,提高工作效率。这个压缩包文件包含的是某一天(2017年6月22日)的程序员老...

    VC 程序员 原码 网

    对于有一定经验的开发者,它可能深入讲解了内存管理、异常处理、多线程编程、COM组件等复杂主题,这些都是VC程序员必须掌握的关键技术。 在学习VC编程时,以下几个知识点尤为重要: 1. **C++基础**:理解C++的基础...

    java程序员参考求职简历

    Java程序员在求职过程中,一份优秀的简历是至关重要的。简历不仅体现了候选人的专业技能,还展示了他们的个人特质和项目经验。以下是一些关于如何构建一份出色的Java程序员求职简历的知识点: 一、个人信息 简历的...

    J2EE程序员需掌握的技术

    J2EE程序员在当前的软件开发环境中扮演着重要的角色,他们需要掌握一系列广泛的技术和框架,以便能够构建高效、可扩展的企业级应用。以下是一些关键领域的详细说明: 1. **Web开发框架**:Web开发框架如JSF、Struts...

    程序员笑话大全.docx

    4. 程序错误(bug):在程序员的世界里,bug是常见的问题,需要花费大量时间来查找和修复。 5. 工资与现实:程序员的薪资问题常常成为幽默的话题,这里暗示了程序员希望薪水能像传说中那样增长,但实际上可能并非...

    淘宝bug展示图片

    Bug是程序员和测试工程师日常工作中常见的问题,它指的是软件或应用中存在的错误、缺陷或异常行为。在淘宝这样的大型电子商务平台上,任何小的bug都可能影响到用户的购物体验,甚至可能导致交易错误或数据丢失。下面...

    《卓有成效的程序员》 迷你书

    《卓有成效的程序员》是一本专为程序员和软件开发者设计的迷你书籍,旨在帮助他们提升工作效率、优化工作流程,并最终成为一个卓有成效的技术专家。这本书涵盖了多个关键的知识点,对于那些希望在IT行业中脱颖而出的...

    软件测试基础知识各大软件公司面试所遇BUG问题各大软件公司面试所遇BUG问题

    其次,设计和修改过程中的问题也易引发Bug,比如需求频繁变更、缺乏有效的变更管理,以及程序员在修改代码时的不当处理。此外,Bug 的潜伏性和阶段性意味着它们可能在特定阶段或条件下才显现,如集成测试才能暴露的...

    BugFree1.1.rar

    在BugFree中,用户可以创建、分配和跟踪bug的状态,它提供了用户友好的界面,让非技术人员也能方便地提交问题。系统通常包含以下主要功能: 1. **缺陷报告**:用户可以通过填写详细的问题描述、重现步骤、影响程度...

    历年初级程序员试题及其答案

    初级程序员是IT行业中入门级别的职位,对于初学者或者即将参加程序员资格考试的人来说,熟悉历年初级程序员试题及其答案是至关重要的。这份压缩包文件包含了历年来的考试题目和对应的解答,可以帮助考生更好地理解和...

    程序员口号大全.docx

    18. 程序员分为不同阶段,从初学者到高手,逐步掌握bug处理技巧。 19. 不同编程语言的特性对应了程序员找对象的不同情况,如C++的多继承特性。 20. 程序员的幽默感体现在将技术术语应用于生活,如类风湿性关节炎与类...

    在修改代码时存在的bug

    图像处理是一个复杂且技术含量高的领域,它涉及到计算机视觉、图像分析、算法设计等多个方面。C++是一种广泛用于这类任务的编程语言,因其强大的性能和丰富的库支持而备受青睐。 在C++进行图像处理时,可能遇到的...

    BugReport dump txt

    在IT行业中,"BugReport dump txt"通常是指一种用于调试和问题排查的技术,它涉及到C++编程语言中的异常处理和堆栈跟踪。当程序运行时出现错误或异常,程序员会生成一个dump文件,该文件包含了程序崩溃时的内存状态...

Global site tag (gtag.js) - Google Analytics