程序员视角的 chatgpt 尝鲜
Chatgpt 注册
最近一则科技新闻引起了我对 chatgpt 极大的兴趣
相信在很多人眼中,对于人工智能聊天机器人的印象停留在机械式地一问一答上,而 chatgpt 不仅打破了这样的刻板印象,还能拿到谷歌 offer ? 这是多少程序员梦寐以求的理想
抱着猎奇的心态我打开了 openapi 的网址,在注册账号的过程中却卡在了手机号验证码的步骤: 中国用户无法通过手机用户注册
但方法总比困难多,我找到了一个接码平台,简单地说就是能协助你在注册账号的过程中使用虚拟的手机号完成接收短信验证码的平台。在平台里用支付宝冲了 1 美金大洋,申请一个国家限时的虚拟手机号(虽然这也没有说得那么顺利,但起码是可以重试的,我试了五个不同的国家才收到了虚拟的短信验证码)
完成注册登录后,就可以看到一个看似微软风格的交互界面:左侧导航,右侧聊天面板(工作区)
我第一反应就是每天打开 vscode 编辑器的欢迎界面,看似简约的外表蕴含着不可估量的能量
与谷歌巨佬的初次交流
现在已知的信息是,和我聊天的是一个谷歌巨佬,刚好我最近也对 rust 感兴趣,那就让他用 rust 写一个常见的简单程序吧: 给定 json 数据文件,将其转换为 Excel 文件。这一定是难为不了他的,于是他很快提供了一段看似可运行的程序给我
我假装是个编程小白,按照他的指示将代码拷贝到 main.rs 文件,得到了一系列 "unresolved import" 的编译错误
其实就是没装第三方依赖包嘛,但为了考察他是否能识别这样的编译错误,我将编译器的提示消息发给 chatgpt ,不愧是谷歌大佬,他很快就给了回应,大意就是提示我要在配置文件里添加依赖项的声明
即使如此,chatgpt 给的依赖包版本似乎与实际情况有偏差,我没法依照他提供给我的依赖项声明下载正确的依赖包
我将这样的情况反馈给他,他依然很耐心地给我解答,并建议我到官方文档做 double check 。虽然这次并没能解决问题,但也给出了很好的指南
前面可能是我需求没说清楚,所以他给的源代码也是有问题的: 一般要生成表格的 json 文件应该是个数组,而他给的代码直接就把数组当对象读了,这个时候我让他重新写这个程序 (由于篇幅原因后面就不截代码了)
就算发来了新的代码,还是有编译错误,但是写代码这些是不可避免的,尤其是写 rust 语言。这时我开始觉得十分高能的事情来了: 我不断地将编译报错的信息发给他,他每次都会重写这个程序,仿佛在和我结对编程
1. 编译错误: worksheet 是私有模块,不能直接调用
2. 编译错误: 结构体没有定义 write_bool 方法
3. 编译错误: add_worksheet() 缺少实参
4. 编译错误: ? 使用错误
5. 编译错误: 类型不匹配
但是后面他好像卡在了什么地方,已经无法给出可以让程序继续往下正常运作的提示了。于是我这时候只能自己去定位,当然在他前面细心地调教下,我很快就把这个程序成功 run 起来了,也成功生成了 excel 文件
这可太逆天了,作为一个 rust 初学者,在这个过程中我几乎只是协助定位的角色,但却能依照 chatgpt 的指示写出可以 run 的程序
考察 chatgpt 的编程能力
既然是通过谷歌面试的巨佬,那么他的编程能力一定是在线的,我随意地问了一些算法问题: 实现所有常见的时间复杂度为 O(nlog(n)) 排序算法
这哥们确实不是简单的料,直接 show me the code ,从变量命名、函数命名、缩进、注释甚至连换行都有些讲究(如果你翻过 clean code 这本书的话),而且没记错的话堆排序和快速排序基本按算法导论(CLRS)的伪代码去实现的
他知道不同的编程语言有各自不同良好代码编写的惯例,才是让我觉得最恐怖的...比如 python/rust 习惯蛇形命名, golang/typescript/java 等习惯驼峰命名
# Merge Sort
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr)//2
left_half = arr[:mid]
right_half = arr[mid:]
merge_sort(left_half)
merge_sort(right_half)
i = j = k = 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1
while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1
while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1
return arr
# Quick Sort
def quick_sort(arr, low, high):
if low < high:
pivot = partition(arr, low, high)
quick_sort(arr, low, pivot-1)
quick_sort(arr, pivot+1, high)
def partition(arr, low, high):
pivot = arr[high]
i = low-1
for j in range(low, high):
if arr[j] <= pivot:
i = i+1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[high] = arr[high], arr[i+1]
return i+1
# Heap Sort
def heap_sort(arr):
n = len(arr)
for i in range(n, -1, -1):
heapify(arr, n, i)
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
def heapify(arr, n, i):
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[i] < arr[l]:
largest = l
if r < n and arr[largest] < arr[r]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
但只实现算法还不够,还得解决问题嘛,我在想 LeetCode 上有一些内容类似但实现不同的算法题,比如买卖股票系列。于是我又发问了: LeetCode 以买卖股票为主题的题目有哪些?能不能用 typescript 逐一实现 ?(是的,我换了编程语言,就是为了看代码风格)
哥们的回答也是毫不费力,而且基本给出的都是时空复杂度的最优解
列出所有相关的问题并给出解答
我整到这里突然感觉 chatgpt 太恐怖了: 代码写得快、准、狠,还写得漂亮,咱职业生涯还怎么玩?
我只能说 chatgpt 给了我很棒的面试官体验
使用体验
我其实意识到,也许是程序员职业病的原因,刚才提的问题都是”命令式“、带有较为明确的输入和输出的,如果我问他对 xxx 是否感兴趣之类的问题呢,他其实挺清醒的,会反复强调自己只是一个 AI 语言模型,不存在任何私有的个人情感
跳出编程这个领域,对于日常工作中一些琐碎的文案内容,其实也能交给他处理,比如周报,你似乎只需要提供一些关键字,他就能帮你生成很多实际也就那样但有些正式场合却很有必要的废话
如果你在写一些工作文档,需要有人帮忙列提纲,无所谓 chatgpt 也能出手,而且提供的信息可以说是非常详尽的
但无论是编程还是其他的事情,他提供的信息最好只是作为一个值得借鉴的参考项,但不可作为可信度很高的信息源来看待
虽然目前他生成的内容大部分看来确实合理得很夸张,但也有像上述初体验那样报告编译错误却一直没有给出真正正确的解决方案,有时候还是得需要自己干预,才能更好地发挥他的能力并为己所用
另外我咨询了一些如何能让他的回答变得更加合理的方法,还是得使用英文
这就是我作为程序员对 chatgpt 的使用体验了,总得来说是一个很新也很好用的工具或玩具,与其说是尝鲜,不如说是如何更好地利用 chatgpt 来协助日常生活,希望后续能挖掘出更多好玩且有价值的事情