代码工艺:写代码的好习惯

news/2024/10/23 20:08:35/

1. 充分校验入参

有一句话叫 “All input is evil”,即一切的输入都可能是恶意的。 因此,经验丰富的工程师会对接口的入参进行严格的校验,从最基础的非空、长度校验,到复杂的业务逻辑校验都不应忽略。例如,在典型的电商下单场景中,我们需要校验用户状态是否正常、商品是否上架、库存是否充足、优惠券是否可用等。请记住,入参校验是防止低级错误的第一道防线,养成这个习惯至关重要。

2. 完整记录日志

我们总希望自己写的代码在本地、测试、甚至生产环境下都能完美执行。但现实中,业务异常情况常常发生,即使我们拥有像ELK、Skywalking这样的日志收集和链路追踪工具,日志记录的全面性和合理性仍直接影响我们排查问题的效率。日志的覆盖面应该包括关键路径、异常处理等。你今天省下的日志记录时间,将来很可能会在排查问题时花费更多。

3. RPC 调用需考虑网络问题

RPC 调用不同于本地调用,因为网络不稳定性带来了许多不确定因素。你需要思考以下问题:

  • 请求未能到达服务提供者怎么办?
  • 请求到达但未返回结果时如何处理?
  • 超时和重试策略如何设置?

根据不同业务场景(如读请求、写请求,高并发与非高并发),处理策略应该有所不同,不能一概而论。

4. 批量处理替代单次处理

在需要多次执行 RPC 或数据库操作时,如果每次都在循环中调用单次接口,而不采用批量处理,将大大降低性能,尤其是在大量数据场景下。 此外,在循环体中添加日志记录时也要注意,避免生成大量日志,消耗磁盘资源。

5. 复杂 SQL 需先执行计划

那种海量数据下多表关联查询的SQL语句,一次执行把整个数据库搞挂并不是完全的小概率事件。因此,如果你写完一个这样的SQL语句,一定要记得怀有敬畏之心地先执行一下,看看效果。记住,不要在测试环境的数据库中执行,因为有的公司的测试库和生产库的数据量是天差地别,数据分布形态也不一样,执行结果可能没有参考性。记得要去生产库的从库去执行,因为主库一旦出现问题,影响范围太大。从库也不要直接去执行,执行之前还是要explain一下,看看执行计划的。如果执行计划中出现了大表的type=all,那也就别再执行SQL了,把从库打挂了影响也不小,先想办法优化吧。

6. 扩展或新增,不直接修改

维护中台服务时,如果对业务全貌还不熟悉,不要轻易修改业务主流程,特别是在多个业务线共用同一服务的情况下。采用扩展或新增的方式,可以减少对已有功能的影响,避免牵一发而动全身的风险。

7. 重构而非重写

重构的目标是优化现有代码的结构,而非推翻重写。相比于重新编写整个系统,合理的重构可以提升代码的可维护性,避免造成大规模的业务中断。

牢记:重构是为了提高代码质量,而非推倒重来。

8. 非必要,不引入

在满足业务需求的前提下,技术方案越简单越好。例如:

  • 如果 MySQL 足以承受业务请求压力,就不需要引入 Redis 或 ES。
  • 如果同步调用能够满足业务需求,就不要盲目使用异步 MQ。
  • 如果简单coding即可高效迭代的需求,那就绝对不引入设计模式;

过度引入新技术不仅增加了系统复杂性,也提高了维护成本。一个出色的工程师,他的特质是喜欢迎接挑战,但一个营收惊人的关键系统,对它最好的方式是杜绝挑战。

9. 保证数据一致性

当业务系统采用多数据源时(如 MySQL 主从模式或 MySQL + Redis 组合),需明确哪个是主数据源,发生数据不一致时以主数据源为准。此外,需设计策略确保多数据源最终一致性,以免系统埋下隐患。

10. 避免过度前瞻性设计

有些工程师在项目初期就着眼于未来的高并发或大规模扩展,过早地拆分微服务、进行数据库分库分表。这种过度设计会增加开发和调试难度,尤其是在业务前景不明朗的情况下,可能导致资源浪费。 我们要根据实际业务情况设计系统,保持简单而实用,避免不必要的复杂性。


http://www.ppmy.cn/news/1541436.html

相关文章

数智合同 | 业财一体与履约联动的数字化转型

随着信息化技术的发展,合同数智化管理为应对合同管理挑战提供了新机遇。企业需要深入思考数智化手段在合同管理中的应用,以提高合同管理水平,应对新形势下的市场竞争挑战与合规要求,实现企业的高质量发展。 2024年5月,…

esxi配置磁盘直通虚拟机

基于VMware Exsi环境,考虑到特殊业务需求,需要直接将磁盘数据提供给虚拟机使用。 打开SSH服务 登录VMware vSphere Web Client控制台,主机-服务中启用安全Shell(SSH),通过SSH登录esxi服务器 配置磁盘直通 # 通过VMware vSpher…

vue3中可组合函数的应用场景

可组合函数(Composables)是 Vue 3 的组合式 API 中的一种设计模式,用于将可复用的逻辑封装成独立的函数,从而提高代码的模块化和复用性。可组合函数的核心目标是将复杂的逻辑拆分为小的、可管理的单元,然后在不同的组件…

Unity3D功耗和发热分析与优化详解

Unity3D作为广泛使用的游戏开发引擎,在游戏开发过程中,功耗和发热问题一直是开发者需要重点关注的问题。功耗和发热不仅影响用户体验,还可能对设备的硬件寿命造成一定影响。本文将从技术角度详细分析Unity3D游戏在移动设备上的功耗和发热问题…

第13篇:无线与移动网络安全

目录 引言 13.1 无线网络的安全威胁 13.2 无线局域网的安全协议 13.3 移动通信中的安全机制 13.4 蓝牙和其他无线技术的安全问题 13.5 无线网络安全的最佳实践 13.6 总结 第13篇:无线与移动网络安全 引言 无线和移动网络的发展为我们的生活带来了极大的便利…

如何从模块内部运行 Pytest

在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…

C++中的vector使用与实现

一、vector的使用 1.1 vector的定义 是一种类模板 template < class T, class Alloc allocator<T> > class vector; 其中的模板参数Alloc是在使用空间配置器&#xff08;内存池&#xff09;&#xff0c;并给了缺省值&#xff0c;暂时不深究 1.2遍历方式 1.…

万户ezEIP企业管理系统 productlist.aspx SQL注入漏洞复现

0x01 产品简介 万户ezEIP是一种企业资源规划软件,旨在帮助企业管理其各个方面的业务流程。它提供了一套集成的解决方案,涵盖了财务、供应链管理、销售和市场营销、人力资源等各个领域。 0x02 漏洞概述 万户ezEIP企业管理系统 productlist.aspx 接口存在SQL注入漏洞,未经身…