倚天屠龙:Github Copilot vs Cursor
武林至尊,宝刀屠龙。号令天下,莫敢不从。倚天不出,谁与争锋!
作为开发人员吃饭的家伙,一款好的开发工具对开发人员的帮助是无法估量的。还记得在学校读书的时候,当时流行CS架构的RAD,Delphi和VisualBasic大行其道。就因为Delphi开发快,即使原来没学过Pascal(当时都是学C、C++),对Pascal也谈不上喜爱,还是用了Delphi开发学校的人事系统、国际交流与合作处的信息管理系统等。后面又碰到香港同行用Visual Basic开发的PC同步软件,又跟着学了一波Visual Basic。
后面J2EE大势浩浩荡荡,又经历了JBuilder(可惜了,Borland)、Eclipse、Intellij Idea、Visual Code等IDE的变迁。
然后是去年ChatGPT的发布,开启了生成式AI的浪潮,面向对象编程开始进入“注释驱动编程“、”面向注释编程” 😁
根据2023年JetBrains的全球开发者生态调研[1],84%的开发者表示他们在工作中正在积极使用生成式AI工具。60%的受访者认为,AI辅助编程工具将从根本上改变软件开发就业市场,但只有13%的人相信人工智能将完全代替开发人员编写代码。大约三分之一的开发者认为软件开发中大多数编程将会变成快速工程。开发者认为人工智能将成为帮助他们编写代码的有效辅助工具,而不是完全取代他们。
不管人工智能是否能取代开发人员,都建议你现在开始接触AI辅助编程工具。我推荐你从尝试GitHub Copilot和Cursor开始。要怎么样才能用好这些辅助工具?刚注册Cursor的时候,我收到一封来自Cursor的email,里面这句话让我印象深刻:
As you get started, keep in mind that programming with AI is a new style of coding. It requires rethinking what you spend time on and what you offload to the computer.
在你开始编程时,请记住,使用人工智能编程是一种新的编码风格。它需要你重新思考在什么上花时间以及你将什么工作交给计算机来处理。
GitHub Copilot
GitHub Copilot可以说是先行者,但是要等到Copilot Chat上线,产品才算完整。GitHub Copilot目前是收费的,每个月10美元。新用户可以免费试用一个月。
虽然GitHub Copilot声称已经升级为GPT-4模型(we’ve upgraded your Copilot Chat experience, bringing more accurate code suggestions and explanations with OpenAI’s GPT-4 model.),但是用起来感觉还不是,可能还没有全部升级完成?
GitHub Copilot最强大的就是面向注释编程,顺畅的时候真是“心有灵犀一点通”,写代码是如虎添翼、快如闪电;但是不顺的时候,说不出的拧巴,感觉就真的是你正专心开车的时候,突然副驾驶要抢你的方向盘 🥵 运用之妙,存乎一心。用得好是神兵利器,用得不好就是卧龙凤雏了。
看下面的例子(response_str是LangChain调用GPT-4返回的,死活不肯返回纯粹的json格式,只好自己处理),Copilot给我提示……
碰到这种情况,补充注释就好:
# 检测response_str,如果是markdown格式的块:以```json开头,以```结尾,就转换为纯粹的json格式,因为json.loads只能处理纯粹的json格式
Gopilot会给出新的方案:
if response_str.startswith("```json") and response_str.endswith("```"):
response_str = response_str[7:-3]
Cursor
Cursor刚推出时完全免费,而且用的还是GPT-4,一鸣惊人,后来估计GPT-4太贵了,变成了有限免费:每月可以使用50条GPT-4请求和200条GPT-3.5请求。不过它每个月收费20美元,有点贵,建议自己开通微软的Azure的GPT-4服务,那样按用量付费,怎么也用不了20美元。没有用过GPT4的时候,觉得GPT-3.5也不错,可是用了GPT4,就再也回不去了。曾经沧海难为水。
设置使用Azure API
点开Cursor Setting的Advanced,就可以用Azure的API按量付费。
生成代码
Cursor常用的快捷键是Ctrl+K(生成代码、修改代码)、Ctrl+L(跳到CHAT界面),以至于有人笑称以前的码农是CV大法走天下,新一代码农是KL在手,天下我有。
我们来实战看一下Ctrl+K生成代码,以抓取LangChain的文档(https://python.langchain.com/docs/get_started)为例。
按Ctrl+K,输入:
以 https://python.langchain.com/ 作为baseUrl,baseUrl+/docs/get_started 作为起点,抓取文档,对于每一个文档,进行html解析,继续抓取class为"pagination-nav__link–next"的链接,直至抓取最后一个文档。所有抓取的文档保存到本地的docs目录下。对于每一个链接,要判断是否已经抓取过了。
第一版运行出错:
File “f:\Ivan\study\get-langchain-docs\get_langchain_docs.py”, line 15, in save_document
file.write(response.text)
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\U0001f99c’ in position 252: illegal multibyte sequence
选中出错信息,按Ctrl+Shift+L,问:要改编码吧?
Cursor给出了解决方法:
with open(os.path.join(folder, filename), 'w') as file:file.write(response.text)
改成:
with open(os.path.join(folder, filename), 'w', encoding='utf-8') as file:file.write(response.text)
再次运行,发现文件名不对,给文件名加上扩展名:filename += “.html”
还发现有这种url,结尾多了/:https://python.langchain.com/docs/expression_language/how_to/
Ctrl+K输入:如果full_url以/结尾,则去掉尾部的/ ,自动生成代码(这种实际上自己输入更快,不熟悉Python的话可以让Cursor生成):
if full_url.endswith('/'):full_url = full_url[:-1]
最终得到了这样的源码:
# 以 https://python.langchain.com/ 作为baseUrl,baseUrl+/docs/get_started 作为起点,抓取文档,对于每一个文档,进行html解析,继续抓取class为"pagination-nav__link--next"的链接,直至抓取最后一个文档。所有抓取的文档保存到本地的docs目录下。对于每一个链接,要判断是否已经抓取过了。import os
import time
import requests
from bs4 import BeautifulSoupdef save_document(url, folder='docs'):if not os.path.exists(folder):os.makedirs(folder)response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 修改文档中的CSS路径for link in soup.find_all('link', href=True):if link['href'].startswith('/assets/css/'):link['href'] = '.' + link['href']filename = url.split('/')[-1] or 'index.html'filename += ".html"with open(os.path.join(folder, filename), 'w', encoding='utf-8') as file:file.write(str(soup))return soupdef get_next_link(soup):link_tag = soup.find(class_="pagination-nav__link--next")if link_tag and 'href' in link_tag.attrs:return link_tag['href']return Nonedef crawl_docs(start_url, base_url='https://python.langchain.com'):visited = set()next_url = start_urlwhile next_url:full_url = base_url + next_urlif full_url.endswith('/'):full_url = full_url[:-1]if full_url not in visited:print('visiting', full_url)visited.add(full_url)soup = save_document(full_url)time.sleep(3)next_url = get_next_link(soup)else:breakif __name__ == '__main__':start_path = '/docs/get_started'crawl_docs(start_path)
还不错,是吧?
注:上面只是用来演示如何使用Cursor,如果经常要抓取某些网站的文档来投喂大模型,可以考虑专门的开源项目,如gpt-crawler:https://github.com/BuilderIO/gpt-crawler 说到这个,不得不提Java的开源项目,如Spring Boot,一般都会提供单独的pdf文件,要投喂大模型太方便了。
另外,Cursor可以提问除了与编程无关的问题,可以当作chatgpt的GPT4版本来用。这对于苦于无法开通chatgpt plus会员的用户来说,可以当作暂时的解决方法。虽然不能用多模态,但还是具备高质量的对话能力,很多时候也够用了。
如你可以在Cursor里面提问“胃反酸是怎么回事?”,它会回答:
胃反酸,也被称为胃酸倒流或胃食道反流病(GERD),是指胃中的酸性内容物反流到食道中。这是由于食道下部的肌肉环(称为食道括约肌)不能正常关闭,导致胃酸逆流到食道。
胃反酸的常见症状包括心烧(胸骨后部的烧灼感)、喉咙痛、口腔有酸味、咳嗽、声音嘶哑、感觉有东西卡在喉咙中等。
胃反酸可能由多种因素引起,包括饮食习惯、生活方式、怀孕、肥胖、某些药物和疾病等。如果你经常感到胃反酸,应该寻求医生的帮助,因为长期的胃酸倒流可能导致食道炎、食道溃疡甚至食道癌。
GitHub Copilot只会傲娇地告诉你:作为一个AI编程助手,我专注于软件开发主题。对于医疗健康相关的问题,建议你咨询医疗专业人士或者使用专门的医疗咨询服务。
思考
不管是GitHub Copilot还是Cursor,请善用他们的CHAT界面,和他们聊关于编程的问题。这个绝对是诲人不倦的好老师,对于学习一门新的编程语言,也特别方便。
AI编程助手已经可以帮我们完成很多琐碎、重复的工作,那么在接下来的AI大潮中,程序员要如何提升自己:
- 提升自己的沟通能力
AI只会越来越强,但是你不能很好的表达自己的想法,AI也帮不了你。建议多写学习笔记、博客等,不要在意有多少访问量,多表达就好。
- 提升自己的判断力
暂时AI只能辅助你,最终还是你来做决策,还是要熟悉自己的领域,知道哪些是好的,哪些是不好的。
- 提升自己的审美能力
程序员写的是代码,最终出来的是产品,产品都是要给人用的。拥有更好的审美能力有助于做出更好的产品、有灵魂的产品。
扩展
除了GitHub Copilot和Cursor,还有不少的竞品,可能会差一点,也不会差太多。
- CodeWhisperer
亚马逊信奉长期主义,它的CodeWhisperer(https://aws.amazon.com/cn/codewhisperer/)一直默默发展,面向个人用户提供无限制的代码智能生成服务。
- Codeium
Codeium(https://codeium.com/)是由初创公司研发的一款对标Github Copilot的代码智能生成插件,支持主流的各种编程语言,同样面向个人用户免费使用。
Codeium Chat目前也打算支持GPT-4,正在进行beta测试:https://codeium.com/waitlist/gpt-4?referrer=extension
- CodeGeeX
CodeGeeX(https://github.com/THUDM/CodeGeeX2)除了免费,还是开源的。除了常规的根据上下文和提示生成代码的功能以外,CodeGeeX还具有代码跨语言翻译功能。
前不久国内技术社区CSDN的中国开发者生态——AI辅助编程的相关调研中,受访者认为国产代码生成工具中,CodeGeeX的采用率较为领先。
- 通义灵码
阿里巴巴的通义灵码(https://tongyi.aliyun.com/lingma)刚推出不久,目前看来也不错,期待能更好。
这么多编程助手,你选哪一个?或者说小孩子才做选择,成年人全都要? 😍 我目前代码生成、代码修改、Chat以Cursor为主,代码自动完成以GitHub Copilot辅助,其他编程助手密切关注。
2024年,会否有更强大的开发者AI工具胜出?让你能发出“噫!微斯人,吾谁与归?”
参考
- 2023年JetBrains的全球开发者生态调研:https://www.jetbrains.com/lp/devecosystem-2023/
相关文章:

倚天屠龙:Github Copilot vs Cursor
武林至尊,宝刀屠龙。号令天下,莫敢不从。倚天不出,谁与争锋! 作为开发人员吃饭的家伙,一款好的开发工具对开发人员的帮助是无法估量的。还记得在学校读书的时候,当时流行CS架构的RAD,Delphi和V…...

【web安全】RCE漏洞原理
前言 菜某的笔记总结,如有错误请指正。 RCE漏洞介绍 简而言之,就是代码中使用了可以把字符串当做代码执行的函数,但是又没有对用户的输入内容做到充分的过滤,导致可以被远程执行一些命令。 RCE漏洞的分类 RCE漏洞分为代码执行…...

EI论文复现:基于组合双向拍卖的共享储能机制研究程序代码!
本程序参考EI期刊论文《基于组合双向拍卖的共享储能机制研究》,文中的组合双向拍卖交易机制较为新颖,本质上属于博弈范畴,共享储能是目前的研究热点,牵涉到共享储能参与者的投标策略和收益函数,文中所提模型可为电力市…...
ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务
在 ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务。以下是一个示例代码,演示如何在一个定时任务中执行另一个定时任务: 首先,你需要创建一个继承自 think\console\Command 的…...

mysql:免费的GUI客户端工具推荐并介绍常用的操作
给大家推荐几个常用的 mysql 数据库客户端 sequel-pro sequel-ace 官网下载地址 免费 sequel-ace 可以理解为 Sequel Pro 的升级版,由于Sequel Pro官方不维护了,特别是对 MySQL 8.0 支持不好,所以现在由社区维护了新分支 sequel-ace&#x…...

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)
Unity 在开发的时候如果数据量比较大,或者一部分数据需要存在云端,那么就需要一些数据库 轻量型到大型的包括: 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …...

使用JAVA语言写一个排队叫号的小程序
以下是一个简单的排队叫号的小程序,使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…...

openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表
文章目录 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表140.1 相关概念140.2 操作步骤140.3 维护建议 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表 为了保证数据库的有效运行,数据库必须在插入/删除操作后,基于…...

ubuntu20.04使用LIO-SAM对热室空间进行重建
一、安装LIO-SAM 1.环境配置 默认已经安装过ros sudo apt-get install -y ros-Noetic-navigation sudo apt-get install -y ros-Noetic-robot-localization sudo apt-get install -y ros-Noetic-robot-state-publisher 安装 gtsam(如果是18.04的ubuntu直接按照官网配置&…...

如何选学生用的台灯?眼科专家都说好的学生台灯分享!
根据中国眼健康白皮书显示,我国儿童青少年近视总体发生率为53.6%,由此可见如今青少年学生近视的发病率非常高的,且越来越向低龄化发展,不少还在小学阶段的孩子也存在近视的现象。 而造成这个现象的主要原因就是长时间的用眼导致的…...

Linux4.8、环境变量续
个人主页:Lei宝啊 愿所有美好如期而遇 前言 如果对环境变量没有基本的理解,那么建议先看完这篇文章:环境变量https://blog.csdn.net/m0_74824254/article/details/134661113?spm1001.2014.3001.5501 环境变量与本地变量区别 使用export设…...
PTA 7-231 买文具
某小学要购置文具。批发市场中 A 牌的铅笔卖 5 元一支,C 牌的铅笔卖 2 元一支,D 牌的简易铅笔卖1元2只(捆绑销售,只能买偶数只)。 如果想用n元买n支笔,问有多少种买法?(题目保证 n …...

GPTs每日推荐--生化危机【典藏版】
今天给大家推荐一个游戏性质的GPTs,叫做生化危机典藏版,国内点击可玩。 开篇:玩家从末日中醒来。 选择:玩家会遇到各种资源、任务、剧情,需要自行选择相关的分支剧情,一旦选错,无法重选。 结局…...

jenkins-cicd基础操作
1.先决条件 1.首先我个人势在k8s集群中创建的jenkins,部署方法搭建 k8s部署jenkins-CSDN博客 2.安装指定插件. 1.Gitlab plugin 用于调用gitlab-api的插件 2.Kubernetes plugin jenkins与k8s进行交互的插件,可以用来自动化的构建和部署 3.Build Authorizatio…...

ctfhub技能树_web_信息泄露
目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注࿱…...
使用Docker本地部署chatgpt
GitHub上有一个开源的工程ChatGPT-Next-Web,这个工程已经封装好了UI以及和OpenAI的API之间的交互,你要做的事情就是把他部署到本地,并配置好你的OpenAI的sk,然后就可以使用了。那么接下来的文章里,我会手把手教你如何C…...
SpringBoot 集成Netty、WebSocket,5分钟搭建聊天通信系统
文章目录 前言Netty简介使用Netty开发WebSocket应用程序开始项目一、添加依赖二、自定义处理器三、初始化通道加载器四、配置启动器五、添加启动监听器六、启动项目七、演示效果1. 客户端1看到其他客户端上线2. 客户端3收到客户端1发送的消息3. 客户端1收到客户端2下线前言 在…...

LeedCode刷题---双指针问题
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 双指针简介 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 对撞指针:一般用于顺序结构中&…...

使用Notepad++编辑器,安装AnalysePlugin搜索插件
概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…...
胶囊网络实现手写数字分类
文章目录 前言一、完整代码二、修改成自己的数据集总结 前言 胶囊网络的概念可以先行搜索。 一、完整代码 import torch import torch.nn.functional as F from torch import nn from torchvision import transforms, datasets from torch.optim import Adam from torch.util…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...