【新人指南】给新人软件开发工程师的干货建议

在我是新人时,如果有前辈能够指导方向一下,分享一些踩坑经历,或许会让我少走很多弯路,节省更多的学习的成本。

这篇文章根据我多年的工作经验,给新人总结了一些建议,希望对你会有所帮助。

在这里插入图片描述

写好注释

  • 没有注释的代码,不便于维护。
  • 我们要写好注释,但不能太啰嗦,要给关键或者核心的代码增加注释。我们可以写某个方法是做什么的,主要步骤是什么,给算法写个demo示例等。
  • 这样以后过了很长时间,再去看这段代码的时候,也会比较容易上手。

单元测试

  • 比如新写了某个Util工具类,他们会同时在test目录下,给该工具类编写一些单元测试代码。
  • 很多小伙伴觉得写单元测试是浪费时间,没有这个必要。
  • 多写单元测试对开发来说,是一个非常好的习惯,有助于提升代码质量。
  • 即使因为当初开发时间比较紧,没时间写单元测试,也建议在后面空闲的时间内,把单元测试补上。

SQL 执行计划

  • 我们在写完查询SQL语句之后,有个好习惯是用explain关键字查看一下该SQL语句有没有走索引。
  • 对于数据量比较大的表,走了索引和没有走索引,SQL语句的执行时间可能会相差上百倍。
  • 因此建议大家多用explain查看SQL语句的执行计划,在SQL进行优化的时候找出具体慢的原因,给出相应的优化方案。
  • 可参考:https://blog.csdn.net/u010800804/article/details/109594810

上线整理checklist

  • 在系统上线之前,一定要整理上线的清单,即我们说的:checklist。
  • 系统上线有可能是一件很复杂的事情,涉及的东西可能会比较多。
  • 假如服务A依赖服务B,服务B又依赖服务C。这样的话,服务发版的顺序是:CBA,如果顺序不对,可能会出现问题。
  • 有时候新功能上线时,需要提前执行sql脚本初始化数据,否则新功能有问题。
  • 如上线前需在配置中心、任务调度中心进行相关配置,不然项目启动可能异常。
  • 上线完成之后,需要增加相应的菜单,给指定用户或者角色分配权限。
  • 系统上线,整个过程中,可能会涉及多方面的事情,我们需要将这些事情记录到checklist当中,避免遗漏。

接口文档

  • 接口文档对接口提供者,和接口调用者来说,都非常重要。
  • 如果你没有接口文档,别人咋知道你接口的地址是什么,接口参数是什么,请求方式时什么,接口多个参数分别代码什么含义,返回值有哪些字段等等。
  • 他们不知道,必定会多次问你,无形当中,增加了很多沟通的成本。
  • 如果你的接口文档写的不好,写得别人看不懂,接口文档有很多错误,比如:输入参数的枚举值,跟实际情况不一样。
  • 接口文档也分为内部接口文档,主要和前端进行联调;一种是openapi接口文档,交付与别人的接口一定经过开发自测的,不能让前端一调用接口直接报错等情况,这样不光把自己坑了,也会把别人坑惨。
  • 因此,写接口文档一定要写好,一定不要马马虎虎应付差事

业务提前评估请求量

  • 我们在设计接口的时候,要跟业务方或者产品经理确认一下请求量。
  • 比如经常调用的接口是不是要缓存还是直接查询数据库,某些业务是不是要加锁等情况。
  • 假如你的接口只能承受100qps,但实际上产生了1000qps。
  • 这样你的接口,很有可能会承受不住这么大的压力,而直接挂掉。
  • 此外,还需要对接口做限流,防止别人恶意调用你的接口,导致服务器压力过大。
  • 限流的话,可以基于用户ID、IP地址、接口地址等多个维度同时做限制。
  • 可以在nginx层,或者网关层做限流。

接口幂等设计

  • 我们在设计接口时,一定要考虑并发调用的情况。
  • 比如:用户在前端页面,非常快的点击了两次保存按钮,这样就会在极短的时间内调用你两次接口。
  • 如果不做幂等性设计,在数据库中可能会产生两条重复的数据。
  • 还有一种情况时,业务方调用你这边的接口,该接口发生了超时,它有自动重试机制,也可能会让你这边产生重复的数据。
  • 所以我们在开发过程中,根据实际业务场景进行幂等设计及限制,如果接口并发量不太大,推荐大家使用在表中加唯一索引的方案,更加简单。

接口参数调整慎重

  • 有时候我们提供的接口,需要调整参数。
  • 比如:新增加了一个参数,或者参数类型从int改成String,或者参数名称有status改成auditStatus,参数由单个id改成批量的idList等等。
  • 建议涉及到接口参数修改一定要慎重。
  • 修改接口参数之前,一定要先评估调用端和影响范围,不要自己偷偷修改。如果出问题了,调用方后面肯定要苦逼啦。
  • 我们在做接口参数调整时,要做一些兼容性的考虑。
  • 对于修改参数名称的情况,我们可以增加一个新参数,来接收数据,老的数据还是保留,代码中做兼容处理。

生产环境,数据备份

  • 有时候,线上数据出现了问题,我们需要修复数据,但涉及的数据有点多。
  • 这时建议在处理线上数据前,一定要先备份数据。
insert into member_20230806 select * from member
  • 数据备份之后,万一后面哪天数据处理错了,我们可以直接从备份表中还原数据,防止悲剧的产生。

合理设置字段类型和长度

  • 我们在设计表的时候,要给相关字段设置合理的字段类型和长度。
  • 如果字段类型和长度不够,有些数据可能会保存失败。
  • 以下原则可以参考一下:

尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选。
如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择varchar类型。
是否字段,可以选择bit类型。
枚举字段,可以选择tinyint类型。
主键字段,可以选择bigint类型。
金额字段,可以选择decimal类型。
时间字段,可以选择timestamp或datetime类型。

避免一次性查询太多数据

  • 我们在设计接口,或者调用别人接口的时候,都要避免一次性查询太多数据。
  • 一次性查询太多的数据,可能会导致查询耗时很长,更加严重的情况会导致系统出现OOM的问题。
  • 在做excel导出时,如果一次性查询出所有的数据,导出到excel文件中,可能会导致系统出现OOM问题。
  • 如果调用第三方批量查询接口,对性能有一定的要求,我们可以分批之后,用多线程调用接口,最后汇总返回数据。

事务问题

  • 很多时候,我们的代码为了保证数据库多张表保存数据的完整性和一致性,需要使用@Transactional注解的声明式事务,或者使用TransactionTemplate的编程式事务。
  • 加入事务之后,如果A,B,C三张表同时保存数据,要么一起成功,要么一起失败。
  • 不会出现数据保存一半的情况,比如:表A保存成功了,但表B和C保存失败了。
  • 这种情况数据会直接回滚,A,B,C三张表的数据都会同时保存失败。
  • 此外,引入事务还会带来大事务问题,可能会导致接口超时,或者出现数据库死锁的问题。
  • 因此,我们需要优化代码,尽量避免大事务的问题,因为它有许多危害。

优先使用批量操作

  • 在一个for循环中,一个个调用远程接口,或者执行数据库的update操作。
  • 我们尽可能将在一个循环中多次的单个操作,改成一次的批量操作,这样会将代码的性能提升不少。
for(User user : userList) {userMapper.update(user);
}
userMapper.updateForBatch(userList);

synchronized问题

  • 我们在面试中当中,经常会被面试官问到synchronized加锁的考题。
  • 但在实际工作中,使用synchronized加锁的机会不多。
  • synchronized更适合于单机环境,可以保证一个服务器节点上,多个线程访问公共资源时,只有一个线程能够拿到那把锁,其他的线程都需要等待。
  • 但实际上我们的系统,大部分是处于分布式环境当中的。
  • 为了保证服务的稳定性,我们一般会把系统部署到两个以上的服务器节点上。
  • 后面哪一天有个服务器节点挂了,系统也能在另外一个服务器节点上正常运行。
  • 这时使用synchronized加锁也会有问题。
  • 因此,在工作中更多的是使用分布式锁。

数据库悲观锁。
基于时间戳或者版本号的乐观锁。
使用redis的分布式锁。
使用zookeeper的分布式锁。

异步思想

  • 做过接口的性能优化,其中有一个非常重要的优化手段是:异步。
  • 如果我们的某个保存数据的API接口中的业务逻辑非常复杂,经常出现超时问题。
  • 先从索引,sql语句优化。
  • 如果该接口的实时性要求不高,我们可以用一张表保存用户数据,然后使用job或者mq,这种异步的方式,读取该表的数据,做业务逻辑处理。
  • 对于非核心逻辑,可以使用job或者mq这种异步的方式处理。

Git提交代码要有好习惯

  • 用Git提交代码有个好习惯是:多次提交。
  • 避免一次性提交太多代码的情况。
  • 这样可以减少代码丢失的风险。
  • 更重要的是,如果多个人协同开发,别人能够尽早获取你最新的代码,可以尽可能减少代码的冲突。
  • 假如你开发一天的代码准备去提交的时候,发现你的部分代码,别人也改过了,产生了大量的冲突。
  • 如果你能够多次提交代码,可能会及时获取别人最新的代码,减少代码冲突的发生。因为每次push代码之前,Git会先检查一下,代码有没有更新,如果有更新,需要你先pull一下最新的代码。
  • 此外,使用Git提交代码的时候,一定要写好注释,提交的代码实现了什么功能,或者修复了什么bug。

开源工具类

  • 我们一定要多熟悉一下开源的工具类,真的可以帮我们提升开发效率,避免在工作中重复造轮子。
  • hutool 可以帮忙解决日常工作的大部分util。

技术博客

  • 我们在学习新知识点的时候,学完了之后,非常容易忘记。
  • 往往学到后面,把前面的忘记了。
  • 因此,建议大家培养做笔记的习惯。
  • 我们可以通过写技术博客的方式,来记笔记,不仅可以给学到的知识点加深印象,还能锻炼自己的表达能力。
  • 此外,工作中遇到的一些问题,以及解决方案,都可以沉淀到技术博客中。
  • 一方面是为了避免下次犯相同的错误。
  • 另一方面也可以帮助别人少走弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78459.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Map修改key的问题

需求 现在返回json数据带有分页的数据,将返回data属性数据变更为content,数据不变,key发生变化 实现1,源数据比较复杂,组装数据比较麻烦 说明:如果使用这种方式完成需求,需要创建对象&#xff0…

C++ 多态 虚函数表

文章目录 简易抽象理解多态多态的具体实现虚函数的定义虚函数的重写重定义(隐藏)、重载 、重写(覆盖)区别C11 override 和 final 关键字抽象类的定义接口继承和实现继承多态的原理:虚函数表单继承和多继承关系的虚函数…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件,内容如下: # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

物联网工程开发实施,应该怎么做?

我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 物联网工程的概念 物联网工程是研究物联网系统的规划、设计、实施、管理与维护的工程科学,要求物联网工程技术人员根 据既定的目标,依照国家、行业或企业规范,制定物联网…

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT? Visual ChatGPT 是一个包含 Visual Foundation 模型 (VFM) 的系统,可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…

Java抽象类和接口【超详细】

文章目录 一、抽象类1.1 抽象类概念1.2 抽象类语法1.3 抽象类特性1.4 抽象类的作用 二、接口2.1 接口的概念2.2 语法规则2.3 接口使用2.4 接口特性2.5 实现多个接口2.6 接口间的继承2.7 接口使用实例2.8Clonable 接口和深拷贝2.9 抽象类和接口的区别 一、抽象类 1.1 抽象类概念…

MySQL索引1——索引基本概念与索引结构(B树、R树、Hash等)

目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引,就是对数据库表中某些列的值通过不同的数据结…

Flask简介与基础入门

一、了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档。 1、一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序…

WSL 2 installation is incomplete的解决方案

问题描述 解决方案 在Windows功能中开启Hyper-v 如果没有Hyper-v选项,新建文本粘贴以下内容后以.cmd为后缀保存后执行即可 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.t…

Julia 字典和集合

数组是一种集合,此外 Julia 也有其他类型的集合,比如字典和 set(无序集合列表)。 字典 字典是一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用 > 分割,每个键值对之间用逗…

OSLog与NSLog对比

NSLog: NSLog的文档,第一句话就说:Logs an error message to the Apple System Log facility.,所以首先,NSLog就不是设计作为普通的debug log的,而是error log;其次,NSLog也并非是printf的简单…

前端学习---vue2--选项/数据--data-computed-watch-methods-props

写在前面: vue提供了很多数据相关的。 文章目录 data 动态绑定介绍使用使用数据 computed 计算属性介绍基础使用计算属性缓存 vs 方法完整使用 watch 监听属性介绍使用 methodspropspropsData data 动态绑定 介绍 简单的说就是进行双向绑定的区域。 vue实例的数…

Java课题笔记~ IoC 控制反转

二、IoC 控制反转 控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的 装配和管理。控制反转就是对对象控制权的转移&a…

为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、stylelint)

因历史遗留原因,接手的项目没有代码提醒/格式化,包括 eslint、pretttier,也没有 commit 提交校验,如 husky、commitlint、stylelint,与其期待自己或者同事的代码写得完美无缺,不如通过一些工具来进行规范和…

FFmpeg中硬解码后深度学习模型的图像处理dnn_processing(一)

ffmpeg 硬件解码 ffmpeg硬件解码可以使用最新的vulkan来做,基本上来说,不挑操作系统是比较重要的,如果直接使用cuda也是非常好的选择。 AVPixelFormat sourcepf AV_PIX_FMT_NV12;// AV_PIX_FMT_NV12;// AV_PIX_FMT_YUV420P;AVPixelFormat d…

SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》:让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业(餐厅、饭店&#x…

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网:https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…

Spring Cloud Gateway

一 什么是Spring Cloud Gateway 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。相比 Zuul 来说,Spring Clo…

redis 集群 2:分而治之 —— Codis

在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘。首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载…

ROS添加节点

1 下载项目源码 (1)这里我使用是哔哩哔哩的博主源码机器人工匠王杰 https://github.com/6-robot/wpr_simulation.git (2)建立工作空间 在主目录下载建立如下文件夹 catkin_ws----       ----src (3)…