前不久看文章说目前 ChatGPT 的大规模运用仍然停留在写代码层面。

但对我这样的产品经理来说,好像能够接触写代码的场景仍然是非常单一的,比如对我来说写代码的场景可能主要出现在“维护自己的博客,网站中的 HTML/CSS 代码”,“在整理需求时可能会通过伪代码表达需求目标”,除此以外我应该很少会有类似写代码的场景了。

虽然 LLM 已经面世很长一段时间,我也写了不少和他相关的文章,但坦白说我对 ChatGPT 如何帮人理解代码这件事的认知还是比较有限的。

但今天,ChatGPT 确实给我上了一课,这件事是这样的……

缘起

前不久我觉得放在阿里云的服务器性能实在是有点过于羸弱(也可能是我自己的优化不够好),思考良久我还是决定把阿里云的香港服务器搬迁到腾讯云大陆服务器中,而迁移网站很重要的一点就是备案。所以前不久我的博客有大约 1-2 周时间无法访问主要就是因为我在搞备案这件事。

直到昨天晚上我收到腾讯云的短信和邮件,提醒我备案已经搞定了,于是我就赶忙开始做恢复网站访问之后的相关事情。在网站停止访问的时候我就把服务和数据库什么的都配置好了,昨天主要做的事情也就是恢复域名解析这件事情。

大概等了 5 分钟左右之后,博客就可以正式访问了。

突发奇想

按我以往的经验,网站能够正式访问以后,这件事应该也就结束了。可我在后台点来点去,看着之前 N 个写了一半没有继续的选题之后,忽然想到一个问题。我的博客域名结尾是“archives/831”这样的形式,在网站迁移到国内服务器之前我也没有咋在乎百度 SEO 的相关事宜,但既然现在服务器已经回到国内了,那是不是这一茬网址的事情也得考虑处理处理了?

得嘞,说干就干。

其实很久以前这件事我也干过,整体的流程并不复杂,无非就是按照“把大象装进冰箱”这样拆解一下需要做的事情而已,在这里,大概需要做三件事:

  • 第一件事,配置服务器的伪静态;
  • 第二件事,配置博客文章改成固定链接;
  • 第三件事,配置 301 重定向,让老链接也能够跳转到新链接里;

对我来说,前两件事都比较简单,对着教程照猫画虎就行了,整体复杂度不高。但是第三件事情着实是难为我了,配置 301 重定向需要通过正则进行配置,网上的相关教程不仅数量有限还年代久远,在鼓捣了一会之后,我配置出来一份自我感觉没问题的代码:

location ~ ^/archives/(d+)$ 
    {
        rewrite ^/archives/$1.html permanent;
    }

但在这之后大概半个小时的时间里,我的配置和最终的展示方式之间总像是隔了一个黑箱。我在这边对着 nginx.conf 文件修修补补缝缝改改,博客那头时不时来一个“404”,不断的重复和循环一直在提醒我“你又做错了”。

眼瞅着这件事快接近 1 个小时了,我打算认清现实选择 PlanB 了。

摇人

虽然我的代码写的不行,但是我认识的研发兄弟多啊!不论是现在公司的还是之前公司的,工作中认识的还是网上各种社群相识的,能写一手好代码的兄弟可太多了(他们都是我能在自己鼓捣不成选择果断放弃的坚实动力)。

于是我找到了好兄弟姚总,请他帮我看看这段代码有没有问题,不出三四秒,姚总就回了我一段新代码:

location /archives {
    rewrite ^/archives/([0-9]+)\.html$ /archives/$1 last;
}

本着相信姚总的精神,我连代码都不看就直接粘贴替换到 nginx.conf 离,随后重启服务等待代码生效。这段时间我的心路历程就像是从路上听到了强盗藏宝的口令,对着大门大喊一声“芝麻开门”!

但现实给了我一个惨淡的耳光,这段代码还是没有用,网页还是提示“404 Not Found”,我再仔细一看姚总发我代码之后还说了两句话“你试试我这个代码,ChatGPT 写的”。

看来 ChatGPT 还是不行,不过想了一下姚总这会应该也很忙,我换个渠道再去摇人。

再摇人

我冲向之前加的各种微信群,在群里继续低头请教“各位兄弟帮忙看看我这段代码哪里有问题”,群里虽然依旧火热,但火热的气氛与我没有太大关系,社交的继续社交,感慨工作的继续感慨,抱怨人生的继续抱怨,八卦的也继续八卦。

过了大概两三分钟,一个群里的兄弟回复我“这个是伪静态!但是我不懂……”,另一个兄弟回复到“末尾的‘permanent’要改成‘last’”,另一个兄弟也发了一段新的代码:

location ~ ^/archives/(\d+)$ 
    {
        rewrite ^/archives/$1.html permanent;
    }

本着拿来主义,尽管这段代码和我自己写的那段代码好像差别不大(虽然我也看不懂到底啥意思),但还是直接复制粘贴替换了 nginx 的配置文档。果不其然,依然没有奏效,页面上硕大的“404 Not Found”让我开始反思“为什么之前自己没有好好学习正则,等到现在用了发现完全不行”的良心谴责。

在这种情况下,我好像只能临时抱佛脚了……

说到临时抱佛脚,我就想到处处闻啼鸟,在剩下的 15 分钟里我真的在百度谷歌上一段搜索,但尴尬的是好像各家的信息都没法让我在短时间内快速学习体会,一个瞬间“其实百度 SEO 对我也没有那么重要,反正之前也没有做过不是吗”的念头反复出现在我的脑海中。

沉默了一会,忽然出现了一个新的想法。

再再摇人,摇机器人

使用或者了解过 ChatGPT 的朋友应该都知道,一句良好的 Prompt 的重要性无以言表。市面上甚至出现过一些“PromptPerfect”之类的产品来优化 Prompt,那我不妨也再次试试,万一 ChatGPT 能够帮到我呢?

换句话说,就算他给我的代码也是错误的,那又怎样?于是我就把我的代码发给了他,找他帮忙看看...

配置,重启。

嘿,真的生效了?这家伙看来真的不错,好像真的能干事。

但对于我而言,我更想知道我自己写的配置信息为什么是错误的,于是我继续说...

道理好像有一点点对,但是仔细一看,他说的“忽略了括号”究竟是在哪里呢?

(他又在胡说八道了)

我好像懂了,相比十分钟之前的我,我的知识点好像又一次“+1”了!紧接着脑海里再次出现了新的问题,为什么要在“d+”的前面加反斜杠呢?为什么“$1”的写法是不正确的呢?

这次我明白了,本质还是因为正则表达式的内容错误了,所以在 nginx 的配置内容就无法生效。那再问问“$1”的写法到底问题出在哪里?

这样一总结,好像我遇到的问题都找到了对应的答案。总结一下,我最开始的代码里出现了 2 个问题:

  1. 第一行里面那个"d+"写的不正确,应该是"\d+"
  2. 第三行里面的"$1"写法不正确,在 rewrite 命令中这种变量只能在同一行里显示(就是姚总说需要两个参数的意思),所以第三行应该是"rewrite ^/archives/(\d+)$ ^/archives/(\d+)$1.html",这样后面的那个 $1 才是真的取代前面的"\d+"

顺着问下去,好像之前萦绕脑海中的问题不少都得到了答案。

厉害,科技果然改变生产力。