有时候会在网络上看到一些同学的疑问,一直在做业务系统的后端开发,时间久了以后觉得技术很难再进步了,产品提的业务需求都能搞得定,但看不到技术提升的点。看看别的同学,有搞搜索的、搞算法、有搞存储的、搞其他中间件的,觉得很有技术含量,再看看自己,觉得很迷茫。
我从毕业以后,一直从事业务系统的开发,经历过社交、电商、招聘等业务系统,从我的过往经验来看,无论是从事底层服务的研发,还是上层业务系统的研发,其实根本上是通过技术手段去解决问题,服务好我们的用户。那能不能把负责的事情做好、做到极致其实就是关键。很多情况,我们也许只是把事情做完,做到60分左右而已,勉强符合业务需求,但是往往体现技术能力的是,能不能把负责的系统从及格(60)分做到90分,甚至100分的阶段,我觉得可以从以下几个方面去衡量自己所负责的事情是否做到了极致,从而找到方向,找到可能的技术提升点。
效率足够高么?
效率可以分为开发效率以及定位线上问题并快速解决的效率, 其实这里人与人之间的差别是非常大的,有的人解决一个问题要1天,有的可能只需要1小时。这和人的聪明程度、逻辑能力、过往经验等有很大的关系,但是我们还是能够通过一些技术手段去提升效率的。比如可以做一些工具帮助我们去提升效率,举几个团队中的例子:
在做C端业务的时候,产品经常会让开发修改一个运营位的图片,修改某个文案,修改某个配色,增加一个灰度功能的城市,每次修改之后,还要找测试同学测一下,然后再走上线流程,这种琐碎的事很多,又没有什么技术含量。基于这个问题,我们就有同学做了一个配置系统,把这些改动抽象成一个配置项,研发同学花5分钟配置出一个可视化的配置页面,以后这种配置就交给产品、运营去修改了,修改后直接线上生效。极大的提升效率,并且把开发、测试的时间给释放了出来,做这个配置系统又是非常有技术挑战的。
之前线上出现问题的时候,定位问题非常的不方便,会比较耗时,基于这个效率低下的问题, 我们有同学就搭建了一个日志系统,统一了业务里的日志格式,提供日志写入SDK,用ELK开源工具做日志的统一收集、存储和查询。做业务开发的同学,在关键节点上都打上日志,定位问题的效率提升很明显。
还有其他的一些工具:图片上传系统,让运营自己去上传图片,拿到图片URL,在配置系统中使用;NOSQL查询工具,提供公司的wtable、wcache等NOSQL的GUI查询系统;SCF调用工具,提供公司的SCF微服务的GUI查询系统,表单里填入参数,就可以拿到SCF调用的结果,不用再写代码去进行SCF服务的调试。
所以,可以看看开发过程中还有什么效率低的痛点,看能不能做一些工具去提升效率,同时也会提高自己的技术水平。
代码质量和复用性高么?
代码的质量和复用性可以很直接的反映出一个程序员的技术水平。小到一段代码逻辑的复用,能不能抽离出基础、公共的代码库,再到能不能抽象出基础的服务,供团队的同学使用,更大一点是业务系统能不能复用。
我们前后端团队里都有自己的基础代码库,大家都可以去贡献自己封装好的基础代码,这对代码的质量也有比较高的要求。在业务开发上,团队把一些公共业务功能,做成基础的服务,比如评价功能,很多地方都会用到,租客房东在隐私通话、预约看房、直播看房、在线签约后都会对彼此进行评价,那么直接就把评价做成一个基础的服务,供上层业务使用,做基础服务就是一个技术上的挑战升级。我们做在线签约的时候,直接把签约系统做成一个公共的服务系统,可以在58上用,也可以在安居客或第三方网站上使用,不仅能够签约个人房源,还可以复用到经纪人房源、公寓房源,甚至租房之外的业务。
系统稳定性高么?
系统访问的用户量增大、存储量增大、内网抖动、依赖的底层服务不稳定的时候,还能够对外提供稳定的服务么,可以拿这些特殊的情况来检验一下。我们的技术方案不但要能做到满足当下的需要,还要能够应对未来发展的需要,以及针对特殊情况,要有技术措施去尽量保证系统的稳定性。
用户并发访问量增大的时候,要能做到系统的稳定,就要会对系统的单机性能,瓶颈,有所掌握,了解现在线上机器的容量情况,能不能做到水平的扩容,如果不能快速扩容,能不能提供有损的服务,保证核心功能能够正常使用系统,不至于整个系统不可用等等。
存储量增大的时候,能不能通过合理的数据库表结构的设计,提高数据的读写性能,或者使用高性能的NOSQL存储工具去提高性能,保障系统稳定。
内网抖动、依赖的底层服务不稳定的时候,也有一些技术手段能够去提供稳定的服务,比如我们的APP列表页服务,之前依赖的一个服务有问题的时候,整个页面都会空白,后来我们做了一些优化,如果依赖的非核心业务挂掉的时候,我们提供有损的页面展现,只缺失非核心的模块内容,但是还能完成整个找房过程。如果依赖的核心接口挂掉,数据没法拉取出来的时候,我们对热点数据做了一份冗余的容灾备份,直接使用这份备份列表数据,用户还是能都看到部分房源信息,不至于像之前一样,页面空白完全不可用。这是一个通过技术优化,尽可能把事情做到极致的一个例子。
系统性能足够高么?
系统的单机性能,甚至细到每个页面、每个接口的性能是否做到了极致,还有哪些优化的空间。能不能通过合理的数据库表、索引设计、高性能的NOSQL存储、分布式缓存、本地缓存、并发、异步等技术手段,充分有效的利用机器的CPU、内存和IO,提高服务的性能。同样举几个例子:
团队用的PHP语言,在使用公司提供的消息队列消费客户端时,只能单进程串行消费,每个消息处理时间需要100ms的话,64核机器,QPS上限就是640,单机性能比较差。基于此痛点,团队同学实现了一个消息队列的代理,通过异步非阻塞的方式分发到消费接口上,无论是代理还是消费接口都可以水平扩展,同样64核机器上,代理的单机QPS能够到达20万左右。
在线签约业务,租客和房东会查看合同图片,第一次迭代上线的时候,合同打开平均需要10秒左右,很慢,体验非常不好。开发同学自发的通过以下技术手段进行多轮优化,最终实现打开合同的时间在1秒左右:1.压缩图片,利用消息队列多进程消费压缩任务 2.pdf2png 服务从串行渲染N页合同改为单页并行渲染 3.根据图片sha1缓存图片 4.修改输出方式减少响应内容,将base64直出全部图片改为url异步加载,优化首屏速度。
总结
所以我们可以从开发效率、代码质量和复用性、系统的稳定性、系统的性能等四个方向,去检查一下我们目前做的事情,看看是否还有优化改进的空间。可以定一个比较有挑战性的目标,要达到这个目标,可能是要突破现在掌握的知识的,这就需要通过学习去扩展自己的知识边界,然后再实践于项目之中。目前团队负责的一个运营活动,里面有个秒杀兑奖的业务,开发过程也有性能上的考虑,做了一些优化,上线的时候压测,单docker 8核 QPS是400。假如我们把QPS目标定成800,其实还是有技术办法能够做到的。我们可以发扬把事情做到极致的精神,提高目标,通过持续的迭代优化去靠近目标,就会积累很多解决问题的经验,技术水平自然就会提升。