写点什么

有哪些新手程序员不知道的小技巧?

作者:Jackpop
  • 2022 年 6 月 21 日
  • 本文字数:4455 字

    阅读完需:约 15 分钟

hello,大家好,我是 Jackpop,硕士毕业于哈尔滨工业大学,曾在华为、阿里等大厂工作,如果你对升学、就业、技术提升等有疑惑,不妨交个朋友:


我是Jackpop,我们交个朋友吧!


无论你是初学者,还是软件开发领域的专家,都无法避免代码中出现错误。


我们所有人开发的代码中都有错误,因为,没有人能够彻底的了解编码过程中发生的一切。


因此,在项目开发过程中需要耗费时间,在 Debug 过程中同样需要耗费大量的精力。


我们只能研究我们自己,研究我们的工具,研究我们的 bug,找到解决方案,帮助我们更高效的减少开发过程中出现的 bug。


如何处理 bug,我认为主要可以分为 3 个阶段:


  • 预调试:在开发过程中尽量避免 bug 出现

  • 调试:发现 bug、识别 bug、修复 bug、移除 bug

  • 调试后:预估未知、未出现的 bug


下面,我们来详细介绍每个阶段。

预调试

就像计算机科学家 Edsger W. Dijkstra 所说的那样:


"如果说调试是消除错误的过程,那么编程一定是引入错误的过程。"


如果我们通过编程给程序引入 bug,那就意味着我们需要引导自己减少引入 bug 的数量。我把这个引导自己的过程称为 "预调试"(Prebugging)。


我在 Google 上搜索 "Debug"的定义,从牛津词典上看到的定义引起了我的思考。


“Debug 从计算机硬件或软件中识别和消除错误的过程。”


这个定义引起了我的思考,因为我相信很多软件开发人员都是主动进行调试的。他们改进他们的工具和自己,以减少他们产生的 bug 数量。


我们可以通过一些方法来做到这一点。


  • 编写程序规范

  • 了解你经常使用的工具

  • 学会准确打字

  • 熟悉错误信息及其可能的解决方案

  • 始终确保你对你使用的大多数工具都有稳定的设置


虽然这个定义对于调试来说是可以接受的,但是它淡化了软件开发人员为减少 bug 产生而做的其他每一件事。 所以我们现在就来看看这些事情。

了解你经常使用的工具

了解你经常使用的所有工具是很重要的,因为这有助于你减少编码时产生的 bug。


没有办法完全避免 bug 的产生,但是如果你对你所使用的工具的基础知识非常健全的话,你可以避免产生一些 bug。


例如,很多 JavaScript 用户记不住什么是返回。而有些人记不住和数组方法的区别。


如果你不是 JavaScript 用户,只需从你使用的语言中挑选一个内置的方法或函数,然后问自己:


这个方法需要什么样的参数?这个方法会返回什么?如果提供了一个无效的参数会发生什么?


经常问自己上述问题,可以让你学习到很多知识。


这就是如何让自己保持对经常使用的工具的基础知识的更新,尤其是在你没有太多时间主动阅读的情况下。

编码前的计划

编程似乎是一个反复尝试的工作,你需要不断尝试,直到正确为止。


许多初级软件开发人员并没有真正理解他们正在开发的程序,其中一些人在上网搜索报错信息之前,其实并没有尝试去理解错误信息。


现在,每个人似乎都觉得编程始终与“代码,代码,代码,搜索,调试”有关。 ‌‌


但是有必要真正了解你在做什么,以便你可以快速列出:


  • 我们期望将什么作为输入以及这些输入的结构和特征

  • 我们期望如何处理这些输入

  • 我们最终期望返回的是什么

  • 如果没有给出预期的输入,需要做些什么


简而言之,对函数或程序的输入,过程和输出进行规划不仅可以帮助你减少错误,还可以帮助你编写有效的测试用例。

熟悉常见的错误信息

如果你已经熟悉了一个错误或 bug,往往很容易修复。


所以,花时间研究一些常见的错误,并学习如何去修复这些错误是很重要的。现在我们就来谈谈一些常见的错误。


  1. 语法错误


每一种编程语言都有自己的规则,开发者要对违反这些规则的行为负责。


编程语言对规则的要求很严格,只要违反了这些规则,它们就会抛出错误。


例如,想象一下,你省略了一个函数或方法的括号:


function {}
复制代码


会抛出一个错误。


熟悉语法错误的错误信息,以及如何修复它,会让你在调试时更有优势。


我个人注意到,大多数语法错误总会提到一些关键词,帮助你找出代码中出错的部分。


let school = { name: "Harvard", location: "Heaven On Earth", admit: function() { return "weeew! You are admitted" } } console.log(school.names); // undefined
复制代码


返回的 "undefined"告诉我们,我们要访问的对象或属性是不可用的。如果我们敏锐地注意错误信息,就能找出问题所在。


你写的代码越多,你就越能够避免语法错误。你也可以简单地使用代码编辑器、静态检查工具,能够高亮突出语法错误。使用这些工具可以给你带来很大的帮助。


  1. 逻辑/语义错误


逻辑错误是非常棘手的问题,因为它们看山去是没有错误的--但你仍然没有得到预期的结果。


例如,确认这种错误的一个简单方法是在浏览器的控制台中检查下面的代码。


prompt("enter number") + 3;
复制代码


你可能希望输出一个数字,但它会返回一个字符串。


简而言之,你将不会得到预期的结果。


在编码前进行规划,了解你所使用的编程语言的基础知识,可以帮助你处理逻辑错误--前提是你要理解给你的程序要求。


  1. 编译错误


你的程序可能无法编译,因为你可能违反了编译器希望你遵守的一些规则。


所以,你正在编写的程序可能无法编译。


例如,写一个字符串时没有使用通常的引号,会导致编译错误,因为字符串必须使用引号。所以,代码将无法编译。


const name = Ayobami
复制代码


这与语法错误类似,你写的代码越多,你就越能更好地处理编译错误。


你可以通过经常编译或测试你的代码来提高工作效率,减少这些错误。


  1. 资源错误


有时,你的程序可能会超过其内存限制或用尽可用资源。


这可能会导致你的应用程序停止服务或出现故障。


下面的代码是一个导致资源错误的代码的实际例子。


function factorial(num) {  var result = 1;  for(var i = num; i > 0; i--){    result = num * factorial(num-1);  }  return result;}factorial(5);factorial(10);factorial(20);factorial(0);
复制代码


由于堆栈空间(即浏览器分配给函数调用链的内存)被用完,函数崩溃或使浏览器变慢。


在这种情况下,该错误是资源错误,因为它是由于用完分配的内存(资源)而发生的。


  1. 接口错误


有时候,我们设计的程序 API 是按照一定的方式来使用的,但是用户使用程序的方式不同,就会造成错误。


这种错误被称为接口错误。


例如,假设方法期望的是一个字符串,但我们却用一个数字来代替调用它。如果程序的开发者没有考虑到这种情况,就会导致错误。


软件中的大多数事物都遵循标准。如果你所定义的标准没有被遵循,你需要为你的用户提供错误信息或指南,以帮助他们弄清楚他们正在错误地使用应用程序。


在这种情况下,记录你的 API 可以提供很多帮助。

确保你的设置与工具相互匹配

有一个适合你的工具的设置是很重要的。


有时,你的操作系统可能与你的应用程序不兼容--也许是因为它需要一个较新版本的操作系统,或者它需要某个软件。


例如,如果电脑上缺少一些微软的 VC 运行时,WampServer 可能无法在 Windows 操作系统上正常运行。


类似的事情也可能发生在 Linux 和 macOS 上。


你只需要确定你的设置是适合你的开发工作的。

对你的程序的功能要有确定性

"在数学、计算机科学和物理学中,确定性系统是指在系统未来状态的发展中不涉及随机性的系统。 因此,一个确定性模型将始终从一个给定的起始条件或初始状态产生相同的输出"。


那么,问题是,我们如何做一个确定性的程序?


你必须确定你的程序中可以接受的数据类型,拒绝任何不符合的数据。


简而言之,你需要接受预期的数据,拒绝不符合预期的数据,或者将预期的数据通知用户。

不懂就不要用

减少 bug 产生的最好方法之一是只使用你了解的方法、方法和类。


如果你必须使用任何你不理解的方法或样式,在做之前先研究一下,确定对它有深入的理解。


每当你利用你不了解的东西时,很容易给你的应用程序引入不必要的 bug。

学会准确打字

打字准确被低估了,因为编程更多的是思考而不是打字。但在打字时准确无误可能会帮助你减少一些语法错误、类型错误或错别字。


许多编程错误都是由简单的打字错误引起的。


准确打字的能力能够减少开发过程中的 bug。

边调试边观察其他开发者

另一个有趣的提高调试技能的方法是,当其他开发者进行调试时,观察他们,这有助于看到不同的调试方法。


总会有一些我们不知道或不曾使用的工具或方法来进行调试,观察别人的调试让我们有机会发现那些我们可能不知道的工具或方法。


或者即使你知道那些不同的方法,你也可能不知道为什么或如何使用它们。


观察别人可以影响我们重新审视这些方法和工具,最终可能提高我们的调试技能。

调试

调试是编程的核心,因为它在编码时占用的时间最多。


调试主要涉及三个阶段:


  • 发现错误

  • 分析并理解错误发生的原因

  • 修复或移除 bug

发现错误

发现 bug 首先需要了解你看到的错误信息。


毋庸置疑,错误信息就是一个 bug 的指南。


如果你理解了错误信息,你就可以精确地追踪到错误的位置。


但是有些错误可能会很繁琐,因为它们可能没有明确的错误信息和未知。


就像前面所说,逻辑/语义错误只是得不到我们想要的结果。


为了找到 bug,你需要:


  • 明确你的期望

  • 检查你得到的结果

  • 比较你的期望值和实际结果,看看差异

  • 你可以使用调试器或其他有用的工具来快速找到这些错误


然后,你可以根据你的假设检查代码的不同部分,并执行试错来找到错误。

分析并理解错误发生的原因

找到一个 bug 之后,你需要弄清楚为什么代码会有这样的错误。


这样做可以帮助你建立一个高效的系统。


相反,许多开发人员只会在谷歌上搜索,并直接从 StackOverflow 得到的答案。


这在某些情况下是没有问题的,但最好是了解 bug 的原因和为什么解决方案有效。


理解 bug 的原因是修复 bug 或删除 bug 道路上的重要一步。

修复或移除 bug

在找到并了解了 bug 的原因后,我们就要修复这个 bug。


有的时候,当你了解了 bug 是什么之后,你就会毫无压力的找到解决方案。


但是,有的时候,我们的理解无论怎么努力,都找不到任何解决方案。


与其浪费时间,不如在谷歌上搜索错误信息或任何你觉得合适的信息。


你也可以问另一个人,因为其他人往往会有不同的看法。他们是中立的,这种中立性确实有助于修复一些 bug。


所以,谷歌一下吧!


修复一个令人困扰的 bug 总是会带来巨大的兴奋。


但不要太过沉浸在兴奋中,因为修复一个 bug 可能会引起另一个 bug。


所以,首先要确保你没有给程序引入另一个问题。


这就是为什么自动化测试很重要。

调试后

调试后需要在你已经写好的程序中预测有可能出现的 bug。


它指的是你可能使用的所有机制,以确保未知的 bug 在危害系统或公司之前能够很容易被追踪或管理。


现在的问题是你如何做到这一点?嗯,用错误跟踪系统。


你应该在生产中拥有一个错误跟踪系统,这样你就可以很容易地发现错误,因为它们在你的应用程序推送到生产后出现。


有很多错误跟踪器,它们只需要上网搜索一下就可以了。不过这里有几个大家可以看看。



有这么多的错误跟踪器,你只需要选择一个最适合你的即可。

结语

调试是所有软件开发人员必须培养的一项重要技能。


它是编码的核心,如果你做得好,它可以让你成为一个更好的开发者。


要想成为优秀的调试高手,你必须尽可能多地学习各种调试方法,很多方法我在本文中已经讨论过了。


现在是时候成为一名优秀的软件开发人员了,而调试可以在这条路上帮助你。


现在,你只需要把所有的东西都付诸实践,就能成为优秀的调试者,你的软件开发技能与众不同了。


\

发布于: 刚刚阅读数: 4
用户头像

Jackpop

关注

还未添加个人签名 2020.09.16 加入

公众号:平凡而诗意,微信:code_7steps,全网粉丝超20万,技术进阶、优质资源、实用工具,欢迎关注!

评论

发布
暂无评论
有哪些新手程序员不知道的小技巧?_Jackpop_InfoQ写作社区