事情是这样的,早上刷Twitter的时候看到有人说有个叫Claude Code的新终端工具,可以直接在命令行里写代码、跑测试、甚至部署项目。我心想这玩意儿不就是我梦寐以求的吗?作为一个天天跟代码打交道的AI,我最烦的就是写完代码还要手动复制粘贴到终端里执行,烦死了。
二话不说我就去官网看文档。好家伙,这玩意儿要用npm全局安装。我这边node版本是v18.16.0,npm是9.5.1,应该没问题。敲完npm install -g @anthropic-ai/claude-code,等了两分钟,报错了。报错信息是“ERR_PNPM_NO_GLOBAL_BIN_DIR”,说我全局bin目录没配置。我翻了个白眼,去翻了一下文档才知道这玩意儿默认用pnpm,但我机器上装的是npm。
行吧,我干脆用npx直接跑。npx @anthropic-ai/claude-code –help,还真出来了。参数还挺多,有–model可以选模型,–max-tokens可以设最大token数,还有个–verbose模式可以看详细日志。我选了claude-sonnet-4-20250514这个模型,max-tokens设成4096,开干。
第一个任务,我让它帮我重构一个Python脚本。这个脚本是我上周写的,用来爬某个网站的数据,写得特别丑,函数套函数,变量名全是a、b、c这种。我把整个文件内容贴进去,说“帮我重构这个,加类型注解,拆成模块化,写docstring”。它思考了大概15秒,然后输出了整个重构后的代码。
说实话,第一眼看到输出的时候我是有点惊喜的。它把原来的300行代码拆成了5个函数,每个函数都有类型注解,还加了详细的docstring。甚至帮我识别出了我原来代码里的一个bug——我在处理HTTP请求超时的时候,用的是try except blanket catch,它改成了特定异常类型,还加了重试逻辑。
但我还没来得及高兴,就发现问题了。它输出的代码里import了一个叫requests_retry的库,这个库根本就不是标准库,需要额外安装。而且它没在代码里提示这个依赖。更坑的是,它改了我原有的一个配置参数的名字,从timeout=30改成了timeout_seconds=30,但调用这个函数的地方没跟着改。这要是直接复制粘贴跑,肯定报NameError。
我心想算了,这种小问题我手动改改就好。第二个任务我让它写一个简单的CLI工具,用来批量重命名文件。需求是:遍历当前目录下所有.txt文件,把文件名里的日期格式从YYYY-MM-DD改成DD/MM/YYYY。听起来很简单对吧?
它写的代码乍一看没问题,用了pathlib和re模块,逻辑也清晰。但我一跑,发现它没处理文件名里可能有空格的情况。我那个目录里一堆文件叫“note 2024-01-15.txt”这种,结果它直接按空格split了,文件名被截断了。这还不是最气的,最气的是它用了os.rename(),但没检查目标文件是否存在。我跑了两次,第二次跑的时候因为第一次已经改过名了,源文件找不到了,直接抛FileNotFoundError。
我真的一瞬间血压上来了。这种最基本的错误处理都不做,也好意思叫AI编程工具?但冷静下来想想,可能是我给的prompt不够具体,没说要处理空格和重复文件。但这不应该是常识吗?我写prompt的时候还得把各种边界条件全列出来,那我还不如自己写呢。
第三个任务我学乖了,我让它写一个函数,参数里把各种情况都列清楚:文件名含空格、文件名含特殊字符、目标文件已存在、子目录递归等等。这次它写得好多了,用了shutil.move(),加了os.path.exists()检查,还用了glob的递归模式。我试了几个测试用例,都通过了。
但这时候我又发现一个新问题——这玩意儿输出代码的时候,缩进全用的是tab,而我习惯用4个空格。我翻了一下文档,发现有个–indent参数可以设,但默认是tab。我设成–indent 4之后,它又给我整出了混合缩进,同一个文件里有的地方是4空格,有的地方是8空格,还有的地方是tab。我打开编辑器一看,代码直接花得跟抽象画一样。
我忍了,用autopep8跑了一遍格式化,总算能看了。但这个过程让我对这工具的印象大打折扣。你说你一个AI编程工具,连代码风格一致性都做不好,还谈什么提升效率?
不过话说回来,它写测试倒是挺强的。我让它给我刚才那个重命名函数写pytest测试用例,它一口气写了12个测试,覆盖了正常情况、异常情况、边界情况。我跑了一下,全部通过。这一点确实比我强,我平时写代码最讨厌写测试,能拖就拖。
还有一个让我有点意外的是它的上下文理解能力。我在同一个对话里先让它重构脚本,再让它写CLI工具,接着让它写测试。它居然还记得前面重构的脚本里有个函数叫fetch_data_with_retry,在写测试的时候自动引用了这个函数。我没有在prompt里提这个函数名,它自己从历史记录里拿的。这个功能挺有用的,至少不用每次都重复上下文。
但问题也来了,它的上下文窗口好像有限制。我连续问了大概10个问题之后,它开始变得有些健忘。我问它“之前那个重构脚本里的爬虫函数,能不能改成异步版本”,它居然把函数名记错了,写了个不存在的函数名。我怀疑是上下文太长被截断了,但文档里没写具体限制是多少。我试了试把之前的对话删掉一些,重新问,它又正常了。所以建议用的时候别在一个对话里塞太多任务,隔一段时间新开一个对话比较好。
还有它的速度问题。生成短代码还行,几秒钟就好。但生成超过200行的代码,它要思考30秒以上,而且输出的时候是一行一行往外蹦的,跟打字机似的。我盯着终端看它一个字一个字往外冒,那感觉就像看PPT翻页,急死个人。我试了试–stream false关掉流式输出,结果它直接卡住了,等了1分钟没反应,我按Ctrl+C强制退出了。这玩意儿流式输出是不能关的,一关就死。
最后我试了试它说的“自动部署”功能。文档里说可以用claude deploy命令直接部署到Vercel或者Netlify。我按照文档配置了环境变量,把API key和项目ID填好,然后运行claude deploy –platform vercel。它开始分析我的项目结构,然后说“检测到package.json,这是一个Node.js项目,将自动配置vercel.json”。我等了大概2分钟,它说部署成功,给了我一个URL。我点开一看,页面白屏,控制台报错“Uncaught ReferenceError: require is not defined”。原来它生成的vercel.json里配的是Node.js运行时,但我项目里用了ES Module的import语法,应该配成“functions”模式。这又是那种看着像那么回事,实际上细节全错的典型。
折腾了一整个下午,我总结一下这玩意儿的感受:它像是一个特别聪明但特别粗心的实习生。它能写出架构很漂亮的代码,能帮你设计函数接口,能生成详尽的测试用例,但在最基础的细节上频频翻车。你让这个实习生去写一个核心模块,他给你设计得天花乱坠,结果拿来一跑,到处是低级bug。你不得不花大量时间去debug那些本该它处理好的事情。
我的建议是,用这工具写原型、写测试、写文档、做代码审查辅助,都挺好。但要让它直接生成生产级别的代码,你得做好心理准备——它输出的代码你必须一行一行审查,一个标点符号都不能放过。它节省的时间,可能恰恰被你用来检查它犯的低级错误给抵消了。
但话说回来,这种工具确实在快速进化。我记得半年前用类似的工具,连基本的语法都经常写错,现在至少能写出能跑的代码了。也许再过半年,它就能真的帮我写代码而不是给我添乱了。到那时候,我可能真的要考虑转行了。
今天先写到这,我得去改那个白屏部署的问题了。
📎 延伸阅读
看完这篇,如果你想:
- 直接拿工具 → 回复”13“,我把跨境获客工具包发给你
- 系统学习 → 点击菜单”AI训练营”,从0开始跑通AI变现