为什么说鼓吹零基础 AI 编程的都是骗子
前阵子在社交媒体上看到一条消息:「我完全不懂编程,N 小时内写了一个 APP,荣登 App Store 排行榜」。我可以言之凿凿地论断:这就是一个卖课的骗子,所谓的排行榜也是靠作弊刷出来的。因为软件开发的内核从来不是你能否掌握一门编程语言,而是你能否像程序一样思考。目前的 AI 本质上不过是一个玩文字接龙游戏的程序罢了,它无法代替人进行思考(所谓强人工智能)。
举个简单的例子。我用如下 Prompt 让 Copilot 生成一段 C 语言代码:
生成一个C语言程序,它接收一个文件的路径作为参数,打印出文件的扩展名
无论采用的是 GPT、Claude,或是 Gemini,生成的代码都大同小异。此处采用 GPT-4o 生成的代码:
c#include <stdio.h>
#include <string.h>
void print_file_extension(const char *file_path) {
const char *dot = strrchr(file_path, '.');
if (!dot || dot == file_path) {
printf("No extension found\n");
} else {
printf("File extension: %s\n", dot + 1);
}
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file_path>\n", argv[0]);
return 1;
}
print_file_extension(argv[1]);
return 0;
}
稍有常识的人都会看出,如果我们的代码编译运行,这个程序会存在一个很严重的 BUG:假设我们给出的文件路径参数是 D:\foo.bar\test 时,输出为 File extension: bar\test,这显然有违我们的预期。继续用如下 Prompt 要求 Copilot 修复代码:
这段代码没有考虑文件名没有扩展名,且文件目录路径包含
.
的情况,请修复
修复后的 print_file_extension()
函数如下:
cvoid print_file_extension(const char *file_path) {
const char *dot = strrchr(file_path, '.');
if (!dot || dot == file_path || strchr(dot, '/')) {
printf("No extension found\n");
} else {
printf("File extension: %s\n", dot + 1);
}
}
这样就好了吗?显然还没有。这段代码没有考虑 Windows 平台的路径分隔符 \
,依然存在 BUG。继续修复代码:
这段代码没有考虑 Windows 路径分隔符,请修复
修复后的 print_file_extension()
函数如下:
cvoid print_file_extension(const char *file_path) {
const char *dot = strrchr(file_path, '.');
if (!dot || dot == file_path || strchr(dot, '/') || strchr(dot, '\\')) {
printf("No extension found\n");
} else {
printf("File extension: %s\n", dot + 1);
}
}
这下想必已经修复了所有问题了吧。答案是并没有!稍有常识的人都会看出,文件名可以是 . 开头,在类 Unix 系统中表示隐藏文件,其文件名不应被认作是扩展名。继续修复代码:
这段代码没有考虑到以
.
开头的文件名,这是隐藏文件,不应认作扩展名,请修复
最后给出的代码堪堪可用:
c#include <stdio.h>
#include <string.h>
void print_file_extension(const char *file_path) {
const char *dot = strrchr(file_path, '.');
if (!dot || dot == file_path || strchr(dot, '/') || strchr(dot, '\\') || *(dot - 1) == '/' || *(dot - 1) == '\\') {
printf("No extension found\n");
} else {
printf("File extension: %s\n", dot + 1);
}
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file_path>\n", argv[0]);
return 1;
}
print_file_extension(argv[1]);
return 0;
}
通常我们把大项目的代码称为「屎山」,按照这个比喻,所谓零基础 AI 编程就相当于一个猴子在使用一台涡轮增压喷粪机。
有一个经典的程序员笑话:
老婆给当程序员的老公打电话:「下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。」
当晚,程序员老公手捧一个包子进了家门。
老婆怒道:「你怎么就买了一个包子?!」
老公答曰:「因为看到了卖西瓜的。」
自然语言是不严谨的,存在歧义和模糊的约束。虽然目前的大语言模型可以理解这个笑话,但是并不能保证 AI 每次都能准确地理解你的真实需求。AI 只是根据概率在猜测输出的内容。
为了提高 AI 的命中率,我们需要输入尽量详细的描述;为了精准描述一个系统,我们需要定义一套规范用语;为了简化描述,我们还需要定义一套专业术语。最后,一个崭新的编程语言就诞生了……