GPT AI结对编程初体验

入口

chatGPT火了一段时间,我没试,因为我不想翻墙。因为什么?翻墙违法啊,你不知道?我还在观望之中的时候,GPT-4又来了。火的东西多了,承诺多大令人失望,所以我没有着急。

宝玉xp说:

大家快来测试一下集成GPT-4的编辑器Cursor (cursor.so)

我心想,你们测,我围观。

宝玉xp又说:不需要订阅Copilot,不需要API Key。

我在同学们的群里转发了这条消息

https://m.weibo.cn/status/4880070764400024?wm=3333_2001&from=10D3193010&sourcetype=weixin&jumpfrom=weibocom

老学生位同学试了两下,说:不错哎。

并且给出了“生成unity和手柄交互的代码”的体验说“非常好用!”,还有查资料“about WebRTCaudio/video streming”,看起来不错。

安装 https://www.cursor.so/ 到 sandboxie 中试一试吧。

看示例文件的后缀,支持 python 和 js。看配置和实测,C/C++ 也没问题,还有不少语言。

提要求用 汉语或英语都行。

贪吃蛇,业务逻辑,修改需求

做了个贪吃蛇,JS版本。确实强大,连HTML主体都是GPT写的。Ctrl+K提要求。我的要求主体是:生成一个贪吃蛇游戏,JS版本。

为了增加难度,我在初始的要求增加了细节:用 O 作蛇头,用 X 作为食物,用 + 作蛇身。

我增加要求初始蛇身长度3。

我修改按键,由 上下左右 改为 WASD,又改为 HJKL。

甚至不必指出WASD和HJKL哪个键对应哪个方向,他能猜出来。说明玩过反恐精英,习惯使用VI编辑器。

调试最长的时间花在了我的浏览器有插件拦截HJKL按键,运行的时候按键总是不好使。为了找到问题的原因,我要求按键的时候播放声音,要求蛇每走一步播放声音,代码正确。没声音,Ctrl+L聊天,我问为什么没声,他告诉我非常可能受浏览器权限影响的,还告诉我如何解决。我要求按键时弹出窗口,显示按键的字母。这样,发现了按键没被产生 event,进而想到了插件拦截。远程辅助调试的时候,对现场环境的依赖,确实是个难点。需要人类承担责任的部分,得由人工操作,人工是最大的bug。

后来要求用 NENU 作蛇身,代码看起来对的,但是按键不好使了,这条线索没有继续。

我还试了 flappy bird,要求把 管道pipe 改成 柱子column。正确。

不能写论文

同学和同事都说,让他写论文吧。

C:\Users\young\AppData\Local\Temp\WeChat Files\9c02d5e5f8fce6ef01c9c2ca153e759.png

论文不能写,因为是编程专用的。

专用的,不打算聊别的。

解读代码

Zhumao贴来一段代码,问,这段代码能读懂不。

我问了。

他知道这是手动循环展开,还告诉这种优化方法过时了。

俄罗斯方块,逐步提示

我说 写个俄罗斯方块,控制台版本的。

没写完啊。所以我要求继续。之前也见到过代码明显不完整,我问“后面还有吗”,他就继续。

我要求展开函数。

继续展开下一个函数。

怎么旋转方块呢?可以接受或拒绝。

业务逻辑差不多应该就是这样。不过Dijkstra说了:我困惑,数据结构什么样呢?

他不仅回答问题,还委婉偷摸地纠正我的说法。

我要求写一段 L形方块的初始化,然后指着那段代码问,这段代码放在哪里合适呢。

在之前我改乱过一段代码,也回答过我,某段JS代码要放在某个类的构造函数里。

优化和代码风格

要求写个 sin 函数实现,用拉格朗日展开。

// 用拉格朗日展开求sin函数,JS版本

function lagrangeSin(x, n) {

let sinX = 0;

for (let i = 0; i < n; i++) {

let term = (-1) ** i * x ** (2 * i + 1) / factorial(2 * i + 1);

sinX += term;

}

return sinX;

}

function factorial(n) {

if (n === 0) return 1;

return n * factorial(n - 1);

}

以上是上课常讲的故事的第一个高潮,接下来查表法。

// 用查表法实现sin函数,JS版本,精度为角度制 1度

const sinTable = [];

for (let i = 0; i <= 360; i++) {

sinTable[i] = lagrangeSin((i * Math.PI) / 180, 10);

}

function tableSin(degrees) {

const index = Math.round(degrees) % 360;

return sinTable[index];

}

他用拉格朗日展开填表,不够硬。要求硬编码。

给出的硬编码不够多。

填充sinTable[i]的值,i从0至50。不在运行时使用lagarangeSin求值,hardcode.

他像循循善诱的老师“你就这么整就行,例子是这样的……”,我像不争气的学生“你就告诉我答案吧。”

换个算法,用泰勒级数展开,还是求sin。

大E同学说,这家伙会递归。

好吧,我指着 factorial函数说:用迭代法重写求这个。

再快点,用查表法。

再高深一点,用动态规划,我告诉他要实现的函数原来长什么样。

像不像面试题?

写个 strcat,避免内存泄露,效果尽可能高。

逐步引导,几次修改要求。

// Function to concatenate two strings without memory leaks and with high efficiency

// Returns 0 on success, -1 on failure

// Check if the source string is longer than the allowed limit

// Check if the length of dest is larger than src

体会

有同学说:没希望了,想摆烂。

上图来自网上,是电影《喜剧之王》的截屏。

另一个体会是 语言表达和逻辑越好,优势越强。不用牙齿和爪子以后,石刀石斧需要适应。也许新的时代就要到来了,AI作为生产力的利器,淘汰一部分岗位,同时创造新的生产方式。

 

Leave a Reply

Your email address will not be published. Required fields are marked *