当我们面对编程上的问题时,我们应该如何快速的解决掉它,从而开启摸鱼状态。如何通过解决一个又一个问题,总结一套自己的经验。我们从以下几点开始讨论
1.问题是什么
工程师遇见的问题叫做bug,bug的产生是必然的,难以避免,想要解决bug,首先要知道问题是什么,要学会描述问题bug。
描述问题,首先要用一句话概括,“我跑程序报错了,我想做什么什么事情,结果他怎么怎么样了”,“我的程序没有得到预期的结果,我是这样做这样做的......”当你能描述清楚你的问题,就可以请教别人或者和别人讨论。
就好比提需求,如果需求不明确,事情就做不好,如果问题描述不清楚,就很难展开讨论。
描述问题,关键在于清楚自己做了哪些操作,熟悉可能在什么地方会出问题,掌握自己所做的业务
2.问题在哪
排查问题,找到问题在哪是一种非常重要的技能,最简单的思路就是二分排查
要在熟练业务和知识的基础上,根据出现的问题,找到一些可能出现问题的地方,然后控制变量,一个一个排查可疑点。就好比排查嫌疑人在哪,讲究的是知道哪些小区没有嫌犯,哪些还没有排查,不能没有头绪的找问题,甚至反复找。不要在整个城市,整个程序里找,而是分片的找。
找问题,要多调试,输出结果,看看结果哪里没对上,程序运行到某一行的结果符合预期吗?函数输出符合预期吗?哪一步是正常的,到了哪里开始有问题了,哪些函数和语句写的很可疑,哪些经过排查已经明确没有问题了。
是哪里的问题?我们知道程序的运行是依赖源码,输入数据,运行环境等各方面因素的,程序出了问题是代码写错了?还是输入的数据不对,还是环境不对,甚至是程序执行的顺序不对。
控制变量排查,可以帮助定位问题。
找到问题,离解决问题已经非常接近。
定位到问题,无非就是哪里错了改哪里,很多问题都在知识范围内,只是程序的运行或者代码的编写出乎意料,或者函数接口不熟悉写错了,并不是知识不会,代码不会写。
如果定位到问题,明确知道问题的来源了(已经定位到非常具体,只差修改),但却不知道问题产生的原因,如何修改,就是下一节,怎么找到解决办法讨论的事情
3.怎么找到解决办法
在射程范围内的问题,我们可以自己就解决了,当遇到不再射程范围内的事情,就要注意了,这是个困难,也是学习进步的地方。
面向搜索编程
很少有人会记住每一个函数接口,每个类的使用方法,每个数据定义,哪里不清楚就去查哪里,不要凭借自己想当然的思路。公司内部特定的问题,问熟练的同事,公共的知识先去google,百度搜索。
怎么在google百度搜索问题?
程序员问答网站stackoverflow,一个非常重要的功能就是问问题,当你去该网站尝试新建一个问题,他会要求你描述清楚问题分类,问题描述,不符合的问题甚至根本无法创建,重复提问也无法创建。另外,好回答会被点赞,好问题也会被点赞。
我们可以发现,原来问个问题也有大学问,那么怎么在网上搜索问题呢?
关键词定位
我们用人话和搜索关键词来举例,首先要问得出人话,人话有的可以直接搜索,有的太长不好描述,就用搜索关键词
- 我想在linux上把这个文件移动到那个位置
linux移动文件
python里我想读一个txt文件,每一行怎么读怎么读,读完了又要干啥干啥? 这类长问题,注意划分小问题逐个解决,先解决一部分,再解决一部分
拆分为,python按行读取txt文件,再去找要干啥的问题xxx操作之后,yyy怎么样了,不符合预期
xxx操作后,yyy怎么报错信息有输出,简单举例
>>> a = 1
>>> b = 'ss'
>>> a+b
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'
int类型和string不能相加,直接搜索
TypeError: unsupported operand type(s) for +: 'int' and 'str'
或者熟悉了,自己直接看报错都知道问题了
注意
你说,不对啊,我的a和b明明都是int,怎么这样呢?ok那你输出一下a是什么,b是什么,a从哪里来的,产生a的代码是不是出问题了,b从哪里来的,是不是有问题。其实这里是在定位问题了,所以切记,定位问题一定要准确,不要粗心大意
4.轻松点的思考
解决问题,首先要说清楚自己遇到了什么问题,先把自己做了什么,发生了什么描述清楚;其次要定位问题具体在哪,哪里有可能出问题,要调试,分块,二分,逐一的排查问题,问题可能在代码,输入数据,运行环境,依赖关系;最后,找到问题后,熟悉的问题直接解决,不熟悉的问题通过搜索,询问,讨论解决。
我认为最重要的是在排查问题,因为人脑毕竟不是电脑,不能够模仿程序的运行,所以需要熟悉代码,调试程序,精确定位,这也是为什么有很多调试工具的原因。
程序的运行总会有各种意想不到的结果,所以才需要有测试开发,软件更新,bug修复,无论谁写的代码,都会出现bug,所以当我们的程序出问题了,也不必焦虑。
最后我想说,程序员,工程师最讨厌八阿哥......