当前位置: 首页 > 科技观察

避坑-为什么我总是写错误?

时间:2023-03-22 12:20:16 科技观察

本文转载自微信公众号《程序员鱼皮》,作者鱼皮。转载本文请联系程序员Yupi公众号。大家好,我是Yupi。在写代码的过程中,难免会出现各种bug。但其实很多bug的原因都是大同小异的。所以我在学习编程的时候总结了一些写bug的原因。希望大家能从中吸取教训,以后写代码的时候多加注意。CommonBugIncentives中文代码总结下面是两行最简单最简单的Java代码,上面的代码可以运行,但是下面的代码会报错://教程中,可以运行System.out.println(“你好!”);//我写了,会报错System.out.println("Hello!");明明我的代码和教程里的一模一样,为什么不能运行呢?这是刚接触编程的同学总会遇到的问题,仔细一看,原来是行尾的分号被误用成中文了。..这种bug往往是刚开始学编程的时候不注意或者不习惯切换输入法造成的,但是写代码一段时间后,就会好很多。而一般的编辑器是可以识别出错误位置的,根据错误信息进行修改即可。编辑器识别汉字报错。另外,有时候不小心把工程文件名从英文改成中文,会出现乱码、文件无法读取等问题。代码不规范。之前没注意代码规范。我以为是我自己写的代码。如果我写得又快又好,我就完成了。自己都看不懂,更别说其他人阅读协作开发了。命名不规范,就连之前不小心拼错的变量名也根本不敢改。怕漏了一个地方,会报找不到变量的错误!复制粘贴复制粘贴可以说是我写代码时用得最多的技能了。正常的操作是:3秒粘贴一个文件,修改两次,代码就可以运行了。复制粘贴固然好,但稍不留神,可能会遗漏修改一些变量名或注释,比如下图这位同学:这样往往会导致整个项目中出现很多相同的变量,其他同学们要介绍一下有时候,我不知道该选哪一个!在写硬编码代码的时候,经常会用到一些常量,这些常量是固定的值,比如网站的地址,最大值和最小值,本机的IP地址等。有时候,为了省事,我干脆不为这些值单独定义变量。这些值用到的地方,我再复制粘贴一遍,直接写到代码里,如://连接数据库,IP硬编码DBdb=newDB("10.0.0.1");这样简单粗暴,但是如果哪天这些死值需要修改的话,你得从所有的文件中一个一个的找出使用这些值的代码,然后一个一个的改,就是不仅麻烦,而且容易遗漏,导致bug。未释放的资源要想从数据库中获取数据,必须先与数据库建立连接,并占用连接资源。数据库连接拿到需要的数据后,忘记释放(关闭)资源了。结果导致数据库连接很快被占用,其他程序无法访问,导致很多功能失效。不仅仅是新手,即使是有几年编程经验的同学也可能会犯这个错误,因为资源不释放不会影响功能的可用性,不进行压力测试很难发现这个bug。另外还有HTTP连接,文件输入输出流,这些都是资源,一定要注意是否需要手动释放。稍有不慎就会导致资源泄漏的bug。圈复杂度太高圈复杂度是代码复杂度的度量。简单的说,if/else分支越多,圈复杂度越大,往往意味着代码越复杂。圈复杂度我记得我写了一个特别复杂的逻辑,一层一层的几十个分支语句:if(xxx){}elseif(xxx){if(xxx){if(xxx){}elseif(xxx){if(xxx){💩}}}}一开始懒得优化代码,后来发现情况不妙想优化代码的时候才发现,狗屎山搬不动.不仅别人看不懂,我自己也看不懂!这种代码一旦需要添加和更改逻辑,就很容易出现bug。因此,建议在写复杂逻辑之前先画流程图,理清代码,多写注释,适当使用抽象、封装、设计模式等技术,降低代码的圈复杂度。依赖冲突依赖指的是别人写的代码和工具,比如我们项目中要用到的框架、类库等。像我以前为了省事做项目图,我把需要的库都放到项目里,用最新的版本。直到工作之后才发现,对于一个大项目,很多人同时开发,往往要引入很多依赖,稍有不慎就会造成依赖冲突。各种项目依赖。比如我把类库C的1.0版本引入类库A,类库B引入类库C的2.0版本,如果项目要同时导入类库A和类库B,应该导入哪个类库使用?哪个版本的C?依赖冲突的后果往往是项目无法启动,更严重的是直到项目执行了冲突的函数才出现bug。之前没有区分环境,为了方便做网站,我在自己电脑上开发的时候,和已经上线的项目用的是同一个环境,连接同一个数据库。结果有一天,我忘记了这件事,在开发的时候造了一个假数据,不小心上传了我的翡翠照片:结果大意,这个数据居然被塞进了线上数据库,结果上万条在线用户都可以看到它。这还是小事。如果你在本地开发的时候写了一个bug,不小心把线上的数据全部删掉了,你真的是欲哭无泪啊!企业开发不要做自测,测试是很重要的。一般情况下,除了需要设计用例的测试同学,开发同学还需要编写单元测试进行自测。就像我以前很自信,只要我写的代码能跑起来,我从不测试,一梭子!但是进入企业后发现,不写单元测试真的很容易出现各种细节问题。可能下个版本改了一行代码,之前正常的功能突然报错了。而且问题发现的越晚,修改的成本就越大,排查bug修改bug的时间也就越长,加班在所难免。在学校写代码之前没有评估,我通常是学什么技术就用什么,会用什么就用什么,不管能不能满足性能和数据量的要求。进入大公司后,才意识到系统评估和技术选型的重要性。一般需要对系统的并发量、数据量级、接口延迟等进行评估,并根据这些选择合适的技术。比如公司有一个项目,数据量几千万,如果我不做评估和选型,不加思索地使用MySQL数据库,不做任何优化,那系统很可能就挂了在几分钟内。在学校的时候,习惯了单打独斗,想改什么代码就改什么,根本不用考虑对现有系统或者其他系统的影响。但是在企业中,尤其是调用关系复杂的链接系统,如果你修改接口的返回值,或者改变接口的并发数和返回时间等,分分钟依赖你接口的同事就会来谢谢你。为了防止出现这种情况,建议梳理一下自己的接口依赖了哪些接口,调用了哪些接口。当需要更改代码时,需要评估更改对其他系统的影响,并及时通知相关负责人。与其自己拿定主意,不如专注于自己的一亩三分地。文档未完全阅读。目前的技术框架一般都会提供非常详细的文档。技术文档但是我之前看文档的时候,为了追求效率,只要看到自己需要的功能,就立马复制直接使用,而不是选择完整的看文档。结果因为盲目自信,没有看到文档中很多重要的注意事项,导致出现了很多愚蠢的低级bug,浪费时间在网上寻找解决方案。版本号错误看文档跟看教程学技术不一样。不要一味追求最新,要根据实际情况选择与自己项目一致的版本。记得刚开始看文档学编程的时候,写的很多bug都是因为没看文档就没注意版本号。结果用到的很多语法不是淘汰就是不支持,然后我怀疑人生了。注意选择版本号,不要理解需求。在编写代码之前,您必须了解需求。你想让我做什么?你为什么要这样做?不然就会像刚进公司的时候,有一个功能点不懂,也没问,也不敢问产品同学,全靠自己自由发挥。最后,即使我的代码可以无bug运行,但不是用户想要的,那不就说明:我程序的存在本身就是一个bug吗?写代码没有设计就跟盖房子一样,首先要想好怎么写代码,然后再去写。尤其是当业务流程比较复杂的时候,不要凭着自己的聪明才智或者丰富的经验不去写方案或者设计,直接打开编辑器写代码就可以了。这样很容易遗漏一些要考虑的关键点。可能到最后才出大问题。结果整个逻辑都得删掉重写!效率就更低了。