要对代码有一些想法,要对自己有些追求

前言。

技术服务于业务,今天来梳理一下。

技术的变化,从一开始的 jsp+ssm到现在的springboot+mybatis+vue,框架越来越便捷,正如曾经看到的那句话,底层越来越复杂,顶层越来越无脑。开发门槛越来越低,但是你懂的越来越少。原理跟基础,在网上java资料都很泛滥,但是碰到问题,怎么处理问题,怎么去解决问题,或者预防问题变成真正含金量的东西。人应该对技术做怎么样的思考,或许是之前走的太快太忙,没有好好思考过。

业务的变化,业务初步给人的感觉就是产品经理在巴拉巴拉的一顿乱说,好像给在专注写代码的你套上了过来开个会的枷锁。一开始也烦业务,为什么不让我好好写增删改查,打扰我宝贵的敲代码时间。后面被现实教育了。开始重新审视业务。首先,你的代码不值钱,你的增删改查来个实习也可以干,你的ctrl+c,ctrl+v ,实习的比你更加熟练,其次你的代码单纯的拿出来,没有变现价值,你的尝试都是偏向表面,或许你写的,都是可以百度到的写法,没有对某个点进行优化,涉及底层的东西,真的有价值吗?面试问的很多项目经验,都是问遇到什么问题,你怎么解决问题?更看重你对待技术的态度,跟处理方法,以及一个处理bug的思路。技术是服务于业务的,在这个前提下,你的业务可以自己去了解新的技术,去开源编写一些场景下的框架或者代码。

你可以进行的思考

1.复杂的逻辑条件,是否可以调整顺序,让程序更高效

代码基本是增删改查,只有跟对应逻辑集合在一起,才是一个功能模块。一般接收到一个需求,往往就是直接开干,if-else一次性写下来,逻辑在哪里出现分支就是一个if-else,如果分支在很前面,可能对应代码就是要写二次,然而其中分支变化点可能就是状态的不同。这里的基本思路是把重要的分支点尽量提前,把重复的代码提取出来。这是一个代码优化很重要的点,让你的代码具备可复用性,以及别人可以看到你提取出来是对一个逻辑的进行处理,提高可读性。另外是否可以调整顺序,其中某些值的校验无疑是放到比较靠前的,因为如果校验不通过,根本无法走到下面流程。这些判断都是业务支持提供的。

2.你的程序是否创建了不必要的对象。

每一个对象的应用都有开销,如何让你的代码用到的对象是都需要用到的。这里有二个点,一个点是在代码完成后,代码优化这个环节,你删除没有引用到的包或者对象 这里主要是指 多余的import类,第二个是把重复都在用的提取出来,比如支付宝对接时候,支付宝基本信息那个类就是都要使用的,用单例模式,懒汉加载。而不是用到的时候,重新new一个,这种代码也是可以优化的。

3.查询数据库时候,你是否查询了表的所有数据

查询sql的编写,一般情况都有很经典的select * from xx,查询全表内容,但是这个是不提倡的,因为表数据会越来越大,以及一些表的数据是尽量不要全带出来,同样优化时候,用具体字段代替 select *,最差也是全字段查询,也就是一个优于等于 select * 的选择题。

4.加上一行 你觉得不怎么重要的代码 ,是否会影响到主要流程

我项目中遇到过,想查看用户的所在地,这里有二个切入点,一个是用户手机和用户ip,都可以大概显示用户所在地,这个是不重要的数据,就选择了用户手机,因为用户手机唯一确定。我写在用户新增部分,手机号码查询归属地是调用第三方接口。测试时候,都是正常的。然后线上用户新增失败报错。排查时候是第三方接口出现波动,导致报错,然后原本正常的用户新增失败,因为用户新增部分是作回滚,但是手机号码查询归属地是写在controller层调用的,所以出现用户新增实际是成功的,但是用户页面出现你注册失败,再一次去注册就出现了你号码已经注册。所以这个影响到主要流程了。该怎么处理,最简单,就是调用第三方接口去捕获异常处理,这个不那么重要的信息获取,即使失败也不会影响主要流程,然后是如果有及时性,那么就另开异步线程去处理,即使失败也不会影响到当前流程。又或者是跑定时,当一天结束后,对手机号码归属地为null的数据,都调用第三方接口去查询手机号码归属地,然后回写到数据库中。

5.对空指针引起重视

任何判断都应该要知道是否值可能存在为空的情况,所以空指针的判断是摆在首位的。优先是确定不为空的值放在前面,然后再是.equals(传入的值),这个要养成习惯,不然线上如果数据哪里出问题了,拿某个对象里面某个值进行对比,那个值碰巧是空,报错的话,代价很大,切勿轻易尝试。

6.你的关键业务代码是否有日志输出

线上不可能让你打断点去排查,所以你的排查极大程度是依赖日志,你的每个操作数据库不可能都记录,那么对数据库开销很大,所以一般是依赖日志。对应操作需要打印对应日志,基本的日志 输出我比较推荐 logger.infoFrom 这个 一般记录 调用接口,操作人,调用结果,调用传参,对应数量 等等。另外info跟error的日志输出级别也要注意。如果你还对接了微信,微信有一个微信报警,企业有对应企业账号的话,可以去了解一下。你可以把即为关键的信息报警。比如用户下单失败,用户签约失败,用户付款异常失败等等,都可以报警给你

7.化整为零

你的代码写成一坨,别人就需要一行一行看下来,而且很多都是重复的,可能就是状态某个值不一样,其他都一样。那样的代码重复太多,可以提取出来,划分成功能单一的小函数,这个有一个说法,尽量代码一个函数不要超过50行,除非真的特别长,50行一拉到底,一气呵成,方便你对这个代码进行了解,也方便别人调用。如果你代码是提供给别人对接,那么更加需要拆分,因为如果需求改变,别人同样还是调用你的代码,那么就是你自己动大手术还是小手术的区别了。写在一起,可能都要更改,但是你做好了拆分,可能你就更换零件就可以了。你懂的。

8.可变因素,是否最好都有一个字典表去支持

配置这东西,我接触的项目中,有网页的其中涉及客服的二维码,这里处理方式有既然是页面的图片,那么页面写死,可以这样做。但是客服每天都要更换,那么天天修改页面,先客服图片给你,上传到oss,然后对应cdn加速,最终的网址你给前端,然后前端修改页面,每天都这样。程序员要做的就是把重复的动作给提取出来,然后做成程序,这样就是一个价值。后面创建字典表,前端去读取字典二维码数据,后端提供给客服上传二维码功能,上传的二维码网址回写更新字典表的数据。那么每天客服自己去修改就可以了,甚至可以短时间内多次修改,都满足。

9.查询大表,是否加了索引

查询数量表比较大的表时,我们需要确认三点A.表是否建了索引 B.查询sql是否命中索引 C.sql是否还有优化的余地

10.你的方法返回一个空集还是null

mybatis中有返回一个对象类 也有一个对象list的,其中判空标准不一样,如果是类,判断是否等于null,如果是对象list的,是空集,不为null,需要判断对象list.size()==0

11.查询数据库,如果数据返回太多,考虑分批处理

这里用到的是数据导出,用户数据导出一个案例,查询出来的数据导出成excel表在浏览器自动下载。本地测试是没问题的,因为本地测试数据库的数据不多,就是简单测试一下功能,但是放到线上测试环境就导不出,打印日志,也基本都是正常的,就是最后一步在浏览器自动下载没有实现,之后是对应用户表数据传输到本地,发现也导出失败,最后排查是数据过多,那么就考虑分批处理,获取对应总条数然后进行500条一批,也就是 对象list.size() / 500 + 1 作为总导出的次数,然后再走原先流程,完成用户数据excel导出。

12.你的接口是否考虑到幂等性,并发情况呢

幂等性是什么?一次和多次请求某个资源对于资源本身应该具有同样的结果,就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同

比如你点击下单,不可能连续点多次提交订单,就生成多个订单吧

这个极大程度是出现在资金冲突情况,某个接口可以进行资金的增加减少。开二个页面,对同一个用户的资金进行增加减少,首先是查询出来,然后做加减。这种处理方法要用到version版本号来确定你当前操作是否同一条数据,如果不是,返回重新操作。或者使用update ,对在sql语句中对对应数据进行操作,记得结果值不能小于0,利用数据表自身的修改语句锁行来进行处理并发

13.redis的使用

很多数据只是本次使用比较频繁,到下次就不用了,比如token,对于本次登录,用户操作,每个请求都要校验token,如果每次都取mysql数据库的token数据就消耗资源,所以这里用redis做缓存,将不变的用户数据,缓存起来,这样性能有所提升。

以上原创来自 https://mp.weixin.qq.com/s/9l1AvpSa9m5QINrVicejxw

同时加上自己的一些理解跟案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值