本文总结一下学习和工作以来思考了一些排错的思路和避免错误的思路积累在这里,希望对大家有帮助,也欢迎大家补充。

1、代码排错和中医理论很相似

发现写代码排查错误可以学学传统中医的诊断方法,

1.1传统中医诊断讲究:“望闻问切”。

望指对病人的神色形态等进行有目的的观察,以测知病变。中医大量实践认识到,病人的外在变现和内部病变有相关性。

其实排除也是一样,既然有bug,那么表现多半是异常的,我们先观察这种表现。

闻、问

闻:包括听声音和闻气味。

问:了解过往的病史,了解病因,发病的经过和治疗过程。

这有点类似于复现bug,了解触发bug的时机和过程。了解哪个步骤,哪个接口出了问题。

切指摸脉象来推测疾病。

类似于通过抓请求响应(浏览器f12或者抓包工具)根据请求参数和响应码判断问题出在前端还是后端。

通过错误日志等提供的信息综合分析。

1.2 中医是靠经验的

老中医厉害是因为见多识广,见到的病例多,趟过的坑多,这点和程序员很相似。

很多医生根据病状,就大概知道可能得原因。

优秀的经验丰富的程序员,遇到一些错误的表现,就大概知道问题出现在哪里。

因为他们遇到过类似的情况,思考过类似的情况,看过别人的案例等。

2、提供几个常用的排错方法

下介绍开发中常见的排错方法。

  • f12看请求和响应

请求参数是否正确,响应码是啥,用来锁定是前端还是后端错误。

比如404,基本断定前端请求地址写错了,比如500,多半是后端代码错误。

很多人只看表现,看前端报错了就认为是前端的问题,看控制台有报错就认为肯定是后端的错误。

注意要分析!不要猜测。看f12的network选项,分析参数的内容和格式是否符合预期等。

  • 看错误或者请求日志

很多bug可能是后端的逻辑错误和一些其他细节错误。

如果报错,直接看报错的信息,一般会有非常明确的原因。比如空指针,参数错误等。

尽量自己先去分析,而不是直接复制到百度或者谷歌上找方案一个一个试,否则就算解决了问题,印象不深刻,不知其所以然。

如果没有报错,可以查看从控制层到数据访问层的调用日志的输出和输出等判断哪一次调用出了问题。

比如服务层调用数据访问层时参数少传了一个,比如查询的数据封装VO时少了或者赋值错了字段等等。

是不是逻辑有问题?

  • 本地或者测试服远程debug

直接通过测试服远程debug,可以单步跟踪,很容易找到错误的原因。

debug的时候可以利用条件断点、watch机制、移除Frame实现“回退”等来辅助排错。

  • 控制变量法

这个思想非常好用。

如果是新开发的功能,通过删除部分怀疑引入错误的新增的代码来排错。

比如引入了3个二方jar,有冲突,可以去除某一个试试,好了就是这个jar的问题。

等等

注意最好是拉取新的git分支来操作,避免污染原有分支的代码,搞出Bug。

  • 换环境大法:比如换浏览器,把代码写到自己的demo项目中试试等。
  • 官方文档大法:如果是用法问题,配置问题,尽量查官方文档,看看这一块怎么用,是不是自己用错了。
  • code review法

重新对代码进行code review,查看逻辑是否正确,是否有线程安全问题,数据结构是否合理,是否有忽略的情况等。

  • 搜索引擎大法

不必多说,很多人都懂。

不过尽量用谷歌,Stack Overflow,而且尽可能用英文关键词来搜。

但是相对于学到的知识,解决的问题其实很值。现在人吃一顿饭都得十几块钱,买个工具不舍得。

  • 交流请教

实在自己解决不了,毫无思路,可以在群里请教或者和一些乐于分享和交流的人探讨。

因为有些问题虽然不难,但是自己很难发现。还有一些问题别人经历过,一句话可能省去你半小时。

请教别人之前,一定要把问题描述清楚。最好能说说自己的想法,自己做了哪些尝试和努力。

而不是“借钱的是大爷”的态度,觉得别人就该帮你,或者描述不清,让“大神”们猜测你遇到了什么问题。

另外尽量寻求思路,而不是具体的方案。

可以参考这篇文章《Java新手程序员提问和解决问题的正确姿势》https://blog.csdn.net/w605283073/article/details/90724457

大多数问题都可以通过f12大法、日志调试大法、搜索引擎大法解决。

另外排错要靠逻辑,而不是靠猜测,不是靠尝试。否则浪费时间,而且对知识掌握不深入,容易引发新的Bug等。

怀疑是某个原因,要去印证。

比如有一个条件的数据查不到,或者怀疑代码查询出的条数不对,拿前端的条件直接用sql查试试。

注意细节,是不是标记删除?是不是漏了某个条件等等。

不要猜测是某个原因就动手改,而是通过已有的代码和数据推断可能性,可能性很大再去试。

如果有其他好的方法欢迎补充

3、如何避免bug

以上的都是排错的方法,要保证质量应该在编码阶段。

1、 要考虑充分再编码,避免返工,避免逻辑错误

要充分进行参数校验,考虑各种可能出现的情况;

2、 要进行充分的单元测试

对于DAO层必须全部覆盖。对于上层代码可以采用Mock测试来验证逻辑,验证程序的健壮性,这里超级推荐Mockito。

3、要养成良好的编码风格

参考《阿里巴巴Java开发规范》、《重构》、《编写可维护代码的艺术》。

举个例子,一个函数好几百行,报了错误,如果很久之前的代码,而且逻辑不够清晰,还得看半天。

如果一个函数代码行数比较短,每个清晰的子步骤都封装到了子函数或者工具类中,那么排错起来就非常容易了。

4、开发过程中或自测前自我code review

在IDEA里,合并最新master之后,和master分支比对代码。

看看有没有逻辑错误,有没有手误,有没有可以改进的地方。

5、充分自测

除了上面的单元测试外,有时间要充分自测。功能的测试也要简单过一遍,尝试一些诡异的操作,看看是否有问题。

6、分享两个神器

编程过程中,对某个类的用法不熟悉,可以看看知名开源项目都怎么写。

(1)Codota

插件地址:https://plugins.jetbrains.com/plugin/7638-codota-

官网:https://www.codota.com/

智能代码提示

使用快捷键可以搜索知名开源项目中该类或者方法的使用案例,超赞。

(2)https://www.programcreek.com/java-api-examples/index.php?action=search

可以根据类名和方法等搜索代码案例

7、开发过程中遇到不熟悉的类或方法,建议直接进源码,看它的注释

建议在Idea里进入源码。

如果有条件可以去github拉源码,然后看想了解的类或者方法的配套单元测试。

就很容易知道怎么用,甚至可以运行起来看看效果,甚至可以打断点单步跟。

8、平时要加强学习,主动学习

平时加强学习,遇到问题知识储备充足才容易快速解决问题。

主要看专业图书,比较经典的技术图书,看一些核心技术栈的源码。

4、总结

本文主要讲述代码排错和避免错误的方法,希望大家写代码的同时注重方法的总结,这样才能更快速的提高编程能力。

另外一个有趣的现象,很多人用了spring很久,连spring的官方文档都没仔细看过一遍,MyBatis等其他核心技术栈的文档亦然。

只是看过一些入门视频,能用罢了,自己并没有系统看过文档,了解过原理读过源码。

还有很多人总是以忙为借口不去主动学习。

遇到各种坑,却从来不总结有哪些通用的解决思路。这些都非常值得深思。

有其他好的方法欢迎补充

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

--------------------------------------------

我在参见 CSDN 1024 程序员活动(2019年10月24日截止)

如果我的博客对你有帮助,且有时间,欢迎浏览器后者微信扫码,帮我点赞支持我:

代码排错和避免错误的正确姿势相关推荐

  1. 消除代码中的 if-else/switch-case的正确姿势

      在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的不好的会直接把实现的代码放在 if-else/sw ...

  2. 这样才是代码管理和 Commit 的正确姿势 | 研发效能提升36计

    简介:效能提升从小习惯开始,这样才是代码管理和 Commit 的正确姿势! 专栏策划|雅纯 志愿编辑|张晟 软件交付是以代码为中心的交付过程,其中代码的作用有几点:第一,最终的制品要交付成什么样,需要 ...

  3. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  4. 正确姿势避坑 Python 中的6个典型错误

    点击关注我哦 一篇文章带你使用正确姿势避坑 Python 中的6个典型错误 Python是一种高级的动态脚本语言.它易于使用的特性使得它非常流行,并且在最近几年得到了扩展.易用性也从易滥用开始.我们列 ...

  5. 使用代码片段的正确姿势,打造高效的vscode开发环境

    全文3928字,阅读时间 10分钟,未来节约时间 15分钟/每天 代码片段(code snippet) 相信大家都或多或少有接触过. 在完成一个项目以后,往往都会写出许多有价值的代码,或是绞尽脑汁解决 ...

  6. 开发方向校招准备的正确姿势,机会留给有准备的人

    一.背景 马上就快到校招的时间了. 网上有很多分享面经的地方,也有一些博文分享作者的面试经历,尤其是大公司的面试经历. 大多数是分享具体的问题,而没有系统的总结出方法论.导致大家只不过是在刷题!仅此而 ...

  7. io在Linux,在Linux进行IO的正确姿势

    原标题:在Linux进行IO的正确姿势 很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, ...

  8. android javamail获取邮件太多太慢_结合 Spring 发送邮件的4种正确姿势,你知道几种?...

    Java程序猿阿谷:面试字节跳动三轮凉凉,内推4面终拿下抖音offer(Java后台研发)​zhuanlan.zhihu.com 一.前言 测试所使用的环境 测试使用的环境是企业主流的SSM 框架即 ...

  9. 【分布式缓存系列】Redis实现分布式锁的正确姿势

    一.前言 在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架--Redis.但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识.所以我就像把自己对分布式缓 ...

最新文章

  1. dw8与mysql的连接,VS2019连接mysql8.0数据库的教程图文详解
  2. apache优化管理
  3. 互联网数据中心安全管理方案
  4. java 面试for循环_一个基础的for循环面试题
  5. AI评委引热议,阿里巴巴表示:AI不会取代工程师
  6. 那天删库跑路后,在牢里写的MySQL数据恢复大法……
  7. IS-IS hello 包结构及邻接关系的建立
  8. Python获取列表中字符串最长位置处的索引值
  9. 微信小程序之摇骰子源代码分享
  10. 网络编程 upd 发送接收数据
  11. 搭建自己的框架WedeNet(一)
  12. Blender建模基础(二):建模篇
  13. 映目云摄影以人脸识别惊艳Party现场,比亚迪元EV周年庆生
  14. NLP工具——NLTK 安装及使用
  15. 什么是MTTF,MTBF?
  16. 康奈尔大学计算机硕士要求,康奈尔大学计算机硕士
  17. u盘文件删去了怎么样找得回来
  18. 分布式网络爬虫框架Cola介绍
  19. 深度学习方面的论文整理
  20. JESD204B 参数理解

热门文章

  1. php解码 u7f3a u5c11,认识 Linux
  2. 如何在抖音官网链接中一键复制微信号跳转微信
  3. 《从零开始:机器学习的数学原理和算法实践》chap1
  4. 移动边缘计算(MEC)促进5G发展的分析
  5. Visual Studio安装与使用教程
  6. Python爬虫-数据类型高级
  7. 人在年轻的时候,最核心的能力是什么?
  8. Android开发5年,面试问到底层实现原理,被怼得,程序员中年危机
  9. 【Premiere】入门自学 1
  10. POJ 1837 Balance dp