当前位置: 首页 > article >正文

用 Copilot 一年后,我的代码质量变好了还是变差了?

01 从怀疑到离不开去年这个时候GitHub Copilot 刚在我们小组里小范围开放试用。我当时的态度是不屑一顾的——一个 AI 能懂多少逻辑代码补全不还是靠 IDE 的智能提示况且我学了几年 Java写过多少个项目什么场景没见过哪轮得到一个“实习生”来教我写代码。转折发生在一个赶课程设计 deadline 的周末。隔壁组的同学用 Copilot 十分钟写完了一个数据清洗工具而我还在翻 Apache Commons 的文档。那天晚上我提交了 Copilot 的试用申请。一年后的今天我每天写代码大概有 30%~40% 的内容是 AI 补全的。这篇文章想抛开那些“AI 取代程序员”的宏大叙事从一个普通计算机专业学生的视角聊聊这一年我踩过的坑、省下的时间以及它对代码质量真实的影响。02 那些 Copilot 让我“真香”的瞬间2.1 写单元测试它连边界值都想到了以前写单元测试是我最抗拒的活尤其是给课程作业补测试。自从用了 Copilot我的习惯变成了先写函数签名然后空一行敲个// test剩下的交给它。举个例子最近写一个计算折扣的方法javapublic BigDecimal calculateDiscount(BigDecimal amount, String userLevel) { // 空值检查 if (amount null || userLevel null) { throw new IllegalArgumentException(参数不能为空); } // 金额为0或负数直接返回原值 if (amount.compareTo(BigDecimal.ZERO) 0) { return amount; } // 根据会员等级计算折扣 switch (userLevel) { case VIP: return amount.multiply(new BigDecimal(0.8)); case GOLD: return amount.multiply(new BigDecimal(0.9)); default: return amount; } }我在测试类里敲Test然后写下注释java// 测试普通用户无折扣 // 测试VIP用户8折 // 测试金额为0的情况 // 测试传入null抛异常Copilot 生成的测试代码几乎覆盖了所有分支连BigDecimal的比较方式都处理对了。我只需要微调几个数值测试覆盖率直接从 60% 飙到 90%。2.2 写重复代码它比我记得牢做后端最烦的是写 DTO、写 Mapper、写 Feign 接口。以前靠复制粘贴改字段名总有漏改的时候。现在只要定义好实体Copilot 能顺着我的命名习惯把 getter/setter、构造器、Builder 全补出来。有次写一个二十多个字段的 VO我刚敲完第一个字段它直接给了我完整的类定义包括ApiModelProperty注解。虽然还得人工确认一遍但至少省了五分钟。2.3 写复杂 SQL它是个不错的参谋上周需要写一个统计报表 SQL关联五张表还有各种 group by 和子查询。我写了一版跑出来数据不对。然后在注释里写了一句sql-- 用窗口函数重写按部门分组取每个部门工资最高的前3名Copilot 给了两种实现虽然不完全符合业务但其中一种用ROW_NUMBER()的思路启发了我最后结合自己的需求改出来了。这种“半成品”帮助比直接搜 Stack Overflow 更高效。03 那些 Copilot 让我“翻车”的瞬间3.1 它生成过时 API今年初我在写一个 Spring Boot 3 项目Copilot 还在给我推荐spring-boot-starter-web的 2.x 版本并且用了WebMvcConfigurerAdapter这个类在 Spring 5 就废弃了。如果不注意直接复制就会埋坑。现在养成习惯每次它补全依赖或旧 API我都会下意识去官网确认一下版本。3.2 它不懂项目上下文Copilot 只能看到当前打开的文件不知道你整个项目的架构。有次它建议一个工具类方法里面用到了commons-lang3的StringUtils而我项目里统一用的是 Guava 的Strings。引入的依赖不一样直接编译报错。后来我学会在写关键代码前先把相关文件比如常量类、工具类也打开让 Copilot 多看到一些上下文。3.3 它太“热心”了有时候我只是想写一个简单的 for 循环它直接把整个业务逻辑都补完了而且补的是错的。比如我在写javafor (int i 0; i list.size(); i) { // 这里只需要打印日志 }Copilot 非要帮我补上“处理每个元素并存入数据库”的逻辑完全不是我想要的。现在看到它乱补直接按Esc拒绝或者改成手动模式。04 我是怎么“驯服”Copilot 的经过一年的磨合我总结了几条让 Copilot 更好用的经验4.1 写好注释比写好代码更重要Copilot 是根据注释和上文来猜的。你写“根据用户ID查询用户”它大概率给一个正确的实现你写“处理数据”它可能给一个千奇百怪的版本。我现在会刻意写意图明确的注释python# 输入用户ID列表输出用户名字典 {user_id: user_name} # 只返回状态为ACTIVE的用户名字全部大写这样生成的代码基本不用改。4.2 核心逻辑自己写体力活交给它业务核心、安全逻辑、复杂算法我坚持手写。工具类、测试数据、配置文件、重复的 CRUD放心交给 Copilot。人机分工明确效率最高。4.3 定期“喂”它好的样本如果项目里有自己封装的工具类我会在写代码时先引用它让 Copilot 看到。比如项目里统一用Result类返回Copilot 看到几次后生成的 Controller 方法就会自动返回ResultT而不是随便一个对象。4.4 永远保持怀疑每次它生成一段代码我都会问自己这段逻辑对吗有没有边界情况没处理性能怎么样有没有安全隐患把它当实习生需要复核。05 对团队协作的连锁反应5.1 代码 review 的重点变了以前在实验室项目里 review 主要看语法、规范、有没有低级错误。现在这些 AI 基本帮我们解决了review 更关注设计合理性、扩展性、AI 没考虑到的场景。有人开玩笑说现在 review 是“人帮人看 AI 写的代码”但我觉得这是好事。5.2 新人上手变快了去年新加入实验室的一个学弟两周就能独立写业务代码。他自己说Copilot 帮他省去了查 API 的时间可以更专注理解业务。但我们也会刻意让他手写一些关键代码防止过度依赖。5.3 安全隐患浮出水面有次 Copilot 生成了一段代码里面居然包含一个硬编码的阿里云 AccessKey假的。虽然那是测试密钥但也提醒我们AI 训练数据来自公开代码那些被误传的密钥也可能被学进去。我们在 CI 里加了一步静态扫描自动检测可能的密钥泄露和 SQL 注入。06 一年后的复盘代码质量到底变好了还是变差了这个问题很难一概而论我试着分维度说可读性变好了。AI 生成的代码通常遵循主流规范命名也相对合理。正确性没太大变化因为核心逻辑还是人写的AI 只是辅助。性能有点下降。AI 倾向于生成“能跑就行”的代码不会主动考虑性能优化。比如它可能用双层循环而不是用 Map这点需要人工优化。可维护性看情况。如果 AI 生成的部分符合团队规范维护性就好如果它用了团队不用的库或模式反而增加维护成本。缺陷率有所下降因为单元测试覆盖率上来了很多低级 bug 在测试阶段就被发现。整体而言我的结论是代码质量没有自动变好但 AI 给了我们更多时间去关注质量。原来花在重复劳动上的时间现在可以用来做设计、写测试、优化性能。07 给正在尝试 AI 编程的同学一些建议别怕它也别信它。把它当成一个经验丰富但偶尔会出错的搭档保持警惕。从重复劳动开始用。写测试、写文档、写配置这些地方试错成本低。团队要有规范。规定哪些场景可以用 AI哪些必须手写生成的代码如何审查。关注数据安全。敏感项目慎用云端 AI 工具或者用私有化部署的方案。别丢掉基本功。如果你连基础的语法和算法都不懂AI 生成的代码错在哪你都看不出来。08 未来会怎样AI 编程工具还在快速迭代。我最近在试用 Copilot 的聊天模式可以直接问它“这段代码有什么问题”它居然能指出潜在的 NPE。相信再过一两年AI 不仅能生成代码还能帮我们做代码审查、性能分析、自动重构。但有一点我越来越确信AI 不会取代程序员但会用 AI 的程序员可能会取代不会用 AI 的程序员。这不是贩卖焦虑而是工具演进的自然结果。就像当年从汇编到高级语言从记事本到 IDE每一次效率跃迁都会重新定义开发者的能力模型。我们能做的就是拥抱它驯服它让它成为我们手中的工具而不是反过来。

相关文章:

用 Copilot 一年后,我的代码质量变好了还是变差了?

01 从怀疑到离不开去年这个时候,GitHub Copilot 刚在我们小组里小范围开放试用。我当时的态度是不屑一顾的——一个 AI 能懂多少逻辑?代码补全不还是靠 IDE 的智能提示?况且我学了几年 Java,写过多少个项目,什么场景没…...

电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索

电网电压扰动联系相光伏并网逆变器的控制 simukink仿真 电流闭环控制的逆变器并网 LCL 型输出滤波器 含有文档报告在光伏并网发电系统中,逆变器作为核心部件,其性能的优劣直接影响到电能质量和系统稳定性。而电网电压扰动是实际运行中不可避免的问题&am…...

内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南

在嵌入式开发的圈子里,很多工程师都经历过这种“阵痛”: 原本用得好好的高性能单片机(MCU),随着项目需求的增加——要接个高分辨率屏、要做个复杂的协议转换、要跑个轻量级语音识别,或者要处理多路音频流—…...

高速追剪程序之定长追剪实战

高速追剪程序,定长追剪,威纶触摸屏汇川5u全套程序,注释清楚。最近搞了个高速追剪的项目,用的是威纶触摸屏搭配汇川5u的全套程序,今天来跟大家分享一下。 整体思路 高速追剪的核心目标就是在物料高速运动过程中&#xf…...

提示词工程:这样跟AI说话,它才听你的!

哈,提示词是什么?简单来说,提示词(Prompt) 就是你向人工智能(比如我)发出的指令或问题。它是你用来描述“希望AI干什么”的那段文字。AI会根据你提供的提示词,来生成相应的回答或内容…...

微电网二次控制:下垂控制与基于数据采样二次控制的奇妙融合

微电网二次控制,下垂控制,基于数据采样的二次控制,补偿了下垂控制的偏差,实现了有功均分,效果好在微电网的运行控制领域,下垂控制和基于数据采样的二次控制是两个关键的技术点,它们相互配合&…...

无人零售/五金厂必看!边缘设备Java+YOLOv11推理稳定性全攻略:崩溃率从15%降到0.1%,断点续检1秒恢复

今年帮深圳南山的无人零售创业公司和东莞长安的五金厂同时做了边缘设备Java+YOLOv11推理的稳定性升级——无人零售那边是100个瑞芯微RK3588货架盘点设备,之前的崩溃率15%/天,每天要重启3-5次,数据丢失10%+,断点续检难,每次重启要重新盘点所有10个货架(10分钟),效率低,…...

STM32串口双机模拟汽车电量里程项目:Protues仿真与源码解析

STM32单片机开发的串口双机模拟汽车电量里程项目,两个STM32单片机进行数据交互,模拟主控与驱动传感器发送数据,可以手动调节数据,并显示屏显示出来。 包括程序源码和protues仿真8.12版本。 程序源码注释详细。 非常适合开发人员&a…...

基于Matlab的螺丝轮廓识别:数字图像处理流程

基于matlab的螺丝轮廓识别,matlab数字图像处理。 对输入图像进行灰度化,滤波,平滑操作然后进行阈值化,分割成二值图像,之后对图像进行图像的形态学操作,最终使用边缘检测算法提取边缘,最终获得十…...

SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录

作为后端开发者,业务日志是线上问题排查、操作追溯和审计留痕的核心抓手。手写业务日志不仅重复代码量大,还容易出现记录不规范、关键信息漏记错记的问题,排查线上问题时往往效率极低。最近我在SpringBoot3项目中接入了mzt-biz-log这款轻量业…...

搞嵌入式开发的小伙伴应该都遇到过PID调参这个头疼的问题吧?今天咱们直接上干货,聊聊怎么在STM32上玩转PID自整定和温度控制。先扔个核心代码片段镇楼

基于STM32开发的PID自整定和PID温控和PWM输出程序源码,采用反馈法进行PID参数自动整定,得出系统临界值比例增益,自动计算调节,使系统进入正常状态。 程序源码注释详细typedef struct {float Kp;float Ki;float Kd;float integral_…...

智能指针相关

零、预备知识 右值: 表示不可寻址的临时数据值。 根据C11标准,右值分为纯右值(如字面量、表达式结果)和将亡值(即将销毁的对象)。 右值具有不可修改、无持久内存地址的特性 右值引用&&、移动语义…...

当立体车库遇上PLC仿真

西门子1200PLC立体车库 33立体车库 博图触摸屏仿真 不需要实物 自带人机界面,动画,可以仿真 还有接线图原理图 现在拥有自动出入仓库的功能 IO表已列出最近捣鼓了个挺有意思的项目——基于西门子1200PLC的33立体车库仿真。不用焊线接电机,纯…...

HTML基础教程(一)

目录 一、HTML基本概念 二、基础HTML (Tag) 三、Html常用格式 一、HTML基本概念 什么是HTML文件? HTML的英文全称是Hypertext Marked Language,中文叫做“超文本标记语言”。和一般文本的不同的是,一个HTML文件不…...

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化 前言 如果 SFT(监督微调)后的模型是一个“懂事”的练习生,那么对齐后的模型就是一个“老练”的专家。 练习生虽然知道问答的格式,但依然存在两个…...

俄罗斯RT-2PM2“白杨-M“(Topol-M)洲际弹道导弹系统完整技术报告

Comprehensive Technical Report on Russias RT-2PM2 Topol-M Intercontinental Ballistic Missile System 报告日期:2026年3月11日 保密级别:公开来源情报(OSINT) 摘要(Executive Summary) RT-2PM2"…...

Java线程池面试题50道(含答案解析)

在Java后端开发面试中,线程池(ThreadPool) 是并发编程的重要考点之一。 在高并发系统中,合理使用线程池可以 提高系统性能、减少线程创建开销、避免资源耗尽。 很多互联网公司在面试Java工程师时都会重点考察: 线程池原…...

Clawdbot 杀红眼了,几天怒斩 80k+ Star!你真正的 AI 数字员工来了!!(附保姆级安装使用教程)

最近一款 AI 开源工具 Clawdbot 杀疯了,人送外号:大龙虾,短短几天时间,GitHub 上 Star 数量暴涨到 80k,因为名称与 Claude 相似,还被 Anthropic 公司警告被迫改名:Moltbot。 Moltbot 的核心是它…...

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署 还在为配置Python开发环境而头疼吗?从源码编译安装,要解决一堆依赖问题;手动下载安装包,又担心版本冲突和路径混乱。特别是当你需要Python 3.9这…...

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现 在机器视觉的工程实践中,我们常常需要将相机捕捉到的、由像素点构成的连续轮廓,转化为更高级、更易于理解和处理的几何基元,比如直线、圆弧或椭圆弧。这个过程…...

Keil5 vs Keil6:如何选择?附带Keil5中STM32开发环境搭建全攻略(含FreeRTOS移植准备)

Keil MDK 进化论:从经典到现代,如何为你的STM32项目选择最佳开发环境 作为一名在嵌入式领域摸爬滚打了多年的开发者,我至今还记得第一次打开Keil MDK时那种既兴奋又茫然的心情。那个经典的蓝色界面,几乎成了ARM Cortex-M开发的代名…...

第三期:基于立创·梁山派开发板的游戏机扩展板训练营全记录

第三期:基于立创梁山派开发板的游戏机扩展板训练营全记录 大家好,我是老张,一个在嵌入式行业摸爬滚打了十几年的工程师。最近,我作为导师完整地跟进了立创EDA举办的“梁山派游戏机扩展板训练营”第三期。看到很多朋友对如何从零开…...

OAuth2.0中state参数的深度应用:业务数据的安全传输与防CSRF实践

1. 不只是防CSRF:重新认识OAuth2.0的state参数 很多刚开始接触OAuth2.0的开发者,一看到state参数,第一反应就是“哦,防CSRF的”。这个理解没错,但只对了一半。在实际项目中,尤其是在需要深度集成的场景里&a…...

Ubuntu20.04下拯救者笔记本亮度调节失效?NVIDIA驱动加载顺序问题全解析

Ubuntu 20.04 下拯救者笔记本亮度调节失效?NVIDIA 驱动加载顺序问题全解析 最近在联想拯救者系列笔记本上安装 Ubuntu 20.04 的朋友,可能都遇到过同一个令人头疼的问题:屏幕亮度过高,刺眼得让人无法工作,而无论是系统设…...

SAR动目标检测系列:【5】多基线联合处理下的三维速度解耦

1. 从二维到三维:为什么我们需要多基线联合处理? 在上一篇文章里,我们聊透了如何利用单天线或者双天线SAR系统,去估计动目标的二维速度(也就是方位向和距离向的速度)。这就像你用手机拍一个移动的物体&…...

Flink实战:如何用KeyedProcessFunction实现温度异常检测(附完整代码)

从零构建实时温度异常检测系统:深入Flink KeyedProcessFunction核心实战 最近在帮一个做智慧农业的朋友处理温室大棚的监控数据,他们部署了上百个温湿度传感器,数据像潮水一样涌来。最头疼的不是数据量大,而是如何从这些实时流里快…...

KITTI 3D 数据可视化:从点云到鸟瞰图的实战解析

1. 从零开始:理解KITTI数据集与3D点云 大家好,我是老张,在自动驾驶这个行当里摸爬滚打了十来年,跟激光雷达和相机数据打了无数次交道。今天,我想跟你聊聊一个非常基础但又极其重要的技能:如何把KITTI数据集…...

内存马二:Filter

Filter内存马 源码学习 首先写一个普通的Filter了解一下重点数据的传递过程,断点到内部的一行,往上找。回到的是org.apache.catalina.core.ApplicationFilterChain#internalDoFilter,这部分找到filters找filters的赋值的地方,找到…...

uni-id-pages配置email

uniappuniclouduni-id-pages 配置邮箱教程 安装uni-id-pages插件下载插件并导入HbuilderX 修改/uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/send-email-code.js文件内容,将测试代码注释,添加发送邮件代码 // -- 测试代码// awai…...

Android 休眠机制详解 ——WakeLock、Doze 模式与待机功耗优化实战

前言 待机功耗高、耗电快、手表 / 手机一觉醒来掉电很多,90% 都是 “休眠没睡进去”。 一、为什么要讲 Android 休眠? 对手机 / 手表 / IoT 设备来说: 亮屏 性能息屏待机 续航 功耗测试的核心,就是看设备能不能正常休眠、睡不睡…...