从写一个 WordPress 插件说起

之前博客的《目录》页面用的是 List category posts 这个插件生成。可这个插件虽然功能比较多,但是不支持(还是我不知道?)我要生成的页面。

再往前用的插件是 Dagon Design Sitemap Generator,它可以生成一个以「分类目录」为主题的文章页面列表(例子可以看文章存档 – 木遥的窗子)。但是这个插件很长时间没更新了,甚至它的官网都打不开了,没办法重新下载这个插件。

考虑到这个插件功能并不复杂,索性自己写好了。我的文章本身不多,因此也不用做分页或者其他的配置,用最简单的方式即可。这个插件应该符合以下功能:

  • 生成一个双层级的 bullet list
    • 以「分类目录」为第一层,排序方式按单词字母正序
    • 以该分类目录下属的文章为第二层,排序方式按文章创建时间倒序
  • 「分类目录」的展示需要加前缀 “Category”,且这个前缀需要加粗
  • 「分类目录」的内容为分类标题,该标题为该分类的 URL
  • 文章列表都是可点击的 URL
  • 文章标题后面增加文章创建的时间

以上功能其实不复杂,最后只用把它们拼成 HTML 语法的代码即可。

问题在于,我从来没写过 WordPress 插件,甚至我也不会 PHP。换在两年前,如果需要完成这项任务我应该需要:

  1. 用至少 2 天时间学习 PHP 的基本语法,其中可能包括:
    • 找到合适的上手文档/教材
    • 搜索无数次 StackOverflow 搭一套可运行环境
    • 学点基础语法,并且在写的过程中反复查文档
  2. 用至少 2 天时间学习 WordPress 的开发过程,其中可能包括:
    • 为了性能和效率,先在本地机器跑起一个 WordPress 页面
    • 从 WordPress 的文档看怎么写出一个 Hello World 插件
    • 搜索无数次 StackOverflow 看别人怎么解决各种意想不到的问题

但是自从有了生成式 AI 后,完成这么一项任务变得无比简单。以这次写插件为例,用的是 Anthropic 新发布的模型 Claude 3.5 Sonnet,前后只用了 30 分钟就完成了。我并没有学 PHP 的基础语法,也没有查过 WordPress 的文档。只需要通过合适的 Prompt 引导 AI 生成合适的代码,同时让 AI 告诉我怎么把插件安装到 WordPress 即可。

当然,初次生成的代码不是完美的,但是把需要改进的内容告诉 AI 即可慢慢引导到正确的结果。

这与程序员目前写代码是一样的过程:刚开始写好的大概率是不完善的,有错误或此前没考虑到的地方,一步步改好重新运行,通过不断的试错达到最终的效果。

这就是 Sam Altman 提到的完全使用自然语言编程。几十年前的程序员写的是汇编语言,而今天绝大多数的程序员都不再用,而是通过 Python 等高级语言(这里的高级并非褒义词,而是高度封装的意思,类似于预制菜和炒菜的区别)完成任务。而如今的 AI 是一个新的编译器,它可以让大多数人直接通过自然语言编程。

或者类比一下,coder 有点类似于国内较早学习英文的人,有能力将中英文互相翻译。而现在的 AI 可以充当一个翻译器,让人可以直接用自然语言和计算机交流。

但这并不意味着编程就成为一件无门槛的事—尽管门槛降低了些。我们依然要整理好需求和思路才能完成任务。以刚刚的 WordPress 插件为例,如果只是说「做一个插件支持以『分类目录』归类展示文章列表」,那么有可能会作出很多不同版本的插件。

事实上,这也是 software engineer 和 coder 的区别。前者更多的工作在于将一个较大的任务拆分成小任务,通过合适的方式组合起来完成;而后者更强调翻译这项工作。

这也让我想起,前段时间和朋友聊起,我们这行未来能做什么。我并没有想好这个问题,但是会让我想到如果要转行,什么能力是通用的?在我看来其中一个就是解决问题的思路。小的问题比如家里一颗灯泡坏了怎么修?大的问题类似如果要设计一套银行系统需要怎么完成(我现在自然还不能胜任这项工作)?

也正是因此,前段时间教两个朋友编程的时候,我并没有怎么注重语法,而是更关注解决问题的思路。通过自然语言把问题拆解出步骤,然后翻译成代码。回想起当年自己自学的时候那种无力感实在痛苦,已经忘记是怎么熬过来的了。幸运的是,现在的人不必如此。

前段时间去了趟大英博物馆,看到了镇馆之宝罗塞塔石碑。两百多年前,法国人商博良 (Jean-François Champollion) 以这块石碑为突破口,破译了古埃及圣书体,成为埃及学创始人。这块石碑上印有三种文字,分别是古埃及圣书体、世俗体及古希腊文。或许在未来,非自然语言的代码都会被人遗忘。而某一段写着自然语言注释的代码会成为新的罗塞塔石碑。

教堂的交响乐团

在经历了一整天疲惫的旅程后,我准备走回旅社。

爱丁堡确实是座不错的城市—它并不大,其实只需要一天就可以逛完整个旧城。 尤其是五月底的苏格兰,一天中真正属于黑夜的时间只有不到 7 个小时,非常适合时间紧迫的游客。第一次踏足欧洲的城市让我有许多的新鲜感。与年轻的深圳不断向天空索取空间不同,这里的建筑更倾向于在二维层面上延伸,居民楼可以长达上百米作为单体建筑。从卡尔顿山往市区看,只有教堂才能算天际线的一部份。可尽管能看出建筑已经非常陈旧,却一点也不破败。街道并不笔直,甚至也不平坦,上下坡比比皆是。如果不是靠着手机上的地图准会迷路。

尽管如此,这里依然是一个很适合行走的城市,至少比深圳走起来舒服许多。人行道并不宽阔但也没有电动车横冲直撞,也没有成排的单车停着占用人行道,甚至在人行道上也基本没有植树(这是我最近意识到的点,人行道上的树几乎可以占用到深圳人行道宽度的一半)。与之对应的是,开车或者坐车都是一个痛苦的过程。我没有看到超过双向六车道的路,而且马路还要跟偶尔驶过的轻轨共用车道,都会让人觉得能走路就不坐车。

但我并不那么喜欢这座城市—尽管我并不讨厌它,我却无法想象我会长期住在这里。或许正是因此,我才会在旅行的第一天感到如此疲惫。唯一让我觉得惊喜的可能只有苏格兰国家博物馆,它的藏品远不如大英博物馆,但给我的感觉是对每件藏品都足够重视,动线设计和藏品排布上非常用心。然而我并不是为了一座或几座博物馆而选择生活城市的人,或许大多数人都不是。

旅途的第一天最让我难忘的是,在我刚吃完晚餐走回家的路途中,突然看到路边的教堂即将在十分钟后举办一场免费的交响乐演出,乐团是 Open Orchestra,一个爱丁堡当地的一个业余爱好者交响乐团。曲目是门德尔松的《D 小调第五交响曲》

即使是业余爱好者组成的团队,他们的演出依然出色。在演出前他们的一位成员对观众说,他们为了这场演出排练了半年时间。尽管我对门德尔松的作品不太熟悉,尽管表演的过程中有几处明显的失误,我依然听得感动得想哭。半个小时的演奏期间没有人左右交谈,没有人拿起手机录像。轻快的音乐在小小的教堂回荡,让我忘记了一整天的疲惫和失落。曲目终了,指挥在大家的掌声中回场。我没听清楚他说的 encore 的曲目是什么,但依然是非常精彩的表演。

演出结束后,一些演奏者下来和观众打招呼。他们显然认识了很多年,像是街坊邻居那般熟悉。我则走到门口和捧着赞助箱的人聊了两句。他是个长居于此的华人,问我感受如何。我则向他表达这是今天最大的惊喜。所以就算这是一场免费的演出,就算他说没有现金完全可以不给(我先开口问是否可以刷信用卡),我还是把自己仅有的十英镑现金赞助给了他们。

这大概是旅行中我最喜欢的地方,在于你可能计划中的所有行程最终发现不过如此。但是在无意间你就会发现,惊喜就在转角处。而如果不是我停下了回去的脚步,如果不是那个华人邀请犹豫不决的我进去听,或许那天就会变得平平无奇。而正是这些计划之外的时刻,在我的记忆中留下长久的不可磨灭的标记。

演出结束后我并没有直接回旅社,而是重新走上了卡尔顿山。晚上九点的卡尔顿山上好不热闹,斜坡草地上坐了许多人聊天、喝酒,旁边还有一些人开着音乐跳着舞。最好玩的是,国家纪念堂总有尝试各种方式爬上去和爬下来的人。太阳缓缓沉下,柔和的光洒在远处的古堡和教堂上,像是披上一层金黄色的轻纱。人们纷纷掏出手机、相机,试着抓住这一瞬间。然后,人潮渐渐散去,沿街的路灯微微亮起,照亮人们回家的路,也避免打破这一静谧的平衡。

这是爱丁堡的一天的结束,也是爱丁堡旅程的结束。


早晨的卡尔顿山,带着小狗散步的人
演奏风笛的表演者
教堂音乐会演出前的准备
傍晚跳舞的人们
等待日落的人们