程序员成长之路心得篇——高效编码诀窍
随着AIGC的飞速发展,程序员越来越能够感受到外界和自己的压力。如何能够在AI蓬勃发展的时代不至于落后,不至于被替代?项目的开发效率起了至关重要的作用。
首先提出几个问题:
- 如何实现高效编程?
- 高效编程的核心在于哪里?
1. 如何实现高效编程?
1) 积累编程的经验,提升对公司开发架构的认知
现在让我们设想一下这个场景:
你的上级要求你在3天之内完成一个项目,这个项目不算容易实现,需要用到定时任务框架、消息推送和excel导入导出功能。如果你是一名初级程序员或者刚入职不久的新员工,这个工作可能会有点困难,作为初级程序员的你缺少开发经验,而作为刚入职不久的员工,你缺少对公司架构的了解。那么我们应该怎么做呢?
没错,要想实现高效编程,我们首先需要积累编程的经验,提升对公司开发架构与系统的认知。积累编程的经验,不仅仅是多写代码,还应该提升问题的处置能力,避免两次踩在同一个坑里。
针对初级程序员或入行不久的新员工而言,和经验丰富的同事一同开发项目可以快速增长问题处理能力,也就是所谓的带教。在带教过程中,遇到问题相互讨论,形成良好的技术探讨氛围也会起到较好的提升作用;而针对中级程序员或者更为高级的程序员而言,则需要在问题处理中逐步形成自己的“体系”,每次遇到错误或者问题就依照自己的体系去排查问题,并在处理完成后及时更新自己的错误数据集。
2) 实现代码的重用
现在让我们设想一下另一个场景:
我们每天都在写代码,但是效率却并没有因此而提高,并且随着项目的增多,反而增加了我们代码量和编码压力。如何处理这些冗长复杂的代码,既可以减轻我们的编码负担,也可以提升代码质量呢?
要想实现高效编程,进阶的方式就是实现代码的重用。我们也许听说过一则趣味小故事,一个程序员很喜欢随身携带一个u盘,里面记录了他所有开发过的项目,但是有一天,他遗失了他那宝贵的u盘,他便自叹自己的职业生涯到头了。
当时看到这个故事我的第一反应是,这个程序员起码不是个菜鸟,他会把自己的代码保存并且复用,方便后续系统的开发。而现实是很多的程序员并没有做到这一点,他们可能整天写着增删改查,活在自己的舒适圈里,自认为自己“勤快”,却从没想过“偷懒”。
那么,如何实现代码重用呢?
作为一名经验较为丰富的java开发工程师,我会首先想到利用反射、注解、泛型、枚举和设计模式等工具去进行代码功能的构建。比如说最简单的检验数据是否为空,我会先编一个注解.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotBlank {String message() default "参数不能为空";
}
然后利用反射获取某一个类及其父类中的所有DeclaredFields,也就是所有的成员变量,包括私有的,然后获取里面加了注解的变量,检查是否为空,为空就抛异常。
/*** 实体工具类* @author zyl*/
@Slf4j
public class EntityUtils {public static <T> boolean verifyIsEmpty(T entity) {if (entity == null) {throw new MyException("实体类为空");}try {Class<?> cls = entity.getClass();String clsName = cls.getSimpleName();while (!"Object".equalsIgnoreCase(clsName.trim())) {Field[] fields = cls.getDeclaredFields();for (Field f : fields) {f.setAccessible(true);NotBlank anno = f.getAnnotation(NotBlank.class);if (anno != null) {Object obj = f.get(entity);if (obj == null || "".equals(obj)) {throw new MyException(anno.message());}if (obj instanceof List && ((List) obj).isEmpty()) {throw new MyException(anno.message());}String str = String.valueOf(obj);if (str.isEmpty()) {throw new MyException(anno.message());}}}cls = cls.getSuperclass();clsName = cls.getSimpleName();}return false;} catch (Exception ex) {log.error(ex.getMessage());throw new MyException(ex.getMessage());}}
}
如果想不到用这种方式,也可以退而求其次,使用spring自带的@NotBlank注解实现以上功能。
代码重用的第二种途径就是组件的编写。这个对于编程能力有一定的要求,比如设计模式,比如对于组件整体功能的把握等。但一旦学会了组件的封装和使用,那么对于一般的业务系统开发而言,效率将会大幅提高。打个比方,将木头加工成轮子是麻烦的,但是由轮子组装成车架却变得简单了。
更高阶的就是自己实现代码生成器,也就是自己写一套代码生成框架。这个可太难了,哈哈。不过好在市场上已经有了较为成熟的代码生成工具,如阿里的宜搭,百度的爱速搭等。
高效编程的核心
- 重复的事情标准化,标准的事情自动化。一昧努力不可取,有时候偷懒才是王道。
- 积累经验,保持虚心学习的态度。
相关文章:

程序员成长之路心得篇——高效编码诀窍
随着AIGC的飞速发展,程序员越来越能够感受到外界和自己的压力。如何能够在AI蓬勃发展的时代不至于落后,不至于被替代?项目的开发效率起了至关重要的作用。 首先提出几个问题: 如何实现高效编程?高效编程的核心在于哪里ÿ…...

matlab使用教程(6)—线性方程组的求解
进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax b 或 xA b? 考虑一维示例具有指导意义。例如,方程 …...

Verilog语法学习——边沿检测
边沿检测 代码 module edge_detection_p(input sys_clk,input sys_rst_n,input signal_in,output edge_detected );//存储上一个时钟周期的输入信号reg signal_in_prev;always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)signal_in_prev < 0;else…...

springboot和springcloud的联系与区别
什么是springboot? Spring Boot是一个用于简化Spring应用程序开发的框架,它提供了一种约定优于配置的方式,通过自动配置和快速开发能力,可以快速搭建独立运行、生产级别的Spring应用程序。 在传统的Spring应用程序开发中…...

【Web开发指南】如何用MyEclipse进行JavaScript开发?
由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性,进行JavaScript编码不再是一项繁琐的任务。 MyEclipse v2023.1.2离线版下载 JavaScript项目 在MyEclipse 2021及以后的版本中,大多数JavaScript支持都是开箱即用的JavaScript源代码…...

【C++进阶】多态
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…...

决策树的划分依据之:信息增益率
在上面的介绍中,我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性,则根据信息增益公式可计算出它的信息增益为 0.9182,远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…...

SolidUI社区-独立部署 和 Docker 通信分析
背景 随着文本生成图像的语言模型兴起,SolidUI想帮人们快速构建可视化工具,可视化内容包括2D,3D,3D场景,从而快速构三维数据演示场景。SolidUI 是一个创新的项目,旨在将自然语言处理(NLP)与计算机图形学相…...

Windows下FreeImage库的配置
首先下载FreeImage库,http://freeimage.sourceforge.net/download.html,官网下载如下: 内部下载地址:https://download.csdn.net/download/qq_36314864/88140305 解压后,打开FreeImage.2017.sln,如果是vs…...

用python编写一个小程序,如何用python编写软件
大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1、python可以写手机应用程序吗? 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是…...

WPF实战学习笔记32-登录、注册服务添加
增加全局账户名同步 增加静态变量 添加文件:Mytodo.Common.Models.AppSession.cs ausing Prism.Mvvm; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; us…...
XGBoost的参数
目录 1. 迭代过程 1.1 迭代次数/学习率/初始𝐻最大迭代值 1.1.1 参数num_boost_round & 参数eta 1.1.2 参数base_score 1.1.3 参数max_delta_step 1.2 xgboost的目标函数 1.2.1 gamma对模型的影响 1.2.2 lambda对模型的影响 2. XGBoost的弱评估器 2.…...

【已解决】windows7添加打印机报错:加载Tcp Mib库时的错误,无法加载标准TCP/IP端口的向导页
windows7 添加打印机的时候,输入完打印机的IP地址后,点击下一步,报错: 加载Tcp Mib库时的错误,无法加载标准TCP/IP端口的向导页 解决办法: 复制以下的代码到新建文本文档.txt中,然后修改文本文…...

用于紫外线消毒灯的LED驱动:数明深紫外消毒方案SLM201
用于紫外线消毒灯的LED驱动SLM201 应用于紫外线消毒灯的LED驱动。疫情过后让越来越多的人开始注重起个人健康,除了出门佩戴口罩外,对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外,利用紫外线灯给衣物表面、房间消毒也…...

Docker部署Springboot应用【mysql部署+jar部署+Nginx部署】
【项目达到目标】 1.基本准备 2、mysql部署 3、jar部署 4、Nginx部署 一、基本准备 石工拿的就是之前放置在我们服务器上的应用进行部署,主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 二、mysql部署 docker run -d --name mysql \ …...

EMC VNX1系列存储电池状态说明
SPS电池正常的状态为“Present”。 SPS电池故障时的状态为“Faulted”。 更换SPS后,SPS开始充电,此时状态显示为“Not Ready”状态。 充电完成后显示为Present状态。如果充电完成后状态前面有“F”标记,则需要重启对应的控制器以更新SPS…...

pyspark 判断 Hive 表是否存在
Catalog.tableExists(tableName: str, dbName: Optional[str] None) → booltableName:表名 dbName:库名(可选) return:bool 值 spark SparkSession \.builder \.appName(tableExists) \.config(spark.num.executors, 6) \.config(spark.executor.memo…...

选择排序算法
选择排序 算法说明与代码实现: 以下是使用Go语言实现的选择排序算法示例代码: package mainimport "fmt"func selectionSort(arr []int) {n : len(arr)for i : 0; i < n-1; i {minIndex : ifor j : i 1; j < n; j {if arr[j] < a…...

快速了解MyBatis---映射关系多对一
文章目录 映射关系多对一映射关系-官方文档映射关系多对1-基本介绍基本介绍注意细节 映射关系多对1-映射方式映射方式配置Mapper.xml 方式-应用实例注解实现多对1 映射-应用实例 映射关系多对一 映射关系-官方文档 文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.ht…...

python学到什么程度算入门,python从入门到精通好吗
本篇文章给大家谈谈python学到什么程度算入门,以及python从入门到精通好吗,希望对各位有所帮助,不要忘了收藏本站喔。 学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象2. 模块和类皆对象3. 对象的基本操作 (1). 可以赋值给变量(2). …...

整数规划——第一章 引言
整数规划——第一章 引言 整数规划是带整数变量的最优化问题,即最大化或最小化一个全部或部分变量为整数的多元函数受约束于一组等式和不等式条件的最优化问题。许多经济、管理、交通、通信和工程中的最优化问题都可以用整数规划来建模。 考虑一个电视机工厂的生产…...

C语言结构体讲解
目录 结构体的声明 结构的基础知识 结构的声明 为什么要出现结构体? 结构成员的类型 结构体变量的定义和初始化 定义:(全局变量//局部变量) 初始化: 结构体成员的访问 结构体传参 结构体的声明 结构的基础知识…...

021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结
021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结 上节内容中,初步实现了FatFs文件系统的移植,并且实现了设备的挂载、文件打开/关闭与读写功能,这里对上节遗留的一些问题进行总结,并且继续完善文件…...

jQuery如何获取动态添加的元素
jQuery如何获取动态添加的元素 使用 on()方法 本质上使用了事件委派,将事件委派在父元素身上 自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品,但是由于on()方法必须有事件,没有事件时可选择de…...

Keepalived 在CentOS 7安装并配置监听MySQL双主
keepalived安装 MySQL双主配置请看这里:https://tongyao.blog.csdn.net/article/details/132016200?spm1001.2014.3001.5502 128、129两台服务器安装步骤相同,配置文件不同,下面有介绍。 1.安装相关依赖包,并下载keepalived安…...

深度学习,神经网络介绍
目录 1.神经网络的整体构架 2.神经网络架构细节 3.正则化与激活函数 4.神经网络过拟合解决方法 1.神经网络的整体构架 ConvNetJS demo: Classify toy 2D data 我们可以看看这个神经网络的网站,可以用来学习。 神经网络的整体构架如下1: 感知器&…...

中国AI大模型峰会“封神之作”!开发者不容错过这场夏季盛会
年度最强大模型顶会来袭!喊话中国数百万AI开发者,速来! 硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过! 前瞻大模型发展趋势,紧跟这场大会! 中国科技超级碗,大模型最新前…...

Android Studio多渠道打包
使用环境: Android studio 多渠道打包 使用方法: 1 APP下build.gradle文件 flavorDimensions "default"productFlavors {huawei {dimension "default"manifestPlaceholders [ channel:"huawei" ]}xiaomi {dimension &…...

RK3566 Android11默认客户Launcher修改
前言 客户需要默认自己的Launcher为home,同时保留系统的Launcher3. 解决办法:在启动home应用之前设置一下默认Launcher。查找home app启动相关资料,找到了frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java的startHomeOnTaskDisplayA…...

ORB算法在opencv中实现方法
在OPenCV中实现ORB算法,使用的是: 1.实例化ORB orb cv.xfeatures2d.orb_create(nfeatures)参数: nfeatures: 特征点的最大数量 2.利用orb.detectAndCompute()检测关键点并计算 kp,des orb.detectAndCompute(gray,None)参数:…...