`

优秀的程序员是如何处理技术 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。

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

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

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

相关推荐

    ChatGPT 来了,哪些行业影响最大.pdf

    对于软件开发人员、网络开发人员、计算机程序员、编码人员和数据科学家等技术工作,人工智能技术非常适合取代他们的部分工作。 这是因为像ChatGPT这样的AI擅长以相对准确的方式处理数字。 事实上,像 ChatGPT ...

    测试培训教材

    测试管理与QualityCenter培训手册 1、测试流程管理、测试度量方法 按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。...

    突飞猛进,教ChatGPT的课都来了!

    从Open AI最新发布的GPT-4,在原本ChatGPT的文本能力之上,还展示了对图像的处理以及不断完善的思维推理能力,尤其是听到说这样的技术已经开始在金融、教育、公益等领域的应用,让各行各业的打工人们惊慌不已。...

    Chat GPT:软件测试人员的危机?

    比尔·盖茨更是如此评价“这种AI技术出现的重大历史意义,不亚于互联网和个人电脑的诞生。” 在各个行业备受关注的Chat GPT更是引发了全网取代搜索引擎与程序员的讨论。各种言论席卷而来,作为软件测试人,相信不少...

    内存写监控类 memory Exception

    windows的virtualprotect函数监控的是一页内存,不太适合程序员在找BUG时的使用。我的这种方法也是利用这个函数,不过采用了一种机制,使触发的页读写异常得到继续执行。经过我的实际工作的使用,觉的应该拿出来让...

    net学习笔记及其他代码应用

    程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:...

    从缺陷中学习C/C++初稿

    案例涵盖基础问题、编译问题、库函数问题、文件处理、类和对象、内存使用、多线程问题、性能问题等。读者每掌握一个案例就掌握了一个或几个知识点,就能避免一类问题。由于是从大量编程中总结出来的具体Bug案例中...

    Windows驱动开发技术详解的光盘-part1

     本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快速学习编译、安装、调试的...

    windows驱动开发技术详解-part2

     本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试...

    小程序兼容安卓和IOS数据处理问题及坑

    最近开发微信小程序,遇到到过种...作为一名程序员,连bug都没有,你还开发什么软件?废话不说了先上问题吧; 1.小程序前端发送请求给后端,常用的有2中方式,一种是get请求,一种是POST请求,首先举例get请求吧, wx.

    Linker and loader

    置了不少独特的特性,而大型C++程序容易发生难以诊断的bug也是由于在链接时 发生了不可预料的事情(最常见的情况是静态构造函数没有按照程序员预计的顺序 执行 )。 当正确使用时,诸如共享库和动态链接此类的链接器...

    云端,云端将未来十大IT技术之一的应用虚拟化,全球第一家引入个人用户领域,创造软件使用崭新方式:不安装、不重装、无垃圾。

    此外,该软件也受到了金山软件总裁求伯君、中国互联网协会秘书长黄澄清、程序员杂志社社长、CSDN总裁蒋涛等业界知名人士的一致认可,并一举夺得“首届中国优秀软件创新大赛”金奖。或许不久的将来,在云端软件的...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则...

    ncurses-devel-5.5-24.20060715.x86_64.rpm

    你可能会疑惑,引入的这些技术术语是什么。假设在使用termcap或者terminfo的情况下,每个应用程序都在访问terminfo数据库并且做一些必要的处理(比如发送控制字符等等)。不久这些操作的复杂度将会变得难以控制。...

    基于OpenCV传统图像处理实现的美颜算法相机C源码+sln及说明(可美白和磨皮).zip

    基于OpenCV传统图像处理实现的美颜算法相机C源码+sln及说明(可美白和磨皮).zip 一. 说明 1. 用在实时直播项目中:yuv420输入和输出 2. 实现了纯cpu版本和neon版本,neon版本有bug,慎用 3. 支持三个参数: 美白,...

    C#微软培训资料

    8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...

    django-docs-2.2-zh-hans.zip

    在我们的 ticket tracker 报告关于 Django 的 Bug。 这份文档是如何组织的 Django 有丰富的文档。一份高度概述的文档会告诉你在哪里找到特定的东西: 教程 通过手把手地方式教你一步步的创建一个 Web 应用。如果你...

    软件工程发展调研报告.docx

    嵌入式系统原理技术基础(嵌入式系统) 信息系统分析与设计(信息系统) 分布式计算(网络计算) 中间件技术(网络计算) 游戏程序设计(数字媒体与应用) 专业选修类: 主流数据库系统与应用 数字图像处理 计算机...

    软件工程发展调研报告(2).docx

    信息系统分析与设计(信息系统) 分布式计算(网络计算) 中间件技术(网络计算) 游戏程序设计(数字媒体与应用) 专业选修类: 主流数据库系统与应用 数字图像处理 计算机图形学 Linux内核分析 形式化方法 社会...

    软件工程发展调研报告(1).docx

    嵌入式系统原理技术基础(嵌入式系统) 信息系统分析与设计(信息系统) 分布式计算(网络计算) 中间件技术(网络计算) 游戏程序设计(数字媒体与应用) 专业选修类: 主流数据库系统与应用 数字图像处理 计算机...

Global site tag (gtag.js) - Google Analytics