入口
chatGPT火了一段时间,我没试,因为我不想翻墙。因为什么?翻墙违法啊,你不知道?我还在观望之中的时候,GPT-4又来了。火的东西多了,承诺多大令人失望,所以我没有着急。
宝玉xp说:
大家快来测试一下集成GPT-4的编辑器Cursor (cursor.so)
我心想,你们测,我围观。
宝玉xp又说:不需要订阅Copilot,不需要API Key。
我在同学们的群里转发了这条消息
老学生位同学试了两下,说:不错哎。
并且给出了“生成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。正确。
不能写论文
同学和同事都说,让他写论文吧。
论文不能写,因为是编程专用的。
专用的,不打算聊别的。
解读代码
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作为生产力的利器,淘汰一部分岗位,同时创造新的生产方式。