乐于分享
好东西不私藏

AI编程助手入门:从代码补全到智能生成

AI编程助手入门:从代码补全到智能生成

欢迎来到新系列!前面我们聊完了提示词工程,今天进入实战领域——用AI辅助编程。无论你是新手还是老鸟,AI编程助手都能让你的效率翻倍。

一、为什么需要AI编程助手?

程序员的日常痛点

场景
痛点
AI能做什么
写重复代码
枯燥、容易出错
自动生成样板代码
查文档
频繁切换、打断思路
直接问AI,边写边查
Debug
盯日志盯到眼花
快速定位问题根源
学新技术
文档太多看不完
用自然语言问,AI总结要点
代码重构
不敢动、怕改坏
AI分析依赖,安全重构

主流工具一览

工具
特点
适合人群
GitHub Copilot
代码补全最强,IDE集成好
全栈开发者
Cursor
聊天式交互,代码生成强
喜欢对话式编程
Codeium
免费版 generous,速度快
预算有限的个人开发者
通义灵码
中文支持好,国内可用
国内开发者
CodeWhisperer
AWS生态集成
用AWS的开发者

推荐组合:Cursor(主力)+ Copilot(补全)

二、快速上手:5分钟进入状态

第一步:安装与配置

Cursor(推荐新手)

  1. 1. 下载安装:https://cursor.sh
  2. 2. 登录账号(支持GitHub/Google)
  3. 3. 导入VS Code配置(如果有)
  4. 4. 快捷键:Ctrl+L 打开聊天,Ctrl+K 内联编辑

GitHub Copilot

  1. 1. VS Code 插件市场搜索安装
  2. 2. 登录GitHub账号授权
  3. 3. 开始写代码,自动触发补全
  4. 4. 按 Tab 接受建议

第二步:熟悉核心交互

Cursor 三种模式

模式
快捷键
用途
侧边聊天
Ctrl+L
问问题、生成代码、解释代码
内联编辑
Ctrl+K
修改当前选中代码
终端AI
Ctrl+Shift+L
解释命令、生成命令

Copilot 核心操作

  • • 写注释 → 按回车 → 自动生成代码
  • • 写函数名 → 等待 → 按Tab接受补全
  • • 选中代码 → 右键 “Explain” → 获得解释

三、核心技能:代码生成

场景1:从注释生成代码

写法

# 写一个函数,接收一个URL,下载图片并保存到本地# 需要处理网络异常和文件已存在的情况

AI生成(Cursor Ctrl+K):

import requestsimport osfrom urllib.parse import urlparsedef download_image(url, save_dir="./downloads"):    """下载图片并保存到本地"""    try:        # 创建保存目录        os.makedirs(save_dir, exist_ok=True)        # 获取文件名        parsed = urlparse(url)        filename = os.path.basename(parsed.path) or "image.jpg"        filepath = os.path.join(save_dir, filename)        # 检查文件是否已存在        if os.path.exists(filepath):            print(f"文件已存在: {filepath}")            return filepath        # 下载图片        response = requests.get(url, timeout=30)        response.raise_for_status()        with open(filepath, 'wb') as f:            f.write(response.content)        print(f"下载成功: {filepath}")        return filepath    except requests.RequestException as e:        print(f"下载失败: {e}")        return None    except Exception as e:        print(f"发生错误: {e}")        return None

点评:异常处理、文件检查、目录创建都考虑到了,比自己写还周全。

场景2:生成样板代码

前端表单验证(Vue3 + TypeScript):

帮我生成一个登录表单组件,包含:- 用户名输入(必填,3-20字符)- 密码输入(必填,至少6位,显示/隐藏切换)- 表单验证逻辑- 提交按钮(带loading状态)

AI生成

<template>  <form @submit.prevent="handleSubmit" class="login-form">    <div class="form-item">      <label>用户名</label>      <input         v-model="form.username"         type="text"        placeholder="请输入用户名"        @blur="validateUsername"      />      <span v-if="errors.username" class="error">{{ errors.username }}</span>    </div>    <div class="form-item">      <label>密码</label>      <div class="password-input">        <input           v-model="form.password"           :type="showPassword ? &#x27;text&#x27; : &#x27;password&#x27;"          placeholder="请输入密码"          @blur="validatePassword"        />        <button type="button" @click="showPassword = !showPassword">          {{ showPassword ? &#x27;隐藏&#x27; : &#x27;显示&#x27; }}        </button>      </div>      <span v-if="errors.password" class="error">{{ errors.password }}</span>    </div>    <button type="submit" :disabled="isLoading">      {{ isLoading ? &#x27;登录中...&#x27; : &#x27;登录&#x27; }}    </button>  </form></template><script setup lang="ts">import { reactive, ref } from &#x27;vue&#x27;interface FormData {  username: string  password: string}interface FormErrors {  username?: string  password?: string}const form = reactive<FormData>({  username: &#x27;&#x27;,  password: &#x27;&#x27;})const errors = reactive<FormErrors>({})const showPassword = ref(false)const isLoading = ref(false)const validateUsername = (): boolean => {  if (!form.username) {    errors.username = &#x27;用户名不能为空&#x27;    return false  }  if (form.username.length < 3 || form.username.length > 20) {    errors.username = &#x27;用户名长度需在3-20字符之间&#x27;    return false  }  errors.username = undefined  return true}const validatePassword = (): boolean => {  if (!form.password) {    errors.password = &#x27;密码不能为空&#x27;    return false  }  if (form.password.length < 6) {    errors.password = &#x27;密码至少6位&#x27;    return false  }  errors.password = undefined  return true}const handleSubmit = async () => {  const isValid = validateUsername() && validatePassword()  if (!isValid) return  isLoading.value = true  try {    // 调用登录API    await login(form)  } finally {    isLoading.value = false  }}</script>

节省的时间:至少20分钟(写结构 + 绑事件 + 写验证 + 调样式)

场景3:生成测试代码

提示词

为以下函数生成单元测试(使用Jest):function calculateDiscount(price: number, userType: &#x27;normal&#x27; | &#x27;vip&#x27; | &#x27;svip&#x27;): number {  if (userType === &#x27;svip&#x27;) return price * 0.7  if (userType === &#x27;vip&#x27;) return price * 0.8  return price >= 100 ? price * 0.95 : price}要求:- 覆盖所有分支- 包含边界情况- 使用describe组织测试用例

AI生成

describe(&#x27;calculateDiscount&#x27;, () => {  describe(&#x27;普通用户&#x27;, () => {    it(&#x27;满100打95折&#x27;, () => {      expect(calculateDiscount(100, &#x27;normal&#x27;)).toBe(95)      expect(calculateDiscount(200, &#x27;normal&#x27;)).toBe(190)    })    it(&#x27;不满100不打折&#x27;, () => {      expect(calculateDiscount(99, &#x27;normal&#x27;)).toBe(99)      expect(calculateDiscount(50, &#x27;normal&#x27;)).toBe(50)    })    it(&#x27;价格为0时返回0&#x27;, () => {      expect(calculateDiscount(0, &#x27;normal&#x27;)).toBe(0)    })  })  describe(&#x27;VIP用户&#x27;, () => {    it(&#x27;享受8折优惠&#x27;, () => {      expect(calculateDiscount(100, &#x27;vip&#x27;)).toBe(80)      expect(calculateDiscount(250, &#x27;vip&#x27;)).toBe(200)    })  })  describe(&#x27;SVIP用户&#x27;, () => {    it(&#x27;享受7折优惠&#x27;, () => {      expect(calculateDiscount(100, &#x27;svip&#x27;)).toBe(70)      expect(calculateDiscount(1000, &#x27;svip&#x27;)).toBe(700)    })  })})

四、核心技能:代码解释

场景:接手祖传代码

你看到的

def process_data(df):    df = df.dropna(subset=[&#x27;user_id&#x27;])    df[&#x27;date&#x27;] = pd.to_datetime(df[&#x27;date&#x27;])    df = df[df[&#x27;amount&#x27;] > 0]    grouped = df.groupby([&#x27;user_id&#x27;, df[&#x27;date&#x27;].dt.month])[&#x27;amount&#x27;].sum().reset_index()    pivot = grouped.pivot(index=&#x27;user_id&#x27;, columns=&#x27;date&#x27;, values=&#x27;amount&#x27;).fillna(0)    return pivot

问AI(选中代码,Cursor里问):

这段代码是做什么的?请逐行解释。

AI回答

这段代码处理用户交易数据,生成按月汇总的用户消费透视表:1. `dropna(subset=[&#x27;user_id&#x27;])` - 删除user_id为空的行2. `pd.to_datetime` - 将date列转为日期格式3. `df[&#x27;amount&#x27;] > 0` - 过滤掉金额小于等于0的记录4. `groupby(...)` - 按用户ID和月份分组,计算每月消费总额5. `pivot(...)` - 将长格式转为宽格式(用户×月份矩阵)6. `fillna(0)` - 空缺月份填充0输出:每个用户每月的消费金额矩阵

价值:5秒搞懂原本需要读10分钟的代码

五、核心技能:代码重构

场景:优化烂代码

原始代码

function getUserData(id) {  var x = db.query(&#x27;SELECT * FROM users WHERE id = &#x27; + id);  if (x.length > 0) {    var user = x[0];    var orders = db.query(&#x27;SELECT * FROM orders WHERE user_id = &#x27; + id);    user.orders = orders;    return user;  }  return null;}

提示词(Cursor Ctrl+K):

重构这段代码,要求:1. 使用async/await处理异步2. 防止SQL注入(使用参数化查询)3. 添加错误处理4. 使用TypeScript类型5. 添加JSDoc注释

AI重构结果

interface User {  id: number;  name: string;  email: string;  orders?: Order[];}interface Order {  id: number;  user_id: number;  amount: number;  created_at: Date;}/** * 获取用户数据及其订单信息 * @param id - 用户ID * @returns 用户对象,包含订单数组;如果用户不存在返回null * @throws 数据库查询错误 */async function getUserData(id: number): Promise<User | null> {  try {    // 查询用户信息    const userResult = await db.query(      &#x27;SELECT * FROM users WHERE id = ?&#x27;,      [id]    );    if (userResult.length === 0) {      return null;    }    const user: User = userResult[0];    // 查询用户订单    const orders = await db.query<Order>(      &#x27;SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC&#x27;,      [id]    );    return {      ...user,      orders    };  } catch (error) {    console.error(&#x27;获取用户数据失败:&#x27;, error);    throw new Error(`无法获取用户 ${id} 的数据`);  }}

改进点

  • • ✅ SQL注入风险消除
  • • ✅ 异步处理规范
  • • ✅ 类型安全
  • • ✅ 错误处理完善
  • • ✅ 代码可读性提升

六、效率翻倍的技巧

1. 写好提示词(用上篇的知识)

❌ 低效

帮我写个登录功能

✅ 高效

帮我写一个Node.js登录接口,要求:- 使用Express框架- JWT token认证- 密码bcrypt加密- 包含输入验证(邮箱格式、密码强度)- 错误处理完善- 返回统一格式的JSON响应

2. 迭代优化,不要指望一次完美

第一轮:生成基础代码 第二轮:”添加错误处理” 第三轮:”把回调改成async/await” 第四轮:”添加TypeScript类型”

3. 善用上下文

Cursor可以引用整个代码库:

@codebase 这个项目的错误处理统一格式是什么?

引用特定文件:

@utils/api.ts 里的request函数怎么用?

七、写在最后

AI编程助手不是来取代程序员的,而是来放大程序员的能力

适合AI做的

  • • 写样板代码
  • • 查文档、写注释
  • • 简单重构
  • • 生成测试

必须人做的

  • • 架构设计
  • • 业务逻辑决策
  • • 代码审查
  • • 复杂调试

最好的方式是人机协作:让AI处理重复劳动,你把精力放在创造性工作上。

下一篇,我们将深入AI辅助调试——让AI帮你找Bug、分析日志、修复问题。


本文由 小卖部 🛒 原创分享

AI编程助手系列:

  • • 《AI编程助手入门:从代码补全到智能生成》—— 本文
  • • 《AI辅助调试:让AI帮你找Bug》—— 待发布
  • • 《AI驱动开发:从需求到代码的完整流程》—— 待发布
  • • 《AI编程最佳实践:效率与质量的平衡》—— 待发布

新系列开启,一起用AI提升编程效率!💻