「豆包Marscode体验官」深度体验之——测就测个真实

1,695 阅读14分钟

我正在参加「豆包MarsCode初体验」征文活动,活动地址在这里,快来参加吧juejin.cn/post/738499…

前言

今天原本是用其它工具生成代码的,正好有朋友说掘金有个豆包MarsCode的活动,用这个试试好不好使,我就来测试了一下,测试就测一个真实,好坏都说,全面测试一下,希望帮助平台找到一些好的开发方向,也能帮助大家找到这个工具的好用之处。

豆包MarsCode官方概述

豆包MarsCode 是基于豆包大模型打造的智能开发工具,提供 Cloud IDE 及 AI 编程助手两种使用形态。
作为豆包代码模型的具体应用, 豆包MarsCode 支持智能识别当前编码任务相关的上下文信息,同时将代码理解、生成、优化、推荐、补全、审查等多维能力融为一体,无缝嵌入研发流程的各个环节,帮助开发者提升代码开发质量和效率。

豆包MarsCode全面测评

我们进入到主页就能看大中间以及右上角都有显示的【立即获取编程助手】字样,点进去。

跳转到安装显示页面,这里给了VSCode与JetBrains的安装连接,我就不演示了,不是本期的主题内容,而且程序员电脑上肯定至少有一个。全栈的就全都有了。例如我都有。

这是我的一部分开发工具们。

豆包MarsCode——安装

支持的开发工具非常的完整:

VSCode用的多,先安装这个插件,这是官方给的安装步骤,写的非常详细,我就不再次累述了,显得麻烦。

  1. 打开 Visual Studio Code。 
  2. 点击左侧导航栏中的 扩展 按钮,进入插件市场。 
  3. 搜索 “豆包”、“MarsCode” 关键词,找到插件并安装。 
  4. 重启 Visual Studio Code。 
  5. 使用快捷键(Windows: Ctrl + U; macOS: Command + U)打开豆包 MarsCode 编程助手侧边对话框。 
  6. 点击 登录 按钮,登录你的账号。 
  7. 返回 IDE。 
  8. 插件准备完成,你可以开始体验 AI 能力。

但是我提供安装详情了,无声的GIF,把有问题的地方也都处理了。

安装完毕就能使用了,接下来我们先去工作台看看有什么再具体使用。

IDE安装就是到设置里面安装插件即可,这里我提供了Java的和Python的提示图片。

Python IDE的插件安装:

由于是外网下载,依然比较慢。

豆包MarsCode——工作台——线上Web端doubaoCode测评

在主页的头像上点击后可以看到工作台的字样,我们点击进入。

后台页面更像是项目管理。

这里模版给的还是很全面的呢。

我们创建一个项目试试。

项目创建完毕发现会直接打开web端的开发工具,可以从logo上看出来是豆包专属的工具。

豆包的在线工具发现了,原来再这里。

提问测试一下,我上传了一个infos的Excel文件,我们来看看能不能读取一下。

**问题:**帮我读取分析一下当前路径下的infos.xlsx文件,把所有sheet页的名称打印一下。

自己下载环境跑一下把,跑成功了,信息正常输出。

那么,随之问题也来了,豆包并没有给出环境问题的假设,既然要使用某库,一定要先给出安装库的说明啊。

线上Web端doubaoCode优点

优点在于可以在网上直接使用,非常快捷,哪怕么有任何代码环境,直接登录到后台就可以操作项目,十分的方便。并且直接自带了MarsCode,可以随时互动提问。

测评问题1:只写代码,不处理环境

在刚才的测试中我接了个图片,问题【帮我读取分析一下当前路径下的infos.xlsx文件,把所有sheet页的名称打印一下。】的回答中有3处不足之处:

1、代码中没有获取提问的文件名。
2、没有给安装环境的提示。
3、环境内容不完整。

希望训练模型的大佬能注意到这点。

接下来我们返回到本地继续测试本地的功能。

利用在线豆包Marscode创建——个人项目

这里我们创建一个python的跨域接口webapi的项目,目的是为一个比赛准备一个实时更新的分数展示平台,大概要求是这样的:

1、创建一个数据库DDL语句,要求是一个成绩表,]分别是编号id,班级名称,问题1到问题8,共计10列。
2、需要有一个python的GUI面板,每5秒更新查看数据库的成绩列表。
3、需要创建一个python的跨域的接口,host='0.0.0.0',方便访问,接口要求是接收3个参数,分别是组号id,成绩,题目编号,不允许输入浮点数。
4、创建一个3个参数的HTML页面,使用表单来访问127.0.0.1:5000/submit-score的接口,参数分别是组号id,成绩,题目编号,要求都是int类型,并且题目编号的取值范围是1-8,组号取值范围1-16,成绩取值范围是0-20,使用bootstrap来优化一下样式。

大致效果如下,要求是每5秒更新面板。

创建过程

1、创建一个python的项目。

2、连续提问

创建一个数据库DDL语句,要求是一个成绩表,]分别是编号id,班级名称,问题1到问题8,共计10列。

结果如下,我们插入到数据库中,再插入对应班级的初始数据,初始数据这里我自己填写了一下,AI虽然肯定能给数据但是形容起来肯定还没写的快。

我这里稍微改变了一下列名:

CREATE TABLE `scores` (
  `id` INT AUTO_INCREMENT, 
  `className` VARCHAR(20),
  `q1` TINYINT,
  `q2` TINYINT,
  `q3` TINYINT,
  `q4` TINYINT,
  `q5` TINYINT,
  `q6` TINYINT,
  `q7` TINYINT,
  `q8` TINYINT,
  PRIMARY KEY (`id`)
);

帮我连接MySQL并查询对应表的数据,数据库信息是:
url = 'rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com' 
port = 3306 
user = 'root' 
passwd = '123456' 
db_name = 'mysql_six'

我们通过豆包的MarsCode一次性数据库连接成功,并且通过查询数据库我们获取到了结果,那么接下来我们把这个结果使用GUI展示即可。

提问:使用tkinter当做GUI的库,将查询到的results结果显示到表格中,使用threading创建一个每5秒钟刷新面板的功能。

返回结果:

import pymysqlimport tkinter as tkfrom tkinter import ttkfrom threading import Thread# 数据库连接信息url = 'rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com'port = 3306user = '更换自己的'passwd = '更换自己的'db_name = 'mysql_six'  # 请替换为你的数据库名def read_csv_files():    # 连接到数据库    connection = pymysql.connect(host=url, port=port, user=user, password=passwd, db=db_name)    try:        with connection.cursor() as cursor:            # 执行SQL查询语句            sql = "SELECT * FROM infos"            cursor.execute(sql)            # 获取所有记录列表            results = cursor.fetchall()            # 将结果转换为二维数组(列表的列表)            data_2d_array = [[row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9]] for row in                             results]            return data_2d_array    finally:        connection.close()  # 关闭数据库连接def update_table_data(table, root):    def refresh():        # 读取新的数据        new_data = read_csv_files()        # 清除表格中的所有项        for item in table.get_children():            table.delete(item)        # 插入新的表格数据        for row in new_data:            # 计算除第一个元素外的所有元素的总和            row_sum = sum(row[1:])            # 将原始行数据(包括第一个元素)和总和添加到表格中            row_data = row + [row_sum]  # 添加总和(不包括第一个数据)到行数据的末尾            table.insert('', 'end', values=row_data)        # 重新安排5秒后再次调用此函数        root.after(5000, refresh)    # 启动数据刷新线程    Thread(target=refresh).start()# 初始化tkinter窗口root = tk.Tk()root.title('MySQL数据库比赛评分列表')# 假设我们想要窗口占据整个屏幕宽度,并设置一个合适的高度screen_width = root.winfo_screenwidth()screen_height = root.winfo_screenheight()  # 假设窗口占据屏幕高度的80%root.geometry(f'{screen_width}x{screen_height}')# 创建表格框架frame = ttk.Frame(root)frame.pack(expand=True, fill='both', padx=10, pady=10)# 创建表格的列标题header = ['组别'] + ['问题 {}'.format(i) for i in range(1, 9)] + ['总和']table = ttk.Treeview(frame, columns=header, show='headings', height=80)available_width = root.winfo_width()  # 减去滚动条宽度column_width = available_width // len(header)# 配置Treeview的列以动态调整宽度for col in header:    table.heading(col, text=col)    table.column(col, anchor='center', width=column_width)  # 允许列根据内容伸缩style = ttk.Style()style.configure("Treeview", rowheight=50)style.configure('Treeview.Heading', font=('宋体', 22, 'bold'))  # 标题字体style.configure('Treeview', font=('Helvetica', 20, 'bold'))  # 内容字体root.update_idletasks()  # 确保所有组件都被创建和布局# 将表格添加到框架中table.pack(expand=True, fill='both')# 初始调用以启动数据刷新循环update_table_data(table, root)# 运行tkinter事件循环root.mainloop()

由于Linux环境无法运行GUI项目,我们复制出来运行以下。

运行成功,那么就下来我们在创建更新数据的WEBAPI接口与HTML的前端代码。

提问:根据DDL:

CREATE TABLE `scores` (
  `id` INT AUTO_INCREMENT, 
  `className` VARCHAR(20),
  `q1` TINYINT,
  `q2` TINYINT,
  `q3` TINYINT,
  `q4` TINYINT,
  `q5` TINYINT,
  `q6` TINYINT,
  `q7` TINYINT,
  `q8` TINYINT,
  PRIMARY KEY (`id`) 
);

来分析,需要创建一个python的跨域的修改数据接口,host='0.0.0.0',方便访问,接口要求是接收3个参数,分别是组号id,成绩,题目编号,不允许输入浮点数,数据库信息是

url = 'rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com'
port = 3306
user = '更换自己的'
passwd = '更换自己的'
db_name = 'mysql_six' 

使用pymysql库来完成数据操作部分。

根据返回内容新建文件并运行。

改一下自己的数据库信息,运行以下看看。

神奇发现——安装环境配置的网速竟然如此之高

运行测试:

提问:使用HTML+CSS+jQuery+bootstrap来创建一个3个参数的HTML页面,使用表单来访问http://127.0.0.1:5000/submit-score的接口,参数分别是组号id,成绩,题目编号,要求都是int类型,并且题目编号的取值范围是1-8,组号取值范围1-16,成绩取值范围是0-20,使用bootstrap来优化一下样式。

再次保存成一个新文件

我来手动的改一下放的ip地址,再搞到本地运行一下啊,稍微微调一下,样貌上和文字都对得上了呢,这里测试一下修改第7组,也就是信息1班的第5题成绩改为9分。

修改测试,测试成功。

整体体验可以说还是非常到位我,我仅仅修改了部分非核心代码,一些文字描述上也基本准确,很棒的一次体验呢。

豆包MarsCode——基础功能测评

生成代码

问题:

我需要使用python连接MySQL数据库,
主机地址:rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com 
账号:root 
密码:admin666 
读取mysql_six数据库,数据库的字符集是UTF8的,里面有一个infos表,获取里面所有的数据,并保存到infos_data数据集中。

回答情况:

这里给了安装提示,但是没有给出安装语句。使用的是mysql-connector-python。我们自己使用pip来安装一下,在跑程序试试。

程序测试:

代码是真没啥问题,一次就跑通了。

代码解释

我们去掉刚才生成的代码给的注释,我们来生成一下代码解释,一会在用这个生成一个代码注释看看。

看步骤操作啊,一定是输入【正斜杠】出现提示后选择【explain】,选中要解释的代码后再回车使用。

使用效果:

注释代码

依然使用刚才的代码进行注释操作试试。

生成效果:

这里遇到一些列问题了。

测评问题2、注释内容没法选择部分进行注释

/doc中没有选择代码的文字提示,可以理解成没有这个部分代码注释的功能,建议添加此功能。

代码注释很多的时候都是分块进行的,如果都注释上了那得多少行啊,上下翻动都很累,必要代码注释肯定是选中行进行注释的,或者我看到了那个黄色的小提示灯泡,我点开了一看还不是想要的内容。

生成单测

测评问题3、UI显示是【生成单测】但是需要选代码

/explain中说要选中代码,/doc生成注释中又不需要选中代码,这里没有文字提示又需要选择代码,就很迷茫。

看着是:【没有选择代码的功能,应该就是整个文件的单测生成了。】

但是问题来了,竟然又让我选择代码,这个文字提示做的就有点迷茫了。

选中代码测试结果:

运行测试。

豆包MarsCode——连续提问测评

问题1:

使用python写一个10秒真男人游戏。
游戏要求:
1、创建python的gui页面
2、有一个显示时间的面板,时间格式为:【秒:毫秒】
3、有一个点击开始的按钮与一个点击停止的按钮
4、点击开始按钮的时候开始计时
5、点击停止后时间面板的时间停止
6、如果小于10秒提示文字:胆子放大一些
7、如果大于10秒提示文字:练练反应速度吧

函数功能提示:

我们可以在函数的名称上看到有【解释代码|注释代码|生成单测】功能,挺方便的。

问题2:让GUI的面板居中显示,大小为400*400的像素,处理一下没有提示文字的问题。

这次都显示了,效果还是不错的,就是还丑一些,我们再处理一下。

问题3:让开始按钮与停止按钮分为两行,并且放大按钮大小是原本按钮的3倍,给一个好看的按钮背景颜色。

看来听指挥的能力还是有限的,我们更新一下我们的提问格式。

问题4:

1、先将两个按钮从1行变成2行布局,开始在上,停止在下 
2、文字样式改为黑体字加粗 
3、给窗体一个浅灰色的背景颜色

测评问题4:历史记录混乱

问题2修改的gui面板大小,在这里就直接给取消了。不是应该在最新的代码上加以参考的吗?

效果:

问题5、清空历史记录整体提问

使用python写一个10秒真男人游戏。 
游戏要求:
1、创建python的gui页面 
2、有一个显示时间的面板,时间格式为:【秒:毫秒】 
3、有一个点击开始的按钮在面板的第二行居中与一个点击停止的按钮在面板的第三行居中 
4、点击开始按钮的时候开始计时 
5、点击停止后时间面板的时间停止 
6、如果小于10秒提示文字:胆子放大一些 
7、如果大于10秒提示文字:练练反应速度吧 
8、让GUI的面板居中显示,大小为400*400的像素 
9、让开始按钮与停止按钮分为两行,并且放大按钮大小是原本按钮的3倍,给一个好看的按钮背景颜色 
10、文字样式改为黑体字加粗 
11、给窗体一个浅灰色的背景颜色

问题提问效果1:

问题提问效果2:

问题提问效果3:

再次添加问题:显示时间的面板,时间格式为:【秒:毫秒】

效果:

再次添加问题:

如果小于10秒提示文字:胆子放大一些 ,如果大于10秒提示文字:练练反应速度吧。

测评问题5、提问时出现异常停止问题

我根据上面的问题继续提问,出现了异常停止的情况,二次提问前面的引导语又有所区别了。幸好在区别不大,但是还是没有得到对应的结果。

最后一次提问结果,又出问题了。

这里提供一个最好的版本。

from tkinter import Tk, Button, Label, StringVarfrom time import time, ctimedef update_time():    global running    if running:        current_time = time() - start_time        time_str = ctime(current_time)                # 通过字符串操作将时间格式改为 【秒:毫秒】        time_str = time_str.split(':')[-1]          time_str = time_str.split(':')[-1][:10]          time_str = f"【{int(current_time)}:{int((current_time * 1000) % 1000)}】"        time_label.config(text=time_str)                root.after(100, update_time)    else:        passdef start():    global running, start_time    running = True    start_time = time()    update_time()def stop():    global running    running = Falseroot = Tk()root.title("10 秒真男人游戏")root.configure(bg="#f0f0f0")  # 浅灰色背景# 时间标签time_label = Label(root, text="0:00.000", font=("黑体", 16, "bold"), bg="#f0f0f0")time_label.pack(pady=20)  # 时间面板# 开始按钮start_button = Button(root, text="开始", command=start, font=("黑体", 14, "bold"), bg="lightgreen", width=10, height=3)start_button.pack(pady=10)  # 面板的第二行居中# 停止按钮stop_button = Button(root, text="停止", command=stop, font=("黑体", 14, "bold"), bg="lightsalmon", width=10, height=3)stop_button.pack(pady=10)  # 面板的第三行居中width = 400  # specify the width of the windowheight = 400  # specify the height of the windowscreen_width = root.winfo_screenwidth()  # get the width of the screenscreen_height = root.winfo_screenheight()  # get the height of the screenx = (screen_width - width) // 2  # calculate the x-coordinate of the centery = (screen_height - height) // 2  # calculate the y-coordinate of the centerroot.geometry('{}x{}+{}+{}'.format(width, height, x, y))  # set the geometry of the windowdef show_message(self):    if self.elapsed_time < 10:        message = "胆子放大一些"    else:        message = "练练反应速度吧"    message_label = Label(self.root, text=message, font=("Helvetica", 24))    message_label.pack()running = Falsestart_time = 0update_time()root.mainloop()

最终最好的效果如下,话说10秒整真的挺难的:

豆包MarsCode——极限测试

1、项目限制

根据官方给的数据可以看到项目不超过10个。

限制项

说明

项目数量

不超过 10 个

CPU、Memory 和 Disk 资源

单个项目可以使用的最大资源如下:
* CPU:2Core
* Memory:4GiB
* Disk:10GiB

2、流量限制

流量超出限制后,将影响代码编写和已部署服务的请求。同时,HTTP 请求将返回 429 状态码。 仅计算数据传出量,可能导致超额。数据传入量不计入额度。

限制项

说明

项目空间出流量

10GiB/月

部署服务出流量

10GiB/月

带宽

5GiB/月

3、返回token极限——4k

提问:帮我创建一个12张表的用户管理数据库,给出完整的DDL语句与DML语句,DML语句要求插入的信息都是中文的,每个表至少10条数据。

结果:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  description VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE user_roles (
  user_id INT,
  role_id INT,
  granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (user_id, role_id),
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
  FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);

CREATE TABLE permissions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  description VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE role_permissions (
  role_id INT,
  permission_id INT,
  PRIMARY KEY (role_id, permission_id),
  FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
  FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);

CREATE TABLE profiles (
  user_id INT PRIMARY KEY,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  gender ENUM('男', '女', '其他'),
  birthday DATE,
  address VARCHAR(255),
  bio VARCHAR(500),
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE login_logs (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  logout_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE operation_logs (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  operation_module VARCHAR(50),
  operation_description VARCHAR(255),
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE notifications (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  notification_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  title VARCHAR(100),
  content VARCHAR(255),
  is_read BOOLEAN DEFAULT FALSE,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE files (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  file_name VARCHAR(255),
  file_path VARCHAR(500),
  file_size INT,
  upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE chats (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  chat_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  chat_content VARCHAR(255),
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE friends (
  user_id INT,
  friend_id INT,
  add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (user_id, friend_id),
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
  FOREIGN KEY (friend_id) REFERENCES users(id) ON DELETE CASCADE
);

DDL是完整的,但是DML只有几条。

-- 添加用户
INSERT INTO users (username, password, email) VALUES ('张三', '123456', 'zhangsan@example.com');
INSERT INTO users (username, password, email) VALUES ('李四', '654321', 'lisi@example.com');

-- 添加角色
INSERT INTO roles (name, description) VALUES ('管理员', '拥有最高权限');
INSERT INTO roles (name, description) VALUES ('普通用户', '拥有基本权限');

-- 角色权限管理
INSERT INTO role_permissions (role_id, permission_id) VALUES (1, 1); 
INSERT INTO role_permissions (role_id, permission_id) VALUES (1, 2); 
INSERT INTO role_permissions (role_id, permission_id) VALUES (2, 3); 

-- 用户角色管理
INSERT INTO user_roles (user_id, role_id) VALUES (1, 1); 
INSERT INTO user_roles (user_id, role_id) VALUES (2, 2); 
INSERT INTO user_roles (user_id, role_id) VALUES (1, 2); 

长度计算:

长度是4004这是没有记录一些title的字符串,算起来也就是4096字符串长度吧。

MarsCode完整体验总结

这里我测试过程中有5条问题:

测评问题1:只写代码,不处理环境
测评问题2、注释内容没法选择部分进行注释
测评问题3、UI显示是【生成单测】但是需要选代码
测评问题4:历史记录混乱
测评问题5、提问时出现异常停止问题

整体测试上觉得这个工具当前满足基本的使用条件了,优点还是有不少的。

优点1、生成速度快,同比其它平台生成的速度要快好多。
优点2、返回token长度是其它平台2倍。
优点3、完全免费,没有看到任何付费的地方。
优点4、有项目管理,在平台上可以记录自己的项目,随时可用。
优点5、用于生成基础代码或者基础sql等内容非常的方便。

希望开发的人员能持续更好的更新版本,这样才能让豆包MarsCode更加的人性化,给开发者们带来更多的价值。