热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编程高手与调试高手

业界总是有高手之说,高手成了程序员心中之偶像,成了程序员成长之目标。但是,现实中人们往往对自己所了解的程序员,很难认同为高手;人们反而对那些自己不了解的,甚至是道听途说的人会认作为高手了。高手,同武林高手一样,神秘之至。

业界总是有高手之说,高手成了程序员心中之偶像,成了程序员成长之目标。但是,现实中人们往往对自己所了解的程序员,很难认同为高手;人们反而对那些自己不了解的,甚至是道听途说的人会认作为高手了。高手,同武林高手一样,神秘之至。

许多程序员都有这样的经历:无论自己编写什么很短很短的程序,一般是很难一次就能通过编译的;通过编译的其功能还不一定是正确的。我在很早就注意这样现象了,开始的时候,我还不信这个邪,还试着编写程序看看自己能否一次能否编译成功,为这个事还和别人打过赌呢!这当然是年轻时做过的事了。后来我渐渐明白了,编程出错是编程的一个重要的部分!出错是正常的,不出错才是不正常的。出错怎么办?当然是改错啦!不知道错在什么地方怎么办?当然是调试啦!调试于是和编程相依相伴了。程序员不但要会编写程序,还要会调试程序。

程序出错一般有:未定义、语法、运行出错三个方面。

未定义往往是程序员的忽略定义或定义后名称与定义不一致造成的。

  1. 未定义
  2. 未定义往往是程序员的忽略定义或定义后名称与定义不一致造成的。

    • 要避免忽略定义这个问题,程序员首先要养成严谨工作的习惯:“先定义,后使用”。
    • 解决定义名字与使用名字不一致问题,程序员在对函数名、变量名、文件名、数据库名、表名、字段名定义的时候,不要信手拈来,象不花钱似的任意取名。一定要定下心来慢慢地斟酌,这个名字自己不但要能懂能记得,别人一看也要能懂能记得。程序员可以假设自己定义一个变量就要花出去100元钱,如果别人看不懂就要另外支付200元。有了这种名字的“有偿使用”,这样程序员就不可能乱取名了。长此以往,在使用这些名字的时候程序员就会有行云流水感觉,而且很少出错。
  3. 语法问题
    • 新手编程走一步一个跟头,走两步两个跟头,主要是对语言的语法不熟悉,丢三拉四,关键字拚错等。这种情况不可怕,多看看语法说明,多改改程序就会对语法越来越熟悉了。
    • 老程序员语法问题出现较少。但是,很多情况下程序员在使用新语言编程序的时候,会采用老语言的语法,反之亦然,导致出错。例如,某人先使用C语言,后使用VFP。当用VFP编程的时候,往往习惯性地在语句后面加上“;”,这导致VFP语法出错。当熟悉VFP后,再编写C语言的时候,往往在语句后面忘记加上“;”,导致C语言语法出错。类似常见问题如:IF语句后面表达式是否要加“()”等,for 语句,while 语句,case语句在不同的语言的语法都有可能不同。另外,不同数据库中的SELECT 、INSERT、语法都有一些不同处,这些不同之处,往往让程序员不知所措,老是要停下来思考一下,现在用的是什么语言用的是什么语法。
  4. 运行问题
  5. 定义、语法这些都是显式出错,相对好解决。但是运行中出现错误就五花八门了,我试着归纳一下:

    • 运行中程序突然中断了并退出了。往往是内存出错!可查变量、指针是否越界,指针是否为空等、例外没有处理。
    • 环境问题。例如,数据库密码错导致数据库打开不了、要打开的文件不存在、参数定义错,参数表为空,参数表没有缺省值等。
    • 程序的输出的不是自己的预期结果。往往是程序逻辑和算法存在问题。
    • 程序不停地运行没有停止的迹象。查一下循环的条件表达式是否永真、导致死循环。
    • 程序无法退出。程序乱了,导致内存错,覆盖了退出指令!
    • 程序运行了很长时间才出现了错误。累计误差、数据原因造成的错误等。

出错是必然的,如何找出错误,有些人编写C语言的人只会用在可能出错的语言前后,通过显示语句print来判别出错的原因。他们不懂debug、 sdb、 dbx等调试工具,来调试程序,他们会编不会调。我们很难想象不会调试的程序员是如何编程的,调试对于程序员如此重要,以致于可导致出“不会调试的程序员就不是程序员”的结论。

现在的开发语言具有功能丰富的调试命令。无论用什么设计语言调试,你只要注意掌握以下几个命令或操作,就能入门调试了:

  1. 运行程序
  2. 设置断点、取消断点
  3. 运行到断点
  4. 单步跟踪(setp into)
  5. 单步执行(step over)
  6. 显示变量、对象、源程序
  7. 退出调试

你可以按此去寻找相应的命令和操作,并熟记于心中!此法必有大用。

通过调试,程序员可以学会如何运用断点、如何最快地找到可疑语句,如何很迅速地找到问题所在从而改进程序。而不断地调试,使得程序员不停进行调试操作,变成了操作高手。调试内容可以说千变万化,技巧也多多,关键看程序员的积累。例如,循环语句调试的技巧、同步异步调试的技巧、中断调试技巧、外设调试技巧、数据库调试技巧、边界调试技巧、例外调试技巧、屏蔽法调试技巧、替代法调试技巧、接口调试技巧等等。

调试象开车一样,不会开的时候,程序员有恐惧感,会开了以后,程序员特别想调,开多了,程序员越发老练,调试操作越来越快、对问题发生的原因和纠正方法也熟记于心中,技巧也油然而生,积累越来越多。

好的程序员不但调试自己的程序,而且会帮助其他程序员解决调不出来的程序的问题。程序员在帮助别人的时候,更能尽显调试才华,成为真正的调试高手。

调试总的目标是为了纠正程序的错误。但是,调试也可用于其他的用途。例如,我经常会先把函数的调用语句给写好,但是不写函数体,这样每次编译都会出现函数没有发现的提示。我不写函数体的目的,就是让每次编译的时候提示我还有多少函数没有编写。让我对这个函数加深印象,给我有时间思考这个函数如何编写。当其他语句编写完后,我再一个一个把没有编写的函数内容补上,这个时候编写就快的多了。有的时候,我还喜欢看到几十条上百条的出错提示,然后,我感觉于一个改错就能消灭几十个错误的快感之中,然后再改再调,直到无错。调试成了我娱乐编程的一部分。

通过调试你也会发现:编程水平直接影响到调试。如果程序很具有模块性,调试起来就很快,几个或十几个单步执行就会到达程序的任何地方,如果程序本身逻辑性不强,变量命名不准确、一个函数内语句有数十条数百条,那你几百个单步执行都到达不了你想要达到的地方,程序调试起来就会很麻烦,而且不容易定位出错的地方。所以调试高手往往会改进自己的编程,使得编程水平日益提高,成为编程高手。

本文地址:http://www.nowamagic.net/librarys/veda/detail/749,欢迎访问原出处。


推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
author-avatar
岩律_619
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有