关于debug的一些思考
关于bug与debug
记得知乎上有人提问,为什么程序员不能做到bug free。上面的回答大概已经忘了,下面先写一下我目前的想法。
学编程如同学外语,我们要能够与计算机沟通,让他理解我们的想法,并且按照我们的想法做事。这就像管理一个team,个人的力量终究有限,我们要是一个team心往一处想,劲往一处使,才能完成许多一个人根本完不成的事。
那么,如果想要跟一个人沟通,我认为,要么让他学习怎样理解你的想法,要么让你去理解他的想法,所以我们有了语言。
通过生活常识我们也知道,不同地区有着不同的语言,那么我觉得计算机也可以看作为不同地区的人,只不过他很固执,只理解一些他理解的指令;但是计算机也很靠谱,只要给他相应的指令,他只返回唯一的结果。
那么,为什么有时计算机并没有按我们的预期返回相应的结果,我认为,是在与计算机沟通时出现了问题。
今天在学习时得到了一个建议,当你发现bug时不要仅仅是不断地尝试更改变量,更改顺序等并不断地运行看看结果是否符合预期,千万不要这样做。我非常赞同这一点,一个程序员,或者软件工程师,要有基本的科学素养。如果像刚才那样做了,那么最后会把你的编程变成一个经验主义:我之前这样做过,我不知道为什么,他成功了。
实际上,这也让我关联起了之前学到的两种知识类型,一种是声明式知识(可以类比为变量),一种是程序性知识(可以类比为函数)。
我觉得,这也让我们的编程变成了一种声明式知识的累积。好好地一个函数,变成了一个变量。
一个函数,传入变量可以得到不同的,符合预期的结果;
一个变量,只是一个变量。
所以,当发生bug时我应该做什么?
刚才得到结论,计算机没有理解我的想法,他按照他的理解返回了一个结果。那么,中间哪一步出现了误解?
我的想法是什么,我的想法表述出来是什么意思,计算机又是怎么解读我的话,解读之后他又是怎么理解的?
bug出现在这中间的过程中,程序员不停地在于bug做斗争,实际上,也正是在尝试不断地让计算机不要曲解我们的意图,完成我们预期的想法。
程序员就像一个作家,想让读者读懂我们的文章,理解我们文章中表达的思想,那么,这有引申出来几个问题。
首先,在我们写文章时,我们的想法可能还不成熟,或者说很简单。
想法多了,写的字就多了,就要重新回顾,想办法精简,车轱辘话来回说很烦,虽然计算机不嫌烦,但是其他作者会说你文笔差,你将来自己看着也不好意思。
也有可能想法变了,人会进行思考,思考之后有可能就改变了之前的想法,就会出现自相矛盾,此时,计算机不理解了,说你之前不是这个意思啊,我按照那个想法来做呢,bug出现了,那么我们就要给他明确的指令。
所以,不要把debug当成一种负担,我的目标是利用计算思维,让计算机为我们工作,bug出现了,说明我们有机会修正我们的想法,使其更加符合计算思维。这样,就可以把debug看做一个学习的过程,你解决了这个问题,就掌握到了一项知识,这是多么的有趣!