程序员解决问题的60个策略(转)

2023-11-20

 英文原文:60 Problem Solving Strategies

  程序员的生活就是解决一个又一个问题,永无止境。这篇文章介绍了一系列解决问题的策略。

  根本的指导方针

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

  译文链接:http://www.geekwww.com/60-problem-solving-strategies.html

http://news.cnblogs.com/n/514351/

 

转载于:https://www.cnblogs.com/softidea/p/4267584.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员解决问题的60个策略(转) 的相关文章

  • 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版 最棒的 Vue 移动端 UI 组件库 特别针对国内使用场景推荐 Vue 移动端 UI 组件库推荐 Vant 3 有赞移动 UI 组件库 支持 Vue 3 微信小程序 支付宝小程序 Cube UI 滴滴出行移动端 UI 库 质量可
  • 关于直流电源纹波和噪声的测量的分析和介绍

    电源纹波和噪声的定义PARD periodicand random deviation 1 电源纹波 Power Ripple 直流电压 电流中 叠加在直流稳定量上的交流分量 用电压和电流的均方根值 mVrms mArms 或峰峰值 mVp
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • 【word】错误!文档中没有指定样式的文字。 1

    问题 给文档中的图片插入题注时 报错 错误 文档中没有指定样式的文字 1 解决办法 光标定位到错误信息上 单击右键 选择 编辑域 在弹出的 域 对话框中 左侧的 域名 列表中选择 StyleRef 在右侧的 样式名 列表中选择 列表段落
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • DHCP配置实战

    1 DHCP简介 DHCP dynamic host configuration protocol 动态的主机配置协议 基于TCP P的网络 DHCP减少了重新配置计算机IP地址的工作量 在TCP P网络中 IP地址的规划与分配是一件重要而
  • Java手写广度优先搜索和案例拓展

    Java手写广度优先搜索和案例拓展 手写必要性 手写实现广度优先搜索算法主要有以下几个必要性 理解算法原理 通过手写实现广度优先搜索算法 能够深入理解算法的原理和运行机制 这有助于我们更好地理解广度优先搜索的核心思想和优势 并能应用于解决其
  • pa皮安级电流检测电路

    1 芯片 ad8602 lmc6062 2 电路
  • Eclipse中targetlm2e-wtplweb-resources\META-1(Click for details)解决办法

    targetlm2e wtplweb resources META 1 Click for details 系统找不到指定的路径 解决办法 最近总是发现我的eclipse里面的maven项目总是报错误时不时地出现 然后我自己更新一下mave
  • Qt学习(三)—— lambda表达式

    lambda表达式 lambda 表达式是 C 11 新增的新特性 用于定义并创建匿名的函数对象 在 Qt 中配合信号一起使用 使用lambda表达式的好处在于不用定义槽函数 也不用指定信号接收者 为了使用 lambda 表达式 需要在项目
  • Flutter - okToast封装

    demo 地址 https github com iotjin jh flutter demo 使用版本 加载框 https pub flutter io cn packages oktoast readme tab oktoast 2 3
  • 【70】爬楼梯问题求解

    题目描述 思路分析 当阶数为 1 时 解法为 1 当阶数为 2 时 解法为 2 当阶数为 3 时 解法为 3 当阶数为 4 时 解法为 5 很明显可以分析出 一下公式 代码实现 递归法 class Solution public int c
  • MATLAB实现遗传算法求解n维变量函数的最小值问题

    一 问题简述 本文以遗传算法求解30维变量函数的最小值问题举例 式中 且 二 遗传算法概述 遗传算法 genetic algorithm GA 是一种仿效生物界中 物竞天择 适者生存 演化法则的进化算法 将问题参数编码为染色体 利用迭代的方
  • cv2.minAreaRect()

    功能 求出在点集下的最小面积矩形 输入 格式 points array shape n 1 2 解释 其中points是点集 数据类型为ndarray array x1 y1 x2 y2 xn yn 输出 格式 rect tuple x y
  • Centos7 安装 postgreSQL

    谷明科技 专注于大数据和人工智能领域的创新者 PostgreSQL 介绍 PostgreSQL 是一个开源且强大的关系型数据库 且具有多平台扩展能力 不同于传统的关系型数据库 例如mysql sqlserver等 PostgreSQL使用S
  • this调用本类的其他构造器

    Student类 package Java project 1 public class Student private String name private String schoolName public Student public
  • javascript的函数中this指向判断

    前言 最近在写 React 项目 然后补习了下 es6 的 class 发现 实例方法被赋值后 this 指向 undefined 这里对 this 指向作一次总结 一 通过 函数的 调用方式 来判断 this 指向 1 函数名 通过 函数
  • Zero-ETL、大模型和数据工程的未来

    编者按 本文探讨了数据工程领域的未来趋势和挑战 以及其不断变化 甚至经常出现 重塑 的特点 在数据工程领域 大数据的性能 容量提升总是有一定的上限 每一次进步都会带来一定的技术提升 从而提高上限 但是很快我们就能到达这个上限 直到下一次技术
  • 【Bugfix】flutter GetX 使用 Obx 监听 GetxController 时,页面退出 GetxController 无法销毁

    背景 我的页面数据全来自 GetxController 每次进入时需要重置数据 但 GetX 似乎把 GetxController 保留了 下次在进入页面直接复用了之前的数据 导致数据混乱 尝试 一下调用均不能销毁 GetxControll

随机推荐

  • 设置windos电脑开机自动启动chrome浏览器,并且打开指定网页

    需求 web项目设置windos电脑开机自动启动chrome浏览器 打开指定网页地址 并设置为全屏显示 解决 使用windos的bat脚本 设置为开机自启动 代码如下 echo off cd d dp0 title Chrome taskl
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • VRRP和DHCP配置

    1 VRRP术语 2 VRRP工作过程 3 DHCP的优势 4 DHCP的工作原理 1 VRRP术语 VRRP 也即虚拟路由器冗余协议 利用VRRP 一组路由器 同一个LAN中的接口 协同工作 但只有一个处于Master状态 处于该状态的路
  • 7-3 删除字符 (30 分)

    这位更是重量级 输入一个字符串 str 再输入要删除字符 c 大小写不区分 将字符串 str 中出现的所有字符 c 删除 提示 去掉两端的空格 输入格式 在第一行中输入一行字符 在第二行输入待删除的字符 输出格式 在一行中输出删除后的字符串
  • java中String作为参数传递终极解决

    今天我遇到一个问题就是string的传值问题 它虽然是一个引用数据类型 但是却和基本数据类型一样无法被改变 我看到网上的很多解释都很离谱 比如说很多解释说String要看成和Integer一样的包装类 看成 是char 的包装类 所以和其一
  • 快速开始一个 CakePHP project 的 基础/步骤

    请参考 CakePhP cookbook4 0 好的这就是本文和全部与核心 你可以跳出去了 好 正经一点 回来 1 下载xampp php集成环境 2 下载cakephp 框架 查看cookbook中的installation a 若用的x
  • 引进包类

    使用Support Library 支持库 Using the Support Library 负责人 River 完成时间 7月18日 原文链接 http developer android com training basics fra
  • (六)Spring Cloud Alibaba Sentinel(含案例源码、案例解析及软件)

    案例源码gitee地址 https gitee com BanSheng spring cloud alibaba examples tree master sentinel example client Spring Cloud Alib
  • 人工智能技术应用中机器学习里的6种偏差

    在人工智能的学习过程中 偏差会以多种不同的形式出现在机器学习中 Bias的定义 Bias 对某人或某一群体的倾向或偏见 尤指被认为不公平的方式 Bias被解释为偏差也可解释为偏见 其定义包括 不公平 一词 偏差几乎可以在每个阶段影响机器学习
  • msm8953-配置I2C 速率

    前言 本文记录调试高通平台某I2C 器件通讯出现异常 尝试修改I2C 时钟速率时所做的记录 平台 MSM8953 系统 Android 9 0 分类 I2C CLK 结论 先说结论 经过分析以及验证 平台支持的I2C特性如下 默认速度 10
  • eclipse json转为java类

    1 安装GsonFormat插件 插件地址 https github com wenxunyu GsonFormat 安装步骤在上面的地址中有 2 注意 直接放在dropins根目录下 不要放在子文件夹下 否则报错 不能正常使用插件
  • Java知识大全 - 五、Java高级编程

    1 异常和错误处理 在 Java 中 异常用于处理程序执行期间可能发生的错误和其他异常情况 异常允许开发人员以结构化和一致的方式处理错误 从而使代码更加健壮和可靠 发生错误时 Java 会创建一个异常对象 其中包含有关错误的信息 例如错误的
  • linux入门系列19--数据库管理系统(DBMS)之MariaDB

    前面讲完Linux下一系列服务的配置和使用之后 本文简单介绍一款数据库管理系统 MySQL的兄弟 MariaDB 如果你有MySQL或其他数据的使用经验 MariaDB使用起来将非常轻松 本文讲解Centos7默认的数据MariaDB 由于
  • Centos下使用Clion,nginx的CMakeLists.txt,分3步配置。

    nginx的配置 configure with http ssl module with http v2 module Clion下的CMakeLists txt 1 将Nginx的代码全部加入CMakeLists txt cmake mi
  • 在silverlight中定制自己的MessageBox(消息框)

    在silverlight中 如果想使用 消息框 可使用下面的方法 即 HtmlPage Window Alert 消息框内容 如果想要显示更加复杂的内容或定义消息框样式的话 基本上没有什么好的方法 最近在网上看到了一篇文章 该文章的作者也谈
  • Oracle增删改以及事务

    select from dept 部门表 select from emp 员工表 create table newEmp as select from emp where 1 2 插入数据 1 to date 值 格式 函数 insert
  • C/C++内存泄漏与检测

    该死系统存在内存泄漏问题 项目中由于各方面因素 总是有人抱怨存在内存泄漏 系统长时间运行之后 可用内存越来越少 甚至导致了某些服务失败 内存泄漏是最难发现的常见错误之一 因为除非用完内存或调用malloc失败 否则都不会导致任何问题 实际上
  • 如何求自己数据的均值

    博主的技术交流群 722058911 问题背景 在分类网络中 往往需要突出前景 弱化背景 往往有一个操作是减去均值 解决办法 供参考 我是这么解决的 求自己数据集的均值和方差 def compute mean std your datase
  • c语言中atoi函数用法以及功能

    atoi函数是无意中看别人代码发现的我才疏学浅所以整理了一些关于atoi的知识点 atoi的头文件 include
  • 程序员解决问题的60个策略(转)

    英文原文 60 Problem Solving Strategies 程序员的生活就是解决一个又一个问题 永无止境 这篇文章介绍了一系列解决问题的策略 根本的指导方针 1 首先写代码的时候最好不要有缺陷 最好的修复方法就是让 bug 胎死腹