阅读更多

2顶
1踩

研发管理

翻译新闻 软件开发中 10 个调试和排错建议

2013-08-16 10:51 by 副主编 WnouM 评论(11) 有9353人浏览



在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目。可是,当数千行的代码写完之后,整个项目因为bug的出现而被压垮了,更别说添加什么新功能了...这也许是对程序员的最大打击,在饱满的热情上浇了一盆冷水。其实,最好的软件程序员当然知道怎样去发现并修复这些bug,在刚开始编程的时候就通过软件工程的最好方法来降低bug的出现概率。

几乎没有哪个程序员能够写出一个bug都没有的代码,但是解决方法总是比困难多得多。多实践和坚毅的决心是成功的关键,这样才能够写出清洁代码,保证软件系统的可靠性。

下面一起来看看这些可以镇压bug的工具箱。

1. 输出语句

代码调试的首要工具就是插入可靠地、真实的输出语句。当输出语句数量庞大且不易于管理的时候,在输出语句里恰当使用记录系统,这可以说是一个等效的好方案。许多编程语言里都配备了现成的类库,例如在Python里构建的记录库。

输出语句是程序员检查数据值和变量类型最快、最简单和最直接的方式。高效的输出语句能够帮助程序员通过一段代码来跟踪数据流,并快速识别bug源头。虽然先进的调试工具有很多,但是如果你想调试一段代码的话,这个普通的输出语句的方法应该是程序员最先考虑的方法。

2. 调试器

源代码调试器采用了输出语言方法里的逻辑推理。这样可以让程序员一行一行的单步执行代码,同时监测从变量值到底层虚拟机整个状态的一举一动。另外,大部分的编程语言都具有多个调试器,可以提供不同的功能,包括图形接口、终止程序的断点设置、执行环境内部任意代码的实施。

在许多情况下,调试器可以说是大材小用了,但如果合理利用的话,调试器绝对是一款高效率的工具。更多调试器的功能请看Python调试器:pdb

3. Bug跟踪系统



在一些比较重大的软件项目里,使用bug跟踪系统是很有必要的。如果没使用bug跟踪器,最典型的状况就是程序员要整理以往的邮件或者是聊天记录来查找bug,更糟糕点儿的就是程序员根本不记得其它东西,印象里只有一点bug的文档。一旦这种情况发生,bug将必然充斥着整个代码编程,更加严重的是,想要识别出这些bug并确定它们的位置是很难的。

一个简单的文本文件在项目里可以作为最初的bug跟踪系统。随着代码库的不断增加,bug衍生出一个文本文件并不需要太长的时间。有很多商业和开源的bug跟踪软件提供的解决方案都是可以考虑的,选择哪一个bug跟踪软件首先要明确的部分就是要确保在编程项目里,那些非程序人员能够快速使用这个bug跟踪系统。

4. Linter

在某些编程语言里,Linter可以执行对代码的静态分析,以便在代码编写和运行之前识别出问题区域;在一些其它编程语言里,Linter工具对于语法检查和增强风格是很有帮助的。编程的时候在编辑器里打开一个Linter程序,或者是在代码编写和运行之前通过Linter传递代码,这些都有利于程序员在使用软件之前发现并纠正更多的错误。因此,使用Linter可以帮你在节省宝贵时间的同时揪出因语法错误、打字错误或数据类型错误而引起的bug源头。

想要知道什么样的Linter最适合你使用,看看Python的Linter工具:Pyflakes

5. 版本控制

任何一个重大的软件工程项目里都不应该忽略使用版本控制系统。举例而言,像GitMercurialSVN这类的版本控制允许不同的代码库版本在不同的基础上是可以分开的。

不同的控制版本可以被合并到一起,因此,多个程序员可以同一时间运行同一个代码库。版本控制在代码排错里同样有着举足轻重地位,可以让程序员回滚修改较早版本的代码,尽可能在错误出现之前,在代码库里对错误进行修复。

6. 模块化

缺少架构的代码是难以修复bug的主要源头。只要代码易于理解,而且理论上行得通,那么对于程序员来讲,找到并快速修复bug并不是什么棘手的事情。另一方面,越是重要的代码出现错误的几率就越大,找到这个错误相对也就比较困难。

设计软件的组件经常需要考虑一点就是所谓的代码模块化,代码模块化可以帮助程序员更好的用两种方法来理解软件系统。第一,模块化能够创造出一定层次的抽象感,在没有完全理解所有细节的情况下也能想象出系统的模型。比如,程序员正在构建一个商业系统,可能会考虑到信用卡处理模块,然后观察这个模块和其余代码有什么联系,根本不用考虑信用卡处理模块的所有详细内容。第二,模块的详细说明,这个详细说明是不会和别的模块内容混淆的,就像每个卡只有一个卡号是一样的。

7. 自动化测试

单元测试和其它类型的自动化测试跟模块化是有很大关联的,可以说是相辅相承。自动化测试就是一段代码用特殊的输入值来运行软件,以此来检测程序运行是否和预期的相符合。

单元测试主要是用来检测单个功能的功能性,然而功能测试是用来检查特殊的程序性能,并且结合单元测试来检查软件系统的整体部分。有很多测试框架可以用来编写测试程序,而且大部分受欢迎的测试框架都是由Kent Bent编写的JUnit类库衍生而来的,Kent Bent是“测试驱动开发方法”最早的支持者之一。 Python标准类库包括一个JUnit的Python版本,称之为PyUnit或者unittest的单元测试框架

8. 泰迪熊方法(橡皮鸭调试)



在软件编程界,就不得不提到传奇人物Brain Kernighan和Rob Pike,泰迪熊调试法源于一个大学计算机中心,在这里,学生们遇到神秘bug的时候就可以先把问题解释给这只摆在桌子上的泰迪熊听,然后才能向老师或助教求 助。所以,有的时候只跟熊聊天也能解决问题。这一调试方法真的很管用,以至于风靡了整个软件工程行业,就像打印语句这一方,不管那些复杂的工具如何风起云涌,输出语句这一方法仍然在今天很受欢迎。

同泰迪熊调试法相似的一种方法叫做橡皮鸭调试法,当你在向这只始终保持沉默的橡皮鸭子解释的过程中,你会发现你的想法、观点、思路和实际的代码相偏离了,于是你也就找到了代码中的bug。一旦一个问题被充分地描述了它的细节,那么解决方法也是显而易见的。你觉得这个方法太“愚蠢”,太“弱智”了?是的,看上去,会这样做的人脑子好像是有点毛病。不过,我要告诉你的是,这个方法的确有效。因为,这就是“Code Review”的雏形!

9. 编写代码注释



注释的功能就是在更易于理解的层次上解释代码的编写目的,尽可能多写一些:每行代码是干什么的,怎么去完成,这些问题都应该在通读代码之后很容易找到答案才行。另外,给各个功能和变量取合理的名称也有助于简化代码实施的过程。在代码行下面的空白处填写注释来回答为什么要使用特殊的实现功能,或者一段代码怎样和程序的其余部分互动等等。

编写详细的注释可以说是软件工程里一步可靠地检验步骤,即使是在没有bug的代码里也是同样受用。这样,就算bug出现了也不用担心,注释会帮你节省数小时的排错时间。

10. 编写文档

代码注释是程序员以简单的方式和个人的观点编写的,而编写软件文档是用来描述软件系统的功能性,同时用户也可以看到这些软件文档。根据软件类型的不同,文档可以用来详述程序界面、图形界面或者工作流程。

编写文档还有一个好处就是,可以展示你对软件系统的理解程度,指出软件系统不够完善的部分或者有可能是bug源头的部分。

Via Onextrapixel
  • 大小: 7.9 KB
  • 大小: 18.9 KB
  • 大小: 7.9 KB
  • 大小: 7.5 KB
来自: CSDN
2
1
评论 共 11 条 请登录后发表评论
11 楼 sswh 2013-08-20 08:29
引用
在输出语句里恰当使用记录系统


记录系统 一般叫 日志工具 吧。


引用
源代码调试器采用了输出语言方法里的逻辑推理


没看懂。 机器翻译的?
10 楼 kidneyball 2013-08-19 11:29
kidneyball 写道
freezingsky 写道
第9条有什么问题?


http://kidneyball.iteye.com/admin/blogs/1733705


Sorry, 贴错链接。 http://kidneyball.iteye.com/blog/1733705
9 楼 kidneyball 2013-08-19 11:18
freezingsky 写道
第9条有什么问题?


http://kidneyball.iteye.com/admin/blogs/1733705
8 楼 sunway00 2013-08-19 09:43
freezingsky 写道
第9条有什么问题?

应该是在代码规范的基础上,标准合理化的命名、合适的接口、类与方法组织。以上这些加上适当的注释。而不是“每行代码是干什么的,怎么去完成”。
7 楼 Changsmetoo 2013-08-17 13:20
6 楼 lvwenwen 2013-08-17 11:30
除了第九条,其它赞同。
5 楼 jmeditor 2013-08-17 08:18
泰迪熊方法(橡皮鸭调试)
这个虽然没听说过,但实际中确实是这样的。当我们向别人请求问题时,首先要描述一番,可能说到一半的时候自己就感觉有问题了。
4 楼 xul 2013-08-16 22:32
8. 泰迪熊方法(橡皮鸭调试)
第一次看到,感觉有点用。
3 楼 dsjt 2013-08-16 16:41
泰迪熊方法(橡皮鸭调试)
2 楼 freezingsky 2013-08-16 16:00
第9条有什么问题?
1 楼 Mybeautiful 2013-08-16 11:46
除了第九条,其它赞同。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 10个调试和排错的小建议

    在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目。可是,当数千行的代码写完之后,整个项目因为bug的出现而被压垮了,更别说添加什么新功能了...这也许是对...

  • 项目中10个调试和排错的建议

    在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目。可是,当数千行的代码写完之后,整个项目因为bug的出现而被压垮了,更别说添加什么新功能了...这也许是对...

  • PHP语言基础知识详解及常见功能应用.docx

    本文详细介绍了PHP的基本语法、变量类型、运算符号以及文件上传和发邮件功能的实现方法,适合初学者了解和掌握PHP的基础知识。

  • 公司金融课程期末考试题目

    公司金融整理的word文档

  • 适用于 Python 应用程序的 Prometheus 检测库.zip

    Prometheus Python客户端Prometheus的官方 Python 客户端。安装pip install prometheus-client这个包可以在PyPI上找到。文档文档可在https://prometheus.github.io/client_python上找到。链接发布发布页面显示项目的历史记录并充当变更日志。吡啶甲酸

  • DFC力控系统维护及使用

    DFC力控系统维护及使用

  • Spring Data的书籍项目,含多数据库相关内容.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

  • 2019-2023GESP,CSP,NOIP真题.zip

    2019-2023GESP,CSP,NOIP真题.zip

  • 基于 Gin + Element 实现的春联生成平台

    博文链接 https://blog.csdn.net/weixin_47560078/article/details/127712877?spm=1001.2014.3001.5502

  • zetero7实测可用插件

    包含: 1、jasminum茉莉花 2、zotero-style 3、greenfrog 4、zotero-reference 5、translate-for-zotero 用法参考:https://zhuanlan.zhihu.com/p/674602898

  • 简单的 WSN 动画制作器 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

  • 毕业设计&课设_仿知乎社区问答类 App 项目:吉林大学毕业设计,含代码、截图及相关说明.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

  • python技巧学习.zip

    python技巧学习.zip

  • 2023 年“泰迪杯”数据分析技能赛 A 题 档案数字化加工流程数据分析

    2023 年“泰迪杯”数据分析技能赛 A 题 档案数字化加工流程数据分析 完整代码

  • life-expectancy-table.json

    echarts 折线图数据源文件

  • 此扩展现在由 Microsoft fork 维护 .zip

    Visual Studio Code 的 Python 扩展Visual Studio Code 扩展对Python 语言提供了丰富的支持(针对所有积极支持的 Python 版本),为扩展提供了访问点,以无缝集成并提供对 IntelliSense(Pylance)、调试(Python 调试器)、格式化、linting、代码导航、重构、变量资源管理器、测试资源管理器等的支持!支持vscode.devPython 扩展在vscode.dev (包括github.dev )上运行时确实提供了一些支持。这包括编辑器中打开文件的部分 IntelliSense。已安装的扩展Python 扩展将默认自动安装以下扩展,以在 VS Code 中提供最佳的 Python 开发体验Pylance - 提供高性能 Python 语言支持Python 调试器- 使用 debugpy 提供无缝调试体验这些扩展是可选依赖项,这意味着如果无法安装,Python 扩展仍将保持完全功能。可以禁用或卸载这些扩展中的任何一个或全部,但会牺牲一些功能。通过市场安装的扩展受市场使用条款的约束。可

  • Centos6.x通过RPM包升级OpenSSH9.7最新版 升级有风险,前务必做好快照,以免升级后出现异常影响业务

    Centos6.x通过RPM包升级OpenSSH9.7最新版 升级有风险,前务必做好快照,以免升级后出现异常影响业务

  • 5 总体设计.pptx

    5 总体设计.pptx

  • 用于执行 RPA 的 Python 包.zip

    Python 版 RPAv1.50  • 使用案例•  API  参考 • 关于 和制作人员 • 试用云 •  PyCon 视频 •  Telegram 聊天 • 中文 •  हिन्दी  • 西班牙语 • 法语 •  বাংলা  •  Русский  • 葡萄牙语 • 印尼语 • 德语 • 更多..要为 RPA(机器人流程自动化)安装此 Python 包 -pip install rpa要在 Jupyter 笔记本、Python 脚本或交互式 shell 中使用它 -import rpa as r有关操作系统和可选可视化自动化模式的说明 -️‍ Windows -如果视觉自动化有故障,请尝试将显示缩放级别设置为推荐的 % 或 100% macOS -由于安全性更加严格,请手动安装 PHP并查看PhantomJS和Java 弹出窗口的解决方案 Linux -视觉自动化模式需要在 Linux 上进行特殊设置,请参阅如何安装 OpenCV 和 Tesseract Raspberry Pi - 使用此设置指南在 Raspberry Pies(低成本自

  • 原生js识别手机端或电脑端访问代码.zip

    原生js识别手机端或电脑端访问代码.zip

Global site tag (gtag.js) - Google Analytics