另类AI编程测试:Trae VS Kimi Code,复活服务器Javascript鼻祖有什么用?Netscape LiveWire技术考古(2)
(本文阅读受众:AI编程从业者,计算机历史爱好者,软件工程师)
(有关LiveWire技术简史,请阅读本系列第一篇)
太长不看版
省流:AI编程上,Trae偏保守,Kimi Code偏激进。
以下是正文。
----------
以复活LiveWire为名的AI编程测试
作为在服务器上运行Javascript的鼻祖,LiveWire早已经消失在历史的长河中。时隔30年,复活这种早已消失的技术和编程语言,是否闲得蛋疼?
笔者其实一开始对Netscape LiveWire(下称LiveWire)也没什么兴趣,更想快速了解当年同时期各种Web服务器的发展史。但随着Netscape Enterprise Server(下称NES)服务器资料的搜集,笔者突然发现,使用AI编程复活LiveWire,似乎可以从另一个角度,来测试当前AI编程工具的靠谱程度:
1、它虽古老,但语法又足够流行
现在AI编程在前端可谓是得心应手,尤其是对Javascript可谓炉火纯青。而LiveWire本身语法就是Javascript 1.0到1.4,可谓是JS鼻祖。这种和现代JS语法藕断丝连的特点,可以用来测试AI编程会不会灵活调整。
2、官方文档资料足够齐全
由于曾经存在过Sun-Netscape联盟,许多NES服务器和iWS服务器的官方开发和管理文档,都能在Oracle网站上可以找到,里面甚至能提供完整的PDF文件,这其中也包括LiveWire和Server-Side JavaScript(下称SSJS)参考文档。这刚好可以考验AI编程工具对长文本和API文档的搜索和召回能力。
3、官方带示例程序
NES服务器同时自带了官方示例的LiveWire应用,并且官方开发文档还为其做了详细解释。这可以将其作为提示词,用于考察AI编程背后的大模型,对示例模仿乃至提示词的遵循程度。
因此本次AI编程测试的方案很简单,就是让AI编程工具仿照给出的示例程序,编写出一个使用了上世纪90年代LiveWire技术的1990年代在线留言本。在这个过程中,考察AI编程工具对指令的遵循度、上下文的召回程度、以及倾向于哪种编程风格等等。
考虑到上世纪90年代的互联网特点,本次对AI编程的测试,仅考察其代码业务实现能力,不考察其编码安全能力。
准备工作
笔者构建的AI编程测试语料集过程如下:
1、下载三份Netscape的LiveWire和SSJS官方PDF书籍文档。
这三份书籍文档分别为《Writing Server-Side JavaScript Applications》(With Enterprise Server 3.x)、《Server-Side JavaScript Guide》(Version 1.2)、《Server-Side JavaScript Reference》(Version 1.2)。这三本刚好涵盖了示例详解、语法讲解和API接口文档。
2、使用Google NotebookLM,总结出一份简要编程指南。
为了让AI编程快速对LiveWire技术编程有所理解,笔者使用Google NotebookLM上传了上述PD文档。然后在右侧Studio,让NotebookLM提炼并创建一份自定义报告,其内容主题为“LiveWire Server-Side JavaScript 1.2编程快速入门手册”。并最后使用markitdown转换为一份Markdown文档,文件名为“Netscape LiveWire Server-Side JavaScript 1.2 Brief Programming Guide - notebooklm.md”。
3、使用markitdown工具,将上述三份PDF文件转换为md文档书籍。
4、创建项目目录。
其中,文件“任务.md”要求AI编程工具编写一个在线留言本,其内容如下:
# 任务描述使用1998年的Netscape LiveWire(Server-Side JavaScript)服务器技术,编写一个在线留言本项目。留言数据存储在Microsoft SQL Server 6.5。编写的代码存储在```./src```目录下。# 留言本功能1、一个展示所有留言的页面,带上一页和下一页翻页。留言从最新排序。2、一个提交留言的页面,用户可提交自己的名字和留言内容。提交成功后,提示提交成功。# 代码特征 - 页面本身使用1996年的技术,不要使用任何现代web技术。例如请使用table标签;当时也没有任何css技术。 - 每个Netscape LiveWire(Server-Side JavaScript)项目的服务器初始化代码,应写在start.htm文件内。 - Netscape LiveWire(Server-Side JavaScript)将在服务端解析并执行htm中的```<server>```TAG。 - 用于Netscape LiveWire(Server-Side JavaScript)的服务器js文件,请以```server_```开头,以方便进行编译。这些服务器js文件,可被任何htm中的```<server>```TAG调用。# 示例代码项目请参考项目源代码:```"./livewire-samples/videoapp"```。# 技术栈 - Netscape LiveWire(Server-Side JavaScript)服务器技术Netscape LiveWire(Server-Side JavaScript)技术是一种1998年的技术,在服务器运行js代码。编程代码以Netscape Javascript 1.2为标准。快速入门文档可参考:```"./document/Netscape LiveWire Server-Side JavaScript 1.2 Brief Programming Guide - notebooklm.md"```示例代码目录:```"./livewire-samples"```,每个目录为一个项目参考。 - Microsoft SQL Server 6.5Microsoft SQL Server 6.5是1996年微软开发的关系型数据库。# 数据库设计数据库字段如下:id:留言id,主键数字,自增name:网名名字note:留言内容create_time:创建时间,yyyy-mm-dd hh:mm:ss格式
目录“livewire-samples”存放NES服务器给出的LiveWire技术应用示例。
目录“document”中,存放一份NotebookLM生成的“Netscape LiveWire Server-Side JavaScript 1.2 Brief Programming Guide - notebooklm.md”。
至于运行环境,Internet Archive刚好有人上传了Netscape Enterprise Server Version 3.6 Service Pack 2光盘,该版本支持Windows NT 4.0和Microsoft SQL Server 6.5,因此最终的虚拟机环境如下:
- 操作系统:Windows NT 4.0 SP6a
- Web服务器:Netscape Enterprise Server 3.6,支持Javascript 1.2
- 数据库服务器:Microsoft SQL Server 6.5
(Internet Archive上的NES 3.6安装光盘)
(SQL Server 6.5不支持TOP分页,刚好可以用来考察大模型训练的语料内容)
(现在有一个问题是不知道为什么,在Linux下的VirtualBox运行NT 4.0虚拟机的效率不高,经常把CPU拉满,风扇狂转,但对本次测试影响较小,后续再解决)
一切准备就绪,开始测试!
Trae:规矩守份
(备注:本文所称的Trae是指Trae国内版)
首先是Trae。由于其支持文档集,因此首先把三份md文档书籍存放进去进行索引。
接着,开启Trae的SOLO模式,输入指令开始干活。由于它支持“Plan”功能,因此打开了该开关,看看它会如何规划。指令内容如下(其中“【】”为引用):
"请根据【任务.md】,编写一个项目。编写过程中,如发现不明白的地方,请参阅文档集合【Server-Side JS 199x】。"
Plan执行后,输出了第一版。从内容来看,Trae对示例程序做了十分严格的遵循,甚至出现了冗余代码也抄过来的程度。
(示例程序的getUserId也抄过来了)
其次,在SQL Server 6.5的年代,既没有预编译功能,也没有TOP语法分页,于是乎,给Trae下达了如下命令,看它会改用什么分页方法:
"在SQL Server 6.5年代,没有TOP语法进行分页,请根据表结构,思考不使用page的分页方法。请注意,允许不使用page参数,改用其他参数进行分页"
Trae给出了通过主键id分页的方式,满足了要求。
Trae可能没有考虑到LiveWire的竞态条件问题,没有加锁,于是乎下达指令进行修改;然而修改之后,发现其使用了try/catch指令,但这在NES 3.X下是不支持的,于是乎也命令其一并修改。这里面比较惊喜的是,加锁时,Trae使用了双重检查。
在数据库操作过程中,Trae似乎从别的示例程序中混淆了数据库读写函数的使用,于是乎要求其修正。
经过若干在线调试后,Trae成功完成了任务,在线留言本能在NES 3.6上成功运行,朴素的界面和IE 4十分搭配。
从结果来看,Trae对示例程序遵循的程度很高,思路调整度较小,非必要不会生成无关文件,属于较为保守的派别。
Kimi Code:活泼好动
月之暗面在前几天发布Kimi K2.5后,也同时发布了官方编程工具Kimi Code。因此,也就作为一种对比,加入了测试当中。
由于Kimi Code依赖于Visual Studio Code,因此需要用别的方式,来让其知道要检索三份书籍文档。最终,笔者在“document”目录下新建一个目录“other”,将三本书放进去,并修改“任务.md”,对“技术栈”章节中的“Netscape LiveWire(Server-Side JavaScript)服务器技术”部分,列明其检索路径:
# 技术栈 - Netscape LiveWire(Server-Side JavaScript)服务器技术Netscape LiveWire(Server-Side JavaScript)技术是一种1998年的技术,在服务器运行js代码。编程代码以Netscape Javascript 1.2为标准。快速入门文档可参考:```"./document/Netscape LiveWire Server-Side JavaScript 1.2 Brief Programming Guide - notebooklm.md"```其他文档可参考:```"./document/other"```下的所有文档示例代码目录:```"./livewire-samples"```,每个目录为一个项目参考。(……其他略)
准备就绪,开始用Kimi Code AI编程:
“请根据@任务.md ,编写一个项目。编写过程中,如发现不明白的地方,请参阅文档集合document文件夹”
Kimi code输出的第一版和Trae、甚至和示例程序区别很大。这里面,Kimi Code很贴心的做了建表语句和README.md文档,并且每一次的修改反馈,都会写回到README.md中;在代码逻辑中,相比起示例程序,Kimi Code堪称大改,甚至还考虑到了防止SQL注入的问题。以上这些,在示例程序里面是不存在的。
当然。Trae遇到的坑,Kimi Code也同样不可避免,比如错误使用了无法运行的try/catch语法,没有考虑竞态条件,因此,也需要人工要求其修正。
不过也正是由于Kimi Code编程风格较为大胆,导致在部分地方出现了过度编程的行为,比如它忽略了示例程序中已经存在的jsac路径内容,而是盲目输出,结果写出一堆错误的冗余代码。这个问题,在强行要求参考指定文件后,才得以解决。
在SQL Server 6.5分页问题上,Kimi Code也同样错误使用了TOP语法,在要求思考改用别的分页方式后,它也给出了通过主键id分页的方式,并且使用了“SET ROWCOUNT 5”来限制获取的数据库条目数。
在经过若干在线调试后,Kimi Code也成功完成了任务,在NES 3.6上顺利运行在线留言本。不得不说,界面漂亮多了。
从结果来看,Kimi Code并没有照搬示例程序的思路,而是颇为大胆地进行了重要逻辑、甚至界面的重写,属于较为激进的类型。
以上测试集和代码生成结果已上传到Gitee仓库,各位可自行评估:
https://gitee.com/horseluke/ai-coding-testcase-1990s-guestbook-netscape-livewire-ssjs总结一下,在AI编程复活30年前的老技术测试中,两个AI编程工具可以说处在天平的两极,互有优劣,Trae偏保守,Kimi Code偏激进。开发者需要根据自己编程特点和项目需求,仔细选择。
(未完待续)