从粘滞,棘手的编码问题中解脱出来的5种方法(4)-程序员宅基地

技术标签: ViewUI  git  测试  javascript  

GIF图片由Giphy提供

当您学习新知识时,您将不知道自己所不知道的。 擅长做某事总有秘诀,学习编码也不例外。 这些秘密是元学习,提供了方法,工具集和思维定式,以实现您成为踢踢式编码器所需要的突破。 我在这里是为了在我 在Makers Academy 编码 之旅中 发现的元学习 中花些时间,以便您加快自己的学习速度。

对于本系列的第四篇博客文章,我们将探讨可操作的方法,当您遇到棘手的编码问题时,这些方法可以解决

“增长是痛苦的。 变化是痛苦的。 但是没有什么比坚持下去痛苦的多了”
NR Narayana Murthy
[1]带来强大的,消除错误的调试方法

如果您读了第一行并认为“我不知道我是否有一个真正的调试过程”; 那我告诉你,你要请客了。

有了编码(可以说是生命), 流程始终是解决特定问题的主要方法。 培养可以将其应用于任何编码问题的鲁棒调试方法,是解决编码错误(无论大小)的最佳方法。

输入:由Makers Academy开发并由 Mary Rose Cook 与我分享的精美简单的“三步调试过程”

步骤1:从错误消息中拧出所有有用的信息

听起来很简单。 在实践中,这是新手和有经验的编码人员的经典陷阱。 通常,当我们运行我们的代码(或对我们的代码进行测试)时,我们会尝试直接找到解决方案以尽可能快地解决它,而不顾一切地跳过堆栈跟踪和任何错误消息。 相信我,这很容易做到; 我自己做了很多。

当您看到堆栈跟踪(下面的示例)时,请拧出您可以找到的每一个该死的细节,例如:

  • 什么文件
  • 什么线
  • 什么类型的错误? 例如NoMethodError
  • 问题的范围是什么?
  • 错误消息提供哪些详细信息?
Ruby代码的RSpec测试中带有错误消息的堆栈跟踪示例

在现代编码语言中 ,错误消息比以往任何时候都更加有用-确保提取出您可以获取的所有信息。 迫使您认真对待此过程的一种有用方法是, 在阅读错误时写出您发现的有关错误的信息 ,以确保您精通最有用的位。

第2步:收紧循环并获得可见性

收紧循环。 在这里,您可以使用错误消息中的信息,并查看代码的不同源以查找发生错误的位置。 关键是找到第一行错误的代码 (该行可能与错误消息提供的确切行不同,也可能与之不同)。

获得可见性。 现在,您已经收紧了循环,大致了解了错误的出处,获得了可见性,例如,“查找/打印输出” /“检查”该空间中的所有变量和编码逻辑。 在具有引用透明性的地方(对已提取的代码逻辑的引用并存在于其他地方),将其分解并找出代码中的变量是什么样。

通过将复杂的代码分成小块,并仔细研究这些方面每个方面的评估,您将对代码在实践中的工作有更好的了解。 继续将您的代码分成多个部分,并获得所有元素的可见性 。 您对代码中每个点确切发生的情况的了解将得到改善,并且您将看到编码逻辑出现故障的地方或行为与您的期望有所不同的地方。

步骤3:修正该错误

至此,您已经知道是什么导致了堆栈跟踪中的错误,您已经缩小到知道错误的位置,并且确切地知道了代码中的每个元素实际上在做什么。 此过程将揭示您的错误发生的原因。 如果您知道解决方法,请继续进行! 或者,您现在将知道问题发生的地点和原因,但是要修复错误本身,您可能需要研究解决方案。

编码研究本身就是一种技巧和过程,我在这里不会解决。 如果该错误仍在引起您的问题,请仔细研究问题,不要忘记退后一步,对问题进行更高级的思考。 提醒自己,编码上下文和逻辑始终是解决问题的关键。 通过随机键入您认为可行的潜在解决方案来修复bug本身很诱人。 但是,这不太可能解决问题,即使解决了问题,您也不知道为什么下次解决类似的错误时它仍然起作用。

最后提示 :请记住,最棘手的问题通常具有最简单的解决方案。 不要忘记,您的错误修复可能是一个简单的拼写/错字/语法问题。

解决棘手的编码错误:Slimy,但令人满意

除了执行可靠的调试过程之外,还可以在工具箱中保留4个简短而又敏锐的元学习:

[2]删除您的代码(等待,什么?!)

仅仅因为您的代码之前(或您认为可以)工作了,并不意味着它仍然可以工作。 您可能会陷入困境,因为满足新的用户要求已改变了代码中所需内容的游戏,并且过时了。 但是,我们发现自己试图将新功能强加到旧代码中,即使它不再有意义。 尽管我们所有人都希望构建易于灵活和可扩展的代码,但这样做的可能性是有限的(尤其是在具有多个开发人员的复杂代码库中)。 因此,最好的解决方法是删除DE DAMN CODE。

“在破坏时期,创造一些东西。”
马克西恩·洪·金斯顿

通过删除您的代码,您可以轻松美丽地开始工作,而无需先前代码库的认知负担。 您带来了一个光明的,明亮的“初学者头脑”,将您的代码再次变成了一个全新的机会,任何新的,酷的想法都可以成为未来。

删除您的代码,否则熊猫会为您删除

幸运的是,与使用砖砌建筑物不同,代码很便宜。 它实际上只花了一点钱,但存储空间却不花任何钱(享受这一方面,让它沉没-屏幕上的代码不是值得的东西,您编写出色的新代码的能力才是值得的)。 习惯于删除代码,然后重写它。 在您编写的代码上很容易获得宝贵的价值,但是有信心知道自己能够从头开始复制代码是非常宝贵的。 您将无法删除代码并重新启动,但是这很可能是您学到的最强大的功能。

[3]假设你和我都混蛋

这是一个棘手的棘手错误的最危险武器:假设。 在编写代码时,我们会一直假设事物的运行方式。 这些假设是心理模型和隐喻,它们简化了我们的编码模型,并使我们能够将其保留在我们的大脑中,以便我们可以以可行的方式进行交互和使用它。 尽管这可以帮助我们减轻认知负担,但它可能是绝对的消磨,并且可能是造成困扰的主要原因。 所有危险假设中最危险的是:假设您知道为什么会发生错误。

当您想到有关代码和所卡住的错误的想法时,不知道发生错误的真正原因。 值得庆幸的是,除了意识到假设的可怕力量之外,还有3种实用的方法来应对这种自然的思维方式。

假设会导致这种情况-一个只为您打造的活虫地狱:)

(i)每次添加或更改代码行时,都要运行代码和测试。 让您自然而然地使用模型并运行测试。 如果您在更改之间保留的时间过长,您将不知道哪一次更改是您现在在代码中看到的影响。 在开始奔跑之前:知道,真的知道,您认为这个额外的元素应该做什么 (甚至大声说出来)。 如果您更改一个元素和错误消息。 然后,当您进行更改时,将运行代码的堆栈跟踪信息内部化,以了解发生此更改的原因以及这有助于您避免卡死的含义。

(ii)Git尽早并经常提交代码。 这样,您可以轻松地返回模型的先前版本和特定版本,以查看哪些更改导致您陷入困境。 无需假设发生了什么更改,您就可以轻松地查看更改的内容,并返回到发生更改之前的时间。

(iii)如果您真的想超越目标:完全通过未来的实时测试功能消除假设。 换句话说,设置您的测试基础结构,以便它可以运行您的代码并按您键入的方式进行实时测试。 我知道,什么!?! 即时,优美的反馈,无需假设您的代码正在做什么,因为您可以实时看到正在发生的事情。 解除粘滞的终极工具。 例如:如果您使用的是无处不在的Javascript,那么一个有用的指针可以帮助您实现目标: wallaby.js

[4]首先解开,然后重构

当您编写代码时,诱惑可能是在知道它是否确实按照您希望的方式工作之前就开始对其进行重构。 当您陷入困境时,忙于自己重构代码库,而不是尝试解决实际上陷入困境的棘手, 棘手 ,可怕的问题,将是一件很棒的事。

抵制这种冲动,只有在知道代码可以正常运行并通过所有测试的情况下,才重构代码( 在此处的第1点了解测试驱动开发的世界和红绿重构周期 ) 。

如果您在此之前进行重构,则将进入red-refactor-red-refactor ad-infinitum的暮光区周期。 重构无效的代码可能会使您忙碌,并使您无法解决棘手的问题,但是只有在您开始工作后,它才能从头开始进行重构。

[5]不要陷于精神粘性
粘在粘性上的大脑的视觉表示

永远不要忘记:您的大脑最终将带给这一棘手的问题解决方案。 头脑有一种使粘稠感加重的绝妙方法,但是好好对待它可能成为解开粘滞的关键:意识到被粘住的心理方面,以便您能够尽快取得突破。

(i)不要在问题上停留太久。 在学习编码方法时,尤其是在旅途开始时,不要将一个特定的问题停留在30分钟以上。 您的问题解决过程应包括升级,在该升级过程中,您已在那30分钟内升级并击中了核选项,以使您摆脱困境。 例如:给朋友打电话,与导师交谈,或者如果有的话:查看解决方案并从中学习。 这不是在承认失败,而是要有一个明智的,分层的问题解决流程,并带有适当的升级点,而不是反复尝试陷入困境的方法。

“精神错乱:一遍又一遍地做同样的事情,并期待不同的结果。”
未知

(ii)休息一下:给您的大脑提供顿悟的空间

陷入困境的一种自然的心理陷阱是,不停地编写代码,而对错误感到沮丧,以至于将自己从代码中撕下来似乎非常痛苦。 休息一下就好比承认失败,放弃自己的问题。

但是,这种不间断地争取胜利的自然冲动并没有考虑到大脑的实际运作方式。 人脑实现顿悟的方式是通过学习某种东西, 然后从直接问题中获得空间来处理这种学习 。 您为什么认为人们在最奇怪的时间有奇妙的想法和突破:在健身房,淋浴,散步?

一个特别棘手的问题所带来的空间可能正是您所需要的,但这是我们要让最后发生的事情。 相信科学:真正的认知突破,让潜意识为您解决问题,就像真正的解决问题的专家。

(iii)享受进步,庆祝胜利

当您努力摆脱顽固的必杀技时,请尽情享受旅途中的小成功。 即使更改错误消息,也要停止并表示祝贺。 通过使用上述工具和技术,您应该有能力摆脱棘手的粘性编码问题。 当您最终摆脱困境时,请确保在精神上奖励自己并休息一下以庆祝; 你赚了。

寻找更多的编码秘密?

这是该系列文章中的第四篇,重点介绍了我在Makers Academy学习编程时学到的秘密元学习:方法,工具和思维方式,这些都是取得突破的必要条件,而您需要成为一名踢屁股的编码人员。

如果您喜欢此博客文章,并且想阅读更多类似的文章,请单击“关注”,然后单击“ below”下面的“中等鼓掌”按钮,给我一些鼓掌

From: https://hackernoon.com/5-ways-to-unstick-yourself-from-sticky-tricky-coding-problems-4-f65aba51a0ca

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dfsgwe1231/article/details/106020118

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签