1. 首先写代码的时候最好不要有缺陷。最好的修复方法就是让 bug 胎死腹中。

  • 良好的单元测试
  • 强制数据库约束
  • 使用输入验证框架
  • 避免未实现的“else”条件
  • 在应用到主程序之前知道如何在孤立的情况下使用

日志

2. print 语句。往往额外输出个一两行将有助于隔离问题。

3. 切换至详细的日志记录。详细的日志记录有助于发现更多的线索。

4. 搜索日志。如果日志太多,可采取关键字或错误代码来搜索日志文件。

5. 开启自动换行和关闭自动换行。控制日志的自动换行也非常有用。

6. 搜索不同的日志。主服务器的日志可能并不是唯一有用的日志。

7. Windows 事件日志。日志文件的另一个来源可能是操作系统本身。

8. 制作有用的日志记录。有时,如果你没有得到任何有用的日志记录,那么你可能需要自己写。

与其他人交流

9. 询问一些可能知道问题答案的人。

10. 问”愚蠢“的问题。可能你觉得这些问题很愚蠢,但其实并不是。

11. 将问题解释给队友。他们可能知道答案或者能提出一些你并没有想到过的事情。

12. 将问题解释给你的狗。述说的对象是谁其实没有关系,但是能让你从不同角度分析问题。

写作

13. 描述问题。用最准确和最精确的语句描述问题,有助于你去思考可能的解决方案。

14. 问题日记。创建一个文本文件来记录已经尝试的各种方法,包括代码片段、配置设置以及产生的任何错误。

15. 记录问题和解决方案。有没有这样的情况,突然看到一个似曾相识的问题,只记得解决过但却忘记了是如何解决的?可以将问题和解决方案记录到一个容易搜索的地方,如维基、缺陷跟踪,甚至可以发送电子邮件给自己。

支持

16. 阅读 FAQ。

17. 提交支持请求。如果有可用的产品/库的支持,那么就用。

18. 在你点击 send 之前,请三思。写支持请求能让你再一次思考问题,有时候就在你点击 send 按钮之时,突然灵机一动就想到了解决问题的方法或者是新的线索。

19. 其他方面的支持。可以与开发人员直接面对面交流,最好是实时聊天/ SKYPE/屏幕共享。

离开键盘

20. 散散步。

21. 打个盹。

22. 重置优先级。暂时从键盘上离开还有一个好处就是可以让你重新评估这个问题的重要性,也许这个问题只是个 CSS/布局问题,根本不值得你花上 16 个小时。总之要有效分配和使用时间。

23. 暂时将这个问题放在一边。实在解决不了的话,可以将这个问题先搁置起来。也许几天后你在阅读相关问题的时候,突然一个激灵,解决问题的关键就来了。

隔离

24. 确定是哪行代码。首先要确定是哪行代码导致的问题,以便于插入 print 语句。

25. 将问题分割为一个单独的程序。有时候对于库和产品的问题,我们可以将它的相关代码从主程序中分离开来。这可能需要一点时间,但往往处理一个孤立的程序比应对整个的项目构建过程要容易得多。然后在解决这个单独程序的基础上再去和主程序作比较。

更改代码

即使你一点都不知道如何解决问题,更改代码也是一个挺有效的解决方法。

26. 写新的单元测试。

27. 重构。有问题的代码往往显得有点乱,通过一些简单的重构方法,例如重命名变量或展开嵌套的 if / then/ else 模块等都可以让代码整洁起来。

28. 发现 bug。另一个整洁代码的手段是查阅相关代码的“Find Bugs” 报告,我们之所以首先要整洁代码是因为:作为一个能让我们的大脑专注于代码的方法,既简单又划算。

29. 重写。转存所有的相关代码,从头开始重写。一个全新的视角也许能让你完全规避这个问题。

30. 为一些不必要的代码添加注释——或者至少是你以为是不必要的。然后你会发现可能这些代码流并不像你曾经以为的那样“没有必要”。

31. 实验。如果你不能确定底层产品或库是如何工作的,那么一些小实验,特别是围绕边界条件的实验会非常有用。

32. 回到干净的状态。如果你在代码中做了各种变动,或者是搞了很多配置设置,那么定期回到一个干净的状态就非常重要。否则,实验结果可能会影响正确答案,这样你就永远也找不到正确的解决方案了。

33. 切换技术。

产品

34. 升级到更高的版本。也许你正在处理的问题已经被修复了,可以试试先升级到另一个版本。

35. 降级到以前的版本。也许问题正是由于与你目前正在使用的其他产品/库不兼容而引起的。

36. 打补丁。

37. 下载并安装源代码。

文件

38. 阅读手册。大多数开发人员可能会认为这是一个低概率的策略,但是,嘿嘿,你永远不知道,也许答案就在文档中。

39. 阅读手册的正确版本。

40. 手册是否正确?有时候代码已被更新,但手册还没有。

调试器

41. 了解键盘上的快捷键。

42. 倒退。这是调试器的一个功能,让你的代码退后一步。

43. 编写断点代码。

44. 异常中断。调试器的一个蛮有用的功能就是可以捕捉到任何地方的特定异常。

45. 专业化的调试工具。例如:

  • Plumbr
  • AppDynamics
  • Chronon
  • Wireshark
  • HTTP profilers:Fiddler2、Charles、Live Http Headers

源代码控制

46. 对 bug 缺陷进行编号标记。你有没有碰到过这样的问题:先是用这种方式被修复了,然后几周后又成为了 bug 被其他人用另一种方法修复了。这样问题貌似就有两个正确答案。解决办法就是对源代码中相关的
bug 缺陷进行标记,并记录一些关于为何改变以及谁参与决策等更为详细的说明。

47. Blame 功能。这个可爱的小工具能告诉你是谁最后更改的代码。

48. Git bisect 功能。Git 有一个有意思的“bisect”命令,能自动通过你提交的历史进行二进制搜索发现故障。

寻找答案

49. 谷歌搜索。

50. 论坛帖子。

52. 搜索堆栈交流。

53. 创建堆栈问题。

其他

54. 聘请专家。可能在短时间内成本很高。

55. 招实习生。聘请专家的相反方法就是聘请新手。有时候初学者饱满的热情能让他们从不同的角度来解决问题。

56. 改变要求。如果你不能修复缺陷,那么可以改变要求。通过解释各种成本需要,也许能让客户改变他们的初衷。

57. 更改上/下游系统。

58. 循序渐进地学习技术。

59. 通过断点检查配置。更改关键配置值,并确保已经断点,这样能够让我们无所顾忌地设置配置。

60. 系统化。有时候我们需要将三四件事情组合在一起,那么可以将已经试过的组合记录下来,如果需要的话一定要尝试各种的组合。

Java基础学习总结(61)——Java项目开发要注意的60个问题的更多相关文章

  1. Java基础学习总结(70)——开发Java项目常用的工具汇总

    要想全面了解java开发工具,我们首先需要先了解一下java程序的开发过程,通过这个过程我们能够了解到java开发都需要用到那些工具. 首先我们先了解完整项目开发过程,如图所示: 从上图中我们能看到一 ...

  2. Java基础学习笔记一 Java介绍

    java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...

  3. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  4. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  5. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  6. JAVA基础学习——1.0 Java概述

    Java语言 SUN公司  1995年推出的高级编程语言 ■  主要应用方向 Web开发和Android开发 ■  主要特点 平台无关性:能运行于不同的平台上    安全性:去掉了指针操作,内存由操作 ...

  7. Java基础学习总结(50)——Java事务处理总结

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  8. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

  9. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  10. Java基础学习笔记四 Java基础语法

    数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...

随机推荐

  1. js导出table中的EXCEL总结

    导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...

  2. org.openqa.selenium.NoSuchElementException:

    http://www.blogjava.net/qileilove/archive/2014/12/11/421309.html selenium webdriver定位不到元素的五种原因及解决办法 ...

  3. php创建简单的列表页

    php创建简单的列表页 样例 代码 <?php $userInfo[] = array( 'id'=>'1', 'username'=>'fry', 'sex'=>'nan', ...

  4. P1025小飞侠的游园方案

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:……(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  5. 【概率证明】—— sum and product rules of probability

    1. sum and product rules of probability ⎧⎩⎨p(x)=∫p(x,y)dyp(x,y)=p(x|y)p(y) sum rule of probability 的 ...

  6. [SCOI 2010] 股票交易

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1855 [算法] 单调队列优化动态规划 [代码] #include<bits/s ...

  7. ASP.NET MVC上传文件 未显示页面,因为请求实体过大。解方案

    在Dropzone中设置   maxFilesize: 350, //MB 但上传的文件没有到最大限定350MB,就报出来 未显示页面,因为请求实体过大的错误 Web.config中设置  maxAl ...

  8. 用 Swift 开发一个 TODO 应用

    背景 相信不少 iOS 程序员对于 Swift 依旧持以观望的态度,一来是这小家伙刚出来没几天,本身还处于完善的阶段:二来是学习的成本较高,看完官方文档怎么也要个几天的时间:三来是反正最近几年很难在工 ...

  9. ComboxBox控件、checklistbox控件和listbox控件的组合开发

    第一步:先创建一个WinForm窗体应用程序,按照下图所示的进行布局. 第二步:为ComboxBox控件.checklistbox控件和listbox控件和button控件设置属性 第三步:在代码中的 ...

  10. 第5章分布式系统模式 Broker(代理程序)

    许多复杂的软件系统运行在多个处理器或分布式计算机上.将软件分布在多台计算机上的原因有多种,例如: 分布式系统可以利用多个 CPU 或一群低成本计算机的计算能力. 某个软件可能仅在特定计算机上可用. 出 ...